rails_onboarding 0.6.1

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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +1351 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/javascripts/rails_onboarding/admin/chart_controller.js +25 -0
  6. data/app/assets/javascripts/rails_onboarding/admin/filter_controller.js +49 -0
  7. data/app/assets/javascripts/rails_onboarding/admin/flash_controller.js +21 -0
  8. data/app/assets/javascripts/rails_onboarding/admin/flow_editor_controller.js +86 -0
  9. data/app/assets/javascripts/rails_onboarding/application.js +231 -0
  10. data/app/assets/javascripts/rails_onboarding/milestone_celebration_controller.js +177 -0
  11. data/app/assets/javascripts/rails_onboarding/milestone_dashboard_controller.js +132 -0
  12. data/app/assets/javascripts/rails_onboarding/milestone_detail_controller.js +34 -0
  13. data/app/assets/javascripts/rails_onboarding/navigation_controller.js +277 -0
  14. data/app/assets/javascripts/rails_onboarding/onboarding_controller.js +326 -0
  15. data/app/assets/javascripts/rails_onboarding/progress_controller.js +203 -0
  16. data/app/assets/javascripts/rails_onboarding/progressive_disclosure_controller.js +218 -0
  17. data/app/assets/javascripts/rails_onboarding/tooltip_controller.js +1237 -0
  18. data/app/assets/javascripts/rails_onboarding/tooltip_scheduler_controller.js +511 -0
  19. data/app/assets/javascripts/rails_onboarding/tour_controller.js +763 -0
  20. data/app/assets/stylesheets/rails_onboarding/accessibility.css +536 -0
  21. data/app/assets/stylesheets/rails_onboarding/admin.css +816 -0
  22. data/app/assets/stylesheets/rails_onboarding/application.css +1145 -0
  23. data/app/assets/stylesheets/rails_onboarding/flash_messages.css +237 -0
  24. data/app/assets/stylesheets/rails_onboarding/milestones.css +545 -0
  25. data/app/assets/stylesheets/rails_onboarding/mobile.css +856 -0
  26. data/app/assets/stylesheets/rails_onboarding/progressive_disclosure.css +299 -0
  27. data/app/assets/stylesheets/rails_onboarding/tooltips.css +468 -0
  28. data/app/assets/stylesheets/rails_onboarding/tour.css +495 -0
  29. data/app/assets/stylesheets/rails_onboarding/utilities.css +393 -0
  30. data/app/controllers/concerns/rails_onboarding/admin_authorization.rb +98 -0
  31. data/app/controllers/concerns/rails_onboarding/rate_limitable.rb +104 -0
  32. data/app/controllers/rails_onboarding/ab_tests_controller.rb +257 -0
  33. data/app/controllers/rails_onboarding/admin/ab_tests_controller.rb +121 -0
  34. data/app/controllers/rails_onboarding/admin/base_controller.rb +68 -0
  35. data/app/controllers/rails_onboarding/admin/dashboard_controller.rb +189 -0
  36. data/app/controllers/rails_onboarding/admin/flows_controller.rb +175 -0
  37. data/app/controllers/rails_onboarding/admin/users_controller.rb +366 -0
  38. data/app/controllers/rails_onboarding/application_controller.rb +9 -0
  39. data/app/controllers/rails_onboarding/milestones_controller.rb +126 -0
  40. data/app/controllers/rails_onboarding/onboarding_controller.rb +409 -0
  41. data/app/controllers/rails_onboarding/progressive_features_controller.rb +134 -0
  42. data/app/controllers/rails_onboarding/templates_controller.rb +162 -0
  43. data/app/controllers/rails_onboarding/test_sessions_controller.rb +16 -0
  44. data/app/controllers/rails_onboarding/tooltips_controller.rb +92 -0
  45. data/app/helpers/rails_onboarding/application_helper.rb +4 -0
  46. data/app/helpers/rails_onboarding/i18n_helper.rb +137 -0
  47. data/app/helpers/rails_onboarding/personalization_helper.rb +184 -0
  48. data/app/helpers/rails_onboarding/templates_helper.rb +253 -0
  49. data/app/jobs/rails_onboarding/application_job.rb +4 -0
  50. data/app/mailers/rails_onboarding/application_mailer.rb +6 -0
  51. data/app/mailers/rails_onboarding/onboarding_mailer.rb +72 -0
  52. data/app/models/concerns/rails_onboarding/ab_testable.rb +149 -0
  53. data/app/models/concerns/rails_onboarding/onboardable.rb +649 -0
  54. data/app/models/concerns/rails_onboarding/personalizable.rb +211 -0
  55. data/app/models/concerns/rails_onboarding/progressive_disclosure.rb +276 -0
  56. data/app/models/rails_onboarding/analytics.rb +255 -0
  57. data/app/models/rails_onboarding/analytics_event.rb +168 -0
  58. data/app/models/rails_onboarding/application_record.rb +5 -0
  59. data/app/models/rails_onboarding/flow.rb +41 -0
  60. data/app/services/rails_onboarding/milestone_service.rb +105 -0
  61. data/app/views/layouts/rails_onboarding/admin.html.erb +106 -0
  62. data/app/views/layouts/rails_onboarding/application.html.erb +65 -0
  63. data/app/views/rails_onboarding/ab_tests/index.html.erb +209 -0
  64. data/app/views/rails_onboarding/ab_tests/results.html.erb +253 -0
  65. data/app/views/rails_onboarding/admin/ab_tests/_ab_test_card.html.erb +24 -0
  66. data/app/views/rails_onboarding/admin/ab_tests/index.html.erb +57 -0
  67. data/app/views/rails_onboarding/admin/ab_tests/show.html.erb +41 -0
  68. data/app/views/rails_onboarding/admin/dashboard/index.html.erb +224 -0
  69. data/app/views/rails_onboarding/admin/flows/_form.html.erb +147 -0
  70. data/app/views/rails_onboarding/admin/flows/edit.html.erb +7 -0
  71. data/app/views/rails_onboarding/admin/flows/index.html.erb +125 -0
  72. data/app/views/rails_onboarding/admin/flows/new.html.erb +7 -0
  73. data/app/views/rails_onboarding/admin/flows/preview.html.erb +40 -0
  74. data/app/views/rails_onboarding/admin/flows/show.html.erb +114 -0
  75. data/app/views/rails_onboarding/admin/users/index.html.erb +180 -0
  76. data/app/views/rails_onboarding/admin/users/show.html.erb +187 -0
  77. data/app/views/rails_onboarding/milestones/index.html.erb +64 -0
  78. data/app/views/rails_onboarding/milestones/show.html.erb +57 -0
  79. data/app/views/rails_onboarding/onboarding/_custom_footer.html.erb +2 -0
  80. data/app/views/rails_onboarding/onboarding/_progress_indicator.html.erb +56 -0
  81. data/app/views/rails_onboarding/onboarding/_step_navigation.html.erb +44 -0
  82. data/app/views/rails_onboarding/onboarding/step.html.erb +38 -0
  83. data/app/views/rails_onboarding/onboarding/welcome.html.erb +37 -0
  84. data/app/views/rails_onboarding/onboarding_mailer/completion_email.html.erb +109 -0
  85. data/app/views/rails_onboarding/onboarding_mailer/completion_email.text.erb +29 -0
  86. data/app/views/rails_onboarding/onboarding_mailer/reminder_email.html.erb +99 -0
  87. data/app/views/rails_onboarding/onboarding_mailer/reminder_email.text.erb +20 -0
  88. data/app/views/rails_onboarding/onboarding_mailer/step_completed_email.html.erb +105 -0
  89. data/app/views/rails_onboarding/onboarding_mailer/step_completed_email.text.erb +19 -0
  90. data/app/views/rails_onboarding/onboarding_mailer/welcome_email.html.erb +74 -0
  91. data/app/views/rails_onboarding/onboarding_mailer/welcome_email.text.erb +17 -0
  92. data/app/views/rails_onboarding/shared/_flash.html.erb +25 -0
  93. data/app/views/rails_onboarding/shared/_milestone_badge.html.erb +22 -0
  94. data/app/views/rails_onboarding/shared/_milestone_celebration.html.erb +44 -0
  95. data/app/views/rails_onboarding/shared/_onboarding_banner.html.erb +48 -0
  96. data/app/views/rails_onboarding/templates/index.html.erb +255 -0
  97. data/config/importmap.rb +33 -0
  98. data/config/locales/en.yml +62 -0
  99. data/config/locales/es.yml +62 -0
  100. data/config/locales/fr.yml +62 -0
  101. data/config/routes.rb +79 -0
  102. data/lib/generators/rails_onboarding/install_generator.rb +124 -0
  103. data/lib/generators/rails_onboarding/templates/README +120 -0
  104. data/lib/generators/rails_onboarding/templates/add_analytics_to_rails_onboarding.rb +33 -0
  105. data/lib/generators/rails_onboarding/templates/add_milestone_tracking_to_users.rb +38 -0
  106. data/lib/generators/rails_onboarding/templates/add_onboarding_indexes.rb +93 -0
  107. data/lib/generators/rails_onboarding/templates/add_onboarding_to_users.rb +51 -0
  108. data/lib/generators/rails_onboarding/templates/add_robustness_fields_to_users.rb.tt +20 -0
  109. data/lib/generators/rails_onboarding/templates/create_rails_onboarding_flows.rb +18 -0
  110. data/lib/generators/rails_onboarding/templates/onboarding.css +18 -0
  111. data/lib/generators/rails_onboarding/templates/rails_onboarding.rb +75 -0
  112. data/lib/generators/rails_onboarding/update_generator.rb +73 -0
  113. data/lib/rails_onboarding/api_mode.rb +367 -0
  114. data/lib/rails_onboarding/backfill.rb +130 -0
  115. data/lib/rails_onboarding/background_jobs.rb +412 -0
  116. data/lib/rails_onboarding/caching.rb +180 -0
  117. data/lib/rails_onboarding/cdn_support.rb +202 -0
  118. data/lib/rails_onboarding/configuration/ab_testing.rb +24 -0
  119. data/lib/rails_onboarding/configuration/analytics.rb +29 -0
  120. data/lib/rails_onboarding/configuration/integrations.rb +31 -0
  121. data/lib/rails_onboarding/configuration/milestones.rb +92 -0
  122. data/lib/rails_onboarding/configuration/personalization.rb +25 -0
  123. data/lib/rails_onboarding/configuration/progressive_disclosure.rb +41 -0
  124. data/lib/rails_onboarding/configuration/rate_limiting.rb +18 -0
  125. data/lib/rails_onboarding/configuration/steps.rb +121 -0
  126. data/lib/rails_onboarding/configuration/templates.rb +85 -0
  127. data/lib/rails_onboarding/configuration/tooltips.rb +32 -0
  128. data/lib/rails_onboarding/configuration.rb +133 -0
  129. data/lib/rails_onboarding/configuration_errors.rb +19 -0
  130. data/lib/rails_onboarding/configuration_validator.rb +477 -0
  131. data/lib/rails_onboarding/controller_helpers.rb +153 -0
  132. data/lib/rails_onboarding/current.rb +13 -0
  133. data/lib/rails_onboarding/deprecation.rb +64 -0
  134. data/lib/rails_onboarding/devise_integration.rb +122 -0
  135. data/lib/rails_onboarding/engine.rb +245 -0
  136. data/lib/rails_onboarding/error_recovery.rb +173 -0
  137. data/lib/rails_onboarding/lazy_loading.rb +155 -0
  138. data/lib/rails_onboarding/multi_tenant.rb +306 -0
  139. data/lib/rails_onboarding/requirements_validator.rb +315 -0
  140. data/lib/rails_onboarding/responsive_helper.rb +218 -0
  141. data/lib/rails_onboarding/session_manager.rb +187 -0
  142. data/lib/rails_onboarding/skip_logic.rb +159 -0
  143. data/lib/rails_onboarding/turbo_compatibility.rb +229 -0
  144. data/lib/rails_onboarding/version.rb +3 -0
  145. data/lib/rails_onboarding.rb +44 -0
  146. data/lib/tasks/rails_onboarding_analytics.rake +136 -0
  147. data/lib/tasks/rails_onboarding_tasks.rake +162 -0
  148. metadata +303 -0
