@moontra/moonui 2.0.7 → 2.0.9
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/package.json +26 -19
- package/src/__tests__/use-intersection-observer.test.tsx +216 -0
- package/src/__tests__/use-local-storage.test.tsx +174 -0
- package/src/__tests__/use-pro-access.test.tsx +183 -0
- package/src/components/ui/__tests__/accordion.test.tsx +571 -0
- package/src/components/ui/__tests__/alert.test.tsx +484 -0
- package/src/components/ui/__tests__/aspect-ratio.test.tsx +492 -0
- package/src/components/ui/__tests__/avatar.test.tsx +382 -0
- package/src/components/ui/__tests__/badge.test.tsx +364 -0
- package/src/components/ui/__tests__/breadcrumb.test.tsx +687 -0
- package/src/components/ui/__tests__/button.test.tsx +91 -0
- package/src/components/ui/__tests__/card.test.tsx +104 -0
- package/src/components/ui/__tests__/checkbox.test.tsx +591 -0
- package/src/components/ui/__tests__/collapsible.test.tsx +592 -0
- package/src/components/ui/__tests__/color-picker.test.tsx +365 -0
- package/src/components/ui/__tests__/command.test.tsx +677 -0
- package/src/components/ui/__tests__/data-table.test.tsx +256 -0
- package/src/components/ui/__tests__/date-picker.test.tsx +320 -0
- package/src/components/ui/__tests__/dialog.test.tsx +764 -0
- package/src/components/ui/__tests__/input.test.tsx +318 -0
- package/src/components/ui/__tests__/label.test.tsx +103 -0
- package/src/components/ui/__tests__/popover.test.tsx +637 -0
- package/src/components/ui/__tests__/progress.test.tsx +382 -0
- package/src/components/ui/__tests__/radio-group.test.tsx +555 -0
- package/src/components/ui/__tests__/select.test.tsx +705 -0
- package/src/components/ui/__tests__/skeleton.test.tsx +253 -0
- package/src/components/ui/__tests__/slider.test.tsx +493 -0
- package/src/components/ui/__tests__/switch.test.tsx +372 -0
- package/src/components/ui/__tests__/table.test.tsx +824 -0
- package/src/components/ui/__tests__/tabs.test.tsx +887 -0
- package/src/components/ui/__tests__/toast.test.tsx +458 -0
- package/src/components/ui/__tests__/tooltip.test.tsx +583 -0
- package/src/components/ui/accordion.tsx +63 -0
- package/src/components/ui/alert.tsx +130 -0
- package/src/components/ui/aspect-ratio.tsx +72 -0
- package/src/components/ui/avatar.tsx +135 -0
- package/src/components/ui/badge.tsx +225 -0
- package/src/components/ui/breadcrumb.tsx +207 -0
- package/src/components/ui/button.stories.tsx +162 -0
- package/src/components/ui/button.tsx +221 -0
- package/src/components/ui/calendar.tsx +262 -0
- package/src/components/ui/card.stories.tsx +208 -0
- package/src/components/ui/card.tsx +141 -0
- package/src/components/ui/checkbox.tsx +256 -0
- package/src/components/ui/collapsible.tsx +129 -0
- package/src/components/ui/color-picker.tsx +664 -0
- package/src/components/ui/command.tsx +218 -0
- package/src/components/ui/data-table.stories.tsx +509 -0
- package/src/components/ui/data-table.tsx +623 -0
- package/src/components/ui/date-picker.stories.tsx +321 -0
- package/src/components/ui/date-picker.tsx +603 -0
- package/src/components/ui/dialog.tsx +332 -0
- package/src/components/ui/dropdown-menu.tsx +200 -0
- package/src/components/ui/file-upload.tsx +400 -0
- package/src/components/ui/github-stars.tsx +201 -0
- package/src/components/ui/index.ts +12 -0
- package/src/components/ui/input.stories.tsx +255 -0
- package/src/components/ui/input.tsx +219 -0
- package/src/components/ui/label.tsx +26 -0
- package/src/components/ui/locked-component.tsx +215 -0
- package/src/components/ui/moon-logo.tsx +97 -0
- package/src/components/ui/pagination.tsx +116 -0
- package/src/components/ui/popover.tsx +183 -0
- package/src/components/ui/progress.tsx +182 -0
- package/src/components/ui/radio-group.tsx +243 -0
- package/src/components/ui/select.tsx +273 -0
- package/src/components/ui/separator.tsx +140 -0
- package/src/components/ui/simple-editor.tsx +652 -0
- package/src/components/ui/skeleton.tsx +351 -0
- package/src/components/ui/slider.tsx +351 -0
- package/src/components/ui/switch.tsx +83 -0
- package/src/components/ui/table.tsx +322 -0
- package/src/components/ui/tabs.tsx +195 -0
- package/src/components/ui/textarea.tsx +46 -0
- package/src/components/ui/toast.tsx +313 -0
- package/src/components/ui/toggle.tsx +47 -0
- package/src/components/ui/tooltip.tsx +152 -0
- package/src/docs/theme-system.md +1194 -0
- package/src/index.tsx +39 -0
- package/src/lib/micro-interactions.ts +255 -0
- package/src/lib/theme.tsx +398 -0
- package/src/lib/utils.ts +69 -0
- package/src/styles/design-system.css +365 -0
- package/src/styles/index.css +4 -0
- package/src/styles/tailwind.css +6 -0
- package/src/styles/tokens.css +453 -0
- package/src/use-intersection-observer.tsx +154 -0
- package/src/use-local-storage.tsx +71 -0
- package/src/use-paddle.ts +138 -0
- package/src/use-performance-optimizer.ts +379 -0
- package/src/use-pro-access.ts +141 -0
- package/src/use-scroll-animation.ts +221 -0
- package/src/use-subscription.ts +37 -0
- package/src/use-toast.ts +32 -0
package/src/lib/utils.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type ClassValue, clsx } from "clsx";
|
|
2
|
+
import { twMerge } from "tailwind-merge";
|
|
3
|
+
|
|
4
|
+
// Utility function using clsx and tailwind-merge
|
|
5
|
+
export function cn(...inputs: ClassValue[]) {
|
|
6
|
+
return twMerge(clsx(inputs));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Date formatting utility
|
|
10
|
+
export function formatDate(date: Date): string {
|
|
11
|
+
if (isNaN(date.getTime())) {
|
|
12
|
+
return 'Invalid Date'
|
|
13
|
+
}
|
|
14
|
+
return date.toLocaleDateString('en-US', {
|
|
15
|
+
year: 'numeric',
|
|
16
|
+
month: 'short',
|
|
17
|
+
day: 'numeric'
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Currency formatting utility
|
|
22
|
+
export function formatCurrency(amount: number): string {
|
|
23
|
+
return new Intl.NumberFormat('en-US', {
|
|
24
|
+
style: 'currency',
|
|
25
|
+
currency: 'USD'
|
|
26
|
+
}).format(amount)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Text truncation utility
|
|
30
|
+
export function truncateText(text: string, maxLength: number): string {
|
|
31
|
+
if (text.length <= maxLength) {
|
|
32
|
+
return text
|
|
33
|
+
}
|
|
34
|
+
return text.slice(0, maxLength) + '...'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ID generation utility
|
|
38
|
+
export function generateId(length: number = 8): string {
|
|
39
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
|
|
40
|
+
let result = ''
|
|
41
|
+
for (let i = 0; i < length; i++) {
|
|
42
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length))
|
|
43
|
+
}
|
|
44
|
+
return result
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Get client IP address from request
|
|
48
|
+
export function getClientIP(request: Request): string {
|
|
49
|
+
// Check various headers for IP address
|
|
50
|
+
const forwarded = request.headers.get('x-forwarded-for')
|
|
51
|
+
const realIP = request.headers.get('x-real-ip')
|
|
52
|
+
const remoteAddr = request.headers.get('x-remote-addr')
|
|
53
|
+
|
|
54
|
+
if (forwarded) {
|
|
55
|
+
// x-forwarded-for can contain multiple IPs, take the first one
|
|
56
|
+
return forwarded.split(',')[0].trim()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (realIP) {
|
|
60
|
+
return realIP
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (remoteAddr) {
|
|
64
|
+
return remoteAddr
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Fallback to a default IP if none found
|
|
68
|
+
return '127.0.0.1'
|
|
69
|
+
}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/* MoonUI Design System - Advanced Tokens */
|
|
2
|
+
|
|
3
|
+
@layer base {
|
|
4
|
+
:root {
|
|
5
|
+
/* ===== Semantic Color Tokens ===== */
|
|
6
|
+
|
|
7
|
+
/* Background Layers */
|
|
8
|
+
--bg-base: var(--background);
|
|
9
|
+
--bg-subtle: var(--gray-50);
|
|
10
|
+
--bg-muted: var(--gray-100);
|
|
11
|
+
--bg-emphasis: var(--gray-200);
|
|
12
|
+
--bg-inverse: var(--foreground);
|
|
13
|
+
|
|
14
|
+
/* Surface Colors */
|
|
15
|
+
--surface-base: var(--background);
|
|
16
|
+
--surface-overlay: var(--gray-50);
|
|
17
|
+
--surface-raised: var(--background);
|
|
18
|
+
--surface-sunken: var(--gray-100);
|
|
19
|
+
|
|
20
|
+
/* Text Colors */
|
|
21
|
+
--text-primary: var(--foreground);
|
|
22
|
+
--text-secondary: var(--gray-600);
|
|
23
|
+
--text-tertiary: var(--gray-500);
|
|
24
|
+
--text-disabled: var(--gray-400);
|
|
25
|
+
--text-inverse: var(--background);
|
|
26
|
+
--text-link: var(--primary);
|
|
27
|
+
--text-link-hover: var(--primary-hover);
|
|
28
|
+
|
|
29
|
+
/* Brand Colors */
|
|
30
|
+
--brand-primary: var(--primary);
|
|
31
|
+
--brand-primary-hover: var(--primary-hover);
|
|
32
|
+
--brand-primary-active: var(--primary-active);
|
|
33
|
+
--brand-secondary: var(--secondary);
|
|
34
|
+
|
|
35
|
+
/* Interactive States */
|
|
36
|
+
--state-hover: var(--gray-100);
|
|
37
|
+
--state-active: var(--gray-200);
|
|
38
|
+
--state-selected: var(--primary);
|
|
39
|
+
--state-disabled: var(--gray-300);
|
|
40
|
+
--state-focus: var(--primary);
|
|
41
|
+
|
|
42
|
+
/* Feedback Colors */
|
|
43
|
+
--feedback-success: var(--success);
|
|
44
|
+
--feedback-success-light: 142 71% 95%;
|
|
45
|
+
--feedback-success-dark: 142 71% 35%;
|
|
46
|
+
--feedback-warning: var(--warning);
|
|
47
|
+
--feedback-warning-light: 38 92% 95%;
|
|
48
|
+
--feedback-warning-dark: 38 92% 40%;
|
|
49
|
+
--feedback-error: var(--error);
|
|
50
|
+
--feedback-error-light: 0 84% 95%;
|
|
51
|
+
--feedback-error-dark: 0 84% 50%;
|
|
52
|
+
--feedback-info: 217 91% 60%;
|
|
53
|
+
--feedback-info-light: 217 91% 95%;
|
|
54
|
+
--feedback-info-dark: 217 91% 50%;
|
|
55
|
+
|
|
56
|
+
/* Border Colors */
|
|
57
|
+
--border-default: var(--border);
|
|
58
|
+
--border-subtle: var(--gray-200);
|
|
59
|
+
--border-strong: var(--gray-400);
|
|
60
|
+
--border-interactive: var(--primary);
|
|
61
|
+
--border-error: var(--error);
|
|
62
|
+
--border-success: var(--success);
|
|
63
|
+
--border-warning: var(--warning);
|
|
64
|
+
|
|
65
|
+
/* ===== Shadow System ===== */
|
|
66
|
+
|
|
67
|
+
/* Elevation Tokens */
|
|
68
|
+
--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
69
|
+
--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
70
|
+
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
71
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
72
|
+
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
73
|
+
--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
|
|
74
|
+
|
|
75
|
+
/* Colored Shadows */
|
|
76
|
+
--shadow-primary: 0 4px 14px 0 hsl(var(--primary) / 0.3);
|
|
77
|
+
--shadow-success: 0 4px 14px 0 hsl(var(--success) / 0.3);
|
|
78
|
+
--shadow-error: 0 4px 14px 0 hsl(var(--error) / 0.3);
|
|
79
|
+
--shadow-warning: 0 4px 14px 0 hsl(var(--warning) / 0.3);
|
|
80
|
+
|
|
81
|
+
/* Inset Shadows */
|
|
82
|
+
--shadow-inner-xs: inset 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
83
|
+
--shadow-inner-sm: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
|
|
84
|
+
--shadow-inner-md: inset 0 4px 6px -1px rgb(0 0 0 / 0.1);
|
|
85
|
+
|
|
86
|
+
/* ===== Animation Timing Functions ===== */
|
|
87
|
+
|
|
88
|
+
/* Easing Functions */
|
|
89
|
+
--ease-linear: linear;
|
|
90
|
+
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
91
|
+
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
92
|
+
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
93
|
+
--ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
94
|
+
--ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
95
|
+
--ease-back-in: cubic-bezier(0.6, -0.28, 0.735, 0.045);
|
|
96
|
+
--ease-back-out: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
97
|
+
--ease-back-in-out: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
98
|
+
|
|
99
|
+
/* Duration Tokens */
|
|
100
|
+
--duration-instant: 0ms;
|
|
101
|
+
--duration-fast: 150ms;
|
|
102
|
+
--duration-normal: 250ms;
|
|
103
|
+
--duration-slow: 350ms;
|
|
104
|
+
--duration-slower: 500ms;
|
|
105
|
+
--duration-slowest: 750ms;
|
|
106
|
+
|
|
107
|
+
/* ===== Spacing System (8px Grid) ===== */
|
|
108
|
+
|
|
109
|
+
--space-0: 0;
|
|
110
|
+
--space-px: 1px;
|
|
111
|
+
--space-0\.5: 0.125rem; /* 2px */
|
|
112
|
+
--space-1: 0.25rem; /* 4px */
|
|
113
|
+
--space-1\.5: 0.375rem; /* 6px */
|
|
114
|
+
--space-2: 0.5rem; /* 8px */
|
|
115
|
+
--space-2\.5: 0.625rem; /* 10px */
|
|
116
|
+
--space-3: 0.75rem; /* 12px */
|
|
117
|
+
--space-3\.5: 0.875rem; /* 14px */
|
|
118
|
+
--space-4: 1rem; /* 16px */
|
|
119
|
+
--space-5: 1.25rem; /* 20px */
|
|
120
|
+
--space-6: 1.5rem; /* 24px */
|
|
121
|
+
--space-7: 1.75rem; /* 28px */
|
|
122
|
+
--space-8: 2rem; /* 32px */
|
|
123
|
+
--space-9: 2.25rem; /* 36px */
|
|
124
|
+
--space-10: 2.5rem; /* 40px */
|
|
125
|
+
--space-11: 2.75rem; /* 44px */
|
|
126
|
+
--space-12: 3rem; /* 48px */
|
|
127
|
+
--space-14: 3.5rem; /* 56px */
|
|
128
|
+
--space-16: 4rem; /* 64px */
|
|
129
|
+
--space-20: 5rem; /* 80px */
|
|
130
|
+
--space-24: 6rem; /* 96px */
|
|
131
|
+
--space-28: 7rem; /* 112px */
|
|
132
|
+
--space-32: 8rem; /* 128px */
|
|
133
|
+
--space-36: 9rem; /* 144px */
|
|
134
|
+
--space-40: 10rem; /* 160px */
|
|
135
|
+
--space-44: 11rem; /* 176px */
|
|
136
|
+
--space-48: 12rem; /* 192px */
|
|
137
|
+
--space-52: 13rem; /* 208px */
|
|
138
|
+
--space-56: 14rem; /* 224px */
|
|
139
|
+
--space-60: 15rem; /* 240px */
|
|
140
|
+
--space-64: 16rem; /* 256px */
|
|
141
|
+
--space-72: 18rem; /* 288px */
|
|
142
|
+
--space-80: 20rem; /* 320px */
|
|
143
|
+
--space-96: 24rem; /* 384px */
|
|
144
|
+
|
|
145
|
+
/* ===== Typography Scale (Perfect Fourth) ===== */
|
|
146
|
+
|
|
147
|
+
/* Font Sizes */
|
|
148
|
+
--text-2xs: 0.625rem; /* 10px */
|
|
149
|
+
--text-xs: 0.75rem; /* 12px */
|
|
150
|
+
--text-sm: 0.875rem; /* 14px */
|
|
151
|
+
--text-base: 1rem; /* 16px */
|
|
152
|
+
--text-lg: 1.125rem; /* 18px */
|
|
153
|
+
--text-xl: 1.25rem; /* 20px */
|
|
154
|
+
--text-2xl: 1.5rem; /* 24px */
|
|
155
|
+
--text-3xl: 1.875rem; /* 30px */
|
|
156
|
+
--text-4xl: 2.25rem; /* 36px */
|
|
157
|
+
--text-5xl: 3rem; /* 48px */
|
|
158
|
+
--text-6xl: 3.75rem; /* 60px */
|
|
159
|
+
--text-7xl: 4.5rem; /* 72px */
|
|
160
|
+
--text-8xl: 6rem; /* 96px */
|
|
161
|
+
--text-9xl: 8rem; /* 128px */
|
|
162
|
+
|
|
163
|
+
/* Line Heights */
|
|
164
|
+
--leading-none: 1;
|
|
165
|
+
--leading-tight: 1.25;
|
|
166
|
+
--leading-snug: 1.375;
|
|
167
|
+
--leading-normal: 1.5;
|
|
168
|
+
--leading-relaxed: 1.625;
|
|
169
|
+
--leading-loose: 2;
|
|
170
|
+
|
|
171
|
+
/* Letter Spacing */
|
|
172
|
+
--tracking-tighter: -0.05em;
|
|
173
|
+
--tracking-tight: -0.025em;
|
|
174
|
+
--tracking-normal: 0;
|
|
175
|
+
--tracking-wide: 0.025em;
|
|
176
|
+
--tracking-wider: 0.05em;
|
|
177
|
+
--tracking-widest: 0.1em;
|
|
178
|
+
|
|
179
|
+
/* Font Weights */
|
|
180
|
+
--font-thin: 100;
|
|
181
|
+
--font-extralight: 200;
|
|
182
|
+
--font-light: 300;
|
|
183
|
+
--font-normal: 400;
|
|
184
|
+
--font-medium: 500;
|
|
185
|
+
--font-semibold: 600;
|
|
186
|
+
--font-bold: 700;
|
|
187
|
+
--font-extrabold: 800;
|
|
188
|
+
--font-black: 900;
|
|
189
|
+
|
|
190
|
+
/* ===== Border Radius ===== */
|
|
191
|
+
|
|
192
|
+
--radius-none: 0;
|
|
193
|
+
--radius-sm: 0.125rem; /* 2px */
|
|
194
|
+
--radius-base: 0.25rem; /* 4px */
|
|
195
|
+
--radius-md: 0.375rem; /* 6px */
|
|
196
|
+
--radius-lg: 0.5rem; /* 8px */
|
|
197
|
+
--radius-xl: 0.75rem; /* 12px */
|
|
198
|
+
--radius-2xl: 1rem; /* 16px */
|
|
199
|
+
--radius-3xl: 1.5rem; /* 24px */
|
|
200
|
+
--radius-full: 9999px;
|
|
201
|
+
|
|
202
|
+
/* ===== Z-Index Scale ===== */
|
|
203
|
+
|
|
204
|
+
--z-0: 0;
|
|
205
|
+
--z-10: 10;
|
|
206
|
+
--z-20: 20;
|
|
207
|
+
--z-30: 30;
|
|
208
|
+
--z-40: 40;
|
|
209
|
+
--z-50: 50;
|
|
210
|
+
--z-dropdown: 1000;
|
|
211
|
+
--z-sticky: 1020;
|
|
212
|
+
--z-fixed: 1030;
|
|
213
|
+
--z-modal-backdrop: 1040;
|
|
214
|
+
--z-modal: 1050;
|
|
215
|
+
--z-popover: 1060;
|
|
216
|
+
--z-tooltip: 1070;
|
|
217
|
+
--z-notification: 1080;
|
|
218
|
+
|
|
219
|
+
/* ===== Blur Values ===== */
|
|
220
|
+
|
|
221
|
+
--blur-none: 0;
|
|
222
|
+
--blur-sm: 4px;
|
|
223
|
+
--blur-base: 8px;
|
|
224
|
+
--blur-md: 12px;
|
|
225
|
+
--blur-lg: 16px;
|
|
226
|
+
--blur-xl: 24px;
|
|
227
|
+
--blur-2xl: 40px;
|
|
228
|
+
--blur-3xl: 64px;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* Dark Mode Overrides */
|
|
232
|
+
.dark {
|
|
233
|
+
/* Background Layers */
|
|
234
|
+
--bg-base: var(--background);
|
|
235
|
+
--bg-subtle: var(--gray-800);
|
|
236
|
+
--bg-muted: var(--gray-700);
|
|
237
|
+
--bg-emphasis: var(--gray-600);
|
|
238
|
+
|
|
239
|
+
/* Surface Colors */
|
|
240
|
+
--surface-overlay: var(--gray-800);
|
|
241
|
+
--surface-raised: var(--gray-800);
|
|
242
|
+
--surface-sunken: var(--background);
|
|
243
|
+
|
|
244
|
+
/* Text Colors */
|
|
245
|
+
--text-secondary: var(--gray-400);
|
|
246
|
+
--text-tertiary: var(--gray-500);
|
|
247
|
+
--text-disabled: var(--gray-600);
|
|
248
|
+
|
|
249
|
+
/* Interactive States */
|
|
250
|
+
--state-hover: var(--gray-700);
|
|
251
|
+
--state-active: var(--gray-600);
|
|
252
|
+
|
|
253
|
+
/* Dark Mode Shadows (Lighter for visibility) */
|
|
254
|
+
--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);
|
|
255
|
+
--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.3);
|
|
256
|
+
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);
|
|
257
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);
|
|
258
|
+
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.3);
|
|
259
|
+
--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/* ===== Utility Classes ===== */
|
|
264
|
+
|
|
265
|
+
@layer utilities {
|
|
266
|
+
/* Shadow Utilities */
|
|
267
|
+
.shadow-xs { box-shadow: var(--shadow-xs); }
|
|
268
|
+
.shadow-sm { box-shadow: var(--shadow-sm); }
|
|
269
|
+
.shadow-md { box-shadow: var(--shadow-md); }
|
|
270
|
+
.shadow-lg { box-shadow: var(--shadow-lg); }
|
|
271
|
+
.shadow-xl { box-shadow: var(--shadow-xl); }
|
|
272
|
+
.shadow-2xl { box-shadow: var(--shadow-2xl); }
|
|
273
|
+
|
|
274
|
+
.shadow-primary { box-shadow: var(--shadow-primary); }
|
|
275
|
+
.shadow-success { box-shadow: var(--shadow-success); }
|
|
276
|
+
.shadow-error { box-shadow: var(--shadow-error); }
|
|
277
|
+
.shadow-warning { box-shadow: var(--shadow-warning); }
|
|
278
|
+
|
|
279
|
+
.shadow-inner-xs { box-shadow: var(--shadow-inner-xs); }
|
|
280
|
+
.shadow-inner-sm { box-shadow: var(--shadow-inner-sm); }
|
|
281
|
+
.shadow-inner-md { box-shadow: var(--shadow-inner-md); }
|
|
282
|
+
|
|
283
|
+
/* Animation Utilities */
|
|
284
|
+
.animate-none { animation: none; }
|
|
285
|
+
.animate-spin { animation: spin 1s linear infinite; }
|
|
286
|
+
.animate-ping { animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; }
|
|
287
|
+
.animate-pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; }
|
|
288
|
+
.animate-bounce { animation: bounce 1s infinite; }
|
|
289
|
+
.animate-fade-in { animation: fadeIn var(--duration-normal) var(--ease-out); }
|
|
290
|
+
.animate-fade-out { animation: fadeOut var(--duration-normal) var(--ease-out); }
|
|
291
|
+
.animate-slide-in { animation: slideIn var(--duration-normal) var(--ease-out); }
|
|
292
|
+
.animate-scale-in { animation: scaleIn var(--duration-normal) var(--ease-out); }
|
|
293
|
+
|
|
294
|
+
/* Transition Utilities */
|
|
295
|
+
.transition-none { transition: none; }
|
|
296
|
+
.transition-all { transition-property: all; }
|
|
297
|
+
.transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; }
|
|
298
|
+
.transition-opacity { transition-property: opacity; }
|
|
299
|
+
.transition-shadow { transition-property: box-shadow; }
|
|
300
|
+
.transition-transform { transition-property: transform; }
|
|
301
|
+
|
|
302
|
+
/* Duration Utilities */
|
|
303
|
+
.duration-instant { transition-duration: var(--duration-instant); }
|
|
304
|
+
.duration-fast { transition-duration: var(--duration-fast); }
|
|
305
|
+
.duration-normal { transition-duration: var(--duration-normal); }
|
|
306
|
+
.duration-slow { transition-duration: var(--duration-slow); }
|
|
307
|
+
.duration-slower { transition-duration: var(--duration-slower); }
|
|
308
|
+
.duration-slowest { transition-duration: var(--duration-slowest); }
|
|
309
|
+
|
|
310
|
+
/* Easing Utilities */
|
|
311
|
+
.ease-linear { transition-timing-function: var(--ease-linear); }
|
|
312
|
+
.ease-in { transition-timing-function: var(--ease-in); }
|
|
313
|
+
.ease-out { transition-timing-function: var(--ease-out); }
|
|
314
|
+
.ease-in-out { transition-timing-function: var(--ease-in-out); }
|
|
315
|
+
.ease-bounce { transition-timing-function: var(--ease-bounce); }
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/* ===== Keyframes ===== */
|
|
319
|
+
|
|
320
|
+
@keyframes spin {
|
|
321
|
+
to { transform: rotate(360deg); }
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
@keyframes ping {
|
|
325
|
+
75%, 100% {
|
|
326
|
+
transform: scale(2);
|
|
327
|
+
opacity: 0;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
@keyframes pulse {
|
|
332
|
+
0%, 100% { opacity: 1; }
|
|
333
|
+
50% { opacity: .5; }
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
@keyframes bounce {
|
|
337
|
+
0%, 100% {
|
|
338
|
+
transform: translateY(-25%);
|
|
339
|
+
animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
|
|
340
|
+
}
|
|
341
|
+
50% {
|
|
342
|
+
transform: translateY(0);
|
|
343
|
+
animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
@keyframes fadeIn {
|
|
348
|
+
from { opacity: 0; }
|
|
349
|
+
to { opacity: 1; }
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
@keyframes fadeOut {
|
|
353
|
+
from { opacity: 1; }
|
|
354
|
+
to { opacity: 0; }
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
@keyframes slideIn {
|
|
358
|
+
from { transform: translateX(-100%); }
|
|
359
|
+
to { transform: translateX(0); }
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
@keyframes scaleIn {
|
|
363
|
+
from { transform: scale(0.95); opacity: 0; }
|
|
364
|
+
to { transform: scale(1); opacity: 1; }
|
|
365
|
+
}
|