summaryrefslogtreecommitdiff
path: root/projects/3/example/app
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-01-12 19:49:28 -0700
committermo khan <mo@mokhan.ca>2025-01-12 19:49:28 -0700
commit98aa588670539dd7ee5720973f5c16f03af245da (patch)
tree8f37b8055eca8595cd1bf6ee71859d1e5676b5c7 /projects/3/example/app
parent1c6426eed6d9d53c7ec535fa7f5c84e9759985df (diff)
initial commit
Diffstat (limited to 'projects/3/example/app')
-rw-r--r--projects/3/example/app/assets/images/.keep0
-rw-r--r--projects/3/example/app/assets/stylesheets/application.css10
-rw-r--r--projects/3/example/app/controllers/application_controller.rb4
-rw-r--r--projects/3/example/app/controllers/concerns/.keep0
-rw-r--r--projects/3/example/app/helpers/application_helper.rb2
-rw-r--r--projects/3/example/app/jobs/application_job.rb7
-rw-r--r--projects/3/example/app/mailers/application_mailer.rb4
-rw-r--r--projects/3/example/app/models/application_record.rb3
-rw-r--r--projects/3/example/app/models/concerns/.keep0
-rw-r--r--projects/3/example/app/views/layouts/application.html.erb27
-rw-r--r--projects/3/example/app/views/layouts/mailer.html.erb13
-rw-r--r--projects/3/example/app/views/layouts/mailer.text.erb1
-rw-r--r--projects/3/example/app/views/pwa/manifest.json.erb22
-rw-r--r--projects/3/example/app/views/pwa/service-worker.js26
14 files changed, 119 insertions, 0 deletions
diff --git a/projects/3/example/app/assets/images/.keep b/projects/3/example/app/assets/images/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/projects/3/example/app/assets/images/.keep
diff --git a/projects/3/example/app/assets/stylesheets/application.css b/projects/3/example/app/assets/stylesheets/application.css
new file mode 100644
index 0000000..fe93333
--- /dev/null
+++ b/projects/3/example/app/assets/stylesheets/application.css
@@ -0,0 +1,10 @@
+/*
+ * This is a manifest file that'll be compiled into application.css.
+ *
+ * With Propshaft, assets are served efficiently without preprocessing steps. You can still include
+ * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard
+ * cascading order, meaning styles declared later in the document or manifest will override earlier ones,
+ * depending on specificity.
+ *
+ * Consider organizing styles into separate files for maintainability.
+ */
diff --git a/projects/3/example/app/controllers/application_controller.rb b/projects/3/example/app/controllers/application_controller.rb
new file mode 100644
index 0000000..0d95db2
--- /dev/null
+++ b/projects/3/example/app/controllers/application_controller.rb
@@ -0,0 +1,4 @@
+class ApplicationController < ActionController::Base
+ # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
+ allow_browser versions: :modern
+end
diff --git a/projects/3/example/app/controllers/concerns/.keep b/projects/3/example/app/controllers/concerns/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/projects/3/example/app/controllers/concerns/.keep
diff --git a/projects/3/example/app/helpers/application_helper.rb b/projects/3/example/app/helpers/application_helper.rb
new file mode 100644
index 0000000..de6be79
--- /dev/null
+++ b/projects/3/example/app/helpers/application_helper.rb
@@ -0,0 +1,2 @@
+module ApplicationHelper
+end
diff --git a/projects/3/example/app/jobs/application_job.rb b/projects/3/example/app/jobs/application_job.rb
new file mode 100644
index 0000000..d394c3d
--- /dev/null
+++ b/projects/3/example/app/jobs/application_job.rb
@@ -0,0 +1,7 @@
+class ApplicationJob < ActiveJob::Base
+ # Automatically retry jobs that encountered a deadlock
+ # retry_on ActiveRecord::Deadlocked
+
+ # Most jobs are safe to ignore if the underlying records are no longer available
+ # discard_on ActiveJob::DeserializationError
+end
diff --git a/projects/3/example/app/mailers/application_mailer.rb b/projects/3/example/app/mailers/application_mailer.rb
new file mode 100644
index 0000000..3c34c81
--- /dev/null
+++ b/projects/3/example/app/mailers/application_mailer.rb
@@ -0,0 +1,4 @@
+class ApplicationMailer < ActionMailer::Base
+ default from: "from@example.com"
+ layout "mailer"
+end
diff --git a/projects/3/example/app/models/application_record.rb b/projects/3/example/app/models/application_record.rb
new file mode 100644
index 0000000..b63caeb
--- /dev/null
+++ b/projects/3/example/app/models/application_record.rb
@@ -0,0 +1,3 @@
+class ApplicationRecord < ActiveRecord::Base
+ primary_abstract_class
+end
diff --git a/projects/3/example/app/models/concerns/.keep b/projects/3/example/app/models/concerns/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/projects/3/example/app/models/concerns/.keep
diff --git a/projects/3/example/app/views/layouts/application.html.erb b/projects/3/example/app/views/layouts/application.html.erb
new file mode 100644
index 0000000..56d9cf8
--- /dev/null
+++ b/projects/3/example/app/views/layouts/application.html.erb
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title><%= content_for(:title) || "Example" %></title>
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <%= csrf_meta_tags %>
+ <%= csp_meta_tag %>
+
+ <%= yield :head %>
+
+ <%# Enable PWA manifest for installable apps (make sure to enable in config/routes.rb too!) %>
+ <%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %>
+
+ <link rel="icon" href="/icon.png" type="image/png">
+ <link rel="icon" href="/icon.svg" type="image/svg+xml">
+ <link rel="apple-touch-icon" href="/icon.png">
+
+ <%# Includes all stylesheet files in app/assets/stylesheets %>
+ <%= stylesheet_link_tag :app, "data-turbo-track": "reload" %>
+ </head>
+
+ <body>
+ <%= yield %>
+ </body>
+</html>
diff --git a/projects/3/example/app/views/layouts/mailer.html.erb b/projects/3/example/app/views/layouts/mailer.html.erb
new file mode 100644
index 0000000..3aac900
--- /dev/null
+++ b/projects/3/example/app/views/layouts/mailer.html.erb
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <style>
+ /* Email styles need to be inline */
+ </style>
+ </head>
+
+ <body>
+ <%= yield %>
+ </body>
+</html>
diff --git a/projects/3/example/app/views/layouts/mailer.text.erb b/projects/3/example/app/views/layouts/mailer.text.erb
new file mode 100644
index 0000000..37f0bdd
--- /dev/null
+++ b/projects/3/example/app/views/layouts/mailer.text.erb
@@ -0,0 +1 @@
+<%= yield %>
diff --git a/projects/3/example/app/views/pwa/manifest.json.erb b/projects/3/example/app/views/pwa/manifest.json.erb
new file mode 100644
index 0000000..25405df
--- /dev/null
+++ b/projects/3/example/app/views/pwa/manifest.json.erb
@@ -0,0 +1,22 @@
+{
+ "name": "Example",
+ "icons": [
+ {
+ "src": "/icon.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "/icon.png",
+ "type": "image/png",
+ "sizes": "512x512",
+ "purpose": "maskable"
+ }
+ ],
+ "start_url": "/",
+ "display": "standalone",
+ "scope": "/",
+ "description": "Example.",
+ "theme_color": "red",
+ "background_color": "red"
+}
diff --git a/projects/3/example/app/views/pwa/service-worker.js b/projects/3/example/app/views/pwa/service-worker.js
new file mode 100644
index 0000000..b3a13fb
--- /dev/null
+++ b/projects/3/example/app/views/pwa/service-worker.js
@@ -0,0 +1,26 @@
+// Add a service worker for processing Web Push notifications:
+//
+// self.addEventListener("push", async (event) => {
+// const { title, options } = await event.data.json()
+// event.waitUntil(self.registration.showNotification(title, options))
+// })
+//
+// self.addEventListener("notificationclick", function(event) {
+// event.notification.close()
+// event.waitUntil(
+// clients.matchAll({ type: "window" }).then((clientList) => {
+// for (let i = 0; i < clientList.length; i++) {
+// let client = clientList[i]
+// let clientPath = (new URL(client.url)).pathname
+//
+// if (clientPath == event.notification.data.path && "focus" in client) {
+// return client.focus()
+// }
+// }
+//
+// if (clients.openWindow) {
+// return clients.openWindow(event.notification.data.path)
+// }
+// })
+// )
+// })