@myzbox/react-overlay 1.0.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 myzbox
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,457 @@
1
+ # @myzbox/react-overlay
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@myzbox/react-overlay.svg)](https://www.npmjs.com/package/@myzbox/react-overlay)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@myzbox/react-overlay.svg)](https://www.npmjs.com/package/@myzbox/react-overlay)
5
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/@myzbox/react-overlay)](https://bundlephobia.com/package/@myzbox/react-overlay)
6
+ [![license](https://img.shields.io/npm/l/@myzbox/react-overlay.svg)](https://github.com/myzbox/react-overlay/blob/main/LICENSE)
7
+
8
+ A highly configurable, accessible, and senior-grade React overlay library. Built with TypeScript, Accessibility, and Performance in mind.
9
+
10
+ ## Features
11
+
12
+ - 🎯 **Accessible**: Fully compliant with WAI-ARIA practices (focus trapping, aria attributes, keyboard navigation).
13
+ - 🎨 **Animations**: Built-in animations (Zoom, Fade, Slide Up/Down/Left/Right).
14
+ - 📱 **Responsive**: Mobile-friendly out of the box.
15
+ - 🖐 **Draggable**: Enable drag-and-drop support on modals.
16
+ - 🗄️ **Drawer Component**: Slide-out panels from any edge (Left, Right, Top, Bottom).
17
+ - 💡 **Tooltip Component**: Customizable tooltips with support for HTML content.
18
+ - 💬 **Popover Component**: Click-triggered interactive popups.
19
+ - 🍞 **Toast System**: Global notifications with stacking, positioning, and auto-close.
20
+ - 🌈 **Themable**: Configurable colors via CSS Variables.
21
+ - 🧩 **Variants**: Includes `AlertModal`, `ConfirmModal`, `Drawer`, `Tooltip`, `Popover`, and `Toast`.
22
+ - 🛠 **Customizable**: Extensive props for specific positioning, sizing, and styling.
23
+ - 📦 **Lightweight**: Minimal dependencies (`classnames`, `react`, `react-dom`).
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ npm install @myzbox/react-overlay
29
+ # or
30
+ yarn add @myzbox/react-overlay
31
+ ```
32
+
33
+ Ensure you have peer dependencies installed:
34
+ ```bash
35
+ npm install react react-dom
36
+ ```
37
+
38
+ ## Basic Usage
39
+
40
+ ```tsx
41
+ // Complete bundle (Recommended)
42
+ import '@myzbox/react-overlay/dist/react-overlay.css';
43
+
44
+ // OR import all source modules at once
45
+ import '@myzbox/react-overlay/styles/index.css';
46
+
47
+
48
+
49
+ // 1. Wrap your app with ToastProvider
50
+ import { ToastProvider } from '@myzbox/react-overlay';
51
+
52
+ ReactDOM.createRoot(document.getElementById('root')!).render(
53
+ <ToastProvider>
54
+ <App />
55
+ </ToastProvider>
56
+ );
57
+ ```
58
+
59
+ ### `<Modal />`
60
+
61
+ ```tsx
62
+ import React, { useState } from 'react';
63
+ import { Modal, useModal } from '@myzbox/react-overlay';
64
+
65
+ const App = () => {
66
+ const { isOpen, open, close } = useModal();
67
+
68
+ return (
69
+ <>
70
+ <button onClick={open}>Open Modal</button>
71
+
72
+ <Modal
73
+ isOpen={isOpen}
74
+ onClose={close}
75
+ title="Welcome"
76
+ position="center"
77
+ animation="zoom"
78
+ draggable // Enable drag
79
+ >
80
+ <p>This is a custom accessible modal.</p>
81
+ <div style={{ marginTop: '1rem', display: 'flex', justifyContent: 'flex-end' }}>
82
+ <button onClick={close}>Close</button>
83
+ </div>
84
+ </Modal>
85
+ </>
86
+ );
87
+ };
88
+ ```
89
+
90
+ ### `<Tooltip />`
91
+
92
+ ```tsx
93
+ import { Tooltip } from '@myzbox/react-overlay';
94
+
95
+ <Tooltip content="I am a simple tooltip" position="top">
96
+ <button>Hover me</button>
97
+ </Tooltip>
98
+
99
+ // With HTML content and custom width
100
+ <Tooltip
101
+ content={<strong>Bold content</strong>}
102
+ width={200}
103
+ position="right"
104
+ >
105
+ <button>HTML Tooltip</button>
106
+ </Tooltip>
107
+ ```
108
+
109
+ ### `<AlertModal />` - Simple Alerts
110
+
111
+ ```tsx
112
+ import { AlertModal, useModal } from '@myzbox/react-overlay';
113
+
114
+ const App = () => {
115
+ const { isOpen, open, close } = useModal();
116
+
117
+ return (
118
+ <>
119
+ <button onClick={open}>Show Success Alert</button>
120
+
121
+ <AlertModal
122
+ isOpen={isOpen}
123
+ onClose={close}
124
+ type="success" // 'success' | 'error' | 'warning' | 'info'
125
+ message="Your changes have been saved successfully!"
126
+ okText="Got it"
127
+ onOk={() => console.log('OK clicked')}
128
+ />
129
+ </>
130
+ );
131
+ };
132
+ ```
133
+
134
+ ### `<ConfirmModal />` - Confirmation Dialogs
135
+
136
+ ```tsx
137
+ import { ConfirmModal, useModal } from '@myzbox/react-overlay';
138
+
139
+ const App = () => {
140
+ const { isOpen, open, close } = useModal();
141
+
142
+ const handleDelete = async () => {
143
+ // Simulate async operation
144
+ await new Promise(resolve => setTimeout(resolve, 1000));
145
+ console.log('Deleted!');
146
+ };
147
+
148
+ return (
149
+ <>
150
+ <button onClick={open}>Delete Item</button>
151
+
152
+ <ConfirmModal
153
+ isOpen={isOpen}
154
+ onClose={close}
155
+ message="Are you sure you want to delete this item? This action cannot be undone."
156
+ confirmText="Delete"
157
+ cancelText="Cancel"
158
+ isDestructive={true} // Red button for dangerous actions
159
+ onConfirm={handleDelete} // Supports async functions
160
+ onCancel={() => console.log('Cancelled')}
161
+ />
162
+ </>
163
+ );
164
+ };
165
+ ```
166
+
167
+ ### `<Drawer />` - Side Panels
168
+
169
+ ```tsx
170
+ import { Drawer, useModal } from '@myzbox/react-overlay';
171
+
172
+ const App = () => {
173
+ const { isOpen, open, close } = useModal();
174
+
175
+ return (
176
+ <>
177
+ <button onClick={open}>Open Settings</button>
178
+
179
+ <Drawer
180
+ isOpen={isOpen}
181
+ onClose={close}
182
+ placement="right" // 'left' | 'right' | 'top' | 'bottom'
183
+ title="Settings"
184
+ >
185
+ <div>
186
+ <h3>Account Settings</h3>
187
+ <p>Configure your preferences here...</p>
188
+ </div>
189
+ </Drawer>
190
+ </>
191
+ );
192
+ };
193
+ ```
194
+
195
+ ### `<Tooltip />` - Contextual Help
196
+
197
+ ```tsx
198
+ import { Tooltip } from '@myzbox/react-overlay';
199
+
200
+ // Simple text tooltip
201
+ <Tooltip content="Click to copy to clipboard" position="top">
202
+ <button>Copy</button>
203
+ </Tooltip>
204
+
205
+ // Rich HTML content
206
+ <Tooltip
207
+ content={
208
+ <div>
209
+ <strong>Pro Tip:</strong>
210
+ <p>Hold Shift to select multiple items</p>
211
+ </div>
212
+ }
213
+ position="right"
214
+ delay={300}
215
+ width={250}
216
+ >
217
+ <span>ℹ️ Help</span>
218
+ </Tooltip>
219
+
220
+ // Icon with tooltip
221
+ <Tooltip content="This is a multi-line tooltip that provides detailed information about the feature">
222
+ <button>🔍</button>
223
+ </Tooltip>
224
+ ```
225
+
226
+ ### `<Popover />` - Interactive Menus
227
+
228
+ ```tsx
229
+ import { Popover } from '@myzbox/react-overlay';
230
+
231
+ // Simple content
232
+ <Popover content="Quick info here" position="bottom">
233
+ <button>Click Me</button>
234
+ </Popover>
235
+
236
+ // Interactive menu with render prop
237
+ <Popover
238
+ content={(close) => (
239
+ <div style={{ padding: '1rem' }}>
240
+ <h4>Actions</h4>
241
+ <button onClick={() => { console.log('Edit'); close(); }}>
242
+ Edit
243
+ </button>
244
+ <button onClick={() => { console.log('Delete'); close(); }}>
245
+ Delete
246
+ </button>
247
+ <button onClick={close}>Cancel</button>
248
+ </div>
249
+ )}
250
+ position="bottom"
251
+ width={200}
252
+ draggable // Make it draggable
253
+ >
254
+ <button>⋮ More Options</button>
255
+ </Popover>
256
+ ```
257
+
258
+ ### `useToast()` - Global Notifications
259
+
260
+ ```tsx
261
+ import { useToast, ToastProvider } from '@myzbox/react-overlay';
262
+
263
+ // Wrap your app with ToastProvider first
264
+ function Root() {
265
+ return (
266
+ <ToastProvider>
267
+ <App />
268
+ </ToastProvider>
269
+ );
270
+ }
271
+
272
+ function App() {
273
+ const toast = useToast();
274
+
275
+ const showNotifications = () => {
276
+ // Simple usage
277
+ toast.success("Saved successfully!");
278
+ toast.error("Failed to save");
279
+ toast.warning("Please review your changes");
280
+ toast.info("New update available");
281
+
282
+ // Advanced with options
283
+ toast.success("File uploaded", {
284
+ position: "top-right", // 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
285
+ duration: 5000, // milliseconds (0 = never auto-close)
286
+ delay: 500, // delay before showing
287
+ draggable: true // allow dragging
288
+ });
289
+
290
+ // Manual close (persist until user closes)
291
+ toast.info("Processing your request...", { duration: 0 });
292
+ };
293
+
294
+ return <button onClick={showNotifications}>Show Toasts</button>;
295
+ }
296
+ ```
297
+
298
+ ### Advanced: Draggable Modals
299
+
300
+ ```tsx
301
+ import { Modal, useModal } from '@myzbox/react-overlay';
302
+
303
+ const App = () => {
304
+ const { isOpen, open, close } = useModal();
305
+
306
+ return (
307
+ <>
308
+ <button onClick={open}>Open Draggable Modal</button>
309
+
310
+ <Modal
311
+ isOpen={isOpen}
312
+ onClose={close}
313
+ title="Drag me around!"
314
+ draggable={true} // Enable dragging
315
+ position="center"
316
+ animation="zoom"
317
+ >
318
+ <p>You can drag this modal by its header!</p>
319
+ </Modal>
320
+ </>
321
+ );
322
+ };
323
+ ```
324
+
325
+ ### `useToast()`
326
+
327
+ ```tsx
328
+ import { useToast } from '@myzbox/react-overlay';
329
+
330
+ const MyComponent = () => {
331
+ const toast = useToast();
332
+
333
+ const handleClick = () => {
334
+ // Simple
335
+ toast.success("Operation saved!");
336
+
337
+ // Advanced
338
+ toast.error("Network Error", {
339
+ position: "bottom-right",
340
+ duration: 5000,
341
+ delay: 500, // Wait 500ms before showing
342
+ });
343
+
344
+ // Manual Close / Persistent
345
+ toast.info("Updating...", { duration: 0 }); // 0 = never close automatically
346
+ };
347
+
348
+ return <button onClick={handleClick}>Show Toast</button>;
349
+ };
350
+ ```
351
+
352
+ ## Theming & Customization
353
+
354
+ Define these variables in your CSS (e.g., `:root`) to override default colors:
355
+
356
+ ```css
357
+ :root {
358
+ /* Modal Backgrounds */
359
+ --rm-overlay-bg: rgba(0, 0, 0, 0.5);
360
+ --rm-modal-bg: #ffffff;
361
+
362
+ /* Text & Borders */
363
+ --rm-text-color: #374151;
364
+ --rm-title-color: #111827;
365
+ --rm-border-color: #e5e7eb;
366
+
367
+ /* Buttons */
368
+ --rm-btn-primary-bg: #2563eb;
369
+ --rm-btn-primary-hover: #1d4ed8;
370
+ --rm-btn-primary-text: #ffffff;
371
+
372
+ --rm-btn-destructive-bg: #dc2626;
373
+ --rm-btn-destructive-hover: #b91c1c;
374
+ }
375
+ ```
376
+
377
+ ## Components API
378
+
379
+ ### `<Modal />`
380
+
381
+ | Prop | Type | Default | Description |
382
+ |------|------|---------|-------------|
383
+ | `isOpen` | boolean | required | Controls visibility |
384
+ | `onClose` | function | required | Callback when requesting close |
385
+ | `children` | ReactNode | required | Content of the modal |
386
+ | `draggable` | boolean | `false` | Enable drag functionality |
387
+ | `position` | 'center', 'top', etc. | 'center' | Position on screen |
388
+ | `size` | 'sm', 'md', 'lg', 'xl', 'full' | 'md' | Width size preset |
389
+ | `animation` | 'zoom', 'fade', 'slide-up'... | 'zoom' | Entry/Exit animation |
390
+ | `hideHeader` | boolean | `false` | Hides the header (title/close btn) |
391
+
392
+ ### `<AlertModal />`
393
+
394
+ | Prop | Type | Default | Description |
395
+ |------|------|---------|-------------|
396
+ | `type` | 'success', 'error', 'warning', 'info' | 'info' | Visual style/icon |
397
+ | `message` | ReactNode | required | Alert content |
398
+ | `showHeader` | boolean | `true` | Show/Hide the header |
399
+ | `onOk` | function | - | Callback for OK button |
400
+
401
+ ### `<Tooltip />`
402
+
403
+ | Prop | Type | Default | Description |
404
+ |------|------|---------|-------------|
405
+ | `children` | ReactNode | required | Trigger element |
406
+ | `content` | ReactNode | required | content of tooltip |
407
+ | `position` | 'top', 'bottom', 'left', 'right' | 'top' | Position relative to trigger |
408
+ | `delay` | number | 200 | Delay in ms before showing |
409
+ | `width` | string/number | - | Custom width |
410
+ | `height` | string/number | - | Custom height |
411
+
412
+ ### `<Popover />`
413
+
414
+ | Prop | Type | Default | Description |
415
+ |------|------|---------|-------------|
416
+ | `children` | ReactNode | required | Trigger element (clickable) |
417
+ | `content` | ReactNode | required | Content of the popover |
418
+ | `position` | 'top', 'bottom', 'left', 'right' | 'bottom' | Position relative to trigger |
419
+ | `width` | string/number | - | Custom width |
420
+
421
+ ## Community
422
+
423
+ - [Changelog](./CHANGELOG.md)
424
+ - [Roadmap](./ROADMAP.md)
425
+ - [Contributing](./CONTRIBUTING.md)
426
+
427
+ ## 🤝 Contributing
428
+
429
+ Contributions are welcome!
430
+
431
+ Please read CONTRIBUTING.md before submitting a pull request.
432
+
433
+ ## 👤 Maintainer
434
+
435
+ **Maintainer:** Mahantesh Teli
436
+ **Email:** <myzbox1@gmail.com>
437
+ **Organization:** myZbox
438
+
439
+
440
+ For questions, bug reports, or feature requests, please open an issue.
441
+ Direct emails are recommended only for security or private concerns.
442
+
443
+ ## 📄 License
444
+
445
+ MIT © 2026 myzbox
446
+
447
+ ## ⭐ Support
448
+
449
+ If this library helps you:
450
+
451
+ Star the repository ⭐
452
+
453
+ Share feedback
454
+
455
+ Open issues for bugs or feature requests
456
+
457
+ ---
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1 @@
1
+ :root{--rm-overlay-bg: rgba(0, 0, 0, .5);--rm-modal-bg: #ffffff;--rm-modal-shadow: 0 4px 6px rgba(0, 0, 0, .1), 0 10px 15px rgba(0, 0, 0, .1);--rm-text-color: #374151;--rm-title-color: #111827;--rm-border-color: #e5e7eb;--rm-close-color: #374151;--rm-close-hover-bg: #f3f4f6;--rm-close-hover-color: #111827;--rm-footer-bg: #f9fafb}._overlay_1pta6_15{box-sizing:border-box!important;position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:var(--rm-overlay-bg);display:flex;justify-content:center;align-items:center;z-index:1000;opacity:0;transition:opacity .2s ease-in-out;pointer-events:none}._overlay_1pta6_15._open_1pta6_32{opacity:1;pointer-events:auto}._overlay_1pta6_15._center_1pta6_38{justify-content:center;align-items:center;box-sizing:border-box}._overlay_1pta6_15._top_1pta6_44{align-items:flex-start;padding-top:2rem;box-sizing:border-box}._overlay_1pta6_15._bottom_1pta6_50{align-items:flex-end;padding-bottom:2rem}._overlay_1pta6_15._left_1pta6_55{justify-content:flex-start;height:100vh;box-sizing:border-box}._overlay_1pta6_15._right_1pta6_61{justify-content:flex-end;height:100vh}._overlay_1pta6_15._top-left_1pta6_66{justify-content:flex-start;align-items:flex-start;padding:2rem;box-sizing:border-box}._overlay_1pta6_15._top-right_1pta6_73{justify-content:flex-end;align-items:flex-start;padding:2rem;box-sizing:border-box}._overlay_1pta6_15._bottom-left_1pta6_80{justify-content:flex-start;align-items:flex-end;padding:2rem;box-sizing:border-box}._overlay_1pta6_15._bottom-right_1pta6_87{justify-content:flex-end;align-items:flex-end;padding:2rem;box-sizing:border-box}._modal_1pta6_94{box-sizing:border-box;background:var(--rm-modal-bg);border-radius:8px;box-shadow:var(--rm-modal-shadow);width:100%;max-width:100%;max-height:90vh;display:flex;flex-direction:column;position:relative;overflow:hidden;opacity:0;transform:scale(.95);transition:all .2s cubic-bezier(.4,0,.2,1)}._modal_1pta6_94 *,._modal_1pta6_94 *:before,._modal_1pta6_94 *:after{box-sizing:border-box}._modal_1pta6_94._open_1pta6_32{opacity:1;transform:scale(1);animation:_openScale_1pta6_1 .2s cubic-bezier(.4,0,.2,1)}._modal_1pta6_94._sm_1pta6_124{width:400px}._modal_1pta6_94._md_1pta6_128{width:600px}._modal_1pta6_94._lg_1pta6_132{width:800px}._modal_1pta6_94._xl_1pta6_136{width:1140px}._modal_1pta6_94._full_1pta6_140{width:98vw;height:96vh;max-height:96vh;border-radius:8px}._modal_1pta6_94._auto_1pta6_147{width:auto}@keyframes _openScale_1pta6_1{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}._modal_1pta6_94._slide-up_1pta6_164{transform:translateY(20px)}._modal_1pta6_94._slide-up_1pta6_164._open_1pta6_32{transform:translateY(0)}._modal_1pta6_94._slide-down_1pta6_172{transform:translateY(-20px)}._modal_1pta6_94._slide-down_1pta6_172._open_1pta6_32{transform:translateY(0)}._modal_1pta6_94._fade_1pta6_180,._modal_1pta6_94._fade_1pta6_180._open_1pta6_32{transform:none}._modal_1pta6_94._slide-left_1pta6_188{transform:translate(-20px)}._modal_1pta6_94._slide-left_1pta6_188._open_1pta6_32{transform:translate(0)}._modal_1pta6_94._slide-right_1pta6_196{transform:translate(20px)}._modal_1pta6_94._slide-right_1pta6_196._open_1pta6_32{transform:translate(0)}._modal_1pta6_94._drawer-slide-right_1pta6_205{transform:translate(100%)}._modal_1pta6_94._drawer-slide-right_1pta6_205._open_1pta6_32{transform:translate(0)}._modal_1pta6_94._drawer-slide-left_1pta6_213{transform:translate(-100%)}._modal_1pta6_94._drawer-slide-left_1pta6_213._open_1pta6_32{transform:translate(0)}._modal_1pta6_94._drawer-slide-up_1pta6_221{transform:translateY(100%)}._modal_1pta6_94._drawer-slide-up_1pta6_221._open_1pta6_32{transform:translateY(0)}._modal_1pta6_94._drawer-slide-down_1pta6_229{transform:translateY(-100%)}._modal_1pta6_94._drawer-slide-down_1pta6_229._open_1pta6_32{transform:translateY(0)}._header_1pta6_237{box-sizing:border-box;width:100%;padding:1rem 1.5rem;border-bottom:1px solid var(--rm-border-color);display:flex;justify-content:space-between;align-items:center}._header_1pta6_237._draggable_1pta6_247{cursor:move;-webkit-user-select:none;user-select:none}._title_1pta6_252{font-size:1.25rem;font-weight:600;color:var(--rm-title-color);margin:0}._closeButton_1pta6_259{box-sizing:border-box;background:transparent;border:none;cursor:pointer;width:32px;height:32px;border-radius:50%;color:var(--rm-close-color);transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;margin-right:-4px;background-color:transparent}._closeButton_1pta6_259:hover{color:var(--rm-close-hover-color);transform:scale(1.15)}._closeButton_1pta6_259:active{transform:scale(.95)}._closeButton_1pta6_259 svg{width:16px;height:16px;stroke:currentColor;stroke-width:3;display:block;transition:transform .2s}._content_1pta6_294{box-sizing:border-box;width:100%;padding:1.5rem;overflow-y:auto;flex:1;color:var(--rm-text-color);font-size:1rem;line-height:1.5}._footer_1pta6_305{box-sizing:border-box;width:100%;padding:1rem 1.5rem;border-top:1px solid var(--rm-border-color);background-color:var(--rm-footer-bg);display:flex;justify-content:flex-end;gap:.75rem}:root{--rm-success-bg: #d1fae5;--rm-success-color: #065f46;--rm-error-bg: #fee2e2;--rm-error-color: #991b1b;--rm-warning-bg: #fef3c7;--rm-warning-color: #92400e;--rm-info-bg: #dbeafe;--rm-info-color: #1e40af;--rm-btn-primary-bg: #2563eb;--rm-btn-primary-hover: #1d4ed8;--rm-btn-primary-text: #ffffff;--rm-btn-default-bg: #ffffff;--rm-btn-default-border: #d1d5db;--rm-btn-default-text: #374151;--rm-btn-default-hover: #f3f4f6;--rm-btn-destructive-bg: #dc2626;--rm-btn-destructive-hover: #b91c1c}._drawer_43ihb_24{border-radius:0;max-height:none}._drawer_43ihb_24._left_43ihb_29,._drawer_43ihb_24._right_43ihb_30{height:100vh;border-radius:0}._drawer_43ihb_24._top_43ihb_35,._drawer_43ihb_24._bottom_43ihb_36{width:100vw;border-radius:0}._alertModal_43ihb_41{box-sizing:border-box;display:block}._alertContent_43ihb_47{display:flex;align-items:center;gap:1rem}._icon_43ihb_53{width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;flex-shrink:0}._success_43ihb_64 ._icon_43ihb_53{background:var(--rm-success-bg);color:var(--rm-success-color)}._error_43ihb_69 ._icon_43ihb_53{background:var(--rm-error-bg);color:var(--rm-error-color)}._warning_43ihb_74 ._icon_43ihb_53{background:var(--rm-warning-bg);color:var(--rm-warning-color)}._info_43ihb_79 ._icon_43ihb_53{background:var(--rm-info-bg);color:var(--rm-info-color)}._okButton_43ihb_84,._confirmButton_43ihb_85{box-sizing:border-box;background:var(--rm-btn-primary-bg);color:var(--rm-btn-primary-text);border:none;padding:.5rem 1rem;border-radius:4px;cursor:pointer;font-weight:500}._okButton_43ihb_84:hover,._confirmButton_43ihb_85:hover{background:var(--rm-btn-primary-hover)}._okButton_43ihb_84:disabled,._confirmButton_43ihb_85:disabled{opacity:.5;cursor:not-allowed}._cancelButton_43ihb_107{box-sizing:border-box;background:var(--rm-btn-default-bg);border:1px solid var(--rm-btn-default-border);color:var(--rm-btn-default-text);padding:.5rem 1rem;border-radius:4px;cursor:pointer}._cancelButton_43ihb_107:hover{background:var(--rm-btn-default-hover)}._cancelButton_43ihb_107:disabled{opacity:.5;cursor:not-allowed}._destructive_43ihb_126{background:var(--rm-btn-destructive-bg)}._destructive_43ihb_126:hover{background:var(--rm-btn-destructive-hover)}._wrapper_1bfkp_1{position:relative;display:inline-block}._trigger_1bfkp_6{cursor:pointer;display:inline-block}._popover_1bfkp_11{position:absolute;background-color:#fff;color:#374151;padding:1rem;border-radius:8px;border:1px solid #e5e7eb;z-index:900;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;min-width:200px;animation:_fadeIn_1bfkp_1 .15s ease-out}._popover_1bfkp_11._draggable_1bfkp_24{cursor:move;-webkit-user-select:none;user-select:none}._popover_1bfkp_11._bottom_1bfkp_30{top:calc(100% + .5rem);left:50%;transform:translate(-50%);transform-origin:top center}._popover_1bfkp_11._top_1bfkp_37{bottom:calc(100% + .5rem);left:50%;transform:translate(-50%);transform-origin:bottom center}._popover_1bfkp_11._left_1bfkp_44{right:calc(100% + .5rem);top:50%;transform:translateY(-50%);transform-origin:center right}._popover_1bfkp_11._right_1bfkp_51{left:calc(100% + .5rem);top:50%;transform:translateY(-50%);transform-origin:center left}@keyframes _fadeIn_1bfkp_1{0%{opacity:0;transform:scale(.95);margin-top:-5px}to{opacity:1;transform:scale(1);margin-top:0}}._toast_15h14_1{display:flex;align-items:center;gap:12px;min-width:300px;max-width:400px;padding:12px 16px;border-radius:6px;background:#fff;box-shadow:0 4px 12px #00000026;margin-bottom:10px;pointer-events:auto;overflow:hidden;animation:_slideIn_15h14_1 .3s ease-out;transition:all .3s ease-in-out;position:relative}._toast_15h14_1._draggable_15h14_19{cursor:move;-webkit-user-select:none;user-select:none}._toast_15h14_1._exiting_15h14_24{opacity:0;transform:scale(.95);margin-bottom:-40px}._toast_15h14_1._success_15h14_31{border-left:4px solid #10b981}._toast_15h14_1._error_15h14_35{border-left:4px solid #ef4444}._toast_15h14_1._warning_15h14_39{border-left:4px solid #f59e0b}._toast_15h14_1._info_15h14_43{border-left:4px solid #3b82f6}._icon_15h14_47{font-weight:700;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;flex-shrink:0}._toast_15h14_1._success_15h14_31 ._icon_15h14_47{background-color:#ecfdf5;color:#059669}._toast_15h14_1._error_15h14_35 ._icon_15h14_47{background-color:#fef2f2;color:#dc2626}._toast_15h14_1._warning_15h14_39 ._icon_15h14_47{background-color:#fffbeb;color:#d97706}._toast_15h14_1._info_15h14_43 ._icon_15h14_47{background-color:#eff6ff;color:#2563eb}._content_15h14_78{flex:1;font-size:14px;color:#374151;line-height:1.4}._closeBtn_15h14_85{background:transparent;border:none;cursor:pointer;font-size:18px;color:#4b5563;padding:0;display:flex;font-weight:700;align-items:center;justify-content:center;width:24px;height:24px}._closeBtn_15h14_85:hover{color:#111827;background-color:#0000000d;border-radius:4px}@keyframes _slideIn_15h14_1{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}._container_15h14_119{position:fixed;z-index:9999;pointer-events:none;display:flex;flex-direction:column;padding:16px;gap:8px}._container_15h14_119._top-left_15h14_129{top:0;left:0;align-items:flex-start}._container_15h14_119._top-right_15h14_135{top:0;right:0;align-items:flex-end}._container_15h14_119._top-center_15h14_141{top:0;left:50%;transform:translate(-50%);align-items:center}._container_15h14_119._bottom-left_15h14_148{bottom:0;left:0;align-items:flex-start;flex-direction:column-reverse}._container_15h14_119._bottom-right_15h14_155{bottom:0;right:0;align-items:flex-end;flex-direction:column-reverse}._container_15h14_119._bottom-center_15h14_162{bottom:0;left:50%;transform:translate(-50%);align-items:center;flex-direction:column-reverse}._container_15h14_119._bottom-left_15h14_148 ._toast_15h14_1,._container_15h14_119._bottom-right_15h14_155 ._toast_15h14_1,._container_15h14_119._bottom-center_15h14_162 ._toast_15h14_1{margin-bottom:0;margin-top:10px;animation:_slideInBottom_15h14_1 .3s ease-out}._container_15h14_119._bottom-left_15h14_148 ._toast_15h14_1._exiting_15h14_24,._container_15h14_119._bottom-right_15h14_155 ._toast_15h14_1._exiting_15h14_24,._container_15h14_119._bottom-center_15h14_162 ._toast_15h14_1._exiting_15h14_24{margin-top:-40px;margin-bottom:0}@keyframes _slideInBottom_15h14_1{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}._wrapper_1dham_1{position:relative;display:inline-block}._tooltip_1dham_6{position:absolute;background-color:#111827;color:#fff;padding:.5rem .75rem;border-radius:4px;font-size:.875rem;z-index:1000;white-space:nowrap;pointer-events:none;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;opacity:0;animation:_fadeIn_1dham_1 .2s forwards}._tooltip_1dham_6._top_1dham_22{bottom:100%;left:50%;transform:translate(-50%) translateY(-.5rem)}._tooltip_1dham_6._bottom_1dham_28{top:100%;left:50%;transform:translate(-50%) translateY(.5rem)}._tooltip_1dham_6._left_1dham_34{right:100%;top:50%;transform:translateY(-50%) translate(-.5rem)}._tooltip_1dham_6._right_1dham_40{left:100%;top:50%;transform:translateY(-50%) translate(.5rem)}@keyframes _fadeIn_1dham_1{to{opacity:1}}