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,1145 @@
1
+ /*
2
+ * Rails Onboarding Engine Stylesheet
3
+ *
4
+ * This is the main stylesheet for the Rails Onboarding gem. All styles are carefully
5
+ * namespaced to prevent conflicts with host application styles.
6
+ *
7
+ * CSS Isolation Strategy:
8
+ * - All class names are prefixed with 'onboarding-' or 'rails-onboarding-'
9
+ * - CSS custom properties (variables) use the --onboarding- prefix
10
+ * - Selectors are scoped to specific onboarding containers
11
+ * - No global element selectors without namespace scoping
12
+ *
13
+ * Asset Pipeline Compatibility:
14
+ * - Compatible with Sprockets, Propshaft, and modern bundlers (ESBuild, Webpack)
15
+ * - Can be imported via asset pipeline or directly linked
16
+ *
17
+ * Usage in host application:
18
+ * Sprockets: *= require rails_onboarding/application
19
+ * Import: @import "rails_onboarding/application";
20
+ * Link tag: <%= stylesheet_link_tag "rails_onboarding/application" %>
21
+ *
22
+ *= require_tree .
23
+ *= require_self
24
+ *= require rails_onboarding/tooltips
25
+ *= require rails_onboarding/utilities
26
+ *= require rails_onboarding/accessibility
27
+ *= require rails_onboarding/milestones
28
+ *= require rails_onboarding/tour
29
+ *= require rails_onboarding/mobile
30
+ *= require rails_onboarding/flash_messages
31
+ */
32
+
33
+ /* Rails Onboarding Styles - Semantic CSS with Namespace Isolation */
34
+
35
+ /* ======================
36
+ Design Tokens
37
+ ====================== */
38
+ :root {
39
+ /* Colors */
40
+ --onboarding-primary: #6366f1;
41
+ --onboarding-primary-hover: #4f46e5;
42
+ --onboarding-secondary: #64748b;
43
+ --onboarding-success: #10b981;
44
+ --onboarding-warning: #f59e0b;
45
+ --onboarding-danger: #ef4444;
46
+
47
+ /* Backgrounds */
48
+ --onboarding-background: #ffffff;
49
+ --onboarding-surface: #f8fafc;
50
+ --onboarding-surface-elevated: #ffffff;
51
+
52
+ /* Text */
53
+ --onboarding-text: #1f2937;
54
+ --onboarding-text-muted: #6b7280;
55
+ --onboarding-text-light: #9ca3af;
56
+
57
+ /* Borders */
58
+ --onboarding-border: #e5e7eb;
59
+ --onboarding-border-focus: var(--onboarding-primary);
60
+
61
+ /* Spacing */
62
+ --onboarding-space-xs: 0.25rem;
63
+ --onboarding-space-sm: 0.5rem;
64
+ --onboarding-space-md: 1rem;
65
+ --onboarding-space-lg: 1.5rem;
66
+ --onboarding-space-xl: 2rem;
67
+ --onboarding-space-2xl: 3rem;
68
+
69
+ /* Typography */
70
+ --onboarding-text-xs: 0.75rem;
71
+ --onboarding-text-sm: 0.875rem;
72
+ --onboarding-text-base: 1rem;
73
+ --onboarding-text-lg: 1.125rem;
74
+ --onboarding-text-xl: 1.25rem;
75
+ --onboarding-text-2xl: 1.5rem;
76
+ --onboarding-text-3xl: 1.875rem;
77
+
78
+ /* Transitions */
79
+ --onboarding-transition: all 0.2s ease;
80
+
81
+ /* Shadows */
82
+ --onboarding-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
83
+ --onboarding-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
84
+ --onboarding-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
85
+
86
+ /* Focus ring */
87
+ --onboarding-focus-ring: 0 0 0 3px rgba(99, 102, 241, 0.1);
88
+ }
89
+
90
+ /* ======================
91
+ Base Layout
92
+ ====================== */
93
+ .onboarding-container {
94
+ min-height: 100vh;
95
+ display: grid;
96
+ grid-template-rows: auto 1fr auto;
97
+ background: var(--onboarding-background);
98
+ color: var(--onboarding-text);
99
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
100
+ line-height: 1.6;
101
+ }
102
+
103
+ .onboarding-content {
104
+ flex: 1;
105
+ display: flex;
106
+ flex-direction: column;
107
+ align-items: center;
108
+ justify-content: center;
109
+ padding: var(--onboarding-space-2xl) var(--onboarding-space-lg);
110
+ }
111
+
112
+ .onboarding-custom-footer {
113
+ text-align: center;
114
+ }
115
+
116
+ /* Header row of the .onboarding-container grid, holding the progress
117
+ indicator. The @media rules further down already assumed this existed -
118
+ tightening its padding on small screens and hiding it in print - but no
119
+ base rule was ever declared, because nothing rendered it. */
120
+ .onboarding-header {
121
+ padding: var(--onboarding-space-lg);
122
+ }
123
+
124
+ .onboarding-footer {
125
+ display: flex;
126
+ background: var(--onboarding-surface-elevated);
127
+ padding: var(--onboarding-space-lg);
128
+ }
129
+
130
+ /* ======================
131
+ Onboarding Banner
132
+ (rendered on host-app pages outside the engine, so it can't rely on
133
+ .onboarding-container for layout - keep it self-contained)
134
+ ====================== */
135
+ .onboarding-banner {
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: space-between;
139
+ gap: var(--onboarding-space-lg);
140
+ background: var(--onboarding-surface-elevated);
141
+ border: 1px solid var(--onboarding-border);
142
+ border-radius: 0.75rem;
143
+ box-shadow: var(--onboarding-shadow-sm);
144
+ padding: var(--onboarding-space-md) var(--onboarding-space-lg);
145
+ margin-bottom: var(--onboarding-space-lg);
146
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
147
+ color: var(--onboarding-text);
148
+ }
149
+
150
+ .onboarding-banner-progress {
151
+ flex: 1;
152
+ min-width: 12rem;
153
+ }
154
+
155
+ .onboarding-banner-progress .onboarding-progress-bar {
156
+ margin-bottom: var(--onboarding-space-sm);
157
+ }
158
+
159
+ .onboarding-banner-step {
160
+ font-size: var(--onboarding-text-sm);
161
+ color: var(--onboarding-text-muted);
162
+ }
163
+
164
+ .onboarding-banner-step strong {
165
+ color: var(--onboarding-text);
166
+ }
167
+
168
+ .onboarding-banner-actions {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: var(--onboarding-space-md);
172
+ flex-shrink: 0;
173
+ }
174
+
175
+ .onboarding-banner-continue {
176
+ background: var(--onboarding-primary);
177
+ color: white;
178
+ border: 2px solid var(--onboarding-primary);
179
+ padding: var(--onboarding-space-sm) var(--onboarding-space-lg);
180
+ border-radius: 0.5rem;
181
+ font-weight: 600;
182
+ font-size: var(--onboarding-text-sm);
183
+ text-decoration: none;
184
+ white-space: nowrap;
185
+ transition: var(--onboarding-transition);
186
+ }
187
+
188
+ .onboarding-banner-continue:hover {
189
+ background: var(--onboarding-primary-hover);
190
+ border-color: var(--onboarding-primary-hover);
191
+ }
192
+
193
+ .onboarding-banner-skip {
194
+ background: transparent;
195
+ color: var(--onboarding-text-muted);
196
+ border: none;
197
+ padding: var(--onboarding-space-sm) var(--onboarding-space-sm);
198
+ font-size: var(--onboarding-text-sm);
199
+ text-decoration: underline;
200
+ cursor: pointer;
201
+ white-space: nowrap;
202
+ }
203
+
204
+ .onboarding-banner-skip:hover {
205
+ color: var(--onboarding-text);
206
+ }
207
+
208
+ @media screen and (max-width: 30em) {
209
+ .onboarding-banner {
210
+ flex-direction: column;
211
+ align-items: stretch;
212
+ }
213
+
214
+ .onboarding-banner-actions {
215
+ justify-content: space-between;
216
+ }
217
+ }
218
+
219
+ /* ======================
220
+ Progress Indicator
221
+ ====================== */
222
+ .progress-indicator {
223
+ max-width: 50rem;
224
+ margin: 0 auto;
225
+ }
226
+
227
+ .onboarding-progress-bar {
228
+ width: 100%;
229
+ height: 0.5rem;
230
+ background: var(--onboarding-border);
231
+ border-radius: 0.25rem;
232
+ overflow: hidden;
233
+ margin-bottom: var(--onboarding-space-lg);
234
+ }
235
+
236
+ .onboarding-progress-fill {
237
+ height: 100%;
238
+ width: var(--onboarding-progress-width, 0%);
239
+ background: linear-gradient(90deg, var(--onboarding-primary), var(--onboarding-success));
240
+ border-radius: 0.25rem;
241
+ transition: width 0.3s ease;
242
+ }
243
+
244
+ .progress-steps {
245
+ display: flex;
246
+ justify-content: space-between;
247
+ align-items: flex-start;
248
+ gap: var(--onboarding-space-sm);
249
+ margin-bottom: var(--onboarding-space-md);
250
+ }
251
+
252
+ .progress-step {
253
+ display: flex;
254
+ flex-direction: column;
255
+ align-items: center;
256
+ flex: 1;
257
+ min-width: 0;
258
+ }
259
+
260
+ .step-marker {
261
+ width: 2.5rem;
262
+ height: 2.5rem;
263
+ border-radius: 50%;
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: center;
267
+ font-weight: 600;
268
+ font-size: var(--onboarding-text-sm);
269
+ margin-bottom: var(--onboarding-space-sm);
270
+ transition: var(--onboarding-transition);
271
+ }
272
+
273
+ .progress-step.onboarding-upcoming .step-marker {
274
+ background: var(--onboarding-surface);
275
+ border: 2px solid var(--onboarding-border);
276
+ color: var(--onboarding-text-muted);
277
+ }
278
+
279
+ .progress-step.onboarding-current .step-marker {
280
+ background: var(--onboarding-primary);
281
+ border: 2px solid var(--onboarding-primary);
282
+ color: white;
283
+ }
284
+
285
+ .progress-step.onboarding-completed .step-marker {
286
+ background: var(--onboarding-success);
287
+ border: 2px solid var(--onboarding-success);
288
+ color: white;
289
+ }
290
+
291
+ .step-marker-pulse {
292
+ animation: onboarding-pulse 1s ease-in-out;
293
+ }
294
+
295
+ .step-label {
296
+ text-align: center;
297
+ font-size: var(--onboarding-text-xs);
298
+ color: var(--onboarding-text-muted);
299
+ line-height: 1.3;
300
+ }
301
+
302
+ .progress-step.onboarding-current .step-label {
303
+ color: var(--onboarding-text);
304
+ font-weight: 500;
305
+ }
306
+
307
+ .step-counter {
308
+ font-size: var(--onboarding-text-sm);
309
+ color: var(--onboarding-text-muted);
310
+ text-align: center;
311
+ }
312
+
313
+ .onboarding-progress-text {
314
+ text-align: center;
315
+ font-size: var(--onboarding-text-sm);
316
+ color: var(--onboarding-text-muted);
317
+ }
318
+
319
+ .milestone-progress {
320
+ margin-top: var(--onboarding-space-sm);
321
+ padding-top: var(--onboarding-space-sm);
322
+ border-top: 1px solid var(--onboarding-border);
323
+ display: flex;
324
+ justify-content: center;
325
+ gap: var(--onboarding-space-md);
326
+ flex-wrap: wrap;
327
+ }
328
+
329
+ .milestone-points {
330
+ background: linear-gradient(135deg, #f59e0b, #f97316);
331
+ color: white;
332
+ padding: var(--onboarding-space-xs) var(--onboarding-space-sm);
333
+ border-radius: 12px;
334
+ font-size: var(--onboarding-text-xs);
335
+ font-weight: 600;
336
+ }
337
+
338
+ .recent-milestone {
339
+ background: var(--onboarding-surface);
340
+ border: 1px solid var(--onboarding-border);
341
+ padding: var(--onboarding-space-xs) var(--onboarding-space-sm);
342
+ border-radius: 12px;
343
+ font-size: var(--onboarding-text-xs);
344
+ color: var(--onboarding-text-muted);
345
+ }
346
+
347
+ /* ======================
348
+ Step Content
349
+ ====================== */
350
+ .step-content {
351
+ max-width: 42rem;
352
+ width: 100%;
353
+ margin: 0 auto;
354
+ text-align: center;
355
+ }
356
+
357
+ .step-icon {
358
+ font-size: 3rem;
359
+ margin-bottom: var(--onboarding-space-lg);
360
+ }
361
+
362
+ .step-title,
363
+ .step-heading {
364
+ font-size: var(--onboarding-text-3xl);
365
+ font-weight: 700;
366
+ color: var(--onboarding-text);
367
+ margin-bottom: var(--onboarding-space-lg);
368
+ line-height: 1.2;
369
+ }
370
+
371
+ .step-intro,
372
+ .step-subheading {
373
+ font-size: var(--onboarding-text-lg);
374
+ color: var(--onboarding-text-muted);
375
+ margin-bottom: var(--onboarding-space-xl);
376
+ text-align: center;
377
+ }
378
+
379
+ /* .welcome-step is a flex column with `gap` (see below) - flex children's
380
+ own margins don't collapse into that gap, they stack on top of it. Zero
381
+ out .step-heading/.step-subheading's margins there so `gap` is the only
382
+ source of spacing between them and their siblings, instead of doubling up. */
383
+ .welcome-step .step-heading,
384
+ .welcome-step .step-subheading {
385
+ margin: 0;
386
+ }
387
+
388
+ /* ======================
389
+ Welcome Step
390
+ ====================== */
391
+ .welcome-step {
392
+ max-width: 42rem;
393
+ width: 100%;
394
+ margin: 0 auto;
395
+ display: flex;
396
+ flex-direction: column;
397
+ flex-grow: 1;
398
+ gap: var(--onboarding-space-lg);
399
+ text-align: center;
400
+ }
401
+
402
+ .welcome-features {
403
+ text-align: left;
404
+ background: var(--onboarding-surface);
405
+ padding: var(--onboarding-space-xl);
406
+ border-radius: 0.75rem;
407
+ border: 1px solid var(--onboarding-border);
408
+ }
409
+
410
+ .welcome-features h2 {
411
+ font-size: var(--onboarding-text-xl);
412
+ margin-bottom: var(--onboarding-space-lg);
413
+ color: var(--onboarding-text);
414
+ }
415
+
416
+ .feature-list {
417
+ list-style: none;
418
+ padding: 0;
419
+ margin: 0;
420
+ display: grid;
421
+ gap: var(--onboarding-space-md);
422
+ }
423
+
424
+ .feature-item {
425
+ display: flex;
426
+ align-items: center;
427
+ gap: var(--onboarding-space-md);
428
+ padding: var(--onboarding-space-md);
429
+ background: var(--onboarding-background);
430
+ border-radius: 0.5rem;
431
+ border: 1px solid var(--onboarding-border);
432
+ }
433
+
434
+ .feature-icon {
435
+ font-size: var(--onboarding-text-xl);
436
+ flex-shrink: 0;
437
+ }
438
+
439
+ .feature-text {
440
+ font-weight: 500;
441
+ color: var(--onboarding-text);
442
+ }
443
+
444
+ .time-estimate {
445
+ background: linear-gradient(135deg, var(--onboarding-primary), var(--onboarding-success));
446
+ color: white;
447
+ padding: var(--onboarding-space-lg);
448
+ border-radius: 0.75rem;
449
+ text-align: center;
450
+ }
451
+
452
+ .estimate-text {
453
+ margin: 0;
454
+ font-size: var(--onboarding-text-base);
455
+ }
456
+
457
+ /* ======================
458
+ Profile Step
459
+ ====================== */
460
+ .profile-step {
461
+ text-align: left;
462
+ }
463
+
464
+ .profile-settings {
465
+ border: 1px solid var(--onboarding-border);
466
+ border-radius: 0.75rem;
467
+ padding: var(--onboarding-space-xl);
468
+ margin-bottom: var(--onboarding-space-xl);
469
+ background: var(--onboarding-surface);
470
+ }
471
+
472
+ .profile-settings legend {
473
+ font-size: var(--onboarding-text-lg);
474
+ font-weight: 600;
475
+ color: var(--onboarding-text);
476
+ padding: 0 var(--onboarding-space-md);
477
+ }
478
+
479
+ .onboarding-form-group {
480
+ margin-bottom: var(--onboarding-space-lg);
481
+ }
482
+
483
+ .onboarding-form-group:last-child {
484
+ margin-bottom: 0;
485
+ }
486
+
487
+ :where(.onboarding-container) label {
488
+ display: block;
489
+ font-weight: 500;
490
+ color: var(--onboarding-text);
491
+ margin-bottom: var(--onboarding-space-sm);
492
+ font-size: var(--onboarding-text-base);
493
+ }
494
+
495
+ :where(.onboarding-container) input[type="text"],
496
+ :where(.onboarding-container) input[type="email"],
497
+ :where(.onboarding-container) select,
498
+ :where(.onboarding-container) textarea {
499
+ width: 100%;
500
+ padding: var(--onboarding-space-md);
501
+ border: 2px solid var(--onboarding-border);
502
+ border-radius: 0.5rem;
503
+ font-family: inherit;
504
+ font-size: var(--onboarding-text-base);
505
+ background: var(--onboarding-background);
506
+ color: var(--onboarding-text);
507
+ transition: var(--onboarding-transition);
508
+ }
509
+
510
+ :where(.onboarding-container) input[type="text"]:focus,
511
+ :where(.onboarding-container) input[type="email"]:focus,
512
+ :where(.onboarding-container) select:focus,
513
+ :where(.onboarding-container) textarea:focus {
514
+ outline: none;
515
+ border-color: var(--onboarding-border-focus);
516
+ box-shadow: var(--onboarding-focus-ring);
517
+ }
518
+
519
+ :where(.onboarding-container) input[type="checkbox"] {
520
+ width: 1.25rem;
521
+ height: 1.25rem;
522
+ margin-right: var(--onboarding-space-sm);
523
+ accent-color: var(--onboarding-primary);
524
+ }
525
+
526
+ .onboarding-checkbox-label {
527
+ font-weight: 500;
528
+ color: var(--onboarding-text);
529
+ cursor: pointer;
530
+ }
531
+
532
+ .onboarding-help-text {
533
+ font-size: var(--onboarding-text-sm);
534
+ color: var(--onboarding-text-muted);
535
+ margin-top: var(--onboarding-space-xs);
536
+ display: block;
537
+ }
538
+
539
+ /* ======================
540
+ First Action Step
541
+ ====================== */
542
+ .first-action-step {
543
+ text-align: left;
544
+ }
545
+
546
+ .action-choices {
547
+ display: grid;
548
+ gap: var(--onboarding-space-lg);
549
+ margin-bottom: var(--onboarding-space-xl);
550
+ }
551
+
552
+ .action-choice {
553
+ display: block;
554
+ cursor: pointer;
555
+ background: var(--onboarding-surface);
556
+ border: 2px solid var(--onboarding-border);
557
+ border-radius: 0.75rem;
558
+ padding: var(--onboarding-space-xl);
559
+ transition: var(--onboarding-transition);
560
+ position: relative;
561
+ }
562
+
563
+ .action-choice:hover {
564
+ border-color: var(--onboarding-primary);
565
+ box-shadow: var(--onboarding-shadow-md);
566
+ transform: translateY(-2px);
567
+ }
568
+
569
+ .action-choice:has(input:checked) {
570
+ border-color: var(--onboarding-primary);
571
+ background: rgba(99, 102, 241, 0.05);
572
+ box-shadow: var(--onboarding-shadow-md);
573
+ }
574
+
575
+ .action-radio {
576
+ position: absolute;
577
+ top: var(--onboarding-space-lg);
578
+ right: var(--onboarding-space-lg);
579
+ width: 1.25rem;
580
+ height: 1.25rem;
581
+ accent-color: var(--onboarding-primary);
582
+ }
583
+
584
+ .choice-content {
585
+ display: grid;
586
+ gap: var(--onboarding-space-md);
587
+ text-align: center;
588
+ }
589
+
590
+ .choice-icon {
591
+ font-size: 2.5rem;
592
+ justify-self: center;
593
+ }
594
+
595
+ .choice-title {
596
+ font-size: var(--onboarding-text-xl);
597
+ font-weight: 600;
598
+ color: var(--onboarding-text);
599
+ margin: 0;
600
+ }
601
+
602
+ .choice-description {
603
+ color: var(--onboarding-text-muted);
604
+ margin: 0;
605
+ line-height: 1.5;
606
+ }
607
+
608
+ .helpful-tip {
609
+ background: linear-gradient(135deg, #fef3c7, #fde68a);
610
+ border: 1px solid #f59e0b;
611
+ border-radius: 0.75rem;
612
+ padding: var(--onboarding-space-lg);
613
+ margin-top: var(--onboarding-space-xl);
614
+ }
615
+
616
+ .helpful-tip h3 {
617
+ font-size: var(--onboarding-text-lg);
618
+ margin: 0 0 var(--onboarding-space-sm);
619
+ color: #92400e;
620
+ }
621
+
622
+ .helpful-tip p {
623
+ margin: 0;
624
+ color: #92400e;
625
+ }
626
+
627
+ /* ======================
628
+ Explore Step
629
+ ====================== */
630
+ .explore-step {
631
+ text-align: left;
632
+ }
633
+
634
+ .feature-showcase {
635
+ margin-bottom: var(--onboarding-space-xl);
636
+ }
637
+
638
+ .feature-grid {
639
+ display: grid;
640
+ gap: var(--onboarding-space-lg);
641
+ grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
642
+ }
643
+
644
+ .feature-card {
645
+ background: var(--onboarding-surface);
646
+ border: 1px solid var(--onboarding-border);
647
+ border-radius: 0.75rem;
648
+ padding: var(--onboarding-space-xl);
649
+ text-align: center;
650
+ transition: var(--onboarding-transition);
651
+ }
652
+
653
+ .feature-card:hover {
654
+ box-shadow: var(--onboarding-shadow-lg);
655
+ transform: translateY(-4px);
656
+ }
657
+
658
+ .feature-header {
659
+ margin-bottom: var(--onboarding-space-lg);
660
+ }
661
+
662
+ .feature-card .feature-icon {
663
+ font-size: 2.5rem;
664
+ margin-bottom: var(--onboarding-space-md);
665
+ display: block;
666
+ }
667
+
668
+ .feature-card .feature-title {
669
+ font-size: var(--onboarding-text-lg);
670
+ font-weight: 600;
671
+ color: var(--onboarding-text);
672
+ margin: 0;
673
+ }
674
+
675
+ .feature-card .feature-description {
676
+ color: var(--onboarding-text-muted);
677
+ line-height: 1.5;
678
+ margin-bottom: var(--onboarding-space-lg);
679
+ }
680
+
681
+ .feature-button {
682
+ background: var(--onboarding-primary);
683
+ color: white;
684
+ border: none;
685
+ padding: var(--onboarding-space-sm) var(--onboarding-space-lg);
686
+ border-radius: 0.5rem;
687
+ font-weight: 500;
688
+ cursor: pointer;
689
+ transition: var(--onboarding-transition);
690
+ }
691
+
692
+ .feature-button:hover {
693
+ background: var(--onboarding-primary-hover);
694
+ transform: translateY(-1px);
695
+ }
696
+
697
+ .next-steps {
698
+ background: var(--onboarding-surface);
699
+ border-radius: 0.75rem;
700
+ padding: var(--onboarding-space-xl);
701
+ text-align: center;
702
+ }
703
+
704
+ .next-steps h2 {
705
+ font-size: var(--onboarding-text-2xl);
706
+ margin-bottom: var(--onboarding-space-md);
707
+ color: var(--onboarding-text);
708
+ }
709
+
710
+ .next-steps-description {
711
+ color: var(--onboarding-text-muted);
712
+ margin-bottom: var(--onboarding-space-xl);
713
+ font-size: var(--onboarding-text-lg);
714
+ }
715
+
716
+ /* ======================
717
+ Action Buttons
718
+ ====================== */
719
+ .onboarding-form {
720
+ margin: 0;
721
+ }
722
+
723
+ .onboarding-actions {
724
+ display: flex;
725
+ gap: var(--onboarding-space-md);
726
+ justify-content: center;
727
+ align-items: center;
728
+ flex-wrap: wrap;
729
+ }
730
+
731
+ .primary-action {
732
+ background: var(--onboarding-primary);
733
+ color: white;
734
+ border: 2px solid var(--onboarding-primary);
735
+ padding: var(--onboarding-space-md) var(--onboarding-space-xl);
736
+ border-radius: 0.75rem;
737
+ font-weight: 600;
738
+ font-size: var(--onboarding-text-base);
739
+ cursor: pointer;
740
+ transition: var(--onboarding-transition);
741
+ text-decoration: none;
742
+ display: inline-block;
743
+ text-align: center;
744
+ min-width: 9rem;
745
+ }
746
+
747
+ .primary-action:hover:not(:disabled) {
748
+ background: var(--onboarding-primary-hover);
749
+ border-color: var(--onboarding-primary-hover);
750
+ transform: translateY(-2px);
751
+ box-shadow: var(--onboarding-shadow-lg);
752
+ }
753
+
754
+ .primary-action:disabled {
755
+ opacity: 0.5;
756
+ cursor: not-allowed;
757
+ transform: none;
758
+ }
759
+
760
+ .secondary-action {
761
+ background: transparent;
762
+ color: var(--onboarding-secondary);
763
+ border: 2px solid var(--onboarding-border);
764
+ padding: var(--onboarding-space-md) var(--onboarding-space-xl);
765
+ border-radius: 0.75rem;
766
+ font-weight: 500;
767
+ font-size: var(--onboarding-text-base);
768
+ cursor: pointer;
769
+ transition: var(--onboarding-transition);
770
+ text-decoration: none;
771
+ display: inline-block;
772
+ text-align: center;
773
+ min-width: 9rem;
774
+ }
775
+
776
+ .secondary-action:hover {
777
+ background: var(--onboarding-surface);
778
+ border-color: var(--onboarding-secondary);
779
+ transform: translateY(-1px);
780
+ }
781
+
782
+ .skip-options {
783
+ display: flex;
784
+ gap: var(--onboarding-space-md);
785
+ align-items: center;
786
+ }
787
+
788
+ .skip-action {
789
+ background: transparent;
790
+ color: var(--onboarding-text-muted);
791
+ border: 1px solid var(--onboarding-border);
792
+ padding: var(--onboarding-space-sm) var(--onboarding-space-md);
793
+ font-size: var(--onboarding-text-sm);
794
+ }
795
+
796
+ .skip-all-action {
797
+ background: none;
798
+ border: none;
799
+ color: var(--onboarding-text-light);
800
+ text-decoration: underline;
801
+ font-size: var(--onboarding-text-xs);
802
+ padding: var(--onboarding-space-xs);
803
+ }
804
+
805
+ .skip-action:hover {
806
+ background: var(--onboarding-surface);
807
+ color: var(--onboarding-text);
808
+ }
809
+
810
+ .skip-all-action:hover {
811
+ color: var(--onboarding-danger);
812
+ }
813
+
814
+ /* ======================
815
+ Step Navigation
816
+ ====================== */
817
+ .step-navigation {
818
+ max-width: 50rem;
819
+ margin: 0 auto;
820
+ }
821
+
822
+ .navigation-buttons {
823
+ display: flex;
824
+ justify-content: space-between;
825
+ align-items: center;
826
+ gap: var(--onboarding-space-md);
827
+ }
828
+
829
+ .navigation-previous {
830
+ min-width: 8rem;
831
+ }
832
+
833
+ .navigation-center {
834
+ flex: 1;
835
+ text-align: center;
836
+ }
837
+
838
+ .navigation-help {
839
+ min-width: 8rem;
840
+ text-align: right;
841
+ }
842
+
843
+ .navigation-spacer {
844
+ min-width: 8rem;
845
+ }
846
+
847
+ .help-action {
848
+ background: var(--onboarding-surface);
849
+ border: 1px solid var(--onboarding-border);
850
+ color: var(--onboarding-text-muted);
851
+ padding: var(--onboarding-space-sm) var(--onboarding-space-md);
852
+ border-radius: 0.5rem;
853
+ cursor: pointer;
854
+ display: flex;
855
+ align-items: center;
856
+ gap: var(--onboarding-space-xs);
857
+ transition: var(--onboarding-transition);
858
+ font-size: var(--onboarding-text-sm);
859
+ }
860
+
861
+ .help-action:hover {
862
+ background: var(--onboarding-border);
863
+ color: var(--onboarding-text);
864
+ }
865
+
866
+ .onboarding-help-icon {
867
+ width: 1.25rem;
868
+ height: 1.25rem;
869
+ border-radius: 50%;
870
+ background: var(--onboarding-primary);
871
+ color: white;
872
+ display: flex;
873
+ align-items: center;
874
+ justify-content: center;
875
+ font-size: var(--onboarding-text-xs);
876
+ font-weight: 600;
877
+ }
878
+
879
+ .help-tooltip {
880
+ position: absolute;
881
+ bottom: 100%;
882
+ right: 0;
883
+ background: var(--onboarding-background);
884
+ border: 1px solid var(--onboarding-border);
885
+ border-radius: 0.75rem;
886
+ padding: var(--onboarding-space-lg);
887
+ box-shadow: var(--onboarding-shadow-lg);
888
+ max-width: 20rem;
889
+ z-index: 1000;
890
+ margin-bottom: var(--onboarding-space-sm);
891
+ }
892
+
893
+ .help-tooltip::after {
894
+ content: '';
895
+ position: absolute;
896
+ top: 100%;
897
+ right: var(--onboarding-space-lg);
898
+ width: 0;
899
+ height: 0;
900
+ border-left: 0.5rem solid transparent;
901
+ border-right: 0.5rem solid transparent;
902
+ border-top: 0.5rem solid var(--onboarding-background);
903
+ }
904
+
905
+ .step-tooltip {
906
+ position: absolute;
907
+ background: white;
908
+ border: 1px solid #e5e7eb;
909
+ border-radius: 0.5rem;
910
+ padding: 0.75rem;
911
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
912
+ z-index: 1000;
913
+ max-width: 12rem;
914
+ font-size: 0.875rem;
915
+ pointer-events: none;
916
+ }
917
+
918
+ .tooltip-content h4 {
919
+ margin: 0 0 var(--onboarding-space-sm);
920
+ font-size: var(--onboarding-text-base);
921
+ color: var(--onboarding-text);
922
+ }
923
+
924
+ .tooltip-content p {
925
+ margin: 0 0 var(--onboarding-space-md);
926
+ font-size: var(--onboarding-text-sm);
927
+ color: var(--onboarding-text-muted);
928
+ line-height: 1.5;
929
+ }
930
+
931
+ .close-help {
932
+ background: var(--onboarding-primary);
933
+ color: white;
934
+ border: none;
935
+ padding: var(--onboarding-space-xs) var(--onboarding-space-md);
936
+ border-radius: 0.375rem;
937
+ font-size: var(--onboarding-text-sm);
938
+ cursor: pointer;
939
+ }
940
+
941
+ /* ======================
942
+ Generic Step
943
+ ====================== */
944
+ .generic-step,
945
+ .step-placeholder {
946
+ display: flex;
947
+ flex-direction: column;
948
+ flex-grow: 1;
949
+ text-align: center;
950
+ }
951
+
952
+ .step-error {
953
+ background: #fef2f2;
954
+ border: 1px solid #fecaca;
955
+ border-radius: 0.75rem;
956
+ padding: var(--onboarding-space-xl);
957
+ color: #dc2626;
958
+ }
959
+
960
+ .step-debug {
961
+ background: var(--onboarding-surface);
962
+ border: 1px solid var(--onboarding-border);
963
+ border-radius: 0.5rem;
964
+ padding: var(--onboarding-space-lg);
965
+ margin: var(--onboarding-space-lg) 0;
966
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
967
+ font-size: var(--onboarding-text-sm);
968
+ text-align: left;
969
+ color: var(--onboarding-text);
970
+ }
971
+
972
+ /* ======================
973
+ Responsive Design
974
+ ====================== */
975
+ @media screen and (max-width: 48em) {
976
+ .onboarding-content {
977
+ padding: var(--onboarding-space-lg) var(--onboarding-space-md);
978
+ }
979
+
980
+ .step-title,
981
+ .step-heading {
982
+ font-size: var(--onboarding-text-2xl);
983
+ }
984
+
985
+ .progress-steps {
986
+ gap: var(--onboarding-space-xs);
987
+ }
988
+
989
+ .step-label {
990
+ font-size: 0.625rem;
991
+ }
992
+
993
+ .step-marker {
994
+ width: 2rem;
995
+ height: 2rem;
996
+ font-size: var(--onboarding-text-xs);
997
+ }
998
+
999
+ .onboarding-actions {
1000
+ flex-direction: column;
1001
+ width: 100%;
1002
+ }
1003
+
1004
+ .primary-action,
1005
+ .secondary-action {
1006
+ width: 100%;
1007
+ min-width: auto;
1008
+ }
1009
+
1010
+ .navigation-buttons {
1011
+ flex-direction: column;
1012
+ gap: var(--onboarding-space-md);
1013
+ }
1014
+
1015
+ .navigation-center {
1016
+ order: -1;
1017
+ }
1018
+
1019
+ .feature-grid {
1020
+ grid-template-columns: 1fr;
1021
+ }
1022
+
1023
+ .action-choices {
1024
+ gap: var(--onboarding-space-md);
1025
+ }
1026
+
1027
+ .help-tooltip {
1028
+ position: fixed;
1029
+ top: 50%;
1030
+ left: 50%;
1031
+ transform: translate(-50%, -50%);
1032
+ right: auto;
1033
+ bottom: auto;
1034
+ max-width: calc(100vw - 2rem);
1035
+ margin: 0;
1036
+ }
1037
+
1038
+ .help-tooltip::after {
1039
+ display: none;
1040
+ }
1041
+ }
1042
+
1043
+ @media screen and (max-width: 30em) {
1044
+ .onboarding-header,
1045
+ .onboarding-footer {
1046
+ padding: var(--onboarding-space-md);
1047
+ }
1048
+
1049
+ .profile-settings,
1050
+ .welcome-features,
1051
+ .next-steps {
1052
+ padding: var(--onboarding-space-lg);
1053
+ }
1054
+
1055
+ .step-content {
1056
+ padding: 0;
1057
+ }
1058
+ }
1059
+
1060
+ /* ======================
1061
+ Print Styles
1062
+ ====================== */
1063
+ @media print {
1064
+ .onboarding-header,
1065
+ .onboarding-footer,
1066
+ .onboarding-actions,
1067
+ .help-action {
1068
+ display: none;
1069
+ }
1070
+
1071
+ .onboarding-container {
1072
+ min-height: auto;
1073
+ }
1074
+
1075
+ .onboarding-content {
1076
+ padding: 1rem;
1077
+ }
1078
+
1079
+ .step-content {
1080
+ max-width: 100%;
1081
+ }
1082
+ }
1083
+
1084
+ /* ======================
1085
+ Focus Management
1086
+ ====================== */
1087
+ .onboarding-container :focus-visible {
1088
+ outline: 2px solid var(--onboarding-primary);
1089
+ outline-offset: 2px;
1090
+ }
1091
+
1092
+ /* ======================
1093
+ Animation Classes
1094
+ ====================== */
1095
+ @keyframes onboarding-fadeInUp {
1096
+ from {
1097
+ opacity: 0;
1098
+ transform: translateY(1rem);
1099
+ }
1100
+ to {
1101
+ opacity: 1;
1102
+ transform: translateY(0);
1103
+ }
1104
+ }
1105
+
1106
+ .onboarding-container[data-step-changed] .step-content {
1107
+ animation: onboarding-fadeInUp 0.3s ease-out;
1108
+ }
1109
+
1110
+ /* ======================
1111
+ Dark Mode Support
1112
+ ====================== */
1113
+ @media (prefers-color-scheme: dark) {
1114
+ :root {
1115
+ --onboarding-background: #111827;
1116
+ --onboarding-surface: #1f2937;
1117
+ --onboarding-surface-elevated: #374151;
1118
+ --onboarding-text: #f9fafb;
1119
+ --onboarding-text-muted: #d1d5db;
1120
+ --onboarding-text-light: #9ca3af;
1121
+ --onboarding-border: #374151;
1122
+ }
1123
+
1124
+ .step-debug {
1125
+ background: var(--onboarding-surface-elevated) !important;
1126
+ color: var(--onboarding-text-muted);
1127
+ }
1128
+
1129
+ .helpful-tip {
1130
+ background: linear-gradient(135deg, #451a03, #92400e);
1131
+ border-color: #d97706;
1132
+ color: #fbbf24;
1133
+ }
1134
+
1135
+ .helpful-tip h3,
1136
+ .helpful-tip p {
1137
+ color: #fbbf24;
1138
+ }
1139
+
1140
+ .step-error {
1141
+ background: #450a0a;
1142
+ border-color: #dc2626;
1143
+ color: #fca5a5;
1144
+ }
1145
+ }