@papernote/ui 1.13.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/components/FilterBar.d.ts +1 -1
  2. package/dist/components/FilterBar.d.ts.map +1 -1
  3. package/dist/components/FilterPills.d.ts +14 -0
  4. package/dist/components/FilterPills.d.ts.map +1 -0
  5. package/dist/components/LetterNav.d.ts +8 -0
  6. package/dist/components/LetterNav.d.ts.map +1 -0
  7. package/dist/components/Pagination.d.ts +11 -1
  8. package/dist/components/Pagination.d.ts.map +1 -1
  9. package/dist/components/index.d.ts +4 -0
  10. package/dist/components/index.d.ts.map +1 -1
  11. package/dist/index.d.ts +36 -4
  12. package/dist/index.esm.js +346 -280
  13. package/dist/index.esm.js.map +1 -1
  14. package/dist/index.js +346 -278
  15. package/dist/index.js.map +1 -1
  16. package/dist/styles.css +6228 -6713
  17. package/package.json +6 -4
  18. package/src/components/AdminModal.tsx +1 -1
  19. package/src/components/Autocomplete.tsx +1 -1
  20. package/src/components/CommandPalette.tsx +2 -2
  21. package/src/components/DataTable.tsx +1 -1
  22. package/src/components/Drawer.tsx +1 -1
  23. package/src/components/FilterBar.tsx +116 -3
  24. package/src/components/FilterPills.tsx +58 -0
  25. package/src/components/LetterNav.tsx +67 -0
  26. package/src/components/MarkdownEditor.tsx +1 -1
  27. package/src/components/MaskedInput.tsx +1 -1
  28. package/src/components/Modal.tsx +1 -1
  29. package/src/components/NotificationBar.tsx +2 -2
  30. package/src/components/Pagination.tsx +49 -1
  31. package/src/components/PasswordInput.tsx +1 -1
  32. package/src/components/SearchBar.tsx +1 -1
  33. package/src/components/Textarea.tsx +1 -1
  34. package/src/components/index.ts +6 -0
  35. package/src/styles/index.css +50 -160
  36. package/src/styles/theme.css +302 -0
@@ -3,9 +3,12 @@
3
3
  /* Component styles */
4
4
  @import '../components/Spreadsheet.css';
5
5
 
6
- @tailwind base;
7
- @tailwind components;
8
- @tailwind utilities;
6
+ @import "tailwindcss";
7
+ @import "./theme.css";
8
+
9
+ /* Content sources for class detection */
10
+ @source "../components/**/*.{tsx,ts}";
11
+ @source inline("bg-sky-100 bg-sky-50 bg-sky-100/50 bg-amber-100 bg-amber-50 bg-amber-100/50 bg-emerald-100 bg-emerald-50 bg-emerald-100/50 bg-pink-100 bg-pink-50 bg-pink-100/50");
9
12
 
10
13
  @layer base {
11
14
  body {
@@ -47,7 +50,7 @@
47
50
 
48
51
  /* Input Styles - Comfortable & Clear */
49
52
  .input {
50
- @apply block w-full px-4 py-2.5 border border-paper-300 rounded-lg text-sm text-ink-800 placeholder-ink-400 bg-white transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400 hover:border-paper-400;
53
+ @apply block w-full px-4 py-2.5 border border-paper-300 rounded-lg text-sm text-ink-800 placeholder:text-ink-400 bg-white transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400 hover:border-paper-400;
51
54
  }
52
55
 
53
56
  .label {
@@ -84,27 +87,6 @@
84
87
  @apply bg-primary-50 text-primary-700 border border-primary-200;
85
88
  }
86
89
 
87
- /* Table Styles - Clean & Minimal */
88
- .table {
89
- @apply min-w-full divide-y divide-paper-200;
90
- }
91
-
92
- .table-header {
93
- @apply bg-paper-50;
94
- }
95
-
96
- .table-header-cell {
97
- @apply px-6 py-3 text-left text-xs font-medium text-ink-500 uppercase tracking-wider;
98
- }
99
-
100
- .table-cell {
101
- @apply px-6 py-4 whitespace-nowrap text-sm text-ink-700;
102
- }
103
-
104
- .table-row {
105
- @apply hover:bg-paper-50 transition-colors duration-150;
106
- }
107
-
108
90
  /* Navigation Styles - Notebook-like */
109
91
  .nav-link {
110
92
  @apply flex items-center px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-200;
@@ -140,7 +122,7 @@
140
122
  }
141
123
 
142
124
  input:checked + .slider:before {
143
- @apply transform translate-x-5;
125
+ @apply translate-x-5;
144
126
  }
145
127
 
146
128
  /* Stat Card Styles - Paper-like */
@@ -316,56 +298,33 @@
316
298
  }
317
299
  }