@@ -0,0 +1,545 @@
1
+ /* Milestone Dashboard Styles */
2
+ .milestones-dashboard {
3
+ max-width: 1200px;
4
+ margin: 0 auto;
5
+ padding: 2rem;
6
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
7
+ }
8
+
9
+ .milestone-header {
10
+ display: flex;
11
+ justify-content: space-between;
12
+ align-items: center;
13
+ margin-bottom: 3rem;
14
+ padding-bottom: 2rem;
15
+ border-bottom: 2px solid #f0f0f0;
16
+ }
17
+
18
+ .milestone-title {
19
+ font-size: 2.5rem;
20
+ font-weight: 700;
21
+ color: #2c3e50;
22
+ margin: 0;
23
+ }
24
+
25
+ .milestone-stats {
26
+ display: flex;
27
+ gap: 2rem;
28
+ }
29
+
30
+ .total-points,
31
+ .achievement-count {
32
+ text-align: center;
33
+ padding: 1rem 1.5rem;
34
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
35
+ border-radius: 12px;
36
+ color: white;
37
+ min-width: 120px;
38
+ }
39
+
40
+ .points-value,
41
+ .count-value {
42
+ display: block;
43
+ font-size: 2rem;
44
+ font-weight: 700;
45
+ line-height: 1;
46
+ }
47
+
48
+ .points-label,
49
+ .count-label {
50
+ display: block;
51
+ font-size: 0.875rem;
52
+ opacity: 0.9;
53
+ margin-top: 0.25rem;
54
+ }
55
+
56
+ /* Section Titles */
57
+ .onboarding-section-title {
58
+ font-size: 1.5rem;
59
+ font-weight: 600;
60
+ color: #2c3e50;
61
+ margin-bottom: 1.5rem;
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 0.5rem;
65
+ }
66
+
67
+ /* Milestone Grid */
68
+ .milestone-grid {
69
+ display: grid;
70
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
71
+ gap: 1.5rem;
72
+ margin-bottom: 3rem;
73
+ }
74
+
75
+ /* Milestone Cards */
76
+ .milestone-card {
77
+ background: white;
78
+ border-radius: 16px;
79
+ padding: 1.5rem;
80
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
81
+ transition: all 0.3s ease;
82
+ position: relative;
83
+ overflow: hidden;
84
+ }
85
+
86
+ .milestone-card:hover {
87
+ transform: translateY(-4px);
88
+ box-shadow: 0 10px 25px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
89
+ }
90
+
91
+ .milestone-card.milestone-achieved {
92
+ border: 2px solid #10b981;
93
+ background: linear-gradient(135deg, #ecfdf5 0%, #f0fdf4 100%);
94
+ }
95
+
96
+ .milestone-card.milestone-achieved::before {
97
+ content: '';
98
+ position: absolute;
99
+ top: -2px;
100
+ left: -2px;
101
+ right: -2px;
102
+ bottom: -2px;
103
+ background: linear-gradient(135deg, #10b981, #059669);
104
+ border-radius: 16px;
105
+ z-index: -1;
106
+ }
107
+
108
+ .milestone-card.milestone-available {
109
+ border: 2px solid #e5e7eb;
110
+ opacity: 0.8;
111
+ }
112
+
113
+ .milestone-icon {
114
+ font-size: 3rem;
115
+ margin-bottom: 1rem;
116
+ display: block;
117
+ text-align: center;
118
+ }
119
+
120
+ .milestone-locked .milestone-icon {
121
+ filter: grayscale(100%);
122
+ opacity: 0.5;
123
+ }
124
+
125
+ .milestone-content {
126
+ text-align: center;
127
+ }
128
+
129
+ .milestone-name {
130
+ font-size: 1.25rem;
131
+ font-weight: 600;
132
+ color: #1f2937;
133
+ margin-bottom: 0.5rem;
134
+ }
135
+
136
+ .milestone-description {
137
+ color: #6b7280;
138
+ font-size: 0.875rem;
139
+ line-height: 1.5;
140
+ margin-bottom: 1rem;
141
+ }
142
+
143
+ .milestone-points {
144
+ display: inline-block;
145
+ background: #f59e0b;
146
+ color: white;
147
+ padding: 0.25rem 0.75rem;
148
+ border-radius: 20px;
149
+ font-size: 0.875rem;
150
+ font-weight: 600;
151
+ }
152
+
153
+ /* Milestone Detail Page */
154
+ .milestone-detail {
155
+ max-width: 800px;
156
+ margin: 0 auto;
157
+ padding: 2rem;
158
+ }
159
+
160
+ .milestone-hero {
161
+ text-align: center;
162
+ padding: 3rem 2rem;
163
+ background: white;
164
+ border-radius: 20px;
165
+ box-shadow: 0 10px 25px -3px rgba(0, 0, 0, 0.1);
166
+ margin-bottom: 2rem;
167
+ position: relative;
168
+ overflow: hidden;
169
+ }
170
+
171
+ .milestone-hero.onboarding-achieved {
172
+ background: linear-gradient(135deg, #ecfdf5 0%, #f0fdf4 100%);
173
+ border: 3px solid #10b981;
174
+ }
175
+
176
+ .milestone-hero.celebration-glow {
177
+ animation: onboarding-celebration-pulse 2s ease-in-out;
178
+ }
179
+
180
+ .milestone-icon-large {
181
+ font-size: 5rem;
182
+ margin-bottom: 1rem;
183
+ display: block;
184
+ }
185
+
186
+ .milestone-meta {
187
+ display: flex;
188
+ justify-content: center;
189
+ gap: 2rem;
190
+ margin-top: 2rem;
191
+ flex-wrap: wrap;
192
+ }
193
+
194
+ .achievement-status {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 0.5rem;
198
+ padding: 0.5rem 1rem;
199
+ border-radius: 20px;
200
+ font-weight: 600;
201
+ }
202
+
203
+ .achievement-status.onboarding-achieved {
204
+ background: #dcfce7;
205
+ color: #16a34a;
206
+ }
207
+
208
+ .achievement-status.onboarding-pending {
209
+ background: #fef3c7;
210
+ color: #d97706;
211
+ }
212
+
213
+ /* Milestone Badge Component */
214
+ .milestone-badge {
215
+ display: flex;
216
+ align-items: center;
217
+ gap: 0.75rem;
218
+ padding: 0.75rem;
219
+ background: white;
220
+ border-radius: 12px;
221
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
222
+ transition: all 0.2s ease;
223
+ position: relative;
224
+ }
225
+
226
+ .milestone-badge:hover {
227
+ transform: scale(1.02);
228
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
229
+ }
230
+
231
+ .milestone-badge.onboarding-achieved {
232
+ border: 2px solid #10b981;
233
+ background: linear-gradient(135deg, #f0fdf4 0%, #ecfdf5 100%);
234
+ }
235
+
236
+ .milestone-badge.onboarding-locked {
237
+ opacity: 0.6;
238
+ }
239
+
240
+ .onboarding-badge-icon {
241
+ font-size: 1.5rem;
242
+ position: relative;
243
+ }
244
+
245
+ .lock-overlay {
246
+ position: absolute;
247
+ top: -4px;
248
+ right: -4px;
249
+ font-size: 0.75rem;
250
+ background: #ef4444;
251
+ color: white;
252
+ border-radius: 50%;
253
+ width: 20px;
254
+ height: 20px;
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ }
259
+
260
+ .onboarding-badge-content {
261
+ flex: 1;
262
+ }
263
+
264
+ .onboarding-badge-title {
265
+ font-weight: 600;
266
+ color: #1f2937;
267
+ font-size: 0.875rem;
268
+ }
269
+
270
+ .badge-points {
271
+ color: #f59e0b;
272
+ font-size: 0.75rem;
273
+ font-weight: 600;
274
+ }
275
+
276
+ .achievement-check {
277
+ font-size: 1.25rem;
278
+ color: #10b981;
279
+ }
280
+
281
+ /* Milestone Celebration Modal */
282
+ .milestone-celebration-overlay {
283
+ position: fixed;
284
+ top: 0;
285
+ left: 0;
286
+ right: 0;
287
+ bottom: 0;
288
+ background: rgba(0, 0, 0, 0.5);
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ z-index: 1000;
293
+ backdrop-filter: blur(4px);
294
+ opacity: 1;
295
+ transition: opacity 0.3s ease-in-out;
296
+ }
297
+
298
+ .milestone-celebration-overlay.is-hidden {
299
+ display: none;
300
+ }
301
+
302
+ .milestone-celebration-overlay.is-fading {
303
+ opacity: 0;
304
+ }
305
+
306
+ .celebration-backdrop {
307
+ position: absolute;
308
+ top: 0;
309
+ left: 0;
310
+ right: 0;
311
+ bottom: 0;
312
+ cursor: pointer;
313
+ }
314
+
315
+ .celebration-modal {
316
+ background: white;
317
+ border-radius: 20px;
318
+ padding: 3rem;
319
+ max-width: 500px;
320
+ margin: 2rem;
321
+ position: relative;
322
+ text-align: center;
323
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
324
+ animation: onboarding-celebration-appear 0.5s ease-out;
325
+ }
326
+
327
+ .confetti-container {
328
+ position: absolute;
329
+ top: 0;
330
+ left: 0;
331
+ right: 0;
332
+ bottom: 0;
333
+ pointer-events: none;
334
+ overflow: hidden;
335
+ border-radius: 20px;
336
+ }
337
+
338
+ .achievement-announcement {
339
+ margin-bottom: 2rem;
340
+ }
341
+
342
+ .achievement-icon-container {
343
+ position: relative;
344
+ display: inline-block;
345
+ margin-bottom: 1rem;
346
+ }
347
+
348
+ .achievement-icon-glow {
349
+ position: absolute;
350
+ top: 50%;
351
+ left: 50%;
352
+ transform: translate(-50%, -50%);
353
+ width: 120px;
354
+ height: 120px;
355
+ background: radial-gradient(circle, rgba(16, 185, 129, 0.3) 0%, transparent 70%);
356
+ border-radius: 50%;
357
+ animation: onboarding-glow-pulse 2s ease-in-out infinite;
358
+ }
359
+
360
+ .achievement-icon {
361
+ font-size: 4rem;
362
+ position: relative;
363
+ z-index: 1;
364
+ animation: onboarding-icon-bounce 1s ease-out;
365
+ }
366
+
367
+ .achievement-title {
368
+ font-size: 1.5rem;
369
+ font-weight: 700;
370
+ color: #1f2937;
371
+ margin-bottom: 0.5rem;
372
+ }
373
+
374
+ .points-earned {
375
+ background: linear-gradient(135deg, #f59e0b 0%, #f97316 100%);
376
+ color: white;
377
+ padding: 1rem 2rem;
378
+ border-radius: 30px;
379
+ font-weight: 600;
380
+ margin: 1.5rem 0;
381
+ display: inline-block;
382
+ }
383
+
384
+ .points-earned .points-value {
385
+ font-size: 1.5rem;
386
+ font-weight: 700;
387
+ }
388
+
389
+ .celebration-actions {
390
+ display: flex;
391
+ gap: 1rem;
392
+ justify-content: center;
393
+ flex-wrap: wrap;
394
+ }
395
+
396
+ /* Empty State */
397
+ .onboarding-empty-state {
398
+ text-align: center;
399
+ padding: 4rem 2rem;
400
+ color: #6b7280;
401
+ }
402
+
403
+ .onboarding-empty-icon {
404
+ font-size: 4rem;
405
+ margin-bottom: 1rem;
406
+ }
407
+
408
+ /* Animations */
409
+ @keyframes onboarding-confetti-fall {
410
+ 0% {
411
+ transform: translateY(-100vh) rotate(0deg);
412
+ opacity: 1;
413
+ }
414
+ 100% {
415
+ transform: translateY(100vh) rotate(720deg);
416
+ opacity: 0;
417
+ }
418
+ }
419
+
420
+ @keyframes onboarding-celebration-appear {
421
+ 0% {
422
+ opacity: 0;
423
+ transform: scale(0.8) translateY(20px);
424
+ }
425
+ 100% {
426
+ opacity: 1;
427
+ transform: scale(1) translateY(0);
428
+ }
429
+ }
430
+
431
+ @keyframes onboarding-glow-pulse {
432
+ 0%, 100% {
433
+ opacity: 0.5;
434
+ transform: translate(-50%, -50%) scale(1);
435
+ }
436
+ 50% {
437
+ opacity: 0.8;
438
+ transform: translate(-50%, -50%) scale(1.1);
439
+ }
440
+ }
441
+
442
+ @keyframes onboarding-icon-bounce {
443
+ 0%, 100% {
444
+ transform: translateY(0);
445
+ }
446
+ 25% {
447
+ transform: translateY(-10px);
448
+ }
449
+ 50% {
450
+ transform: translateY(0);
451
+ }
452
+ 75% {
453
+ transform: translateY(-5px);
454
+ }
455
+ }
456
+
457
+ @keyframes onboarding-milestone-bounce {
458
+ 0%, 100% {
459
+ transform: translateY(0);
460
+ }
461
+ 25% {
462
+ transform: translateY(-15px);
463
+ }
464
+ 50% {
465
+ transform: translateY(0);
466
+ }
467
+ 75% {
468
+ transform: translateY(-8px);
469
+ }
470
+ }
471
+
472
+ @keyframes onboarding-celebration-pulse {
473
+ 0%, 100% {
474
+ box-shadow: 0 10px 25px -3px rgba(0, 0, 0, 0.1);
475
+ }
476
+ 50% {
477
+ box-shadow: 0 10px 25px -3px rgba(16, 185, 129, 0.3), 0 0 0 4px rgba(16, 185, 129, 0.1);
478
+ }
479
+ }
480
+
481
+ /* Responsive Design */
482
+ @media (max-width: 768px) {
483
+ .milestones-dashboard {
484
+ padding: 1rem;
485
+ }
486
+
487
+ .milestone-header {
488
+ flex-direction: column;
489
+ gap: 1.5rem;
490
+ text-align: center;
491
+ }
492
+
493
+ .milestone-stats {
494
+ justify-content: center;
495
+ }
496
+
497
+ .milestone-grid {
498
+ grid-template-columns: 1fr;
499
+ }
500
+
501
+ .celebration-modal {
502
+ margin: 1rem;
503
+ padding: 2rem;
504
+ }
505
+
506
+ .milestone-detail {
507
+ padding: 1rem;
508
+ }
509
+ }
510
+
511
+ /* Buttons */
512
+ .onboarding-btn {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ justify-content: center;
516
+ padding: 0.75rem 1.5rem;
517
+ border: none;
518
+ border-radius: 8px;
519
+ font-weight: 600;
520
+ text-decoration: none;
521
+ cursor: pointer;
522
+ transition: all 0.2s ease;
523
+ font-size: 0.875rem;
524
+ }
525
+
526
+ .onboarding-btn-primary {
527
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
528
+ color: white;
529
+ }
530
+
531
+ .onboarding-btn-primary:hover {
532
+ transform: translateY(-1px);
533
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
534
+ }
535
+
536
+ .onboarding-btn-secondary {
537
+ background: #f3f4f6;
538
+ color: #374151;
539
+ border: 1px solid #d1d5db;
540
+ }
541
+
542
+ .onboarding-btn-secondary:hover {
543
+ background: #e5e7eb;
544
+ transform: translateY(-1px);
545
+ }