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,468 @@
1
+ /* ======================
2
+ Tooltip System Styles
3
+ ====================== */
4
+
5
+ /* Tooltip container - relative positioning for absolute tooltips */
6
+ .tooltip-container {
7
+ position: relative;
8
+ display: inline-block;
9
+ }
10
+
11
+ /* Main tooltip element.
12
+ *
13
+ * tooltip_controller.js appends the tooltip to <body> and computes top/left in
14
+ * pixels with viewport collision detection, so this block must NOT set
15
+ * top/left/bottom/right or a centring transform - those would fight the computed
16
+ * position. Appearance only; the controller sets opacity/transform/transition
17
+ * inline because animateTooltipIn/Out drive them imperatively.
18
+ *
19
+ * The onboarding-top / -bottom / -left / -right classes the controller adds are
20
+ * kept for the arrow direction and for host-app styling hooks. They intentionally
21
+ * carry no positioning of their own. */
22
+ .onboarding-tooltip {
23
+ position: absolute;
24
+ z-index: 10000;
25
+ max-width: 20rem;
26
+ background: var(--onboarding-text);
27
+ color: var(--onboarding-background);
28
+ border-radius: 0.75rem;
29
+ font-size: var(--onboarding-text-sm);
30
+ line-height: 1.4;
31
+ box-shadow: var(--onboarding-shadow-lg);
32
+ pointer-events: auto;
33
+ }
34
+
35
+ .onboarding-tooltip .tooltip-inner {
36
+ position: relative;
37
+ padding: var(--onboarding-space-md);
38
+ }
39
+
40
+ /* Reserve room on the right for the absolutely-positioned dismiss button so
41
+ multi-line content doesn't wrap underneath it. The button sits at
42
+ right: 0.25rem and is 1.5rem wide, so pad the inner past its left edge. */
43
+ .onboarding-tooltip .tooltip-inner:has(.tooltip-dismiss) {
44
+ padding-right: calc(var(--onboarding-space-md) + 1.5rem);
45
+ }
46
+
47
+ /* Arrow element. styleArrowForPosition() sets the offsets and the border width
48
+ and style, but deliberately not the border colour - an inline `border-top`
49
+ shorthand would always beat a stylesheet's `border-top-color`, which is what
50
+ previously pinned the arrow to a hardcoded #1f2937 and left it mismatched in
51
+ dark mode. The colour is supplied here so it tracks the tooltip background. */
52
+ .onboarding-tooltip .tooltip-arrow {
53
+ position: absolute;
54
+ width: 0;
55
+ height: 0;
56
+ }
57
+
58
+ .onboarding-tooltip.onboarding-top .tooltip-arrow { border-top-color: var(--onboarding-text); }
59
+ .onboarding-tooltip.onboarding-bottom .tooltip-arrow { border-bottom-color: var(--onboarding-text); }
60
+ .onboarding-tooltip.onboarding-left .tooltip-arrow { border-left-color: var(--onboarding-text); }
61
+ .onboarding-tooltip.onboarding-right .tooltip-arrow { border-right-color: var(--onboarding-text); }
62
+
63
+ .onboarding-tooltip .tooltip-dismiss {
64
+ position: absolute;
65
+ top: 0.25rem;
66
+ right: 0.25rem;
67
+ width: 1.5rem;
68
+ height: 1.5rem;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ padding: 0.25rem;
73
+ background: none;
74
+ border: none;
75
+ color: var(--onboarding-text-light);
76
+ font-size: var(--onboarding-text-xl);
77
+ line-height: 1;
78
+ cursor: pointer;
79
+ }
80
+
81
+ .onboarding-tooltip .tooltip-dismiss:hover {
82
+ color: var(--onboarding-background);
83
+ }
84
+
85
+ /* Tooltip content structure */
86
+ .tooltip-header {
87
+ display: flex;
88
+ justify-content: space-between;
89
+ align-items: flex-start;
90
+ margin-bottom: var(--onboarding-space-sm);
91
+ gap: var(--onboarding-space-sm);
92
+ }
93
+
94
+ .tooltip-title {
95
+ font-weight: 600;
96
+ font-size: var(--onboarding-text-base);
97
+ color: var(--onboarding-background);
98
+ margin: 0;
99
+ line-height: 1.3;
100
+ }
101
+
102
+ .tooltip-close {
103
+ background: none;
104
+ border: none;
105
+ color: var(--onboarding-background);
106
+ cursor: pointer;
107
+ padding: 0;
108
+ font-size: var(--onboarding-text-lg);
109
+ line-height: 1;
110
+ opacity: 0.7;
111
+ transition: opacity 0.2s ease;
112
+ flex-shrink: 0;
113
+ width: 1.5rem;
114
+ height: 1.5rem;
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ }
119
+
120
+ .tooltip-close:hover {
121
+ opacity: 1;
122
+ }
123
+
124
+ .tooltip-body {
125
+ color: var(--onboarding-background);
126
+ margin: 0;
127
+ line-height: 1.4;
128
+ }
129
+
130
+ .tooltip-body p {
131
+ margin: 0 0 var(--onboarding-space-sm);
132
+ }
133
+
134
+ .tooltip-body p:last-child {
135
+ margin-bottom: 0;
136
+ }
137
+
138
+ /* Tooltip trigger elements */
139
+ .tooltip-trigger {
140
+ cursor: help;
141
+ position: relative;
142
+ }
143
+
144
+ .tooltip-trigger.has-tooltip {
145
+ text-decoration: underline;
146
+ text-decoration-style: dotted;
147
+ text-decoration-color: var(--onboarding-primary);
148
+ text-underline-offset: 0.2em;
149
+ }
150
+
151
+ /* Interactive tooltips */
152
+ .onboarding-tooltip.onboarding-interactive {
153
+ pointer-events: auto;
154
+ }
155
+
156
+ .onboarding-tooltip.onboarding-interactive:hover {
157
+ opacity: 1;
158
+ visibility: visible;
159
+ }
160
+
161
+ /* Tooltip with actions */
162
+ .tooltip-actions {
163
+ margin-top: var(--onboarding-space-md);
164
+ padding-top: var(--onboarding-space-md);
165
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
166
+ display: flex;
167
+ gap: var(--onboarding-space-sm);
168
+ justify-content: flex-end;
169
+ }
170
+
171
+ .tooltip-action {
172
+ background: var(--onboarding-primary);
173
+ color: white;
174
+ border: none;
175
+ padding: var(--onboarding-space-xs) var(--onboarding-space-sm);
176
+ border-radius: 0.375rem;
177
+ font-size: var(--onboarding-text-xs);
178
+ font-weight: 500;
179
+ cursor: pointer;
180
+ transition: var(--onboarding-transition);
181
+ }
182
+
183
+ .tooltip-action:hover {
184
+ background: var(--onboarding-primary-hover);
185
+ }
186
+
187
+ .tooltip-action.onboarding-secondary {
188
+ background: rgba(255, 255, 255, 0.2);
189
+ color: var(--onboarding-background);
190
+ }
191
+
192
+ .tooltip-action.onboarding-secondary:hover {
193
+ background: rgba(255, 255, 255, 0.3);
194
+ }
195
+
196
+ /* Feature tooltips (specific to onboarding features) */
197
+ .feature-tooltip {
198
+ background: linear-gradient(135deg, var(--onboarding-primary), var(--onboarding-success));
199
+ color: white;
200
+ padding: var(--onboarding-space-lg);
201
+ border-radius: 1rem;
202
+ max-width: 24rem;
203
+ font-size: var(--onboarding-text-base);
204
+ }
205
+
206
+ .feature-tooltip .tooltip-title {
207
+ color: white;
208
+ font-size: var(--onboarding-text-lg);
209
+ margin-bottom: var(--onboarding-space-sm);
210
+ }
211
+
212
+ .feature-tooltip .tooltip-body {
213
+ color: rgba(255, 255, 255, 0.9);
214
+ }
215
+
216
+ /* Arrow. These rules previously set only a border colour, with no `content`,
217
+ `position` or `border-style`, so the pseudo-element was never generated and no
218
+ arrow ever appeared. onboarding_controller.js positions the tooltip with
219
+ `position: fixed` and adds onboarding-top or onboarding-bottom, so the base is
220
+ declared here and each direction supplies its own offset and colour.
221
+
222
+ The body is a 135deg gradient from --onboarding-primary to
223
+ --onboarding-success, so a border-triangle cannot reproduce it exactly; each
224
+ arrow takes the colour of the gradient nearest the edge it sits on. */
225
+ .feature-tooltip::before {
226
+ content: '';
227
+ position: absolute;
228
+ width: 0;
229
+ height: 0;
230
+ border: 0.5rem solid transparent;
231
+ }
232
+
233
+ /* Tooltip below its target - arrow points up, off the top edge. */
234
+ .feature-tooltip.onboarding-bottom::before {
235
+ bottom: 100%;
236
+ left: 50%;
237
+ transform: translateX(-50%);
238
+ border-top-width: 0;
239
+ border-bottom-color: var(--onboarding-primary);
240
+ }
241
+
242
+ /* Tooltip above its target - arrow points down, off the bottom edge. */
243
+ .feature-tooltip.onboarding-top::before {
244
+ top: 100%;
245
+ left: 50%;
246
+ transform: translateX(-50%);
247
+ border-bottom-width: 0;
248
+ border-top-color: var(--onboarding-success);
249
+ }
250
+
251
+ /* Warning tooltips */
252
+ .warning-tooltip {
253
+ background: var(--onboarding-warning);
254
+ color: white;
255
+ }
256
+
257
+ .warning-tooltip::before {
258
+ border-top-color: var(--onboarding-warning);
259
+ }
260
+
261
+ .warning-tooltip.onboarding-top::before {
262
+ border-bottom-color: var(--onboarding-warning);
263
+ }
264
+
265
+ .warning-tooltip.onboarding-left::before {
266
+ border-left-color: var(--onboarding-warning);
267
+ }
268
+
269
+ .warning-tooltip.onboarding-right::before {
270
+ border-right-color: var(--onboarding-warning);
271
+ }
272
+
273
+ /* Success tooltips */
274
+ .success-tooltip {
275
+ background: var(--onboarding-success);
276
+ color: white;
277
+ }
278
+
279
+ .success-tooltip::before {
280
+ border-top-color: var(--onboarding-success);
281
+ }
282
+
283
+ .success-tooltip.onboarding-top::before {
284
+ border-bottom-color: var(--onboarding-success);
285
+ }
286
+
287
+ .success-tooltip.onboarding-left::before {
288
+ border-left-color: var(--onboarding-success);
289
+ }
290
+
291
+ .success-tooltip.onboarding-right::before {
292
+ border-right-color: var(--onboarding-success);
293
+ }
294
+
295
+ /* Tooltip progress indicator */
296
+ .tooltip-progress {
297
+ margin-top: var(--onboarding-space-md);
298
+ padding-top: var(--onboarding-space-md);
299
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
300
+ }
301
+
302
+ .tooltip-progress-text {
303
+ font-size: var(--onboarding-text-xs);
304
+ color: rgba(255, 255, 255, 0.8);
305
+ text-align: center;
306
+ margin-bottom: var(--onboarding-space-xs);
307
+ }
308
+
309
+ .tooltip-progress-bar {
310
+ width: 100%;
311
+ height: 0.25rem;
312
+ background: rgba(255, 255, 255, 0.2);
313
+ border-radius: 0.125rem;
314
+ overflow: hidden;
315
+ }
316
+
317
+ .tooltip-progress-fill {
318
+ height: 100%;
319
+ background: rgba(255, 255, 255, 0.8);
320
+ border-radius: 0.125rem;
321
+ transition: width 0.3s ease;
322
+ }
323
+
324
+ /* Responsive tooltip adjustments */
325
+ @media screen and (max-width: 48em) {
326
+ .onboarding-tooltip {
327
+ max-width: calc(100vw - 2rem);
328
+ min-width: auto;
329
+ }
330
+
331
+ /* On mobile, show tooltips as overlays */
332
+ .onboarding-tooltip.mobile-overlay {
333
+ position: fixed;
334
+ top: 50%;
335
+ left: 50%;
336
+ right: auto;
337
+ bottom: auto;
338
+ transform: translate(-50%, -50%);
339
+ z-index: 10001;
340
+ }
341
+
342
+ .onboarding-tooltip.mobile-overlay::before {
343
+ display: none;
344
+ }
345
+
346
+ /* Mobile overlay backdrop */
347
+ .tooltip-backdrop {
348
+ position: fixed;
349
+ top: 0;
350
+ left: 0;
351
+ width: 100%;
352
+ height: 100%;
353
+ background: rgba(0, 0, 0, 0.5);
354
+ z-index: 10000;
355
+ opacity: 0;
356
+ visibility: hidden;
357
+ transition: all 0.2s ease-in-out;
358
+ }
359
+
360
+ .tooltip-backdrop.onboarding-show {
361
+ opacity: 1;
362
+ visibility: visible;
363
+ }
364
+ }
365
+
366
+ /* High contrast mode support */
367
+ @media (prefers-contrast: high) {
368
+ .onboarding-tooltip {
369
+ border: 2px solid var(--onboarding-text);
370
+ }
371
+
372
+ .tooltip-trigger.has-tooltip {
373
+ text-decoration-color: currentColor;
374
+ text-decoration-thickness: 2px;
375
+ }
376
+ }
377
+
378
+ /* Reduced motion support */
379
+ @media (prefers-reduced-motion: reduce) {
380
+ .onboarding-tooltip {
381
+ transition: opacity 0.1s ease;
382
+ transform: none;
383
+ }
384
+
385
+ .onboarding-tooltip.onboarding-show {
386
+ transform: none;
387
+ }
388
+
389
+ .onboarding-tooltip.onboarding-bottom {
390
+ transform: translateX(-50%);
391
+ }
392
+
393
+ .onboarding-tooltip.onboarding-top {
394
+ transform: translateX(-50%);
395
+ }
396
+
397
+ .onboarding-tooltip.onboarding-left {
398
+ transform: translateY(-50%);
399
+ }
400
+
401
+ .onboarding-tooltip.onboarding-right {
402
+ transform: translateY(-50%);
403
+ }
404
+ }
405
+
406
+ /* Dark mode adjustments */
407
+ @media (prefers-color-scheme: dark) {
408
+ .onboarding-tooltip {
409
+ background: var(--onboarding-surface-elevated);
410
+ color: var(--onboarding-text);
411
+ border: 1px solid var(--onboarding-border);
412
+ }
413
+
414
+ /* Keep the arrow the same colour as the tooltip body in dark mode. These
415
+ target .tooltip-arrow, the element the controller actually renders - the
416
+ ::before pseudo-element these rules used to target was never created. */
417
+ .onboarding-tooltip.onboarding-top .tooltip-arrow {
418
+ border-top-color: var(--onboarding-surface-elevated);
419
+ }
420
+
421
+ .onboarding-tooltip.onboarding-bottom .tooltip-arrow {
422
+ border-bottom-color: var(--onboarding-surface-elevated);
423
+ }
424
+
425
+ .onboarding-tooltip.onboarding-left .tooltip-arrow {
426
+ border-left-color: var(--onboarding-surface-elevated);
427
+ }
428
+
429
+ .onboarding-tooltip.onboarding-right .tooltip-arrow {
430
+ border-right-color: var(--onboarding-surface-elevated);
431
+ }
432
+
433
+ .tooltip-title {
434
+ color: var(--onboarding-text);
435
+ }
436
+
437
+ .tooltip-body {
438
+ color: var(--onboarding-text-muted);
439
+ }
440
+
441
+ .tooltip-close {
442
+ color: var(--onboarding-text-muted);
443
+ }
444
+
445
+ .tooltip-actions {
446
+ border-top-color: var(--onboarding-border);
447
+ }
448
+
449
+ .tooltip-action.onboarding-secondary {
450
+ background: var(--onboarding-surface);
451
+ color: var(--onboarding-text);
452
+ }
453
+
454
+ .tooltip-action.onboarding-secondary:hover {
455
+ background: var(--onboarding-border);
456
+ }
457
+ }
458
+
459
+ /* Print styles */
460
+ @media print {
461
+ .onboarding-tooltip {
462
+ display: none;
463
+ }
464
+
465
+ .tooltip-trigger.has-tooltip {
466
+ text-decoration: none;
467
+ }
468
+ }