318
300
 
319
- @layer utilities {
320
- .line-clamp-1 {
321
- overflow: hidden;
322
- display: -webkit-box;
323
- -webkit-box-orient: vertical;
324
- -webkit-line-clamp: 1;
325
- }
326
-
327
- .line-clamp-2 {
328
- overflow: hidden;
329
- display: -webkit-box;
330
- -webkit-box-orient: vertical;
331
- -webkit-line-clamp: 2;
332
- }
333
-
334
- .line-clamp-3 {
335
- overflow: hidden;
336
- display: -webkit-box;
337
- -webkit-box-orient: vertical;
338
- -webkit-line-clamp: 3;
339
- }
340
-
341
- .scrollbar-hide {
342
- -ms-overflow-style: none;
343
- scrollbar-width: none;
344
- }
345
-
346
- .scrollbar-hide::-webkit-scrollbar {
301
+ /* Custom utilities */
302
+ @utility scrollbar-hide {
303
+ -ms-overflow-style: none;
304
+ scrollbar-width: none;
305
+ &::-webkit-scrollbar {
347
306
  display: none;
348
307
  }
308
+ }
349
309
 
350
- .text-shadow {
351
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
352
- }
310
+ @utility text-shadow {
311
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
312
+ }
353
313
 
354
- .bg-gradient-primary {
355
- background: linear-gradient(135deg, #64748b, #475569);
356
- }
314
+ @utility bg-gradient-primary {
315
+ background: linear-gradient(135deg, #64748b, #475569);
316
+ }
357
317
 
358
- .bg-gradient-success {
359
- background: linear-gradient(135deg, #10b981, #059669);
360
- }
318
+ @utility bg-gradient-success {
319
+ background: linear-gradient(135deg, #10b981, #059669);
320
+ }
361
321
 
362
- .bg-gradient-warning {
363
- background: linear-gradient(135deg, #f59e0b, #d97706);
364
- }
322
+ @utility bg-gradient-warning {
323
+ background: linear-gradient(135deg, #f59e0b, #d97706);
324
+ }
365
325
 
366
- .bg-gradient-accent {
367
- background: linear-gradient(135deg, #f59e0b, #d97706);
368
- }
326
+ @utility bg-gradient-accent {
327
+ background: linear-gradient(135deg, #f59e0b, #d97706);
369
328
  }
370
329
 
371
330
  /* Custom scrollbar - Subtle paper aesthetic */
@@ -388,21 +347,7 @@
388
347
  background: #a8a29e;
389
348
  }
390
349
 
391
- /* Loading animations */
392
- @keyframes pulse {
393
- 0%, 100% {
394
- opacity: 1;
395
- }
396
- 50% {
397
- opacity: .5;
398
- }
399
- }
400
-
401
- .animate-pulse {
402
- animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
403
- }
404
-
405
- /* Table styles - Clean & minimal */
350
+ /* Table styles - Clean & minimal (un-layered for higher specificity) */
406
351
  .table {
407
352
  @apply min-w-full divide-y divide-paper-200;
408
353
  }
@@ -429,35 +374,33 @@
429
374
  }
430
375
 
431
376
  .table-stable {
432
- @apply table-fixed;
433
- /* Removed min-height to allow content-based sizing for two-row layout */
377
+ table-layout: fixed !important;
434
378
  }
435
379
 
436
- .table-stable thead {
437
- height: auto !important;
438
- }
380
+ .table-stable thead {
381
+ height: auto !important;
382
+ }
439
383
 
440
- .table-stable thead th {
441
- position: sticky;
442
- top: 0;
443
- z-index: 10;
444
- background-color: #fafaf9;
445
- backdrop-filter: blur(8px);
446
- /* padding controlled by component density classes (currentDensity.header) */
447
- height: 28px !important;
448
- min-height: 28px !important;
449
- max-height: 28px !important;
450
- line-height: 1 !important;
451
- vertical-align: middle !important;
452
- overflow: hidden !important;
453
- box-sizing: border-box !important;
454
- font-size: 0.75rem !important;
455
- border-bottom: 1px solid #e7e5e4;
456
- }
384
+ .table-stable thead th {
385
+ position: sticky;
386
+ top: 0;
387
+ z-index: 10;
388
+ background-color: #fafaf9;
389
+ backdrop-filter: blur(8px);
390
+ height: 28px !important;
391
+ min-height: 28px !important;
392
+ max-height: 28px !important;
393
+ line-height: 1 !important;
394
+ vertical-align: middle !important;
395
+ overflow: hidden !important;
396
+ box-sizing: border-box !important;
397
+ font-size: 0.75rem !important;
398
+ border-bottom: 1px solid #e7e5e4;
399
+ }
457
400
 
458
401
  /* Primary rows with normal content */
459
402
  .table-stable tbody tr {
460
- height: auto; /* Allow content-based sizing for two-row layout */
403
+ height: auto;
461
404
  }
462
405
 
463
406
  /* Secondary rows should be compact */
@@ -534,59 +477,6 @@
534
477
  overflow: hidden;
535
478
  }
536
479
 
537
- /* Drawer Slide Animations */
538
- @keyframes slideInLeft {
539
- from {
540
- transform: translateX(-100%);
541
- }
542
- to {
543
- transform: translateX(0);
544
- }
545
- }
546
-
547
- @keyframes slideInRight {
548
- from {
549
- transform: translateX(100%);
550
- }
551
- to {
552
- transform: translateX(0);
553
- }
554
- }
555
-
556
- @keyframes slideInTop {
557
- from {
558
- transform: translateY(-100%);
559
- }
560
- to {
561
- transform: translateY(0);
562
- }
563
- }
564
-
565
- @keyframes slideInBottom {
566
- from {
567
- transform: translateY(100%);
568
- }
569
- to {
570
- transform: translateY(0);
571
- }
572
- }
573
-
574
- .animate-slide-in-left {
575
- animation: slideInLeft 0.3s ease-out;
576
- }
577
-
578
- .animate-slide-in-right {
579
- animation: slideInRight 0.3s ease-out;
580
- }
581
-
582
- .animate-slide-in-top {
583
- animation: slideInTop 0.3s ease-out;
584
- }
585
-
586
- .animate-slide-in-bottom {
587
- animation: slideInBottom 0.3s ease-out;
588
- }
589
-
590
480
  /* Touch-friendly sizing for coarse pointer devices (touch screens) */
591
481
  @media (pointer: coarse) {
592
482
  /* Ensure buttons meet 48px minimum touch target on touch devices */
@@ -0,0 +1,302 @@
1
+ /*
2
+ * @papernote/ui Design Tokens — Tailwind CSS v4 Theme
3
+ *
4
+ * This file is the CSS-first equivalent of tailwind.config.js.
5
+ * Consumers on Tailwind v4 import this via: @import "@papernote/ui/theme";
6
+ */
7
+
8
+ @theme {
9
+ /* === Colors: Primary (Warm Slate — ink on paper feel) === */
10
+ --color-primary-50: #f8fafc;
11
+ --color-primary-100: #f1f5f9;
12
+ --color-primary-200: #e2e8f0;
13
+ --color-primary-300: #cbd5e1;
14
+ --color-primary-400: #94a3b8;
15
+ --color-primary-500: #64748b;
16
+ --color-primary-600: #475569;
17
+ --color-primary-700: #334155;
18
+ --color-primary-800: #1e293b;
19
+ --color-primary-900: #0f172a;
20
+ --color-primary-950: #020617;
21
+
22
+ /* === Colors: Accent (Subtle warm tone, Claude-like) === */
23
+ --color-accent-50: #fafaf8;
24
+ --color-accent-100: #f5f5f0;
25
+ --color-accent-200: #e8e7e0;
26
+ --color-accent-300: #d4d2c8;
27
+ --color-accent-400: #a8a599;
28
+ --color-accent-500: #8b8878;
29
+ --color-accent-600: #6e6d5e;
30
+ --color-accent-700: #565548;
31
+ --color-accent-800: #3f3e35;
32
+ --color-accent-900: #2a2922;
33
+
34
+ /* === Colors: Success (Muted emerald green) === */
35
+ --color-success-50: #f0fdf4;
36
+ --color-success-100: #dcfce7;
37
+ --color-success-200: #bbf7d0;
38
+ --color-success-300: #86efac;
39
+ --color-success-400: #4ade80;
40
+ --color-success-500: #10b981;
41
+ --color-success-600: #059669;
42
+ --color-success-700: #047857;
43
+ --color-success-800: #065f46;
44
+ --color-success-900: #064e3b;
45
+
46
+ /* === Colors: Warning (Soft amber) === */
47
+ --color-warning-50: #fffbeb;
48
+ --color-warning-100: #fef3c7;
49
+ --color-warning-200: #fde68a;
50
+ --color-warning-300: #fcd34d;
51
+ --color-warning-400: #fbbf24;
52
+ --color-warning-500: #f59e0b;
53
+ --color-warning-600: #d97706;
54
+ --color-warning-700: #b45309;
55
+ --color-warning-800: #92400e;
56
+ --color-warning-900: #78350f;
57
+
58
+ /* === Colors: Error (Muted red) === */
59
+ --color-error-50: #fef2f2;
60
+ --color-error-100: #fee2e2;
61
+ --color-error-200: #fecaca;
62
+ --color-error-300: #fca5a5;
63
+ --color-error-400: #f87171;
64
+ --color-error-500: #ef4444;
65
+ --color-error-600: #dc2626;
66
+ --color-error-700: #b91c1c;
67
+ --color-error-800: #991b1b;
68
+ --color-error-900: #7f1d1d;
69
+
70
+ /* === Colors: Paper (Warm off-white backgrounds) === */
71
+ --color-paper-50: #fafaf9;
72
+ --color-paper-100: #f5f5f4;
73
+ --color-paper-200: #e7e5e4;
74
+ --color-paper-300: #d6d3d1;
75
+ --color-paper-400: #a8a29e;
76
+
77
+ /* === Colors: Ink (Text colors — warm grays) === */
78
+ --color-ink-50: #fafaf9;
79
+ --color-ink-100: #f5f5f4;
80
+ --color-ink-200: #e7e5e4;
81
+ --color-ink-300: #d6d3d1;
82
+ --color-ink-400: #a8a29e;
83
+ --color-ink-500: #78716c;
84
+ --color-ink-600: #57534e;
85
+ --color-ink-700: #44403c;
86
+ --color-ink-800: #292524;
87
+ --color-ink-900: #1c1917;
88
+
89
+ /* === Colors: Neutral (Backwards compatibility) === */
90
+ --color-neutral-25: #fcfcfd;
91
+ --color-neutral-50: #f8fafc;
92
+ --color-neutral-100: #f1f5f9;
93
+ --color-neutral-200: #e2e8f0;
94
+ --color-neutral-300: #cbd5e1;
95
+ --color-neutral-400: #94a3b8;
96
+ --color-neutral-500: #64748b;
97
+ --color-neutral-600: #475569;
98
+ --color-neutral-700: #334155;
99
+ --color-neutral-800: #1e293b;
100
+ --color-neutral-900: #0f172a;
101
+ --color-neutral-950: #020617;
102
+
103
+ /* === Font Families === */
104
+ --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Inter, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
105
+ --font-mono: 'JetBrains Mono Variable', 'JetBrains Mono', 'Fira Code', Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
106
+
107
+ /* === Font Sizes (with line-heights) === */
108
+ --text-2xs: 0.625rem;
109
+ --text-2xs--line-height: 0.875rem;
110
+ --text-xs: 0.75rem;
111
+ --text-xs--line-height: 1.125rem;
112
+ --text-sm: 0.875rem;
113
+ --text-sm--line-height: 1.375rem;
114
+ --text-base: 1rem;
115
+ --text-base--line-height: 1.625rem;
116
+ --text-lg: 1.125rem;
117
+ --text-lg--line-height: 1.875rem;
118
+ --text-xl: 1.25rem;
119
+ --text-xl--line-height: 2rem;
120
+ --text-2xl: 1.5rem;
121
+ --text-2xl--line-height: 2.25rem;
122
+ --text-3xl: 1.875rem;
123
+ --text-3xl--line-height: 2.5rem;
124
+ --text-4xl: 2.25rem;
125
+ --text-4xl--line-height: 2.75rem;
126
+ --text-5xl: 3rem;
127
+ --text-5xl--line-height: 3.25rem;
128
+ --text-6xl: 3.75rem;
129
+ --text-6xl--line-height: 1;
130
+ --text-7xl: 4.5rem;
131
+ --text-7xl--line-height: 1;
132
+ --text-8xl: 6rem;
133
+ --text-8xl--line-height: 1;
134
+ --text-9xl: 8rem;
135
+ --text-9xl--line-height: 1;
136
+
137
+ /* === Spacing === */
138
+ --spacing-4_5: 1.125rem;
139
+ --spacing-5_5: 1.375rem;
140
+ --spacing-6_5: 1.625rem;
141
+ --spacing-7_5: 1.875rem;
142
+ --spacing-8_5: 2.125rem;
143
+ --spacing-9_5: 2.375rem;
144
+ --spacing-17: 4.25rem;
145
+ --spacing-18: 4.5rem;
146
+ --spacing-19: 4.75rem;
147
+ --spacing-21: 5.25rem;
148
+ --spacing-22: 5.5rem;
149
+ --spacing-23: 5.75rem;
150
+ --spacing-25: 6.25rem;
151
+ --spacing-26: 6.5rem;
152
+ --spacing-27: 6.75rem;
153
+ --spacing-29: 7.25rem;
154
+ --spacing-30: 7.5rem;
155
+ --spacing-31: 7.75rem;
156
+ --spacing-33: 8.25rem;
157
+ --spacing-34: 8.5rem;
158
+ --spacing-35: 8.75rem;
159
+ --spacing-touch-sm: 2.25rem;
160
+ --spacing-touch: 2.75rem;
161
+ --spacing-touch-lg: 3rem;
162
+
163
+ /* === Border Radius === */
164
+ --radius-4xl: 2rem;
165
+ --radius-5xl: 2.5rem;
166
+
167
+ /* === Box Shadow === */
168
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.03);
169
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
170
+ --shadow-md: 0 2px 4px 0 rgb(0 0 0 / 0.06);
171
+ --shadow-lg: 0 4px 6px -1px rgb(0 0 0 / 0.08);
172
+ --shadow-xl: 0 10px 15px -3px rgb(0 0 0 / 0.1);
173
+ --shadow-2xl: 0 20px 25px -5px rgb(0 0 0 / 0.12);
174
+ --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.04);
175
+ --shadow-paper: 0 1px 3px 0 rgb(0 0 0 / 0.04), 0 1px 2px 0 rgb(0 0 0 / 0.03);
176
+ --shadow-card: 0 2px 4px 0 rgb(0 0 0 / 0.04), 0 1px 2px 0 rgb(0 0 0 / 0.02);
177
+
178
+ /* === Backdrop Blur === */
179
+ --backdrop-blur-xs: 2px;
180
+
181
+ /* === Background Images === */
182
+ --background-image-gradient-radial: radial-gradient(var(--tw-gradient-stops));
183
+ --background-image-gradient-conic: conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops));
184
+ --background-image-grid-pattern: url("data:image/svg+xml,%3csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3e%3cg fill='none' fill-rule='evenodd'%3e%3cg fill='%23e2e8f0' fill-opacity='0.4'%3e%3ccircle cx='30' cy='30' r='1.5'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e");
185
+ --background-image-paper-texture: url("data:image/svg+xml,%3csvg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3e%3cfilter id='noise'%3e%3cfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3e%3cfeColorMatrix type='saturate' values='0'/%3e%3c/filter%3e%3crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3e%3c/svg%3e");
186
+ --background-image-subtle-grain: url("data:image/svg+xml,%3csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3e%3cfilter id='noise'%3e%3cfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3e%3cfeColorMatrix type='saturate' values='0'/%3e%3c/filter%3e%3crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.015'/%3e%3c/svg%3e");
187
+
188
+ /* === Animations === */
189
+ --animate-fade-in: fade-in 0.5s ease-in-out;
190
+ --animate-fade-in-up: fade-in-up 0.5s ease-out;
191
+ --animate-slide-in: slide-in 0.3s ease-out;
192
+ --animate-slide-in-right: slide-in-right 0.3s ease-out;
193
+ --animate-slide-in-left: slide-in-left 0.3s ease-out;
194
+ --animate-slide-in-bottom: slide-in-bottom 0.3s ease-out;
195
+ --animate-slide-in-top: slide-in-top 0.3s ease-out;
196
+ --animate-slide-out-right: slide-out-right 0.3s ease-in;
197
+ --animate-slide-out-left: slide-out-left 0.3s ease-in;
198
+ --animate-slide-out-bottom: slide-out-bottom 0.3s ease-in;
199
+ --animate-slide-out-top: slide-out-top 0.3s ease-in;
200
+ --animate-bounce-subtle: bounce-subtle 2s infinite;
201
+ --animate-pulse-slow: pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
202
+ --animate-shimmer: shimmer 2s linear infinite;
203
+ --animate-float: float 6s ease-in-out infinite;
204
+ --animate-scale-in: scale-in 0.2s ease-out;
205
+ --animate-scale-out: scale-out 0.2s ease-in;
206
+ --animate-row-flash: row-flash 2s ease-out;
207
+ --animate-success-check: success-check 0.6s ease-out;
208
+ }
209
+
210
+ /* === Keyframes === */
211
+
212
+ @keyframes fade-in {
213
+ 0% { opacity: 0; }
214
+ 100% { opacity: 1; }
215
+ }
216
+
217
+ @keyframes fade-in-up {
218
+ 0% { opacity: 0; transform: translateY(10px); }
219
+ 100% { opacity: 1; transform: translateY(0); }
220
+ }
221
+
222
+ @keyframes slide-in {
223
+ 0% { transform: translateX(-10px); opacity: 0; }
224
+ 100% { transform: translateX(0); opacity: 1; }
225
+ }
226
+
227
+ @keyframes slide-in-right {
228
+ 0% { transform: translateX(100%); opacity: 0; }
229
+ 100% { transform: translateX(0); opacity: 1; }
230
+ }
231
+
232
+ @keyframes slide-in-left {
233
+ 0% { transform: translateX(-100%); opacity: 0; }
234
+ 100% { transform: translateX(0); opacity: 1; }
235
+ }
236
+
237
+ @keyframes slide-in-bottom {
238
+ 0% { transform: translateY(100%); opacity: 0; }
239
+ 100% { transform: translateY(0); opacity: 1; }
240
+ }
241
+
242
+ @keyframes slide-in-top {
243
+ 0% { transform: translateY(-100%); opacity: 0; }
244
+ 100% { transform: translateY(0); opacity: 1; }
245
+ }
246
+
247
+ @keyframes slide-out-right {
248
+ 0% { transform: translateX(0); opacity: 1; }
249
+ 100% { transform: translateX(100%); opacity: 0; }
250
+ }
251
+
252
+ @keyframes slide-out-left {
253
+ 0% { transform: translateX(0); opacity: 1; }
254
+ 100% { transform: translateX(-100%); opacity: 0; }
255
+ }
256
+
257
+ @keyframes slide-out-bottom {
258
+ 0% { transform: translateY(0); opacity: 1; }
259
+ 100% { transform: translateY(100%); opacity: 0; }
260
+ }
261
+
262
+ @keyframes slide-out-top {
263
+ 0% { transform: translateY(0); opacity: 1; }
264
+ 100% { transform: translateY(-100%); opacity: 0; }
265
+ }
266
+
267
+ @keyframes bounce-subtle {
268
+ 0%, 100% { transform: translateY(0); }
269
+ 50% { transform: translateY(-2px); }
270
+ }
271
+
272
+ @keyframes shimmer {
273
+ 0% { transform: translateX(-100%); }
274
+ 100% { transform: translateX(100%); }
275
+ }
276
+
277
+ @keyframes float {
278
+ 0%, 100% { transform: translateY(0px); }
279
+ 50% { transform: translateY(-10px); }
280
+ }
281
+
282
+ @keyframes scale-in {
283
+ 0% { transform: scale(0.9); opacity: 0; }
284
+ 100% { transform: scale(1); opacity: 1; }
285
+ }
286
+
287
+ @keyframes scale-out {
288
+ 0% { transform: scale(1); opacity: 1; }
289
+ 100% { transform: scale(0.9); opacity: 0; }
290
+ }
291
+
292
+ @keyframes row-flash {
293
+ 0% { background-color: rgb(187 247 208); }
294
+ 25% { background-color: rgb(187 247 208); }
295
+ 100% { background-color: transparent; }
296
+ }
297
+
298
+ @keyframes success-check {
299
+ 0% { transform: scale(0); opacity: 0; }
300
+ 50% { transform: scale(1.2); opacity: 1; }
301
+ 100% { transform: scale(1); opacity: 1; }
302
+ }