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,37 @@
1
+ <div class="welcome-step">
2
+ <h1 class="step-heading">
3
+ <%= RailsOnboarding.configuration.welcome_heading %>
4
+ </h1>
5
+ <h2 class="step-subheading">
6
+ <%= RailsOnboarding.configuration.welcome_subheading %>
7
+ </h2>
8
+
9
+ <div class="welcome-features">
10
+ <h3>What you'll learn:</h3>
11
+ <ul class="feature-list" role="list">
12
+ <% RailsOnboarding.configuration.welcome_features.each do |feature| %>
13
+ <li class="feature-item">
14
+ <span class="feature-icon"><%= feature[:icon] %></span>
15
+ <span class="feature-text"><%= feature[:text] %></span>
16
+ </li>
17
+ <% end %>
18
+ </ul>
19
+ </div>
20
+
21
+ <div class="time-estimate">
22
+ <p class="estimate-text">
23
+ <strong>Estimated time:</strong> About 3-5 minutes
24
+ </p>
25
+ </div>
26
+
27
+ <div class="onboarding-actions">
28
+ <%= form_with url: rails_onboarding.next_onboarding_path, method: :post, local: true, class: "onboarding-form" do |form| %>
29
+ <%= form.submit "Let's Get Started! 🎉", class: "primary-action" %>
30
+ <% end %>
31
+ </div>
32
+
33
+ <div class="onboarding-actions">
34
+ <%= render 'step_navigation' %>
35
+ </div>
36
+ </div>
37
+ <%= render 'custom_footer' %>
@@ -0,0 +1,109 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
5
+ <style>
6
+ body {
7
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
8
+ line-height: 1.6;
9
+ color: #333;
10
+ max-width: 600px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ }
14
+ .header {
15
+ text-align: center;
16
+ padding: 20px 0;
17
+ border-bottom: 2px solid #f0f0f0;
18
+ }
19
+ .celebration {
20
+ text-align: center;
21
+ font-size: 48px;
22
+ margin: 20px 0;
23
+ }
24
+ .content {
25
+ padding: 30px 0;
26
+ }
27
+ .achievement-badge {
28
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
29
+ color: white;
30
+ padding: 20px;
31
+ border-radius: 10px;
32
+ text-align: center;
33
+ margin: 20px 0;
34
+ }
35
+ .cta-button {
36
+ display: inline-block;
37
+ padding: 12px 24px;
38
+ background-color: #10B981;
39
+ color: white;
40
+ text-decoration: none;
41
+ border-radius: 6px;
42
+ margin: 20px 0;
43
+ }
44
+ .footer {
45
+ text-align: center;
46
+ padding: 20px 0;
47
+ border-top: 2px solid #f0f0f0;
48
+ color: #666;
49
+ font-size: 14px;
50
+ }
51
+ </style>
52
+ </head>
53
+ <body>
54
+ <div class="header">
55
+ <h1>🎊 <%= t('rails_onboarding.mailer.completion.heading', default: 'Congratulations!') %></h1>
56
+ </div>
57
+
58
+ <div class="celebration">
59
+ 🎉 ✨ 🚀
60
+ </div>
61
+
62
+ <div class="content">
63
+ <p><%= t('rails_onboarding.mailer.completion.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %></p>
64
+
65
+ <div class="achievement-badge">
66
+ <h2 style="margin: 0; color: white;">
67
+ <%= t('rails_onboarding.mailer.completion.badge_title', default: '✓ Onboarding Complete!') %>
68
+ </h2>
69
+ <p style="margin: 10px 0 0 0; color: white; opacity: 0.9;">
70
+ <%= t('rails_onboarding.mailer.completion.completed_at',
71
+ default: 'Completed on',
72
+ date: @completed_at&.strftime('%B %d, %Y') || Date.today.strftime('%B %d, %Y')) %>
73
+ </p>
74
+ </div>
75
+
76
+ <p>
77
+ <%= t('rails_onboarding.mailer.completion.intro',
78
+ default: "You've successfully completed your onboarding! You now have access to all features and can explore everything we have to offer.") %>
79
+ </p>
80
+
81
+ <p>
82
+ <%= t('rails_onboarding.mailer.completion.next_steps',
83
+ default: "Here's what you can do next:") %>
84
+ </p>
85
+
86
+ <ul>
87
+ <li><%= t('rails_onboarding.mailer.completion.step_1', default: 'Explore all available features') %></li>
88
+ <li><%= t('rails_onboarding.mailer.completion.step_2', default: 'Customize your settings and preferences') %></li>
89
+ <li><%= t('rails_onboarding.mailer.completion.step_3', default: 'Connect with other users') %></li>
90
+ <li><%= t('rails_onboarding.mailer.completion.step_4', default: 'Check out our help center for tips and tricks') %></li>
91
+ </ul>
92
+
93
+ <p>
94
+ <%= t('rails_onboarding.mailer.completion.encouragement',
95
+ default: "We're excited to have you as part of our community. If you need any help, our support team is always here for you!") %>
96
+ </p>
97
+
98
+ <div style="text-align: center;">
99
+ <a href="<%= Rails.application.routes.url_helpers.root_url rescue '#' %>" class="cta-button">
100
+ <%= t('rails_onboarding.mailer.completion.cta', default: 'Start Exploring') %>
101
+ </a>
102
+ </div>
103
+ </div>
104
+
105
+ <div class="footer">
106
+ <p><%= t('rails_onboarding.mailer.completion.footer', default: 'Happy exploring!') %></p>
107
+ </div>
108
+ </body>
109
+ </html>
@@ -0,0 +1,29 @@
1
+ <%= t('rails_onboarding.mailer.completion.heading', default: 'Congratulations!') %>
2
+
3
+ <%= t('rails_onboarding.mailer.completion.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %>
4
+
5
+ ✓ <%= t('rails_onboarding.mailer.completion.badge_title', default: 'Onboarding Complete!') %>
6
+ <%= t('rails_onboarding.mailer.completion.completed_at', default: 'Completed on', date: @completed_at&.strftime('%B %d, %Y') || Date.today.strftime('%B %d, %Y')) %>
7
+
8
+ <%= t('rails_onboarding.mailer.completion.intro',
9
+ default: "You've successfully completed your onboarding! You now have access to all features and can explore everything we have to offer.") %>
10
+
11
+ <% if @milestone_points && @milestone_points > 0 %>
12
+ 🏆 <%= t('rails_onboarding.mailer.completion.milestone', default: 'Achievement Unlocked!') %>
13
+ <%= t('rails_onboarding.mailer.completion.points_earned', default: "You've earned %{points} milestone points!", points: @milestone_points) %>
14
+
15
+ <% end %>
16
+ <%= t('rails_onboarding.mailer.completion.next_steps', default: "Here's what you can do next:") %>
17
+
18
+ - <%= t('rails_onboarding.mailer.completion.step_1', default: 'Explore all available features') %>
19
+ - <%= t('rails_onboarding.mailer.completion.step_2', default: 'Customize your settings and preferences') %>
20
+ - <%= t('rails_onboarding.mailer.completion.step_3', default: 'Connect with other users') %>
21
+ - <%= t('rails_onboarding.mailer.completion.step_4', default: 'Check out our help center for tips and tricks') %>
22
+
23
+ <%= t('rails_onboarding.mailer.completion.encouragement',
24
+ default: "We're excited to have you as part of our community. If you need any help, our support team is always here for you!") %>
25
+
26
+ <%= t('rails_onboarding.mailer.completion.cta', default: 'Start Exploring') %>: <%= Rails.application.routes.url_helpers.root_url rescue '#' %>
27
+
28
+ ---
29
+ <%= t('rails_onboarding.mailer.completion.footer', default: 'Happy exploring!') %>
@@ -0,0 +1,99 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
5
+ <style>
6
+ body {
7
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
8
+ line-height: 1.6;
9
+ color: #333;
10
+ max-width: 600px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ }
14
+ .header {
15
+ text-align: center;
16
+ padding: 20px 0;
17
+ border-bottom: 2px solid #f0f0f0;
18
+ }
19
+ .content {
20
+ padding: 30px 0;
21
+ }
22
+ .progress-bar {
23
+ background-color: #f0f0f0;
24
+ border-radius: 10px;
25
+ height: 20px;
26
+ margin: 20px 0;
27
+ overflow: hidden;
28
+ }
29
+ .progress-fill {
30
+ background-color: #10B981;
31
+ height: 100%;
32
+ transition: width 0.3s ease;
33
+ }
34
+ .cta-button {
35
+ display: inline-block;
36
+ padding: 12px 24px;
37
+ background-color: #4F46E5;
38
+ color: white;
39
+ text-decoration: none;
40
+ border-radius: 6px;
41
+ margin: 20px 0;
42
+ }
43
+ .footer {
44
+ text-align: center;
45
+ padding: 20px 0;
46
+ border-top: 2px solid #f0f0f0;
47
+ color: #666;
48
+ font-size: 14px;
49
+ }
50
+ </style>
51
+ </head>
52
+ <body>
53
+ <div class="header">
54
+ <h1>🚀 <%= t('rails_onboarding.mailer.reminder.heading', default: 'Complete Your Onboarding') %></h1>
55
+ </div>
56
+
57
+ <div class="content">
58
+ <p><%= t('rails_onboarding.mailer.reminder.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %></p>
59
+
60
+ <p>
61
+ <%= t('rails_onboarding.mailer.reminder.intro',
62
+ default: "We noticed you started your onboarding journey but haven't finished it yet. You're doing great so far!") %>
63
+ </p>
64
+
65
+ <p>
66
+ <strong><%= t('rails_onboarding.mailer.reminder.progress',
67
+ default: 'Your Progress',
68
+ progress: @progress) %>:</strong> <%= @progress %>%
69
+ </p>
70
+
71
+ <div class="onboarding-progress-bar">
72
+ <div class="onboarding-progress-fill" style="width: <%= @progress %>%;"></div>
73
+ </div>
74
+
75
+ <% if @current_step %>
76
+ <p>
77
+ <%= t('rails_onboarding.mailer.reminder.current_step',
78
+ default: 'You left off at',
79
+ step: @current_step.to_s.titleize) %>: <strong><%= @current_step.to_s.titleize %></strong>
80
+ </p>
81
+ <% end %>
82
+
83
+ <p>
84
+ <%= t('rails_onboarding.mailer.reminder.encouragement',
85
+ default: "You're almost there! Complete your onboarding to unlock all features and get the most out of your experience.") %>
86
+ </p>
87
+
88
+ <div style="text-align: center;">
89
+ <a href="<%= @onboarding_url %>" class="cta-button">
90
+ <%= t('rails_onboarding.mailer.reminder.cta', default: 'Continue Onboarding') %>
91
+ </a>
92
+ </div>
93
+ </div>
94
+
95
+ <div class="footer">
96
+ <p><%= t('rails_onboarding.mailer.reminder.footer', default: 'See you soon!') %></p>
97
+ </div>
98
+ </body>
99
+ </html>
@@ -0,0 +1,20 @@
1
+ <%= t('rails_onboarding.mailer.reminder.heading', default: 'Complete Your Onboarding') %>
2
+
3
+ <%= t('rails_onboarding.mailer.reminder.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %>
4
+
5
+ <%= t('rails_onboarding.mailer.reminder.intro',
6
+ default: "We noticed you started your onboarding journey but haven't finished it yet. You're doing great so far!") %>
7
+
8
+ <%= t('rails_onboarding.mailer.reminder.progress', default: 'Your Progress', progress: @progress) %>: <%= @progress %>%
9
+
10
+ <% if @current_step %>
11
+ <%= t('rails_onboarding.mailer.reminder.current_step', default: 'You left off at', step: @current_step.to_s.titleize) %>: <%= @current_step.to_s.titleize %>
12
+ <% end %>
13
+
14
+ <%= t('rails_onboarding.mailer.reminder.encouragement',
15
+ default: "You're almost there! Complete your onboarding to unlock all features and get the most out of your experience.") %>
16
+
17
+ <%= t('rails_onboarding.mailer.reminder.cta', default: 'Continue Onboarding') %>: <%= @onboarding_url %>
18
+
19
+ ---
20
+ <%= t('rails_onboarding.mailer.reminder.footer', default: 'See you soon!') %>
@@ -0,0 +1,105 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
5
+ <style>
6
+ body {
7
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
8
+ line-height: 1.6;
9
+ color: #333;
10
+ max-width: 600px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ }
14
+ .header {
15
+ text-align: center;
16
+ padding: 20px 0;
17
+ border-bottom: 2px solid #f0f0f0;
18
+ }
19
+ .content {
20
+ padding: 30px 0;
21
+ }
22
+ .progress-bar {
23
+ background-color: #f0f0f0;
24
+ border-radius: 10px;
25
+ height: 20px;
26
+ margin: 20px 0;
27
+ overflow: hidden;
28
+ }
29
+ .progress-fill {
30
+ background-color: #10B981;
31
+ height: 100%;
32
+ transition: width 0.3s ease;
33
+ }
34
+ .step-badge {
35
+ background-color: #EEF2FF;
36
+ color: #4F46E5;
37
+ padding: 10px 20px;
38
+ border-radius: 6px;
39
+ display: inline-block;
40
+ margin: 10px 0;
41
+ font-weight: 600;
42
+ }
43
+ .cta-button {
44
+ display: inline-block;
45
+ padding: 12px 24px;
46
+ background-color: #4F46E5;
47
+ color: white;
48
+ text-decoration: none;
49
+ border-radius: 6px;
50
+ margin: 20px 0;
51
+ }
52
+ .footer {
53
+ text-align: center;
54
+ padding: 20px 0;
55
+ border-top: 2px solid #f0f0f0;
56
+ color: #666;
57
+ font-size: 14px;
58
+ }
59
+ </style>
60
+ </head>
61
+ <body>
62
+ <div class="header">
63
+ <h1>✅ <%= t('rails_onboarding.mailer.step_completed.heading', default: 'Step Completed!') %></h1>
64
+ </div>
65
+
66
+ <div class="content">
67
+ <p><%= t('rails_onboarding.mailer.step_completed.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %></p>
68
+
69
+ <p>
70
+ <%= t('rails_onboarding.mailer.step_completed.intro', default: 'Great job completing another step in your onboarding journey!') %>
71
+ </p>
72
+
73
+ <% if @step %>
74
+ <div style="text-align: center;">
75
+ <span class="step-badge">
76
+ <%= @step.to_s.titleize %>
77
+ </span>
78
+ </div>
79
+ <% end %>
80
+
81
+ <p>
82
+ <strong><%= t('rails_onboarding.mailer.step_completed.progress', default: 'Your Progress') %>:</strong> <%= @progress %>%
83
+ </p>
84
+
85
+ <div class="onboarding-progress-bar">
86
+ <div class="onboarding-progress-fill" style="width: <%= @progress %>%;"></div>
87
+ </div>
88
+
89
+ <p>
90
+ <%= t('rails_onboarding.mailer.step_completed.encouragement',
91
+ default: "Keep up the great work! Each step brings you closer to unlocking all features and getting the most out of your experience.") %>
92
+ </p>
93
+
94
+ <div style="text-align: center;">
95
+ <a href="<%= Rails.application.routes.url_helpers.rails_onboarding_onboarding_url rescue '#' %>" class="cta-button">
96
+ <%= t('rails_onboarding.mailer.step_completed.cta', default: 'Continue Onboarding') %>
97
+ </a>
98
+ </div>
99
+ </div>
100
+
101
+ <div class="footer">
102
+ <p><%= t('rails_onboarding.mailer.step_completed.footer', default: 'Keep going!') %></p>
103
+ </div>
104
+ </body>
105
+ </html>
@@ -0,0 +1,19 @@
1
+ <%= t('rails_onboarding.mailer.step_completed.heading', default: 'Step Completed!') %>
2
+
3
+ <%= t('rails_onboarding.mailer.step_completed.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %>
4
+
5
+ <%= t('rails_onboarding.mailer.step_completed.intro', default: 'Great job completing another step in your onboarding journey!') %>
6
+
7
+ <% if @step %>
8
+ ✓ <%= @step.to_s.titleize %>
9
+ <% end %>
10
+
11
+ <%= t('rails_onboarding.mailer.step_completed.progress', default: 'Your Progress') %>: <%= @progress %>%
12
+
13
+ <%= t('rails_onboarding.mailer.step_completed.encouragement',
14
+ default: "Keep up the great work! Each step brings you closer to unlocking all features and getting the most out of your experience.") %>
15
+
16
+ <%= t('rails_onboarding.mailer.step_completed.cta', default: 'Continue Onboarding') %>: <%= @onboarding_url rescue '#' %>
17
+
18
+ ---
19
+ <%= t('rails_onboarding.mailer.step_completed.footer', default: 'Keep going!') %>
@@ -0,0 +1,74 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
5
+ <style>
6
+ body {
7
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
8
+ line-height: 1.6;
9
+ color: #333;
10
+ max-width: 600px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ }
14
+ .header {
15
+ text-align: center;
16
+ padding: 20px 0;
17
+ border-bottom: 2px solid #f0f0f0;
18
+ }
19
+ .content {
20
+ padding: 30px 0;
21
+ }
22
+ .cta-button {
23
+ display: inline-block;
24
+ padding: 12px 24px;
25
+ background-color: #4F46E5;
26
+ color: white;
27
+ text-decoration: none;
28
+ border-radius: 6px;
29
+ margin: 20px 0;
30
+ }
31
+ .footer {
32
+ text-align: center;
33
+ padding: 20px 0;
34
+ border-top: 2px solid #f0f0f0;
35
+ color: #666;
36
+ font-size: 14px;
37
+ }
38
+ </style>
39
+ </head>
40
+ <body>
41
+ <div class="header">
42
+ <h1>🎉 <%= t('rails_onboarding.mailer.welcome.heading', default: 'Welcome!') %></h1>
43
+ </div>
44
+
45
+ <div class="content">
46
+ <p><%= t('rails_onboarding.mailer.welcome.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %></p>
47
+
48
+ <p>
49
+ <%= t('rails_onboarding.mailer.welcome.intro',
50
+ default: "We're excited to have you on board! We've prepared a quick onboarding process to help you get started and make the most of your experience.") %>
51
+ </p>
52
+
53
+ <p>
54
+ <%= t('rails_onboarding.mailer.welcome.description',
55
+ default: "The onboarding process will guide you through the essential features and help you set up your account. It only takes a few minutes!") %>
56
+ </p>
57
+
58
+ <div style="text-align: center;">
59
+ <a href="<%= @onboarding_url %>" class="cta-button">
60
+ <%= t('rails_onboarding.mailer.welcome.cta', default: 'Get Started') %>
61
+ </a>
62
+ </div>
63
+
64
+ <p>
65
+ <%= t('rails_onboarding.mailer.welcome.help',
66
+ default: "If you have any questions or need assistance, don't hesitate to reach out. We're here to help!") %>
67
+ </p>
68
+ </div>
69
+
70
+ <div class="footer">
71
+ <p><%= t('rails_onboarding.mailer.welcome.footer', default: 'Thank you for joining us!') %></p>
72
+ </div>
73
+ </body>
74
+ </html>
@@ -0,0 +1,17 @@
1
+ <%= t('rails_onboarding.mailer.welcome.heading', default: 'Welcome!') %>
2
+
3
+ <%= t('rails_onboarding.mailer.welcome.greeting', default: 'Hi there!', name: @user.respond_to?(:name) ? @user.name : 'there') %>
4
+
5
+ <%= t('rails_onboarding.mailer.welcome.intro',
6
+ default: "We're excited to have you on board! We've prepared a quick onboarding process to help you get started and make the most of your experience.") %>
7
+
8
+ <%= t('rails_onboarding.mailer.welcome.description',
9
+ default: "The onboarding process will guide you through the essential features and help you set up your account. It only takes a few minutes!") %>
10
+
11
+ <%= t('rails_onboarding.mailer.welcome.cta', default: 'Get Started') %>: <%= @onboarding_url %>
12
+
13
+ <%= t('rails_onboarding.mailer.welcome.help',
14
+ default: "If you have any questions or need assistance, don't hesitate to reach out. We're here to help!") %>
15
+
16
+ ---
17
+ <%= t('rails_onboarding.mailer.welcome.footer', default: 'Thank you for joining us!') %>
@@ -0,0 +1,25 @@
1
+ <div id="flash-messages" class="flash-container">
2
+ <% if defined?(notice) && notice %>
3
+ <div class="onboarding-flash flash-notice" role="alert">
4
+ <span class="flash-icon">✓</span>
5
+ <span class="flash-message"><%= notice %></span>
6
+ <button class="flash-close" onclick="this.parentElement.remove()" aria-label="Dismiss">×</button>
7
+ </div>
8
+ <% end %>
9
+
10
+ <% if defined?(alert) && alert %>
11
+ <div class="onboarding-flash flash-alert" role="alert">
12
+ <span class="flash-icon">⚠</span>
13
+ <span class="flash-message"><%= alert %></span>
14
+ <button class="flash-close" onclick="this.parentElement.remove()" aria-label="Dismiss">×</button>
15
+ </div>
16
+ <% end %>
17
+
18
+ <% if defined?(error) && error %>
19
+ <div class="onboarding-flash flash-error" role="alert">
20
+ <span class="flash-icon">✕</span>
21
+ <span class="flash-message"><%= error %></span>
22
+ <button class="flash-close" onclick="this.parentElement.remove()" aria-label="Dismiss">×</button>
23
+ </div>
24
+ <% end %>
25
+ </div>
@@ -0,0 +1,22 @@
1
+ <%#
2
+ Milestone badge partial for showing milestone achievements
3
+ Usage: <%= render 'rails_onboarding/shared/milestone_badge', milestone: milestone_config, achieved: true/false %>
4
+ %>
5
+
6
+ <div class="milestone-badge <%= 'onboarding-achieved' if achieved %> <%= 'onboarding-locked' unless achieved %>">
7
+ <div class="onboarding-badge-icon">
8
+ <%= milestone[:icon] %>
9
+ <% unless achieved %>
10
+ <div class="lock-overlay">🔒</div>
11
+ <% end %>
12
+ </div>
13
+
14
+ <div class="onboarding-badge-content">
15
+ <div class="onboarding-badge-title"><%= milestone[:title] %></div>
16
+ <div class="badge-points">+<%= milestone[:points] %></div>
17
+ </div>
18
+
19
+ <% if achieved %>
20
+ <div class="achievement-check">✅</div>
21
+ <% end %>
22
+ </div>
@@ -0,0 +1,44 @@
1
+ <%# Host applications render this partial from their own views, so the path is
2
+ resolved through the engine's mount proxy rather than assumed. %>
3
+ <div class="milestone-celebration-overlay is-hidden"
4
+ data-controller="milestone-celebration"
5
+ data-milestone-celebration-milestone-value="<%= milestone.to_json %>"
6
+ data-milestone-celebration-milestones-path-value="<%= rails_onboarding.milestones_path %>">
7
+
8
+ <div class="celebration-backdrop" data-action="click->milestone-celebration#dismiss"></div>
9
+
10
+ <div class="celebration-modal">
11
+ <div class="celebration-content">
12
+ <!-- Confetti animation container -->
13
+ <div class="confetti-container" data-milestone-celebration-target="confetti"></div>
14
+
15
+ <!-- Achievement announcement -->
16
+ <div class="achievement-announcement">
17
+ <div class="achievement-icon-container">
18
+ <div class="achievement-icon-glow"></div>
19
+ <div class="achievement-icon"><%= milestone[:icon] %></div>
20
+ </div>
21
+
22
+ <h2 class="achievement-title">Milestone Achieved!</h2>
23
+ <h3 class="milestone-name"><%= milestone[:title] %></h3>
24
+ <p class="milestone-description"><%= milestone[:description] %></p>
25
+
26
+ <div class="points-earned">
27
+ <span class="points-label">You earned</span>
28
+ <span class="points-value">+<%= milestone[:points] %></span>
29
+ <span class="points-label">points!</span>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- Action buttons -->
34
+ <div class="celebration-actions">
35
+ <button class="onboarding-btn onboarding-btn-primary" data-action="click->milestone-celebration#dismiss">
36
+ Continue
37
+ </button>
38
+ <button class="onboarding-btn onboarding-btn-secondary" data-action="click->milestone-celebration#viewAllMilestones">
39
+ View All Achievements
40
+ </button>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
@@ -0,0 +1,48 @@
1
+ <%# Onboarding chrome for host-app pages. Render it unconditionally from the
2
+ host layout - it guards itself and renders nothing once onboarding is
3
+ done, skipped, or not required:
4
+
5
+ render "rails_onboarding/shared/onboarding_banner"
6
+
7
+ (No ERB delimiters around the example above: an ERB comment ends at the
8
+ first "%" + ">" sequence, so embedding a tag here would cut the comment
9
+ short and leak the rest of it into the page.)
10
+
11
+ Self-contained on purpose: it runs inside host actions that never set the
12
+ engine's @current_step/@progress ivars, so everything is derived from
13
+ current_user. %>
14
+ <%# The raw engine root carries a trailing slash ("/onboarding/") like any
15
+ mounted engine root; chomp for a canonical link target and a
16
+ segment-aware engine-page check. %>
17
+ <% onboarding_root = rails_onboarding.onboarding_path.chomp("/") %>
18
+ <% on_engine_page = request.path == onboarding_root ||
19
+ request.path.start_with?("#{onboarding_root}/") %>
20
+ <% if defined?(current_user) &&
21
+ current_user.respond_to?(:needs_onboarding?) &&
22
+ current_user.needs_onboarding? &&
23
+ !on_engine_page &&
24
+ (step = current_user.current_onboarding_step) %>
25
+ <div class="onboarding-banner" role="status">
26
+ <div class="onboarding-banner-progress">
27
+ <div class="onboarding-progress-bar">
28
+ <div class="onboarding-progress-fill" style="--onboarding-progress-width: <%= current_user.onboarding_progress %>%"></div>
29
+ </div>
30
+ <span class="onboarding-banner-step">
31
+ Step <%= RailsOnboarding.configuration.step_index(step[:name]).to_i + 1 %>
32
+ of <%= RailsOnboarding.configuration.total_steps %>:
33
+ <strong><%= step[:icon] %> <%= step[:title] %></strong>
34
+ </span>
35
+ </div>
36
+ <div class="onboarding-banner-actions">
37
+ <%# For :path steps, /onboarding re-checks complete_if and either
38
+ advances or routes back to the step's page - so "Continue" is
39
+ always the right link. %>
40
+ <%= link_to "Continue setup →", onboarding_root,
41
+ class: "onboarding-banner-continue" %>
42
+ <% if step[:skippable] %>
43
+ <%= button_to "Skip this step", rails_onboarding.skip_onboarding_path,
44
+ method: :post, class: "onboarding-banner-skip" %>
45
+ <% end %>
46
+ </div>
47
+ </div>
48
+ <% end %>