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,495 @@
1
+ /* ======================
2
+ Tour/Modal Overlay System
3
+ ====================== */
4
+
5
+ /* Tour Overlay - Dark background */
6
+ .tour-overlay {
7
+ position: fixed;
8
+ top: 0;
9
+ left: 0;
10
+ width: 100%;
11
+ height: 100%;
12
+ background: rgba(0, 0, 0, 0.7);
13
+ z-index: 9998;
14
+ transition: opacity 0.3s ease;
15
+ }
16
+
17
+ /* Tour Spotlight - Highlighted area */
18
+ .tour-spotlight {
19
+ position: fixed;
20
+ pointer-events: none;
21
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
22
+ border-radius: 8px;
23
+ }
24
+
25
+ /* Spotlight style - Creates cutout effect */
26
+ .tour-spotlight-spotlight {
27
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7);
28
+ animation: onboarding-spotlightPulse 2s ease-in-out infinite;
29
+ }
30
+
31
+ @keyframes onboarding-spotlightPulse {
32
+ 0%, 100% {
33
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7);
34
+ }
35
+ 50% {
36
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.75);
37
+ }
38
+ }
39
+
40
+ /* Border highlight style */
41
+ .tour-spotlight-border {
42
+ border: 3px solid #3b82f6;
43
+ box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.2);
44
+ animation: onboarding-borderPulse 2s ease-in-out infinite;
45
+ }
46
+
47
+ @keyframes onboarding-borderPulse {
48
+ 0%, 100% {
49
+ border-color: #3b82f6;
50
+ box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.2);
51
+ }
52
+ 50% {
53
+ border-color: #2563eb;
54
+ box-shadow: 0 0 0 6px rgba(37, 99, 235, 0.3);
55
+ }
56
+ }
57
+
58
+ /* Glow highlight style */
59
+ .tour-spotlight-glow {
60
+ box-shadow:
61
+ 0 0 0 4px rgba(59, 130, 246, 0.3),
62
+ 0 0 20px 8px rgba(59, 130, 246, 0.4),
63
+ inset 0 0 20px rgba(59, 130, 246, 0.2);
64
+ animation: onboarding-glowPulse 2s ease-in-out infinite;
65
+ }
66
+
67
+ @keyframes onboarding-glowPulse {
68
+ 0%, 100% {
69
+ box-shadow:
70
+ 0 0 0 4px rgba(59, 130, 246, 0.3),
71
+ 0 0 20px 8px rgba(59, 130, 246, 0.4),
72
+ inset 0 0 20px rgba(59, 130, 246, 0.2);
73
+ }
74
+ 50% {
75
+ box-shadow:
76
+ 0 0 0 6px rgba(59, 130, 246, 0.4),
77
+ 0 0 30px 12px rgba(59, 130, 246, 0.5),
78
+ inset 0 0 30px rgba(59, 130, 246, 0.3);
79
+ }
80
+ }
81
+
82
+ /* Tour Popup - Content and navigation */
83
+ .tour-popup {
84
+ position: fixed;
85
+ z-index: 10001;
86
+ background: white;
87
+ border-radius: 12px;
88
+ box-shadow:
89
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1),
90
+ 0 10px 10px -5px rgba(0, 0, 0, 0.04);
91
+ max-width: 400px;
92
+ width: calc(100% - 2rem);
93
+ opacity: 0;
94
+ transform: scale(0.95);
95
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
96
+ }
97
+
98
+ .tour-popup.onboarding-show {
99
+ opacity: 1;
100
+ transform: scale(1);
101
+ }
102
+
103
+ /* Popup Content */
104
+ .tour-popup-content {
105
+ padding: 1.5rem;
106
+ }
107
+
108
+ /* Popup Title */
109
+ .tour-popup-title {
110
+ margin: 0 0 1rem;
111
+ font-size: 1.25rem;
112
+ font-weight: 600;
113
+ color: #111827;
114
+ line-height: 1.4;
115
+ }
116
+
117
+ /* Popup Body */
118
+ .tour-popup-body {
119
+ margin: 0 0 1.5rem;
120
+ font-size: 0.9375rem;
121
+ line-height: 1.6;
122
+ color: #4b5563;
123
+ }
124
+
125
+ .tour-popup-body p {
126
+ margin: 0 0 0.75rem;
127
+ }
128
+
129
+ .tour-popup-body p:last-child {
130
+ margin-bottom: 0;
131
+ }
132
+
133
+ .tour-popup-body ul,
134
+ .tour-popup-body ol {
135
+ margin: 0 0 0.75rem;
136
+ padding-left: 1.5rem;
137
+ }
138
+
139
+ .tour-popup-body li {
140
+ margin-bottom: 0.25rem;
141
+ }
142
+
143
+ .tour-popup-body strong {
144
+ font-weight: 600;
145
+ color: #111827;
146
+ }
147
+
148
+ .tour-popup-body code {
149
+ padding: 0.125rem 0.375rem;
150
+ background: #f3f4f6;
151
+ border-radius: 0.25rem;
152
+ font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
153
+ font-size: 0.875em;
154
+ }
155
+
156
+ /* Progress Indicator */
157
+ .tour-popup-progress {
158
+ margin: 1.5rem 0 1rem;
159
+ padding-top: 1rem;
160
+ border-top: 1px solid #e5e7eb;
161
+ }
162
+
163
+ /* Progress Bar */
164
+ .tour-progress-bar {
165
+ width: 100%;
166
+ height: 6px;
167
+ background: #e5e7eb;
168
+ border-radius: 3px;
169
+ overflow: hidden;
170
+ margin-bottom: 0.5rem;
171
+ }
172
+
173
+ .tour-progress-fill {
174
+ height: 100%;
175
+ background: linear-gradient(90deg, #3b82f6, #2563eb);
176
+ border-radius: 3px;
177
+ transition: width 0.3s ease;
178
+ }
179
+
180
+ /* Progress Text */
181
+ .tour-progress-text {
182
+ font-size: 0.8125rem;
183
+ color: #6b7280;
184
+ text-align: center;
185
+ font-weight: 500;
186
+ }
187
+
188
+ /* Popup Actions */
189
+ .tour-popup-actions {
190
+ display: flex;
191
+ justify-content: space-between;
192
+ align-items: center;
193
+ gap: 0.75rem;
194
+ margin-top: 1.5rem;
195
+ }
196
+
197
+ .tour-popup-nav {
198
+ display: flex;
199
+ gap: 0.5rem;
200
+ }
201
+
202
+ /* Tour Buttons */
203
+ .tour-btn {
204
+ display: inline-flex;
205
+ align-items: center;
206
+ justify-content: center;
207
+ padding: 0.5rem 1rem;
208
+ font-size: 0.875rem;
209
+ font-weight: 500;
210
+ line-height: 1.5;
211
+ border: none;
212
+ border-radius: 0.5rem;
213
+ cursor: pointer;
214
+ transition: all 0.2s ease;
215
+ white-space: nowrap;
216
+ }
217
+
218
+ .tour-btn:focus {
219
+ outline: none;
220
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);
221
+ }
222
+
223
+ .tour-btn:active {
224
+ transform: scale(0.98);
225
+ }
226
+
227
+ /* Next Button - Primary */
228
+ .tour-btn-next {
229
+ background: #3b82f6;
230
+ color: white;
231
+ padding: 0.625rem 1.25rem;
232
+ }
233
+
234
+ .tour-btn-next:hover {
235
+ background: #2563eb;
236
+ }
237
+
238
+ .tour-btn-next:active {
239
+ background: #1d4ed8;
240
+ }
241
+
242
+ /* Previous Button - Secondary */
243
+ .tour-btn-prev {
244
+ background: #f3f4f6;
245
+ color: #374151;
246
+ }
247
+
248
+ .tour-btn-prev:hover {
249
+ background: #e5e7eb;
250
+ }
251
+
252
+ .tour-btn-prev:active {
253
+ background: #d1d5db;
254
+ }
255
+
256
+ /* Skip Button - Ghost */
257
+ .tour-btn-skip {
258
+ background: transparent;
259
+ color: #6b7280;
260
+ padding: 0.5rem 0.75rem;
261
+ }
262
+
263
+ .tour-btn-skip:hover {
264
+ color: #374151;
265
+ background: #f9fafb;
266
+ }
267
+
268
+ .tour-btn-skip:active {
269
+ background: #f3f4f6;
270
+ }
271
+
272
+ /* Mobile Responsive */
273
+ @media (max-width: 640px) {
274
+ .tour-popup {
275
+ max-width: calc(100% - 1rem);
276
+ margin: 0.5rem;
277
+ }
278
+
279
+ .tour-popup-content {
280
+ padding: 1.25rem;
281
+ }
282
+
283
+ .tour-popup-title {
284
+ font-size: 1.125rem;
285
+ }
286
+
287
+ .tour-popup-body {
288
+ font-size: 0.875rem;
289
+ }
290
+
291
+ .tour-popup-actions {
292
+ flex-direction: column-reverse;
293
+ align-items: stretch;
294
+ }
295
+
296
+ .tour-popup-nav {
297
+ width: 100%;
298
+ }
299
+
300
+ .tour-btn {
301
+ flex: 1;
302
+ }
303
+
304
+ .tour-btn-skip {
305
+ width: 100%;
306
+ text-align: center;
307
+ }
308
+
309
+ /* Reduce spotlight padding on mobile */
310
+ .tour-spotlight {
311
+ margin: -5px;
312
+ }
313
+ }
314
+
315
+ /* Tablet Responsive */
316
+ @media (max-width: 768px) and (min-width: 641px) {
317
+ .tour-popup {
318
+ max-width: calc(100% - 2rem);
319
+ }
320
+ }
321
+
322
+ /* Accessibility - High Contrast Mode */
323
+ @media (prefers-contrast: high) {
324
+ .tour-overlay {
325
+ background: rgba(0, 0, 0, 0.85);
326
+ }
327
+
328
+ .tour-spotlight-border {
329
+ border-width: 4px;
330
+ }
331
+
332
+ .tour-btn-next {
333
+ background: #1d4ed8;
334
+ }
335
+
336
+ .tour-btn-prev {
337
+ border: 2px solid #374151;
338
+ }
339
+ }
340
+
341
+ /* Accessibility - Reduced Motion */
342
+ @media (prefers-reduced-motion: reduce) {
343
+ .tour-overlay,
344
+ .tour-popup,
345
+ .tour-spotlight,
346
+ .tour-progress-fill,
347
+ .tour-btn {
348
+ transition: none;
349
+ animation: none;
350
+ }
351
+
352
+ .tour-spotlight-spotlight {
353
+ animation: none;
354
+ }
355
+
356
+ .tour-spotlight-border {
357
+ animation: none;
358
+ }
359
+
360
+ .tour-spotlight-glow {
361
+ animation: none;
362
+ }
363
+ }
364
+
365
+ /* Dark Mode Support */
366
+ @media (prefers-color-scheme: dark) {
367
+ .tour-popup {
368
+ background: #1f2937;
369
+ box-shadow:
370
+ 0 20px 25px -5px rgba(0, 0, 0, 0.3),
371
+ 0 10px 10px -5px rgba(0, 0, 0, 0.2);
372
+ }
373
+
374
+ .tour-popup-title {
375
+ color: #f9fafb;
376
+ }
377
+
378
+ .tour-popup-body {
379
+ color: #d1d5db;
380
+ }
381
+
382
+ .tour-popup-body strong {
383
+ color: #f3f4f6;
384
+ }
385
+
386
+ .tour-popup-body code {
387
+ background: #374151;
388
+ color: #e5e7eb;
389
+ }
390
+
391
+ .tour-popup-progress {
392
+ border-top-color: #374151;
393
+ }
394
+
395
+ .tour-progress-bar {
396
+ background: #374151;
397
+ }
398
+
399
+ .tour-progress-text {
400
+ color: #9ca3af;
401
+ }
402
+
403
+ .tour-btn-prev {
404
+ background: #374151;
405
+ color: #e5e7eb;
406
+ }
407
+
408
+ .tour-btn-prev:hover {
409
+ background: #4b5563;
410
+ }
411
+
412
+ .tour-btn-skip {
413
+ color: #9ca3af;
414
+ }
415
+
416
+ .tour-btn-skip:hover {
417
+ color: #d1d5db;
418
+ background: #374151;
419
+ }
420
+ }
421
+
422
+ /* Print Styles - Hide tour elements when printing */
423
+ @media print {
424
+ .tour-overlay,
425
+ .tour-spotlight,
426
+ .tour-popup {
427
+ display: none !important;
428
+ }
429
+ }
430
+
431
+ /* Focus-visible polyfill support */
432
+ .tour-btn:focus:not(:focus-visible) {
433
+ box-shadow: none;
434
+ }
435
+
436
+ .tour-btn:focus-visible {
437
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);
438
+ }
439
+
440
+ /* Utility classes for custom tour content */
441
+ .tour-highlight {
442
+ background: #dbeafe;
443
+ color: #1e40af;
444
+ padding: 0.125rem 0.375rem;
445
+ border-radius: 0.25rem;
446
+ font-weight: 500;
447
+ }
448
+
449
+ .tour-icon {
450
+ display: inline-flex;
451
+ align-items: center;
452
+ justify-content: center;
453
+ width: 1.5rem;
454
+ height: 1.5rem;
455
+ margin-right: 0.5rem;
456
+ font-size: 1.125rem;
457
+ }
458
+
459
+ .tour-step-image {
460
+ width: 100%;
461
+ max-height: 200px;
462
+ object-fit: cover;
463
+ border-radius: 0.5rem;
464
+ margin: 0.75rem 0;
465
+ }
466
+
467
+ /* Animation for tour entrance */
468
+ @keyframes onboarding-tourSlideIn {
469
+ from {
470
+ opacity: 0;
471
+ transform: translateY(20px);
472
+ }
473
+ to {
474
+ opacity: 1;
475
+ transform: translateY(0);
476
+ }
477
+ }
478
+
479
+ .tour-popup.animate-in {
480
+ animation: onboarding-tourSlideIn 0.3s ease-out;
481
+ }
482
+
483
+ /* Pulse animation for interactive elements */
484
+ @keyframes onboarding-tourPulse {
485
+ 0%, 100% {
486
+ opacity: 1;
487
+ }
488
+ 50% {
489
+ opacity: 0.7;
490
+ }
491
+ }
492
+
493
+ .tour-pulse {
494
+ animation: onboarding-tourPulse 2s ease-in-out infinite;
495
+ }