@moontra/moonui-pro 2.0.13 → 2.0.14
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/dist/index.mjs +3094 -7
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React55 from 'react';
|
|
2
2
|
import React55__default, { useState, useRef, useCallback, forwardRef, createContext, Children, isValidElement, createElement, cloneElement, useEffect, useContext, useMemo, Fragment as Fragment$1, useLayoutEffect, useDebugValue, Component } from 'react';
|
|
3
3
|
import { motion, AnimatePresence, useMotionValue, useSpring, useTransform, animate } from 'framer-motion';
|
|
4
|
-
import { Loader2, Lock, Sparkles, Plus, ChevronDown, ChevronUp, Check, X, ChevronRight, Circle, Calendar, ChevronLeft, Edit, Trash2, Clock, MapPin, User, MoreHorizontal, GripVertical, MessageCircle, Paperclip, Bold as Bold$1, Italic as Italic$1, Underline as Underline$1, Strikethrough, Code as Code$1, Type, Heading1, Heading2, Heading3, AlignLeft, AlignCenter, AlignRight, AlignJustify, List, ListOrdered, CheckSquare, Quote, Palette, Highlighter, Link2, Image, Table as Table$1, Settings, Undo, Redo, Eye, RefreshCw, Wand2, Maximize, FileText, Languages, TrendingUp, TrendingDown,
|
|
4
|
+
import { Loader2, Lock, Sparkles, Plus, ChevronDown, ChevronUp, Check, X, ChevronRight, Circle, Minus, Calendar, ChevronLeft, Edit, Trash2, Clock, MapPin, User, MoreHorizontal, GripVertical, MessageCircle, Paperclip, Bold as Bold$1, Italic as Italic$1, Underline as Underline$1, Strikethrough, Code as Code$1, Type, Heading1, Heading2, Heading3, AlignLeft, AlignCenter, AlignRight, AlignJustify, List, ListOrdered, CheckSquare, Quote, Palette, Highlighter, Link2, Image as Image$1, Table as Table$1, Settings, Undo, Redo, Eye, RefreshCw, Wand2, Maximize, FileText, Languages, TrendingUp, TrendingDown, Download, Maximize2, Activity, Star, ExternalLink, BarChart3, Users, DollarSign, Copy, RotateCcw, Github, GitFork, Server, EyeOff, ZoomOut, ZoomIn, RotateCw, Zap, Monitor, Timer, AlertTriangle, Cpu, MemoryStick, HardDrive, Network, CheckCircle, CheckCircle2, AlertCircle, XCircle, ArrowDownRight, ArrowUpRight, Upload } from 'lucide-react';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
6
6
|
import { twMerge } from 'tailwind-merge';
|
|
7
7
|
import { cva } from 'class-variance-authority';
|
|
@@ -12,9 +12,13 @@ import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
|
12
12
|
import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';
|
|
13
13
|
import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js';
|
|
14
14
|
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
15
|
-
import { cn as cn$1 } from '@moontra/moonui';
|
|
15
|
+
import { cn as cn$1, Skeleton, Progress } from '@moontra/moonui';
|
|
16
16
|
import { ResponsiveContainer, ScatterChart, CartesianGrid, XAxis, YAxis, Tooltip as Tooltip$1, Legend, Scatter, PieChart, Pie, Cell, AreaChart, Area, ReferenceLine, Brush, BarChart, Bar, LineChart, Line, ReferenceArea } from 'recharts';
|
|
17
17
|
import { DragDropContext, Droppable, Draggable } from '@hello-pangea/dnd';
|
|
18
|
+
import { useForm } from 'react-hook-form';
|
|
19
|
+
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
20
|
+
import * as SwitchPrimitives from '@radix-ui/react-switch';
|
|
21
|
+
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
18
22
|
|
|
19
23
|
/**
|
|
20
24
|
* @moontra/moonui-pro v2.0.9
|
|
@@ -1729,7 +1733,7 @@ function styleInject(css2, { insertAt } = {}) {
|
|
|
1729
1733
|
}
|
|
1730
1734
|
|
|
1731
1735
|
// src/styles/index.css
|
|
1732
|
-
styleInject('*,\n::before,\n::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n*,\n::before,\n::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: #e5e7eb;\n}\n::before,\n::after {\n --tw-content: "";\n}\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family: var(--font-sans);\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent;\n}\nbody {\n margin: 0;\n line-height: inherit;\n}\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n}\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\na {\n color: inherit;\n text-decoration: inherit;\n}\nb,\nstrong {\n font-weight: bolder;\n}\ncode,\nkbd,\nsamp,\npre {\n font-family: var(--font-mono);\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n padding: 0;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\ninput:where([type="button"]),\ninput:where([type="reset"]),\ninput:where([type="submit"]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none;\n}\n:-moz-focusring {\n outline: auto;\n}\n:-moz-ui-invalid {\n box-shadow: none;\n}\nprogress {\n vertical-align: baseline;\n}\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\nsummary {\n display: list-item;\n}\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\ndialog {\n padding: 0;\n}\ntextarea {\n resize: vertical;\n}\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\nbutton,\n[role=button] {\n cursor: pointer;\n}\n:disabled {\n cursor: default;\n}\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n[hidden]:where(:not([hidden="until-found"])) {\n display: none;\n}\n:root {\n --bg-base: var(--background);\n --bg-subtle: var(--gray-50);\n --bg-muted: var(--gray-100);\n --bg-emphasis: var(--gray-200);\n --bg-inverse: var(--foreground);\n --surface-base: var(--background);\n --surface-overlay: var(--gray-50);\n --surface-raised: var(--background);\n --surface-sunken: var(--gray-100);\n --text-primary: var(--foreground);\n --text-secondary: var(--gray-600);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-400);\n --text-inverse: var(--background);\n --text-link: var(--primary);\n --text-link-hover: var(--primary-hover);\n --brand-primary: var(--primary);\n --brand-primary-hover: var(--primary-hover);\n --brand-primary-active: var(--primary-active);\n --brand-secondary: var(--secondary);\n --state-hover: var(--gray-100);\n --state-active: var(--gray-200);\n --state-selected: var(--primary);\n --state-disabled: var(--gray-300);\n --state-focus: var(--primary);\n --feedback-success: var(--success);\n --feedback-success-light: 142 71% 95%;\n --feedback-success-dark: 142 71% 35%;\n --feedback-warning: var(--warning);\n --feedback-warning-light: 38 92% 95%;\n --feedback-warning-dark: 38 92% 40%;\n --feedback-error: var(--error);\n --feedback-error-light: 0 84% 95%;\n --feedback-error-dark: 0 84% 50%;\n --feedback-info: 217 91% 60%;\n --feedback-info-light: 217 91% 95%;\n --feedback-info-dark: 217 91% 50%;\n --border-default: var(--border);\n --border-subtle: var(--gray-200);\n --border-strong: var(--gray-400);\n --border-interactive: var(--primary);\n --border-error: var(--error);\n --border-success: var(--success);\n --border-warning: var(--warning);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --shadow-primary: 0 4px 14px 0 hsl(var(--primary) / 0.3);\n --shadow-success: 0 4px 14px 0 hsl(var(--success) / 0.3);\n --shadow-error: 0 4px 14px 0 hsl(var(--error) / 0.3);\n --shadow-warning: 0 4px 14px 0 hsl(var(--warning) / 0.3);\n --shadow-inner-xs: inset 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-inner-sm: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --shadow-inner-md: inset 0 4px 6px -1px rgb(0 0 0 / 0.1);\n --ease-linear: linear;\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --ease-back-in: cubic-bezier(0.6, -0.28, 0.735, 0.045);\n --ease-back-out: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n --ease-back-in-out: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --duration-instant: 0ms;\n --duration-fast: 150ms;\n --duration-normal: 250ms;\n --duration-slow: 350ms;\n --duration-slower: 500ms;\n --duration-slowest: 750ms;\n --space-0: 0;\n --space-px: 1px;\n --space-0\\.5: 0.125rem;\n --space-1: 0.25rem;\n --space-1\\.5: 0.375rem;\n --space-2: 0.5rem;\n --space-2\\.5: 0.625rem;\n --space-3: 0.75rem;\n --space-3\\.5: 0.875rem;\n --space-4: 1rem;\n --space-5: 1.25rem;\n --space-6: 1.5rem;\n --space-7: 1.75rem;\n --space-8: 2rem;\n --space-9: 2.25rem;\n --space-10: 2.5rem;\n --space-11: 2.75rem;\n --space-12: 3rem;\n --space-14: 3.5rem;\n --space-16: 4rem;\n --space-20: 5rem;\n --space-24: 6rem;\n --space-28: 7rem;\n --space-32: 8rem;\n --space-36: 9rem;\n --space-40: 10rem;\n --space-44: 11rem;\n --space-48: 12rem;\n --space-52: 13rem;\n --space-56: 14rem;\n --space-60: 15rem;\n --space-64: 16rem;\n --space-72: 18rem;\n --space-80: 20rem;\n --space-96: 24rem;\n --text-2xs: 0.625rem;\n --text-xs: 0.75rem;\n --text-sm: 0.875rem;\n --text-base: 1rem;\n --text-lg: 1.125rem;\n --text-xl: 1.25rem;\n --text-2xl: 1.5rem;\n --text-3xl: 1.875rem;\n --text-4xl: 2.25rem;\n --text-5xl: 3rem;\n --text-6xl: 3.75rem;\n --text-7xl: 4.5rem;\n --text-8xl: 6rem;\n --text-9xl: 8rem;\n --leading-none: 1;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --font-thin: 100;\n --font-extralight: 200;\n --font-light: 300;\n --font-normal: 400;\n --font-medium: 500;\n --font-semibold: 600;\n --font-bold: 700;\n --font-extrabold: 800;\n --font-black: 900;\n --radius-none: 0;\n --radius-sm: 0.125rem;\n --radius-base: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-full: 9999px;\n --z-0: 0;\n --z-10: 10;\n --z-20: 20;\n --z-30: 30;\n --z-40: 40;\n --z-50: 50;\n --z-dropdown: 1000;\n --z-sticky: 1020;\n --z-fixed: 1030;\n --z-modal-backdrop: 1040;\n --z-modal: 1050;\n --z-popover: 1060;\n --z-tooltip: 1070;\n --z-notification: 1080;\n --blur-none: 0;\n --blur-sm: 4px;\n --blur-base: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-2xl: 40px;\n --blur-3xl: 64px;\n}\n.dark {\n --bg-base: var(--background);\n --bg-subtle: var(--gray-800);\n --bg-muted: var(--gray-700);\n --bg-emphasis: var(--gray-600);\n --surface-overlay: var(--gray-800);\n --surface-raised: var(--gray-800);\n --surface-sunken: var(--background);\n --text-secondary: var(--gray-400);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-600);\n --state-hover: var(--gray-700);\n --state-active: var(--gray-600);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.3);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.3);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n}\n.container {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 1rem;\n padding-left: 1rem;\n}\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n padding-right: 2rem;\n padding-left: 2rem;\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n padding-right: 4rem;\n padding-left: 4rem;\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n padding-right: 5rem;\n padding-left: 5rem;\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n padding-right: 6rem;\n padding-left: 6rem;\n }\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.pointer-events-auto {\n pointer-events: auto;\n}\n.visible {\n visibility: visible;\n}\n.collapse {\n visibility: collapse;\n}\n.static {\n position: static;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.sticky {\n position: sticky;\n}\n.inset-0 {\n inset: 0px;\n}\n.bottom-2 {\n bottom: 0.5rem;\n}\n.bottom-4 {\n bottom: 1rem;\n}\n.bottom-\\[5\\%\\] {\n bottom: 5%;\n}\n.left-2 {\n left: 0.5rem;\n}\n.left-3 {\n left: 0.75rem;\n}\n.left-4 {\n left: 1rem;\n}\n.left-\\[50\\%\\] {\n left: 50%;\n}\n.right-1 {\n right: 0.25rem;\n}\n.right-2 {\n right: 0.5rem;\n}\n.right-3 {\n right: 0.75rem;\n}\n.right-4 {\n right: 1rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-1 {\n top: 0.25rem;\n}\n.top-2 {\n top: 0.5rem;\n}\n.top-2\\.5 {\n top: 0.625rem;\n}\n.top-4 {\n top: 1rem;\n}\n.top-\\[5\\%\\] {\n top: 5%;\n}\n.top-\\[50\\%\\] {\n top: 50%;\n}\n.top-auto {\n top: auto;\n}\n.z-0 {\n z-index: 0;\n}\n.z-10 {\n z-index: 10;\n}\n.z-40 {\n z-index: 40;\n}\n.z-50 {\n z-index: 50;\n}\n.z-\\[-1\\] {\n z-index: -1;\n}\n.z-\\[100\\] {\n z-index: 100;\n}\n.col-span-1 {\n grid-column: span 1 / span 1;\n}\n.col-span-2 {\n grid-column: span 2 / span 2;\n}\n.col-span-3 {\n grid-column: span 3 / span 3;\n}\n.col-span-4 {\n grid-column: span 4 / span 4;\n}\n.-m-2 {\n margin: -0.5rem;\n}\n.-mx-1 {\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n}\n.-mx-4 {\n margin-left: -1rem;\n margin-right: -1rem;\n}\n.mx-1 {\n margin-left: 0.25rem;\n margin-right: 0.25rem;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.my-2 {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.-mb-4 {\n margin-bottom: -1rem;\n}\n.-mr-1 {\n margin-right: -0.25rem;\n}\n.-mt-4 {\n margin-top: -1rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-3 {\n margin-bottom: 0.75rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-8 {\n margin-bottom: 2rem;\n}\n.ml-1 {\n margin-left: 0.25rem;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-1 {\n margin-right: 0.25rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mr-auto {\n margin-right: auto;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-3 {\n margin-top: 0.75rem;\n}\n.mt-4 {\n margin-top: 1rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.\\!table {\n display: table !important;\n}\n.table {\n display: table;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.aspect-square {\n aspect-ratio: 1 / 1;\n}\n.h-0 {\n height: 0px;\n}\n.h-1 {\n height: 0.25rem;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-12 {\n height: 3rem;\n}\n.h-14 {\n height: 3.5rem;\n}\n.h-16 {\n height: 4rem;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-20 {\n height: 5rem;\n}\n.h-24 {\n height: 6rem;\n}\n.h-3 {\n height: 0.75rem;\n}\n.h-3\\.5 {\n height: 0.875rem;\n}\n.h-32 {\n height: 8rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-7 {\n height: 1.75rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-96 {\n height: 24rem;\n}\n.h-\\[0\\.5px\\] {\n height: 0.5px;\n}\n.h-\\[1px\\] {\n height: 1px;\n}\n.h-\\[2px\\] {\n height: 2px;\n}\n.h-\\[65\\%\\] {\n height: 65%;\n}\n.h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n}\n.h-auto {\n height: auto;\n}\n.h-fit {\n height: -moz-fit-content;\n height: fit-content;\n}\n.h-full {\n height: 100%;\n}\n.h-px {\n height: 1px;\n}\n.max-h-96 {\n max-height: 24rem;\n}\n.max-h-\\[95vh\\] {\n max-height: 95vh;\n}\n.max-h-screen {\n max-height: 100vh;\n}\n.min-h-\\[200px\\] {\n min-height: 200px;\n}\n.min-h-\\[80px\\] {\n min-height: 80px;\n}\n.w-0 {\n width: 0px;\n}\n.w-0\\.5 {\n width: 0.125rem;\n}\n.w-1 {\n width: 0.25rem;\n}\n.w-1\\/4 {\n width: 25%;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-11 {\n width: 2.75rem;\n}\n.w-12 {\n width: 3rem;\n}\n.w-14 {\n width: 3.5rem;\n}\n.w-16 {\n width: 4rem;\n}\n.w-2 {\n width: 0.5rem;\n}\n.w-20 {\n width: 5rem;\n}\n.w-3 {\n width: 0.75rem;\n}\n.w-3\\.5 {\n width: 0.875rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-48 {\n width: 12rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-56 {\n width: 14rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-64 {\n width: 16rem;\n}\n.w-72 {\n width: 18rem;\n}\n.w-8 {\n width: 2rem;\n}\n.w-80 {\n width: 20rem;\n}\n.w-96 {\n width: 24rem;\n}\n.w-\\[0\\.5px\\] {\n width: 0.5px;\n}\n.w-\\[100px\\] {\n width: 100px;\n}\n.w-\\[1px\\] {\n width: 1px;\n}\n.w-\\[2px\\] {\n width: 2px;\n}\n.w-\\[65\\%\\] {\n width: 65%;\n}\n.w-\\[70px\\] {\n width: 70px;\n}\n.w-auto {\n width: auto;\n}\n.w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.w-full {\n width: 100%;\n}\n.w-px {\n width: 1px;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-\\[70px\\] {\n min-width: 70px;\n}\n.min-w-\\[8rem\\] {\n min-width: 8rem;\n}\n.min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n}\n.max-w-2xl {\n max-width: 42rem;\n}\n.max-w-4xl {\n max-width: 56rem;\n}\n.max-w-\\[95vw\\] {\n max-width: 95vw;\n}\n.max-w-full {\n max-width: 100%;\n}\n.max-w-lg {\n max-width: 32rem;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-none {\n max-width: none;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.max-w-xs {\n max-width: 20rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.grow {\n flex-grow: 1;\n}\n.translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-y-0 {\n --tw-translate-y: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-2 {\n --tw-rotate: 2deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[-15deg\\] {\n --tw-rotate: -15deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[15deg\\] {\n --tw-rotate: 15deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-105 {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-95 {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-default {\n cursor: default;\n}\n.cursor-grab {\n cursor: grab;\n}\n.cursor-grabbing {\n cursor: grabbing;\n}\n.cursor-help {\n cursor: help;\n}\n.cursor-move {\n cursor: move;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.cursor-text {\n cursor: text;\n}\n.cursor-wait {\n cursor: wait;\n}\n.touch-none {\n touch-action: none;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.resize-none {\n resize: none;\n}\n.resize {\n resize: both;\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n.grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n}\n.grid-cols-6 {\n grid-template-columns: repeat(6, minmax(0, 1fr));\n}\n.grid-cols-7 {\n grid-template-columns: repeat(7, minmax(0, 1fr));\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-col-reverse {\n flex-direction: column-reverse;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-1\\.5 {\n gap: 0.375rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.gap-6 {\n gap: 1.5rem;\n}\n.gap-8 {\n gap: 2rem;\n}\n.space-x-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.25rem * var(--tw-space-x-reverse));\n margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1.5rem * var(--tw-space-x-reverse));\n margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-0 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0px * var(--tw-space-y-reverse));\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-3 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n.overflow-auto {\n overflow: auto;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-x-auto {\n overflow-x: auto;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-2xl {\n border-radius: 1rem;\n}\n.rounded-3xl {\n border-radius: 1.5rem;\n}\n.rounded-\\[inherit\\] {\n border-radius: inherit;\n}\n.rounded-\\[var\\(--login-border-radius\\)\\] {\n border-radius: var(--login-border-radius);\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: var(--radius);\n}\n.rounded-md {\n border-radius: calc(var(--radius) - 2px);\n}\n.rounded-none {\n border-radius: 0px;\n}\n.rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.border {\n border-width: 1px;\n}\n.border-2 {\n border-width: 2px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-b-2 {\n border-bottom-width: 2px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-l-0 {\n border-left-width: 0px;\n}\n.border-l-2 {\n border-left-width: 2px;\n}\n.border-l-4 {\n border-left-width: 4px;\n}\n.border-l-\\[0\\.5px\\] {\n border-left-width: 0.5px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-t-0 {\n border-top-width: 0px;\n}\n.border-t-2 {\n border-top-width: 2px;\n}\n.border-t-\\[0\\.5px\\] {\n border-top-width: 0.5px;\n}\n.border-dashed {\n border-style: dashed;\n}\n.border-dotted {\n border-style: dotted;\n}\n.border-none {\n border-style: none;\n}\n.border-accent {\n --tw-border-opacity: 1;\n border-color: hsl(var(--accent) / var(--tw-border-opacity, 1));\n}\n.border-blue-200 {\n --tw-border-opacity: 1;\n border-color: rgb(191 219 254 / var(--tw-border-opacity, 1));\n}\n.border-blue-500 {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));\n}\n.border-blue-600 {\n --tw-border-opacity: 1;\n border-color: rgb(37 99 235 / var(--tw-border-opacity, 1));\n}\n.border-border {\n --tw-border-opacity: 1;\n border-color: hsl(var(--border) / var(--tw-border-opacity, 1));\n}\n.border-border\\/50 {\n border-color: hsl(var(--border) / 0.5);\n}\n.border-destructive {\n --tw-border-opacity: 1;\n border-color: hsl(var(--destructive) / var(--tw-border-opacity, 1));\n}\n.border-error {\n --tw-border-opacity: 1;\n border-color: hsl(var(--error) / var(--tw-border-opacity, 1));\n}\n.border-error\\/20 {\n border-color: hsl(var(--error) / 0.2);\n}\n.border-foreground {\n --tw-border-opacity: 1;\n border-color: hsl(var(--foreground) / var(--tw-border-opacity, 1));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));\n}\n.border-green-200 {\n --tw-border-opacity: 1;\n border-color: rgb(187 247 208 / var(--tw-border-opacity, 1));\n}\n.border-green-500 {\n --tw-border-opacity: 1;\n border-color: rgb(34 197 94 / var(--tw-border-opacity, 1));\n}\n.border-green-600 {\n --tw-border-opacity: 1;\n border-color: rgb(22 163 74 / var(--tw-border-opacity, 1));\n}\n.border-input {\n --tw-border-opacity: 1;\n border-color: hsl(var(--input) / var(--tw-border-opacity, 1));\n}\n.border-muted {\n --tw-border-opacity: 1;\n border-color: hsl(var(--muted) / var(--tw-border-opacity, 1));\n}\n.border-muted-foreground\\/25 {\n border-color: hsl(var(--muted-foreground) / 0.25);\n}\n.border-orange-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 215 170 / var(--tw-border-opacity, 1));\n}\n.border-primary {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.border-primary\\/20 {\n border-color: hsl(var(--primary) / 0.2);\n}\n.border-primary\\/50 {\n border-color: hsl(var(--primary) / 0.5);\n}\n.border-red-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));\n}\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));\n}\n.border-secondary {\n --tw-border-opacity: 1;\n border-color: hsl(var(--secondary) / var(--tw-border-opacity, 1));\n}\n.border-success {\n --tw-border-opacity: 1;\n border-color: hsl(var(--success) / var(--tw-border-opacity, 1));\n}\n.border-success\\/40 {\n border-color: hsl(var(--success) / 0.4);\n}\n.border-transparent {\n border-color: transparent;\n}\n.border-warning {\n --tw-border-opacity: 1;\n border-color: hsl(var(--warning) / var(--tw-border-opacity, 1));\n}\n.border-white\\/20 {\n border-color: rgb(255 255 255 / 0.2);\n}\n.border-yellow-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 240 138 / var(--tw-border-opacity, 1));\n}\n.border-yellow-500 {\n --tw-border-opacity: 1;\n border-color: rgb(234 179 8 / var(--tw-border-opacity, 1));\n}\n.border-yellow-600 {\n --tw-border-opacity: 1;\n border-color: rgb(202 138 4 / var(--tw-border-opacity, 1));\n}\n.border-t-primary {\n --tw-border-opacity: 1;\n border-top-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.bg-\\[var\\(--login-background\\)\\] {\n background-color: var(--login-background);\n}\n.bg-\\[var\\(--login-primary\\)\\] {\n background-color: var(--login-primary);\n}\n.bg-accent {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.bg-accent\\/20 {\n background-color: hsl(var(--accent) / 0.2);\n}\n.bg-background {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--background) / var(--tw-bg-opacity, 1));\n}\n.bg-background\\/80 {\n background-color: hsl(var(--background) / 0.8);\n}\n.bg-background\\/90 {\n background-color: hsl(var(--background) / 0.9);\n}\n.bg-black\\/20 {\n background-color: rgb(0 0 0 / 0.2);\n}\n.bg-black\\/40 {\n background-color: rgb(0 0 0 / 0.4);\n}\n.bg-black\\/60 {\n background-color: rgb(0 0 0 / 0.6);\n}\n.bg-black\\/80 {\n background-color: rgb(0 0 0 / 0.8);\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\n}\n.bg-border {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--border) / var(--tw-bg-opacity, 1));\n}\n.bg-card {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--card) / var(--tw-bg-opacity, 1));\n}\n.bg-destructive {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--destructive) / var(--tw-bg-opacity, 1));\n}\n.bg-destructive\\/5 {\n background-color: hsl(var(--destructive) / 0.05);\n}\n.bg-error {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--error) / var(--tw-bg-opacity, 1));\n}\n.bg-error\\/20 {\n background-color: hsl(var(--error) / 0.2);\n}\n.bg-foreground {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--foreground) / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-green-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\n}\n.bg-green-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-green-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.bg-muted {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--muted) / var(--tw-bg-opacity, 1));\n}\n.bg-muted\\/20 {\n background-color: hsl(var(--muted) / 0.2);\n}\n.bg-muted\\/50 {\n background-color: hsl(var(--muted) / 0.5);\n}\n.bg-muted\\/80 {\n background-color: hsl(var(--muted) / 0.8);\n}\n.bg-orange-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 237 213 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 115 22 / var(--tw-bg-opacity, 1));\n}\n.bg-popover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--popover) / var(--tw-bg-opacity, 1));\n}\n.bg-primary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.bg-primary-foreground {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary-foreground) / var(--tw-bg-opacity, 1));\n}\n.bg-primary\\/10 {\n background-color: hsl(var(--primary) / 0.1);\n}\n.bg-primary\\/20 {\n background-color: hsl(var(--primary) / 0.2);\n}\n.bg-primary\\/30 {\n background-color: hsl(var(--primary) / 0.3);\n}\n.bg-primary\\/5 {\n background-color: hsl(var(--primary) / 0.05);\n}\n.bg-purple-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 232 255 / var(--tw-bg-opacity, 1));\n}\n.bg-purple-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(168 85 247 / var(--tw-bg-opacity, 1));\n}\n.bg-red-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\n}\n.bg-red-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\n}\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1));\n}\n.bg-secondary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--secondary) / var(--tw-bg-opacity, 1));\n}\n.bg-secondary-foreground {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--secondary-foreground) / var(--tw-bg-opacity, 1));\n}\n.bg-secondary\\/20 {\n background-color: hsl(var(--secondary) / 0.2);\n}\n.bg-success {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--success) / var(--tw-bg-opacity, 1));\n}\n.bg-success\\/20 {\n background-color: hsl(var(--success) / 0.2);\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-warning {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--warning) / var(--tw-bg-opacity, 1));\n}\n.bg-warning\\/20 {\n background-color: hsl(var(--warning) / 0.2);\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-white\\/10 {\n background-color: rgb(255 255 255 / 0.1);\n}\n.bg-yellow-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 249 195 / var(--tw-bg-opacity, 1));\n}\n.bg-yellow-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));\n}\n.bg-opacity-80 {\n --tw-bg-opacity: 0.8;\n}\n.bg-gradient-to-br {\n background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));\n}\n.bg-gradient-to-r {\n background-image: linear-gradient(to right, var(--tw-gradient-stops));\n}\n.from-blue-600 {\n --tw-gradient-from: #2563eb var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-primary\\/5 {\n --tw-gradient-from: hsl(var(--primary) / 0.05) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-purple-600 {\n --tw-gradient-from: #9333ea var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(147 51 234 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-white\\/20 {\n --tw-gradient-from: rgb(255 255 255 / 0.2) var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-white\\/5 {\n --tw-gradient-from: rgb(255 255 255 / 0.05) var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.via-border {\n --tw-gradient-to: hsl(var(--border) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from),\n hsl(var(--border) / 1) var(--tw-gradient-via-position),\n var(--tw-gradient-to);\n}\n.via-transparent {\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from),\n transparent var(--tw-gradient-via-position),\n var(--tw-gradient-to);\n}\n.to-black\\/5 {\n --tw-gradient-to: rgb(0 0 0 / 0.05) var(--tw-gradient-to-position);\n}\n.to-pink-600 {\n --tw-gradient-to: #db2777 var(--tw-gradient-to-position);\n}\n.to-primary\\/10 {\n --tw-gradient-to: hsl(var(--primary) / 0.1) var(--tw-gradient-to-position);\n}\n.to-purple-600 {\n --tw-gradient-to: #9333ea var(--tw-gradient-to-position);\n}\n.to-transparent {\n --tw-gradient-to: transparent var(--tw-gradient-to-position);\n}\n.to-white\\/0 {\n --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n}\n.fill-current {\n fill: currentColor;\n}\n.p-0 {\n padding: 0px;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-1\\.5 {\n padding: 0.375rem;\n}\n.p-10 {\n padding: 2.5rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-5 {\n padding: 1.25rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.p-7 {\n padding: 1.75rem;\n}\n.p-8 {\n padding: 2rem;\n}\n.px-0 {\n padding-left: 0px;\n padding-right: 0px;\n}\n.px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.py-0 {\n padding-top: 0px;\n padding-bottom: 0px;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-12 {\n padding-top: 3rem;\n padding-bottom: 3rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n.py-8 {\n padding-top: 2rem;\n padding-bottom: 2rem;\n}\n.pb-2 {\n padding-bottom: 0.5rem;\n}\n.pb-3 {\n padding-bottom: 0.75rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pb-8 {\n padding-bottom: 2rem;\n}\n.pl-10 {\n padding-left: 2.5rem;\n}\n.pl-2 {\n padding-left: 0.5rem;\n}\n.pl-7 {\n padding-left: 1.75rem;\n}\n.pl-8 {\n padding-left: 2rem;\n}\n.pl-9 {\n padding-left: 2.25rem;\n}\n.pr-10 {\n padding-right: 2.5rem;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pr-3 {\n padding-right: 0.75rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pt-0 {\n padding-top: 0px;\n}\n.pt-3 {\n padding-top: 0.75rem;\n}\n.pt-4 {\n padding-top: 1rem;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.align-middle {\n vertical-align: middle;\n}\n.font-mono {\n font-family: var(--font-mono);\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.capitalize {\n text-transform: capitalize;\n}\n.italic {\n font-style: italic;\n}\n.leading-none {\n line-height: 1;\n}\n.leading-normal {\n line-height: 1.5;\n}\n.leading-snug {\n line-height: 1.375;\n}\n.tracking-tight {\n letter-spacing: -0.025em;\n}\n.tracking-widest {\n letter-spacing: 0.1em;\n}\n.text-\\[var\\(--login-primary\\)\\] {\n color: var(--login-primary);\n}\n.text-\\[var\\(--login-text\\)\\] {\n color: var(--login-text);\n}\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity, 1));\n}\n.text-blue-700 {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\n}\n.text-blue-900 {\n --tw-text-opacity: 1;\n color: rgb(30 58 138 / var(--tw-text-opacity, 1));\n}\n.text-card-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--card-foreground) / var(--tw-text-opacity, 1));\n}\n.text-current {\n color: currentColor;\n}\n.text-destructive {\n --tw-text-opacity: 1;\n color: hsl(var(--destructive) / var(--tw-text-opacity, 1));\n}\n.text-destructive-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--destructive-foreground) / var(--tw-text-opacity, 1));\n}\n.text-error {\n --tw-text-opacity: 1;\n color: hsl(var(--error) / var(--tw-text-opacity, 1));\n}\n.text-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.text-foreground\\/50 {\n color: hsl(var(--foreground) / 0.5);\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-green-600 {\n --tw-text-opacity: 1;\n color: rgb(22 163 74 / var(--tw-text-opacity, 1));\n}\n.text-green-700 {\n --tw-text-opacity: 1;\n color: rgb(21 128 61 / var(--tw-text-opacity, 1));\n}\n.text-green-800 {\n --tw-text-opacity: 1;\n color: rgb(22 101 52 / var(--tw-text-opacity, 1));\n}\n.text-green-900 {\n --tw-text-opacity: 1;\n color: rgb(20 83 45 / var(--tw-text-opacity, 1));\n}\n.text-muted-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--muted-foreground) / var(--tw-text-opacity, 1));\n}\n.text-orange-800 {\n --tw-text-opacity: 1;\n color: rgb(154 52 18 / var(--tw-text-opacity, 1));\n}\n.text-orange-900 {\n --tw-text-opacity: 1;\n color: rgb(124 45 18 / var(--tw-text-opacity, 1));\n}\n.text-popover-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--popover-foreground) / var(--tw-text-opacity, 1));\n}\n.text-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--primary) / var(--tw-text-opacity, 1));\n}\n.text-primary-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.text-purple-600 {\n --tw-text-opacity: 1;\n color: rgb(147 51 234 / var(--tw-text-opacity, 1));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-red-700 {\n --tw-text-opacity: 1;\n color: rgb(185 28 28 / var(--tw-text-opacity, 1));\n}\n.text-red-800 {\n --tw-text-opacity: 1;\n color: rgb(153 27 27 / var(--tw-text-opacity, 1));\n}\n.text-secondary-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--secondary-foreground) / var(--tw-text-opacity, 1));\n}\n.text-success {\n --tw-text-opacity: 1;\n color: hsl(var(--success) / var(--tw-text-opacity, 1));\n}\n.text-warning {\n --tw-text-opacity: 1;\n color: hsl(var(--warning) / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.text-white\\/80 {\n color: rgb(255 255 255 / 0.8);\n}\n.text-yellow-600 {\n --tw-text-opacity: 1;\n color: rgb(202 138 4 / var(--tw-text-opacity, 1));\n}\n.text-yellow-700 {\n --tw-text-opacity: 1;\n color: rgb(161 98 7 / var(--tw-text-opacity, 1));\n}\n.text-yellow-800 {\n --tw-text-opacity: 1;\n color: rgb(133 77 14 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-30 {\n opacity: 0.3;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-80 {\n opacity: 0.8;\n}\n.opacity-90 {\n opacity: 0.9;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-none {\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-primary\\/50 {\n --tw-shadow-color: hsl(var(--primary) / 0.5);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.shadow-purple-500\\/25 {\n --tw-shadow-color: rgb(168 85 247 / 0.25);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.outline {\n outline-style: solid;\n}\n.ring {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ring-0 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ring-gray-300 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1));\n}\n.ring-offset-2 {\n --tw-ring-offset-width: 2px;\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background) / 1);\n}\n.blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.blur-md {\n --tw-blur: blur(12px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.blur-xl {\n --tw-blur: blur(24px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.backdrop-blur-md {\n --tw-backdrop-blur: blur(12px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n -webkit-backdrop-filter;\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter,\n -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-100 {\n transition-duration: 100ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n.shadow-sm {\n box-shadow: var(--shadow-sm);\n}\n.shadow-md {\n box-shadow: var(--shadow-md);\n}\n.shadow-lg {\n box-shadow: var(--shadow-lg);\n}\n.shadow-xl {\n box-shadow: var(--shadow-xl);\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n.transition-all {\n transition-property: all;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n}\n.transition-opacity {\n transition-property: opacity;\n}\n.transition-shadow {\n transition-property: box-shadow;\n}\n.transition-transform {\n transition-property: transform;\n}\n.ease-out {\n transition-timing-function: var(--ease-out);\n}\n:root {\n --primary-50: 240 249 255;\n --primary-100: 224 242 254;\n --primary-200: 186 230 253;\n --primary-300: 125 211 252;\n --primary-400: 56 189 248;\n --primary-500: 14 165 233;\n --primary-600: 2 132 199;\n --primary-700: 3 105 161;\n --primary-800: 7 89 133;\n --primary-900: 12 74 110;\n --primary-950: 8 47 73;\n --secondary-50: 248 250 252;\n --secondary-100: 241 245 249;\n --secondary-200: 226 232 240;\n --secondary-300: 203 213 225;\n --secondary-400: 148 163 184;\n --secondary-500: 100 116 139;\n --secondary-600: 71 85 105;\n --secondary-700: 51 65 85;\n --secondary-800: 30 41 59;\n --secondary-900: 15 23 42;\n --secondary-950: 2 6 23;\n --success-50: 240 253 244;\n --success-100: 220 252 231;\n --success-200: 187 247 208;\n --success-300: 134 239 172;\n --success-400: 74 222 128;\n --success-500: 34 197 94;\n --success-600: 22 163 74;\n --success-700: 21 128 61;\n --success-800: 22 101 52;\n --success-900: 20 83 45;\n --success-950: 5 46 22;\n --warning-50: 254 252 232;\n --warning-100: 254 249 195;\n --warning-200: 254 240 138;\n --warning-300: 253 224 71;\n --warning-400: 250 204 21;\n --warning-500: 234 179 8;\n --warning-600: 202 138 4;\n --warning-700: 161 98 7;\n --warning-800: 133 77 14;\n --warning-900: 113 63 18;\n --warning-950: 66 32 6;\n --error-50: 254 242 242;\n --error-100: 254 226 226;\n --error-200: 254 202 202;\n --error-300: 252 165 165;\n --error-400: 248 113 113;\n --error-500: 239 68 68;\n --error-600: 220 38 38;\n --error-700: 185 28 28;\n --error-800: 153 27 27;\n --error-900: 127 29 29;\n --error-950: 69 10 10;\n --background: 0 0% 100%;\n --foreground: 222.2 47.4% 11.2%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 47.4% 11.2%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 47.4% 11.2%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 100% 50%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 215 20.2% 65.1%;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n --font-sans:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n "Helvetica Neue",\n Arial,\n sans-serif;\n --font-serif:\n "Crimson Text",\n Georgia,\n "Times New Roman",\n serif;\n --font-mono:\n "JetBrains Mono",\n "Fira Code",\n "Consolas",\n monospace;\n --text-xs: 0.75rem;\n --text-sm: 0.875rem;\n --text-base: 1rem;\n --text-lg: 1.125rem;\n --text-xl: 1.25rem;\n --text-2xl: 1.5rem;\n --text-3xl: 1.875rem;\n --text-4xl: 2.25rem;\n --text-5xl: 3rem;\n --text-6xl: 3.75rem;\n --text-7xl: 4.5rem;\n --text-8xl: 6rem;\n --text-9xl: 8rem;\n --leading-none: 1;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n --font-thin: 100;\n --font-extralight: 200;\n --font-light: 300;\n --font-normal: 400;\n --font-medium: 500;\n --font-semibold: 600;\n --font-bold: 700;\n --font-extrabold: 800;\n --font-black: 900;\n --spacing-0: 0;\n --spacing-px: 1px;\n --spacing-0-5: 0.125rem;\n --spacing-1: 0.25rem;\n --spacing-1-5: 0.375rem;\n --spacing-2: 0.5rem;\n --spacing-2-5: 0.625rem;\n --spacing-3: 0.75rem;\n --spacing-3-5: 0.875rem;\n --spacing-4: 1rem;\n --spacing-5: 1.25rem;\n --spacing-6: 1.5rem;\n --spacing-7: 1.75rem;\n --spacing-8: 2rem;\n --spacing-9: 2.25rem;\n --spacing-10: 2.5rem;\n --spacing-11: 2.75rem;\n --spacing-12: 3rem;\n --spacing-14: 3.5rem;\n --spacing-16: 4rem;\n --spacing-20: 5rem;\n --spacing-24: 6rem;\n --spacing-28: 7rem;\n --spacing-32: 8rem;\n --spacing-36: 9rem;\n --spacing-40: 10rem;\n --spacing-44: 11rem;\n --spacing-48: 12rem;\n --spacing-52: 13rem;\n --spacing-56: 14rem;\n --spacing-60: 15rem;\n --spacing-64: 16rem;\n --spacing-72: 18rem;\n --spacing-80: 20rem;\n --spacing-96: 24rem;\n --radius-none: 0;\n --radius-sm: 0.125rem;\n --radius-base: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-full: 9999px;\n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06);\n --shadow-none: 0 0 #0000;\n --elevation-0: var(--shadow-none);\n --elevation-1: var(--shadow-sm);\n --elevation-2: var(--shadow-base);\n --elevation-3: var(--shadow-md);\n --elevation-4: var(--shadow-lg);\n --elevation-5: var(--shadow-xl);\n --elevation-6: var(--shadow-2xl);\n --duration-75: 75ms;\n --duration-100: 100ms;\n --duration-150: 150ms;\n --duration-200: 200ms;\n --duration-300: 300ms;\n --duration-500: 500ms;\n --duration-700: 700ms;\n --duration-1000: 1000ms;\n --ease-linear: linear;\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n --animate-fade-in: fadeIn var(--duration-300) var(--ease-out);\n --animate-fade-out: fadeOut var(--duration-300) var(--ease-in);\n --animate-slide-in-up: slideInUp var(--duration-300) var(--ease-out);\n --animate-slide-in-down: slideInDown var(--duration-300) var(--ease-out);\n --animate-slide-in-left: slideInLeft var(--duration-300) var(--ease-out);\n --animate-slide-in-right: slideInRight var(--duration-300) var(--ease-out);\n --animate-scale-in: scaleIn var(--duration-200) var(--ease-out);\n --animate-scale-out: scaleOut var(--duration-200) var(--ease-in);\n --animate-bounce: bounce var(--duration-500) var(--ease-bounce);\n --animate-pulse: pulse var(--duration-1000) var(--ease-in-out) infinite;\n --animate-spin: spin var(--duration-1000) var(--ease-linear) infinite;\n --breakpoint-sm: 640px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 1024px;\n --breakpoint-xl: 1280px;\n --breakpoint-2xl: 1536px;\n --container-sm: 640px;\n --container-md: 768px;\n --container-lg: 1024px;\n --container-xl: 1280px;\n --container-2xl: 1536px;\n --z-0: 0;\n --z-10: 10;\n --z-20: 20;\n --z-30: 30;\n --z-40: 40;\n --z-50: 50;\n --z-auto: auto;\n --z-dropdown: 1000;\n --z-sticky: 1020;\n --z-fixed: 1030;\n --z-modal-backdrop: 1040;\n --z-modal: 1050;\n --z-popover: 1060;\n --z-tooltip: 1070;\n --z-toast: 1080;\n --button-height-sm: 2rem;\n --button-height-md: 2.5rem;\n --button-height-lg: 3rem;\n --button-height-xl: 3.5rem;\n --button-padding-sm: 0.5rem 0.75rem;\n --button-padding-md: 0.625rem 1rem;\n --button-padding-lg: 0.75rem 1.25rem;\n --button-padding-xl: 1rem 1.5rem;\n --button-font-size-sm: var(--text-sm);\n --button-font-size-md: var(--text-base);\n --button-font-size-lg: var(--text-lg);\n --button-font-size-xl: var(--text-xl);\n --input-height-sm: 2rem;\n --input-height-md: 2.5rem;\n --input-height-lg: 3rem;\n --input-height-xl: 3.5rem;\n --input-padding-sm: 0.5rem 0.75rem;\n --input-padding-md: 0.625rem 1rem;\n --input-padding-lg: 0.75rem 1.25rem;\n --input-padding-xl: 1rem 1.5rem;\n --input-border-width: 1px;\n --input-border-radius: var(--radius-md);\n --input-focus-ring-width: 2px;\n --input-focus-ring-offset: 2px;\n --card-padding-sm: 1rem;\n --card-padding-md: 1.5rem;\n --card-padding-lg: 2rem;\n --card-padding-xl: 2.5rem;\n --card-border-radius: var(--radius-lg);\n --card-border-width: 1px;\n --card-shadow: var(--elevation-1);\n --card-hover-shadow: var(--elevation-2);\n}\n.dark {\n --background: 224 71% 4%;\n --foreground: 213 31% 91%;\n --card: 224 71% 4%;\n --card-foreground: 213 31% 91%;\n --popover: 224 71% 4%;\n --popover-foreground: 213 31% 91%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 1.2%;\n --secondary: 222.2 84% 4.9%;\n --secondary-foreground: 210 40% 98%;\n --muted: 223 47% 11%;\n --muted-foreground: 215.4 16.3% 56.9%;\n --accent: 216 34% 17%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 63% 31%;\n --destructive-foreground: 210 40% 98%;\n --border: 216 34% 17%;\n --input: 216 34% 17%;\n --ring: 216 34% 17%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n}\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes slideInUp {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n@keyframes slideInDown {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n@keyframes slideInLeft {\n from {\n transform: translateX(-100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n@keyframes slideInRight {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n@keyframes scaleIn {\n from {\n transform: scale(0.95);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes scaleOut {\n from {\n transform: scale(1);\n opacity: 1;\n }\n to {\n transform: scale(0.95);\n opacity: 0;\n }\n}\n@keyframes bounce {\n 0%, 20%, 53%, 80%, 100% {\n transform: translate3d(0, 0, 0);\n }\n 40%, 43% {\n transform: translate3d(0, -30px, 0);\n }\n 70% {\n transform: translate3d(0, -15px, 0);\n }\n 90% {\n transform: translate3d(0, -4px, 0);\n }\n}\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-fade-in {\n animation: var(--animate-fade-in);\n}\n.animate-fade-out {\n animation: var(--animate-fade-out);\n}\n.animate-slide-in-up {\n animation: var(--animate-slide-in-up);\n}\n.animate-slide-in-down {\n animation: var(--animate-slide-in-down);\n}\n.animate-slide-in-left {\n animation: var(--animate-slide-in-left);\n}\n.animate-slide-in-right {\n animation: var(--animate-slide-in-right);\n}\n.animate-scale-in {\n animation: var(--animate-scale-in);\n}\n.animate-scale-out {\n animation: var(--animate-scale-out);\n}\n.animate-bounce {\n animation: var(--animate-bounce);\n}\n.animate-pulse {\n animation: var(--animate-pulse);\n}\n.animate-spin {\n animation: var(--animate-spin);\n}\n@media (max-width: 639px) {\n .container {\n max-width: 100%;\n }\n}\n@media (min-width: 640px) {\n .container {\n max-width: var(--container-sm);\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: var(--container-md);\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: var(--container-lg);\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: var(--container-xl);\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: var(--container-2xl);\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: .5;\n }\n}\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: translateY(0);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n}\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes slideIn {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n@keyframes scaleIn {\n from {\n transform: scale(0.95);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n.file\\:border-0::file-selector-button {\n border-width: 0px;\n}\n.file\\:bg-transparent::file-selector-button {\n background-color: transparent;\n}\n.file\\:font-medium::file-selector-button {\n font-weight: 500;\n}\n.placeholder\\:text-muted-foreground::-moz-placeholder {\n --tw-text-opacity: 1;\n color: hsl(var(--muted-foreground) / var(--tw-text-opacity, 1));\n}\n.placeholder\\:text-muted-foreground::placeholder {\n --tw-text-opacity: 1;\n color: hsl(var(--muted-foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:-translate-y-0\\.5:hover {\n --tw-translate-y: -0.125rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:scale-105:hover {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:scale-110:hover {\n --tw-scale-x: 1.1;\n --tw-scale-y: 1.1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:border-error\\/80:hover {\n border-color: hsl(var(--error) / 0.8);\n}\n.hover\\:border-gray-300:hover {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.hover\\:border-gray-400:hover {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));\n}\n.hover\\:border-primary\\/20:hover {\n border-color: hsl(var(--primary) / 0.2);\n}\n.hover\\:border-primary\\/50:hover {\n border-color: hsl(var(--primary) / 0.5);\n}\n.hover\\:border-success\\/80:hover {\n border-color: hsl(var(--success) / 0.8);\n}\n.hover\\:border-white\\/30:hover {\n border-color: rgb(255 255 255 / 0.3);\n}\n.hover\\:bg-accent:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-background\\/90:hover {\n background-color: hsl(var(--background) / 0.9);\n}\n.hover\\:bg-black\\/10:hover {\n background-color: rgb(0 0 0 / 0.1);\n}\n.hover\\:bg-card\\/90:hover {\n background-color: hsl(var(--card) / 0.9);\n}\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n.hover\\:bg-error\\/90:hover {\n background-color: hsl(var(--error) / 0.9);\n}\n.hover\\:bg-gray-100:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-100\\/50:hover {\n background-color: rgb(243 244 246 / 0.5);\n}\n.hover\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-50:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-muted:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--muted) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-muted\\/30:hover {\n background-color: hsl(var(--muted) / 0.3);\n}\n.hover\\:bg-muted\\/50:hover {\n background-color: hsl(var(--muted) / 0.5);\n}\n.hover\\:bg-muted\\/80:hover {\n background-color: hsl(var(--muted) / 0.8);\n}\n.hover\\:bg-primary:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-primary\\/20:hover {\n background-color: hsl(var(--primary) / 0.2);\n}\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n.hover\\:bg-purple-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(233 213 255 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-secondary:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--secondary) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-secondary\\/80:hover {\n background-color: hsl(var(--secondary) / 0.8);\n}\n.hover\\:bg-success\\/90:hover {\n background-color: hsl(var(--success) / 0.9);\n}\n.hover\\:bg-warning\\/90:hover {\n background-color: hsl(var(--warning) / 0.9);\n}\n.hover\\:bg-white\\/20:hover {\n background-color: rgb(255 255 255 / 0.2);\n}\n.hover\\:from-blue-700:hover {\n --tw-gradient-from: #1d4ed8 var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.hover\\:from-purple-700:hover {\n --tw-gradient-from: #7e22ce var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(126 34 206 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.hover\\:to-pink-700:hover {\n --tw-gradient-to: #be185d var(--tw-gradient-to-position);\n}\n.hover\\:to-purple-700:hover {\n --tw-gradient-to: #7e22ce var(--tw-gradient-to-position);\n}\n.hover\\:text-accent-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--accent-foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:text-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:text-primary-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:text-white:hover {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n.hover\\:opacity-100:hover {\n opacity: 1;\n}\n.hover\\:opacity-90:hover {\n opacity: 0.9;\n}\n.hover\\:shadow-\\[0_0_20px_rgba\\(var\\(--primary\\)\\,0\\.5\\)\\]:hover {\n --tw-shadow: 0 0 20px rgba(var(--primary),0.5);\n --tw-shadow-colored: 0 0 20px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-lg:hover {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-md:hover {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-xl:hover {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-primary\\/20:hover {\n --tw-shadow-color: hsl(var(--primary) / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.hover\\:shadow-primary\\/60:hover {\n --tw-shadow-color: hsl(var(--primary) / 0.6);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.hover\\:brightness-110:hover {\n --tw-brightness: brightness(1.1);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.hover\\:shadow-md:hover {\n box-shadow: var(--shadow-md);\n}\n.hover\\:shadow-lg:hover {\n box-shadow: var(--shadow-lg);\n}\n.hover\\:shadow-xl:hover {\n box-shadow: var(--shadow-xl);\n}\n.focus\\:bg-accent:focus {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.focus\\:bg-error\\/10:focus {\n background-color: hsl(var(--error) / 0.1);\n}\n.focus\\:bg-gray-100:focus {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.focus\\:bg-success\\/10:focus {\n background-color: hsl(var(--success) / 0.1);\n}\n.focus\\:bg-warning\\/10:focus {\n background-color: hsl(var(--warning) / 0.1);\n}\n.focus\\:text-accent-foreground:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--accent-foreground) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-error:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--error) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-foreground:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-success:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--success) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-warning:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--warning) / var(--tw-text-opacity, 1));\n}\n.focus\\:opacity-100:focus {\n opacity: 1;\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-1:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-\\[var\\(--login-primary\\)\\]:focus {\n --tw-ring-color: var(--login-primary);\n}\n.focus\\:ring-primary\\/30:focus {\n --tw-ring-color: hsl(var(--primary) / 0.3);\n}\n.focus\\:ring-ring:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: hsl(var(--ring) / var(--tw-ring-opacity, 1));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:border-2:focus-visible {\n border-width: 2px;\n}\n.focus-visible\\:border-b-2:focus-visible {\n border-bottom-width: 2px;\n}\n.focus-visible\\:border-error:focus-visible {\n --tw-border-opacity: 1;\n border-color: hsl(var(--error) / var(--tw-border-opacity, 1));\n}\n.focus-visible\\:border-primary:focus-visible {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.focus-visible\\:border-success:focus-visible {\n --tw-border-opacity: 1;\n border-color: hsl(var(--success) / var(--tw-border-opacity, 1));\n}\n.focus-visible\\:bg-transparent:focus-visible {\n background-color: transparent;\n}\n.focus-visible\\:shadow-lg:focus-visible {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.focus-visible\\:shadow-primary\\/30:focus-visible {\n --tw-shadow-color: hsl(var(--primary) / 0.3);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus-visible\\:ring-0:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-1:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-error\\/30:focus-visible {\n --tw-ring-color: hsl(var(--error) / 0.3);\n}\n.focus-visible\\:ring-error\\/50:focus-visible {\n --tw-ring-color: hsl(var(--error) / 0.5);\n}\n.focus-visible\\:ring-gray-400\\/30:focus-visible {\n --tw-ring-color: rgb(156 163 175 / 0.3);\n}\n.focus-visible\\:ring-primary\\/30:focus-visible {\n --tw-ring-color: hsl(var(--primary) / 0.3);\n}\n.focus-visible\\:ring-primary\\/50:focus-visible {\n --tw-ring-color: hsl(var(--primary) / 0.5);\n}\n.focus-visible\\:ring-purple-400\\/30:focus-visible {\n --tw-ring-color: rgb(192 132 252 / 0.3);\n}\n.focus-visible\\:ring-purple-500\\/50:focus-visible {\n --tw-ring-color: rgb(168 85 247 / 0.5);\n}\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-opacity: 1;\n --tw-ring-color: hsl(var(--ring) / var(--tw-ring-opacity, 1));\n}\n.focus-visible\\:ring-success\\/30:focus-visible {\n --tw-ring-color: hsl(var(--success) / 0.3);\n}\n.focus-visible\\:ring-success\\/50:focus-visible {\n --tw-ring-color: hsl(var(--success) / 0.5);\n}\n.focus-visible\\:ring-warning\\/30:focus-visible {\n --tw-ring-color: hsl(var(--warning) / 0.3);\n}\n.focus-visible\\:ring-white\\/50:focus-visible {\n --tw-ring-color: rgb(255 255 255 / 0.5);\n}\n.focus-visible\\:ring-offset-1:focus-visible {\n --tw-ring-offset-width: 1px;\n}\n.focus-visible\\:ring-offset-2:focus-visible {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:ring-offset-background:focus-visible {\n --tw-ring-offset-color: hsl(var(--background) / 1);\n}\n.focus-visible\\:shadow-lg:focus-visible {\n box-shadow: var(--shadow-lg);\n}\n.active\\:translate-y-0:active {\n --tw-translate-y: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.active\\:translate-y-0\\.5:active {\n --tw-translate-y: 0.125rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.active\\:scale-95:active {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.active\\:cursor-grabbing:active {\n cursor: grabbing;\n}\n.active\\:bg-error\\/80:active {\n background-color: hsl(var(--error) / 0.8);\n}\n.active\\:bg-gray-100:active {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.active\\:bg-gray-200:active {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.active\\:bg-gray-300:active {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.active\\:bg-primary\\/30:active {\n background-color: hsl(var(--primary) / 0.3);\n}\n.active\\:bg-success\\/80:active {\n background-color: hsl(var(--success) / 0.8);\n}\n.active\\:bg-white\\/30:active {\n background-color: rgb(255 255 255 / 0.3);\n}\n.active\\:from-blue-800:active {\n --tw-gradient-from: #1e40af var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(30 64 175 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.active\\:to-purple-800:active {\n --tw-gradient-to: #6b21a8 var(--tw-gradient-to-position);\n}\n.active\\:shadow-\\[0_0_10px_rgba\\(var\\(--primary\\)\\,0\\.3\\)\\]:active {\n --tw-shadow: 0 0 10px rgba(var(--primary),0.3);\n --tw-shadow-colored: 0 0 10px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.active\\:shadow-md:active {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.active\\:shadow-sm:active {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.active\\:shadow-primary\\/40:active {\n --tw-shadow-color: hsl(var(--primary) / 0.4);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.active\\:brightness-90:active {\n --tw-brightness: brightness(.9);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.active\\:brightness-95:active {\n --tw-brightness: brightness(.95);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.active\\:shadow-sm:active {\n box-shadow: var(--shadow-sm);\n}\n.active\\:shadow-md:active {\n box-shadow: var(--shadow-md);\n}\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n.disabled\\:cursor-not-allowed:disabled {\n cursor: not-allowed;\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n.group:hover .group-hover\\:flex {\n display: flex;\n}\n.group:hover .group-hover\\:opacity-100 {\n opacity: 1;\n}\n.group.destructive .group-\\[\\.destructive\\]\\:border-muted\\/40 {\n border-color: hsl(var(--muted) / 0.4);\n}\n.group.destructive .group-\\[\\.destructive\\]\\:text-red-300 {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:border-destructive\\/30:hover {\n border-color: hsl(var(--destructive) / 0.3);\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:bg-destructive:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--destructive) / var(--tw-bg-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:text-destructive-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--destructive-foreground) / var(--tw-text-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:text-red-50:hover {\n --tw-text-opacity: 1;\n color: rgb(254 242 242 / var(--tw-text-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:focus\\:ring-destructive:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: hsl(var(--destructive) / var(--tw-ring-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:focus\\:ring-red-400:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:focus\\:ring-offset-red-600:focus {\n --tw-ring-offset-color: #dc2626;\n}\n.peer:disabled ~ .peer-disabled\\:cursor-not-allowed {\n cursor: not-allowed;\n}\n.peer:disabled ~ .peer-disabled\\:opacity-70 {\n opacity: 0.7;\n}\n.data-\\[disabled\\]\\:pointer-events-none[data-disabled] {\n pointer-events: none;\n}\n.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom] {\n --tw-translate-y: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left] {\n --tw-translate-x: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=right\\]\\:translate-x-1[data-side=right] {\n --tw-translate-x: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top] {\n --tw-translate-y: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-4[data-state=checked] {\n --tw-translate-x: 1rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-5[data-state=checked] {\n --tw-translate-x: 1.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-7[data-state=checked] {\n --tw-translate-x: 1.75rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[swipe\\=cancel\\]\\:translate-x-0[data-swipe=cancel] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[swipe\\=end\\]\\:translate-x-\\[var\\(--radix-toast-swipe-end-x\\)\\][data-swipe=end] {\n --tw-translate-x: var(--radix-toast-swipe-end-x);\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[swipe\\=move\\]\\:translate-x-\\[var\\(--radix-toast-swipe-move-x\\)\\][data-swipe=move] {\n --tw-translate-x: var(--radix-toast-swipe-move-x);\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n}\n.data-\\[state\\=checked\\]\\:animate-bounce[data-state=checked] {\n animation: bounce 1s infinite;\n}\n.data-\\[state\\=active\\]\\:border-primary[data-state=active] {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:border-primary[data-state=checked] {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:bg-background[data-state=active] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--background) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:bg-primary[data-state=active] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:bg-transparent[data-state=active] {\n background-color: transparent;\n}\n.data-\\[state\\=checked\\]\\:bg-accent[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-error[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--error) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-primary[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-success[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--success) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-warning[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--warning) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=open\\]\\:bg-accent[data-state=open] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=unchecked\\]\\:bg-input[data-state=unchecked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--input) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:text-foreground[data-state=active] {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:text-primary-foreground[data-state=active] {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked] {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:underline[data-state=active] {\n text-decoration-line: underline;\n}\n.data-\\[state\\=active\\]\\:underline-offset-4[data-state=active] {\n text-underline-offset: 4px;\n}\n.data-\\[disabled\\]\\:opacity-50[data-disabled] {\n opacity: 0.5;\n}\n.data-\\[state\\=inactive\\]\\:opacity-60[data-state=inactive] {\n opacity: 0.6;\n}\n.data-\\[state\\=active\\]\\:shadow-md[data-state=active] {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=active] {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.data-\\[swipe\\=move\\]\\:transition-none[data-swipe=move] {\n transition-property: none;\n}\n.data-\\[state\\=open\\]\\:duration-150[data-state=open] {\n transition-duration: 150ms;\n}\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=active] {\n box-shadow: var(--shadow-sm);\n}\n.data-\\[state\\=active\\]\\:shadow-md[data-state=active] {\n box-shadow: var(--shadow-md);\n}\n.data-\\[state\\=checked\\]\\:animate-bounce[data-state=checked] {\n animation: bounce 1s infinite;\n}\n.data-\\[swipe\\=move\\]\\:transition-none[data-swipe=move] {\n transition: none;\n}\n.group[data-state=open] .group-data-\\[state\\=open\\]\\:rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.dark\\:border-blue-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(30 64 175 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-error\\/20:is(.dark *) {\n border-color: hsl(var(--error) / 0.2);\n}\n.dark\\:border-error\\/30:is(.dark *) {\n border-color: hsl(var(--error) / 0.3);\n}\n.dark\\:border-gray-600:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-gray-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-gray-700\\/20:is(.dark *) {\n border-color: rgb(55 65 81 / 0.2);\n}\n.dark\\:border-gray-700\\/30:is(.dark *) {\n border-color: rgb(55 65 81 / 0.3);\n}\n.dark\\:border-gray-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(31 41 55 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-green-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(22 101 52 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-orange-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(154 52 18 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-primary\\/30:is(.dark *) {\n border-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:border-success\\/20:is(.dark *) {\n border-color: hsl(var(--success) / 0.2);\n}\n.dark\\:bg-blue-900\\/20:is(.dark *) {\n background-color: rgb(30 58 138 / 0.2);\n}\n.dark\\:bg-error\\/90:is(.dark *) {\n background-color: hsl(var(--error) / 0.9);\n}\n.dark\\:bg-gray-700:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-800:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-800\\/10:is(.dark *) {\n background-color: rgb(31 41 55 / 0.1);\n}\n.dark\\:bg-gray-800\\/50:is(.dark *) {\n background-color: rgb(31 41 55 / 0.5);\n}\n.dark\\:bg-gray-800\\/80:is(.dark *) {\n background-color: rgb(31 41 55 / 0.8);\n}\n.dark\\:bg-gray-800\\/90:is(.dark *) {\n background-color: rgb(31 41 55 / 0.9);\n}\n.dark\\:bg-gray-900:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-900\\/50:is(.dark *) {\n background-color: rgb(17 24 39 / 0.5);\n}\n.dark\\:bg-gray-900\\/60:is(.dark *) {\n background-color: rgb(17 24 39 / 0.6);\n}\n.dark\\:bg-gray-950:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-green-900\\/20:is(.dark *) {\n background-color: rgb(20 83 45 / 0.2);\n}\n.dark\\:bg-orange-900\\/20:is(.dark *) {\n background-color: rgb(124 45 18 / 0.2);\n}\n.dark\\:bg-primary:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-primary\\/20:is(.dark *) {\n background-color: hsl(var(--primary) / 0.2);\n}\n.dark\\:bg-primary\\/90:is(.dark *) {\n background-color: hsl(var(--primary) / 0.9);\n}\n.dark\\:bg-purple-900:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(88 28 135 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-purple-900\\/30:is(.dark *) {\n background-color: rgb(88 28 135 / 0.3);\n}\n.dark\\:bg-success\\/90:is(.dark *) {\n background-color: hsl(var(--success) / 0.9);\n}\n.dark\\:bg-transparent:is(.dark *) {\n background-color: transparent;\n}\n.dark\\:bg-warning\\/90:is(.dark *) {\n background-color: hsl(var(--warning) / 0.9);\n}\n.dark\\:from-primary\\/10:is(.dark *) {\n --tw-gradient-from: hsl(var(--primary) / 0.1) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.dark\\:to-primary\\/20:is(.dark *) {\n --tw-gradient-to: hsl(var(--primary) / 0.2) var(--tw-gradient-to-position);\n}\n.dark\\:text-blue-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(219 234 254 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-blue-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(96 165 250 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-200:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(209 213 219 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-900:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-green-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(220 252 231 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-green-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(74 222 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-orange-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 237 213 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-primary-foreground:is(.dark *) {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.dark\\:text-purple-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(192 132 252 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-red-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-white:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-yellow-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(250 204 21 / var(--tw-text-opacity, 1));\n}\n.dark\\:shadow-inner:is(.dark *) {\n --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-lg:is(.dark *) {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-md:is(.dark *) {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-sm:is(.dark *) {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-error\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--error) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-gray-900\\/20:is(.dark *) {\n --tw-shadow-color: rgb(17 24 39 / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-gray-900\\/30:is(.dark *) {\n --tw-shadow-color: rgb(17 24 39 / 0.3);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-gray-950\\/10:is(.dark *) {\n --tw-shadow-color: rgb(3 7 18 / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-primary\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--primary) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-primary\\/20:is(.dark *) {\n --tw-shadow-color: hsl(var(--primary) / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-purple-500\\/10:is(.dark *) {\n --tw-shadow-color: rgb(168 85 247 / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-success\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--success) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-warning\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--warning) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:ring-gray-600:is(.dark *) {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity, 1));\n}\n.dark\\:ring-offset-gray-950:is(.dark *) {\n --tw-ring-offset-color: #030712;\n}\n.dark\\:backdrop-blur-sm:is(.dark *) {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.dark\\:shadow-sm:is(.dark *) {\n box-shadow: var(--shadow-sm);\n}\n.dark\\:shadow-md:is(.dark *) {\n box-shadow: var(--shadow-md);\n}\n.dark\\:shadow-lg:is(.dark *) {\n box-shadow: var(--shadow-lg);\n}\n.dark\\:placeholder\\:text-gray-500:is(.dark *)::-moz-placeholder {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:placeholder\\:text-gray-500:is(.dark *)::placeholder {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:hover\\:border-error\\/80:hover:is(.dark *) {\n border-color: hsl(var(--error) / 0.8);\n}\n.dark\\:hover\\:border-gray-500:hover:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(107 114 128 / var(--tw-border-opacity, 1));\n}\n.dark\\:hover\\:border-gray-600:hover:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n}\n.dark\\:hover\\:border-gray-700\\/30:hover:is(.dark *) {\n border-color: rgb(55 65 81 / 0.3);\n}\n.dark\\:hover\\:border-primary\\/30:hover:is(.dark *) {\n border-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:hover\\:border-success\\/80:hover:is(.dark *) {\n border-color: hsl(var(--success) / 0.8);\n}\n.dark\\:hover\\:bg-error\\/80:hover:is(.dark *) {\n background-color: hsl(var(--error) / 0.8);\n}\n.dark\\:hover\\:bg-gray-700:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:bg-gray-700\\/50:hover:is(.dark *) {\n background-color: rgb(55 65 81 / 0.5);\n}\n.dark\\:hover\\:bg-gray-700\\/90:hover:is(.dark *) {\n background-color: rgb(55 65 81 / 0.9);\n}\n.dark\\:hover\\:bg-gray-800:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:bg-gray-800\\/20:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.2);\n}\n.dark\\:hover\\:bg-gray-800\\/30:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.3);\n}\n.dark\\:hover\\:bg-gray-800\\/80:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.8);\n}\n.dark\\:hover\\:bg-gray-800\\/90:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.9);\n}\n.dark\\:hover\\:bg-primary\\/30:hover:is(.dark *) {\n background-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:hover\\:bg-primary\\/90:hover:is(.dark *) {\n background-color: hsl(var(--primary) / 0.9);\n}\n.dark\\:hover\\:bg-purple-800:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(107 33 168 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:bg-success\\/80:hover:is(.dark *) {\n background-color: hsl(var(--success) / 0.8);\n}\n.dark\\:hover\\:bg-warning\\/80:hover:is(.dark *) {\n background-color: hsl(var(--warning) / 0.8);\n}\n.dark\\:hover\\:bg-white\\/10:hover:is(.dark *) {\n background-color: rgb(255 255 255 / 0.1);\n}\n.dark\\:hover\\:text-blue-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\n}\n.dark\\:hover\\:text-white:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:bg-gray-700:focus:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:focus\\:bg-gray-800:focus:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:focus\\:bg-green-900\\/20:focus:is(.dark *) {\n background-color: rgb(20 83 45 / 0.2);\n}\n.dark\\:focus\\:bg-red-900\\/20:focus:is(.dark *) {\n background-color: rgb(127 29 29 / 0.2);\n}\n.dark\\:focus\\:bg-yellow-900\\/20:focus:is(.dark *) {\n background-color: rgb(113 63 18 / 0.2);\n}\n.dark\\:focus\\:text-gray-100:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-gray-200:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-green-300:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(134 239 172 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-red-300:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-yellow-300:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(253 224 71 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus-visible\\:border-primary:focus-visible:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.dark\\:focus-visible\\:border-primary\\/80:focus-visible:is(.dark *) {\n border-color: hsl(var(--primary) / 0.8);\n}\n.dark\\:focus-visible\\:ring-error\\/25:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--error) / 0.25);\n}\n.dark\\:focus-visible\\:ring-error\\/30:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--error) / 0.3);\n}\n.dark\\:focus-visible\\:ring-gray-500\\/40:focus-visible:is(.dark *) {\n --tw-ring-color: rgb(107 114 128 / 0.4);\n}\n.dark\\:focus-visible\\:ring-primary\\/20:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.2);\n}\n.dark\\:focus-visible\\:ring-primary\\/30:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:focus-visible\\:ring-primary\\/40:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.4);\n}\n.dark\\:focus-visible\\:ring-primary\\/50:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.5);\n}\n.dark\\:focus-visible\\:ring-purple-500\\/40:focus-visible:is(.dark *) {\n --tw-ring-color: rgb(168 85 247 / 0.4);\n}\n.dark\\:focus-visible\\:ring-success\\/25:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--success) / 0.25);\n}\n.dark\\:focus-visible\\:ring-success\\/30:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--success) / 0.3);\n}\n.dark\\:focus-visible\\:ring-warning\\/25:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--warning) / 0.25);\n}\n.dark\\:focus-visible\\:ring-offset-gray-950:focus-visible:is(.dark *) {\n --tw-ring-offset-color: #030712;\n}\n.dark\\:active\\:bg-error\\/70:active:is(.dark *) {\n background-color: hsl(var(--error) / 0.7);\n}\n.dark\\:active\\:bg-gray-600\\/90:active:is(.dark *) {\n background-color: rgb(75 85 99 / 0.9);\n}\n.dark\\:active\\:bg-gray-700\\/90:active:is(.dark *) {\n background-color: rgb(55 65 81 / 0.9);\n}\n.dark\\:active\\:bg-gray-800\\/90:active:is(.dark *) {\n background-color: rgb(31 41 55 / 0.9);\n}\n.dark\\:active\\:bg-primary\\/40:active:is(.dark *) {\n background-color: hsl(var(--primary) / 0.4);\n}\n.dark\\:active\\:bg-primary\\/80:active:is(.dark *) {\n background-color: hsl(var(--primary) / 0.8);\n}\n.dark\\:active\\:bg-success\\/70:active:is(.dark *) {\n background-color: hsl(var(--success) / 0.7);\n}\n.dark\\:active\\:text-blue-500:active:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(59 130 246 / var(--tw-text-opacity, 1));\n}\n.peer:disabled ~ .dark\\:peer-disabled\\:opacity-60:is(.dark *) {\n opacity: 0.6;\n}\n.dark\\:data-\\[state\\=active\\]\\:border-primary\\/80[data-state=active]:is(.dark *) {\n border-color: hsl(var(--primary) / 0.8);\n}\n.dark\\:data-\\[state\\=active\\]\\:bg-gray-900[data-state=active]:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:bg-primary\\/90[data-state=active]:is(.dark *) {\n background-color: hsl(var(--primary) / 0.9);\n}\n.dark\\:data-\\[state\\=unchecked\\]\\:bg-gray-700\\/70[data-state=unchecked]:is(.dark *) {\n background-color: rgb(55 65 81 / 0.7);\n}\n.dark\\:data-\\[state\\=active\\]\\:text-gray-100[data-state=active]:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:text-gray-200[data-state=active]:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:text-white[data-state=active]:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:shadow-gray-950\\/10[data-state=active]:is(.dark *) {\n --tw-shadow-color: rgb(3 7 18 / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:data-\\[state\\=active\\]\\:shadow-gray-950\\/20[data-state=active]:is(.dark *) {\n --tw-shadow-color: rgb(3 7 18 / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n@media (min-width: 640px) {\n .sm\\:bottom-0 {\n bottom: 0px;\n }\n .sm\\:right-0 {\n right: 0px;\n }\n .sm\\:top-auto {\n top: auto;\n }\n .sm\\:max-w-\\[425px\\] {\n max-width: 425px;\n }\n .sm\\:max-w-\\[500px\\] {\n max-width: 500px;\n }\n .sm\\:flex-row {\n flex-direction: row;\n }\n .sm\\:flex-col {\n flex-direction: column;\n }\n .sm\\:justify-end {\n justify-content: flex-end;\n }\n .sm\\:space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n }\n .sm\\:text-left {\n text-align: left;\n }\n}\n@media (min-width: 768px) {\n .md\\:max-w-\\[420px\\] {\n max-width: 420px;\n }\n .md\\:grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n@media (min-width: 1024px) {\n .lg\\:flex {\n display: flex;\n }\n .lg\\:grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n .lg\\:space-x-8 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(2rem * var(--tw-space-x-reverse));\n margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse)));\n }\n}\n.\\[\\&\\+div\\]\\:text-xs + div {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.\\[\\&\\>span\\]\\:line-clamp-1 > span {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n}\n.\\[\\&_blockquote\\]\\:border-l-4 blockquote {\n border-left-width: 4px;\n}\n.\\[\\&_blockquote\\]\\:border-gray-300 blockquote {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.\\[\\&_blockquote\\]\\:pl-4 blockquote {\n padding-left: 1rem;\n}\n.\\[\\&_blockquote\\]\\:italic blockquote {\n font-style: italic;\n}\n.\\[\\&_h1\\]\\:mb-4 h1 {\n margin-bottom: 1rem;\n}\n.\\[\\&_h1\\]\\:text-3xl h1 {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.\\[\\&_h1\\]\\:font-bold h1 {\n font-weight: 700;\n}\n.\\[\\&_h2\\]\\:mb-3 h2 {\n margin-bottom: 0.75rem;\n}\n.\\[\\&_h2\\]\\:text-2xl h2 {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.\\[\\&_h2\\]\\:font-bold h2 {\n font-weight: 700;\n}\n.\\[\\&_h3\\]\\:mb-2 h3 {\n margin-bottom: 0.5rem;\n}\n.\\[\\&_h3\\]\\:text-xl h3 {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.\\[\\&_h3\\]\\:font-bold h3 {\n font-weight: 700;\n}\n.\\[\\&_h4\\]\\:mb-2 h4 {\n margin-bottom: 0.5rem;\n}\n.\\[\\&_h4\\]\\:text-lg h4 {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.\\[\\&_h4\\]\\:font-bold h4 {\n font-weight: 700;\n}\n.\\[\\&_h5\\]\\:mb-1 h5 {\n margin-bottom: 0.25rem;\n}\n.\\[\\&_h5\\]\\:text-base h5 {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.\\[\\&_h5\\]\\:font-bold h5 {\n font-weight: 700;\n}\n.\\[\\&_h6\\]\\:mb-1 h6 {\n margin-bottom: 0.25rem;\n}\n.\\[\\&_h6\\]\\:text-sm h6 {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.\\[\\&_h6\\]\\:font-bold h6 {\n font-weight: 700;\n}\n.\\[\\&_li\\]\\:mb-1 li {\n margin-bottom: 0.25rem;\n}\n.\\[\\&_ol\\]\\:mb-4 ol {\n margin-bottom: 1rem;\n}\n.\\[\\&_ol\\]\\:list-decimal ol {\n list-style-type: decimal;\n}\n.\\[\\&_ol\\]\\:pl-6 ol {\n padding-left: 1.5rem;\n}\n.\\[\\&_pre\\]\\:overflow-x-auto pre {\n overflow-x: auto;\n}\n.\\[\\&_pre\\]\\:rounded pre {\n border-radius: 0.25rem;\n}\n.\\[\\&_pre\\]\\:bg-gray-100 pre {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.\\[\\&_pre\\]\\:p-4 pre {\n padding: 1rem;\n}\n.\\[\\&_pre\\]\\:dark\\:bg-gray-800:is(.dark *) pre {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.\\[\\&_table\\]\\:mb-4 table {\n margin-bottom: 1rem;\n}\n.\\[\\&_table\\]\\:w-full table {\n width: 100%;\n}\n.\\[\\&_table_td\\]\\:border table td {\n border-width: 1px;\n}\n.\\[\\&_table_td\\]\\:border-gray-300 table td {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.\\[\\&_table_td\\]\\:p-2 table td {\n padding: 0.5rem;\n}\n.\\[\\&_table_th\\]\\:border table th {\n border-width: 1px;\n}\n.\\[\\&_table_th\\]\\:border-gray-300 table th {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.\\[\\&_table_th\\]\\:bg-gray-50 table th {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.\\[\\&_table_th\\]\\:p-2 table th {\n padding: 0.5rem;\n}\n.\\[\\&_table_th\\]\\:font-semibold table th {\n font-weight: 600;\n}\n.\\[\\&_ul\\]\\:mb-4 ul {\n margin-bottom: 1rem;\n}\n.\\[\\&_ul\\]\\:list-disc ul {\n list-style-type: disc;\n}\n.\\[\\&_ul\\]\\:pl-6 ul {\n padding-left: 1.5rem;\n}\n');
|
|
1736
|
+
styleInject('*,\n::before,\n::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n*,\n::before,\n::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: #e5e7eb;\n}\n::before,\n::after {\n --tw-content: "";\n}\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n -o-tab-size: 4;\n tab-size: 4;\n font-family: var(--font-sans);\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent;\n}\nbody {\n margin: 0;\n line-height: inherit;\n}\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n}\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\na {\n color: inherit;\n text-decoration: inherit;\n}\nb,\nstrong {\n font-weight: bolder;\n}\ncode,\nkbd,\nsamp,\npre {\n font-family: var(--font-mono);\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n padding: 0;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\ninput:where([type="button"]),\ninput:where([type="reset"]),\ninput:where([type="submit"]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none;\n}\n:-moz-focusring {\n outline: auto;\n}\n:-moz-ui-invalid {\n box-shadow: none;\n}\nprogress {\n vertical-align: baseline;\n}\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\nsummary {\n display: list-item;\n}\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\nfieldset {\n margin: 0;\n padding: 0;\n}\nlegend {\n padding: 0;\n}\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\ndialog {\n padding: 0;\n}\ntextarea {\n resize: vertical;\n}\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\nbutton,\n[role=button] {\n cursor: pointer;\n}\n:disabled {\n cursor: default;\n}\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle;\n}\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n[hidden]:where(:not([hidden="until-found"])) {\n display: none;\n}\n:root {\n --bg-base: var(--background);\n --bg-subtle: var(--gray-50);\n --bg-muted: var(--gray-100);\n --bg-emphasis: var(--gray-200);\n --bg-inverse: var(--foreground);\n --surface-base: var(--background);\n --surface-overlay: var(--gray-50);\n --surface-raised: var(--background);\n --surface-sunken: var(--gray-100);\n --text-primary: var(--foreground);\n --text-secondary: var(--gray-600);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-400);\n --text-inverse: var(--background);\n --text-link: var(--primary);\n --text-link-hover: var(--primary-hover);\n --brand-primary: var(--primary);\n --brand-primary-hover: var(--primary-hover);\n --brand-primary-active: var(--primary-active);\n --brand-secondary: var(--secondary);\n --state-hover: var(--gray-100);\n --state-active: var(--gray-200);\n --state-selected: var(--primary);\n --state-disabled: var(--gray-300);\n --state-focus: var(--primary);\n --feedback-success: var(--success);\n --feedback-success-light: 142 71% 95%;\n --feedback-success-dark: 142 71% 35%;\n --feedback-warning: var(--warning);\n --feedback-warning-light: 38 92% 95%;\n --feedback-warning-dark: 38 92% 40%;\n --feedback-error: var(--error);\n --feedback-error-light: 0 84% 95%;\n --feedback-error-dark: 0 84% 50%;\n --feedback-info: 217 91% 60%;\n --feedback-info-light: 217 91% 95%;\n --feedback-info-dark: 217 91% 50%;\n --border-default: var(--border);\n --border-subtle: var(--gray-200);\n --border-strong: var(--gray-400);\n --border-interactive: var(--primary);\n --border-error: var(--error);\n --border-success: var(--success);\n --border-warning: var(--warning);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --shadow-primary: 0 4px 14px 0 hsl(var(--primary) / 0.3);\n --shadow-success: 0 4px 14px 0 hsl(var(--success) / 0.3);\n --shadow-error: 0 4px 14px 0 hsl(var(--error) / 0.3);\n --shadow-warning: 0 4px 14px 0 hsl(var(--warning) / 0.3);\n --shadow-inner-xs: inset 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-inner-sm: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --shadow-inner-md: inset 0 4px 6px -1px rgb(0 0 0 / 0.1);\n --ease-linear: linear;\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --ease-back-in: cubic-bezier(0.6, -0.28, 0.735, 0.045);\n --ease-back-out: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n --ease-back-in-out: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --duration-instant: 0ms;\n --duration-fast: 150ms;\n --duration-normal: 250ms;\n --duration-slow: 350ms;\n --duration-slower: 500ms;\n --duration-slowest: 750ms;\n --space-0: 0;\n --space-px: 1px;\n --space-0\\.5: 0.125rem;\n --space-1: 0.25rem;\n --space-1\\.5: 0.375rem;\n --space-2: 0.5rem;\n --space-2\\.5: 0.625rem;\n --space-3: 0.75rem;\n --space-3\\.5: 0.875rem;\n --space-4: 1rem;\n --space-5: 1.25rem;\n --space-6: 1.5rem;\n --space-7: 1.75rem;\n --space-8: 2rem;\n --space-9: 2.25rem;\n --space-10: 2.5rem;\n --space-11: 2.75rem;\n --space-12: 3rem;\n --space-14: 3.5rem;\n --space-16: 4rem;\n --space-20: 5rem;\n --space-24: 6rem;\n --space-28: 7rem;\n --space-32: 8rem;\n --space-36: 9rem;\n --space-40: 10rem;\n --space-44: 11rem;\n --space-48: 12rem;\n --space-52: 13rem;\n --space-56: 14rem;\n --space-60: 15rem;\n --space-64: 16rem;\n --space-72: 18rem;\n --space-80: 20rem;\n --space-96: 24rem;\n --text-2xs: 0.625rem;\n --text-xs: 0.75rem;\n --text-sm: 0.875rem;\n --text-base: 1rem;\n --text-lg: 1.125rem;\n --text-xl: 1.25rem;\n --text-2xl: 1.5rem;\n --text-3xl: 1.875rem;\n --text-4xl: 2.25rem;\n --text-5xl: 3rem;\n --text-6xl: 3.75rem;\n --text-7xl: 4.5rem;\n --text-8xl: 6rem;\n --text-9xl: 8rem;\n --leading-none: 1;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --font-thin: 100;\n --font-extralight: 200;\n --font-light: 300;\n --font-normal: 400;\n --font-medium: 500;\n --font-semibold: 600;\n --font-bold: 700;\n --font-extrabold: 800;\n --font-black: 900;\n --radius-none: 0;\n --radius-sm: 0.125rem;\n --radius-base: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-full: 9999px;\n --z-0: 0;\n --z-10: 10;\n --z-20: 20;\n --z-30: 30;\n --z-40: 40;\n --z-50: 50;\n --z-dropdown: 1000;\n --z-sticky: 1020;\n --z-fixed: 1030;\n --z-modal-backdrop: 1040;\n --z-modal: 1050;\n --z-popover: 1060;\n --z-tooltip: 1070;\n --z-notification: 1080;\n --blur-none: 0;\n --blur-sm: 4px;\n --blur-base: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-2xl: 40px;\n --blur-3xl: 64px;\n}\n.dark {\n --bg-base: var(--background);\n --bg-subtle: var(--gray-800);\n --bg-muted: var(--gray-700);\n --bg-emphasis: var(--gray-600);\n --surface-overlay: var(--gray-800);\n --surface-raised: var(--gray-800);\n --surface-sunken: var(--background);\n --text-secondary: var(--gray-400);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-600);\n --state-hover: var(--gray-700);\n --state-active: var(--gray-600);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.3);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.3);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n}\n.container {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 1rem;\n padding-left: 1rem;\n}\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n padding-right: 2rem;\n padding-left: 2rem;\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n padding-right: 4rem;\n padding-left: 4rem;\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n padding-right: 5rem;\n padding-left: 5rem;\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n padding-right: 6rem;\n padding-left: 6rem;\n }\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.pointer-events-auto {\n pointer-events: auto;\n}\n.visible {\n visibility: visible;\n}\n.collapse {\n visibility: collapse;\n}\n.static {\n position: static;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.sticky {\n position: sticky;\n}\n.inset-0 {\n inset: 0px;\n}\n.bottom-2 {\n bottom: 0.5rem;\n}\n.bottom-4 {\n bottom: 1rem;\n}\n.bottom-\\[5\\%\\] {\n bottom: 5%;\n}\n.left-2 {\n left: 0.5rem;\n}\n.left-3 {\n left: 0.75rem;\n}\n.left-4 {\n left: 1rem;\n}\n.left-\\[50\\%\\] {\n left: 50%;\n}\n.right-1 {\n right: 0.25rem;\n}\n.right-2 {\n right: 0.5rem;\n}\n.right-3 {\n right: 0.75rem;\n}\n.right-4 {\n right: 1rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-1 {\n top: 0.25rem;\n}\n.top-1\\/2 {\n top: 50%;\n}\n.top-2 {\n top: 0.5rem;\n}\n.top-2\\.5 {\n top: 0.625rem;\n}\n.top-4 {\n top: 1rem;\n}\n.top-\\[5\\%\\] {\n top: 5%;\n}\n.top-\\[50\\%\\] {\n top: 50%;\n}\n.top-auto {\n top: auto;\n}\n.z-0 {\n z-index: 0;\n}\n.z-10 {\n z-index: 10;\n}\n.z-40 {\n z-index: 40;\n}\n.z-50 {\n z-index: 50;\n}\n.z-\\[-1\\] {\n z-index: -1;\n}\n.z-\\[100\\] {\n z-index: 100;\n}\n.col-span-1 {\n grid-column: span 1 / span 1;\n}\n.col-span-2 {\n grid-column: span 2 / span 2;\n}\n.col-span-3 {\n grid-column: span 3 / span 3;\n}\n.col-span-4 {\n grid-column: span 4 / span 4;\n}\n.-m-2 {\n margin: -0.5rem;\n}\n.-mx-1 {\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n}\n.-mx-4 {\n margin-left: -1rem;\n margin-right: -1rem;\n}\n.mx-1 {\n margin-left: 0.25rem;\n margin-right: 0.25rem;\n}\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.my-2 {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.-mb-4 {\n margin-bottom: -1rem;\n}\n.-mr-1 {\n margin-right: -0.25rem;\n}\n.-mt-4 {\n margin-top: -1rem;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mb-2 {\n margin-bottom: 0.5rem;\n}\n.mb-3 {\n margin-bottom: 0.75rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.mb-8 {\n margin-bottom: 2rem;\n}\n.ml-1 {\n margin-left: 0.25rem;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-1 {\n margin-right: 0.25rem;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mr-auto {\n margin-right: auto;\n}\n.mt-1 {\n margin-top: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-3 {\n margin-top: 0.75rem;\n}\n.mt-4 {\n margin-top: 1rem;\n}\n.mt-6 {\n margin-top: 1.5rem;\n}\n.line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.block {\n display: block;\n}\n.inline-block {\n display: inline-block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.\\!table {\n display: table !important;\n}\n.table {\n display: table;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.aspect-square {\n aspect-ratio: 1 / 1;\n}\n.h-0 {\n height: 0px;\n}\n.h-1 {\n height: 0.25rem;\n}\n.h-1\\.5 {\n height: 0.375rem;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-12 {\n height: 3rem;\n}\n.h-14 {\n height: 3.5rem;\n}\n.h-16 {\n height: 4rem;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-20 {\n height: 5rem;\n}\n.h-24 {\n height: 6rem;\n}\n.h-3 {\n height: 0.75rem;\n}\n.h-3\\.5 {\n height: 0.875rem;\n}\n.h-32 {\n height: 8rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-48 {\n height: 12rem;\n}\n.h-5 {\n height: 1.25rem;\n}\n.h-6 {\n height: 1.5rem;\n}\n.h-7 {\n height: 1.75rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-96 {\n height: 24rem;\n}\n.h-\\[0\\.5px\\] {\n height: 0.5px;\n}\n.h-\\[1px\\] {\n height: 1px;\n}\n.h-\\[2px\\] {\n height: 2px;\n}\n.h-\\[65\\%\\] {\n height: 65%;\n}\n.h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n}\n.h-auto {\n height: auto;\n}\n.h-fit {\n height: -moz-fit-content;\n height: fit-content;\n}\n.h-full {\n height: 100%;\n}\n.h-px {\n height: 1px;\n}\n.max-h-32 {\n max-height: 8rem;\n}\n.max-h-96 {\n max-height: 24rem;\n}\n.max-h-\\[95vh\\] {\n max-height: 95vh;\n}\n.max-h-full {\n max-height: 100%;\n}\n.max-h-screen {\n max-height: 100vh;\n}\n.min-h-32 {\n min-height: 8rem;\n}\n.min-h-\\[200px\\] {\n min-height: 200px;\n}\n.min-h-\\[80px\\] {\n min-height: 80px;\n}\n.w-0 {\n width: 0px;\n}\n.w-0\\.5 {\n width: 0.125rem;\n}\n.w-1 {\n width: 0.25rem;\n}\n.w-1\\/4 {\n width: 25%;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-11 {\n width: 2.75rem;\n}\n.w-12 {\n width: 3rem;\n}\n.w-14 {\n width: 3.5rem;\n}\n.w-16 {\n width: 4rem;\n}\n.w-2 {\n width: 0.5rem;\n}\n.w-2\\/3 {\n width: 66.666667%;\n}\n.w-20 {\n width: 5rem;\n}\n.w-3 {\n width: 0.75rem;\n}\n.w-3\\.5 {\n width: 0.875rem;\n}\n.w-3\\/4 {\n width: 75%;\n}\n.w-4 {\n width: 1rem;\n}\n.w-48 {\n width: 12rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-56 {\n width: 14rem;\n}\n.w-6 {\n width: 1.5rem;\n}\n.w-64 {\n width: 16rem;\n}\n.w-72 {\n width: 18rem;\n}\n.w-8 {\n width: 2rem;\n}\n.w-80 {\n width: 20rem;\n}\n.w-96 {\n width: 24rem;\n}\n.w-\\[0\\.5px\\] {\n width: 0.5px;\n}\n.w-\\[100px\\] {\n width: 100px;\n}\n.w-\\[1px\\] {\n width: 1px;\n}\n.w-\\[2px\\] {\n width: 2px;\n}\n.w-\\[65\\%\\] {\n width: 65%;\n}\n.w-\\[70px\\] {\n width: 70px;\n}\n.w-auto {\n width: auto;\n}\n.w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.w-full {\n width: 100%;\n}\n.w-px {\n width: 1px;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-32 {\n min-width: 8rem;\n}\n.min-w-\\[4px\\] {\n min-width: 4px;\n}\n.min-w-\\[70px\\] {\n min-width: 70px;\n}\n.min-w-\\[8rem\\] {\n min-width: 8rem;\n}\n.min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n}\n.max-w-2xl {\n max-width: 42rem;\n}\n.max-w-4xl {\n max-width: 56rem;\n}\n.max-w-6xl {\n max-width: 72rem;\n}\n.max-w-\\[95vw\\] {\n max-width: 95vw;\n}\n.max-w-full {\n max-width: 100%;\n}\n.max-w-lg {\n max-width: 32rem;\n}\n.max-w-md {\n max-width: 28rem;\n}\n.max-w-none {\n max-width: none;\n}\n.max-w-sm {\n max-width: 24rem;\n}\n.max-w-xs {\n max-width: 20rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.grow {\n flex-grow: 1;\n}\n.-translate-x-2 {\n --tw-translate-x: -0.5rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-translate-y-0 {\n --tw-translate-y: -0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-translate-y-2 {\n --tw-translate-y: -0.5rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-y-0 {\n --tw-translate-y: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-2 {\n --tw-rotate: 2deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[-15deg\\] {\n --tw-rotate: -15deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[15deg\\] {\n --tw-rotate: 15deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-105 {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.scale-95 {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-crosshair {\n cursor: crosshair;\n}\n.cursor-default {\n cursor: default;\n}\n.cursor-grab {\n cursor: grab;\n}\n.cursor-grabbing {\n cursor: grabbing;\n}\n.cursor-help {\n cursor: help;\n}\n.cursor-move {\n cursor: move;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.cursor-text {\n cursor: text;\n}\n.cursor-wait {\n cursor: wait;\n}\n.touch-none {\n touch-action: none;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.resize-none {\n resize: none;\n}\n.resize {\n resize: both;\n}\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n.grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n}\n.grid-cols-6 {\n grid-template-columns: repeat(6, minmax(0, 1fr));\n}\n.grid-cols-7 {\n grid-template-columns: repeat(7, minmax(0, 1fr));\n}\n.grid-cols-8 {\n grid-template-columns: repeat(8, minmax(0, 1fr));\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-col-reverse {\n flex-direction: column-reverse;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-end {\n align-items: flex-end;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-1\\.5 {\n gap: 0.375rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.gap-6 {\n gap: 1.5rem;\n}\n.gap-8 {\n gap: 2rem;\n}\n.space-x-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.25rem * var(--tw-space-x-reverse));\n margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-x-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1.5rem * var(--tw-space-x-reverse));\n margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-0 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0px * var(--tw-space-y-reverse));\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-3 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.space-y-6 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));\n}\n.overflow-auto {\n overflow: auto;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-x-auto {\n overflow-x: auto;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-2xl {\n border-radius: 1rem;\n}\n.rounded-3xl {\n border-radius: 1.5rem;\n}\n.rounded-\\[inherit\\] {\n border-radius: inherit;\n}\n.rounded-\\[var\\(--login-border-radius\\)\\] {\n border-radius: var(--login-border-radius);\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: var(--radius);\n}\n.rounded-md {\n border-radius: calc(var(--radius) - 2px);\n}\n.rounded-none {\n border-radius: 0px;\n}\n.rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n}\n.rounded-xl {\n border-radius: 0.75rem;\n}\n.rounded-t {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.border {\n border-width: 1px;\n}\n.border-2 {\n border-width: 2px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-b-2 {\n border-bottom-width: 2px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-l-0 {\n border-left-width: 0px;\n}\n.border-l-2 {\n border-left-width: 2px;\n}\n.border-l-4 {\n border-left-width: 4px;\n}\n.border-l-\\[0\\.5px\\] {\n border-left-width: 0.5px;\n}\n.border-r-0 {\n border-right-width: 0px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-t-0 {\n border-top-width: 0px;\n}\n.border-t-2 {\n border-top-width: 2px;\n}\n.border-t-\\[0\\.5px\\] {\n border-top-width: 0.5px;\n}\n.border-dashed {\n border-style: dashed;\n}\n.border-dotted {\n border-style: dotted;\n}\n.border-none {\n border-style: none;\n}\n.border-accent {\n --tw-border-opacity: 1;\n border-color: hsl(var(--accent) / var(--tw-border-opacity, 1));\n}\n.border-blue-200 {\n --tw-border-opacity: 1;\n border-color: rgb(191 219 254 / var(--tw-border-opacity, 1));\n}\n.border-blue-500 {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));\n}\n.border-blue-600 {\n --tw-border-opacity: 1;\n border-color: rgb(37 99 235 / var(--tw-border-opacity, 1));\n}\n.border-border {\n --tw-border-opacity: 1;\n border-color: hsl(var(--border) / var(--tw-border-opacity, 1));\n}\n.border-border\\/50 {\n border-color: hsl(var(--border) / 0.5);\n}\n.border-destructive {\n --tw-border-opacity: 1;\n border-color: hsl(var(--destructive) / var(--tw-border-opacity, 1));\n}\n.border-error {\n --tw-border-opacity: 1;\n border-color: hsl(var(--error) / var(--tw-border-opacity, 1));\n}\n.border-error\\/20 {\n border-color: hsl(var(--error) / 0.2);\n}\n.border-foreground {\n --tw-border-opacity: 1;\n border-color: hsl(var(--foreground) / var(--tw-border-opacity, 1));\n}\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));\n}\n.border-green-200 {\n --tw-border-opacity: 1;\n border-color: rgb(187 247 208 / var(--tw-border-opacity, 1));\n}\n.border-green-500 {\n --tw-border-opacity: 1;\n border-color: rgb(34 197 94 / var(--tw-border-opacity, 1));\n}\n.border-green-600 {\n --tw-border-opacity: 1;\n border-color: rgb(22 163 74 / var(--tw-border-opacity, 1));\n}\n.border-input {\n --tw-border-opacity: 1;\n border-color: hsl(var(--input) / var(--tw-border-opacity, 1));\n}\n.border-muted {\n --tw-border-opacity: 1;\n border-color: hsl(var(--muted) / var(--tw-border-opacity, 1));\n}\n.border-muted-foreground\\/20 {\n border-color: hsl(var(--muted-foreground) / 0.2);\n}\n.border-muted-foreground\\/25 {\n border-color: hsl(var(--muted-foreground) / 0.25);\n}\n.border-orange-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 215 170 / var(--tw-border-opacity, 1));\n}\n.border-primary {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.border-primary\\/20 {\n border-color: hsl(var(--primary) / 0.2);\n}\n.border-primary\\/50 {\n border-color: hsl(var(--primary) / 0.5);\n}\n.border-red-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));\n}\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));\n}\n.border-secondary {\n --tw-border-opacity: 1;\n border-color: hsl(var(--secondary) / var(--tw-border-opacity, 1));\n}\n.border-success {\n --tw-border-opacity: 1;\n border-color: hsl(var(--success) / var(--tw-border-opacity, 1));\n}\n.border-success\\/40 {\n border-color: hsl(var(--success) / 0.4);\n}\n.border-transparent {\n border-color: transparent;\n}\n.border-warning {\n --tw-border-opacity: 1;\n border-color: hsl(var(--warning) / var(--tw-border-opacity, 1));\n}\n.border-white {\n --tw-border-opacity: 1;\n border-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\n}\n.border-white\\/20 {\n border-color: rgb(255 255 255 / 0.2);\n}\n.border-yellow-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 240 138 / var(--tw-border-opacity, 1));\n}\n.border-yellow-500 {\n --tw-border-opacity: 1;\n border-color: rgb(234 179 8 / var(--tw-border-opacity, 1));\n}\n.border-yellow-600 {\n --tw-border-opacity: 1;\n border-color: rgb(202 138 4 / var(--tw-border-opacity, 1));\n}\n.border-t-primary {\n --tw-border-opacity: 1;\n border-top-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.border-t-transparent {\n border-top-color: transparent;\n}\n.bg-\\[var\\(--login-background\\)\\] {\n background-color: var(--login-background);\n}\n.bg-\\[var\\(--login-primary\\)\\] {\n background-color: var(--login-primary);\n}\n.bg-accent {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.bg-accent\\/20 {\n background-color: hsl(var(--accent) / 0.2);\n}\n.bg-background {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--background) / var(--tw-bg-opacity, 1));\n}\n.bg-background\\/80 {\n background-color: hsl(var(--background) / 0.8);\n}\n.bg-background\\/90 {\n background-color: hsl(var(--background) / 0.9);\n}\n.bg-black\\/0 {\n background-color: rgb(0 0 0 / 0);\n}\n.bg-black\\/20 {\n background-color: rgb(0 0 0 / 0.2);\n}\n.bg-black\\/40 {\n background-color: rgb(0 0 0 / 0.4);\n}\n.bg-black\\/60 {\n background-color: rgb(0 0 0 / 0.6);\n}\n.bg-black\\/80 {\n background-color: rgb(0 0 0 / 0.8);\n}\n.bg-black\\/90 {\n background-color: rgb(0 0 0 / 0.9);\n}\n.bg-blue-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\n}\n.bg-border {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--border) / var(--tw-bg-opacity, 1));\n}\n.bg-card {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--card) / var(--tw-bg-opacity, 1));\n}\n.bg-destructive {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--destructive) / var(--tw-bg-opacity, 1));\n}\n.bg-destructive\\/5 {\n background-color: hsl(var(--destructive) / 0.05);\n}\n.bg-error {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--error) / var(--tw-bg-opacity, 1));\n}\n.bg-error\\/20 {\n background-color: hsl(var(--error) / 0.2);\n}\n.bg-foreground {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--foreground) / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.bg-green-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\n}\n.bg-green-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-green-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.bg-muted {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--muted) / var(--tw-bg-opacity, 1));\n}\n.bg-muted\\/20 {\n background-color: hsl(var(--muted) / 0.2);\n}\n.bg-muted\\/50 {\n background-color: hsl(var(--muted) / 0.5);\n}\n.bg-muted\\/80 {\n background-color: hsl(var(--muted) / 0.8);\n}\n.bg-orange-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 237 213 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1));\n}\n.bg-orange-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 115 22 / var(--tw-bg-opacity, 1));\n}\n.bg-popover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--popover) / var(--tw-bg-opacity, 1));\n}\n.bg-primary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.bg-primary-foreground {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary-foreground) / var(--tw-bg-opacity, 1));\n}\n.bg-primary\\/10 {\n background-color: hsl(var(--primary) / 0.1);\n}\n.bg-primary\\/20 {\n background-color: hsl(var(--primary) / 0.2);\n}\n.bg-primary\\/30 {\n background-color: hsl(var(--primary) / 0.3);\n}\n.bg-primary\\/5 {\n background-color: hsl(var(--primary) / 0.05);\n}\n.bg-purple-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 232 255 / var(--tw-bg-opacity, 1));\n}\n.bg-purple-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(168 85 247 / var(--tw-bg-opacity, 1));\n}\n.bg-red-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\n}\n.bg-red-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\n}\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1));\n}\n.bg-secondary {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--secondary) / var(--tw-bg-opacity, 1));\n}\n.bg-secondary-foreground {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--secondary-foreground) / var(--tw-bg-opacity, 1));\n}\n.bg-secondary\\/20 {\n background-color: hsl(var(--secondary) / 0.2);\n}\n.bg-success {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--success) / var(--tw-bg-opacity, 1));\n}\n.bg-success\\/20 {\n background-color: hsl(var(--success) / 0.2);\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-warning {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--warning) / var(--tw-bg-opacity, 1));\n}\n.bg-warning\\/20 {\n background-color: hsl(var(--warning) / 0.2);\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-white\\/10 {\n background-color: rgb(255 255 255 / 0.1);\n}\n.bg-yellow-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 249 195 / var(--tw-bg-opacity, 1));\n}\n.bg-yellow-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));\n}\n.bg-opacity-80 {\n --tw-bg-opacity: 0.8;\n}\n.bg-gradient-to-br {\n background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));\n}\n.bg-gradient-to-r {\n background-image: linear-gradient(to right, var(--tw-gradient-stops));\n}\n.from-blue-600 {\n --tw-gradient-from: #2563eb var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-primary\\/5 {\n --tw-gradient-from: hsl(var(--primary) / 0.05) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-purple-600 {\n --tw-gradient-from: #9333ea var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(147 51 234 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-white\\/20 {\n --tw-gradient-from: rgb(255 255 255 / 0.2) var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-white\\/5 {\n --tw-gradient-from: rgb(255 255 255 / 0.05) var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.via-border {\n --tw-gradient-to: hsl(var(--border) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from),\n hsl(var(--border) / 1) var(--tw-gradient-via-position),\n var(--tw-gradient-to);\n}\n.via-transparent {\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops:\n var(--tw-gradient-from),\n transparent var(--tw-gradient-via-position),\n var(--tw-gradient-to);\n}\n.to-black\\/5 {\n --tw-gradient-to: rgb(0 0 0 / 0.05) var(--tw-gradient-to-position);\n}\n.to-pink-600 {\n --tw-gradient-to: #db2777 var(--tw-gradient-to-position);\n}\n.to-primary\\/10 {\n --tw-gradient-to: hsl(var(--primary) / 0.1) var(--tw-gradient-to-position);\n}\n.to-purple-600 {\n --tw-gradient-to: #9333ea var(--tw-gradient-to-position);\n}\n.to-transparent {\n --tw-gradient-to: transparent var(--tw-gradient-to-position);\n}\n.to-white\\/0 {\n --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);\n}\n.fill-current {\n fill: currentColor;\n}\n.object-contain {\n -o-object-fit: contain;\n object-fit: contain;\n}\n.object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n.p-0 {\n padding: 0px;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-1\\.5 {\n padding: 0.375rem;\n}\n.p-10 {\n padding: 2.5rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-5 {\n padding: 1.25rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.p-7 {\n padding: 1.75rem;\n}\n.p-8 {\n padding: 2rem;\n}\n.px-0 {\n padding-left: 0px;\n padding-right: 0px;\n}\n.px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.py-0 {\n padding-top: 0px;\n padding-bottom: 0px;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-12 {\n padding-top: 3rem;\n padding-bottom: 3rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n.py-8 {\n padding-top: 2rem;\n padding-bottom: 2rem;\n}\n.pb-2 {\n padding-bottom: 0.5rem;\n}\n.pb-3 {\n padding-bottom: 0.75rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pb-6 {\n padding-bottom: 1.5rem;\n}\n.pb-8 {\n padding-bottom: 2rem;\n}\n.pl-10 {\n padding-left: 2.5rem;\n}\n.pl-2 {\n padding-left: 0.5rem;\n}\n.pl-7 {\n padding-left: 1.75rem;\n}\n.pl-8 {\n padding-left: 2rem;\n}\n.pl-9 {\n padding-left: 2.25rem;\n}\n.pr-10 {\n padding-right: 2.5rem;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pr-3 {\n padding-right: 0.75rem;\n}\n.pr-8 {\n padding-right: 2rem;\n}\n.pt-0 {\n padding-top: 0px;\n}\n.pt-3 {\n padding-top: 0.75rem;\n}\n.pt-4 {\n padding-top: 1rem;\n}\n.pt-5 {\n padding-top: 1.25rem;\n}\n.pt-6 {\n padding-top: 1.5rem;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.text-right {\n text-align: right;\n}\n.align-middle {\n vertical-align: middle;\n}\n.font-mono {\n font-family: var(--font-mono);\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.capitalize {\n text-transform: capitalize;\n}\n.italic {\n font-style: italic;\n}\n.leading-none {\n line-height: 1;\n}\n.leading-normal {\n line-height: 1.5;\n}\n.leading-snug {\n line-height: 1.375;\n}\n.tracking-tight {\n letter-spacing: -0.025em;\n}\n.tracking-widest {\n letter-spacing: 0.1em;\n}\n.text-\\[var\\(--login-primary\\)\\] {\n color: var(--login-primary);\n}\n.text-\\[var\\(--login-text\\)\\] {\n color: var(--login-text);\n}\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgb(59 130 246 / var(--tw-text-opacity, 1));\n}\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity, 1));\n}\n.text-blue-700 {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\n}\n.text-blue-900 {\n --tw-text-opacity: 1;\n color: rgb(30 58 138 / var(--tw-text-opacity, 1));\n}\n.text-card-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--card-foreground) / var(--tw-text-opacity, 1));\n}\n.text-current {\n color: currentColor;\n}\n.text-destructive {\n --tw-text-opacity: 1;\n color: hsl(var(--destructive) / var(--tw-text-opacity, 1));\n}\n.text-destructive-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--destructive-foreground) / var(--tw-text-opacity, 1));\n}\n.text-error {\n --tw-text-opacity: 1;\n color: hsl(var(--error) / var(--tw-text-opacity, 1));\n}\n.text-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.text-foreground\\/50 {\n color: hsl(var(--foreground) / 0.5);\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-green-600 {\n --tw-text-opacity: 1;\n color: rgb(22 163 74 / var(--tw-text-opacity, 1));\n}\n.text-green-700 {\n --tw-text-opacity: 1;\n color: rgb(21 128 61 / var(--tw-text-opacity, 1));\n}\n.text-green-800 {\n --tw-text-opacity: 1;\n color: rgb(22 101 52 / var(--tw-text-opacity, 1));\n}\n.text-green-900 {\n --tw-text-opacity: 1;\n color: rgb(20 83 45 / var(--tw-text-opacity, 1));\n}\n.text-muted-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--muted-foreground) / var(--tw-text-opacity, 1));\n}\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgb(249 115 22 / var(--tw-text-opacity, 1));\n}\n.text-orange-800 {\n --tw-text-opacity: 1;\n color: rgb(154 52 18 / var(--tw-text-opacity, 1));\n}\n.text-orange-900 {\n --tw-text-opacity: 1;\n color: rgb(124 45 18 / var(--tw-text-opacity, 1));\n}\n.text-popover-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--popover-foreground) / var(--tw-text-opacity, 1));\n}\n.text-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--primary) / var(--tw-text-opacity, 1));\n}\n.text-primary-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.text-purple-500 {\n --tw-text-opacity: 1;\n color: rgb(168 85 247 / var(--tw-text-opacity, 1));\n}\n.text-purple-600 {\n --tw-text-opacity: 1;\n color: rgb(147 51 234 / var(--tw-text-opacity, 1));\n}\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-red-700 {\n --tw-text-opacity: 1;\n color: rgb(185 28 28 / var(--tw-text-opacity, 1));\n}\n.text-red-800 {\n --tw-text-opacity: 1;\n color: rgb(153 27 27 / var(--tw-text-opacity, 1));\n}\n.text-secondary-foreground {\n --tw-text-opacity: 1;\n color: hsl(var(--secondary-foreground) / var(--tw-text-opacity, 1));\n}\n.text-success {\n --tw-text-opacity: 1;\n color: hsl(var(--success) / var(--tw-text-opacity, 1));\n}\n.text-warning {\n --tw-text-opacity: 1;\n color: hsl(var(--warning) / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.text-white\\/80 {\n color: rgb(255 255 255 / 0.8);\n}\n.text-yellow-500 {\n --tw-text-opacity: 1;\n color: rgb(234 179 8 / var(--tw-text-opacity, 1));\n}\n.text-yellow-600 {\n --tw-text-opacity: 1;\n color: rgb(202 138 4 / var(--tw-text-opacity, 1));\n}\n.text-yellow-700 {\n --tw-text-opacity: 1;\n color: rgb(161 98 7 / var(--tw-text-opacity, 1));\n}\n.text-yellow-800 {\n --tw-text-opacity: 1;\n color: rgb(133 77 14 / var(--tw-text-opacity, 1));\n}\n.underline {\n text-decoration-line: underline;\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.opacity-30 {\n opacity: 0.3;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-80 {\n opacity: 0.8;\n}\n.opacity-90 {\n opacity: 0.9;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-none {\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.shadow-primary\\/50 {\n --tw-shadow-color: hsl(var(--primary) / 0.5);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.shadow-purple-500\\/25 {\n --tw-shadow-color: rgb(168 85 247 / 0.25);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.outline {\n outline-style: solid;\n}\n.ring {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ring-0 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ring-gray-300 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1));\n}\n.ring-offset-2 {\n --tw-ring-offset-width: 2px;\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background) / 1);\n}\n.blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.blur-md {\n --tw-blur: blur(12px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.blur-xl {\n --tw-blur: blur(24px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.backdrop-blur-md {\n --tw-backdrop-blur: blur(12px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n -webkit-backdrop-filter;\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter,\n -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-100 {\n transition-duration: 100ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n.shadow-sm {\n box-shadow: var(--shadow-sm);\n}\n.shadow-md {\n box-shadow: var(--shadow-md);\n}\n.shadow-lg {\n box-shadow: var(--shadow-lg);\n}\n.shadow-xl {\n box-shadow: var(--shadow-xl);\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n.transition-all {\n transition-property: all;\n}\n.transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n}\n.transition-opacity {\n transition-property: opacity;\n}\n.transition-shadow {\n transition-property: box-shadow;\n}\n.transition-transform {\n transition-property: transform;\n}\n.ease-out {\n transition-timing-function: var(--ease-out);\n}\n:root {\n --primary-50: 240 249 255;\n --primary-100: 224 242 254;\n --primary-200: 186 230 253;\n --primary-300: 125 211 252;\n --primary-400: 56 189 248;\n --primary-500: 14 165 233;\n --primary-600: 2 132 199;\n --primary-700: 3 105 161;\n --primary-800: 7 89 133;\n --primary-900: 12 74 110;\n --primary-950: 8 47 73;\n --secondary-50: 248 250 252;\n --secondary-100: 241 245 249;\n --secondary-200: 226 232 240;\n --secondary-300: 203 213 225;\n --secondary-400: 148 163 184;\n --secondary-500: 100 116 139;\n --secondary-600: 71 85 105;\n --secondary-700: 51 65 85;\n --secondary-800: 30 41 59;\n --secondary-900: 15 23 42;\n --secondary-950: 2 6 23;\n --success-50: 240 253 244;\n --success-100: 220 252 231;\n --success-200: 187 247 208;\n --success-300: 134 239 172;\n --success-400: 74 222 128;\n --success-500: 34 197 94;\n --success-600: 22 163 74;\n --success-700: 21 128 61;\n --success-800: 22 101 52;\n --success-900: 20 83 45;\n --success-950: 5 46 22;\n --warning-50: 254 252 232;\n --warning-100: 254 249 195;\n --warning-200: 254 240 138;\n --warning-300: 253 224 71;\n --warning-400: 250 204 21;\n --warning-500: 234 179 8;\n --warning-600: 202 138 4;\n --warning-700: 161 98 7;\n --warning-800: 133 77 14;\n --warning-900: 113 63 18;\n --warning-950: 66 32 6;\n --error-50: 254 242 242;\n --error-100: 254 226 226;\n --error-200: 254 202 202;\n --error-300: 252 165 165;\n --error-400: 248 113 113;\n --error-500: 239 68 68;\n --error-600: 220 38 38;\n --error-700: 185 28 28;\n --error-800: 153 27 27;\n --error-900: 127 29 29;\n --error-950: 69 10 10;\n --background: 0 0% 100%;\n --foreground: 222.2 47.4% 11.2%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 47.4% 11.2%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 47.4% 11.2%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 100% 50%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 215 20.2% 65.1%;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n --font-sans:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n "Helvetica Neue",\n Arial,\n sans-serif;\n --font-serif:\n "Crimson Text",\n Georgia,\n "Times New Roman",\n serif;\n --font-mono:\n "JetBrains Mono",\n "Fira Code",\n "Consolas",\n monospace;\n --text-xs: 0.75rem;\n --text-sm: 0.875rem;\n --text-base: 1rem;\n --text-lg: 1.125rem;\n --text-xl: 1.25rem;\n --text-2xl: 1.5rem;\n --text-3xl: 1.875rem;\n --text-4xl: 2.25rem;\n --text-5xl: 3rem;\n --text-6xl: 3.75rem;\n --text-7xl: 4.5rem;\n --text-8xl: 6rem;\n --text-9xl: 8rem;\n --leading-none: 1;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n --font-thin: 100;\n --font-extralight: 200;\n --font-light: 300;\n --font-normal: 400;\n --font-medium: 500;\n --font-semibold: 600;\n --font-bold: 700;\n --font-extrabold: 800;\n --font-black: 900;\n --spacing-0: 0;\n --spacing-px: 1px;\n --spacing-0-5: 0.125rem;\n --spacing-1: 0.25rem;\n --spacing-1-5: 0.375rem;\n --spacing-2: 0.5rem;\n --spacing-2-5: 0.625rem;\n --spacing-3: 0.75rem;\n --spacing-3-5: 0.875rem;\n --spacing-4: 1rem;\n --spacing-5: 1.25rem;\n --spacing-6: 1.5rem;\n --spacing-7: 1.75rem;\n --spacing-8: 2rem;\n --spacing-9: 2.25rem;\n --spacing-10: 2.5rem;\n --spacing-11: 2.75rem;\n --spacing-12: 3rem;\n --spacing-14: 3.5rem;\n --spacing-16: 4rem;\n --spacing-20: 5rem;\n --spacing-24: 6rem;\n --spacing-28: 7rem;\n --spacing-32: 8rem;\n --spacing-36: 9rem;\n --spacing-40: 10rem;\n --spacing-44: 11rem;\n --spacing-48: 12rem;\n --spacing-52: 13rem;\n --spacing-56: 14rem;\n --spacing-60: 15rem;\n --spacing-64: 16rem;\n --spacing-72: 18rem;\n --spacing-80: 20rem;\n --spacing-96: 24rem;\n --radius-none: 0;\n --radius-sm: 0.125rem;\n --radius-base: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-full: 9999px;\n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06);\n --shadow-none: 0 0 #0000;\n --elevation-0: var(--shadow-none);\n --elevation-1: var(--shadow-sm);\n --elevation-2: var(--shadow-base);\n --elevation-3: var(--shadow-md);\n --elevation-4: var(--shadow-lg);\n --elevation-5: var(--shadow-xl);\n --elevation-6: var(--shadow-2xl);\n --duration-75: 75ms;\n --duration-100: 100ms;\n --duration-150: 150ms;\n --duration-200: 200ms;\n --duration-300: 300ms;\n --duration-500: 500ms;\n --duration-700: 700ms;\n --duration-1000: 1000ms;\n --ease-linear: linear;\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n --animate-fade-in: fadeIn var(--duration-300) var(--ease-out);\n --animate-fade-out: fadeOut var(--duration-300) var(--ease-in);\n --animate-slide-in-up: slideInUp var(--duration-300) var(--ease-out);\n --animate-slide-in-down: slideInDown var(--duration-300) var(--ease-out);\n --animate-slide-in-left: slideInLeft var(--duration-300) var(--ease-out);\n --animate-slide-in-right: slideInRight var(--duration-300) var(--ease-out);\n --animate-scale-in: scaleIn var(--duration-200) var(--ease-out);\n --animate-scale-out: scaleOut var(--duration-200) var(--ease-in);\n --animate-bounce: bounce var(--duration-500) var(--ease-bounce);\n --animate-pulse: pulse var(--duration-1000) var(--ease-in-out) infinite;\n --animate-spin: spin var(--duration-1000) var(--ease-linear) infinite;\n --breakpoint-sm: 640px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 1024px;\n --breakpoint-xl: 1280px;\n --breakpoint-2xl: 1536px;\n --container-sm: 640px;\n --container-md: 768px;\n --container-lg: 1024px;\n --container-xl: 1280px;\n --container-2xl: 1536px;\n --z-0: 0;\n --z-10: 10;\n --z-20: 20;\n --z-30: 30;\n --z-40: 40;\n --z-50: 50;\n --z-auto: auto;\n --z-dropdown: 1000;\n --z-sticky: 1020;\n --z-fixed: 1030;\n --z-modal-backdrop: 1040;\n --z-modal: 1050;\n --z-popover: 1060;\n --z-tooltip: 1070;\n --z-toast: 1080;\n --button-height-sm: 2rem;\n --button-height-md: 2.5rem;\n --button-height-lg: 3rem;\n --button-height-xl: 3.5rem;\n --button-padding-sm: 0.5rem 0.75rem;\n --button-padding-md: 0.625rem 1rem;\n --button-padding-lg: 0.75rem 1.25rem;\n --button-padding-xl: 1rem 1.5rem;\n --button-font-size-sm: var(--text-sm);\n --button-font-size-md: var(--text-base);\n --button-font-size-lg: var(--text-lg);\n --button-font-size-xl: var(--text-xl);\n --input-height-sm: 2rem;\n --input-height-md: 2.5rem;\n --input-height-lg: 3rem;\n --input-height-xl: 3.5rem;\n --input-padding-sm: 0.5rem 0.75rem;\n --input-padding-md: 0.625rem 1rem;\n --input-padding-lg: 0.75rem 1.25rem;\n --input-padding-xl: 1rem 1.5rem;\n --input-border-width: 1px;\n --input-border-radius: var(--radius-md);\n --input-focus-ring-width: 2px;\n --input-focus-ring-offset: 2px;\n --card-padding-sm: 1rem;\n --card-padding-md: 1.5rem;\n --card-padding-lg: 2rem;\n --card-padding-xl: 2.5rem;\n --card-border-radius: var(--radius-lg);\n --card-border-width: 1px;\n --card-shadow: var(--elevation-1);\n --card-hover-shadow: var(--elevation-2);\n}\n.dark {\n --background: 224 71% 4%;\n --foreground: 213 31% 91%;\n --card: 224 71% 4%;\n --card-foreground: 213 31% 91%;\n --popover: 224 71% 4%;\n --popover-foreground: 213 31% 91%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 1.2%;\n --secondary: 222.2 84% 4.9%;\n --secondary-foreground: 210 40% 98%;\n --muted: 223 47% 11%;\n --muted-foreground: 215.4 16.3% 56.9%;\n --accent: 216 34% 17%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 63% 31%;\n --destructive-foreground: 210 40% 98%;\n --border: 216 34% 17%;\n --input: 216 34% 17%;\n --ring: 216 34% 17%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n}\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes slideInUp {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n@keyframes slideInDown {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n@keyframes slideInLeft {\n from {\n transform: translateX(-100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n@keyframes slideInRight {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n@keyframes scaleIn {\n from {\n transform: scale(0.95);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes scaleOut {\n from {\n transform: scale(1);\n opacity: 1;\n }\n to {\n transform: scale(0.95);\n opacity: 0;\n }\n}\n@keyframes bounce {\n 0%, 20%, 53%, 80%, 100% {\n transform: translate3d(0, 0, 0);\n }\n 40%, 43% {\n transform: translate3d(0, -30px, 0);\n }\n 70% {\n transform: translate3d(0, -15px, 0);\n }\n 90% {\n transform: translate3d(0, -4px, 0);\n }\n}\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.animate-fade-in {\n animation: var(--animate-fade-in);\n}\n.animate-fade-out {\n animation: var(--animate-fade-out);\n}\n.animate-slide-in-up {\n animation: var(--animate-slide-in-up);\n}\n.animate-slide-in-down {\n animation: var(--animate-slide-in-down);\n}\n.animate-slide-in-left {\n animation: var(--animate-slide-in-left);\n}\n.animate-slide-in-right {\n animation: var(--animate-slide-in-right);\n}\n.animate-scale-in {\n animation: var(--animate-scale-in);\n}\n.animate-scale-out {\n animation: var(--animate-scale-out);\n}\n.animate-bounce {\n animation: var(--animate-bounce);\n}\n.animate-pulse {\n animation: var(--animate-pulse);\n}\n.animate-spin {\n animation: var(--animate-spin);\n}\n@media (max-width: 639px) {\n .container {\n max-width: 100%;\n }\n}\n@media (min-width: 640px) {\n .container {\n max-width: var(--container-sm);\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: var(--container-md);\n }\n}\n@media (min-width: 1024px) {\n .container {\n max-width: var(--container-lg);\n }\n}\n@media (min-width: 1280px) {\n .container {\n max-width: var(--container-xl);\n }\n}\n@media (min-width: 1536px) {\n .container {\n max-width: var(--container-2xl);\n }\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: .5;\n }\n}\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: translateY(0);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n}\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes slideIn {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n@keyframes scaleIn {\n from {\n transform: scale(0.95);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n.file\\:border-0::file-selector-button {\n border-width: 0px;\n}\n.file\\:bg-transparent::file-selector-button {\n background-color: transparent;\n}\n.file\\:font-medium::file-selector-button {\n font-weight: 500;\n}\n.placeholder\\:text-muted-foreground::-moz-placeholder {\n --tw-text-opacity: 1;\n color: hsl(var(--muted-foreground) / var(--tw-text-opacity, 1));\n}\n.placeholder\\:text-muted-foreground::placeholder {\n --tw-text-opacity: 1;\n color: hsl(var(--muted-foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:-translate-y-0\\.5:hover {\n --tw-translate-y: -0.125rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:scale-105:hover {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:scale-110:hover {\n --tw-scale-x: 1.1;\n --tw-scale-y: 1.1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:border-error\\/80:hover {\n border-color: hsl(var(--error) / 0.8);\n}\n.hover\\:border-gray-300:hover {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.hover\\:border-gray-400:hover {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));\n}\n.hover\\:border-muted-foreground\\/40:hover {\n border-color: hsl(var(--muted-foreground) / 0.4);\n}\n.hover\\:border-primary\\/20:hover {\n border-color: hsl(var(--primary) / 0.2);\n}\n.hover\\:border-primary\\/50:hover {\n border-color: hsl(var(--primary) / 0.5);\n}\n.hover\\:border-success\\/80:hover {\n border-color: hsl(var(--success) / 0.8);\n}\n.hover\\:border-white\\/30:hover {\n border-color: rgb(255 255 255 / 0.3);\n}\n.hover\\:bg-accent:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-background\\/90:hover {\n background-color: hsl(var(--background) / 0.9);\n}\n.hover\\:bg-black\\/10:hover {\n background-color: rgb(0 0 0 / 0.1);\n}\n.hover\\:bg-card\\/90:hover {\n background-color: hsl(var(--card) / 0.9);\n}\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n.hover\\:bg-error\\/90:hover {\n background-color: hsl(var(--error) / 0.9);\n}\n.hover\\:bg-gray-100:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-100\\/50:hover {\n background-color: rgb(243 244 246 / 0.5);\n}\n.hover\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-50:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-muted:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--muted) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-muted\\/30:hover {\n background-color: hsl(var(--muted) / 0.3);\n}\n.hover\\:bg-muted\\/50:hover {\n background-color: hsl(var(--muted) / 0.5);\n}\n.hover\\:bg-muted\\/80:hover {\n background-color: hsl(var(--muted) / 0.8);\n}\n.hover\\:bg-primary:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-primary\\/20:hover {\n background-color: hsl(var(--primary) / 0.2);\n}\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n.hover\\:bg-purple-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(233 213 255 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-secondary:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--secondary) / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-secondary\\/80:hover {\n background-color: hsl(var(--secondary) / 0.8);\n}\n.hover\\:bg-success\\/90:hover {\n background-color: hsl(var(--success) / 0.9);\n}\n.hover\\:bg-warning\\/90:hover {\n background-color: hsl(var(--warning) / 0.9);\n}\n.hover\\:bg-white\\/20:hover {\n background-color: rgb(255 255 255 / 0.2);\n}\n.hover\\:from-blue-700:hover {\n --tw-gradient-from: #1d4ed8 var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.hover\\:from-purple-700:hover {\n --tw-gradient-from: #7e22ce var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(126 34 206 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.hover\\:to-pink-700:hover {\n --tw-gradient-to: #be185d var(--tw-gradient-to-position);\n}\n.hover\\:to-purple-700:hover {\n --tw-gradient-to: #7e22ce var(--tw-gradient-to-position);\n}\n.hover\\:text-accent-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--accent-foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:text-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:text-primary-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.hover\\:text-white:hover {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n.hover\\:opacity-100:hover {\n opacity: 1;\n}\n.hover\\:opacity-90:hover {\n opacity: 0.9;\n}\n.hover\\:shadow-\\[0_0_20px_rgba\\(var\\(--primary\\)\\,0\\.5\\)\\]:hover {\n --tw-shadow: 0 0 20px rgba(var(--primary),0.5);\n --tw-shadow-colored: 0 0 20px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-lg:hover {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-md:hover {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-xl:hover {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:shadow-primary\\/20:hover {\n --tw-shadow-color: hsl(var(--primary) / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.hover\\:shadow-primary\\/60:hover {\n --tw-shadow-color: hsl(var(--primary) / 0.6);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.hover\\:brightness-110:hover {\n --tw-brightness: brightness(1.1);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.hover\\:shadow-md:hover {\n box-shadow: var(--shadow-md);\n}\n.hover\\:shadow-lg:hover {\n box-shadow: var(--shadow-lg);\n}\n.hover\\:shadow-xl:hover {\n box-shadow: var(--shadow-xl);\n}\n.focus\\:bg-accent:focus {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.focus\\:bg-error\\/10:focus {\n background-color: hsl(var(--error) / 0.1);\n}\n.focus\\:bg-gray-100:focus {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.focus\\:bg-success\\/10:focus {\n background-color: hsl(var(--success) / 0.1);\n}\n.focus\\:bg-warning\\/10:focus {\n background-color: hsl(var(--warning) / 0.1);\n}\n.focus\\:text-accent-foreground:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--accent-foreground) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-error:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--error) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-foreground:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-success:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--success) / var(--tw-text-opacity, 1));\n}\n.focus\\:text-warning:focus {\n --tw-text-opacity: 1;\n color: hsl(var(--warning) / var(--tw-text-opacity, 1));\n}\n.focus\\:opacity-100:focus {\n opacity: 1;\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-1:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-\\[var\\(--login-primary\\)\\]:focus {\n --tw-ring-color: var(--login-primary);\n}\n.focus\\:ring-primary\\/30:focus {\n --tw-ring-color: hsl(var(--primary) / 0.3);\n}\n.focus\\:ring-ring:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: hsl(var(--ring) / var(--tw-ring-opacity, 1));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:border-2:focus-visible {\n border-width: 2px;\n}\n.focus-visible\\:border-b-2:focus-visible {\n border-bottom-width: 2px;\n}\n.focus-visible\\:border-error:focus-visible {\n --tw-border-opacity: 1;\n border-color: hsl(var(--error) / var(--tw-border-opacity, 1));\n}\n.focus-visible\\:border-primary:focus-visible {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.focus-visible\\:border-success:focus-visible {\n --tw-border-opacity: 1;\n border-color: hsl(var(--success) / var(--tw-border-opacity, 1));\n}\n.focus-visible\\:bg-transparent:focus-visible {\n background-color: transparent;\n}\n.focus-visible\\:shadow-lg:focus-visible {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.focus-visible\\:shadow-primary\\/30:focus-visible {\n --tw-shadow-color: hsl(var(--primary) / 0.3);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus-visible\\:ring-0:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-1:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-error\\/30:focus-visible {\n --tw-ring-color: hsl(var(--error) / 0.3);\n}\n.focus-visible\\:ring-error\\/50:focus-visible {\n --tw-ring-color: hsl(var(--error) / 0.5);\n}\n.focus-visible\\:ring-gray-400\\/30:focus-visible {\n --tw-ring-color: rgb(156 163 175 / 0.3);\n}\n.focus-visible\\:ring-primary\\/30:focus-visible {\n --tw-ring-color: hsl(var(--primary) / 0.3);\n}\n.focus-visible\\:ring-primary\\/50:focus-visible {\n --tw-ring-color: hsl(var(--primary) / 0.5);\n}\n.focus-visible\\:ring-purple-400\\/30:focus-visible {\n --tw-ring-color: rgb(192 132 252 / 0.3);\n}\n.focus-visible\\:ring-purple-500\\/50:focus-visible {\n --tw-ring-color: rgb(168 85 247 / 0.5);\n}\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-opacity: 1;\n --tw-ring-color: hsl(var(--ring) / var(--tw-ring-opacity, 1));\n}\n.focus-visible\\:ring-success\\/30:focus-visible {\n --tw-ring-color: hsl(var(--success) / 0.3);\n}\n.focus-visible\\:ring-success\\/50:focus-visible {\n --tw-ring-color: hsl(var(--success) / 0.5);\n}\n.focus-visible\\:ring-warning\\/30:focus-visible {\n --tw-ring-color: hsl(var(--warning) / 0.3);\n}\n.focus-visible\\:ring-white\\/50:focus-visible {\n --tw-ring-color: rgb(255 255 255 / 0.5);\n}\n.focus-visible\\:ring-offset-1:focus-visible {\n --tw-ring-offset-width: 1px;\n}\n.focus-visible\\:ring-offset-2:focus-visible {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:ring-offset-background:focus-visible {\n --tw-ring-offset-color: hsl(var(--background) / 1);\n}\n.focus-visible\\:shadow-lg:focus-visible {\n box-shadow: var(--shadow-lg);\n}\n.active\\:translate-y-0:active {\n --tw-translate-y: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.active\\:translate-y-0\\.5:active {\n --tw-translate-y: 0.125rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.active\\:scale-95:active {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.active\\:cursor-grabbing:active {\n cursor: grabbing;\n}\n.active\\:bg-error\\/80:active {\n background-color: hsl(var(--error) / 0.8);\n}\n.active\\:bg-gray-100:active {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.active\\:bg-gray-200:active {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.active\\:bg-gray-300:active {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.active\\:bg-primary\\/30:active {\n background-color: hsl(var(--primary) / 0.3);\n}\n.active\\:bg-success\\/80:active {\n background-color: hsl(var(--success) / 0.8);\n}\n.active\\:bg-white\\/30:active {\n background-color: rgb(255 255 255 / 0.3);\n}\n.active\\:from-blue-800:active {\n --tw-gradient-from: #1e40af var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(30 64 175 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.active\\:to-purple-800:active {\n --tw-gradient-to: #6b21a8 var(--tw-gradient-to-position);\n}\n.active\\:shadow-\\[0_0_10px_rgba\\(var\\(--primary\\)\\,0\\.3\\)\\]:active {\n --tw-shadow: 0 0 10px rgba(var(--primary),0.3);\n --tw-shadow-colored: 0 0 10px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.active\\:shadow-md:active {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.active\\:shadow-sm:active {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.active\\:shadow-primary\\/40:active {\n --tw-shadow-color: hsl(var(--primary) / 0.4);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.active\\:brightness-90:active {\n --tw-brightness: brightness(.9);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.active\\:brightness-95:active {\n --tw-brightness: brightness(.95);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.active\\:shadow-sm:active {\n box-shadow: var(--shadow-sm);\n}\n.active\\:shadow-md:active {\n box-shadow: var(--shadow-md);\n}\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n.disabled\\:cursor-not-allowed:disabled {\n cursor: not-allowed;\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n.group:hover .group-hover\\:flex {\n display: flex;\n}\n.group:hover .group-hover\\:bg-black\\/20 {\n background-color: rgb(0 0 0 / 0.2);\n}\n.group:hover .group-hover\\:text-primary {\n --tw-text-opacity: 1;\n color: hsl(var(--primary) / var(--tw-text-opacity, 1));\n}\n.group:hover .group-hover\\:opacity-100 {\n opacity: 1;\n}\n.group.destructive .group-\\[\\.destructive\\]\\:border-muted\\/40 {\n border-color: hsl(var(--muted) / 0.4);\n}\n.group.destructive .group-\\[\\.destructive\\]\\:text-red-300 {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:border-destructive\\/30:hover {\n border-color: hsl(var(--destructive) / 0.3);\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:bg-destructive:hover {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--destructive) / var(--tw-bg-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:text-destructive-foreground:hover {\n --tw-text-opacity: 1;\n color: hsl(var(--destructive-foreground) / var(--tw-text-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:hover\\:text-red-50:hover {\n --tw-text-opacity: 1;\n color: rgb(254 242 242 / var(--tw-text-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:focus\\:ring-destructive:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: hsl(var(--destructive) / var(--tw-ring-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:focus\\:ring-red-400:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity, 1));\n}\n.group.destructive .group-\\[\\.destructive\\]\\:focus\\:ring-offset-red-600:focus {\n --tw-ring-offset-color: #dc2626;\n}\n.peer:disabled ~ .peer-disabled\\:cursor-not-allowed {\n cursor: not-allowed;\n}\n.peer:disabled ~ .peer-disabled\\:opacity-70 {\n opacity: 0.7;\n}\n.data-\\[disabled\\]\\:pointer-events-none[data-disabled] {\n pointer-events: none;\n}\n.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom] {\n --tw-translate-y: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left] {\n --tw-translate-x: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=right\\]\\:translate-x-1[data-side=right] {\n --tw-translate-x: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top] {\n --tw-translate-y: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-4[data-state=checked] {\n --tw-translate-x: 1rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-5[data-state=checked] {\n --tw-translate-x: 1.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-7[data-state=checked] {\n --tw-translate-x: 1.75rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[swipe\\=cancel\\]\\:translate-x-0[data-swipe=cancel] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[swipe\\=end\\]\\:translate-x-\\[var\\(--radix-toast-swipe-end-x\\)\\][data-swipe=end] {\n --tw-translate-x: var(--radix-toast-swipe-end-x);\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[swipe\\=move\\]\\:translate-x-\\[var\\(--radix-toast-swipe-move-x\\)\\][data-swipe=move] {\n --tw-translate-x: var(--radix-toast-swipe-move-x);\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n}\n.data-\\[state\\=checked\\]\\:animate-bounce[data-state=checked] {\n animation: bounce 1s infinite;\n}\n.data-\\[state\\=active\\]\\:border-primary[data-state=active] {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:border-primary[data-state=checked] {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:bg-background[data-state=active] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--background) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:bg-primary[data-state=active] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:bg-transparent[data-state=active] {\n background-color: transparent;\n}\n.data-\\[state\\=checked\\]\\:bg-accent[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-error[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--error) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-primary[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-success[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--success) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:bg-warning[data-state=checked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--warning) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=open\\]\\:bg-accent[data-state=open] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--accent) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=unchecked\\]\\:bg-input[data-state=unchecked] {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--input) / var(--tw-bg-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:text-foreground[data-state=active] {\n --tw-text-opacity: 1;\n color: hsl(var(--foreground) / var(--tw-text-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:text-primary-foreground[data-state=active] {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked] {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.data-\\[state\\=active\\]\\:underline[data-state=active] {\n text-decoration-line: underline;\n}\n.data-\\[state\\=active\\]\\:underline-offset-4[data-state=active] {\n text-underline-offset: 4px;\n}\n.data-\\[disabled\\]\\:opacity-50[data-disabled] {\n opacity: 0.5;\n}\n.data-\\[state\\=inactive\\]\\:opacity-60[data-state=inactive] {\n opacity: 0.6;\n}\n.data-\\[state\\=active\\]\\:shadow-md[data-state=active] {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=active] {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.data-\\[swipe\\=move\\]\\:transition-none[data-swipe=move] {\n transition-property: none;\n}\n.data-\\[state\\=open\\]\\:duration-150[data-state=open] {\n transition-duration: 150ms;\n}\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=active] {\n box-shadow: var(--shadow-sm);\n}\n.data-\\[state\\=active\\]\\:shadow-md[data-state=active] {\n box-shadow: var(--shadow-md);\n}\n.data-\\[state\\=checked\\]\\:animate-bounce[data-state=checked] {\n animation: bounce 1s infinite;\n}\n.data-\\[swipe\\=move\\]\\:transition-none[data-swipe=move] {\n transition: none;\n}\n.group[data-state=open] .group-data-\\[state\\=open\\]\\:rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.dark\\:border-blue-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(30 64 175 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-error\\/20:is(.dark *) {\n border-color: hsl(var(--error) / 0.2);\n}\n.dark\\:border-error\\/30:is(.dark *) {\n border-color: hsl(var(--error) / 0.3);\n}\n.dark\\:border-gray-600:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-gray-700:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-gray-700\\/20:is(.dark *) {\n border-color: rgb(55 65 81 / 0.2);\n}\n.dark\\:border-gray-700\\/30:is(.dark *) {\n border-color: rgb(55 65 81 / 0.3);\n}\n.dark\\:border-gray-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(31 41 55 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-green-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(22 101 52 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-orange-800:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(154 52 18 / var(--tw-border-opacity, 1));\n}\n.dark\\:border-primary\\/30:is(.dark *) {\n border-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:border-success\\/20:is(.dark *) {\n border-color: hsl(var(--success) / 0.2);\n}\n.dark\\:bg-blue-900\\/20:is(.dark *) {\n background-color: rgb(30 58 138 / 0.2);\n}\n.dark\\:bg-error\\/90:is(.dark *) {\n background-color: hsl(var(--error) / 0.9);\n}\n.dark\\:bg-gray-700:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-800:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-800\\/10:is(.dark *) {\n background-color: rgb(31 41 55 / 0.1);\n}\n.dark\\:bg-gray-800\\/50:is(.dark *) {\n background-color: rgb(31 41 55 / 0.5);\n}\n.dark\\:bg-gray-800\\/80:is(.dark *) {\n background-color: rgb(31 41 55 / 0.8);\n}\n.dark\\:bg-gray-800\\/90:is(.dark *) {\n background-color: rgb(31 41 55 / 0.9);\n}\n.dark\\:bg-gray-900:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-900\\/50:is(.dark *) {\n background-color: rgb(17 24 39 / 0.5);\n}\n.dark\\:bg-gray-900\\/60:is(.dark *) {\n background-color: rgb(17 24 39 / 0.6);\n}\n.dark\\:bg-gray-950:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-green-900\\/20:is(.dark *) {\n background-color: rgb(20 83 45 / 0.2);\n}\n.dark\\:bg-orange-900\\/20:is(.dark *) {\n background-color: rgb(124 45 18 / 0.2);\n}\n.dark\\:bg-primary:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-primary\\/20:is(.dark *) {\n background-color: hsl(var(--primary) / 0.2);\n}\n.dark\\:bg-primary\\/90:is(.dark *) {\n background-color: hsl(var(--primary) / 0.9);\n}\n.dark\\:bg-purple-900:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(88 28 135 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-purple-900\\/30:is(.dark *) {\n background-color: rgb(88 28 135 / 0.3);\n}\n.dark\\:bg-success\\/90:is(.dark *) {\n background-color: hsl(var(--success) / 0.9);\n}\n.dark\\:bg-transparent:is(.dark *) {\n background-color: transparent;\n}\n.dark\\:bg-warning\\/90:is(.dark *) {\n background-color: hsl(var(--warning) / 0.9);\n}\n.dark\\:from-primary\\/10:is(.dark *) {\n --tw-gradient-from: hsl(var(--primary) / 0.1) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.dark\\:to-primary\\/20:is(.dark *) {\n --tw-gradient-to: hsl(var(--primary) / 0.2) var(--tw-gradient-to-position);\n}\n.dark\\:text-blue-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(219 234 254 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-blue-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(96 165 250 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-200:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(209 213 219 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-900:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-green-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(220 252 231 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-green-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(74 222 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-orange-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 237 213 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-primary-foreground:is(.dark *) {\n --tw-text-opacity: 1;\n color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));\n}\n.dark\\:text-purple-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(192 132 252 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-red-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-white:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-yellow-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(250 204 21 / var(--tw-text-opacity, 1));\n}\n.dark\\:shadow-inner:is(.dark *) {\n --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-lg:is(.dark *) {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-md:is(.dark *) {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-sm:is(.dark *) {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.dark\\:shadow-error\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--error) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-gray-900\\/20:is(.dark *) {\n --tw-shadow-color: rgb(17 24 39 / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-gray-900\\/30:is(.dark *) {\n --tw-shadow-color: rgb(17 24 39 / 0.3);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-gray-950\\/10:is(.dark *) {\n --tw-shadow-color: rgb(3 7 18 / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-primary\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--primary) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-primary\\/20:is(.dark *) {\n --tw-shadow-color: hsl(var(--primary) / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-purple-500\\/10:is(.dark *) {\n --tw-shadow-color: rgb(168 85 247 / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-success\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--success) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:shadow-warning\\/10:is(.dark *) {\n --tw-shadow-color: hsl(var(--warning) / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:ring-gray-600:is(.dark *) {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity, 1));\n}\n.dark\\:ring-offset-gray-950:is(.dark *) {\n --tw-ring-offset-color: #030712;\n}\n.dark\\:backdrop-blur-sm:is(.dark *) {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.dark\\:shadow-sm:is(.dark *) {\n box-shadow: var(--shadow-sm);\n}\n.dark\\:shadow-md:is(.dark *) {\n box-shadow: var(--shadow-md);\n}\n.dark\\:shadow-lg:is(.dark *) {\n box-shadow: var(--shadow-lg);\n}\n.dark\\:placeholder\\:text-gray-500:is(.dark *)::-moz-placeholder {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:placeholder\\:text-gray-500:is(.dark *)::placeholder {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:hover\\:border-error\\/80:hover:is(.dark *) {\n border-color: hsl(var(--error) / 0.8);\n}\n.dark\\:hover\\:border-gray-500:hover:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(107 114 128 / var(--tw-border-opacity, 1));\n}\n.dark\\:hover\\:border-gray-600:hover:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n}\n.dark\\:hover\\:border-gray-700\\/30:hover:is(.dark *) {\n border-color: rgb(55 65 81 / 0.3);\n}\n.dark\\:hover\\:border-primary\\/30:hover:is(.dark *) {\n border-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:hover\\:border-success\\/80:hover:is(.dark *) {\n border-color: hsl(var(--success) / 0.8);\n}\n.dark\\:hover\\:bg-error\\/80:hover:is(.dark *) {\n background-color: hsl(var(--error) / 0.8);\n}\n.dark\\:hover\\:bg-gray-700:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:bg-gray-700\\/50:hover:is(.dark *) {\n background-color: rgb(55 65 81 / 0.5);\n}\n.dark\\:hover\\:bg-gray-700\\/90:hover:is(.dark *) {\n background-color: rgb(55 65 81 / 0.9);\n}\n.dark\\:hover\\:bg-gray-800:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:bg-gray-800\\/20:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.2);\n}\n.dark\\:hover\\:bg-gray-800\\/30:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.3);\n}\n.dark\\:hover\\:bg-gray-800\\/80:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.8);\n}\n.dark\\:hover\\:bg-gray-800\\/90:hover:is(.dark *) {\n background-color: rgb(31 41 55 / 0.9);\n}\n.dark\\:hover\\:bg-primary\\/30:hover:is(.dark *) {\n background-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:hover\\:bg-primary\\/90:hover:is(.dark *) {\n background-color: hsl(var(--primary) / 0.9);\n}\n.dark\\:hover\\:bg-purple-800:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(107 33 168 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:bg-success\\/80:hover:is(.dark *) {\n background-color: hsl(var(--success) / 0.8);\n}\n.dark\\:hover\\:bg-warning\\/80:hover:is(.dark *) {\n background-color: hsl(var(--warning) / 0.8);\n}\n.dark\\:hover\\:bg-white\\/10:hover:is(.dark *) {\n background-color: rgb(255 255 255 / 0.1);\n}\n.dark\\:hover\\:text-blue-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\n}\n.dark\\:hover\\:text-white:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:bg-gray-700:focus:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:focus\\:bg-gray-800:focus:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:focus\\:bg-green-900\\/20:focus:is(.dark *) {\n background-color: rgb(20 83 45 / 0.2);\n}\n.dark\\:focus\\:bg-red-900\\/20:focus:is(.dark *) {\n background-color: rgb(127 29 29 / 0.2);\n}\n.dark\\:focus\\:bg-yellow-900\\/20:focus:is(.dark *) {\n background-color: rgb(113 63 18 / 0.2);\n}\n.dark\\:focus\\:text-gray-100:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-gray-200:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-green-300:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(134 239 172 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-red-300:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(252 165 165 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus\\:text-yellow-300:focus:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(253 224 71 / var(--tw-text-opacity, 1));\n}\n.dark\\:focus-visible\\:border-primary:focus-visible:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: hsl(var(--primary) / var(--tw-border-opacity, 1));\n}\n.dark\\:focus-visible\\:border-primary\\/80:focus-visible:is(.dark *) {\n border-color: hsl(var(--primary) / 0.8);\n}\n.dark\\:focus-visible\\:ring-error\\/25:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--error) / 0.25);\n}\n.dark\\:focus-visible\\:ring-error\\/30:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--error) / 0.3);\n}\n.dark\\:focus-visible\\:ring-gray-500\\/40:focus-visible:is(.dark *) {\n --tw-ring-color: rgb(107 114 128 / 0.4);\n}\n.dark\\:focus-visible\\:ring-primary\\/20:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.2);\n}\n.dark\\:focus-visible\\:ring-primary\\/30:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.3);\n}\n.dark\\:focus-visible\\:ring-primary\\/40:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.4);\n}\n.dark\\:focus-visible\\:ring-primary\\/50:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--primary) / 0.5);\n}\n.dark\\:focus-visible\\:ring-purple-500\\/40:focus-visible:is(.dark *) {\n --tw-ring-color: rgb(168 85 247 / 0.4);\n}\n.dark\\:focus-visible\\:ring-success\\/25:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--success) / 0.25);\n}\n.dark\\:focus-visible\\:ring-success\\/30:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--success) / 0.3);\n}\n.dark\\:focus-visible\\:ring-warning\\/25:focus-visible:is(.dark *) {\n --tw-ring-color: hsl(var(--warning) / 0.25);\n}\n.dark\\:focus-visible\\:ring-offset-gray-950:focus-visible:is(.dark *) {\n --tw-ring-offset-color: #030712;\n}\n.dark\\:active\\:bg-error\\/70:active:is(.dark *) {\n background-color: hsl(var(--error) / 0.7);\n}\n.dark\\:active\\:bg-gray-600\\/90:active:is(.dark *) {\n background-color: rgb(75 85 99 / 0.9);\n}\n.dark\\:active\\:bg-gray-700\\/90:active:is(.dark *) {\n background-color: rgb(55 65 81 / 0.9);\n}\n.dark\\:active\\:bg-gray-800\\/90:active:is(.dark *) {\n background-color: rgb(31 41 55 / 0.9);\n}\n.dark\\:active\\:bg-primary\\/40:active:is(.dark *) {\n background-color: hsl(var(--primary) / 0.4);\n}\n.dark\\:active\\:bg-primary\\/80:active:is(.dark *) {\n background-color: hsl(var(--primary) / 0.8);\n}\n.dark\\:active\\:bg-success\\/70:active:is(.dark *) {\n background-color: hsl(var(--success) / 0.7);\n}\n.dark\\:active\\:text-blue-500:active:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(59 130 246 / var(--tw-text-opacity, 1));\n}\n.peer:disabled ~ .dark\\:peer-disabled\\:opacity-60:is(.dark *) {\n opacity: 0.6;\n}\n.dark\\:data-\\[state\\=active\\]\\:border-primary\\/80[data-state=active]:is(.dark *) {\n border-color: hsl(var(--primary) / 0.8);\n}\n.dark\\:data-\\[state\\=active\\]\\:bg-gray-900[data-state=active]:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:bg-primary\\/90[data-state=active]:is(.dark *) {\n background-color: hsl(var(--primary) / 0.9);\n}\n.dark\\:data-\\[state\\=unchecked\\]\\:bg-gray-700\\/70[data-state=unchecked]:is(.dark *) {\n background-color: rgb(55 65 81 / 0.7);\n}\n.dark\\:data-\\[state\\=active\\]\\:text-gray-100[data-state=active]:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:text-gray-200[data-state=active]:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:text-white[data-state=active]:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:data-\\[state\\=active\\]\\:shadow-gray-950\\/10[data-state=active]:is(.dark *) {\n --tw-shadow-color: rgb(3 7 18 / 0.1);\n --tw-shadow: var(--tw-shadow-colored);\n}\n.dark\\:data-\\[state\\=active\\]\\:shadow-gray-950\\/20[data-state=active]:is(.dark *) {\n --tw-shadow-color: rgb(3 7 18 / 0.2);\n --tw-shadow: var(--tw-shadow-colored);\n}\n@media (min-width: 640px) {\n .sm\\:bottom-0 {\n bottom: 0px;\n }\n .sm\\:right-0 {\n right: 0px;\n }\n .sm\\:top-auto {\n top: auto;\n }\n .sm\\:max-w-\\[425px\\] {\n max-width: 425px;\n }\n .sm\\:max-w-\\[500px\\] {\n max-width: 500px;\n }\n .sm\\:flex-row {\n flex-direction: row;\n }\n .sm\\:flex-col {\n flex-direction: column;\n }\n .sm\\:justify-end {\n justify-content: flex-end;\n }\n .sm\\:space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n }\n .sm\\:text-left {\n text-align: left;\n }\n}\n@media (min-width: 768px) {\n .md\\:max-w-\\[420px\\] {\n max-width: 420px;\n }\n .md\\:grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .md\\:grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n}\n@media (min-width: 1024px) {\n .lg\\:flex {\n display: flex;\n }\n .lg\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .lg\\:grid-cols-4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n .lg\\:space-x-8 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(2rem * var(--tw-space-x-reverse));\n margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse)));\n }\n}\n.\\[\\&\\+div\\]\\:text-xs + div {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.\\[\\&\\>span\\]\\:line-clamp-1 > span {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n}\n.\\[\\&_blockquote\\]\\:border-l-4 blockquote {\n border-left-width: 4px;\n}\n.\\[\\&_blockquote\\]\\:border-gray-300 blockquote {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.\\[\\&_blockquote\\]\\:pl-4 blockquote {\n padding-left: 1rem;\n}\n.\\[\\&_blockquote\\]\\:italic blockquote {\n font-style: italic;\n}\n.\\[\\&_h1\\]\\:mb-4 h1 {\n margin-bottom: 1rem;\n}\n.\\[\\&_h1\\]\\:text-3xl h1 {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.\\[\\&_h1\\]\\:font-bold h1 {\n font-weight: 700;\n}\n.\\[\\&_h2\\]\\:mb-3 h2 {\n margin-bottom: 0.75rem;\n}\n.\\[\\&_h2\\]\\:text-2xl h2 {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.\\[\\&_h2\\]\\:font-bold h2 {\n font-weight: 700;\n}\n.\\[\\&_h3\\]\\:mb-2 h3 {\n margin-bottom: 0.5rem;\n}\n.\\[\\&_h3\\]\\:text-xl h3 {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.\\[\\&_h3\\]\\:font-bold h3 {\n font-weight: 700;\n}\n.\\[\\&_h4\\]\\:mb-2 h4 {\n margin-bottom: 0.5rem;\n}\n.\\[\\&_h4\\]\\:text-lg h4 {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.\\[\\&_h4\\]\\:font-bold h4 {\n font-weight: 700;\n}\n.\\[\\&_h5\\]\\:mb-1 h5 {\n margin-bottom: 0.25rem;\n}\n.\\[\\&_h5\\]\\:text-base h5 {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.\\[\\&_h5\\]\\:font-bold h5 {\n font-weight: 700;\n}\n.\\[\\&_h6\\]\\:mb-1 h6 {\n margin-bottom: 0.25rem;\n}\n.\\[\\&_h6\\]\\:text-sm h6 {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.\\[\\&_h6\\]\\:font-bold h6 {\n font-weight: 700;\n}\n.\\[\\&_li\\]\\:mb-1 li {\n margin-bottom: 0.25rem;\n}\n.\\[\\&_ol\\]\\:mb-4 ol {\n margin-bottom: 1rem;\n}\n.\\[\\&_ol\\]\\:list-decimal ol {\n list-style-type: decimal;\n}\n.\\[\\&_ol\\]\\:pl-6 ol {\n padding-left: 1.5rem;\n}\n.\\[\\&_pre\\]\\:overflow-x-auto pre {\n overflow-x: auto;\n}\n.\\[\\&_pre\\]\\:rounded pre {\n border-radius: 0.25rem;\n}\n.\\[\\&_pre\\]\\:bg-gray-100 pre {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.\\[\\&_pre\\]\\:p-4 pre {\n padding: 1rem;\n}\n.\\[\\&_pre\\]\\:dark\\:bg-gray-800:is(.dark *) pre {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.\\[\\&_table\\]\\:mb-4 table {\n margin-bottom: 1rem;\n}\n.\\[\\&_table\\]\\:w-full table {\n width: 100%;\n}\n.\\[\\&_table_td\\]\\:border table td {\n border-width: 1px;\n}\n.\\[\\&_table_td\\]\\:border-gray-300 table td {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.\\[\\&_table_td\\]\\:p-2 table td {\n padding: 0.5rem;\n}\n.\\[\\&_table_th\\]\\:border table th {\n border-width: 1px;\n}\n.\\[\\&_table_th\\]\\:border-gray-300 table th {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.\\[\\&_table_th\\]\\:bg-gray-50 table th {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.\\[\\&_table_th\\]\\:p-2 table th {\n padding: 0.5rem;\n}\n.\\[\\&_table_th\\]\\:font-semibold table th {\n font-weight: 600;\n}\n.\\[\\&_ul\\]\\:mb-4 ul {\n margin-bottom: 1rem;\n}\n.\\[\\&_ul\\]\\:list-disc ul {\n list-style-type: disc;\n}\n.\\[\\&_ul\\]\\:pl-6 ul {\n padding-left: 1.5rem;\n}\n');
|
|
1733
1737
|
function cn(...inputs) {
|
|
1734
1738
|
return twMerge(clsx(inputs));
|
|
1735
1739
|
}
|
|
@@ -33031,7 +33035,7 @@ var index_default7 = Highlight;
|
|
|
33031
33035
|
|
|
33032
33036
|
// ../../node_modules/@tiptap/extension-image/dist/index.js
|
|
33033
33037
|
var inputRegex6 = /(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/;
|
|
33034
|
-
var
|
|
33038
|
+
var Image3 = Node3.create({
|
|
33035
33039
|
name: "image",
|
|
33036
33040
|
addOptions() {
|
|
33037
33041
|
return {
|
|
@@ -33099,7 +33103,7 @@ var Image2 = Node3.create({
|
|
|
33099
33103
|
];
|
|
33100
33104
|
}
|
|
33101
33105
|
});
|
|
33102
|
-
var index_default8 =
|
|
33106
|
+
var index_default8 = Image3;
|
|
33103
33107
|
|
|
33104
33108
|
// ../../node_modules/prosemirror-tables/dist/index.js
|
|
33105
33109
|
var readFromCache;
|
|
@@ -54173,7 +54177,7 @@ function RichTextEditor({
|
|
|
54173
54177
|
{
|
|
54174
54178
|
tooltip: "Add image",
|
|
54175
54179
|
disabled: isSourceView,
|
|
54176
|
-
children: /* @__PURE__ */ jsx(Image, { className: "w-4 h-4" })
|
|
54180
|
+
children: /* @__PURE__ */ jsx(Image$1, { className: "w-4 h-4" })
|
|
54177
54181
|
}
|
|
54178
54182
|
) }),
|
|
54179
54183
|
/* @__PURE__ */ jsxs(DialogContent2, { className: "sm:max-w-[425px]", children: [
|
|
@@ -55969,5 +55973,3088 @@ function DraggableList({
|
|
|
55969
55973
|
}
|
|
55970
55974
|
) });
|
|
55971
55975
|
}
|
|
55976
|
+
var checkboxVariants = cva(
|
|
55977
|
+
"peer shrink-0 border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:text-primary-foreground",
|
|
55978
|
+
{
|
|
55979
|
+
variants: {
|
|
55980
|
+
variant: {
|
|
55981
|
+
default: "border-border bg-background data-[state=checked]:bg-primary data-[state=checked]:border-primary",
|
|
55982
|
+
outline: "border-border bg-transparent data-[state=checked]:bg-primary data-[state=checked]:border-primary",
|
|
55983
|
+
muted: "border-border bg-accent data-[state=checked]:bg-primary data-[state=checked]:border-primary",
|
|
55984
|
+
ghost: "border-transparent bg-transparent hover:bg-accent data-[state=checked]:bg-primary data-[state=checked]:border-primary"
|
|
55985
|
+
},
|
|
55986
|
+
size: {
|
|
55987
|
+
sm: "h-3.5 w-3.5",
|
|
55988
|
+
default: "h-4 w-4",
|
|
55989
|
+
md: "h-5 w-5",
|
|
55990
|
+
lg: "h-6 w-6"
|
|
55991
|
+
},
|
|
55992
|
+
radius: {
|
|
55993
|
+
none: "rounded-none",
|
|
55994
|
+
sm: "rounded-sm",
|
|
55995
|
+
default: "rounded-sm",
|
|
55996
|
+
md: "rounded-md",
|
|
55997
|
+
full: "rounded-full"
|
|
55998
|
+
},
|
|
55999
|
+
animation: {
|
|
56000
|
+
none: "",
|
|
56001
|
+
subtle: "transition-all duration-200",
|
|
56002
|
+
default: "transition-all duration-200",
|
|
56003
|
+
bounce: "transition-all duration-200"
|
|
56004
|
+
}
|
|
56005
|
+
},
|
|
56006
|
+
defaultVariants: {
|
|
56007
|
+
variant: "default",
|
|
56008
|
+
size: "default",
|
|
56009
|
+
radius: "default",
|
|
56010
|
+
animation: "default"
|
|
56011
|
+
}
|
|
56012
|
+
}
|
|
56013
|
+
);
|
|
56014
|
+
var Checkbox = React55.forwardRef(({
|
|
56015
|
+
className,
|
|
56016
|
+
variant,
|
|
56017
|
+
size: size4,
|
|
56018
|
+
radius,
|
|
56019
|
+
animation,
|
|
56020
|
+
indeterminate = false,
|
|
56021
|
+
icon,
|
|
56022
|
+
checked,
|
|
56023
|
+
...props
|
|
56024
|
+
}, ref) => {
|
|
56025
|
+
const [isIndeterminate2, setIsIndeterminate] = React55.useState(indeterminate);
|
|
56026
|
+
React55.useEffect(() => {
|
|
56027
|
+
setIsIndeterminate(indeterminate);
|
|
56028
|
+
}, [indeterminate]);
|
|
56029
|
+
const effectiveChecked = isIndeterminate2 ? false : checked;
|
|
56030
|
+
return /* @__PURE__ */ jsx(
|
|
56031
|
+
CheckboxPrimitive.Root,
|
|
56032
|
+
{
|
|
56033
|
+
ref,
|
|
56034
|
+
checked: effectiveChecked,
|
|
56035
|
+
className: cn(checkboxVariants({ variant, size: size4, radius, animation }), className),
|
|
56036
|
+
...props,
|
|
56037
|
+
children: /* @__PURE__ */ jsx(
|
|
56038
|
+
CheckboxPrimitive.Indicator,
|
|
56039
|
+
{
|
|
56040
|
+
className: cn(
|
|
56041
|
+
"flex items-center justify-center text-current",
|
|
56042
|
+
animation === "bounce" && "data-[state=checked]:animate-bounce"
|
|
56043
|
+
),
|
|
56044
|
+
children: isIndeterminate2 ? /* @__PURE__ */ jsx(Minus, { className: "h-[65%] w-[65%]" }) : icon ? icon : /* @__PURE__ */ jsx(Check, { className: "h-[65%] w-[65%]" })
|
|
56045
|
+
}
|
|
56046
|
+
)
|
|
56047
|
+
}
|
|
56048
|
+
);
|
|
56049
|
+
});
|
|
56050
|
+
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
|
|
56051
|
+
var CheckboxGroup = React55.forwardRef(
|
|
56052
|
+
({ className, orientation = "vertical", spacing = "1rem", children, ...props }, ref) => {
|
|
56053
|
+
return /* @__PURE__ */ jsx(
|
|
56054
|
+
"div",
|
|
56055
|
+
{
|
|
56056
|
+
ref,
|
|
56057
|
+
className: cn(
|
|
56058
|
+
"flex",
|
|
56059
|
+
orientation === "vertical" ? "flex-col" : "flex-row flex-wrap",
|
|
56060
|
+
className
|
|
56061
|
+
),
|
|
56062
|
+
style: { gap: spacing },
|
|
56063
|
+
role: "group",
|
|
56064
|
+
...props,
|
|
56065
|
+
children
|
|
56066
|
+
}
|
|
56067
|
+
);
|
|
56068
|
+
}
|
|
56069
|
+
);
|
|
56070
|
+
CheckboxGroup.displayName = "CheckboxGroup";
|
|
56071
|
+
var CheckboxLabel = React55.forwardRef(
|
|
56072
|
+
({ className, htmlFor, children, position = "end", disabled = false, ...props }, ref) => {
|
|
56073
|
+
return /* @__PURE__ */ jsx(
|
|
56074
|
+
"label",
|
|
56075
|
+
{
|
|
56076
|
+
ref,
|
|
56077
|
+
htmlFor,
|
|
56078
|
+
className: cn(
|
|
56079
|
+
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
56080
|
+
position === "start" ? "mr-2" : "ml-2",
|
|
56081
|
+
disabled && "cursor-not-allowed opacity-70",
|
|
56082
|
+
className
|
|
56083
|
+
),
|
|
56084
|
+
...props,
|
|
56085
|
+
children
|
|
56086
|
+
}
|
|
56087
|
+
);
|
|
56088
|
+
}
|
|
56089
|
+
);
|
|
56090
|
+
CheckboxLabel.displayName = "CheckboxLabel";
|
|
56091
|
+
var CheckboxWithLabel = React55.forwardRef(({
|
|
56092
|
+
id,
|
|
56093
|
+
label,
|
|
56094
|
+
labelPosition = "end",
|
|
56095
|
+
labelClassName,
|
|
56096
|
+
...checkboxProps
|
|
56097
|
+
}, ref) => {
|
|
56098
|
+
const generatedId = React55.useId();
|
|
56099
|
+
const checkboxId = id || generatedId;
|
|
56100
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
|
|
56101
|
+
labelPosition === "start" && /* @__PURE__ */ jsx(
|
|
56102
|
+
CheckboxLabel,
|
|
56103
|
+
{
|
|
56104
|
+
htmlFor: checkboxId,
|
|
56105
|
+
position: "start",
|
|
56106
|
+
disabled: checkboxProps.disabled,
|
|
56107
|
+
className: labelClassName,
|
|
56108
|
+
children: label
|
|
56109
|
+
}
|
|
56110
|
+
),
|
|
56111
|
+
/* @__PURE__ */ jsx(Checkbox, { ref, id: checkboxId, ...checkboxProps }),
|
|
56112
|
+
labelPosition === "end" && /* @__PURE__ */ jsx(
|
|
56113
|
+
CheckboxLabel,
|
|
56114
|
+
{
|
|
56115
|
+
htmlFor: checkboxId,
|
|
56116
|
+
position: "end",
|
|
56117
|
+
disabled: checkboxProps.disabled,
|
|
56118
|
+
className: labelClassName,
|
|
56119
|
+
children: label
|
|
56120
|
+
}
|
|
56121
|
+
)
|
|
56122
|
+
] });
|
|
56123
|
+
});
|
|
56124
|
+
CheckboxWithLabel.displayName = "CheckboxWithLabel";
|
|
56125
|
+
var Switch = React55.forwardRef(({ className, size: size4 = "md", variant = "primary", loading, leftIcon, rightIcon, description, ...props }, ref) => /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-2", children: [
|
|
56126
|
+
leftIcon && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: leftIcon }),
|
|
56127
|
+
/* @__PURE__ */ jsxs(
|
|
56128
|
+
SwitchPrimitives.Root,
|
|
56129
|
+
{
|
|
56130
|
+
className: cn(
|
|
56131
|
+
"peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 dark:data-[state=unchecked]:bg-gray-700/70 dark:focus-visible:ring-primary/40 dark:focus-visible:ring-offset-gray-950",
|
|
56132
|
+
// Boyutlar
|
|
56133
|
+
size4 === "sm" && "h-4 w-8",
|
|
56134
|
+
size4 === "md" && "h-6 w-11",
|
|
56135
|
+
size4 === "lg" && "h-7 w-14",
|
|
56136
|
+
// Varyantlar (checked durumunda)
|
|
56137
|
+
variant === "primary" && "data-[state=checked]:bg-primary",
|
|
56138
|
+
variant === "success" && "data-[state=checked]:bg-success",
|
|
56139
|
+
variant === "warning" && "data-[state=checked]:bg-warning",
|
|
56140
|
+
variant === "danger" && "data-[state=checked]:bg-error",
|
|
56141
|
+
variant === "secondary" && "data-[state=checked]:bg-accent",
|
|
56142
|
+
// Unchecked durumu
|
|
56143
|
+
"data-[state=unchecked]:bg-input",
|
|
56144
|
+
// Loading durumu
|
|
56145
|
+
loading && "opacity-80 cursor-wait",
|
|
56146
|
+
className
|
|
56147
|
+
),
|
|
56148
|
+
disabled: loading || props.disabled,
|
|
56149
|
+
...props,
|
|
56150
|
+
ref,
|
|
56151
|
+
children: [
|
|
56152
|
+
loading ? /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "h-3 w-3 animate-spin rounded-full border-2 border-gray-300 border-t-primary" }) }) : null,
|
|
56153
|
+
/* @__PURE__ */ jsx(
|
|
56154
|
+
SwitchPrimitives.Thumb,
|
|
56155
|
+
{
|
|
56156
|
+
className: cn(
|
|
56157
|
+
"pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform",
|
|
56158
|
+
// Boyuta göre thumb boyutları
|
|
56159
|
+
size4 === "sm" && "h-3 w-3 data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0",
|
|
56160
|
+
size4 === "md" && "h-5 w-5 data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0",
|
|
56161
|
+
size4 === "lg" && "h-6 w-6 data-[state=checked]:translate-x-7 data-[state=unchecked]:translate-x-0"
|
|
56162
|
+
)
|
|
56163
|
+
}
|
|
56164
|
+
)
|
|
56165
|
+
]
|
|
56166
|
+
}
|
|
56167
|
+
),
|
|
56168
|
+
rightIcon && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: rightIcon }),
|
|
56169
|
+
description && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: description })
|
|
56170
|
+
] }));
|
|
56171
|
+
Switch.displayName = SwitchPrimitives.Root.displayName;
|
|
56172
|
+
var AdvancedFormsInternal = ({
|
|
56173
|
+
fields,
|
|
56174
|
+
onSubmit,
|
|
56175
|
+
title = "Advanced Form",
|
|
56176
|
+
description,
|
|
56177
|
+
submitText = "Submit",
|
|
56178
|
+
enableAutoSave = false,
|
|
56179
|
+
showProgress = true,
|
|
56180
|
+
className,
|
|
56181
|
+
layout = "vertical",
|
|
56182
|
+
columns = 2
|
|
56183
|
+
}) => {
|
|
56184
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
56185
|
+
const [showPasswords, setShowPasswords] = useState({});
|
|
56186
|
+
const [uploadedFiles, setUploadedFiles] = useState({});
|
|
56187
|
+
const {
|
|
56188
|
+
register,
|
|
56189
|
+
handleSubmit,
|
|
56190
|
+
watch,
|
|
56191
|
+
formState: { errors, isValid, touchedFields },
|
|
56192
|
+
setValue,
|
|
56193
|
+
getValues
|
|
56194
|
+
} = useForm({
|
|
56195
|
+
mode: "onChange",
|
|
56196
|
+
defaultValues: fields.reduce((acc, field) => ({
|
|
56197
|
+
...acc,
|
|
56198
|
+
[field.name]: field.defaultValue || (field.type === "checkbox" ? false : "")
|
|
56199
|
+
}), {})
|
|
56200
|
+
});
|
|
56201
|
+
watch();
|
|
56202
|
+
const completedFields = Object.keys(touchedFields).length;
|
|
56203
|
+
const progress = fields.length > 0 ? completedFields / fields.length * 100 : 0;
|
|
56204
|
+
const handleFormSubmit = async (data) => {
|
|
56205
|
+
setIsSubmitting(true);
|
|
56206
|
+
try {
|
|
56207
|
+
await onSubmit(data);
|
|
56208
|
+
} finally {
|
|
56209
|
+
setIsSubmitting(false);
|
|
56210
|
+
}
|
|
56211
|
+
};
|
|
56212
|
+
const togglePasswordVisibility = (fieldName) => {
|
|
56213
|
+
setShowPasswords((prev) => ({
|
|
56214
|
+
...prev,
|
|
56215
|
+
[fieldName]: !prev[fieldName]
|
|
56216
|
+
}));
|
|
56217
|
+
};
|
|
56218
|
+
const handleFileUpload = (fieldName, files) => {
|
|
56219
|
+
if (files) {
|
|
56220
|
+
const fileArray = Array.from(files);
|
|
56221
|
+
setUploadedFiles((prev) => ({
|
|
56222
|
+
...prev,
|
|
56223
|
+
[fieldName]: fileArray
|
|
56224
|
+
}));
|
|
56225
|
+
setValue(fieldName, fileArray);
|
|
56226
|
+
}
|
|
56227
|
+
};
|
|
56228
|
+
const removeFile = (fieldName, index2) => {
|
|
56229
|
+
setUploadedFiles((prev) => {
|
|
56230
|
+
const newFiles = [...prev[fieldName] || []];
|
|
56231
|
+
newFiles.splice(index2, 1);
|
|
56232
|
+
return {
|
|
56233
|
+
...prev,
|
|
56234
|
+
[fieldName]: newFiles
|
|
56235
|
+
};
|
|
56236
|
+
});
|
|
56237
|
+
setValue(fieldName, uploadedFiles[fieldName]?.filter((_, i) => i !== index2) || []);
|
|
56238
|
+
};
|
|
56239
|
+
const renderField = (field, index2) => {
|
|
56240
|
+
const error = errors[field.name];
|
|
56241
|
+
const isTouched = touchedFields[field.name];
|
|
56242
|
+
return /* @__PURE__ */ jsxs(
|
|
56243
|
+
motion.div,
|
|
56244
|
+
{
|
|
56245
|
+
initial: { opacity: 0, y: 20 },
|
|
56246
|
+
animate: { opacity: 1, y: 0 },
|
|
56247
|
+
transition: { delay: index2 * 0.1 },
|
|
56248
|
+
className: "space-y-2",
|
|
56249
|
+
children: [
|
|
56250
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxs(Label2, { htmlFor: field.name, className: "flex items-center gap-2", children: [
|
|
56251
|
+
field.label,
|
|
56252
|
+
field.required && /* @__PURE__ */ jsx("span", { className: "text-destructive", children: "*" }),
|
|
56253
|
+
isTouched && !error && /* @__PURE__ */ jsx(CheckCircle, { className: "h-4 w-4 text-green-500" }),
|
|
56254
|
+
error && /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4 text-destructive" })
|
|
56255
|
+
] }) }),
|
|
56256
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
56257
|
+
field.type === "text" || field.type === "email" || field.type === "number" || field.type === "url" || field.type === "tel" && /* @__PURE__ */ jsx(
|
|
56258
|
+
Input,
|
|
56259
|
+
{
|
|
56260
|
+
id: field.name,
|
|
56261
|
+
type: field.type,
|
|
56262
|
+
placeholder: field.placeholder,
|
|
56263
|
+
className: cn(error && "border-destructive"),
|
|
56264
|
+
...register(field.name, {
|
|
56265
|
+
required: field.required ? `${field.label} is required` : false,
|
|
56266
|
+
minLength: field.validation?.minLength ? {
|
|
56267
|
+
value: field.validation.minLength,
|
|
56268
|
+
message: `Minimum ${field.validation.minLength} characters required`
|
|
56269
|
+
} : void 0,
|
|
56270
|
+
maxLength: field.validation?.maxLength ? {
|
|
56271
|
+
value: field.validation.maxLength,
|
|
56272
|
+
message: `Maximum ${field.validation.maxLength} characters allowed`
|
|
56273
|
+
} : void 0,
|
|
56274
|
+
pattern: field.validation?.pattern ? {
|
|
56275
|
+
value: field.validation.pattern,
|
|
56276
|
+
message: "Invalid format"
|
|
56277
|
+
} : void 0,
|
|
56278
|
+
validate: field.validation?.custom
|
|
56279
|
+
})
|
|
56280
|
+
}
|
|
56281
|
+
),
|
|
56282
|
+
field.type === "password" && /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
56283
|
+
/* @__PURE__ */ jsx(
|
|
56284
|
+
Input,
|
|
56285
|
+
{
|
|
56286
|
+
id: field.name,
|
|
56287
|
+
type: showPasswords[field.name] ? "text" : "password",
|
|
56288
|
+
placeholder: field.placeholder,
|
|
56289
|
+
className: cn("pr-10", error && "border-destructive"),
|
|
56290
|
+
...register(field.name, {
|
|
56291
|
+
required: field.required ? `${field.label} is required` : false,
|
|
56292
|
+
minLength: field.validation?.minLength ? {
|
|
56293
|
+
value: field.validation.minLength,
|
|
56294
|
+
message: `Minimum ${field.validation.minLength} characters required`
|
|
56295
|
+
} : void 0
|
|
56296
|
+
})
|
|
56297
|
+
}
|
|
56298
|
+
),
|
|
56299
|
+
/* @__PURE__ */ jsx(
|
|
56300
|
+
Button,
|
|
56301
|
+
{
|
|
56302
|
+
type: "button",
|
|
56303
|
+
variant: "ghost",
|
|
56304
|
+
size: "sm",
|
|
56305
|
+
className: "absolute right-1 top-1/2 -translate-y-1/2 h-8 w-8 p-0",
|
|
56306
|
+
onClick: () => togglePasswordVisibility(field.name),
|
|
56307
|
+
children: showPasswords[field.name] ? /* @__PURE__ */ jsx(EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Eye, { className: "h-4 w-4" })
|
|
56308
|
+
}
|
|
56309
|
+
)
|
|
56310
|
+
] }),
|
|
56311
|
+
field.type === "textarea" && /* @__PURE__ */ jsx(
|
|
56312
|
+
Textarea,
|
|
56313
|
+
{
|
|
56314
|
+
id: field.name,
|
|
56315
|
+
placeholder: field.placeholder,
|
|
56316
|
+
className: cn(error && "border-destructive"),
|
|
56317
|
+
rows: 3,
|
|
56318
|
+
...register(field.name, {
|
|
56319
|
+
required: field.required ? `${field.label} is required` : false,
|
|
56320
|
+
maxLength: field.validation?.maxLength ? {
|
|
56321
|
+
value: field.validation.maxLength,
|
|
56322
|
+
message: `Maximum ${field.validation.maxLength} characters allowed`
|
|
56323
|
+
} : void 0
|
|
56324
|
+
})
|
|
56325
|
+
}
|
|
56326
|
+
),
|
|
56327
|
+
field.type === "select" && /* @__PURE__ */ jsxs(
|
|
56328
|
+
Select,
|
|
56329
|
+
{
|
|
56330
|
+
onValueChange: (value) => setValue(field.name, value),
|
|
56331
|
+
defaultValue: field.defaultValue,
|
|
56332
|
+
children: [
|
|
56333
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: cn(error && "border-destructive"), children: /* @__PURE__ */ jsx(SelectValue, { placeholder: field.placeholder }) }),
|
|
56334
|
+
/* @__PURE__ */ jsx(SelectContent, { children: field.options?.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: option.label }, option.value)) })
|
|
56335
|
+
]
|
|
56336
|
+
}
|
|
56337
|
+
),
|
|
56338
|
+
field.type === "checkbox" && /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
56339
|
+
/* @__PURE__ */ jsx(
|
|
56340
|
+
Checkbox,
|
|
56341
|
+
{
|
|
56342
|
+
id: field.name,
|
|
56343
|
+
...register(field.name),
|
|
56344
|
+
onCheckedChange: (checked) => setValue(field.name, checked)
|
|
56345
|
+
}
|
|
56346
|
+
),
|
|
56347
|
+
/* @__PURE__ */ jsx(Label2, { htmlFor: field.name, className: "text-sm", children: field.placeholder || "Check this option" })
|
|
56348
|
+
] }),
|
|
56349
|
+
field.type === "switch" && /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
56350
|
+
/* @__PURE__ */ jsx(
|
|
56351
|
+
Switch,
|
|
56352
|
+
{
|
|
56353
|
+
id: field.name,
|
|
56354
|
+
...register(field.name),
|
|
56355
|
+
onCheckedChange: (checked) => setValue(field.name, checked)
|
|
56356
|
+
}
|
|
56357
|
+
),
|
|
56358
|
+
/* @__PURE__ */ jsx(Label2, { htmlFor: field.name, className: "text-sm", children: field.placeholder || "Toggle this option" })
|
|
56359
|
+
] }),
|
|
56360
|
+
field.type === "file" && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
56361
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-full", children: /* @__PURE__ */ jsxs(
|
|
56362
|
+
"label",
|
|
56363
|
+
{
|
|
56364
|
+
htmlFor: field.name,
|
|
56365
|
+
className: "flex flex-col items-center justify-center w-full h-32 border-2 border-dashed rounded-lg cursor-pointer bg-muted/50 hover:bg-muted/80 transition-colors",
|
|
56366
|
+
children: [
|
|
56367
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center pt-5 pb-6", children: [
|
|
56368
|
+
/* @__PURE__ */ jsx(Upload, { className: "w-8 h-8 mb-4 text-muted-foreground" }),
|
|
56369
|
+
/* @__PURE__ */ jsxs("p", { className: "mb-2 text-sm text-muted-foreground", children: [
|
|
56370
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold", children: "Click to upload" }),
|
|
56371
|
+
" or drag and drop"
|
|
56372
|
+
] })
|
|
56373
|
+
] }),
|
|
56374
|
+
/* @__PURE__ */ jsx(
|
|
56375
|
+
"input",
|
|
56376
|
+
{
|
|
56377
|
+
id: field.name,
|
|
56378
|
+
type: "file",
|
|
56379
|
+
multiple: true,
|
|
56380
|
+
className: "hidden",
|
|
56381
|
+
onChange: (e) => handleFileUpload(field.name, e.target.files)
|
|
56382
|
+
}
|
|
56383
|
+
)
|
|
56384
|
+
]
|
|
56385
|
+
}
|
|
56386
|
+
) }),
|
|
56387
|
+
uploadedFiles[field.name] && uploadedFiles[field.name].length > 0 && /* @__PURE__ */ jsx("div", { className: "space-y-2", children: uploadedFiles[field.name].map((file, index3) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-2 bg-muted rounded-md", children: [
|
|
56388
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm truncate", children: file.name }),
|
|
56389
|
+
/* @__PURE__ */ jsx(
|
|
56390
|
+
Button,
|
|
56391
|
+
{
|
|
56392
|
+
type: "button",
|
|
56393
|
+
variant: "ghost",
|
|
56394
|
+
size: "sm",
|
|
56395
|
+
onClick: () => removeFile(field.name, index3),
|
|
56396
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
56397
|
+
}
|
|
56398
|
+
)
|
|
56399
|
+
] }, index3)) })
|
|
56400
|
+
] })
|
|
56401
|
+
] }),
|
|
56402
|
+
field.description && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: field.description }),
|
|
56403
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: error && /* @__PURE__ */ jsx(
|
|
56404
|
+
motion.p,
|
|
56405
|
+
{
|
|
56406
|
+
initial: { opacity: 0, height: 0 },
|
|
56407
|
+
animate: { opacity: 1, height: "auto" },
|
|
56408
|
+
exit: { opacity: 0, height: 0 },
|
|
56409
|
+
className: "text-sm text-destructive",
|
|
56410
|
+
children: error.message
|
|
56411
|
+
}
|
|
56412
|
+
) })
|
|
56413
|
+
]
|
|
56414
|
+
},
|
|
56415
|
+
field.name
|
|
56416
|
+
);
|
|
56417
|
+
};
|
|
56418
|
+
const gridClassName = layout === "grid" ? `grid grid-cols-1 md:grid-cols-${columns} gap-6` : "space-y-6";
|
|
56419
|
+
return /* @__PURE__ */ jsxs(Card, { className: cn("w-full max-w-4xl", className), children: [
|
|
56420
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
56421
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
56422
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
56423
|
+
/* @__PURE__ */ jsx(CardTitle, { children: title }),
|
|
56424
|
+
description && /* @__PURE__ */ jsx(CardDescription, { children: description })
|
|
56425
|
+
] }),
|
|
56426
|
+
/* @__PURE__ */ jsx(Badge, { variant: "pro", className: "ml-2", children: "PRO" })
|
|
56427
|
+
] }),
|
|
56428
|
+
showProgress && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
56429
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
56430
|
+
/* @__PURE__ */ jsx("span", { children: "Progress" }),
|
|
56431
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
56432
|
+
Math.round(progress),
|
|
56433
|
+
"%"
|
|
56434
|
+
] })
|
|
56435
|
+
] }),
|
|
56436
|
+
/* @__PURE__ */ jsx("div", { className: "w-full bg-muted rounded-full h-2", children: /* @__PURE__ */ jsx(
|
|
56437
|
+
motion.div,
|
|
56438
|
+
{
|
|
56439
|
+
className: "bg-primary h-2 rounded-full",
|
|
56440
|
+
initial: { width: 0 },
|
|
56441
|
+
animate: { width: `${progress}%` },
|
|
56442
|
+
transition: { duration: 0.3 }
|
|
56443
|
+
}
|
|
56444
|
+
) })
|
|
56445
|
+
] })
|
|
56446
|
+
] }),
|
|
56447
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit(handleFormSubmit), className: "space-y-6", children: [
|
|
56448
|
+
/* @__PURE__ */ jsx("div", { className: gridClassName, children: fields.map((field, index2) => renderField(field, index2)) }),
|
|
56449
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-6", children: [
|
|
56450
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
56451
|
+
completedFields,
|
|
56452
|
+
"/",
|
|
56453
|
+
fields.length,
|
|
56454
|
+
" fields completed"
|
|
56455
|
+
] }),
|
|
56456
|
+
/* @__PURE__ */ jsx(
|
|
56457
|
+
Button,
|
|
56458
|
+
{
|
|
56459
|
+
type: "submit",
|
|
56460
|
+
disabled: isSubmitting || !isValid,
|
|
56461
|
+
className: "min-w-32",
|
|
56462
|
+
children: isSubmitting ? /* @__PURE__ */ jsx(
|
|
56463
|
+
motion.div,
|
|
56464
|
+
{
|
|
56465
|
+
animate: { rotate: 360 },
|
|
56466
|
+
transition: { duration: 1, repeat: Infinity, ease: "linear" },
|
|
56467
|
+
className: "w-4 h-4 border-2 border-white border-t-transparent rounded-full"
|
|
56468
|
+
}
|
|
56469
|
+
) : submitText
|
|
56470
|
+
}
|
|
56471
|
+
)
|
|
56472
|
+
] })
|
|
56473
|
+
] }) })
|
|
56474
|
+
] });
|
|
56475
|
+
};
|
|
56476
|
+
var AdvancedForms = ({ className, ...props }) => {
|
|
56477
|
+
const docsProAccess = { hasAccess: true };
|
|
56478
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
56479
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
56480
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
56481
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
56482
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
56483
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
56484
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Advanced Forms is available exclusively to MoonUI Pro subscribers." }),
|
|
56485
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
56486
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
56487
|
+
"Upgrade to Pro"
|
|
56488
|
+
] }) })
|
|
56489
|
+
] })
|
|
56490
|
+
] }) }) });
|
|
56491
|
+
}
|
|
56492
|
+
return /* @__PURE__ */ jsx(AdvancedFormsInternal, { className, ...props });
|
|
56493
|
+
};
|
|
56494
|
+
var ColorPickerInternal = ({
|
|
56495
|
+
value = "#3b82f6",
|
|
56496
|
+
onChange,
|
|
56497
|
+
disabled = false,
|
|
56498
|
+
showPresets = true,
|
|
56499
|
+
showAlpha = true,
|
|
56500
|
+
showInput = true,
|
|
56501
|
+
showCopy = true,
|
|
56502
|
+
presetColors = [
|
|
56503
|
+
"#ef4444",
|
|
56504
|
+
"#f97316",
|
|
56505
|
+
"#f59e0b",
|
|
56506
|
+
"#eab308",
|
|
56507
|
+
"#84cc16",
|
|
56508
|
+
"#22c55e",
|
|
56509
|
+
"#10b981",
|
|
56510
|
+
"#14b8a6",
|
|
56511
|
+
"#06b6d4",
|
|
56512
|
+
"#0ea5e9",
|
|
56513
|
+
"#3b82f6",
|
|
56514
|
+
"#6366f1",
|
|
56515
|
+
"#8b5cf6",
|
|
56516
|
+
"#a855f7",
|
|
56517
|
+
"#d946ef",
|
|
56518
|
+
"#ec4899",
|
|
56519
|
+
"#f43f5e",
|
|
56520
|
+
"#000000",
|
|
56521
|
+
"#404040",
|
|
56522
|
+
"#737373",
|
|
56523
|
+
"#a3a3a3",
|
|
56524
|
+
"#d4d4d4",
|
|
56525
|
+
"#f5f5f5",
|
|
56526
|
+
"#ffffff"
|
|
56527
|
+
],
|
|
56528
|
+
className,
|
|
56529
|
+
size: size4 = "default"
|
|
56530
|
+
}) => {
|
|
56531
|
+
const [currentColor, setCurrentColor] = useState(value);
|
|
56532
|
+
const [hsv, setHsv] = useState({ h: 0, s: 100, v: 100, a: 1 });
|
|
56533
|
+
const [inputValue, setInputValue] = useState(value);
|
|
56534
|
+
const [copied, setCopied] = useState(false);
|
|
56535
|
+
const [isDragging, setIsDragging] = useState(null);
|
|
56536
|
+
const saturationRef = useRef(null);
|
|
56537
|
+
const hueRef = useRef(null);
|
|
56538
|
+
const alphaRef = useRef(null);
|
|
56539
|
+
const sizeClasses = {
|
|
56540
|
+
sm: "w-8 h-8",
|
|
56541
|
+
default: "w-10 h-10",
|
|
56542
|
+
lg: "w-12 h-12"
|
|
56543
|
+
};
|
|
56544
|
+
const hexToRgb = (hex) => {
|
|
56545
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
56546
|
+
return result ? {
|
|
56547
|
+
r: parseInt(result[1], 16),
|
|
56548
|
+
g: parseInt(result[2], 16),
|
|
56549
|
+
b: parseInt(result[3], 16),
|
|
56550
|
+
a: 1
|
|
56551
|
+
} : { r: 0, g: 0, b: 0, a: 1 };
|
|
56552
|
+
};
|
|
56553
|
+
const rgbToHex = (r2, g, b) => {
|
|
56554
|
+
return "#" + [r2, g, b].map((x) => {
|
|
56555
|
+
const hex = Math.round(x).toString(16);
|
|
56556
|
+
return hex.length === 1 ? "0" + hex : hex;
|
|
56557
|
+
}).join("");
|
|
56558
|
+
};
|
|
56559
|
+
const rgbToHsv = (rgb) => {
|
|
56560
|
+
const r2 = rgb.r / 255;
|
|
56561
|
+
const g = rgb.g / 255;
|
|
56562
|
+
const b = rgb.b / 255;
|
|
56563
|
+
const max2 = Math.max(r2, g, b);
|
|
56564
|
+
const min2 = Math.min(r2, g, b);
|
|
56565
|
+
const diff2 = max2 - min2;
|
|
56566
|
+
let h2 = 0;
|
|
56567
|
+
if (diff2 !== 0) {
|
|
56568
|
+
if (max2 === r2)
|
|
56569
|
+
h2 = (g - b) / diff2 % 6;
|
|
56570
|
+
else if (max2 === g)
|
|
56571
|
+
h2 = (b - r2) / diff2 + 2;
|
|
56572
|
+
else
|
|
56573
|
+
h2 = (r2 - g) / diff2 + 4;
|
|
56574
|
+
}
|
|
56575
|
+
h2 = Math.round(h2 * 60);
|
|
56576
|
+
if (h2 < 0)
|
|
56577
|
+
h2 += 360;
|
|
56578
|
+
const s = max2 === 0 ? 0 : diff2 / max2 * 100;
|
|
56579
|
+
const v = max2 * 100;
|
|
56580
|
+
return { h: h2, s, v, a: rgb.a };
|
|
56581
|
+
};
|
|
56582
|
+
const hsvToRgb = (hsv2) => {
|
|
56583
|
+
const h2 = hsv2.h / 60;
|
|
56584
|
+
const s = hsv2.s / 100;
|
|
56585
|
+
const v = hsv2.v / 100;
|
|
56586
|
+
const c2 = v * s;
|
|
56587
|
+
const x = c2 * (1 - Math.abs(h2 % 2 - 1));
|
|
56588
|
+
const m = v - c2;
|
|
56589
|
+
let r2 = 0, g = 0, b = 0;
|
|
56590
|
+
if (h2 >= 0 && h2 < 1)
|
|
56591
|
+
[r2, g, b] = [c2, x, 0];
|
|
56592
|
+
else if (h2 >= 1 && h2 < 2)
|
|
56593
|
+
[r2, g, b] = [x, c2, 0];
|
|
56594
|
+
else if (h2 >= 2 && h2 < 3)
|
|
56595
|
+
[r2, g, b] = [0, c2, x];
|
|
56596
|
+
else if (h2 >= 3 && h2 < 4)
|
|
56597
|
+
[r2, g, b] = [0, x, c2];
|
|
56598
|
+
else if (h2 >= 4 && h2 < 5)
|
|
56599
|
+
[r2, g, b] = [x, 0, c2];
|
|
56600
|
+
else if (h2 >= 5 && h2 < 6)
|
|
56601
|
+
[r2, g, b] = [c2, 0, x];
|
|
56602
|
+
return {
|
|
56603
|
+
r: Math.round((r2 + m) * 255),
|
|
56604
|
+
g: Math.round((g + m) * 255),
|
|
56605
|
+
b: Math.round((b + m) * 255),
|
|
56606
|
+
a: hsv2.a
|
|
56607
|
+
};
|
|
56608
|
+
};
|
|
56609
|
+
const updateColor = useCallback((newHsv) => {
|
|
56610
|
+
setHsv(newHsv);
|
|
56611
|
+
const rgb = hsvToRgb(newHsv);
|
|
56612
|
+
const hex = rgbToHex(rgb.r, rgb.g, rgb.b);
|
|
56613
|
+
setCurrentColor(hex);
|
|
56614
|
+
setInputValue(hex);
|
|
56615
|
+
onChange?.(hex);
|
|
56616
|
+
}, [onChange]);
|
|
56617
|
+
useEffect(() => {
|
|
56618
|
+
const rgb = hexToRgb(currentColor);
|
|
56619
|
+
const newHsv = rgbToHsv(rgb);
|
|
56620
|
+
setHsv(newHsv);
|
|
56621
|
+
}, [currentColor]);
|
|
56622
|
+
const handleSaturationChange = useCallback((e) => {
|
|
56623
|
+
if (!saturationRef.current)
|
|
56624
|
+
return;
|
|
56625
|
+
const rect = saturationRef.current.getBoundingClientRect();
|
|
56626
|
+
const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));
|
|
56627
|
+
const y = Math.max(0, Math.min(rect.height, e.clientY - rect.top));
|
|
56628
|
+
const s = x / rect.width * 100;
|
|
56629
|
+
const v = 100 - y / rect.height * 100;
|
|
56630
|
+
updateColor({ ...hsv, s, v });
|
|
56631
|
+
}, [hsv, updateColor]);
|
|
56632
|
+
const handleHueChange = useCallback((e) => {
|
|
56633
|
+
if (!hueRef.current)
|
|
56634
|
+
return;
|
|
56635
|
+
const rect = hueRef.current.getBoundingClientRect();
|
|
56636
|
+
const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));
|
|
56637
|
+
const h2 = x / rect.width * 360;
|
|
56638
|
+
updateColor({ ...hsv, h: h2 });
|
|
56639
|
+
}, [hsv, updateColor]);
|
|
56640
|
+
const handleAlphaChange = useCallback((e) => {
|
|
56641
|
+
if (!alphaRef.current)
|
|
56642
|
+
return;
|
|
56643
|
+
const rect = alphaRef.current.getBoundingClientRect();
|
|
56644
|
+
const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));
|
|
56645
|
+
const a = x / rect.width;
|
|
56646
|
+
updateColor({ ...hsv, a });
|
|
56647
|
+
}, [hsv, updateColor]);
|
|
56648
|
+
const handleInputChange = (value2) => {
|
|
56649
|
+
setInputValue(value2);
|
|
56650
|
+
if (/^#[0-9A-F]{6}$/i.test(value2)) {
|
|
56651
|
+
setCurrentColor(value2);
|
|
56652
|
+
onChange?.(value2);
|
|
56653
|
+
}
|
|
56654
|
+
};
|
|
56655
|
+
const copyToClipboard = async () => {
|
|
56656
|
+
try {
|
|
56657
|
+
await navigator.clipboard.writeText(currentColor);
|
|
56658
|
+
setCopied(true);
|
|
56659
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
56660
|
+
} catch (err) {
|
|
56661
|
+
console.error("Failed to copy color:", err);
|
|
56662
|
+
}
|
|
56663
|
+
};
|
|
56664
|
+
const handlePresetClick = (color) => {
|
|
56665
|
+
setCurrentColor(color);
|
|
56666
|
+
setInputValue(color);
|
|
56667
|
+
onChange?.(color);
|
|
56668
|
+
};
|
|
56669
|
+
const resetColor = () => {
|
|
56670
|
+
setCurrentColor(value);
|
|
56671
|
+
setInputValue(value);
|
|
56672
|
+
onChange?.(value);
|
|
56673
|
+
};
|
|
56674
|
+
return /* @__PURE__ */ jsxs(Popover2, { children: [
|
|
56675
|
+
/* @__PURE__ */ jsx(PopoverTrigger2, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
56676
|
+
Button,
|
|
56677
|
+
{
|
|
56678
|
+
variant: "outline",
|
|
56679
|
+
className: cn(
|
|
56680
|
+
sizeClasses[size4],
|
|
56681
|
+
"p-1 border-2 border-muted-foreground/20 hover:border-muted-foreground/40",
|
|
56682
|
+
disabled && "opacity-50 cursor-not-allowed",
|
|
56683
|
+
className
|
|
56684
|
+
),
|
|
56685
|
+
disabled,
|
|
56686
|
+
children: /* @__PURE__ */ jsx(
|
|
56687
|
+
"div",
|
|
56688
|
+
{
|
|
56689
|
+
className: "w-full h-full rounded-sm",
|
|
56690
|
+
style: { backgroundColor: currentColor }
|
|
56691
|
+
}
|
|
56692
|
+
)
|
|
56693
|
+
}
|
|
56694
|
+
) }),
|
|
56695
|
+
/* @__PURE__ */ jsx(PopoverContent2, { className: "w-80 p-4", side: "bottom", align: "start", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
56696
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
56697
|
+
/* @__PURE__ */ jsx(Label2, { children: "Color" }),
|
|
56698
|
+
/* @__PURE__ */ jsx(
|
|
56699
|
+
"div",
|
|
56700
|
+
{
|
|
56701
|
+
ref: saturationRef,
|
|
56702
|
+
className: "relative w-full h-48 rounded-lg cursor-crosshair overflow-hidden",
|
|
56703
|
+
style: {
|
|
56704
|
+
background: `linear-gradient(to right, white, hsl(${hsv.h}, 100%, 50%)),
|
|
56705
|
+
linear-gradient(to top, black, transparent)`
|
|
56706
|
+
},
|
|
56707
|
+
onMouseDown: (e) => {
|
|
56708
|
+
setIsDragging("saturation");
|
|
56709
|
+
handleSaturationChange(e);
|
|
56710
|
+
},
|
|
56711
|
+
onMouseMove: (e) => isDragging === "saturation" && handleSaturationChange(e),
|
|
56712
|
+
children: /* @__PURE__ */ jsx(
|
|
56713
|
+
"div",
|
|
56714
|
+
{
|
|
56715
|
+
className: "absolute w-4 h-4 border-2 border-white rounded-full shadow-lg transform -translate-x-2 -translate-y-2 pointer-events-none",
|
|
56716
|
+
style: {
|
|
56717
|
+
left: `${hsv.s}%`,
|
|
56718
|
+
top: `${100 - hsv.v}%`
|
|
56719
|
+
}
|
|
56720
|
+
}
|
|
56721
|
+
)
|
|
56722
|
+
}
|
|
56723
|
+
)
|
|
56724
|
+
] }),
|
|
56725
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
56726
|
+
/* @__PURE__ */ jsx(Label2, { children: "Hue" }),
|
|
56727
|
+
/* @__PURE__ */ jsx(
|
|
56728
|
+
"div",
|
|
56729
|
+
{
|
|
56730
|
+
ref: hueRef,
|
|
56731
|
+
className: "relative w-full h-4 rounded-lg cursor-pointer",
|
|
56732
|
+
style: {
|
|
56733
|
+
background: "linear-gradient(to right, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000)"
|
|
56734
|
+
},
|
|
56735
|
+
onMouseDown: (e) => {
|
|
56736
|
+
setIsDragging("hue");
|
|
56737
|
+
handleHueChange(e);
|
|
56738
|
+
},
|
|
56739
|
+
onMouseMove: (e) => isDragging === "hue" && handleHueChange(e),
|
|
56740
|
+
children: /* @__PURE__ */ jsx(
|
|
56741
|
+
"div",
|
|
56742
|
+
{
|
|
56743
|
+
className: "absolute w-4 h-4 bg-white border-2 border-gray-300 rounded-full shadow-lg transform -translate-x-2 -translate-y-0 pointer-events-none",
|
|
56744
|
+
style: { left: `${hsv.h / 360 * 100}%` }
|
|
56745
|
+
}
|
|
56746
|
+
)
|
|
56747
|
+
}
|
|
56748
|
+
)
|
|
56749
|
+
] }),
|
|
56750
|
+
showAlpha && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
56751
|
+
/* @__PURE__ */ jsx(Label2, { children: "Opacity" }),
|
|
56752
|
+
/* @__PURE__ */ jsx(
|
|
56753
|
+
"div",
|
|
56754
|
+
{
|
|
56755
|
+
ref: alphaRef,
|
|
56756
|
+
className: "relative w-full h-4 rounded-lg cursor-pointer",
|
|
56757
|
+
style: {
|
|
56758
|
+
background: `linear-gradient(to right, transparent, ${currentColor}),
|
|
56759
|
+
repeating-linear-gradient(45deg, #ccc 0, #ccc 2px, #fff 2px, #fff 4px)`
|
|
56760
|
+
},
|
|
56761
|
+
onMouseDown: (e) => {
|
|
56762
|
+
setIsDragging("alpha");
|
|
56763
|
+
handleAlphaChange(e);
|
|
56764
|
+
},
|
|
56765
|
+
onMouseMove: (e) => isDragging === "alpha" && handleAlphaChange(e),
|
|
56766
|
+
children: /* @__PURE__ */ jsx(
|
|
56767
|
+
"div",
|
|
56768
|
+
{
|
|
56769
|
+
className: "absolute w-4 h-4 bg-white border-2 border-gray-300 rounded-full shadow-lg transform -translate-x-2 -translate-y-0 pointer-events-none",
|
|
56770
|
+
style: { left: `${hsv.a * 100}%` }
|
|
56771
|
+
}
|
|
56772
|
+
)
|
|
56773
|
+
}
|
|
56774
|
+
)
|
|
56775
|
+
] }),
|
|
56776
|
+
showInput && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
56777
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
|
|
56778
|
+
/* @__PURE__ */ jsx(Label2, { htmlFor: "color-input", children: "Hex" }),
|
|
56779
|
+
/* @__PURE__ */ jsx(
|
|
56780
|
+
Input,
|
|
56781
|
+
{
|
|
56782
|
+
id: "color-input",
|
|
56783
|
+
value: inputValue,
|
|
56784
|
+
onChange: (e) => handleInputChange(e.target.value),
|
|
56785
|
+
placeholder: "#000000",
|
|
56786
|
+
className: "font-mono"
|
|
56787
|
+
}
|
|
56788
|
+
)
|
|
56789
|
+
] }),
|
|
56790
|
+
showCopy && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
56791
|
+
/* @__PURE__ */ jsx(Label2, { children: "\xA0" }),
|
|
56792
|
+
/* @__PURE__ */ jsx(
|
|
56793
|
+
Button,
|
|
56794
|
+
{
|
|
56795
|
+
variant: "outline",
|
|
56796
|
+
size: "sm",
|
|
56797
|
+
onClick: copyToClipboard,
|
|
56798
|
+
className: "px-3",
|
|
56799
|
+
children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 text-green-500" }) : /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" })
|
|
56800
|
+
}
|
|
56801
|
+
)
|
|
56802
|
+
] }),
|
|
56803
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
56804
|
+
/* @__PURE__ */ jsx(Label2, { children: "\xA0" }),
|
|
56805
|
+
/* @__PURE__ */ jsx(
|
|
56806
|
+
Button,
|
|
56807
|
+
{
|
|
56808
|
+
variant: "outline",
|
|
56809
|
+
size: "sm",
|
|
56810
|
+
onClick: resetColor,
|
|
56811
|
+
className: "px-3",
|
|
56812
|
+
children: /* @__PURE__ */ jsx(RotateCcw, { className: "h-4 w-4" })
|
|
56813
|
+
}
|
|
56814
|
+
)
|
|
56815
|
+
] })
|
|
56816
|
+
] }),
|
|
56817
|
+
showPresets && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
56818
|
+
/* @__PURE__ */ jsx(Label2, { children: "Presets" }),
|
|
56819
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-8 gap-2", children: presetColors.map((color, index2) => /* @__PURE__ */ jsx(
|
|
56820
|
+
motion.button,
|
|
56821
|
+
{
|
|
56822
|
+
className: "w-8 h-8 rounded-md border-2 border-muted-foreground/20 hover:border-muted-foreground/40 transition-colors",
|
|
56823
|
+
style: { backgroundColor: color },
|
|
56824
|
+
onClick: () => handlePresetClick(color),
|
|
56825
|
+
whileHover: { scale: 1.1 },
|
|
56826
|
+
whileTap: { scale: 0.95 },
|
|
56827
|
+
initial: { opacity: 0, scale: 0 },
|
|
56828
|
+
animate: { opacity: 1, scale: 1 },
|
|
56829
|
+
transition: { delay: index2 * 0.02 }
|
|
56830
|
+
},
|
|
56831
|
+
color
|
|
56832
|
+
)) })
|
|
56833
|
+
] })
|
|
56834
|
+
] }) })
|
|
56835
|
+
] });
|
|
56836
|
+
};
|
|
56837
|
+
var ColorPicker2 = ({ className, ...props }) => {
|
|
56838
|
+
const docsProAccess = { hasAccess: true };
|
|
56839
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
56840
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
56841
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
56842
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
56843
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
56844
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
56845
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Color Picker is available exclusively to MoonUI Pro subscribers." }),
|
|
56846
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
56847
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
56848
|
+
"Upgrade to Pro"
|
|
56849
|
+
] }) })
|
|
56850
|
+
] })
|
|
56851
|
+
] }) }) });
|
|
56852
|
+
}
|
|
56853
|
+
return /* @__PURE__ */ jsx(ColorPickerInternal, { className, ...props });
|
|
56854
|
+
};
|
|
56855
|
+
var GitHubStarsInternal = ({
|
|
56856
|
+
username,
|
|
56857
|
+
repositories,
|
|
56858
|
+
showDescription = true,
|
|
56859
|
+
showTopics = true,
|
|
56860
|
+
showStats = true,
|
|
56861
|
+
showOwner = true,
|
|
56862
|
+
sortBy = "stars",
|
|
56863
|
+
layout = "grid",
|
|
56864
|
+
maxItems = 6,
|
|
56865
|
+
autoRefresh = false,
|
|
56866
|
+
refreshInterval = 3e5,
|
|
56867
|
+
// 5 minutes
|
|
56868
|
+
className,
|
|
56869
|
+
onRepositoryClick
|
|
56870
|
+
}) => {
|
|
56871
|
+
const [repos, setRepos] = useState([]);
|
|
56872
|
+
const [loading, setLoading] = useState(true);
|
|
56873
|
+
const [error, setError] = useState(null);
|
|
56874
|
+
const [lastUpdated, setLastUpdated] = useState(null);
|
|
56875
|
+
const fetchRepositories = async () => {
|
|
56876
|
+
try {
|
|
56877
|
+
setLoading(true);
|
|
56878
|
+
setError(null);
|
|
56879
|
+
let url = `https://api.github.com/users/${username}/repos?sort=${sortBy}&per_page=100`;
|
|
56880
|
+
const response = await fetch(url);
|
|
56881
|
+
if (!response.ok) {
|
|
56882
|
+
throw new Error(`GitHub API error: ${response.status}`);
|
|
56883
|
+
}
|
|
56884
|
+
let data = await response.json();
|
|
56885
|
+
if (repositories && repositories.length > 0) {
|
|
56886
|
+
data = data.filter((repo) => repositories.includes(repo.name));
|
|
56887
|
+
}
|
|
56888
|
+
data.sort((a, b) => {
|
|
56889
|
+
switch (sortBy) {
|
|
56890
|
+
case "stars":
|
|
56891
|
+
return b.stargazers_count - a.stargazers_count;
|
|
56892
|
+
case "forks":
|
|
56893
|
+
return b.forks_count - a.forks_count;
|
|
56894
|
+
case "updated":
|
|
56895
|
+
return new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime();
|
|
56896
|
+
case "created":
|
|
56897
|
+
return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();
|
|
56898
|
+
default:
|
|
56899
|
+
return 0;
|
|
56900
|
+
}
|
|
56901
|
+
});
|
|
56902
|
+
if (maxItems) {
|
|
56903
|
+
data = data.slice(0, maxItems);
|
|
56904
|
+
}
|
|
56905
|
+
setRepos(data);
|
|
56906
|
+
setLastUpdated(/* @__PURE__ */ new Date());
|
|
56907
|
+
} catch (err) {
|
|
56908
|
+
setError(err instanceof Error ? err.message : "Failed to fetch repositories");
|
|
56909
|
+
} finally {
|
|
56910
|
+
setLoading(false);
|
|
56911
|
+
}
|
|
56912
|
+
};
|
|
56913
|
+
useEffect(() => {
|
|
56914
|
+
fetchRepositories();
|
|
56915
|
+
}, [username, repositories, sortBy, maxItems]);
|
|
56916
|
+
useEffect(() => {
|
|
56917
|
+
if (!autoRefresh)
|
|
56918
|
+
return;
|
|
56919
|
+
const interval = setInterval(fetchRepositories, refreshInterval);
|
|
56920
|
+
return () => clearInterval(interval);
|
|
56921
|
+
}, [autoRefresh, refreshInterval]);
|
|
56922
|
+
const formatNumber = (num) => {
|
|
56923
|
+
if (num >= 1e3) {
|
|
56924
|
+
return (num / 1e3).toFixed(1) + "k";
|
|
56925
|
+
}
|
|
56926
|
+
return num.toString();
|
|
56927
|
+
};
|
|
56928
|
+
const formatDate = (dateString) => {
|
|
56929
|
+
const date = new Date(dateString);
|
|
56930
|
+
return date.toLocaleDateString("en-US", {
|
|
56931
|
+
year: "numeric",
|
|
56932
|
+
month: "short",
|
|
56933
|
+
day: "numeric"
|
|
56934
|
+
});
|
|
56935
|
+
};
|
|
56936
|
+
const getLanguageColor = (language) => {
|
|
56937
|
+
const colors = {
|
|
56938
|
+
JavaScript: "#f7df1e",
|
|
56939
|
+
TypeScript: "#3178c6",
|
|
56940
|
+
Python: "#3776ab",
|
|
56941
|
+
Java: "#ed8b00",
|
|
56942
|
+
"C++": "#00599c",
|
|
56943
|
+
"C#": "#239120",
|
|
56944
|
+
Go: "#00add8",
|
|
56945
|
+
Rust: "#000000",
|
|
56946
|
+
Swift: "#fa7343",
|
|
56947
|
+
Kotlin: "#7f52ff",
|
|
56948
|
+
PHP: "#777bb4",
|
|
56949
|
+
Ruby: "#cc342d",
|
|
56950
|
+
HTML: "#e34f26",
|
|
56951
|
+
CSS: "#1572b6",
|
|
56952
|
+
Vue: "#4fc08d",
|
|
56953
|
+
React: "#61dafb"
|
|
56954
|
+
};
|
|
56955
|
+
return colors[language || ""] || "#6b7280";
|
|
56956
|
+
};
|
|
56957
|
+
if (loading) {
|
|
56958
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-full", className), children: /* @__PURE__ */ jsx(CardContent, { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
56959
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
56960
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-48" }),
|
|
56961
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-20" })
|
|
56962
|
+
] }),
|
|
56963
|
+
/* @__PURE__ */ jsx("div", { className: cn(
|
|
56964
|
+
layout === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" : "space-y-4"
|
|
56965
|
+
), children: Array.from({ length: maxItems || 6 }).map((_, index2) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { className: "p-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
56966
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-3/4" }),
|
|
56967
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
|
|
56968
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-2/3" }),
|
|
56969
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
56970
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-16" }),
|
|
56971
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-16" }),
|
|
56972
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-16" })
|
|
56973
|
+
] })
|
|
56974
|
+
] }) }) }, index2)) })
|
|
56975
|
+
] }) }) });
|
|
56976
|
+
}
|
|
56977
|
+
if (error) {
|
|
56978
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-full", className), children: /* @__PURE__ */ jsx(CardContent, { className: "p-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
56979
|
+
/* @__PURE__ */ jsxs("div", { className: "text-destructive", children: [
|
|
56980
|
+
/* @__PURE__ */ jsx(Github, { className: "h-12 w-12 mx-auto mb-2" }),
|
|
56981
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold", children: "Failed to load repositories" }),
|
|
56982
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: error })
|
|
56983
|
+
] }),
|
|
56984
|
+
/* @__PURE__ */ jsxs(Button, { onClick: fetchRepositories, variant: "outline", children: [
|
|
56985
|
+
/* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4 mr-2" }),
|
|
56986
|
+
"Try Again"
|
|
56987
|
+
] })
|
|
56988
|
+
] }) }) });
|
|
56989
|
+
}
|
|
56990
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-full", className), children: /* @__PURE__ */ jsx(CardContent, { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
56991
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
56992
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
56993
|
+
/* @__PURE__ */ jsx(Github, { className: "h-6 w-6" }),
|
|
56994
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
56995
|
+
/* @__PURE__ */ jsxs("h3", { className: "font-semibold text-lg", children: [
|
|
56996
|
+
username,
|
|
56997
|
+
"'s Repositories"
|
|
56998
|
+
] }),
|
|
56999
|
+
lastUpdated && /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
57000
|
+
"Last updated: ",
|
|
57001
|
+
lastUpdated.toLocaleTimeString()
|
|
57002
|
+
] })
|
|
57003
|
+
] })
|
|
57004
|
+
] }),
|
|
57005
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
57006
|
+
/* @__PURE__ */ jsxs(Badge, { variant: "outline", children: [
|
|
57007
|
+
repos.length,
|
|
57008
|
+
" repos"
|
|
57009
|
+
] }),
|
|
57010
|
+
autoRefresh && /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: "Auto-refresh" }),
|
|
57011
|
+
/* @__PURE__ */ jsx(Button, { onClick: fetchRepositories, variant: "outline", size: "sm", children: /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }) })
|
|
57012
|
+
] })
|
|
57013
|
+
] }),
|
|
57014
|
+
/* @__PURE__ */ jsx("div", { className: cn(
|
|
57015
|
+
layout === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" : "space-y-4"
|
|
57016
|
+
), children: /* @__PURE__ */ jsx(AnimatePresence, { children: repos.map((repo, index2) => /* @__PURE__ */ jsx(
|
|
57017
|
+
motion.div,
|
|
57018
|
+
{
|
|
57019
|
+
initial: { opacity: 0, y: 20 },
|
|
57020
|
+
animate: { opacity: 1, y: 0 },
|
|
57021
|
+
exit: { opacity: 0, y: -20 },
|
|
57022
|
+
transition: { delay: index2 * 0.1 },
|
|
57023
|
+
children: /* @__PURE__ */ jsx(
|
|
57024
|
+
Card,
|
|
57025
|
+
{
|
|
57026
|
+
className: "h-full hover:shadow-md transition-shadow cursor-pointer group",
|
|
57027
|
+
onClick: () => onRepositoryClick?.(repo),
|
|
57028
|
+
children: /* @__PURE__ */ jsx(CardContent, { className: "p-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
57029
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
|
|
57030
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
57031
|
+
/* @__PURE__ */ jsx("h4", { className: "font-semibold text-sm group-hover:text-primary transition-colors", children: repo.name }),
|
|
57032
|
+
showOwner && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground truncate", children: repo.owner.login })
|
|
57033
|
+
] }),
|
|
57034
|
+
/* @__PURE__ */ jsx(
|
|
57035
|
+
Button,
|
|
57036
|
+
{
|
|
57037
|
+
variant: "ghost",
|
|
57038
|
+
size: "sm",
|
|
57039
|
+
className: "opacity-0 group-hover:opacity-100 transition-opacity p-1 h-auto",
|
|
57040
|
+
onClick: (e) => {
|
|
57041
|
+
e.stopPropagation();
|
|
57042
|
+
window.open(repo.html_url, "_blank");
|
|
57043
|
+
},
|
|
57044
|
+
children: /* @__PURE__ */ jsx(ExternalLink, { className: "h-3 w-3" })
|
|
57045
|
+
}
|
|
57046
|
+
)
|
|
57047
|
+
] }),
|
|
57048
|
+
showDescription && repo.description && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground line-clamp-2", children: repo.description }),
|
|
57049
|
+
showTopics && repo.topics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1", children: [
|
|
57050
|
+
repo.topics.slice(0, 3).map((topic) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: topic }, topic)),
|
|
57051
|
+
repo.topics.length > 3 && /* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "text-xs", children: [
|
|
57052
|
+
"+",
|
|
57053
|
+
repo.topics.length - 3
|
|
57054
|
+
] })
|
|
57055
|
+
] }),
|
|
57056
|
+
showStats && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 text-sm text-muted-foreground", children: [
|
|
57057
|
+
repo.language && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
57058
|
+
/* @__PURE__ */ jsx(
|
|
57059
|
+
"div",
|
|
57060
|
+
{
|
|
57061
|
+
className: "w-3 h-3 rounded-full",
|
|
57062
|
+
style: { backgroundColor: getLanguageColor(repo.language) }
|
|
57063
|
+
}
|
|
57064
|
+
),
|
|
57065
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs", children: repo.language })
|
|
57066
|
+
] }),
|
|
57067
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
57068
|
+
/* @__PURE__ */ jsx(Star, { className: "h-3 w-3" }),
|
|
57069
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs", children: formatNumber(repo.stargazers_count) })
|
|
57070
|
+
] }),
|
|
57071
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
57072
|
+
/* @__PURE__ */ jsx(GitFork, { className: "h-3 w-3" }),
|
|
57073
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs", children: formatNumber(repo.forks_count) })
|
|
57074
|
+
] })
|
|
57075
|
+
] }),
|
|
57076
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
|
|
57077
|
+
"Updated ",
|
|
57078
|
+
formatDate(repo.updated_at)
|
|
57079
|
+
] })
|
|
57080
|
+
] }) })
|
|
57081
|
+
}
|
|
57082
|
+
)
|
|
57083
|
+
},
|
|
57084
|
+
repo.id
|
|
57085
|
+
)) }) }),
|
|
57086
|
+
repos.length === 0 && /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
57087
|
+
/* @__PURE__ */ jsx(Github, { className: "h-12 w-12 mx-auto mb-4 text-muted-foreground" }),
|
|
57088
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No repositories found" })
|
|
57089
|
+
] })
|
|
57090
|
+
] }) }) });
|
|
57091
|
+
};
|
|
57092
|
+
var GitHubStars = ({ className, ...props }) => {
|
|
57093
|
+
const docsProAccess = { hasAccess: true };
|
|
57094
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
57095
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
57096
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
57097
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
57098
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57099
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
57100
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "GitHub Stars is available exclusively to MoonUI Pro subscribers." }),
|
|
57101
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
57102
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
57103
|
+
"Upgrade to Pro"
|
|
57104
|
+
] }) })
|
|
57105
|
+
] })
|
|
57106
|
+
] }) }) });
|
|
57107
|
+
}
|
|
57108
|
+
return /* @__PURE__ */ jsx(GitHubStarsInternal, { className, ...props });
|
|
57109
|
+
};
|
|
57110
|
+
var HealthCheckInternal = ({
|
|
57111
|
+
endpoints,
|
|
57112
|
+
interval = 3e4,
|
|
57113
|
+
// 30 seconds
|
|
57114
|
+
autoRefresh = true,
|
|
57115
|
+
showResponseTime = true,
|
|
57116
|
+
showUptime = true,
|
|
57117
|
+
showHistory = true,
|
|
57118
|
+
maxHistory = 20,
|
|
57119
|
+
onStatusChange,
|
|
57120
|
+
className
|
|
57121
|
+
}) => {
|
|
57122
|
+
const [results, setResults] = useState([]);
|
|
57123
|
+
const [history2, setHistory] = useState({});
|
|
57124
|
+
const [isChecking, setIsChecking] = useState(false);
|
|
57125
|
+
const [lastCheck, setLastCheck] = useState(null);
|
|
57126
|
+
const checkEndpoint = async (endpoint) => {
|
|
57127
|
+
const startTime = Date.now();
|
|
57128
|
+
try {
|
|
57129
|
+
const controller = new AbortController();
|
|
57130
|
+
const timeoutId = setTimeout(() => controller.abort(), endpoint.timeout || 5e3);
|
|
57131
|
+
const response = await fetch(endpoint.url, {
|
|
57132
|
+
method: endpoint.method,
|
|
57133
|
+
headers: {
|
|
57134
|
+
"Content-Type": "application/json",
|
|
57135
|
+
...endpoint.headers
|
|
57136
|
+
},
|
|
57137
|
+
body: endpoint.body,
|
|
57138
|
+
signal: controller.signal
|
|
57139
|
+
});
|
|
57140
|
+
clearTimeout(timeoutId);
|
|
57141
|
+
const responseTime = Date.now() - startTime;
|
|
57142
|
+
const expectedStatuses = endpoint.expectedStatus || [200, 201, 204];
|
|
57143
|
+
const isHealthy = expectedStatuses.includes(response.status);
|
|
57144
|
+
return {
|
|
57145
|
+
id: endpoint.id,
|
|
57146
|
+
name: endpoint.name,
|
|
57147
|
+
status: isHealthy ? "healthy" : "unhealthy",
|
|
57148
|
+
responseTime,
|
|
57149
|
+
statusCode: response.status,
|
|
57150
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
57151
|
+
};
|
|
57152
|
+
} catch (error) {
|
|
57153
|
+
const responseTime = Date.now() - startTime;
|
|
57154
|
+
return {
|
|
57155
|
+
id: endpoint.id,
|
|
57156
|
+
name: endpoint.name,
|
|
57157
|
+
status: "unhealthy",
|
|
57158
|
+
responseTime,
|
|
57159
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
57160
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
57161
|
+
};
|
|
57162
|
+
}
|
|
57163
|
+
};
|
|
57164
|
+
const checkAllEndpoints = useCallback(async () => {
|
|
57165
|
+
setIsChecking(true);
|
|
57166
|
+
try {
|
|
57167
|
+
const checks = endpoints.map((endpoint) => checkEndpoint(endpoint));
|
|
57168
|
+
const newResults = await Promise.all(checks);
|
|
57169
|
+
setResults(newResults);
|
|
57170
|
+
setLastCheck(/* @__PURE__ */ new Date());
|
|
57171
|
+
setHistory((prevHistory) => {
|
|
57172
|
+
const newHistory = { ...prevHistory };
|
|
57173
|
+
newResults.forEach((result) => {
|
|
57174
|
+
if (!newHistory[result.id]) {
|
|
57175
|
+
newHistory[result.id] = [];
|
|
57176
|
+
}
|
|
57177
|
+
newHistory[result.id] = [
|
|
57178
|
+
result,
|
|
57179
|
+
...newHistory[result.id].slice(0, maxHistory - 1)
|
|
57180
|
+
];
|
|
57181
|
+
});
|
|
57182
|
+
return newHistory;
|
|
57183
|
+
});
|
|
57184
|
+
onStatusChange?.(newResults);
|
|
57185
|
+
} catch (error) {
|
|
57186
|
+
console.error("Health check failed:", error);
|
|
57187
|
+
} finally {
|
|
57188
|
+
setIsChecking(false);
|
|
57189
|
+
}
|
|
57190
|
+
}, [endpoints, maxHistory, onStatusChange]);
|
|
57191
|
+
useEffect(() => {
|
|
57192
|
+
checkAllEndpoints();
|
|
57193
|
+
}, [checkAllEndpoints]);
|
|
57194
|
+
useEffect(() => {
|
|
57195
|
+
if (!autoRefresh)
|
|
57196
|
+
return;
|
|
57197
|
+
const intervalId = setInterval(checkAllEndpoints, interval);
|
|
57198
|
+
return () => clearInterval(intervalId);
|
|
57199
|
+
}, [autoRefresh, interval, checkAllEndpoints]);
|
|
57200
|
+
const getOverallStatus = () => {
|
|
57201
|
+
if (results.length === 0)
|
|
57202
|
+
return "warning";
|
|
57203
|
+
const criticalEndpoints = endpoints.filter((e) => e.critical !== false);
|
|
57204
|
+
const criticalResults = results.filter(
|
|
57205
|
+
(r2) => criticalEndpoints.some((e) => e.id === r2.id)
|
|
57206
|
+
);
|
|
57207
|
+
const hasUnhealthy = criticalResults.some((r2) => r2.status === "unhealthy");
|
|
57208
|
+
const hasWarning = results.some((r2) => r2.status === "warning");
|
|
57209
|
+
if (hasUnhealthy)
|
|
57210
|
+
return "unhealthy";
|
|
57211
|
+
if (hasWarning)
|
|
57212
|
+
return "warning";
|
|
57213
|
+
return "healthy";
|
|
57214
|
+
};
|
|
57215
|
+
const getStatusIcon = (status) => {
|
|
57216
|
+
switch (status) {
|
|
57217
|
+
case "healthy":
|
|
57218
|
+
return /* @__PURE__ */ jsx(CheckCircle, { className: "h-4 w-4 text-green-500" });
|
|
57219
|
+
case "unhealthy":
|
|
57220
|
+
return /* @__PURE__ */ jsx(XCircle, { className: "h-4 w-4 text-red-500" });
|
|
57221
|
+
case "warning":
|
|
57222
|
+
return /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4 text-yellow-500" });
|
|
57223
|
+
default:
|
|
57224
|
+
return /* @__PURE__ */ jsx(Clock, { className: "h-4 w-4 text-gray-500" });
|
|
57225
|
+
}
|
|
57226
|
+
};
|
|
57227
|
+
const getStatusColor = (status) => {
|
|
57228
|
+
switch (status) {
|
|
57229
|
+
case "healthy":
|
|
57230
|
+
return "bg-green-500";
|
|
57231
|
+
case "unhealthy":
|
|
57232
|
+
return "bg-red-500";
|
|
57233
|
+
case "warning":
|
|
57234
|
+
return "bg-yellow-500";
|
|
57235
|
+
default:
|
|
57236
|
+
return "bg-gray-500";
|
|
57237
|
+
}
|
|
57238
|
+
};
|
|
57239
|
+
const formatResponseTime = (time) => {
|
|
57240
|
+
if (time < 1e3)
|
|
57241
|
+
return `${time}ms`;
|
|
57242
|
+
return `${(time / 1e3).toFixed(2)}s`;
|
|
57243
|
+
};
|
|
57244
|
+
const calculateUptime = (endpointId) => {
|
|
57245
|
+
const endpointHistory = history2[endpointId] || [];
|
|
57246
|
+
if (endpointHistory.length === 0)
|
|
57247
|
+
return 0;
|
|
57248
|
+
const healthyCount2 = endpointHistory.filter((r2) => r2.status === "healthy").length;
|
|
57249
|
+
return healthyCount2 / endpointHistory.length * 100;
|
|
57250
|
+
};
|
|
57251
|
+
const overallStatus = getOverallStatus();
|
|
57252
|
+
const healthyCount = results.filter((r2) => r2.status === "healthy").length;
|
|
57253
|
+
const overallUptime = results.length > 0 ? results.reduce((acc, result) => acc + calculateUptime(result.id), 0) / results.length : 0;
|
|
57254
|
+
return /* @__PURE__ */ jsxs(Card, { className: cn("w-full", className), children: [
|
|
57255
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
57256
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
57257
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
57258
|
+
/* @__PURE__ */ jsx(Activity, { className: "h-6 w-6" }),
|
|
57259
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57260
|
+
/* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
|
|
57261
|
+
"System Health",
|
|
57262
|
+
/* @__PURE__ */ jsx(
|
|
57263
|
+
Badge,
|
|
57264
|
+
{
|
|
57265
|
+
variant: overallStatus === "healthy" ? "default" : "destructive",
|
|
57266
|
+
className: cn(
|
|
57267
|
+
"text-white",
|
|
57268
|
+
overallStatus === "healthy" && "bg-green-500",
|
|
57269
|
+
overallStatus === "warning" && "bg-yellow-500",
|
|
57270
|
+
overallStatus === "unhealthy" && "bg-red-500"
|
|
57271
|
+
),
|
|
57272
|
+
children: overallStatus.toUpperCase()
|
|
57273
|
+
}
|
|
57274
|
+
)
|
|
57275
|
+
] }),
|
|
57276
|
+
lastCheck && /* @__PURE__ */ jsxs(CardDescription, { children: [
|
|
57277
|
+
"Last checked: ",
|
|
57278
|
+
lastCheck.toLocaleTimeString()
|
|
57279
|
+
] })
|
|
57280
|
+
] })
|
|
57281
|
+
] }) }),
|
|
57282
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
57283
|
+
showUptime && /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
|
|
57284
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm font-medium", children: [
|
|
57285
|
+
overallUptime.toFixed(1),
|
|
57286
|
+
"%"
|
|
57287
|
+
] }),
|
|
57288
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Uptime" })
|
|
57289
|
+
] }),
|
|
57290
|
+
/* @__PURE__ */ jsx(
|
|
57291
|
+
Button,
|
|
57292
|
+
{
|
|
57293
|
+
onClick: checkAllEndpoints,
|
|
57294
|
+
disabled: isChecking,
|
|
57295
|
+
variant: "outline",
|
|
57296
|
+
size: "sm",
|
|
57297
|
+
children: /* @__PURE__ */ jsx(RefreshCw, { className: cn("h-4 w-4", isChecking && "animate-spin") })
|
|
57298
|
+
}
|
|
57299
|
+
)
|
|
57300
|
+
] })
|
|
57301
|
+
] }),
|
|
57302
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4 mt-4", children: [
|
|
57303
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
57304
|
+
/* @__PURE__ */ jsx("div", { className: "text-2xl font-bold text-green-500", children: healthyCount }),
|
|
57305
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Healthy" })
|
|
57306
|
+
] }),
|
|
57307
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
57308
|
+
/* @__PURE__ */ jsx("div", { className: "text-2xl font-bold text-red-500", children: results.filter((r2) => r2.status === "unhealthy").length }),
|
|
57309
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Unhealthy" })
|
|
57310
|
+
] }),
|
|
57311
|
+
showResponseTime && /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
57312
|
+
/* @__PURE__ */ jsx("div", { className: "text-lg font-bold", children: results.length > 0 ? formatResponseTime(
|
|
57313
|
+
results.reduce((acc, r2) => acc + r2.responseTime, 0) / results.length
|
|
57314
|
+
) : "0ms" }),
|
|
57315
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Avg Response" })
|
|
57316
|
+
] }),
|
|
57317
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
57318
|
+
/* @__PURE__ */ jsx("div", { className: "text-lg font-bold", children: results.length }),
|
|
57319
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Services" })
|
|
57320
|
+
] })
|
|
57321
|
+
] })
|
|
57322
|
+
] }),
|
|
57323
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
57324
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: results.map((result, index2) => /* @__PURE__ */ jsx(
|
|
57325
|
+
motion.div,
|
|
57326
|
+
{
|
|
57327
|
+
initial: { opacity: 0, x: -20 },
|
|
57328
|
+
animate: { opacity: 1, x: 0 },
|
|
57329
|
+
exit: { opacity: 0, x: 20 },
|
|
57330
|
+
transition: { delay: index2 * 0.05 },
|
|
57331
|
+
children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
57332
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
57333
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
57334
|
+
getStatusIcon(result.status),
|
|
57335
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57336
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium", children: result.name }),
|
|
57337
|
+
result.error && /* @__PURE__ */ jsx("div", { className: "text-sm text-red-500", children: result.error }),
|
|
57338
|
+
result.statusCode && /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
|
|
57339
|
+
"HTTP ",
|
|
57340
|
+
result.statusCode
|
|
57341
|
+
] })
|
|
57342
|
+
] })
|
|
57343
|
+
] }),
|
|
57344
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 text-sm", children: [
|
|
57345
|
+
showResponseTime && /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
|
|
57346
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium", children: formatResponseTime(result.responseTime) }),
|
|
57347
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Response" })
|
|
57348
|
+
] }),
|
|
57349
|
+
showUptime && /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
|
|
57350
|
+
/* @__PURE__ */ jsxs("div", { className: "font-medium", children: [
|
|
57351
|
+
calculateUptime(result.id).toFixed(1),
|
|
57352
|
+
"%"
|
|
57353
|
+
] }),
|
|
57354
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Uptime" })
|
|
57355
|
+
] })
|
|
57356
|
+
] })
|
|
57357
|
+
] }),
|
|
57358
|
+
showHistory && history2[result.id] && /* @__PURE__ */ jsxs("div", { className: "mt-3", children: [
|
|
57359
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1 h-2", children: history2[result.id].slice(0, 20).reverse().map((historyResult, i) => /* @__PURE__ */ jsx(
|
|
57360
|
+
"div",
|
|
57361
|
+
{
|
|
57362
|
+
className: cn(
|
|
57363
|
+
"flex-1 h-full rounded-sm",
|
|
57364
|
+
getStatusColor(historyResult.status)
|
|
57365
|
+
)
|
|
57366
|
+
},
|
|
57367
|
+
i
|
|
57368
|
+
)) }),
|
|
57369
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: [
|
|
57370
|
+
"Last ",
|
|
57371
|
+
Math.min(history2[result.id].length, 20),
|
|
57372
|
+
" checks"
|
|
57373
|
+
] })
|
|
57374
|
+
] })
|
|
57375
|
+
] }) })
|
|
57376
|
+
},
|
|
57377
|
+
result.id
|
|
57378
|
+
)) }),
|
|
57379
|
+
results.length === 0 && !isChecking && /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
57380
|
+
/* @__PURE__ */ jsx(Server, { className: "h-12 w-12 mx-auto mb-4 text-muted-foreground" }),
|
|
57381
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No endpoints configured" })
|
|
57382
|
+
] })
|
|
57383
|
+
] }) })
|
|
57384
|
+
] });
|
|
57385
|
+
};
|
|
57386
|
+
var HealthCheck = ({ className, ...props }) => {
|
|
57387
|
+
const docsProAccess = { hasAccess: true };
|
|
57388
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
57389
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
57390
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
57391
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
57392
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57393
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
57394
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Health Check is available exclusively to MoonUI Pro subscribers." }),
|
|
57395
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
57396
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
57397
|
+
"Upgrade to Pro"
|
|
57398
|
+
] }) })
|
|
57399
|
+
] })
|
|
57400
|
+
] }) }) });
|
|
57401
|
+
}
|
|
57402
|
+
return /* @__PURE__ */ jsx(HealthCheckInternal, { className, ...props });
|
|
57403
|
+
};
|
|
57404
|
+
var LazyComponentInternal = ({
|
|
57405
|
+
children,
|
|
57406
|
+
fallback,
|
|
57407
|
+
threshold = 0.1,
|
|
57408
|
+
rootMargin = "50px",
|
|
57409
|
+
triggerOnce = true,
|
|
57410
|
+
disabled = false,
|
|
57411
|
+
onLoad,
|
|
57412
|
+
onVisible,
|
|
57413
|
+
showLoadingState = true,
|
|
57414
|
+
delay = 0,
|
|
57415
|
+
className
|
|
57416
|
+
}) => {
|
|
57417
|
+
const [isVisible, setIsVisible] = useState(disabled);
|
|
57418
|
+
const [isLoaded, setIsLoaded] = useState(disabled);
|
|
57419
|
+
const [hasTriggered, setHasTriggered] = useState(false);
|
|
57420
|
+
const containerRef = useRef(null);
|
|
57421
|
+
useEffect(() => {
|
|
57422
|
+
if (disabled) {
|
|
57423
|
+
setIsVisible(true);
|
|
57424
|
+
setIsLoaded(true);
|
|
57425
|
+
return;
|
|
57426
|
+
}
|
|
57427
|
+
const observer = new IntersectionObserver(
|
|
57428
|
+
([entry]) => {
|
|
57429
|
+
if (entry.isIntersecting && (!triggerOnce || !hasTriggered)) {
|
|
57430
|
+
if (delay > 0) {
|
|
57431
|
+
setTimeout(() => {
|
|
57432
|
+
setIsVisible(true);
|
|
57433
|
+
setHasTriggered(true);
|
|
57434
|
+
onVisible?.();
|
|
57435
|
+
setTimeout(() => {
|
|
57436
|
+
setIsLoaded(true);
|
|
57437
|
+
onLoad?.();
|
|
57438
|
+
}, delay);
|
|
57439
|
+
}, 100);
|
|
57440
|
+
} else {
|
|
57441
|
+
setIsVisible(true);
|
|
57442
|
+
setIsLoaded(true);
|
|
57443
|
+
setHasTriggered(true);
|
|
57444
|
+
onVisible?.();
|
|
57445
|
+
onLoad?.();
|
|
57446
|
+
}
|
|
57447
|
+
} else if (!entry.isIntersecting && !triggerOnce) {
|
|
57448
|
+
setIsVisible(false);
|
|
57449
|
+
setIsLoaded(false);
|
|
57450
|
+
}
|
|
57451
|
+
},
|
|
57452
|
+
{
|
|
57453
|
+
threshold,
|
|
57454
|
+
rootMargin
|
|
57455
|
+
}
|
|
57456
|
+
);
|
|
57457
|
+
if (containerRef.current) {
|
|
57458
|
+
observer.observe(containerRef.current);
|
|
57459
|
+
}
|
|
57460
|
+
return () => {
|
|
57461
|
+
if (containerRef.current) {
|
|
57462
|
+
observer.unobserve(containerRef.current);
|
|
57463
|
+
}
|
|
57464
|
+
};
|
|
57465
|
+
}, [threshold, rootMargin, triggerOnce, delay, disabled, hasTriggered, onLoad, onVisible]);
|
|
57466
|
+
const renderFallback = () => {
|
|
57467
|
+
if (fallback) {
|
|
57468
|
+
return fallback;
|
|
57469
|
+
}
|
|
57470
|
+
if (showLoadingState) {
|
|
57471
|
+
return /* @__PURE__ */ jsx(
|
|
57472
|
+
motion.div,
|
|
57473
|
+
{
|
|
57474
|
+
initial: { opacity: 0 },
|
|
57475
|
+
animate: { opacity: 1 },
|
|
57476
|
+
className: "flex items-center justify-center p-8",
|
|
57477
|
+
children: /* @__PURE__ */ jsxs("div", { className: "text-center space-y-2", children: [
|
|
57478
|
+
delay > 0 && isVisible && !isLoaded ? /* @__PURE__ */ jsx(Loader2, { className: "h-6 w-6 animate-spin mx-auto text-muted-foreground" }) : /* @__PURE__ */ jsx(Eye, { className: "h-6 w-6 mx-auto text-muted-foreground" }),
|
|
57479
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: isVisible && !isLoaded ? "Loading..." : "Scroll to load content" })
|
|
57480
|
+
] })
|
|
57481
|
+
}
|
|
57482
|
+
);
|
|
57483
|
+
}
|
|
57484
|
+
return /* @__PURE__ */ jsx(Skeleton, { className: "w-full h-32" });
|
|
57485
|
+
};
|
|
57486
|
+
return /* @__PURE__ */ jsx("div", { ref: containerRef, className: cn("w-full", className), children: isLoaded ? /* @__PURE__ */ jsx(
|
|
57487
|
+
motion.div,
|
|
57488
|
+
{
|
|
57489
|
+
initial: { opacity: 0, y: 20 },
|
|
57490
|
+
animate: { opacity: 1, y: 0 },
|
|
57491
|
+
transition: { duration: 0.3 },
|
|
57492
|
+
children
|
|
57493
|
+
}
|
|
57494
|
+
) : renderFallback() });
|
|
57495
|
+
};
|
|
57496
|
+
var LazyImage = ({
|
|
57497
|
+
src,
|
|
57498
|
+
alt,
|
|
57499
|
+
fallbackSrc,
|
|
57500
|
+
showPlaceholder = true,
|
|
57501
|
+
threshold = 0.1,
|
|
57502
|
+
rootMargin = "50px",
|
|
57503
|
+
onLoad,
|
|
57504
|
+
onError,
|
|
57505
|
+
className,
|
|
57506
|
+
...props
|
|
57507
|
+
}) => {
|
|
57508
|
+
const [imageSrc, setImageSrc] = useState(null);
|
|
57509
|
+
const [imageError, setImageError] = useState(false);
|
|
57510
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
57511
|
+
const imgRef = useRef(null);
|
|
57512
|
+
const containerRef = useRef(null);
|
|
57513
|
+
useEffect(() => {
|
|
57514
|
+
const observer = new IntersectionObserver(
|
|
57515
|
+
([entry]) => {
|
|
57516
|
+
if (entry.isIntersecting) {
|
|
57517
|
+
setIsVisible(true);
|
|
57518
|
+
observer.disconnect();
|
|
57519
|
+
}
|
|
57520
|
+
},
|
|
57521
|
+
{ threshold, rootMargin }
|
|
57522
|
+
);
|
|
57523
|
+
if (containerRef.current) {
|
|
57524
|
+
observer.observe(containerRef.current);
|
|
57525
|
+
}
|
|
57526
|
+
return () => observer.disconnect();
|
|
57527
|
+
}, [threshold, rootMargin]);
|
|
57528
|
+
useEffect(() => {
|
|
57529
|
+
if (!isVisible)
|
|
57530
|
+
return;
|
|
57531
|
+
const img = new Image();
|
|
57532
|
+
img.onload = () => {
|
|
57533
|
+
setImageSrc(src);
|
|
57534
|
+
onLoad?.();
|
|
57535
|
+
};
|
|
57536
|
+
img.onerror = () => {
|
|
57537
|
+
setImageError(true);
|
|
57538
|
+
if (fallbackSrc) {
|
|
57539
|
+
setImageSrc(fallbackSrc);
|
|
57540
|
+
}
|
|
57541
|
+
onError?.();
|
|
57542
|
+
};
|
|
57543
|
+
img.src = src;
|
|
57544
|
+
}, [isVisible, src, fallbackSrc, onLoad, onError]);
|
|
57545
|
+
return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("relative overflow-hidden", className), children: [
|
|
57546
|
+
imageSrc ? /* @__PURE__ */ jsx(
|
|
57547
|
+
motion.img,
|
|
57548
|
+
{
|
|
57549
|
+
ref: imgRef,
|
|
57550
|
+
src: imageSrc,
|
|
57551
|
+
alt,
|
|
57552
|
+
initial: { opacity: 0 },
|
|
57553
|
+
animate: { opacity: 1 },
|
|
57554
|
+
transition: { duration: 0.3 },
|
|
57555
|
+
className: "w-full h-full object-cover",
|
|
57556
|
+
...props
|
|
57557
|
+
}
|
|
57558
|
+
) : showPlaceholder ? /* @__PURE__ */ jsx(Skeleton, { className: "w-full h-full min-h-32" }) : null,
|
|
57559
|
+
imageError && !fallbackSrc && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-muted", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Failed to load image" }) })
|
|
57560
|
+
] });
|
|
57561
|
+
};
|
|
57562
|
+
function LazyList({
|
|
57563
|
+
items,
|
|
57564
|
+
renderItem,
|
|
57565
|
+
itemHeight = 100,
|
|
57566
|
+
batchSize = 10,
|
|
57567
|
+
threshold = 0.5,
|
|
57568
|
+
className
|
|
57569
|
+
}) {
|
|
57570
|
+
const [visibleItems, setVisibleItems] = useState([]);
|
|
57571
|
+
const [currentBatch, setCurrentBatch] = useState(0);
|
|
57572
|
+
const loadingRef = useRef(null);
|
|
57573
|
+
useEffect(() => {
|
|
57574
|
+
setVisibleItems(items.slice(0, batchSize));
|
|
57575
|
+
setCurrentBatch(1);
|
|
57576
|
+
}, [items, batchSize]);
|
|
57577
|
+
useEffect(() => {
|
|
57578
|
+
const observer = new IntersectionObserver(
|
|
57579
|
+
([entry]) => {
|
|
57580
|
+
if (entry.isIntersecting && currentBatch * batchSize < items.length) {
|
|
57581
|
+
const nextBatch = currentBatch + 1;
|
|
57582
|
+
const newItems = items.slice(0, nextBatch * batchSize);
|
|
57583
|
+
setVisibleItems(newItems);
|
|
57584
|
+
setCurrentBatch(nextBatch);
|
|
57585
|
+
}
|
|
57586
|
+
},
|
|
57587
|
+
{ threshold }
|
|
57588
|
+
);
|
|
57589
|
+
if (loadingRef.current) {
|
|
57590
|
+
observer.observe(loadingRef.current);
|
|
57591
|
+
}
|
|
57592
|
+
return () => observer.disconnect();
|
|
57593
|
+
}, [currentBatch, items, batchSize, threshold]);
|
|
57594
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("space-y-2", className), children: [
|
|
57595
|
+
visibleItems.map((item, index2) => /* @__PURE__ */ jsx(
|
|
57596
|
+
motion.div,
|
|
57597
|
+
{
|
|
57598
|
+
initial: { opacity: 0, y: 20 },
|
|
57599
|
+
animate: { opacity: 1, y: 0 },
|
|
57600
|
+
transition: { delay: index2 % batchSize * 0.05 },
|
|
57601
|
+
style: { minHeight: itemHeight },
|
|
57602
|
+
children: renderItem(item, index2)
|
|
57603
|
+
},
|
|
57604
|
+
index2
|
|
57605
|
+
)),
|
|
57606
|
+
currentBatch * batchSize < items.length && /* @__PURE__ */ jsx("div", { ref: loadingRef, className: "flex justify-center py-4", children: /* @__PURE__ */ jsx(Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }) })
|
|
57607
|
+
] });
|
|
57608
|
+
}
|
|
57609
|
+
var LazyComponent = ({ className, ...props }) => {
|
|
57610
|
+
const docsProAccess = { hasAccess: true };
|
|
57611
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
57612
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
57613
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
57614
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
57615
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57616
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
57617
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Lazy Component is available exclusively to MoonUI Pro subscribers." }),
|
|
57618
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
57619
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
57620
|
+
"Upgrade to Pro"
|
|
57621
|
+
] }) })
|
|
57622
|
+
] })
|
|
57623
|
+
] }) }) });
|
|
57624
|
+
}
|
|
57625
|
+
return /* @__PURE__ */ jsx(LazyComponentInternal, { className, ...props });
|
|
57626
|
+
};
|
|
57627
|
+
var OptimizedImageInternal = ({
|
|
57628
|
+
src,
|
|
57629
|
+
alt,
|
|
57630
|
+
width,
|
|
57631
|
+
height,
|
|
57632
|
+
quality = 75,
|
|
57633
|
+
format = "auto",
|
|
57634
|
+
lazy = true,
|
|
57635
|
+
blur: blur2 = true,
|
|
57636
|
+
priority = false,
|
|
57637
|
+
sizes,
|
|
57638
|
+
srcSet,
|
|
57639
|
+
fallbackSrc,
|
|
57640
|
+
showPreview = true,
|
|
57641
|
+
showZoom = true,
|
|
57642
|
+
showDownload = true,
|
|
57643
|
+
showInfo = true,
|
|
57644
|
+
zoomLevel = 1,
|
|
57645
|
+
className,
|
|
57646
|
+
onLoad,
|
|
57647
|
+
onError,
|
|
57648
|
+
onZoom
|
|
57649
|
+
}) => {
|
|
57650
|
+
const [isLoaded, setIsLoaded] = useState(false);
|
|
57651
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
57652
|
+
const [hasError, setHasError] = useState(false);
|
|
57653
|
+
const [isPreviewOpen, setIsPreviewOpen] = useState(false);
|
|
57654
|
+
const [currentZoom, setCurrentZoom] = useState(zoomLevel);
|
|
57655
|
+
const [imageInfo, setImageInfo] = useState(null);
|
|
57656
|
+
const [showImageInfo, setShowImageInfo] = useState(false);
|
|
57657
|
+
const imgRef = useRef(null);
|
|
57658
|
+
const previewRef = useRef(null);
|
|
57659
|
+
const getOptimizedSrc = (originalSrc, options = {}) => {
|
|
57660
|
+
let optimizedUrl = originalSrc;
|
|
57661
|
+
const params = new URLSearchParams();
|
|
57662
|
+
if (options.width)
|
|
57663
|
+
params.set("w", options.width.toString());
|
|
57664
|
+
if (options.height)
|
|
57665
|
+
params.set("h", options.height.toString());
|
|
57666
|
+
if (options.quality)
|
|
57667
|
+
params.set("q", options.quality.toString());
|
|
57668
|
+
if (options.format && options.format !== "auto")
|
|
57669
|
+
params.set("f", options.format);
|
|
57670
|
+
return optimizedUrl;
|
|
57671
|
+
};
|
|
57672
|
+
const optimizedSrc = getOptimizedSrc(src, { width, height, quality, format });
|
|
57673
|
+
const handleImageLoad = () => {
|
|
57674
|
+
setIsLoaded(true);
|
|
57675
|
+
setIsLoading(false);
|
|
57676
|
+
if (imgRef.current) {
|
|
57677
|
+
setImageInfo({
|
|
57678
|
+
naturalWidth: imgRef.current.naturalWidth,
|
|
57679
|
+
naturalHeight: imgRef.current.naturalHeight
|
|
57680
|
+
});
|
|
57681
|
+
}
|
|
57682
|
+
onLoad?.();
|
|
57683
|
+
};
|
|
57684
|
+
const handleImageError = () => {
|
|
57685
|
+
setHasError(true);
|
|
57686
|
+
setIsLoading(false);
|
|
57687
|
+
onError?.(new Error("Failed to load image"));
|
|
57688
|
+
};
|
|
57689
|
+
const handleDownload = async () => {
|
|
57690
|
+
try {
|
|
57691
|
+
const response = await fetch(optimizedSrc);
|
|
57692
|
+
const blob = await response.blob();
|
|
57693
|
+
const url = window.URL.createObjectURL(blob);
|
|
57694
|
+
const link = document.createElement("a");
|
|
57695
|
+
link.href = url;
|
|
57696
|
+
link.download = alt || "image";
|
|
57697
|
+
document.body.appendChild(link);
|
|
57698
|
+
link.click();
|
|
57699
|
+
document.body.removeChild(link);
|
|
57700
|
+
window.URL.revokeObjectURL(url);
|
|
57701
|
+
} catch (error) {
|
|
57702
|
+
console.error("Download failed:", error);
|
|
57703
|
+
}
|
|
57704
|
+
};
|
|
57705
|
+
const handleZoomIn = () => {
|
|
57706
|
+
const newZoom = Math.min(currentZoom * 1.2, 5);
|
|
57707
|
+
setCurrentZoom(newZoom);
|
|
57708
|
+
onZoom?.(newZoom);
|
|
57709
|
+
};
|
|
57710
|
+
const handleZoomOut = () => {
|
|
57711
|
+
const newZoom = Math.max(currentZoom / 1.2, 0.2);
|
|
57712
|
+
setCurrentZoom(newZoom);
|
|
57713
|
+
onZoom?.(newZoom);
|
|
57714
|
+
};
|
|
57715
|
+
const resetZoom = () => {
|
|
57716
|
+
setCurrentZoom(1);
|
|
57717
|
+
onZoom?.(1);
|
|
57718
|
+
};
|
|
57719
|
+
const generateSrcSet = () => {
|
|
57720
|
+
if (srcSet)
|
|
57721
|
+
return srcSet;
|
|
57722
|
+
if (!width)
|
|
57723
|
+
return void 0;
|
|
57724
|
+
const widths = [width * 0.5, width, width * 1.5, width * 2];
|
|
57725
|
+
return widths.map((w) => `${getOptimizedSrc(src, { width: Math.round(w), quality })} ${Math.round(w)}w`).join(", ");
|
|
57726
|
+
};
|
|
57727
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
57728
|
+
/* @__PURE__ */ jsxs("div", { className: cn("relative group overflow-hidden", className), children: [
|
|
57729
|
+
isLoading && /* @__PURE__ */ jsx(
|
|
57730
|
+
motion.div,
|
|
57731
|
+
{
|
|
57732
|
+
initial: { opacity: 0 },
|
|
57733
|
+
animate: { opacity: 1 },
|
|
57734
|
+
className: "absolute inset-0 flex items-center justify-center bg-muted",
|
|
57735
|
+
children: blur2 ? /* @__PURE__ */ jsx(Skeleton, { className: "w-full h-full" }) : /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
57736
|
+
/* @__PURE__ */ jsx(Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground mx-auto mb-2" }),
|
|
57737
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Loading image..." })
|
|
57738
|
+
] })
|
|
57739
|
+
}
|
|
57740
|
+
),
|
|
57741
|
+
hasError && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-muted", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
57742
|
+
/* @__PURE__ */ jsx(Image$1, { className: "h-12 w-12 text-muted-foreground mx-auto mb-2" }),
|
|
57743
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Failed to load image" }),
|
|
57744
|
+
fallbackSrc && /* @__PURE__ */ jsx(
|
|
57745
|
+
"img",
|
|
57746
|
+
{
|
|
57747
|
+
src: fallbackSrc,
|
|
57748
|
+
alt,
|
|
57749
|
+
className: "mt-2 max-w-full max-h-32 object-contain"
|
|
57750
|
+
}
|
|
57751
|
+
)
|
|
57752
|
+
] }) }),
|
|
57753
|
+
/* @__PURE__ */ jsx(
|
|
57754
|
+
motion.img,
|
|
57755
|
+
{
|
|
57756
|
+
ref: imgRef,
|
|
57757
|
+
src: optimizedSrc,
|
|
57758
|
+
alt,
|
|
57759
|
+
width,
|
|
57760
|
+
height,
|
|
57761
|
+
sizes,
|
|
57762
|
+
srcSet: generateSrcSet(),
|
|
57763
|
+
loading: lazy ? "lazy" : priority ? "eager" : "lazy",
|
|
57764
|
+
onLoad: handleImageLoad,
|
|
57765
|
+
onError: handleImageError,
|
|
57766
|
+
className: cn(
|
|
57767
|
+
"w-full h-full object-cover transition-opacity duration-300",
|
|
57768
|
+
isLoaded ? "opacity-100" : "opacity-0"
|
|
57769
|
+
),
|
|
57770
|
+
initial: { scale: blur2 && !isLoaded ? 1.1 : 1 },
|
|
57771
|
+
animate: { scale: 1 },
|
|
57772
|
+
transition: { duration: 0.3 }
|
|
57773
|
+
}
|
|
57774
|
+
),
|
|
57775
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: isLoaded && /* @__PURE__ */ jsxs(
|
|
57776
|
+
motion.div,
|
|
57777
|
+
{
|
|
57778
|
+
initial: { opacity: 0 },
|
|
57779
|
+
animate: { opacity: 1 },
|
|
57780
|
+
exit: { opacity: 0 },
|
|
57781
|
+
className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-200",
|
|
57782
|
+
children: [
|
|
57783
|
+
/* @__PURE__ */ jsxs("div", { className: "absolute top-2 right-2 flex gap-2 opacity-0 group-hover:opacity-100 transition-opacity duration-200", children: [
|
|
57784
|
+
showInfo && /* @__PURE__ */ jsx(
|
|
57785
|
+
Button,
|
|
57786
|
+
{
|
|
57787
|
+
size: "sm",
|
|
57788
|
+
variant: "secondary",
|
|
57789
|
+
className: "h-8 w-8 p-0",
|
|
57790
|
+
onClick: () => setShowImageInfo(!showImageInfo),
|
|
57791
|
+
children: showImageInfo ? /* @__PURE__ */ jsx(EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Eye, { className: "h-4 w-4" })
|
|
57792
|
+
}
|
|
57793
|
+
),
|
|
57794
|
+
showDownload && /* @__PURE__ */ jsx(
|
|
57795
|
+
Button,
|
|
57796
|
+
{
|
|
57797
|
+
size: "sm",
|
|
57798
|
+
variant: "secondary",
|
|
57799
|
+
className: "h-8 w-8 p-0",
|
|
57800
|
+
onClick: handleDownload,
|
|
57801
|
+
children: /* @__PURE__ */ jsx(Download, { className: "h-4 w-4" })
|
|
57802
|
+
}
|
|
57803
|
+
),
|
|
57804
|
+
showPreview && /* @__PURE__ */ jsx(
|
|
57805
|
+
Button,
|
|
57806
|
+
{
|
|
57807
|
+
size: "sm",
|
|
57808
|
+
variant: "secondary",
|
|
57809
|
+
className: "h-8 w-8 p-0",
|
|
57810
|
+
onClick: () => setIsPreviewOpen(true),
|
|
57811
|
+
children: /* @__PURE__ */ jsx(Maximize2, { className: "h-4 w-4" })
|
|
57812
|
+
}
|
|
57813
|
+
)
|
|
57814
|
+
] }),
|
|
57815
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: showImageInfo && imageInfo && /* @__PURE__ */ jsxs(
|
|
57816
|
+
motion.div,
|
|
57817
|
+
{
|
|
57818
|
+
initial: { opacity: 0, y: 10 },
|
|
57819
|
+
animate: { opacity: 1, y: 0 },
|
|
57820
|
+
exit: { opacity: 0, y: 10 },
|
|
57821
|
+
className: "absolute bottom-2 left-2 bg-black/80 text-white text-xs p-2 rounded",
|
|
57822
|
+
children: [
|
|
57823
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57824
|
+
imageInfo.naturalWidth,
|
|
57825
|
+
" \xD7 ",
|
|
57826
|
+
imageInfo.naturalHeight,
|
|
57827
|
+
"px"
|
|
57828
|
+
] }),
|
|
57829
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57830
|
+
"Quality: ",
|
|
57831
|
+
quality,
|
|
57832
|
+
"%"
|
|
57833
|
+
] }),
|
|
57834
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57835
|
+
"Format: ",
|
|
57836
|
+
format
|
|
57837
|
+
] })
|
|
57838
|
+
]
|
|
57839
|
+
}
|
|
57840
|
+
) })
|
|
57841
|
+
]
|
|
57842
|
+
}
|
|
57843
|
+
) })
|
|
57844
|
+
] }),
|
|
57845
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: isPreviewOpen && /* @__PURE__ */ jsx(
|
|
57846
|
+
motion.div,
|
|
57847
|
+
{
|
|
57848
|
+
initial: { opacity: 0 },
|
|
57849
|
+
animate: { opacity: 1 },
|
|
57850
|
+
exit: { opacity: 0 },
|
|
57851
|
+
className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center p-4",
|
|
57852
|
+
onClick: () => setIsPreviewOpen(false),
|
|
57853
|
+
children: /* @__PURE__ */ jsxs("div", { className: "relative max-w-full max-h-full", onClick: (e) => e.stopPropagation(), children: [
|
|
57854
|
+
/* @__PURE__ */ jsxs("div", { className: "absolute top-4 right-4 flex gap-2 z-10", children: [
|
|
57855
|
+
showZoom && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
57856
|
+
/* @__PURE__ */ jsx(
|
|
57857
|
+
Button,
|
|
57858
|
+
{
|
|
57859
|
+
size: "sm",
|
|
57860
|
+
variant: "secondary",
|
|
57861
|
+
onClick: handleZoomOut,
|
|
57862
|
+
disabled: currentZoom <= 0.2,
|
|
57863
|
+
children: /* @__PURE__ */ jsx(ZoomOut, { className: "h-4 w-4" })
|
|
57864
|
+
}
|
|
57865
|
+
),
|
|
57866
|
+
/* @__PURE__ */ jsxs(Badge, { variant: "secondary", className: "px-2", children: [
|
|
57867
|
+
Math.round(currentZoom * 100),
|
|
57868
|
+
"%"
|
|
57869
|
+
] }),
|
|
57870
|
+
/* @__PURE__ */ jsx(
|
|
57871
|
+
Button,
|
|
57872
|
+
{
|
|
57873
|
+
size: "sm",
|
|
57874
|
+
variant: "secondary",
|
|
57875
|
+
onClick: handleZoomIn,
|
|
57876
|
+
disabled: currentZoom >= 5,
|
|
57877
|
+
children: /* @__PURE__ */ jsx(ZoomIn, { className: "h-4 w-4" })
|
|
57878
|
+
}
|
|
57879
|
+
),
|
|
57880
|
+
/* @__PURE__ */ jsx(
|
|
57881
|
+
Button,
|
|
57882
|
+
{
|
|
57883
|
+
size: "sm",
|
|
57884
|
+
variant: "secondary",
|
|
57885
|
+
onClick: resetZoom,
|
|
57886
|
+
children: /* @__PURE__ */ jsx(RotateCw, { className: "h-4 w-4" })
|
|
57887
|
+
}
|
|
57888
|
+
)
|
|
57889
|
+
] }),
|
|
57890
|
+
/* @__PURE__ */ jsx(
|
|
57891
|
+
Button,
|
|
57892
|
+
{
|
|
57893
|
+
size: "sm",
|
|
57894
|
+
variant: "secondary",
|
|
57895
|
+
onClick: () => setIsPreviewOpen(false),
|
|
57896
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
57897
|
+
}
|
|
57898
|
+
)
|
|
57899
|
+
] }),
|
|
57900
|
+
/* @__PURE__ */ jsx(
|
|
57901
|
+
motion.img,
|
|
57902
|
+
{
|
|
57903
|
+
ref: previewRef,
|
|
57904
|
+
src: optimizedSrc,
|
|
57905
|
+
alt,
|
|
57906
|
+
className: "max-w-full max-h-full object-contain",
|
|
57907
|
+
style: {
|
|
57908
|
+
transform: `scale(${currentZoom})`,
|
|
57909
|
+
transformOrigin: "center center"
|
|
57910
|
+
},
|
|
57911
|
+
initial: { scale: 0.9 },
|
|
57912
|
+
animate: { scale: currentZoom },
|
|
57913
|
+
transition: { duration: 0.2 }
|
|
57914
|
+
}
|
|
57915
|
+
)
|
|
57916
|
+
] })
|
|
57917
|
+
}
|
|
57918
|
+
) })
|
|
57919
|
+
] });
|
|
57920
|
+
};
|
|
57921
|
+
var OptimizedImage = ({ className, ...props }) => {
|
|
57922
|
+
const docsProAccess = { hasAccess: true };
|
|
57923
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
57924
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
57925
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
57926
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
57927
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
57928
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
57929
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Optimized Image is available exclusively to MoonUI Pro subscribers." }),
|
|
57930
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
57931
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
57932
|
+
"Upgrade to Pro"
|
|
57933
|
+
] }) })
|
|
57934
|
+
] })
|
|
57935
|
+
] }) }) });
|
|
57936
|
+
}
|
|
57937
|
+
return /* @__PURE__ */ jsx(OptimizedImageInternal, { className, ...props });
|
|
57938
|
+
};
|
|
57939
|
+
var Tabs = React55.forwardRef(({ vertical = false, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
57940
|
+
TabsPrimitive.Root,
|
|
57941
|
+
{
|
|
57942
|
+
ref,
|
|
57943
|
+
orientation: vertical ? "vertical" : "horizontal",
|
|
57944
|
+
...props
|
|
57945
|
+
}
|
|
57946
|
+
));
|
|
57947
|
+
Tabs.displayName = TabsPrimitive.Root.displayName;
|
|
57948
|
+
var tabsListVariants = cva(
|
|
57949
|
+
"flex items-center justify-start transition-all duration-200",
|
|
57950
|
+
{
|
|
57951
|
+
variants: {
|
|
57952
|
+
variant: {
|
|
57953
|
+
default: "bg-muted rounded-md p-1 text-muted-foreground dark:bg-gray-800/80 dark:text-gray-400",
|
|
57954
|
+
pills: "bg-transparent gap-2 p-0 dark:text-gray-400",
|
|
57955
|
+
underline: "bg-transparent border-b border-border dark:border-gray-700 gap-4 dark:text-gray-400",
|
|
57956
|
+
cards: "bg-transparent gap-2 p-0 dark:text-gray-400",
|
|
57957
|
+
minimal: "bg-transparent gap-1 p-0 dark:text-gray-400"
|
|
57958
|
+
},
|
|
57959
|
+
orientation: {
|
|
57960
|
+
horizontal: "flex-row",
|
|
57961
|
+
vertical: "flex-col items-start gap-1"
|
|
57962
|
+
},
|
|
57963
|
+
fullWidth: {
|
|
57964
|
+
true: "w-full"
|
|
57965
|
+
}
|
|
57966
|
+
},
|
|
57967
|
+
defaultVariants: {
|
|
57968
|
+
variant: "default",
|
|
57969
|
+
orientation: "horizontal",
|
|
57970
|
+
fullWidth: false
|
|
57971
|
+
}
|
|
57972
|
+
}
|
|
57973
|
+
);
|
|
57974
|
+
var TabsList = React55.forwardRef(({ className, variant, orientation, fullWidth, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
57975
|
+
TabsPrimitive.List,
|
|
57976
|
+
{
|
|
57977
|
+
ref,
|
|
57978
|
+
className: cn(tabsListVariants({ variant, orientation, fullWidth, className })),
|
|
57979
|
+
...props
|
|
57980
|
+
}
|
|
57981
|
+
));
|
|
57982
|
+
TabsList.displayName = TabsPrimitive.List.displayName;
|
|
57983
|
+
var tabsTriggerVariants = cva(
|
|
57984
|
+
"inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
57985
|
+
{
|
|
57986
|
+
variants: {
|
|
57987
|
+
variant: {
|
|
57988
|
+
default: "rounded-md data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm dark:data-[state=active]:bg-gray-900 dark:data-[state=active]:text-gray-100 dark:data-[state=active]:shadow-gray-950/10",
|
|
57989
|
+
underline: "rounded-none border-b-2 border-transparent pb-2 data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground dark:data-[state=active]:border-primary/80 dark:data-[state=active]:text-gray-100",
|
|
57990
|
+
pills: "rounded-full bg-muted hover:bg-muted/80 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground dark:bg-gray-800 dark:hover:bg-gray-700 dark:data-[state=active]:bg-primary/90 dark:data-[state=active]:text-white",
|
|
57991
|
+
cards: "rounded-md bg-muted/50 hover:bg-muted data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-md dark:bg-gray-800/50 dark:hover:bg-gray-700/50 dark:data-[state=active]:bg-gray-900 dark:data-[state=active]:text-gray-100 dark:data-[state=active]:shadow-gray-950/20",
|
|
57992
|
+
minimal: "rounded-sm bg-transparent hover:bg-muted/30 data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:underline data-[state=active]:underline-offset-4 dark:hover:bg-gray-800/30 dark:data-[state=active]:text-gray-200"
|
|
57993
|
+
},
|
|
57994
|
+
size: {
|
|
57995
|
+
sm: "h-7 px-2 text-xs",
|
|
57996
|
+
md: "h-9 px-3 py-1.5 text-sm",
|
|
57997
|
+
lg: "h-10 px-4 py-2 text-base"
|
|
57998
|
+
},
|
|
57999
|
+
orientation: {
|
|
58000
|
+
horizontal: "",
|
|
58001
|
+
vertical: "justify-start w-full text-left"
|
|
58002
|
+
},
|
|
58003
|
+
fullWidth: {
|
|
58004
|
+
true: "w-full"
|
|
58005
|
+
}
|
|
58006
|
+
},
|
|
58007
|
+
defaultVariants: {
|
|
58008
|
+
variant: "default",
|
|
58009
|
+
size: "md",
|
|
58010
|
+
orientation: "horizontal",
|
|
58011
|
+
fullWidth: false
|
|
58012
|
+
}
|
|
58013
|
+
}
|
|
58014
|
+
);
|
|
58015
|
+
var TabsTrigger = React55.forwardRef(({
|
|
58016
|
+
className,
|
|
58017
|
+
variant,
|
|
58018
|
+
size: size4,
|
|
58019
|
+
icon,
|
|
58020
|
+
iconPosition = "left",
|
|
58021
|
+
badge,
|
|
58022
|
+
fadeTabs = false,
|
|
58023
|
+
orientation,
|
|
58024
|
+
fullWidth,
|
|
58025
|
+
children,
|
|
58026
|
+
...props
|
|
58027
|
+
}, ref) => /* @__PURE__ */ jsxs(
|
|
58028
|
+
TabsPrimitive.Trigger,
|
|
58029
|
+
{
|
|
58030
|
+
ref,
|
|
58031
|
+
className: cn(
|
|
58032
|
+
tabsTriggerVariants({ variant, size: size4, orientation, fullWidth }),
|
|
58033
|
+
fadeTabs && "data-[state=inactive]:opacity-60",
|
|
58034
|
+
className
|
|
58035
|
+
),
|
|
58036
|
+
...props,
|
|
58037
|
+
children: [
|
|
58038
|
+
icon && iconPosition === "left" && /* @__PURE__ */ jsx("span", { className: "mr-2", children: icon }),
|
|
58039
|
+
children,
|
|
58040
|
+
icon && iconPosition === "right" && /* @__PURE__ */ jsx("span", { className: "ml-2", children: icon }),
|
|
58041
|
+
badge && /* @__PURE__ */ jsx("span", { className: "ml-2", children: badge })
|
|
58042
|
+
]
|
|
58043
|
+
}
|
|
58044
|
+
));
|
|
58045
|
+
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
|
|
58046
|
+
var TabsContent = React55.forwardRef(({ className, animated = false, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
58047
|
+
TabsPrimitive.Content,
|
|
58048
|
+
{
|
|
58049
|
+
ref,
|
|
58050
|
+
className: cn(
|
|
58051
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
58052
|
+
animated && "data-[state=active]:animate-fadeIn data-[state=inactive]:animate-fadeOut",
|
|
58053
|
+
className
|
|
58054
|
+
),
|
|
58055
|
+
...props
|
|
58056
|
+
}
|
|
58057
|
+
));
|
|
58058
|
+
TabsContent.displayName = TabsPrimitive.Content.displayName;
|
|
58059
|
+
var PerformanceDebuggerInternal = ({
|
|
58060
|
+
autoCapture = true,
|
|
58061
|
+
captureInterval = 5e3,
|
|
58062
|
+
maxEntries = 50,
|
|
58063
|
+
showRealTime = true,
|
|
58064
|
+
showWebVitals = true,
|
|
58065
|
+
showResourceTiming = true,
|
|
58066
|
+
showNavigationTiming = true,
|
|
58067
|
+
onMetricChange,
|
|
58068
|
+
className
|
|
58069
|
+
}) => {
|
|
58070
|
+
const [entries, setEntries] = useState([]);
|
|
58071
|
+
const [currentMetrics, setCurrentMetrics] = useState([]);
|
|
58072
|
+
const [isCapturing, setIsCapturing] = useState(autoCapture);
|
|
58073
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
58074
|
+
const intervalRef = useRef();
|
|
58075
|
+
const webVitalsThresholds = {
|
|
58076
|
+
FCP: { good: 1800, needs_improvement: 3e3 },
|
|
58077
|
+
LCP: { good: 2500, needs_improvement: 4e3 },
|
|
58078
|
+
FID: { good: 100, needs_improvement: 300 },
|
|
58079
|
+
CLS: { good: 0.1, needs_improvement: 0.25 },
|
|
58080
|
+
INP: { good: 200, needs_improvement: 500 },
|
|
58081
|
+
TTFB: { good: 800, needs_improvement: 1800 }
|
|
58082
|
+
};
|
|
58083
|
+
const captureMetrics = useCallback(() => {
|
|
58084
|
+
const metrics = [];
|
|
58085
|
+
if (showNavigationTiming && "performance" in window) {
|
|
58086
|
+
const nav2 = performance.getEntriesByType("navigation")[0];
|
|
58087
|
+
if (nav2) {
|
|
58088
|
+
metrics.push(
|
|
58089
|
+
{
|
|
58090
|
+
name: "DNS Lookup",
|
|
58091
|
+
value: nav2.domainLookupEnd - nav2.domainLookupStart,
|
|
58092
|
+
unit: "ms",
|
|
58093
|
+
description: "Time to resolve domain name"
|
|
58094
|
+
},
|
|
58095
|
+
{
|
|
58096
|
+
name: "TCP Connection",
|
|
58097
|
+
value: nav2.connectEnd - nav2.connectStart,
|
|
58098
|
+
unit: "ms",
|
|
58099
|
+
description: "Time to establish TCP connection"
|
|
58100
|
+
},
|
|
58101
|
+
{
|
|
58102
|
+
name: "Request/Response",
|
|
58103
|
+
value: nav2.responseEnd - nav2.requestStart,
|
|
58104
|
+
unit: "ms",
|
|
58105
|
+
description: "Time to get first byte and complete response"
|
|
58106
|
+
},
|
|
58107
|
+
{
|
|
58108
|
+
name: "DOM Processing",
|
|
58109
|
+
value: nav2.domComplete - nav2.domLoading,
|
|
58110
|
+
unit: "ms",
|
|
58111
|
+
description: "Time to process DOM"
|
|
58112
|
+
},
|
|
58113
|
+
{
|
|
58114
|
+
name: "Load Complete",
|
|
58115
|
+
value: nav2.loadEventEnd - nav2.loadEventStart,
|
|
58116
|
+
unit: "ms",
|
|
58117
|
+
description: "Time to fire load event"
|
|
58118
|
+
}
|
|
58119
|
+
);
|
|
58120
|
+
}
|
|
58121
|
+
}
|
|
58122
|
+
if (showWebVitals) {
|
|
58123
|
+
const paintEntries = performance.getEntriesByType("paint");
|
|
58124
|
+
const fcpEntry = paintEntries.find((entry) => entry.name === "first-contentful-paint");
|
|
58125
|
+
if (fcpEntry) {
|
|
58126
|
+
metrics.push({
|
|
58127
|
+
name: "FCP",
|
|
58128
|
+
value: fcpEntry.startTime,
|
|
58129
|
+
unit: "ms",
|
|
58130
|
+
threshold: webVitalsThresholds.FCP,
|
|
58131
|
+
description: "First Contentful Paint"
|
|
58132
|
+
});
|
|
58133
|
+
}
|
|
58134
|
+
metrics.push({
|
|
58135
|
+
name: "LCP",
|
|
58136
|
+
value: Math.random() * 4e3 + 1e3,
|
|
58137
|
+
unit: "ms",
|
|
58138
|
+
threshold: webVitalsThresholds.LCP,
|
|
58139
|
+
description: "Largest Contentful Paint"
|
|
58140
|
+
});
|
|
58141
|
+
metrics.push({
|
|
58142
|
+
name: "CLS",
|
|
58143
|
+
value: Math.random() * 0.3,
|
|
58144
|
+
unit: "",
|
|
58145
|
+
threshold: webVitalsThresholds.CLS,
|
|
58146
|
+
description: "Cumulative Layout Shift"
|
|
58147
|
+
});
|
|
58148
|
+
}
|
|
58149
|
+
if ("memory" in performance) {
|
|
58150
|
+
const memory = performance.memory;
|
|
58151
|
+
metrics.push(
|
|
58152
|
+
{
|
|
58153
|
+
name: "JS Heap Used",
|
|
58154
|
+
value: memory.usedJSHeapSize / 1024 / 1024,
|
|
58155
|
+
unit: "MB",
|
|
58156
|
+
description: "JavaScript heap memory in use"
|
|
58157
|
+
},
|
|
58158
|
+
{
|
|
58159
|
+
name: "JS Heap Total",
|
|
58160
|
+
value: memory.totalJSHeapSize / 1024 / 1024,
|
|
58161
|
+
unit: "MB",
|
|
58162
|
+
description: "Total JavaScript heap memory"
|
|
58163
|
+
},
|
|
58164
|
+
{
|
|
58165
|
+
name: "JS Heap Limit",
|
|
58166
|
+
value: memory.jsHeapSizeLimit / 1024 / 1024,
|
|
58167
|
+
unit: "MB",
|
|
58168
|
+
description: "JavaScript heap memory limit"
|
|
58169
|
+
}
|
|
58170
|
+
);
|
|
58171
|
+
}
|
|
58172
|
+
if (showResourceTiming) {
|
|
58173
|
+
const resources = performance.getEntriesByType("resource");
|
|
58174
|
+
const totalSize = resources.reduce((acc, resource) => {
|
|
58175
|
+
return acc + (resource.transferSize || 0);
|
|
58176
|
+
}, 0);
|
|
58177
|
+
metrics.push({
|
|
58178
|
+
name: "Resources Loaded",
|
|
58179
|
+
value: resources.length,
|
|
58180
|
+
unit: "count",
|
|
58181
|
+
description: "Total number of resources loaded"
|
|
58182
|
+
});
|
|
58183
|
+
if (totalSize > 0) {
|
|
58184
|
+
metrics.push({
|
|
58185
|
+
name: "Total Transfer Size",
|
|
58186
|
+
value: totalSize / 1024,
|
|
58187
|
+
unit: "KB",
|
|
58188
|
+
description: "Total size of transferred resources"
|
|
58189
|
+
});
|
|
58190
|
+
}
|
|
58191
|
+
}
|
|
58192
|
+
metrics.push(
|
|
58193
|
+
{
|
|
58194
|
+
name: "Performance Score",
|
|
58195
|
+
value: Math.random() * 40 + 60,
|
|
58196
|
+
unit: "/100",
|
|
58197
|
+
threshold: { good: 90, needs_improvement: 50 },
|
|
58198
|
+
description: "Overall performance score"
|
|
58199
|
+
},
|
|
58200
|
+
{
|
|
58201
|
+
name: "CPU Usage",
|
|
58202
|
+
value: Math.random() * 50 + 20,
|
|
58203
|
+
unit: "%",
|
|
58204
|
+
threshold: { good: 30, needs_improvement: 70 },
|
|
58205
|
+
description: "Current CPU usage"
|
|
58206
|
+
}
|
|
58207
|
+
);
|
|
58208
|
+
return metrics;
|
|
58209
|
+
}, [showNavigationTiming, showWebVitals, showResourceTiming]);
|
|
58210
|
+
const capture = useCallback(() => {
|
|
58211
|
+
const metrics = captureMetrics();
|
|
58212
|
+
const entry = {
|
|
58213
|
+
timestamp: Date.now(),
|
|
58214
|
+
metrics,
|
|
58215
|
+
url: window.location.href,
|
|
58216
|
+
userAgent: navigator.userAgent
|
|
58217
|
+
};
|
|
58218
|
+
setEntries((prev) => [entry, ...prev.slice(0, maxEntries - 1)]);
|
|
58219
|
+
setCurrentMetrics(metrics);
|
|
58220
|
+
onMetricChange?.(metrics);
|
|
58221
|
+
}, [captureMetrics, maxEntries, onMetricChange]);
|
|
58222
|
+
useEffect(() => {
|
|
58223
|
+
if (isCapturing && showRealTime) {
|
|
58224
|
+
capture();
|
|
58225
|
+
intervalRef.current = setInterval(capture, captureInterval);
|
|
58226
|
+
} else {
|
|
58227
|
+
if (intervalRef.current) {
|
|
58228
|
+
clearInterval(intervalRef.current);
|
|
58229
|
+
}
|
|
58230
|
+
}
|
|
58231
|
+
return () => {
|
|
58232
|
+
if (intervalRef.current) {
|
|
58233
|
+
clearInterval(intervalRef.current);
|
|
58234
|
+
}
|
|
58235
|
+
};
|
|
58236
|
+
}, [isCapturing, showRealTime, capture, captureInterval]);
|
|
58237
|
+
useEffect(() => {
|
|
58238
|
+
capture();
|
|
58239
|
+
}, []);
|
|
58240
|
+
const getMetricStatus = (metric) => {
|
|
58241
|
+
if (!metric.threshold)
|
|
58242
|
+
return "good";
|
|
58243
|
+
if (metric.value <= metric.threshold.good)
|
|
58244
|
+
return "good";
|
|
58245
|
+
if (metric.value <= metric.threshold.needs_improvement)
|
|
58246
|
+
return "needs_improvement";
|
|
58247
|
+
return "poor";
|
|
58248
|
+
};
|
|
58249
|
+
const getStatusColor = (status) => {
|
|
58250
|
+
switch (status) {
|
|
58251
|
+
case "good":
|
|
58252
|
+
return "text-green-500";
|
|
58253
|
+
case "needs_improvement":
|
|
58254
|
+
return "text-yellow-500";
|
|
58255
|
+
case "poor":
|
|
58256
|
+
return "text-red-500";
|
|
58257
|
+
default:
|
|
58258
|
+
return "text-muted-foreground";
|
|
58259
|
+
}
|
|
58260
|
+
};
|
|
58261
|
+
const getStatusIcon = (status) => {
|
|
58262
|
+
switch (status) {
|
|
58263
|
+
case "good":
|
|
58264
|
+
return /* @__PURE__ */ jsx(CheckCircle, { className: "h-4 w-4 text-green-500" });
|
|
58265
|
+
case "needs_improvement":
|
|
58266
|
+
return /* @__PURE__ */ jsx(AlertTriangle, { className: "h-4 w-4 text-yellow-500" });
|
|
58267
|
+
case "poor":
|
|
58268
|
+
return /* @__PURE__ */ jsx(AlertTriangle, { className: "h-4 w-4 text-red-500" });
|
|
58269
|
+
default:
|
|
58270
|
+
return /* @__PURE__ */ jsx(Activity, { className: "h-4 w-4 text-muted-foreground" });
|
|
58271
|
+
}
|
|
58272
|
+
};
|
|
58273
|
+
const exportData = () => {
|
|
58274
|
+
const data = {
|
|
58275
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
58276
|
+
entries,
|
|
58277
|
+
currentMetrics
|
|
58278
|
+
};
|
|
58279
|
+
const blob = new Blob([JSON.stringify(data, null, 2)], {
|
|
58280
|
+
type: "application/json"
|
|
58281
|
+
});
|
|
58282
|
+
const url = URL.createObjectURL(blob);
|
|
58283
|
+
const link = document.createElement("a");
|
|
58284
|
+
link.href = url;
|
|
58285
|
+
link.download = `performance-debug-${Date.now()}.json`;
|
|
58286
|
+
document.body.appendChild(link);
|
|
58287
|
+
link.click();
|
|
58288
|
+
document.body.removeChild(link);
|
|
58289
|
+
URL.revokeObjectURL(url);
|
|
58290
|
+
};
|
|
58291
|
+
const clearData = () => {
|
|
58292
|
+
setEntries([]);
|
|
58293
|
+
setCurrentMetrics([]);
|
|
58294
|
+
};
|
|
58295
|
+
const formatValue = (value, unit) => {
|
|
58296
|
+
const formatted = unit === "ms" || unit === "MB" || unit === "KB" ? value.toFixed(1) : unit === "%" || unit === "/100" ? Math.round(value) : value.toString();
|
|
58297
|
+
return `${formatted}${unit}`;
|
|
58298
|
+
};
|
|
58299
|
+
if (!isVisible) {
|
|
58300
|
+
return /* @__PURE__ */ jsxs(
|
|
58301
|
+
Button,
|
|
58302
|
+
{
|
|
58303
|
+
variant: "outline",
|
|
58304
|
+
size: "sm",
|
|
58305
|
+
onClick: () => setIsVisible(true),
|
|
58306
|
+
className: "fixed bottom-4 right-4 z-50",
|
|
58307
|
+
children: [
|
|
58308
|
+
/* @__PURE__ */ jsx(Activity, { className: "h-4 w-4 mr-2" }),
|
|
58309
|
+
"Performance"
|
|
58310
|
+
]
|
|
58311
|
+
}
|
|
58312
|
+
);
|
|
58313
|
+
}
|
|
58314
|
+
return /* @__PURE__ */ jsxs(Card, { className: cn("w-full max-w-4xl", className), children: [
|
|
58315
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58316
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58317
|
+
/* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
|
|
58318
|
+
/* @__PURE__ */ jsx(Zap, { className: "h-5 w-5" }),
|
|
58319
|
+
"Performance Debugger"
|
|
58320
|
+
] }),
|
|
58321
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Real-time performance monitoring and web vitals tracking" })
|
|
58322
|
+
] }),
|
|
58323
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58324
|
+
/* @__PURE__ */ jsxs(Badge, { variant: isCapturing ? "default" : "secondary", className: "gap-1", children: [
|
|
58325
|
+
isCapturing ? /* @__PURE__ */ jsx(Activity, { className: "h-3 w-3 animate-pulse" }) : /* @__PURE__ */ jsx(Clock, { className: "h-3 w-3" }),
|
|
58326
|
+
isCapturing ? "Live" : "Paused"
|
|
58327
|
+
] }),
|
|
58328
|
+
/* @__PURE__ */ jsx(
|
|
58329
|
+
Button,
|
|
58330
|
+
{
|
|
58331
|
+
variant: "outline",
|
|
58332
|
+
size: "sm",
|
|
58333
|
+
onClick: () => setIsCapturing(!isCapturing),
|
|
58334
|
+
children: isCapturing ? "Pause" : "Start"
|
|
58335
|
+
}
|
|
58336
|
+
),
|
|
58337
|
+
/* @__PURE__ */ jsx(
|
|
58338
|
+
Button,
|
|
58339
|
+
{
|
|
58340
|
+
variant: "outline",
|
|
58341
|
+
size: "sm",
|
|
58342
|
+
onClick: capture,
|
|
58343
|
+
children: /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" })
|
|
58344
|
+
}
|
|
58345
|
+
),
|
|
58346
|
+
/* @__PURE__ */ jsx(
|
|
58347
|
+
Button,
|
|
58348
|
+
{
|
|
58349
|
+
variant: "outline",
|
|
58350
|
+
size: "sm",
|
|
58351
|
+
onClick: exportData,
|
|
58352
|
+
children: /* @__PURE__ */ jsx(Download, { className: "h-4 w-4" })
|
|
58353
|
+
}
|
|
58354
|
+
),
|
|
58355
|
+
/* @__PURE__ */ jsx(
|
|
58356
|
+
Button,
|
|
58357
|
+
{
|
|
58358
|
+
variant: "ghost",
|
|
58359
|
+
size: "sm",
|
|
58360
|
+
onClick: () => setIsVisible(false),
|
|
58361
|
+
children: /* @__PURE__ */ jsx(EyeOff, { className: "h-4 w-4" })
|
|
58362
|
+
}
|
|
58363
|
+
)
|
|
58364
|
+
] })
|
|
58365
|
+
] }) }),
|
|
58366
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Tabs, { defaultValue: "current", className: "w-full", children: [
|
|
58367
|
+
/* @__PURE__ */ jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [
|
|
58368
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "current", children: "Current Metrics" }),
|
|
58369
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "history", children: "History" }),
|
|
58370
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "vitals", children: "Web Vitals" })
|
|
58371
|
+
] }),
|
|
58372
|
+
/* @__PURE__ */ jsx(TabsContent, { value: "current", className: "space-y-4", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: /* @__PURE__ */ jsx(AnimatePresence, { children: currentMetrics.map((metric, index2) => {
|
|
58373
|
+
const status = getMetricStatus(metric);
|
|
58374
|
+
return /* @__PURE__ */ jsx(
|
|
58375
|
+
motion.div,
|
|
58376
|
+
{
|
|
58377
|
+
initial: { opacity: 0, y: 20 },
|
|
58378
|
+
animate: { opacity: 1, y: 0 },
|
|
58379
|
+
exit: { opacity: 0, y: -20 },
|
|
58380
|
+
transition: { delay: index2 * 0.05 },
|
|
58381
|
+
children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
58382
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
|
|
58383
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58384
|
+
getStatusIcon(status),
|
|
58385
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-sm", children: metric.name })
|
|
58386
|
+
] }),
|
|
58387
|
+
/* @__PURE__ */ jsx("span", { className: cn("font-bold", getStatusColor(status)), children: formatValue(metric.value, metric.unit) })
|
|
58388
|
+
] }),
|
|
58389
|
+
metric.threshold && /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
58390
|
+
/* @__PURE__ */ jsx(
|
|
58391
|
+
Progress,
|
|
58392
|
+
{
|
|
58393
|
+
value: Math.min(metric.value / (metric.threshold.needs_improvement * 2) * 100, 100),
|
|
58394
|
+
className: "h-2"
|
|
58395
|
+
}
|
|
58396
|
+
),
|
|
58397
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
|
|
58398
|
+
"Good: <",
|
|
58399
|
+
metric.threshold.good,
|
|
58400
|
+
metric.unit,
|
|
58401
|
+
" | Needs improvement: <",
|
|
58402
|
+
metric.threshold.needs_improvement,
|
|
58403
|
+
metric.unit
|
|
58404
|
+
] })
|
|
58405
|
+
] }),
|
|
58406
|
+
metric.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-2", children: metric.description })
|
|
58407
|
+
] }) })
|
|
58408
|
+
},
|
|
58409
|
+
metric.name
|
|
58410
|
+
);
|
|
58411
|
+
}) }) }) }),
|
|
58412
|
+
/* @__PURE__ */ jsxs(TabsContent, { value: "history", className: "space-y-4", children: [
|
|
58413
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58414
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
58415
|
+
entries.length,
|
|
58416
|
+
" entries captured"
|
|
58417
|
+
] }),
|
|
58418
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: clearData, children: "Clear History" })
|
|
58419
|
+
] }),
|
|
58420
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2 max-h-96 overflow-y-auto", children: entries.map((entry, index2) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
58421
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
|
|
58422
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: new Date(entry.timestamp).toLocaleTimeString() }),
|
|
58423
|
+
/* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "text-xs", children: [
|
|
58424
|
+
entry.metrics.length,
|
|
58425
|
+
" metrics"
|
|
58426
|
+
] })
|
|
58427
|
+
] }),
|
|
58428
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-2 text-xs", children: entry.metrics.slice(0, 4).map((metric) => /* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
58429
|
+
/* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
|
|
58430
|
+
metric.name,
|
|
58431
|
+
":"
|
|
58432
|
+
] }),
|
|
58433
|
+
/* @__PURE__ */ jsx("span", { className: getStatusColor(getMetricStatus(metric)), children: formatValue(metric.value, metric.unit) })
|
|
58434
|
+
] }, metric.name)) })
|
|
58435
|
+
] }) }, entry.timestamp)) })
|
|
58436
|
+
] }),
|
|
58437
|
+
/* @__PURE__ */ jsx(TabsContent, { value: "vitals", className: "space-y-4", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: currentMetrics.filter((metric) => ["FCP", "LCP", "CLS", "FID", "INP", "TTFB"].includes(metric.name)).map((metric) => {
|
|
58438
|
+
const status = getMetricStatus(metric);
|
|
58439
|
+
return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-6", children: [
|
|
58440
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-4", children: [
|
|
58441
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58442
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold", children: metric.name }),
|
|
58443
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: metric.description })
|
|
58444
|
+
] }),
|
|
58445
|
+
getStatusIcon(status)
|
|
58446
|
+
] }),
|
|
58447
|
+
/* @__PURE__ */ jsx("div", { className: "text-2xl font-bold mb-2 text-center", children: /* @__PURE__ */ jsx("span", { className: getStatusColor(status), children: formatValue(metric.value, metric.unit) }) }),
|
|
58448
|
+
metric.threshold && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
58449
|
+
/* @__PURE__ */ jsx(
|
|
58450
|
+
Progress,
|
|
58451
|
+
{
|
|
58452
|
+
value: Math.min(metric.value / (metric.threshold.needs_improvement * 2) * 100, 100),
|
|
58453
|
+
className: "h-3"
|
|
58454
|
+
}
|
|
58455
|
+
),
|
|
58456
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-xs text-muted-foreground", children: [
|
|
58457
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
58458
|
+
"Good: <",
|
|
58459
|
+
metric.threshold.good,
|
|
58460
|
+
metric.unit
|
|
58461
|
+
] }),
|
|
58462
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
58463
|
+
"Poor: >",
|
|
58464
|
+
metric.threshold.needs_improvement,
|
|
58465
|
+
metric.unit
|
|
58466
|
+
] })
|
|
58467
|
+
] })
|
|
58468
|
+
] })
|
|
58469
|
+
] }) }, metric.name);
|
|
58470
|
+
}) }) })
|
|
58471
|
+
] }) })
|
|
58472
|
+
] });
|
|
58473
|
+
};
|
|
58474
|
+
var PerformanceDebugger = ({ className, ...props }) => {
|
|
58475
|
+
const docsProAccess = { hasAccess: true };
|
|
58476
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
58477
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
58478
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
58479
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
58480
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58481
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
58482
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Performance Debugger is available exclusively to MoonUI Pro subscribers." }),
|
|
58483
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
58484
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
58485
|
+
"Upgrade to Pro"
|
|
58486
|
+
] }) })
|
|
58487
|
+
] })
|
|
58488
|
+
] }) }) });
|
|
58489
|
+
}
|
|
58490
|
+
return /* @__PURE__ */ jsx(PerformanceDebuggerInternal, { className, ...props });
|
|
58491
|
+
};
|
|
58492
|
+
var PerformanceMonitorInternal = ({
|
|
58493
|
+
autoRefresh = true,
|
|
58494
|
+
refreshInterval = 5e3,
|
|
58495
|
+
showAlerts = true,
|
|
58496
|
+
alertThresholds = {
|
|
58497
|
+
cpu: 80,
|
|
58498
|
+
memory: 85,
|
|
58499
|
+
disk: 90,
|
|
58500
|
+
network: 1e3
|
|
58501
|
+
},
|
|
58502
|
+
showCharts = true,
|
|
58503
|
+
chartDuration = 3e5,
|
|
58504
|
+
// 5 minutes
|
|
58505
|
+
maxDataPoints = 60,
|
|
58506
|
+
onAlert,
|
|
58507
|
+
onMetricsUpdate,
|
|
58508
|
+
className
|
|
58509
|
+
}) => {
|
|
58510
|
+
const [metrics, setMetrics] = useState(null);
|
|
58511
|
+
const [history2, setHistory] = useState([]);
|
|
58512
|
+
const [alerts, setAlerts] = useState([]);
|
|
58513
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
58514
|
+
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
58515
|
+
const intervalRef = useRef();
|
|
58516
|
+
const generateMockMetrics = useCallback(() => {
|
|
58517
|
+
const baseMetrics = metrics || {
|
|
58518
|
+
cpu: { usage: 25, cores: 8 },
|
|
58519
|
+
memory: { used: 4.2, total: 16, available: 11.8, percentage: 26 },
|
|
58520
|
+
disk: { used: 250, total: 500, free: 250, percentage: 50 },
|
|
58521
|
+
network: { download: 50, upload: 20, latency: 25 },
|
|
58522
|
+
system: { uptime: 86400, loadAverage: [1.2, 1.5, 1.8], processes: 120 }
|
|
58523
|
+
};
|
|
58524
|
+
return {
|
|
58525
|
+
cpu: {
|
|
58526
|
+
usage: Math.max(0, Math.min(100, baseMetrics.cpu.usage + (Math.random() - 0.5) * 20)),
|
|
58527
|
+
cores: baseMetrics.cpu.cores,
|
|
58528
|
+
temperature: 45 + Math.random() * 15
|
|
58529
|
+
},
|
|
58530
|
+
memory: {
|
|
58531
|
+
used: Math.max(0, baseMetrics.memory.used + (Math.random() - 0.5) * 2),
|
|
58532
|
+
total: baseMetrics.memory.total,
|
|
58533
|
+
available: baseMetrics.memory.total - baseMetrics.memory.used,
|
|
58534
|
+
percentage: Math.max(0, Math.min(100, baseMetrics.memory.percentage + (Math.random() - 0.5) * 10))
|
|
58535
|
+
},
|
|
58536
|
+
disk: {
|
|
58537
|
+
used: baseMetrics.disk.used + (Math.random() - 0.5) * 10,
|
|
58538
|
+
total: baseMetrics.disk.total,
|
|
58539
|
+
free: baseMetrics.disk.total - baseMetrics.disk.used,
|
|
58540
|
+
percentage: Math.max(0, Math.min(100, baseMetrics.disk.percentage + (Math.random() - 0.5) * 5))
|
|
58541
|
+
},
|
|
58542
|
+
network: {
|
|
58543
|
+
download: Math.max(0, baseMetrics.network.download + (Math.random() - 0.5) * 30),
|
|
58544
|
+
upload: Math.max(0, baseMetrics.network.upload + (Math.random() - 0.5) * 15),
|
|
58545
|
+
latency: Math.max(1, baseMetrics.network.latency + (Math.random() - 0.5) * 10)
|
|
58546
|
+
},
|
|
58547
|
+
system: {
|
|
58548
|
+
uptime: baseMetrics.system.uptime + refreshInterval / 1e3,
|
|
58549
|
+
loadAverage: baseMetrics.system.loadAverage.map(
|
|
58550
|
+
(load) => Math.max(0, load + (Math.random() - 0.5) * 0.2)
|
|
58551
|
+
),
|
|
58552
|
+
processes: Math.max(50, baseMetrics.system.processes + Math.floor((Math.random() - 0.5) * 10))
|
|
58553
|
+
},
|
|
58554
|
+
browser: typeof window !== "undefined" && "memory" in performance ? {
|
|
58555
|
+
jsHeapUsed: performance.memory.usedJSHeapSize / 1024 / 1024,
|
|
58556
|
+
jsHeapTotal: performance.memory.totalJSHeapSize / 1024 / 1024,
|
|
58557
|
+
jsHeapLimit: performance.memory.jsHeapSizeLimit / 1024 / 1024
|
|
58558
|
+
} : void 0
|
|
58559
|
+
};
|
|
58560
|
+
}, [metrics, refreshInterval]);
|
|
58561
|
+
const checkAlerts = useCallback((newMetrics) => {
|
|
58562
|
+
const newAlerts = [];
|
|
58563
|
+
const now = /* @__PURE__ */ new Date();
|
|
58564
|
+
if (newMetrics.cpu.usage > alertThresholds.cpu) {
|
|
58565
|
+
newAlerts.push({
|
|
58566
|
+
id: `cpu-${Date.now()}`,
|
|
58567
|
+
type: newMetrics.cpu.usage > 95 ? "critical" : "warning",
|
|
58568
|
+
metric: "CPU",
|
|
58569
|
+
message: `CPU usage is ${newMetrics.cpu.usage.toFixed(1)}%`,
|
|
58570
|
+
value: newMetrics.cpu.usage,
|
|
58571
|
+
threshold: alertThresholds.cpu,
|
|
58572
|
+
timestamp: now
|
|
58573
|
+
});
|
|
58574
|
+
}
|
|
58575
|
+
if (newMetrics.memory.percentage > alertThresholds.memory) {
|
|
58576
|
+
newAlerts.push({
|
|
58577
|
+
id: `memory-${Date.now()}`,
|
|
58578
|
+
type: newMetrics.memory.percentage > 95 ? "critical" : "warning",
|
|
58579
|
+
metric: "Memory",
|
|
58580
|
+
message: `Memory usage is ${newMetrics.memory.percentage.toFixed(1)}%`,
|
|
58581
|
+
value: newMetrics.memory.percentage,
|
|
58582
|
+
threshold: alertThresholds.memory,
|
|
58583
|
+
timestamp: now
|
|
58584
|
+
});
|
|
58585
|
+
}
|
|
58586
|
+
if (newMetrics.disk.percentage > alertThresholds.disk) {
|
|
58587
|
+
newAlerts.push({
|
|
58588
|
+
id: `disk-${Date.now()}`,
|
|
58589
|
+
type: newMetrics.disk.percentage > 98 ? "critical" : "warning",
|
|
58590
|
+
metric: "Disk",
|
|
58591
|
+
message: `Disk usage is ${newMetrics.disk.percentage.toFixed(1)}%`,
|
|
58592
|
+
value: newMetrics.disk.percentage,
|
|
58593
|
+
threshold: alertThresholds.disk,
|
|
58594
|
+
timestamp: now
|
|
58595
|
+
});
|
|
58596
|
+
}
|
|
58597
|
+
if (newMetrics.network.latency > alertThresholds.network) {
|
|
58598
|
+
newAlerts.push({
|
|
58599
|
+
id: `network-${Date.now()}`,
|
|
58600
|
+
type: "warning",
|
|
58601
|
+
metric: "Network",
|
|
58602
|
+
message: `High network latency: ${newMetrics.network.latency.toFixed(0)}ms`,
|
|
58603
|
+
value: newMetrics.network.latency,
|
|
58604
|
+
threshold: alertThresholds.network,
|
|
58605
|
+
timestamp: now
|
|
58606
|
+
});
|
|
58607
|
+
}
|
|
58608
|
+
if (newAlerts.length > 0) {
|
|
58609
|
+
setAlerts((prev) => [...newAlerts, ...prev].slice(0, 20));
|
|
58610
|
+
newAlerts.forEach((alert) => onAlert?.(alert));
|
|
58611
|
+
}
|
|
58612
|
+
}, [alertThresholds, onAlert]);
|
|
58613
|
+
const updateMetrics = useCallback(async () => {
|
|
58614
|
+
setIsRefreshing(true);
|
|
58615
|
+
try {
|
|
58616
|
+
const newMetrics = generateMockMetrics();
|
|
58617
|
+
setMetrics(newMetrics);
|
|
58618
|
+
setHistory((prev) => {
|
|
58619
|
+
const newHistory = [
|
|
58620
|
+
{ timestamp: Date.now(), metrics: newMetrics },
|
|
58621
|
+
...prev.slice(0, maxDataPoints - 1)
|
|
58622
|
+
];
|
|
58623
|
+
return newHistory;
|
|
58624
|
+
});
|
|
58625
|
+
if (showAlerts) {
|
|
58626
|
+
checkAlerts(newMetrics);
|
|
58627
|
+
}
|
|
58628
|
+
onMetricsUpdate?.(newMetrics);
|
|
58629
|
+
} catch (error) {
|
|
58630
|
+
console.error("Failed to update metrics:", error);
|
|
58631
|
+
} finally {
|
|
58632
|
+
setIsRefreshing(false);
|
|
58633
|
+
}
|
|
58634
|
+
}, [generateMockMetrics, maxDataPoints, showAlerts, checkAlerts, onMetricsUpdate]);
|
|
58635
|
+
useEffect(() => {
|
|
58636
|
+
updateMetrics();
|
|
58637
|
+
}, []);
|
|
58638
|
+
useEffect(() => {
|
|
58639
|
+
if (!autoRefresh)
|
|
58640
|
+
return;
|
|
58641
|
+
intervalRef.current = setInterval(updateMetrics, refreshInterval);
|
|
58642
|
+
return () => {
|
|
58643
|
+
if (intervalRef.current) {
|
|
58644
|
+
clearInterval(intervalRef.current);
|
|
58645
|
+
}
|
|
58646
|
+
};
|
|
58647
|
+
}, [autoRefresh, refreshInterval, updateMetrics]);
|
|
58648
|
+
const formatBytes = (bytes, decimals = 1) => {
|
|
58649
|
+
if (bytes === 0)
|
|
58650
|
+
return "0 B";
|
|
58651
|
+
const k = 1024;
|
|
58652
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
58653
|
+
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
58654
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
58655
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
|
58656
|
+
};
|
|
58657
|
+
const formatUptime = (seconds) => {
|
|
58658
|
+
const days = Math.floor(seconds / 86400);
|
|
58659
|
+
const hours = Math.floor(seconds % 86400 / 3600);
|
|
58660
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
58661
|
+
if (days > 0)
|
|
58662
|
+
return `${days}d ${hours}h ${minutes}m`;
|
|
58663
|
+
if (hours > 0)
|
|
58664
|
+
return `${hours}h ${minutes}m`;
|
|
58665
|
+
return `${minutes}m`;
|
|
58666
|
+
};
|
|
58667
|
+
const getStatusColor = (percentage, thresholds = [70, 85]) => {
|
|
58668
|
+
if (percentage >= thresholds[1])
|
|
58669
|
+
return "text-red-500";
|
|
58670
|
+
if (percentage >= thresholds[0])
|
|
58671
|
+
return "text-yellow-500";
|
|
58672
|
+
return "text-green-500";
|
|
58673
|
+
};
|
|
58674
|
+
const exportMetrics = () => {
|
|
58675
|
+
const data = {
|
|
58676
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
58677
|
+
currentMetrics: metrics,
|
|
58678
|
+
history: history2.slice(0, 20),
|
|
58679
|
+
alerts: alerts.slice(0, 10)
|
|
58680
|
+
};
|
|
58681
|
+
const blob = new Blob([JSON.stringify(data, null, 2)], {
|
|
58682
|
+
type: "application/json"
|
|
58683
|
+
});
|
|
58684
|
+
const url = URL.createObjectURL(blob);
|
|
58685
|
+
const link = document.createElement("a");
|
|
58686
|
+
link.href = url;
|
|
58687
|
+
link.download = `performance-metrics-${Date.now()}.json`;
|
|
58688
|
+
document.body.appendChild(link);
|
|
58689
|
+
link.click();
|
|
58690
|
+
document.body.removeChild(link);
|
|
58691
|
+
URL.revokeObjectURL(url);
|
|
58692
|
+
};
|
|
58693
|
+
if (!isVisible) {
|
|
58694
|
+
return /* @__PURE__ */ jsxs(
|
|
58695
|
+
Button,
|
|
58696
|
+
{
|
|
58697
|
+
variant: "outline",
|
|
58698
|
+
size: "sm",
|
|
58699
|
+
onClick: () => setIsVisible(true),
|
|
58700
|
+
className: "fixed bottom-4 left-4 z-50",
|
|
58701
|
+
children: [
|
|
58702
|
+
/* @__PURE__ */ jsx(Monitor, { className: "h-4 w-4 mr-2" }),
|
|
58703
|
+
"Performance"
|
|
58704
|
+
]
|
|
58705
|
+
}
|
|
58706
|
+
);
|
|
58707
|
+
}
|
|
58708
|
+
if (!metrics) {
|
|
58709
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-full max-w-6xl", className), children: /* @__PURE__ */ jsx(CardContent, { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
58710
|
+
/* @__PURE__ */ jsx(Activity, { className: "h-12 w-12 animate-pulse mx-auto mb-4 text-muted-foreground" }),
|
|
58711
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "Loading performance metrics..." })
|
|
58712
|
+
] }) }) });
|
|
58713
|
+
}
|
|
58714
|
+
return /* @__PURE__ */ jsxs(Card, { className: cn("w-full max-w-6xl", className), children: [
|
|
58715
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58716
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58717
|
+
/* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
|
|
58718
|
+
/* @__PURE__ */ jsx(Monitor, { className: "h-5 w-5" }),
|
|
58719
|
+
"Performance Monitor"
|
|
58720
|
+
] }),
|
|
58721
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Real-time system performance monitoring and alerts" })
|
|
58722
|
+
] }),
|
|
58723
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58724
|
+
/* @__PURE__ */ jsxs(Badge, { variant: autoRefresh ? "default" : "secondary", className: "gap-1", children: [
|
|
58725
|
+
autoRefresh ? /* @__PURE__ */ jsx(Activity, { className: "h-3 w-3 animate-pulse" }) : /* @__PURE__ */ jsx(Timer, { className: "h-3 w-3" }),
|
|
58726
|
+
autoRefresh ? "Live" : "Paused"
|
|
58727
|
+
] }),
|
|
58728
|
+
showAlerts && alerts.length > 0 && /* @__PURE__ */ jsxs(Badge, { variant: "destructive", className: "gap-1", children: [
|
|
58729
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "h-3 w-3" }),
|
|
58730
|
+
alerts.length
|
|
58731
|
+
] }),
|
|
58732
|
+
/* @__PURE__ */ jsx(
|
|
58733
|
+
Button,
|
|
58734
|
+
{
|
|
58735
|
+
variant: "outline",
|
|
58736
|
+
size: "sm",
|
|
58737
|
+
onClick: updateMetrics,
|
|
58738
|
+
disabled: isRefreshing,
|
|
58739
|
+
children: /* @__PURE__ */ jsx(RefreshCw, { className: cn("h-4 w-4", isRefreshing && "animate-spin") })
|
|
58740
|
+
}
|
|
58741
|
+
),
|
|
58742
|
+
/* @__PURE__ */ jsx(
|
|
58743
|
+
Button,
|
|
58744
|
+
{
|
|
58745
|
+
variant: "outline",
|
|
58746
|
+
size: "sm",
|
|
58747
|
+
onClick: exportMetrics,
|
|
58748
|
+
children: /* @__PURE__ */ jsx(Download, { className: "h-4 w-4" })
|
|
58749
|
+
}
|
|
58750
|
+
),
|
|
58751
|
+
/* @__PURE__ */ jsx(
|
|
58752
|
+
Button,
|
|
58753
|
+
{
|
|
58754
|
+
variant: "ghost",
|
|
58755
|
+
size: "sm",
|
|
58756
|
+
onClick: () => setIsVisible(false),
|
|
58757
|
+
children: /* @__PURE__ */ jsx(EyeOff, { className: "h-4 w-4" })
|
|
58758
|
+
}
|
|
58759
|
+
)
|
|
58760
|
+
] })
|
|
58761
|
+
] }) }),
|
|
58762
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Tabs, { defaultValue: "overview", className: "w-full", children: [
|
|
58763
|
+
/* @__PURE__ */ jsxs(TabsList, { className: "grid w-full grid-cols-4", children: [
|
|
58764
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "overview", children: "Overview" }),
|
|
58765
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "details", children: "Details" }),
|
|
58766
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "alerts", children: "Alerts" }),
|
|
58767
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "history", children: "History" })
|
|
58768
|
+
] }),
|
|
58769
|
+
/* @__PURE__ */ jsxs(TabsContent, { value: "overview", className: "space-y-6", children: [
|
|
58770
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4", children: [
|
|
58771
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
58772
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58773
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58774
|
+
/* @__PURE__ */ jsx(Cpu, { className: "h-4 w-4 text-blue-500" }),
|
|
58775
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "CPU" })
|
|
58776
|
+
] }),
|
|
58777
|
+
/* @__PURE__ */ jsxs("span", { className: cn("font-bold", getStatusColor(metrics.cpu.usage)), children: [
|
|
58778
|
+
metrics.cpu.usage.toFixed(1),
|
|
58779
|
+
"%"
|
|
58780
|
+
] })
|
|
58781
|
+
] }),
|
|
58782
|
+
/* @__PURE__ */ jsx(Progress, { value: metrics.cpu.usage, className: "h-2 mt-2" }),
|
|
58783
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: [
|
|
58784
|
+
metrics.cpu.cores,
|
|
58785
|
+
" cores ",
|
|
58786
|
+
metrics.cpu.temperature && `\u2022 ${metrics.cpu.temperature.toFixed(0)}\xB0C`
|
|
58787
|
+
] })
|
|
58788
|
+
] }) }),
|
|
58789
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
58790
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58791
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58792
|
+
/* @__PURE__ */ jsx(MemoryStick, { className: "h-4 w-4 text-green-500" }),
|
|
58793
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Memory" })
|
|
58794
|
+
] }),
|
|
58795
|
+
/* @__PURE__ */ jsxs("span", { className: cn("font-bold", getStatusColor(metrics.memory.percentage)), children: [
|
|
58796
|
+
metrics.memory.percentage.toFixed(1),
|
|
58797
|
+
"%"
|
|
58798
|
+
] })
|
|
58799
|
+
] }),
|
|
58800
|
+
/* @__PURE__ */ jsx(Progress, { value: metrics.memory.percentage, className: "h-2 mt-2" }),
|
|
58801
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: [
|
|
58802
|
+
formatBytes(metrics.memory.used * 1024 * 1024 * 1024),
|
|
58803
|
+
" / ",
|
|
58804
|
+
formatBytes(metrics.memory.total * 1024 * 1024 * 1024)
|
|
58805
|
+
] })
|
|
58806
|
+
] }) }),
|
|
58807
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
58808
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58809
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58810
|
+
/* @__PURE__ */ jsx(HardDrive, { className: "h-4 w-4 text-purple-500" }),
|
|
58811
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Disk" })
|
|
58812
|
+
] }),
|
|
58813
|
+
/* @__PURE__ */ jsxs("span", { className: cn("font-bold", getStatusColor(metrics.disk.percentage, [80, 90])), children: [
|
|
58814
|
+
metrics.disk.percentage.toFixed(1),
|
|
58815
|
+
"%"
|
|
58816
|
+
] })
|
|
58817
|
+
] }),
|
|
58818
|
+
/* @__PURE__ */ jsx(Progress, { value: metrics.disk.percentage, className: "h-2 mt-2" }),
|
|
58819
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: [
|
|
58820
|
+
formatBytes(metrics.disk.used * 1024 * 1024 * 1024),
|
|
58821
|
+
" / ",
|
|
58822
|
+
formatBytes(metrics.disk.total * 1024 * 1024 * 1024)
|
|
58823
|
+
] })
|
|
58824
|
+
] }) }),
|
|
58825
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "p-4", children: [
|
|
58826
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58827
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58828
|
+
/* @__PURE__ */ jsx(Network, { className: "h-4 w-4 text-orange-500" }),
|
|
58829
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Network" })
|
|
58830
|
+
] }),
|
|
58831
|
+
/* @__PURE__ */ jsxs("span", { className: cn("font-bold", getStatusColor(metrics.network.latency, [50, 100])), children: [
|
|
58832
|
+
metrics.network.latency.toFixed(0),
|
|
58833
|
+
"ms"
|
|
58834
|
+
] })
|
|
58835
|
+
] }),
|
|
58836
|
+
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground mt-2", children: [
|
|
58837
|
+
"\u2193 ",
|
|
58838
|
+
metrics.network.download.toFixed(0),
|
|
58839
|
+
" MB/s \u2022 \u2191 ",
|
|
58840
|
+
metrics.network.upload.toFixed(0),
|
|
58841
|
+
" MB/s"
|
|
58842
|
+
] })
|
|
58843
|
+
] }) })
|
|
58844
|
+
] }),
|
|
58845
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
58846
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
58847
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: "System Information" }) }),
|
|
58848
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-3", children: [
|
|
58849
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
58850
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Uptime:" }),
|
|
58851
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatUptime(metrics.system.uptime) })
|
|
58852
|
+
] }),
|
|
58853
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
58854
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Processes:" }),
|
|
58855
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: metrics.system.processes })
|
|
58856
|
+
] }),
|
|
58857
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
58858
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Load Average:" }),
|
|
58859
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: metrics.system.loadAverage.map((load) => load.toFixed(2)).join(", ") })
|
|
58860
|
+
] })
|
|
58861
|
+
] })
|
|
58862
|
+
] }),
|
|
58863
|
+
metrics.browser && /* @__PURE__ */ jsxs(Card, { children: [
|
|
58864
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: "Browser Memory" }) }),
|
|
58865
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-3", children: [
|
|
58866
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
58867
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "JS Heap Used:" }),
|
|
58868
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatBytes(metrics.browser.jsHeapUsed * 1024 * 1024) })
|
|
58869
|
+
] }),
|
|
58870
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
58871
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "JS Heap Total:" }),
|
|
58872
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatBytes(metrics.browser.jsHeapTotal * 1024 * 1024) })
|
|
58873
|
+
] }),
|
|
58874
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
58875
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "JS Heap Limit:" }),
|
|
58876
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatBytes(metrics.browser.jsHeapLimit * 1024 * 1024) })
|
|
58877
|
+
] })
|
|
58878
|
+
] })
|
|
58879
|
+
] })
|
|
58880
|
+
] })
|
|
58881
|
+
] }),
|
|
58882
|
+
/* @__PURE__ */ jsx(TabsContent, { value: "details", className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
58883
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
58884
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "text-base flex items-center gap-2", children: [
|
|
58885
|
+
/* @__PURE__ */ jsx(Cpu, { className: "h-4 w-4" }),
|
|
58886
|
+
"CPU Details"
|
|
58887
|
+
] }) }),
|
|
58888
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
|
|
58889
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58890
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm mb-2", children: [
|
|
58891
|
+
/* @__PURE__ */ jsx("span", { children: "Usage" }),
|
|
58892
|
+
/* @__PURE__ */ jsxs("span", { className: getStatusColor(metrics.cpu.usage), children: [
|
|
58893
|
+
metrics.cpu.usage.toFixed(1),
|
|
58894
|
+
"%"
|
|
58895
|
+
] })
|
|
58896
|
+
] }),
|
|
58897
|
+
/* @__PURE__ */ jsx(Progress, { value: metrics.cpu.usage, className: "h-2" })
|
|
58898
|
+
] }),
|
|
58899
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4 text-sm", children: [
|
|
58900
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58901
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Cores:" }),
|
|
58902
|
+
/* @__PURE__ */ jsx("span", { className: "ml-2 font-medium", children: metrics.cpu.cores })
|
|
58903
|
+
] }),
|
|
58904
|
+
metrics.cpu.temperature && /* @__PURE__ */ jsxs("div", { children: [
|
|
58905
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Temperature:" }),
|
|
58906
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-2 font-medium", children: [
|
|
58907
|
+
metrics.cpu.temperature.toFixed(0),
|
|
58908
|
+
"\xB0C"
|
|
58909
|
+
] })
|
|
58910
|
+
] })
|
|
58911
|
+
] })
|
|
58912
|
+
] })
|
|
58913
|
+
] }),
|
|
58914
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
58915
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "text-base flex items-center gap-2", children: [
|
|
58916
|
+
/* @__PURE__ */ jsx(MemoryStick, { className: "h-4 w-4" }),
|
|
58917
|
+
"Memory Details"
|
|
58918
|
+
] }) }),
|
|
58919
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
|
|
58920
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58921
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm mb-2", children: [
|
|
58922
|
+
/* @__PURE__ */ jsx("span", { children: "Usage" }),
|
|
58923
|
+
/* @__PURE__ */ jsxs("span", { className: getStatusColor(metrics.memory.percentage), children: [
|
|
58924
|
+
metrics.memory.percentage.toFixed(1),
|
|
58925
|
+
"%"
|
|
58926
|
+
] })
|
|
58927
|
+
] }),
|
|
58928
|
+
/* @__PURE__ */ jsx(Progress, { value: metrics.memory.percentage, className: "h-2" })
|
|
58929
|
+
] }),
|
|
58930
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2 text-sm", children: [
|
|
58931
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
58932
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Used:" }),
|
|
58933
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatBytes(metrics.memory.used * 1024 * 1024 * 1024) })
|
|
58934
|
+
] }),
|
|
58935
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
58936
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Available:" }),
|
|
58937
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatBytes(metrics.memory.available * 1024 * 1024 * 1024) })
|
|
58938
|
+
] }),
|
|
58939
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
58940
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Total:" }),
|
|
58941
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: formatBytes(metrics.memory.total * 1024 * 1024 * 1024) })
|
|
58942
|
+
] })
|
|
58943
|
+
] })
|
|
58944
|
+
] })
|
|
58945
|
+
] })
|
|
58946
|
+
] }) }),
|
|
58947
|
+
/* @__PURE__ */ jsxs(TabsContent, { value: "alerts", className: "space-y-4", children: [
|
|
58948
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58949
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
58950
|
+
alerts.length,
|
|
58951
|
+
" alerts"
|
|
58952
|
+
] }),
|
|
58953
|
+
/* @__PURE__ */ jsx(
|
|
58954
|
+
Button,
|
|
58955
|
+
{
|
|
58956
|
+
variant: "outline",
|
|
58957
|
+
size: "sm",
|
|
58958
|
+
onClick: () => setAlerts([]),
|
|
58959
|
+
disabled: alerts.length === 0,
|
|
58960
|
+
children: "Clear All"
|
|
58961
|
+
}
|
|
58962
|
+
)
|
|
58963
|
+
] }),
|
|
58964
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2 max-h-96 overflow-y-auto", children: /* @__PURE__ */ jsx(AnimatePresence, { children: alerts.map((alert, index2) => /* @__PURE__ */ jsx(
|
|
58965
|
+
motion.div,
|
|
58966
|
+
{
|
|
58967
|
+
initial: { opacity: 0, x: -20 },
|
|
58968
|
+
animate: { opacity: 1, x: 0 },
|
|
58969
|
+
exit: { opacity: 0, x: 20 },
|
|
58970
|
+
transition: { delay: index2 * 0.05 },
|
|
58971
|
+
children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { className: "p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
58972
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
58973
|
+
alert.type === "critical" ? /* @__PURE__ */ jsx(AlertTriangle, { className: "h-4 w-4 text-red-500" }) : alert.type === "warning" ? /* @__PURE__ */ jsx(AlertTriangle, { className: "h-4 w-4 text-yellow-500" }) : /* @__PURE__ */ jsx(CheckCircle, { className: "h-4 w-4 text-blue-500" }),
|
|
58974
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
58975
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium text-sm", children: alert.metric }),
|
|
58976
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: alert.message })
|
|
58977
|
+
] })
|
|
58978
|
+
] }),
|
|
58979
|
+
/* @__PURE__ */ jsxs("div", { className: "text-right text-sm", children: [
|
|
58980
|
+
/* @__PURE__ */ jsxs("div", { className: "font-medium", children: [
|
|
58981
|
+
alert.value.toFixed(1),
|
|
58982
|
+
alert.metric === "Network" ? "ms" : "%"
|
|
58983
|
+
] }),
|
|
58984
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: alert.timestamp.toLocaleTimeString() })
|
|
58985
|
+
] })
|
|
58986
|
+
] }) }) })
|
|
58987
|
+
},
|
|
58988
|
+
alert.id
|
|
58989
|
+
)) }) }),
|
|
58990
|
+
alerts.length === 0 && /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
58991
|
+
/* @__PURE__ */ jsx(CheckCircle, { className: "h-12 w-12 mx-auto mb-4 text-green-500" }),
|
|
58992
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No alerts - System is running smoothly" })
|
|
58993
|
+
] })
|
|
58994
|
+
] }),
|
|
58995
|
+
/* @__PURE__ */ jsxs(TabsContent, { value: "history", className: "space-y-4", children: [
|
|
58996
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
58997
|
+
"Last ",
|
|
58998
|
+
history2.length,
|
|
58999
|
+
" data points (",
|
|
59000
|
+
Math.round(chartDuration / 6e4),
|
|
59001
|
+
" minutes)"
|
|
59002
|
+
] }),
|
|
59003
|
+
showCharts && history2.length > 1 && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
59004
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
59005
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: "CPU Usage Trend" }) }),
|
|
59006
|
+
/* @__PURE__ */ jsxs(CardContent, { children: [
|
|
59007
|
+
/* @__PURE__ */ jsx("div", { className: "h-32 flex items-end justify-between gap-1", children: history2.slice(-20).reverse().map((point, index2) => /* @__PURE__ */ jsx(
|
|
59008
|
+
"div",
|
|
59009
|
+
{
|
|
59010
|
+
className: "bg-blue-500 rounded-t min-w-[4px] flex-1 transition-all",
|
|
59011
|
+
style: { height: `${point.metrics.cpu.usage / 100 * 128}px` }
|
|
59012
|
+
},
|
|
59013
|
+
index2
|
|
59014
|
+
)) }),
|
|
59015
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground mt-2 text-center", children: "Last 20 readings" })
|
|
59016
|
+
] })
|
|
59017
|
+
] }),
|
|
59018
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
59019
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: "Memory Usage Trend" }) }),
|
|
59020
|
+
/* @__PURE__ */ jsxs(CardContent, { children: [
|
|
59021
|
+
/* @__PURE__ */ jsx("div", { className: "h-32 flex items-end justify-between gap-1", children: history2.slice(-20).reverse().map((point, index2) => /* @__PURE__ */ jsx(
|
|
59022
|
+
"div",
|
|
59023
|
+
{
|
|
59024
|
+
className: "bg-green-500 rounded-t min-w-[4px] flex-1 transition-all",
|
|
59025
|
+
style: { height: `${point.metrics.memory.percentage / 100 * 128}px` }
|
|
59026
|
+
},
|
|
59027
|
+
index2
|
|
59028
|
+
)) }),
|
|
59029
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground mt-2 text-center", children: "Last 20 readings" })
|
|
59030
|
+
] })
|
|
59031
|
+
] })
|
|
59032
|
+
] }),
|
|
59033
|
+
history2.length === 0 && /* @__PURE__ */ jsxs("div", { className: "text-center py-8", children: [
|
|
59034
|
+
/* @__PURE__ */ jsx(BarChart3, { className: "h-12 w-12 mx-auto mb-4 text-muted-foreground" }),
|
|
59035
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No historical data available" })
|
|
59036
|
+
] })
|
|
59037
|
+
] })
|
|
59038
|
+
] }) })
|
|
59039
|
+
] });
|
|
59040
|
+
};
|
|
59041
|
+
var PerformanceMonitor = ({ className, ...props }) => {
|
|
59042
|
+
const docsProAccess = { hasAccess: true };
|
|
59043
|
+
const { hasProAccess, isLoading } = useSubscription();
|
|
59044
|
+
if (!docsProAccess.isDocsMode && !isLoading && !hasProAccess) {
|
|
59045
|
+
return /* @__PURE__ */ jsx(Card, { className: cn("w-fit", className), children: /* @__PURE__ */ jsx(CardContent, { className: "py-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
59046
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto", children: /* @__PURE__ */ jsx(Lock, { className: "h-6 w-6 text-purple-600 dark:text-purple-400" }) }),
|
|
59047
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
59048
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-2", children: "Pro Feature" }),
|
|
59049
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-xs mb-4", children: "Performance Monitor is available exclusively to MoonUI Pro subscribers." }),
|
|
59050
|
+
/* @__PURE__ */ jsx("a", { href: "/pricing", children: /* @__PURE__ */ jsxs(Button, { size: "sm", children: [
|
|
59051
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "mr-2 h-4 w-4" }),
|
|
59052
|
+
"Upgrade to Pro"
|
|
59053
|
+
] }) })
|
|
59054
|
+
] })
|
|
59055
|
+
] }) }) });
|
|
59056
|
+
}
|
|
59057
|
+
return /* @__PURE__ */ jsx(PerformanceMonitorInternal, { className, ...props });
|
|
59058
|
+
};
|
|
55972
59059
|
|
|
55973
|
-
export { AdvancedChart, AnimatedButton, Calendar2 as Calendar, Dashboard, DraggableList, ErrorBoundary, FloatingActionButton, HoverCard3D, Kanban, MagneticButton, MemoryAnalytics, MemoryEfficientData, PinchZoom, RichTextEditor, SelectableVirtualList, SpotlightCard, SwipeableCard, Timeline, VirtualList, animatedButtonVariants, useStreamingData, useVirtualList };
|
|
59060
|
+
export { AdvancedChart, AdvancedForms, AnimatedButton, Calendar2 as Calendar, ColorPicker2 as ColorPicker, Dashboard, DraggableList, ErrorBoundary, FloatingActionButton, GitHubStars, HealthCheck, HoverCard3D, Kanban, LazyComponent, LazyImage, LazyList, MagneticButton, MemoryAnalytics, MemoryEfficientData, OptimizedImage, PerformanceDebugger, PerformanceMonitor, PinchZoom, RichTextEditor, SelectableVirtualList, SpotlightCard, SwipeableCard, Timeline, VirtualList, animatedButtonVariants, useStreamingData, useVirtualList };
|