schienenzeppelin 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +17 -0
  3. data/.github/workflows/outdated.yml +20 -0
  4. data/.gitignore +282 -0
  5. data/.rspec_status +3 -0
  6. data/.rubocop.yml +28 -0
  7. data/.tool-versions +1 -0
  8. data/CODE_OF_CONDUCT.md +84 -0
  9. data/GALLERY.md +29 -0
  10. data/Gemfile +13 -0
  11. data/Gemfile.lock +184 -0
  12. data/LICENSE +21 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +174 -0
  15. data/Rakefile +12 -0
  16. data/TODO.md +32 -0
  17. data/bin/console +15 -0
  18. data/bin/setup +8 -0
  19. data/exe/sz +25 -0
  20. data/images/create.png +0 -0
  21. data/images/error.png +0 -0
  22. data/images/home.png +0 -0
  23. data/images/index.png +0 -0
  24. data/images/login.png +0 -0
  25. data/images/mobile.png +0 -0
  26. data/lib/schienenzeppelin.rb +18 -0
  27. data/lib/schienenzeppelin/app_builder.rb +88 -0
  28. data/lib/schienenzeppelin/app_generator.rb +95 -0
  29. data/lib/schienenzeppelin/helper_base.rb +28 -0
  30. data/lib/schienenzeppelin/helpers/annotate.rb +11 -0
  31. data/lib/schienenzeppelin/helpers/capistrano.rb +35 -0
  32. data/lib/schienenzeppelin/helpers/continuous_integration.rb +12 -0
  33. data/lib/schienenzeppelin/helpers/credentials.rb +49 -0
  34. data/lib/schienenzeppelin/helpers/devise.rb +45 -0
  35. data/lib/schienenzeppelin/helpers/errors.rb +67 -0
  36. data/lib/schienenzeppelin/helpers/factory_bot.rb +13 -0
  37. data/lib/schienenzeppelin/helpers/generators.rb +26 -0
  38. data/lib/schienenzeppelin/helpers/high_voltage.rb +11 -0
  39. data/lib/schienenzeppelin/helpers/home.rb +17 -0
  40. data/lib/schienenzeppelin/helpers/hotwire.rb +11 -0
  41. data/lib/schienenzeppelin/helpers/pundit.rb +12 -0
  42. data/lib/schienenzeppelin/helpers/rspec.rb +13 -0
  43. data/lib/schienenzeppelin/helpers/rubocop.rb +11 -0
  44. data/lib/schienenzeppelin/helpers/scaffold.rb +11 -0
  45. data/lib/schienenzeppelin/helpers/services.rb +11 -0
  46. data/lib/schienenzeppelin/helpers/sidekiq.rb +13 -0
  47. data/lib/schienenzeppelin/helpers/stimulus.rb +11 -0
  48. data/lib/schienenzeppelin/helpers/stimulus_components.rb +29 -0
  49. data/lib/schienenzeppelin/helpers/tailwind.rb +18 -0
  50. data/lib/schienenzeppelin/version.rb +7 -0
  51. data/schienenzeppelin.gemspec +37 -0
  52. data/schienenzeppelin.jpg +0 -0
  53. data/script.md +104 -0
  54. data/templates/.dockerignore.erb +51 -0
  55. data/templates/.entrypoint.sh.erb +16 -0
  56. data/templates/.env.development.erb +3 -0
  57. data/templates/.foreman.erb +1 -0
  58. data/templates/.github/workflows/build.yml.erb +49 -0
  59. data/templates/.gitignore.erb +285 -0
  60. data/templates/.irbrc.erb +12 -0
  61. data/templates/.rubocop.yml.erb +37 -0
  62. data/templates/.tool-versions.erb +1 -0
  63. data/templates/Capfile.erb +24 -0
  64. data/templates/Dockerfile.erb +45 -0
  65. data/templates/Gemfile.erb +122 -0
  66. data/templates/Procfile.dev.erb +6 -0
  67. data/templates/Procfile.erb +2 -0
  68. data/templates/README.md.erb +43 -0
  69. data/templates/app/controllers/authorized_controller.rb.erb +10 -0
  70. data/templates/app/controllers/errors_controller.rb.erb +24 -0
  71. data/templates/app/javascript/images/checkmark.svg +1 -0
  72. data/templates/app/javascript/images/logo.svg +1 -0
  73. data/templates/app/javascript/stylesheets/components.scss +206 -0
  74. data/templates/app/policies/application_policy.rb +55 -0
  75. data/templates/app/services/application_service.rb +14 -0
  76. data/templates/app/views/devise/confirmations/new.html.erb +24 -0
  77. data/templates/app/views/devise/passwords/edit.html.erb +34 -0
  78. data/templates/app/views/devise/passwords/new.html.erb +23 -0
  79. data/templates/app/views/devise/registrations/edit.html.erb +62 -0
  80. data/templates/app/views/devise/registrations/new.html.erb +45 -0
  81. data/templates/app/views/devise/sessions/new.html.erb +33 -0
  82. data/templates/app/views/devise/shared/_error_messages.html.erb +15 -0
  83. data/templates/app/views/devise/shared/_form_wrap.html.erb +5 -0
  84. data/templates/app/views/devise/shared/_links.html.erb +25 -0
  85. data/templates/app/views/devise/unlocks/new.html.erb +22 -0
  86. data/templates/app/views/errors/internal_error.html.erb +14 -0
  87. data/templates/app/views/errors/not_found.html.erb +14 -0
  88. data/templates/app/views/errors/unacceptable.html.erb +14 -0
  89. data/templates/app/views/layouts/application.html.erb.tt +30 -0
  90. data/templates/app/views/pages/home.html.erb.tt +20 -0
  91. data/templates/app/views/shared/_flashes.html.erb.tt +12 -0
  92. data/templates/app/views/shared/_footer.html.erb.tt +21 -0
  93. data/templates/app/views/shared/_navbar.html.erb.tt +40 -0
  94. data/templates/bin/setup.erb +146 -0
  95. data/templates/config/credentials.yml.erb +7 -0
  96. data/templates/config/initializers/high_voltage.rb +6 -0
  97. data/templates/config/initializers/lograge.rb +5 -0
  98. data/templates/config/initializers/sidekiq.rb +10 -0
  99. data/templates/config/postgresql.yml.erb +23 -0
  100. data/templates/docker-compose.yml.erb +21 -0
  101. data/templates/lib/capistrano/tasks/seeds.rake +12 -0
  102. data/templates/lib/capistrano/tasks/sidekiq.rake +36 -0
  103. data/templates/lib/generators/rails/navigation/USAGE +6 -0
  104. data/templates/lib/generators/rails/navigation/navigation_generator.rb +15 -0
  105. data/templates/lib/generators/rails/scaffold_controller_generator.rb +12 -0
  106. data/templates/lib/tasks/auto_annotate_models.rake +58 -0
  107. data/templates/lib/templates/erb/scaffold/_form.html.erb +39 -0
  108. data/templates/lib/templates/erb/scaffold/edit.html.erb +7 -0
  109. data/templates/lib/templates/erb/scaffold/index.html.erb +34 -0
  110. data/templates/lib/templates/erb/scaffold/new.html.erb +7 -0
  111. data/templates/lib/templates/erb/scaffold/show.html.erb +18 -0
  112. data/templates/public/500.html.erb +26 -0
  113. data/templates/spec/rails_helper.rb +26 -0
  114. data/templates/spec/spec_helper.rb +61 -0
  115. data/templates/spec/support/factory_bot.rb +5 -0
  116. data/templates/spec/support/shoulda_matchers.rb +8 -0
  117. metadata +179 -0
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationPolicy
4
+ attr_reader :user, :record
5
+
6
+ def initialize(user, record)
7
+ raise Pundit::NotAuthorizedError, 'must be logged in' unless user
8
+
9
+ @user = user
10
+ @record = record
11
+ end
12
+
13
+ def index?
14
+ false
15
+ end
16
+
17
+ def show?
18
+ false
19
+ end
20
+
21
+ def create?
22
+ false
23
+ end
24
+
25
+ def new?
26
+ false
27
+ end
28
+
29
+ def update?
30
+ false
31
+ end
32
+
33
+ def edit?
34
+ false
35
+ end
36
+
37
+ def destroy?
38
+ false
39
+ end
40
+
41
+ class Scope
42
+ attr_reader :user, :scope
43
+
44
+ def initialize(user, scope)
45
+ raise Pundit::NotAuthorizedError, 'must be logged in' unless user
46
+
47
+ @user = user
48
+ @scope = scope
49
+ end
50
+
51
+ def resolve
52
+ scope.all
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationService
4
+ def self.call(*args, &block)
5
+ instance = new(*args, &block)
6
+ instance.call
7
+ end
8
+
9
+ def call
10
+ raise NotImplementedError('Services must implement call')
11
+ end
12
+
13
+ private_class_method :new
14
+ end
@@ -0,0 +1,24 @@
1
+ <% content_for :devise_form do %>
2
+
3
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Resend confirmation instructions</h2>
4
+
5
+ <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
6
+ <%= render "devise/shared/error_messages", resource: resource %>
7
+
8
+ <div class="input-group">
9
+ <%= f.label :email, class: "label" %>
10
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email), class: "input" %>
11
+ </div>
12
+
13
+ <div class="input-group">
14
+ <%= f.submit "Resend confirmation instructions", class: "btn btn-default" %>
15
+ </div>
16
+ <% end %>
17
+
18
+ <hr class="mt-6 border" />
19
+
20
+ <%= render "devise/shared/links" %>
21
+
22
+ <% end %>
23
+
24
+ <%= render "devise/shared/form_wrap" %>
@@ -0,0 +1,34 @@
1
+ <% content_for :devise_form do %>
2
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Change your password</h2>
3
+
4
+ <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
5
+ <%= render "devise/shared/error_messages", resource: resource %>
6
+ <%= f.hidden_field :reset_password_token %>
7
+
8
+ <div class="input-group">
9
+ <div class="flex">
10
+ <%= f.label :password, "New password", class:"label" %>
11
+ <% if @minimum_password_length %>
12
+ <em>(<%= @minimum_password_length %> characters minimum)</em>
13
+ <% end %>
14
+ </div>
15
+ <%= f.password_field :password, autofocus: true, autocomplete: "new-password", class: "input" %>
16
+ </div>
17
+
18
+ <div class="input-group">
19
+ <%= f.label :password_confirmation, "Confirm new password", class: "label" %>
20
+ <%= f.password_field :password_confirmation, autocomplete: "off", class: "input" %>
21
+ </div>
22
+
23
+ <div class="input-group">
24
+ <%= f.submit "Change my password", class: "btn btn-default" %>
25
+ </div>
26
+ <% end %>
27
+
28
+ <hr class="mt-6 border" />
29
+
30
+ <%= render "devise/shared/links" %>
31
+
32
+ <% end %>
33
+
34
+ <%= render "devise/shared/form_wrap" %>
@@ -0,0 +1,23 @@
1
+ <% content_for :devise_form do %>
2
+
3
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Forgot your password?</h2>
4
+
5
+ <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
6
+ <%= render "devise/shared/error_messages", resource: resource %>
7
+
8
+ <div class="input-group">
9
+ <%= f.label :email, class: "label" %>
10
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input" %>
11
+ </div>
12
+
13
+ <div class="input-group">
14
+ <%= f.submit "Send me reset password instructions", class: "btn btn-default" %>
15
+ </div>
16
+ <% end %>
17
+
18
+ <hr class="mt-6 border" />
19
+
20
+ <%= render "devise/shared/links" %>
21
+ <% end %>
22
+
23
+ <%= render "devise/shared/form_wrap" %>
@@ -0,0 +1,62 @@
1
+ <% content_for :devise_form do %>
2
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Edit <%= resource_name.to_s.humanize %></h2>
3
+
4
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
5
+
6
+ <%= render "devise/shared/error_messages", resource: resource %>
7
+
8
+ <div class="input-group">
9
+ <%= f.label :name, class:"label" %>
10
+ <%= f.text_field :name, class:"input" %>
11
+ </div>
12
+
13
+ <div class="input-group">
14
+ <%= f.label :email, class:"label" %>
15
+ <%= f.email_field :email, autocomplete: "email", class:"input" %>
16
+ </div>
17
+
18
+ <div class="input-group">
19
+ <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
20
+ <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
21
+ <% end %>
22
+ </div>
23
+
24
+ <div class="input-group">
25
+ <%= f.label :password, class:"label" %>
26
+ <%= f.password_field :password, autocomplete: "new-password", class:"input" %>
27
+ <p class="pt-1 text-sm italic text-grey-dark"> <% if @minimum_password_length %>
28
+ <%= @minimum_password_length %> characters minimum <% end %> (leave blank if you don't want to change it) </p>
29
+
30
+ </div>
31
+
32
+ <div class="input-group">
33
+ <%= f.label :password_confirmation, class: "label" %>
34
+ <%= f.password_field :password_confirmation, autocomplete: "new-password", class: "input" %>
35
+ </div>
36
+
37
+ <div class="input-group">
38
+ <%= f.label :current_password, class: "label" %>
39
+ <%= f.password_field :current_password, autocomplete: "current-password", class: "input" %>
40
+ <p class="pt-2 text-sm italic text-grey-dark">(we need your current password to confirm your changes)</p>
41
+ </div>
42
+
43
+ <div class="input-group">
44
+ <%= f.submit "Update", class: "btn btn-default" %>
45
+ </div>
46
+ <% end %>
47
+
48
+ <hr class="mt-6 mb-3 border" />
49
+
50
+ <h3 class="mb-4 text-xl font-bold heading">Cancel my account</h3>
51
+
52
+ <div class="flex items-center justify-between">
53
+ <div class="flex-1">
54
+ <p class="py-4">Unhappy?</p>
55
+ </div>
56
+
57
+ <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete, class: "btn btn-red" %>
58
+ </div>
59
+
60
+ <% end %>
61
+
62
+ <%= render 'devise/shared/form_wrap' %>
@@ -0,0 +1,45 @@
1
+ <% content_for :devise_form do %>
2
+
3
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Sign up</h2>
4
+
5
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
6
+ <%= render "devise/shared/error_messages", resource: resource %>
7
+
8
+ <div class="input-group">
9
+ <%= f.label :name, class:"label" %>
10
+ <%= f.text_field :name, class:"input" %>
11
+ </div>
12
+
13
+ <div class="input-group">
14
+ <%= f.label :email, class:"label" %>
15
+ <%= f.email_field :email, autocomplete: "email", class:"input" %>
16
+ </div>
17
+
18
+ <div class="input-group">
19
+ <div class="flex">
20
+ <%= f.label :password, class: "label" %>
21
+ <% if @minimum_password_length %>
22
+ <span class="pl-1 text-xs text-grey-dark"><em>(<%= @minimum_password_length %> characters minimum)</em></span>
23
+ <% end %>
24
+ </div>
25
+ <%= f.password_field :password, autocomplete: "new-password", class: "input" %>
26
+ </div>
27
+
28
+ <div class="input-group">
29
+ <%= f.label :password_confirmation, class:"label" %>
30
+ <%= f.password_field :password_confirmation, autocomplete: "new-password", class: "input" %>
31
+ </div>
32
+
33
+ <div class="input-group">
34
+ <%= f.submit "Sign up", class: "btn btn-default" %>
35
+ </div>
36
+
37
+ <hr class="mt-6 border" />
38
+
39
+ <% end %>
40
+
41
+ <%= render "devise/shared/links" %>
42
+
43
+ <% end %>
44
+
45
+ <%= render "devise/shared/form_wrap" %>
@@ -0,0 +1,33 @@
1
+ <% content_for :devise_form do %>
2
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Log in</h2>
3
+ <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
4
+
5
+ <div class="input-group">
6
+ <%= f.label :email, class:"label" %>
7
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input" %>
8
+ </div>
9
+
10
+ <div class="input-group">
11
+ <%= f.label :password, class:"label" %>
12
+ <%= f.password_field :password, autocomplete: "current-password", class: "input" %>
13
+ </div>
14
+
15
+ <div class="mb-6 input-checkbox">
16
+ <% if devise_mapping.rememberable? -%>
17
+ <%= f.check_box :remember_me %>
18
+ <%= f.label :remember_me, class:"label" %>
19
+ <% end -%>
20
+ </div>
21
+
22
+ <div class="input-group">
23
+ <%= f.submit "Log in", class: "btn btn-default" %>
24
+ </div>
25
+
26
+ <% end %>
27
+
28
+ <hr class="mt-6 border" />
29
+
30
+ <%= render "devise/shared/links" %>
31
+ <% end %>
32
+
33
+ <%= render "devise/shared/form_wrap" %>
@@ -0,0 +1,15 @@
1
+ <% if resource.errors.any? %>
2
+ <div id="error_explanation" class="text-red-500">
3
+ <h2 class="font-semibold text-lg">
4
+ <%= I18n.t("errors.messages.not_saved",
5
+ count: resource.errors.count,
6
+ resource: resource.class.model_name.human.downcase)
7
+ %>
8
+ </h2>
9
+ <ul class="list-none p-0">
10
+ <% resource.errors.full_messages.each do |message| %>
11
+ <li><%= message %></li>
12
+ <% end %>
13
+ </ul>
14
+ </div>
15
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <div class="w-full max-w-md mx-auto my-8">
2
+ <div class="bg-white border border-gray-300 rounded-lg px-8 pt-6 pb-8">
3
+ <%= yield :devise_form %>
4
+ </div>
5
+ </div>
@@ -0,0 +1,25 @@
1
+ <%- if controller_name != 'sessions' %>
2
+ <div class="flex flex-wrap"><%= link_to "Log in", new_session_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %></div>
3
+ <% end -%>
4
+
5
+ <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
+ <%= link_to "Sign up", new_registration_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %>
7
+ <% end -%>
8
+
9
+ <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
10
+ <%= link_to "Forgot your password?", new_password_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %>
11
+ <% end -%>
12
+
13
+ <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
+ <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline"%>
15
+ <% end -%>
16
+
17
+ <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
+ <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %>
19
+ <% end -%>
20
+
21
+ <%- if devise_mapping.omniauthable? %>
22
+ <%- resource_class.omniauth_providers.each do |provider| %>
23
+ <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), class: "btn btn-default my-4" %>
24
+ <% end -%>
25
+ <% end -%>
@@ -0,0 +1,22 @@
1
+ <% content_for :devise_form do %>
2
+ <h2 class="pt-4 mb-8 text-4xl font-bold heading">Resend unlock instructions</h2>
3
+
4
+ <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
5
+ <%= render "devise/shared/error_messages", resource: resource %>
6
+
7
+ <div class="input-group">
8
+ <%= f.label :email, class: "label" %>
9
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input" %>
10
+ </div>
11
+
12
+ <div class="input-group">
13
+ <%= f.submit "Resend unlock instructions", class: "btn btn-default" %>
14
+ </div>
15
+ <% end %>
16
+
17
+ <hr class="mt-6 border"/>
18
+
19
+ <%= render "devise/shared/links" %>
20
+ <% end %>
21
+
22
+ <%= render "devise/shared/form_wrap" %>
@@ -0,0 +1,14 @@
1
+ <div class="container mx-auto px-4">
2
+ <section class="py-8 px-4 text-center">
3
+ <div class="max-w-auto mx-auto">
4
+ <div class="md:max-w-lg mx-auto flex justify-center">
5
+ <svg class="fill-current text-gray-300 h-48" viewBox="0 0 445 202" xmlns="http://www.w3.org/2000/svg">
6
+ <path d="M38.804 144.71c1.527 8.356 4.447 14.803 8.76 19.34 4.312 4.537 10.601 6.805 18.867 6.805 9.523 0 16.778-3.346 21.764-10.04 4.987-6.693 7.48-15.116 7.48-25.268 0-9.973-2.336-18.396-7.008-25.269-4.672-6.873-11.95-10.31-21.832-10.31-4.672 0-8.715.585-12.129 1.753-6.02 2.156-10.557 6.154-13.611 11.994l-34.5-1.617L20.34 4.15h107.678v32.614H48.103l-7.008 42.72c5.93-3.863 10.556-6.423 13.88-7.681 5.57-2.067 12.354-3.1 20.35-3.1 16.172 0 30.277 5.436 42.317 16.307 12.039 10.87 18.058 26.683 18.058 47.437 0 18.059-5.795 34.186-17.385 48.381-11.59 14.196-28.93 21.293-52.02 21.293-18.597 0-33.87-4.986-45.82-14.959C8.527 177.19 1.879 163.04.53 144.711h38.274zm155.789-43.528c0 22.46 1.842 39.643 5.525 51.547 3.684 11.905 11.23 17.857 22.64 17.857 11.411 0 18.89-5.952 22.44-17.857 3.548-11.904 5.323-29.086 5.323-51.547 0-23.54-1.775-40.97-5.324-52.29s-11.028-16.98-22.438-16.98c-11.41 0-18.957 5.66-22.64 16.98-3.684 11.32-5.526 28.75-5.526 52.29zM222.759.242c24.887 0 42.339 8.76 52.356 26.28 10.018 17.52 15.027 42.406 15.027 74.66s-5.01 57.095-15.027 74.525c-10.017 17.43-27.47 26.145-52.356 26.145-24.887 0-42.339-8.715-52.357-26.145-10.017-17.43-15.026-42.271-15.026-74.525 0-32.254 5.009-57.14 15.026-74.66C180.42 9.001 197.872.241 222.76.241zm125.332 100.94c0 22.46 1.842 39.643 5.525 51.547 3.684 11.905 11.23 17.857 22.64 17.857 11.411 0 18.89-5.952 22.44-17.857 3.548-11.904 5.323-29.086 5.323-51.547 0-23.54-1.775-40.97-5.324-52.29s-11.028-16.98-22.438-16.98c-11.41 0-18.957 5.66-22.64 16.98-3.684 11.32-5.526 28.75-5.526 52.29zM376.257.242c24.887 0 42.339 8.76 52.356 26.28 10.018 17.52 15.027 42.406 15.027 74.66s-5.01 57.095-15.027 74.525c-10.017 17.43-27.47 26.145-52.356 26.145-24.887 0-42.339-8.715-52.357-26.145-10.017-17.43-15.026-42.271-15.026-74.525 0-32.254 5.009-57.14 15.026-74.66C333.918 9.001 351.37.241 376.257.241z" fill-rule="nonzero"/>
7
+ </svg>
8
+ </div>
9
+ <h2 class="mt-8 uppercase text-xl lg:text-5xl font-black">Something went terribly wrong</h2>
10
+ <p class="mt-6 text-sm lg:text-base text-gray-900">If you are the application owner check the logs for more information.</p>
11
+ <a href="/" class="mt-12 btn btn-default">Back To Homepage</a>
12
+ </div>
13
+ </section>
14
+ </div>
@@ -0,0 +1,14 @@
1
+ <div class="container mx-auto px-4">
2
+ <section class="py-8 px-4 text-center">
3
+ <div class="max-w-auto mx-auto">
4
+ <div class="md:max-w-lg mx-auto flex justify-center">
5
+ <svg class="fill-current text-gray-300 h-48" viewBox="0 0 445 202" xmlns="http://www.w3.org/2000/svg">
6
+ <path d="M137.587 154.953h-22.102V197h-37.6v-42.047H.53v-33.557L72.36 2.803h43.125V124.9h22.102v30.053zM77.886 124.9V40.537L28.966 124.9h48.92zm116.707-23.718c0 22.46 1.842 39.643 5.525 51.547 3.684 11.905 11.23 17.857 22.64 17.857 11.411 0 18.89-5.952 22.44-17.857 3.548-11.904 5.323-29.086 5.323-51.547 0-23.54-1.775-40.97-5.324-52.29s-11.028-16.98-22.438-16.98c-11.41 0-18.957 5.66-22.64 16.98-3.684 11.32-5.526 28.75-5.526 52.29zM222.759.242c24.887 0 42.339 8.76 52.356 26.28 10.018 17.52 15.027 42.406 15.027 74.66s-5.01 57.095-15.027 74.525c-10.017 17.43-27.47 26.145-52.356 26.145-24.887 0-42.339-8.715-52.357-26.145-10.017-17.43-15.026-42.271-15.026-74.525 0-32.254 5.009-57.14 15.026-74.66C180.42 9.001 197.872.241 222.76.241zm221.824 154.711h-22.102V197h-37.6v-42.047h-77.355v-33.557l71.83-118.593h43.125V124.9h22.102v30.053zM384.882 124.9V40.537l-48.92 84.363h48.92z" fill-rule="nonzero" />
7
+ </svg>
8
+ </div>
9
+ <h2 class="mt-8 uppercase text-xl lg:text-5xl font-black">Page not found</h2>
10
+ <p class="mt-6 text-sm lg:text-base text-gray-900">The page you are looking for might have been removed had its name changed or is temporarily unavailable.</p>
11
+ <a href="/" class="mt-12 btn btn-default">Back To Homepage</a>
12
+ </div>
13
+ </section>
14
+ </div>
@@ -0,0 +1,14 @@
1
+ <div class="container mx-auto px-4">
2
+ <section class="py-8 px-4 text-center">
3
+ <div class="max-w-auto mx-auto">
4
+ <div class="md:max-w-lg mx-auto flex justify-center">
5
+ <svg class="fill-current text-gray-300 h-48" viewBox="0 0 445 202" xmlns="http://www.w3.org/2000/svg">
6
+ <path d="M137.587 154.953h-22.102V197h-37.6v-42.047H.53v-33.557L72.36 2.803h43.125V124.9h22.102v30.053zM77.886 124.9V40.537L28.966 124.9h48.92zm77.49 72.1c.36-14.016 3.37-26.818 9.03-38.408 5.48-13.028 18.417-26.818 38.812-41.373 17.7-12.668 29.154-21.742 34.365-27.223 7.996-8.535 11.994-17.879 11.994-28.031 0-8.266-2.29-15.139-6.873-20.62-4.582-5.48-11.14-8.22-19.676-8.22-11.68 0-19.63 4.357-23.853 13.072-2.426 5.032-3.863 13.028-4.313 23.989h-37.33c.63-16.622 3.639-30.053 9.03-40.295C176.804 10.394 194.997.646 221.142.646c20.664 0 37.105 5.728 49.324 17.183 12.219 11.455 18.328 26.616 18.328 45.483 0 14.465-4.313 27.313-12.938 38.543-5.66 7.458-14.958 15.768-27.896 24.932l-15.363 10.916c-9.614 6.828-16.195 11.77-19.743 14.824a43.443 43.443 0 00-8.962 10.647h85.306V197H155.376zm153.498 0c.36-14.016 3.37-26.818 9.03-38.408 5.48-13.028 18.417-26.818 38.812-41.373 17.7-12.668 29.154-21.742 34.365-27.223 7.996-8.535 11.994-17.879 11.994-28.031 0-8.266-2.29-15.139-6.873-20.62-4.582-5.48-11.14-8.22-19.676-8.22-11.68 0-19.63 4.357-23.853 13.072-2.426 5.032-3.863 13.028-4.313 23.989h-37.33c.63-16.622 3.639-30.053 9.03-40.295C330.302 10.394 348.495.646 374.64.646c20.664 0 37.105 5.728 49.324 17.183 12.219 11.455 18.328 26.616 18.328 45.483 0 14.465-4.312 27.313-12.938 38.543-5.66 7.458-14.958 15.768-27.896 24.932l-15.363 10.916c-9.614 6.828-16.195 11.77-19.743 14.824a43.443 43.443 0 00-8.962 10.647h85.306V197H308.874z" fill-rule="nonzero"/>
7
+ </svg>
8
+ </div>
9
+ <h2 class="mt-8 uppercase text-xl lg:text-5xl font-black">The change you wanted was rejected</h2>
10
+ <p class="mt-6 text-sm lg:text-base text-gray-900">Maybe you tried to change something you didn't have access to?</p>
11
+ <a href="/" class="mt-12 btn btn-default">Back To Homepage</a>
12
+ </div>
13
+ </section>
14
+ </div>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= camelized %></title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <%%= csrf_meta_tags %>
7
+ <%%= csp_meta_tag %>
8
+
9
+ <%- if options[:skip_javascript] -%>
10
+ <%%= stylesheet_link_tag 'application' %>
11
+ <%- else -%>
12
+ <%- unless options[:skip_turbolinks] -%>
13
+ <%%= stylesheet_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
14
+ <%%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
15
+ <%- else -%>
16
+ <%%= stylesheet_pack_tag 'application' %>
17
+ <%%= javascript_pack_tag 'application' %>
18
+ <%- end -%>
19
+ <%- end -%>
20
+ </head>
21
+
22
+ <body class="flex flex-col min-h-screen">
23
+ <%%= render 'shared/navbar' %>
24
+ <%%= render 'shared/flashes' %>
25
+ <main class="flex-grow">
26
+ <%%= yield %>
27
+ </main>
28
+ <%%= render 'shared/footer' %>
29
+ </body>
30
+ </html>