From 1984ea23aab6fb3964b4fce20b95b23586b1c111 Mon Sep 17 00:00:00 2001 From: Marco Roth Date: Sat, 16 Sep 2023 03:19:10 +0200 Subject: [PATCH] Migrate to Rails app --- .dockerignore | 37 ++ .gitattributes | 9 + .gitignore | 46 +- .ruby-version | 1 + Dockerfile | 79 +++ Gemfile | 75 +++ Gemfile.lock | 279 ++++++++ Procfile.dev | 2 + README.md | 24 + Rakefile | 6 + app/assets/builds/.keep | 0 app/assets/config/manifest.js | 2 + app/assets/images/.keep | 0 {images => app/assets/images}/boost.png | Bin .../assets/images}/feature-image-01.png | Bin {images => app/assets/images}/formulus.png | Bin {images => app/assets/images}/glow-bottom.svg | 0 {images => app/assets/images}/hotwire.png | Bin {images => app/assets/images}/logo.svg | 0 {images => app/assets/images}/morph.png | Bin {images => app/assets/images}/power.png | Bin .../assets/images}/stimulus-intellisense.png | Bin {images => app/assets/images}/stimulus.png | Bin {images => app/assets/images}/strada.png | Bin {images => app/assets/images}/turbo.png | Bin app/assets/stylesheets/dartsass.scss | 2 + app/assets/stylesheets/tailwind.css | 12 + app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/controllers/page_controller.rb | 4 + app/helpers/application_helper.rb | 2 + app/helpers/page_helper.rb | 2 + app/javascript/config/highlighter.js | 5 + app/javascript/config/index.js | 4 + .../javascript/config/stimulus.js | 0 app/javascript/config/swiper.js | 26 + app/javascript/config/turbo.js | 1 + {src => app/javascript}/controllers/index.js | 3 +- .../javascript/css/application.css | 4 +- app/javascript/css/theme.css | 180 +++++ .../javascript}/css/utility-patterns.css | 46 +- app/javascript/packs/application.js | 3 + .../javascript/src/highlighter.js | 36 +- app/jobs/application_job.rb | 7 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 23 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + app/views/page/_about.html.erb | 45 ++ app/views/page/_ecosystem.html.erb | 101 +++ app/views/page/_features.html.erb | 219 ++++++ app/views/page/_footer.html.erb | 69 ++ app/views/page/_header.html.erb | 22 + app/views/page/_hero.html.erb | 50 ++ app/views/page/_integrations.html.erb | 49 ++ app/views/page/_newsletter.html.erb | 42 ++ app/views/page/home.html.erb | 14 + bin/bundle | 109 +++ bin/dev | 11 + bin/docker-entrypoint | 8 + bin/rails | 4 + bin/rake | 4 + bin/setup | 36 + bin/vite | 27 + config.ru | 6 + config/application.rb | 25 + config/boot.rb | 4 + config/cable.yml | 11 + config/credentials.yml.enc | 1 + config/database.yml | 84 +++ config/environment.rb | 5 + config/environments/development.rb | 76 +++ config/environments/production.rb | 97 +++ config/environments/test.rb | 64 ++ config/initializers/assets.rb | 12 + .../initializers/content_security_policy.rb | 34 + .../initializers/filter_parameter_logging.rb | 8 + config/initializers/inflections.rb | 16 + config/initializers/permissions_policy.rb | 13 + config/locales/en.yml | 31 + config/puma.rb | 34 + config/routes.rb | 5 + config/storage.yml | 34 + config/vite.json | 22 + db/seeds.rb | 9 + esbuild.config.mjs | 94 +++ index.html | 622 ------------------ lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 27 +- postcss.config.cjs => postcss.config.js | 0 public/404.html | 67 ++ public/422.html | 67 ++ public/500.html | 66 ++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/robots.txt | 1 + src/css/theme.css | 180 ----- src/main.js | 3 - storage/.keep | 0 tailwind.config.cjs => tailwind.config.js | 7 +- test/application_system_test_case.rb | 5 + .../application_cable/connection_test.rb | 13 + test/controllers/.keep | 0 test/controllers/page_controller_test.rb | 8 + test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 15 + vendor/.keep | 0 vite.config.ts | 17 + yarn.lock | 601 +++++++++++------ 120 files changed, 3070 insertions(+), 1075 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitattributes create mode 100644 .ruby-version create mode 100644 Dockerfile create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Procfile.dev create mode 100644 README.md create mode 100644 Rakefile create mode 100644 app/assets/builds/.keep create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep rename {images => app/assets/images}/boost.png (100%) rename {images => app/assets/images}/feature-image-01.png (100%) rename {images => app/assets/images}/formulus.png (100%) rename {images => app/assets/images}/glow-bottom.svg (100%) rename {images => app/assets/images}/hotwire.png (100%) rename {images => app/assets/images}/logo.svg (100%) rename {images => app/assets/images}/morph.png (100%) rename {images => app/assets/images}/power.png (100%) rename {images => app/assets/images}/stimulus-intellisense.png (100%) rename {images => app/assets/images}/stimulus.png (100%) rename {images => app/assets/images}/strada.png (100%) rename {images => app/assets/images}/turbo.png (100%) create mode 100644 app/assets/stylesheets/dartsass.scss create mode 100644 app/assets/stylesheets/tailwind.css create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/controllers/page_controller.rb create mode 100644 app/helpers/application_helper.rb create mode 100644 app/helpers/page_helper.rb create mode 100644 app/javascript/config/highlighter.js create mode 100644 app/javascript/config/index.js rename src/controllers/application.js => app/javascript/config/stimulus.js (100%) create mode 100644 app/javascript/config/swiper.js create mode 100644 app/javascript/config/turbo.js rename {src => app/javascript}/controllers/index.js (77%) rename src/style.css => app/javascript/css/application.css (81%) create mode 100644 app/javascript/css/theme.css rename {src => app/javascript}/css/utility-patterns.css (56%) create mode 100644 app/javascript/packs/application.js rename src/theme.js => app/javascript/src/highlighter.js (66%) create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100644 app/views/page/_about.html.erb create mode 100644 app/views/page/_ecosystem.html.erb create mode 100644 app/views/page/_features.html.erb create mode 100644 app/views/page/_footer.html.erb create mode 100644 app/views/page/_header.html.erb create mode 100644 app/views/page/_hero.html.erb create mode 100644 app/views/page/_integrations.html.erb create mode 100644 app/views/page/_newsletter.html.erb create mode 100644 app/views/page/home.html.erb create mode 100755 bin/bundle create mode 100755 bin/dev create mode 100755 bin/docker-entrypoint create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/vite create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/permissions_policy.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/storage.yml create mode 100644 config/vite.json create mode 100644 db/seeds.rb create mode 100644 esbuild.config.mjs create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep rename postcss.config.cjs => postcss.config.js (100%) create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/robots.txt delete mode 100644 src/css/theme.css delete mode 100644 src/main.js create mode 100644 storage/.keep rename tailwind.config.cjs => tailwind.config.js (91%) create mode 100644 test/application_system_test_case.rb create mode 100644 test/channels/application_cable/connection_test.rb create mode 100644 test/controllers/.keep create mode 100644 test/controllers/page_controller_test.rb create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 vendor/.keep create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..ca0f731c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,37 @@ +# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files. + +# Ignore git directory. +/.git/ + +# Ignore bundler config. +/.bundle + +# Ignore all default key files. +/config/master.key +/config/credentials/*.key + +# Ignore all environment files. +/.env* +!/.env.example + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/.keep + +# Ignore storage (uploaded files in development and any SQLite databases). +/storage/* +!/storage/.keep +/tmp/storage/* +!/tmp/storage/.keep + +# Ignore assets. +/node_modules/ +/app/assets/builds/* +!/app/assets/builds/.keep +/public/assets diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..8dc43234 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# See https://git-scm.com/docs/gitattributes for more about git attribute files. + +# Mark the database schema as having been generated. +db/schema.rb linguist-generated + +# Mark any vendored files as having been vendored. +vendor/* linguist-vendored +config/credentials/*.yml.enc diff=rails_credentials +config/credentials.yml.enc diff=rails_credentials diff --git a/.gitignore b/.gitignore index a547bf36..b955a294 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,40 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore storage (uploaded files in development and any SQLite databases). +/storage/* +!/storage/.keep +/tmp/storage/* +!/tmp/storage/ +!/tmp/storage/.keep + +/public/assets + +# Ignore master key for decrypting credentials and more. +/config/master.key + +/app/assets/builds/* +!/app/assets/builds/.keep + +/node_modules + # Logs logs *.log @@ -7,7 +44,6 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* -node_modules dist dist-ssr *.local @@ -22,3 +58,11 @@ dist-ssr *.njsproj *.sln *.sw? + +# Vite Ruby +/public/vite* +node_modules +# Vite uses dotenv and suggests to ignore local-only env files. See +# https://vitejs.dev/guide/env-and-mode.html#env-files +*.local + diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 00000000..be94e6f5 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.2.2 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..21260fa2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,79 @@ +# syntax = docker/dockerfile:1 + +# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile +ARG RUBY_VERSION=3.1.4 +FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base + +# Rails app lives here +WORKDIR /rails + +# Set production environment +ENV RAILS_ENV="production" \ + BUNDLE_DEPLOYMENT="1" \ + BUNDLE_PATH="/usr/local/bundle" \ + BUNDLE_WITHOUT="development" + + +# Throw-away build stage to reduce size of final image +FROM base as build + +# Install packages needed to build gems and node modules +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential curl git libpq-dev libvips node-gyp pkg-config python-is-python3 + +# Install JavaScript dependencies +ARG NODE_VERSION=20.5.1 +ARG YARN_VERSION=1.22.19 +ENV PATH=/usr/local/node/bin:$PATH +RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \ + /tmp/node-build-master/bin/node-build "${NODE_VERSION}" /usr/local/node && \ + npm install -g yarn@$YARN_VERSION && \ + rm -rf /tmp/node-build-master + + + +# Install application gems +COPY Gemfile Gemfile.lock ./ +RUN bundle install && \ + rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ + bundle exec bootsnap precompile --gemfile + + +# Install node modules +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + + +# Copy application code +COPY . . + +# Precompile bootsnap code for faster boot times +RUN bundle exec bootsnap precompile app/ lib/ + +# Precompiling assets for production without requiring secret RAILS_MASTER_KEY +RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile + + +# Final stage for app image +FROM base + +# Install packages needed for deployment +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y curl libvips postgresql-client && \ + rm -rf /var/lib/apt/lists /var/cache/apt/archives + +# Copy built artifacts: gems, application +COPY --from=build /usr/local/bundle /usr/local/bundle +COPY --from=build /rails /rails + +# Run and own only the runtime files as a non-root user for security +RUN useradd rails --create-home --shell /bin/bash && \ + chown -R rails:rails db log storage tmp +USER rails:rails + +# Entrypoint prepares the database. +ENTRYPOINT ["/rails/bin/docker-entrypoint"] + +# Start the server by default, this can be overwritten at runtime +EXPOSE 3000 +CMD ["./bin/rails", "server"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..2746d5fa --- /dev/null +++ b/Gemfile @@ -0,0 +1,75 @@ +source "https://rubygems.org" + +ruby "3.2.2" + +# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" +gem "rails", "~> 7.1.0.beta1" + +# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] +gem "sprockets-rails" + +# Use postgresql as the database for Active Record +gem "pg", "~> 1.1" + +# Use the Puma web server [https://github.com/puma/puma] +gem "puma", ">= 5.0" + +# Bundle and transpile JavaScript [https://github.com/rails/jsbundling-rails] +gem "jsbundling-rails" + +# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] +gem "turbo-rails" + +# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] +gem "stimulus-rails" + +# Bundle and process CSS [https://github.com/rails/cssbundling-rails] +gem "cssbundling-rails" + +# Vite.js in Ruby, bringing joy to your JavaScript experience +gem "vite_rails" + +# Build JSON APIs with ease [https://github.com/rails/jbuilder] +gem "jbuilder" + +# Use Redis adapter to run Action Cable in production +gem "redis", ">= 4.0.1" + +# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis] +# gem "kredis" + +# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] +# gem "bcrypt", "~> 3.1.7" + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: %i[ windows jruby ] + +# Reduces boot times through caching; required in config/boot.rb +gem "bootsnap", require: false + +# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] +# gem "image_processing", "~> 1.2" + +group :development, :test do + # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem + gem "debug", platforms: %i[ mri windows ] +end + +group :development do + # Use console on exceptions pages [https://github.com/rails/web-console] + gem "web-console" + + # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler] + # gem "rack-mini-profiler" + + # Speed up commands on slow machines / big apps [https://github.com/rails/spring] + # gem "spring" + + gem "error_highlight", ">= 0.4.0", platforms: [:ruby] +end + +group :test do + # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] + gem "capybara" + gem "selenium-webdriver" +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000..778739a0 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,279 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (7.1.0.beta1) + actionpack (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (7.1.0.beta1) + actionpack (= 7.1.0.beta1) + activejob (= 7.1.0.beta1) + activerecord (= 7.1.0.beta1) + activestorage (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.0.beta1) + actionpack (= 7.1.0.beta1) + actionview (= 7.1.0.beta1) + activejob (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.0.beta1) + actionview (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.0.beta1) + actionpack (= 7.1.0.beta1) + activerecord (= 7.1.0.beta1) + activestorage (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.1.0.beta1) + activesupport (= 7.1.0.beta1) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (7.1.0.beta1) + activesupport (= 7.1.0.beta1) + globalid (>= 0.3.6) + activemodel (7.1.0.beta1) + activesupport (= 7.1.0.beta1) + activerecord (7.1.0.beta1) + activemodel (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + timeout (>= 0.4.0) + activestorage (7.1.0.beta1) + actionpack (= 7.1.0.beta1) + activejob (= 7.1.0.beta1) + activerecord (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + marcel (~> 1.0) + activesupport (7.1.0.beta1) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + base64 (0.1.1) + bigdecimal (3.1.4) + bindex (0.8.1) + bootsnap (1.16.0) + msgpack (~> 1.2) + builder (3.2.4) + capybara (3.39.2) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + crass (1.0.6) + cssbundling-rails (1.3.2) + railties (>= 6.0.0) + date (3.3.3) + debug (1.8.0) + irb (>= 1.5.0) + reline (>= 0.3.1) + drb (2.1.1) + ruby2_keywords + dry-cli (1.0.0) + error_highlight (0.5.1) + erubi (1.12.0) + globalid (1.2.1) + activesupport (>= 6.1) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + io-console (0.6.0) + irb (1.8.1) + rdoc + reline (>= 0.3.8) + jbuilder (2.11.5) + actionview (>= 5.0.0) + activesupport (>= 5.0.0) + jsbundling-rails (1.2.1) + railties (>= 6.0.0) + loofah (2.21.3) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.0.2) + matrix (0.4.2) + mini_mime (1.1.5) + minitest (5.20.0) + msgpack (1.7.2) + mutex_m (0.1.2) + net-imap (0.3.7) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout + net-smtp (0.3.3) + net-protocol + nio4r (2.5.9) + nokogiri (1.15.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.15.4-x86_64-linux) + racc (~> 1.4) + pg (1.5.4) + psych (5.1.0) + stringio + public_suffix (5.0.3) + puma (6.3.1) + nio4r (~> 2.0) + racc (1.7.1) + rack (3.0.8) + rack-proxy (0.7.7) + rack + rack-session (2.0.0) + rack (>= 3.0.0) + rack-test (2.1.0) + rack (>= 1.3) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails (7.1.0.beta1) + actioncable (= 7.1.0.beta1) + actionmailbox (= 7.1.0.beta1) + actionmailer (= 7.1.0.beta1) + actionpack (= 7.1.0.beta1) + actiontext (= 7.1.0.beta1) + actionview (= 7.1.0.beta1) + activejob (= 7.1.0.beta1) + activemodel (= 7.1.0.beta1) + activerecord (= 7.1.0.beta1) + activestorage (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + bundler (>= 1.15.0) + railties (= 7.1.0.beta1) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (7.1.0.beta1) + actionpack (= 7.1.0.beta1) + activesupport (= 7.1.0.beta1) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) + rake (13.0.6) + rdoc (6.5.0) + psych (>= 4.0.0) + redis (5.0.7) + redis-client (>= 0.9.0) + redis-client (0.17.0) + connection_pool + regexp_parser (2.8.1) + reline (0.3.8) + io-console (~> 0.5) + rexml (3.2.6) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + selenium-webdriver (4.12.0) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) + sprockets (4.2.1) + concurrent-ruby (~> 1.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + sprockets (>= 3.0.0) + stimulus-rails (1.2.2) + railties (>= 6.0.0) + stringio (3.0.8) + thor (1.2.2) + timeout (0.4.0) + turbo-rails (1.4.0) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + vite_rails (3.0.15) + railties (>= 5.1, < 8) + vite_ruby (~> 3.0, >= 3.2.2) + vite_ruby (3.3.4) + dry-cli (>= 0.7, < 2) + rack-proxy (~> 0.6, >= 0.6.1) + zeitwerk (~> 2.2) + web-console (4.2.1) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) + bindex (>= 0.4.0) + railties (>= 6.0.0) + webrick (1.8.1) + websocket (1.2.9) + websocket-driver (0.7.6) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.6.11) + +PLATFORMS + x86_64-darwin-22 + x86_64-linux + +DEPENDENCIES + bootsnap + capybara + cssbundling-rails + debug + error_highlight (>= 0.4.0) + jbuilder + jsbundling-rails + pg (~> 1.1) + puma (>= 5.0) + rails (~> 7.1.0.beta1) + redis (>= 4.0.1) + selenium-webdriver + sprockets-rails + stimulus-rails + turbo-rails + tzinfo-data + vite_rails + web-console + +RUBY VERSION + ruby 3.2.2p53 + +BUNDLED WITH + 2.4.17 diff --git a/Procfile.dev b/Procfile.dev new file mode 100644 index 00000000..04d83508 --- /dev/null +++ b/Procfile.dev @@ -0,0 +1,2 @@ +web: env RUBY_DEBUG_OPEN=true bin/rails server +vite: vite: bin/vite dev diff --git a/README.md b/README.md new file mode 100644 index 00000000..7db80e4c --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000..9a5ea738 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative "config/application" + +Rails.application.load_tasks diff --git a/app/assets/builds/.keep b/app/assets/builds/.keep new file mode 100644 index 00000000..e69de29b diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 00000000..9a99757a --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,2 @@ +//= link_tree ../images +//= link_tree ../builds diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 00000000..e69de29b diff --git a/images/boost.png b/app/assets/images/boost.png similarity index 100% rename from images/boost.png rename to app/assets/images/boost.png diff --git a/images/feature-image-01.png b/app/assets/images/feature-image-01.png similarity index 100% rename from images/feature-image-01.png rename to app/assets/images/feature-image-01.png diff --git a/images/formulus.png b/app/assets/images/formulus.png similarity index 100% rename from images/formulus.png rename to app/assets/images/formulus.png diff --git a/images/glow-bottom.svg b/app/assets/images/glow-bottom.svg similarity index 100% rename from images/glow-bottom.svg rename to app/assets/images/glow-bottom.svg diff --git a/images/hotwire.png b/app/assets/images/hotwire.png similarity index 100% rename from images/hotwire.png rename to app/assets/images/hotwire.png diff --git a/images/logo.svg b/app/assets/images/logo.svg similarity index 100% rename from images/logo.svg rename to app/assets/images/logo.svg diff --git a/images/morph.png b/app/assets/images/morph.png similarity index 100% rename from images/morph.png rename to app/assets/images/morph.png diff --git a/images/power.png b/app/assets/images/power.png similarity index 100% rename from images/power.png rename to app/assets/images/power.png diff --git a/images/stimulus-intellisense.png b/app/assets/images/stimulus-intellisense.png similarity index 100% rename from images/stimulus-intellisense.png rename to app/assets/images/stimulus-intellisense.png diff --git a/images/stimulus.png b/app/assets/images/stimulus.png similarity index 100% rename from images/stimulus.png rename to app/assets/images/stimulus.png diff --git a/images/strada.png b/app/assets/images/strada.png similarity index 100% rename from images/strada.png rename to app/assets/images/strada.png diff --git a/images/turbo.png b/app/assets/images/turbo.png similarity index 100% rename from images/turbo.png rename to app/assets/images/turbo.png diff --git a/app/assets/stylesheets/dartsass.scss b/app/assets/stylesheets/dartsass.scss new file mode 100644 index 00000000..5ac228c1 --- /dev/null +++ b/app/assets/stylesheets/dartsass.scss @@ -0,0 +1,2 @@ +@import 'devicon/devicon.min.css'; +@import 'swiper/swiper-bundle.css'; diff --git a/app/assets/stylesheets/tailwind.css b/app/assets/stylesheets/tailwind.css new file mode 100644 index 00000000..c17da76e --- /dev/null +++ b/app/assets/stylesheets/tailwind.css @@ -0,0 +1,12 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;800&display=fallback'); + +@tailwind base; +@tailwind components; + +@import '~devicon/devicon.min.css'; +@import '~swiper/swiper-bundle.css'; + +@import 'css/utility-patterns.css'; +@import 'css/theme.css'; + +@tailwind utilities; diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 00000000..d6726972 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 00000000..0ff5442f --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 00000000..09705d12 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 00000000..e69de29b diff --git a/app/controllers/page_controller.rb b/app/controllers/page_controller.rb new file mode 100644 index 00000000..bf7889e3 --- /dev/null +++ b/app/controllers/page_controller.rb @@ -0,0 +1,4 @@ +class PageController < ApplicationController + def home + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 00000000..de6be794 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/helpers/page_helper.rb b/app/helpers/page_helper.rb new file mode 100644 index 00000000..625cfe4e --- /dev/null +++ b/app/helpers/page_helper.rb @@ -0,0 +1,2 @@ +module PageHelper +end diff --git a/app/javascript/config/highlighter.js b/app/javascript/config/highlighter.js new file mode 100644 index 00000000..505f7a54 --- /dev/null +++ b/app/javascript/config/highlighter.js @@ -0,0 +1,5 @@ +import { Highlighter } from "../src/highlighter" + +document.querySelectorAll('[data-highlighter]').forEach((highlighter) => { + new Highlighter(highlighter); +}); diff --git a/app/javascript/config/index.js b/app/javascript/config/index.js new file mode 100644 index 00000000..a493105a --- /dev/null +++ b/app/javascript/config/index.js @@ -0,0 +1,4 @@ +import "./stimulus" +import "./turbo" +import "./swiper" +import "./highlighter" diff --git a/src/controllers/application.js b/app/javascript/config/stimulus.js similarity index 100% rename from src/controllers/application.js rename to app/javascript/config/stimulus.js diff --git a/app/javascript/config/swiper.js b/app/javascript/config/swiper.js new file mode 100644 index 00000000..9b4bf98f --- /dev/null +++ b/app/javascript/config/swiper.js @@ -0,0 +1,26 @@ +import Swiper from 'swiper' + +document.querySelectorAll('.carousel').forEach(element => { + new Swiper(element, { + breakpoints: { + 320: { + slidesPerView: 1 + }, + 640: { + slidesPerView: 2 + }, + 1024: { + slidesPerView: 3 + } + }, + grabCursor: true, + loop: false, + centeredSlides: false, + initialSlide: 1 , + spaceBetween: 24, + navigation: { + nextEl: '.carousel-next', + prevEl: '.carousel-prev', + }, + }); +}) diff --git a/app/javascript/config/turbo.js b/app/javascript/config/turbo.js new file mode 100644 index 00000000..ffef3b08 --- /dev/null +++ b/app/javascript/config/turbo.js @@ -0,0 +1 @@ +import "@hotwired/turbo-rails" diff --git a/src/controllers/index.js b/app/javascript/controllers/index.js similarity index 77% rename from src/controllers/index.js rename to app/javascript/controllers/index.js index 0303608b..b2a985fb 100644 --- a/src/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -1,5 +1,6 @@ -import { application } from "./application" +import { application } from "../config/stimulus" import { registerControllers } from "stimulus-vite-helpers" const controllers = import.meta.globEager("./**/*_controller.js") + registerControllers(application, controllers) diff --git a/src/style.css b/app/javascript/css/application.css similarity index 81% rename from src/style.css rename to app/javascript/css/application.css index b4b18186..5cca0e2b 100644 --- a/src/style.css +++ b/app/javascript/css/application.css @@ -6,7 +6,7 @@ @import 'devicon/devicon.min.css'; @import 'swiper/swiper-bundle.css'; -@import 'css/utility-patterns.css'; -@import 'css/theme.css'; +@import './utility-patterns.css'; +@import './theme.css'; @import 'tailwindcss/utilities'; diff --git a/app/javascript/css/theme.css b/app/javascript/css/theme.css new file mode 100644 index 00000000..09557ed0 --- /dev/null +++ b/app/javascript/css/theme.css @@ -0,0 +1,180 @@ +.form-input:focus, +.form-textarea:focus, +.form-multiselect:focus, +.form-select:focus, +.form-checkbox:focus, +.form-radio:focus { + @apply ring-0; +} + +/* Hamburger button */ +.hamburger svg>*:nth-child(1), +.hamburger svg>*:nth-child(2), +.hamburger svg>*:nth-child(3) { + transform-origin: center; + transform: rotate(0deg); +} + +.hamburger svg>*:nth-child(1) { + transition: y 0.1s 0.25s ease-in, transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19), opacity 0.1s ease-in; +} + +.hamburger svg>*:nth-child(2) { + transition: transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.hamburger svg>*:nth-child(3) { + transition: y 0.1s 0.25s ease-in, transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19), width 0.1s 0.25s ease-in; +} + +.hamburger.active svg>*:nth-child(1) { + opacity: 0; + y: 11; + transform: rotate(225deg); + transition: y 0.1s ease-out, transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.1s 0.12s ease-out; +} + +.hamburger.active svg>*:nth-child(2) { + transform: rotate(225deg); + transition: transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1); +} + +.hamburger.active svg>*:nth-child(3) { + y: 11; + transform: rotate(135deg); + transition: y 0.1s ease-out, transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1), width 0.1s ease-out; +} + +/* Custom Swiper styles */ +.swiper-button-disabled { + @apply opacity-50 cursor-default pointer-events-none; +} + +.testimonials-carousel .swiper-slide { + @apply opacity-80; +} + +.testimonials-carousel .swiper-slide.swiper-slide-active { + @apply opacity-100; +} + +/* Pulsing animation */ +@keyframes pulseLoop { + 0% { + opacity: 0; + transform: scale(.25) translateZ(0); + } + + 30% { + opacity: .4; + } + + 70% { + opacity: 0; + } + + 80% { + transform: scale(1) translateZ(0); + } +} + +.pulse { + opacity: 0; + transform-origin: center; + animation: pulseLoop 12000ms linear infinite; +} + +.pulse-1 { + animation-delay: -4000ms; +} + +.pulse-2 { + animation-delay: -8000ms; +} + +.translate-z-0 { + transform: translateZ(0); +} + +/* Custom AOS distance */ +@media screen { + html:not(.no-js) [data-aos=fade-up] { + -webkit-transform: translate3d(0, 14px, 0); + transform: translate3d(0, 14px, 0); + } + + html:not(.no-js) [data-aos=fade-down] { + -webkit-transform: translate3d(0, -14px, 0); + transform: translate3d(0, -14px, 0); + } + + html:not(.no-js) [data-aos=fade-right] { + -webkit-transform: translate3d(-14px, 0, 0); + transform: translate3d(-14px, 0, 0); + } + + html:not(.no-js) [data-aos=fade-left] { + -webkit-transform: translate3d(14px, 0, 0); + transform: translate3d(14px, 0, 0); + } + + html:not(.no-js) [data-aos=fade-up-right] { + -webkit-transform: translate3d(-14px, 14px, 0); + transform: translate3d(-14px, 14px, 0); + } + + html:not(.no-js) [data-aos=fade-up-left] { + -webkit-transform: translate3d(14px, 14px, 0); + transform: translate3d(14px, 14px, 0); + } + + html:not(.no-js) [data-aos=fade-down-right] { + -webkit-transform: translate3d(-14px, -14px, 0); + transform: translate3d(-14px, -14px, 0); + } + + html:not(.no-js) [data-aos=fade-down-left] { + -webkit-transform: translate3d(14px, -14px, 0); + transform: translate3d(14px, -14px, 0); + } + + html:not(.no-js) [data-aos=zoom-in-up] { + -webkit-transform: translate3d(0, 14px, 0) scale(.6); + transform: translate3d(0, 14px, 0) scale(.6); + } + + html:not(.no-js) [data-aos=zoom-in-down] { + -webkit-transform: translate3d(0, -14px, 0) scale(.6); + transform: translate3d(0, -14px, 0) scale(.6); + } + + html:not(.no-js) [data-aos=zoom-in-right] { + -webkit-transform: translate3d(-14px, 0, 0) scale(.6); + transform: translate3d(-14px, 0, 0) scale(.6); + } + + html:not(.no-js) [data-aos=zoom-in-left] { + -webkit-transform: translate3d(14px, 0, 0) scale(.6); + transform: translate3d(14px, 0, 0) scale(.6); + } + + html:not(.no-js) [data-aos=zoom-out-up] { + -webkit-transform: translate3d(0, 14px, 0) scale(1.2); + transform: translate3d(0, 14px, 0) scale(1.2); + } + + html:not(.no-js) [data-aos=zoom-out-down] { + -webkit-transform: translate3d(0, -14px, 0) scale(1.2); + transform: translate3d(0, -14px, 0) scale(1.2); + } + + html:not(.no-js) [data-aos=zoom-out-right] { + -webkit-transform: translate3d(-14px, 0, 0) scale(1.2); + transform: translate3d(-14px, 0, 0) scale(1.2); + } + + html:not(.no-js) [data-aos=zoom-out-left] { + -webkit-transform: translate3d(14px, 0, 0) scale(1.2); + transform: translate3d(14px, 0, 0) scale(1.2); + } +} diff --git a/src/css/utility-patterns.css b/app/javascript/css/utility-patterns.css similarity index 56% rename from src/css/utility-patterns.css rename to app/javascript/css/utility-patterns.css index 6f993813..f45bcf7d 100644 --- a/src/css/utility-patterns.css +++ b/app/javascript/css/utility-patterns.css @@ -1,46 +1,46 @@ /* Typography */ .h1 { - @apply text-5xl font-extrabold; + @apply text-5xl font-extrabold; } .h2 { - @apply text-4xl font-extrabold; + @apply text-4xl font-extrabold; } .h3 { - @apply text-3xl font-extrabold; + @apply text-3xl font-extrabold; } .h4 { - @apply text-2xl font-extrabold; + @apply text-2xl font-extrabold; } @screen md { - .h1 { - @apply text-6xl; - } + .h1 { + @apply text-6xl; + } - .h2 { - @apply text-5xl; - } + .h2 { + @apply text-5xl; + } - .h3 { - @apply text-4xl; - } + .h3 { + @apply text-4xl; + } } /* Buttons */ .btn, .btn-sm { - @apply text-sm font-medium inline-flex items-center justify-center border border-transparent rounded-full transition duration-150 ease-in-out; + @apply text-sm font-medium inline-flex items-center justify-center border border-transparent rounded-full transition duration-150 ease-in-out; } .btn { - @apply px-4 py-1.5; + @apply px-4 py-1.5; } .btn-sm { - @apply px-3 py-1; + @apply px-3 py-1; } /* Forms */ @@ -57,7 +57,7 @@ input[type="search"]::-webkit-search-results-decoration { .form-select, .form-checkbox, .form-radio { - @apply bg-slate-800 border border-transparent focus:border-purple-500; + @apply bg-slate-800 border border-transparent focus:border-purple-500; } .form-input, @@ -65,28 +65,28 @@ input[type="search"]::-webkit-search-results-decoration { .form-multiselect, .form-select, .form-checkbox { - @apply rounded; + @apply rounded; } .form-input, .form-textarea, .form-multiselect, .form-select { - @apply text-slate-200 text-sm px-3 py-1.5; + @apply text-slate-200 text-sm px-3 py-1.5; } .form-input, .form-textarea { - @apply placeholder-slate-500; + @apply placeholder-slate-500; } .form-select { - @apply pr-10; + @apply pr-10; } .form-checkbox, .form-radio { - @apply text-purple-600 rounded-sm; + @apply text-purple-600 rounded-sm; } /* Chrome, Safari and Opera */ @@ -97,4 +97,4 @@ input[type="search"]::-webkit-search-results-decoration { .no-scrollbar { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ -} \ No newline at end of file +} diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js new file mode 100644 index 00000000..4a8e2164 --- /dev/null +++ b/app/javascript/packs/application.js @@ -0,0 +1,3 @@ +import "../config" +import "../controllers" +import "../css/application.css" diff --git a/src/theme.js b/app/javascript/src/highlighter.js similarity index 66% rename from src/theme.js rename to app/javascript/src/highlighter.js index d03e0eb4..d7910eec 100644 --- a/src/theme.js +++ b/app/javascript/src/highlighter.js @@ -1,32 +1,4 @@ -import Swiper from 'swiper' - -document.querySelectorAll('.carousel').forEach(element => { - new Swiper(element, { - breakpoints: { - 320: { - slidesPerView: 1 - }, - 640: { - slidesPerView: 2 - }, - 1024: { - slidesPerView: 3 - } - }, - grabCursor: true, - loop: false, - centeredSlides: false, - initialSlide: 1 , - spaceBetween: 24, - navigation: { - nextEl: '.carousel-next', - prevEl: '.carousel-prev', - }, - }); -}) - -// Box highlighter -class Highlighter { +export class Highlighter { constructor(containerElement) { this.container = containerElement; this.boxes = Array.from(this.container.children); @@ -73,9 +45,3 @@ class Highlighter { window.addEventListener('mousemove', this.onMouseMove); } } - -// Init Highlighter -const highlighters = document.querySelectorAll('[data-highlighter]'); -highlighters.forEach((highlighter) => { - new Highlighter(highlighter); -}); diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 00000000..d394c3d1 --- /dev/null +++ b/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/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 00000000..3c34c814 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: "from@example.com" + layout "mailer" +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 00000000..b63caeb8 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + primary_abstract_class +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 00000000..e69de29b diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 00000000..91049b68 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,23 @@ + + + + Hotwire.io + + + + + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + <%= vite_client_tag %> + + <%= vite_javascript_tag "packs/application", media: 'all', "data-turbo-track": "reload" %> + <%= vite_stylesheet_tag "packs/application", media: 'all', "data-turbo-track": "reload" unless ViteRuby.instance.dev_server_running? %> + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 00000000..3aac9002 --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 00000000..37f0bddb --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/app/views/page/_about.html.erb b/app/views/page/_about.html.erb new file mode 100644 index 00000000..f07d40b3 --- /dev/null +++ b/app/views/page/_about.html.erb @@ -0,0 +1,45 @@ +
+ + + + +
+
+ + +
+

Turn your framework into a full-stack framework

+

+ Hotwire is the catalyst that transforms your backend framework into a complete full-stack powerhouse. It's not just an extension; it's the missing link that takes your web development to the next level. +

+
+ +
+
+
+
+
+ + + " width="768" height="400" alt="Feature 04"> +
+
+
+
+
+ +
+
+
diff --git a/app/views/page/_ecosystem.html.erb b/app/views/page/_ecosystem.html.erb new file mode 100644 index 00000000..cfb2cb12 --- /dev/null +++ b/app/views/page/_ecosystem.html.erb @@ -0,0 +1,101 @@ +
+
+
+ + +
+
+
Official and Third-Party Plugins
+
+

Rich Plugin System

+

+ Effortlessly extend and customize your Hotwire applications with our plug-n-play ecosystem. Discover a wealth of third-party integrations and tools. +

+
+ +
+ +
+ + +
+ + +
+ +
+
+
diff --git a/app/views/page/_features.html.erb b/app/views/page/_features.html.erb new file mode 100644 index 00000000..47297f09 --- /dev/null +++ b/app/views/page/_features.html.erb @@ -0,0 +1,219 @@ +
+ +
+
+ + +
+

+ Faster. Smarter. +

+

+ Breathe life into your server-rendered applications by progressively enhancing them into full SPA-like applications. Hotwire's JavaScript sprinkles add just the right touch of interactivity, transforming your web experience without the need for a fully-blown front-end framework. +

+
+ + +
+ + +
+ +
+
+
+
+ + + + + + + +
+
+
+

+ Rich Ecosystem +

+

+ Unlock a world of possibilities with Hotwire's rich ecosystem. Explore a wide range of tools, plugins, and resources to streamline your web development projects. +

+
+
+ +
+ +
+ " width="504" height="400" alt="Feature 01"> +
+
+
+
+
+ +
+
+
+
+ + + +
+
+

+ Optimized for productivity +

+

+ Intuitive features and robust tools empower you to focus on what truly matters—building exceptional web applications. +

+
+
+
+
+
+
+ +
+
+
+
+ + + +
+
+

+ JavaScript Sprinkles +

+

+ Enhance your user interface with just the right amount of JavaScript. Hotwire's JavaScript sprinkles add interactivity without overwhelming your codebase. +

+
+
+
+
+
+
+
+
+ + +
+ +
+
+ + + +

+ Powerful Core +

+
+

+ Access powerful core libraries that simplify complex tasks. Hotwire provides the essential building blocks to create fast, interactive web applications effortlessly. +

+
+ +
+
+ + + +

+ Hybrid Native Applications +

+
+

+ Take your web apps to the next level with Turbo Native. Build hybrid native applications using your existing web development skills and Hotwire's magic. +

+
+ +
+
+ + + +

+ Plug-n-Play Ecosystem +

+
+

+ Effortlessly extend and customize your Hotwire applications with our plug-n-play ecosystem. Discover a wealth of third-party integrations and tools. +

+
+ +
+
+ + + +

+ Community +

+
+

+ A vibrant ecosystem of developers, enthusiasts, and innovators. Connect, collaborate, and learn from fellow members who share your passion for crafting exceptional web experiences. +

+
+ +
+
+ + + +

+ Hotwire Weekly Newsletter +

+
+

+ Stay in the loop with the latest updates, tips, and best practices. Subscribe to our Hotwire Weekly Newsletter and join a thriving community of web developers. +

+
+ +
+
+ + + +

+ Integrates with your favorite SSR-framework +

+
+

+ Integrate Hotwire seamlessly into your preferred SSR-framework. The flexibility of the Hotwire approach supports a wide range of tech stacks. +

+
+
+ +
+
+
diff --git a/app/views/page/_footer.html.erb b/app/views/page/_footer.html.erb new file mode 100644 index 00000000..e9dbc4cc --- /dev/null +++ b/app/views/page/_footer.html.erb @@ -0,0 +1,69 @@ + diff --git a/app/views/page/_header.html.erb b/app/views/page/_header.html.erb new file mode 100644 index 00000000..565a1b81 --- /dev/null +++ b/app/views/page/_header.html.erb @@ -0,0 +1,22 @@ +
+ +
diff --git a/app/views/page/_hero.html.erb b/app/views/page/_hero.html.erb new file mode 100644 index 00000000..729179cc --- /dev/null +++ b/app/views/page/_hero.html.erb @@ -0,0 +1,50 @@ +
+
+ + + +
+ + +
+ +

+ The JavaScript Ecosystem for Server-rendered Web-Applications +

+

+ Hotwire is an alternative approach to building modern web applications without using much JavaScript by sending HTML instead of JSON over the wire. +

+ + +
+ +
+
+
diff --git a/app/views/page/_integrations.html.erb b/app/views/page/_integrations.html.erb new file mode 100644 index 00000000..23b3234e --- /dev/null +++ b/app/views/page/_integrations.html.erb @@ -0,0 +1,49 @@ +
+
+
+ + +
+
+
+ Integrates with your favorite framework +
+
+

+ Framework Integrations +

+

+ The Hotwire approach is compatible with any server-side rendered framework. +

+
+ + +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+
diff --git a/app/views/page/_newsletter.html.erb b/app/views/page/_newsletter.html.erb new file mode 100644 index 00000000..bd710f5a --- /dev/null +++ b/app/views/page/_newsletter.html.erb @@ -0,0 +1,42 @@ +
+
+
+ + + + + +
+
+
+ Subscribe to our weekly newsletter +
+
+

+ Stay Ahead of the Curve with Hotwire Weekly! +

+

+ Don't miss out on the latest trends, insights, and innovations in the world of Hotwire. Join our growing community of passionate developers today! Subscribe now for a weekly dose of Hotwire goodness delivered right to your inbox. +

+ +
+
+
+
diff --git a/app/views/page/home.html.erb b/app/views/page/home.html.erb new file mode 100644 index 00000000..ce46f2e5 --- /dev/null +++ b/app/views/page/home.html.erb @@ -0,0 +1,14 @@ +
+ <%= render partial: "header" %> + +
+ <%= render partial: "hero" %> + <%= render partial: "features" %> + <%= render partial: "about" %> + <%= render partial: "integrations" %> + <%= render partial: "ecosystem" %> + <%= render partial: "newsletter" %> +
+ + <%= render partial: "footer" %> +
diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 00000000..42c7fd7c --- /dev/null +++ b/bin/bundle @@ -0,0 +1,109 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'bundle' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "rubygems" + +m = Module.new do + module_function + + def invoked_as_script? + File.expand_path($0) == File.expand_path(__FILE__) + end + + def env_var_version + ENV["BUNDLER_VERSION"] + end + + def cli_arg_version + return unless invoked_as_script? # don't want to hijack other binstubs + return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` + bundler_version = nil + update_index = nil + ARGV.each_with_index do |a, i| + if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN + bundler_version = a + end + next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ + bundler_version = $1 + update_index = i + end + bundler_version + end + + def gemfile + gemfile = ENV["BUNDLE_GEMFILE"] + return gemfile if gemfile && !gemfile.empty? + + File.expand_path("../Gemfile", __dir__) + end + + def lockfile + lockfile = + case File.basename(gemfile) + when "gems.rb" then gemfile.sub(/\.rb$/, ".locked") + else "#{gemfile}.lock" + end + File.expand_path(lockfile) + end + + def lockfile_version + return unless File.file?(lockfile) + lockfile_contents = File.read(lockfile) + return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ + Regexp.last_match(1) + end + + def bundler_requirement + @bundler_requirement ||= + env_var_version || + cli_arg_version || + bundler_requirement_for(lockfile_version) + end + + def bundler_requirement_for(version) + return "#{Gem::Requirement.default}.a" unless version + + bundler_gem_version = Gem::Version.new(version) + + bundler_gem_version.approximate_recommendation + end + + def load_bundler! + ENV["BUNDLE_GEMFILE"] ||= gemfile + + activate_bundler + end + + def activate_bundler + gem_error = activation_error_handling do + gem "bundler", bundler_requirement + end + return if gem_error.nil? + require_error = activation_error_handling do + require "bundler/version" + end + return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) + warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" + exit 42 + end + + def activation_error_handling + yield + nil + rescue StandardError, LoadError => e + e + end +end + +m.load_bundler! + +if m.invoked_as_script? + load Gem.bin_path("bundler", "bundle") +end diff --git a/bin/dev b/bin/dev new file mode 100755 index 00000000..a4e05fa1 --- /dev/null +++ b/bin/dev @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +if ! gem list foreman -i --silent; then + echo "Installing foreman..." + gem install foreman +fi + +# Default to port 3000 if not specified +export PORT="${PORT:-3000}" + +exec foreman start -f Procfile.dev "$@" diff --git a/bin/docker-entrypoint b/bin/docker-entrypoint new file mode 100755 index 00000000..dffd4ba9 --- /dev/null +++ b/bin/docker-entrypoint @@ -0,0 +1,8 @@ +#!/bin/bash -e + +# If running the rails server then create or migrate existing database +if [ "${*}" == "./bin/rails server" ]; then + ./bin/rails db:prepare +fi + +exec "${@}" diff --git a/bin/rails b/bin/rails new file mode 100755 index 00000000..efc03774 --- /dev/null +++ b/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/bin/rake b/bin/rake new file mode 100755 index 00000000..4fbf10b9 --- /dev/null +++ b/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "rake" +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 00000000..d38bf9f8 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require "fileutils" + +# path to your application root. +APP_ROOT = File.expand_path("..", __dir__) + +def system!(*args) + system(*args, exception: true) +end + +FileUtils.chdir APP_ROOT do + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. + # Add necessary setup steps to this file. + + puts "== Installing dependencies ==" + system! "gem install bundler --conservative" + system("bundle check") || system!("bundle install") + + # Install JavaScript dependencies + system("yarn check --check-files") || system!("yarn install") + + # puts "\n== Copying sample files ==" + # unless File.exist?("config/database.yml") + # FileUtils.cp "config/database.yml.sample", "config/database.yml" + # end + + puts "\n== Preparing database ==" + system! "bin/rails db:prepare" + + puts "\n== Removing old logs and tempfiles ==" + system! "bin/rails log:clear tmp:clear" + + puts "\n== Restarting application server ==" + system! "bin/rails restart" +end diff --git a/bin/vite b/bin/vite new file mode 100755 index 00000000..5da3388e --- /dev/null +++ b/bin/vite @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'vite' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("vite_ruby", "vite") diff --git a/config.ru b/config.ru new file mode 100644 index 00000000..4a3c09a6 --- /dev/null +++ b/config.ru @@ -0,0 +1,6 @@ +# This file is used by Rack-based servers to start the application. + +require_relative "config/environment" + +run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 00000000..86902939 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,25 @@ +require_relative "boot" + +require "rails/all" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Hotwire + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 7.1 + + # Please, see https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#config-autoload-lib-ignore. + config.autoload_lib(ignore: %w(assets tasks)) + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 00000000..988a5ddc --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "bundler/setup" # Set up gems listed in the Gemfile. +require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 00000000..89cf959f --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,11 @@ +development: + adapter: redis + url: redis://localhost:6379/1 + +test: + adapter: test + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: hotwire_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 00000000..394db02d --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +MGRwi5ZxSOQsfN+IPL0unnz4NVlQoiBcK2cFzZviWBUOEKnUogYolsjGkKOQ/0uJQneLiT9Xqsl2h6f5YcSvmV7QiR7NW0GPn7y2wzYXqojJFruS9mmE3ysKCO95uyg/99ypgqOY3V07aw0dPVm/mGRDHFO2GgvWC7QYeuGxu6YAYJkWGne0eVy2mBDkwB9WCyEklk8/pmKRiIUasrS+pYyg51fOp51cVgRnZmuLRvG/PBRPjafeO5IckIt51xsb2WujOmX27lbQNRHhCBr9hA3aChE4eTaw5Spo4rzF9MnwMNop99c7lSuogdWmWa9LoFnt9UzkBHA9bO2TueHBk7V8rM0R0lx0V8SBTEQc+hm+xFBayjUIvjRl0jzaMyQvr7XyU8NH1uDNdtO1AviRpEzbOf/X--8WjjnrGeGTX/ADQn--pZpRrHg3cnjBw7kKs7d2Pw== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 00000000..8382ce13 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,84 @@ +# PostgreSQL. Versions 9.3 and up are supported. +# +# Install the pg driver: +# gem install pg +# On macOS with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem "pg" +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # https://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: hotwire_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user running Rails. + #username: hotwire + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: hotwire_test + +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password or a full connection URL as an environment +# variable when you boot the app. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# If the connection URL is provided in the special DATABASE_URL environment +# variable, Rails will automatically merge its configuration values on top of +# the values provided in this file. Alternatively, you can specify a connection +# URL environment variable explicitly: +# +# production: +# url: <%= ENV["MY_APP_DATABASE_URL"] %> +# +# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full overview on how database connection configuration can be specified. +# +production: + <<: *default + database: hotwire_production + username: hotwire + password: <%= ENV["HOTWIRE_DATABASE_PASSWORD"] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 00000000..cac53157 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative "application" + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 00000000..2e7fb486 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,76 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded any time + # it changes. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.enable_reloading = true + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable server timing + config.server_timing = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join("tmp/caching-dev.txt").exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + "Cache-Control" => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Highlight code that enqueued background job in logs. + config.active_job.verbose_enqueue_logs = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true + + # Raise error when a before_action's only/except options reference missing actions + config.action_controller.raise_on_missing_callback_actions = true +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 00000000..e2b3c77f --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,97 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.enable_reloading = false + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment + # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Enable static file serving from the `/public` folder (turn off if using NGINX/Apache for it). + config.public_file_server.enabled = true + + # Compress CSS using a preprocessor. + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.asset_host = "http://assets.example.com" + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache + # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain. + # config.action_cable.mount_path = nil + # config.action_cable.url = "wss://example.com/cable" + # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ] + + # Assume all access to the app is happening through a SSL-terminating reverse proxy. + # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies. + # config.assume_ssl = true + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + config.force_ssl = true + + # Log to STDOUT by default + config.logger = ActiveSupport::Logger.new(STDOUT) + .tap { |logger| logger.formatter = ::Logger::Formatter.new } + .then { |logger| ActiveSupport::TaggedLogging.new(logger) } + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Info include generic and useful information about system operation, but avoids logging too much + # information to avoid inadvertent exposure of personally identifiable information (PII). If you + # want to log everything, set the level to "debug". + config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment). + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "hotwire_production" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Don't log any deprecations. + config.active_support.report_deprecations = false + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false + + # Enable DNS rebinding protection and other `Host` header attacks. + # config.hosts = [ + # "example.com", # Allow requests from example.com + # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` + # ] + # Skip DNS rebinding protection for the default health check endpoint. + # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 00000000..0dda9f9f --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,64 @@ +require "active_support/core_ext/integer/time" + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # While tests run files are not watched, reloading is not necessary. + config.enable_reloading = false + + # Eager loading loads your entire application. When running a single test locally, + # this is usually not necessary, and can slow down your test suite. However, it's + # recommended that you enable it in continuous integration systems to ensure eager + # loading is working properly before deploying your code. + config.eager_load = ENV["CI"].present? + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + "Cache-Control" => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + config.cache_store = :null_store + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = :rescuable + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + # Raise error when a before_action's only/except options reference missing actions + config.action_controller.raise_on_missing_callback_actions = true +end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 00000000..2eeef966 --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,12 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = "1.0" + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 00000000..aa21c5fe --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,34 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy. +# See the Securing Rails Applications Guide for more information: +# https://guides.rubyonrails.org/security.html#content-security-policy-header + +# Rails.application.configure do +# config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https + # Allow @vite/client to hot reload javascript changes in development +# policy.script_src *policy.script_src, :unsafe_eval, "http://#{ ViteRuby.config.host_with_port }" if Rails.env.development? + + # You may need to enable this in production as well depending on your setup. +# policy.script_src *policy.script_src, :blob if Rails.env.test? + +# policy.style_src :self, :https + # Allow @vite/client to hot reload style changes in development +# policy.style_src *policy.style_src, :unsafe_inline if Rails.env.development? + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end +# +# # Generate session nonces for permitted importmap, inline scripts, and inline styles. +# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } +# config.content_security_policy_nonce_directives = %w(script-src style-src) +# +# # Report violations without enforcing the policy. +# # config.content_security_policy_report_only = true +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 00000000..adc6568c --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# Configure parameters to be filtered from the log file. Use this to limit dissemination of +# sensitive information. See the ActiveSupport::ParameterFilter documentation for supported +# notations and behaviors. +Rails.application.config.filter_parameters += [ + :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn +] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 00000000..3860f659 --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, "\\1en" +# inflect.singular /^(ox)en/i, "\\1" +# inflect.irregular "person", "people" +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym "RESTful" +# end diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb new file mode 100644 index 00000000..7db3b957 --- /dev/null +++ b/config/initializers/permissions_policy.rb @@ -0,0 +1,13 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide HTTP permissions policy. For further +# information see: https://developers.google.com/web/updates/2018/06/feature-policy + +# Rails.application.config.permissions_policy do |policy| +# policy.camera :none +# policy.gyroscope :none +# policy.microphone :none +# policy.usb :none +# policy.fullscreen :self +# policy.payment :self, "https://secure.example.com" +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 00000000..6c349ae5 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,31 @@ +# Files in the config/locales directory are used for internationalization and +# are automatically loaded by Rails. If you want to use locales other than +# English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t "hello" +# +# In views, this is aliased to just `t`: +# +# <%= t("hello") %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more about the API, please read the Rails Internationalization guide +# at https://guides.rubyonrails.org/i18n.html. +# +# Be aware that YAML interprets the following case-insensitive strings as +# booleans: `true`, `false`, `on`, `off`, `yes`, `no`. Therefore, these strings +# must be quoted to be interpreted as strings. For example: +# +# en: +# "yes": yup +# enabled: "ON" + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 00000000..ec35fc10 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,34 @@ +# This configuration file will be evaluated by Puma. The top-level methods that +# are invoked here are part of Puma's configuration DSL. For more information +# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. + +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count + +# Specifies that the worker count should equal the number of processors in production. +if ENV["RAILS_ENV"] == "production" + worker_count = Integer(ENV.fetch("WEB_CONCURRENCY") { Concurrent.physical_processor_count }) + workers worker_count if worker_count > 1 +end + +# Specifies the `worker_timeout` threshold that Puma will use to wait before +# terminating a worker in development environments. +worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the `pidfile` that Puma will use. +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + +# Allow puma to be restarted by `bin/rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 00000000..8da4cb11 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,5 @@ +Rails.application.routes.draw do + get "up" => "rails/health#show", as: :rails_health_check + + root "page#home" +end diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 00000000..4942ab66 --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket-<%= Rails.env %> + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket-<%= Rails.env %> + +# Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name-<%= Rails.env %> + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/config/vite.json b/config/vite.json new file mode 100644 index 00000000..26f4857f --- /dev/null +++ b/config/vite.json @@ -0,0 +1,22 @@ +{ + "all": { + "sourceCodeDir": "app/javascript", + "entrypointsDir": "app/javascript/packs", + "additionalEntrypoints": [ + "app/javascript/packs/**/*.js" + ], + "watchAdditionalPaths": [ + "app/javascript/packs/**/*.js" + ] + }, + "development": { + "autoBuild": true, + "publicOutputDir": "vite-dev", + "port": 3036 + }, + "test": { + "autoBuild": true, + "publicOutputDir": "vite-test", + "port": 3037 + } +} diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 00000000..4fbd6ed9 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,9 @@ +# This file should ensure the existence of records required to run the application in every environment (production, +# development, test). The code here should be idempotent so that it can be executed at any point in every environment. +# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). +# +# Example: +# +# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name| +# MovieGenre.find_or_create_by!(name: genre_name) +# end diff --git a/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 00000000..131bf592 --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,94 @@ +#!/usr/bin/env node + +// Esbuild is configured with 3 modes: +// +// `yarn build` - Build JavaScript and exit +// `yarn build --watch` - Rebuild JavaScript on change +// `yarn build --reload` - Reloads page when views, JavaScript, or stylesheets change +// +// Minify is enabled when "RAILS_ENV=production" +// Sourcemaps are enabled in non-production environments + +import * as esbuild from "esbuild" +import path from "path" +import rails from "esbuild-rails" +import chokidar from "chokidar" +import http from "http" +import { setTimeout } from "timers/promises" + +const clients = [] + +const entryPoints = [ + "application.js" +] + +const watchDirectories = [ + "./app/javascript/**/*.js", + "./app/views/**/*.html.erb", + "./app/assets/builds/**/*.css", // Wait for cssbundling changes +] + +const config = { + absWorkingDir: path.join(process.cwd(), "app/javascript"), + bundle: true, + entryPoints: entryPoints, + minify: process.env.RAILS_ENV == "production", + outdir: path.join(process.cwd(), "app/assets/builds"), + plugins: [rails()], + sourcemap: process.env.RAILS_ENV != "production" +} + +async function buildAndReload() { + // Foreman & Overmind assign a separate PORT for each process + const port = parseInt(process.env.PORT) || 5137 + const context = await esbuild.context({ + ...config, + banner: { + js: ` (() => new EventSource("http://localhost:${port}").onmessage = () => location.reload())();`, + } + }) + + // Reload uses an HTTP server as an even stream to reload the browser + http.createServer((req, res) => { + return clients.push( + res.writeHead(200, { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + "Access-Control-Allow-Origin": "*", + Connection: "keep-alive", + }) + ) + }).listen(port) + + await context.rebuild() + console.log("[reload] initial build succeeded") + + let ready = false + chokidar.watch(watchDirectories).on("ready", () => { + console.log("[reload] ready") + ready = true + }).on("all", async (event, path) => { + if (ready === false) return + + if (path.includes("javascript")) { + try { + await setTimeout(20) + await context.rebuild() + console.log("[reload] build succeeded") + } catch (error) { + console.error("[reload] build failed", error) + } + } + clients.forEach((res) => res.write("data: update\n\n")) + clients.length = 0 + }) +} + +if (process.argv.includes("--reload")) { + buildAndReload() +} else if (process.argv.includes("--watch")) { + let context = await esbuild.context({ ...config, logLevel: 'info' }) + context.watch() +} else { + esbuild.build(config) +} diff --git a/index.html b/index.html index d1e45108..bf18078e 100644 --- a/index.html +++ b/index.html @@ -10,628 +10,6 @@ -
-
- -
- -
-
-
- - - -
- - -
- -

- The JavaScript Ecosystem for Server-rendered Web-Applications -

-

- Hotwire is an alternative approach to building modern web applications without using much JavaScript by sending HTML instead of JSON over the wire. -

- - -
- -
-
-
- - - -
- -
-
- - -
-

- Faster. Smarter. -

-

- Breathe life into your server-rendered applications by progressively enhancing them into full SPA-like applications. Hotwire's JavaScript sprinkles add just the right touch of interactivity, transforming your web experience without the need for a fully-blown front-end framework. -

-
- - -
- - -
- -
-
-
-
- - - - - - - -
-
-
-

- Rich Ecosystem -

-

- Unlock a world of possibilities with Hotwire's rich ecosystem. Explore a wide range of tools, plugins, and resources to streamline your web development projects. -

-
-
- -
- -
- Feature 01 -
-
-
-
-
- -
-
-
-
- - - -
-
-

- Optimized for productivity -

-

- Intuitive features and robust tools empower you to focus on what truly matters—building exceptional web applications. -

-
-
-
-
-
-
- -
-
-
-
- - - -
-
-

- JavaScript Sprinkles -

-

- Enhance your user interface with just the right amount of JavaScript. Hotwire's JavaScript sprinkles add interactivity without overwhelming your codebase. -

-
-
-
-
-
-
-
-
- - -
- -
-
- - - -

- Powerful Core -

-
-

- Access powerful core libraries that simplify complex tasks. Hotwire provides the essential building blocks to create fast, interactive web applications effortlessly. -

-
- -
-
- - - -

- Hybrid Native Applications -

-
-

- Take your web apps to the next level with Turbo Native. Build hybrid native applications using your existing web development skills and Hotwire's magic. -

-
- -
-
- - - -

- Plug-n-Play Ecosystem -

-
-

- Effortlessly extend and customize your Hotwire applications with our plug-n-play ecosystem. Discover a wealth of third-party integrations and tools. -

-
- -
-
- - - -

- Community -

-
-

- A vibrant ecosystem of developers, enthusiasts, and innovators. Connect, collaborate, and learn from fellow members who share your passion for crafting exceptional web experiences. -

-
- -
-
- - - -

- Hotwire Weekly Newsletter -

-
-

- Stay in the loop with the latest updates, tips, and best practices. Subscribe to our Hotwire Weekly Newsletter and join a thriving community of web developers. -

-
- -
-
- - - -

- Integrates with your favorite SSR-framework -

-
-

- Integrate Hotwire seamlessly into your preferred SSR-framework. The flexibility of the Hotwire approach supports a wide range of tech stacks. -

-
-
- -
-
-
- - -
- - - - -
-
- - -
-

Turn your framework into a full-stack framework

-

- Hotwire is the catalyst that transforms your backend framework into a complete full-stack powerhouse. It's not just an extension; it's the missing link that takes your web development to the next level. -

-
- -
-
-
-
-
- - - Feature 04 -
-
-
-
-
- -
-
-
- - - -
-
-
- - -
-
-
- Integrates with your favorite framework -
-
-

- Framework Integrations -

-

- The Hotwire approach is compatible with any server-side rendered framework. -

-
- - -
-
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
-
- -
-
-
- - - - -
-
-
- - -
-
-
Official and Third-Party Plugins
-
-

Rich Plugin System

-

- Effortlessly extend and customize your Hotwire applications with our plug-n-play ecosystem. Discover a wealth of third-party integrations and tools. -

-
- -
- -
- - -
- - -
- -
-
-
- - - -
-
-
- - - - - -
-
-
- Subscribe to our weekly newsletter -
-
-

- Stay Ahead of the Curve with Hotwire Weekly! -

-

- Don't miss out on the latest trends, insights, and innovations in the world of Hotwire. Join our growing community of passionate developers today! Subscribe now for a weekly dose of Hotwire goodness delivered right to your inbox. -

- -
-
-
-
- -
- - - - -
diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 00000000..e69de29b diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 00000000..e69de29b diff --git a/log/.keep b/log/.keep new file mode 100644 index 00000000..e69de29b diff --git a/package.json b/package.json index a6fd2951..96bc1fad 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,27 @@ { "name": "hotwire.io", "private": true, - "version": "0.0.0", - "type": "module", "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" + "build": "node esbuild.config.mjs", + "build:tailwind": "tailwindcss -i ./app/assets/stylesheets/tailwind.css -o ./app/assets/builds/tailwind.css --minify" }, - "dependencies": { - "@hotwired/stimulus": "^3.1.0", + "devDependencies": { + "@hotwired/stimulus": "^3.2.2", + "@hotwired/turbo-rails": "^7.3.0", "@tailwindcss/forms": "^0.5.6", "@tailwindcss/typography": "^0.5.10", "aos": "^2.3.4", + "autoprefixer": "^10.4.15", + "chokidar": "^3.5.3", "devicon": "^2.15.1", + "esbuild": "^0.19.3", + "esbuild-rails": "^1.0.7", + "postcss": "^8.4.29", "stimulus-vite-helpers": "^3.0.0", - "swiper": "^10.2.0" - }, - "devDependencies": { - "autoprefixer": "^10.4.12", - "postcss": "^8.4.16", + "swiper": "^10.2.0", "tailwindcss": "^3.3.3", - "vite": "^3.0.4" + "vite": "^4.3.0", + "vite-plugin-rails": "^0.1.0", + "vite-plugin-ruby": "^3.2.0" } } diff --git a/postcss.config.cjs b/postcss.config.js similarity index 100% rename from postcss.config.cjs rename to postcss.config.js diff --git a/public/404.html b/public/404.html new file mode 100644 index 00000000..2be3af26 --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 00000000..c08eac0d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 00000000..78a030af --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 00000000..e69de29b diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 00000000..e69de29b diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 00000000..c19f78ab --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/src/css/theme.css b/src/css/theme.css deleted file mode 100644 index 666ded43..00000000 --- a/src/css/theme.css +++ /dev/null @@ -1,180 +0,0 @@ -.form-input:focus, -.form-textarea:focus, -.form-multiselect:focus, -.form-select:focus, -.form-checkbox:focus, -.form-radio:focus { - @apply ring-0; -} - -/* Hamburger button */ -.hamburger svg>*:nth-child(1), -.hamburger svg>*:nth-child(2), -.hamburger svg>*:nth-child(3) { - transform-origin: center; - transform: rotate(0deg); -} - -.hamburger svg>*:nth-child(1) { - transition: y 0.1s 0.25s ease-in, transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19), opacity 0.1s ease-in; -} - -.hamburger svg>*:nth-child(2) { - transition: transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19); -} - -.hamburger svg>*:nth-child(3) { - transition: y 0.1s 0.25s ease-in, transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19), width 0.1s 0.25s ease-in; -} - -.hamburger.active svg>*:nth-child(1) { - opacity: 0; - y: 11; - transform: rotate(225deg); - transition: y 0.1s ease-out, transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.1s 0.12s ease-out; -} - -.hamburger.active svg>*:nth-child(2) { - transform: rotate(225deg); - transition: transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1); -} - -.hamburger.active svg>*:nth-child(3) { - y: 11; - transform: rotate(135deg); - transition: y 0.1s ease-out, transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1), width 0.1s ease-out; -} - -/* Custom Swiper styles */ -.swiper-button-disabled { - @apply opacity-50 cursor-default pointer-events-none; -} - -.testimonials-carousel .swiper-slide { - @apply opacity-80; -} - -.testimonials-carousel .swiper-slide.swiper-slide-active { - @apply opacity-100; -} - -/* Pulsing animation */ -@keyframes pulseLoop { - 0% { - opacity: 0; - transform: scale(.25) translateZ(0); - } - - 30% { - opacity: .4; - } - - 70% { - opacity: 0; - } - - 80% { - transform: scale(1) translateZ(0); - } -} - -.pulse { - opacity: 0; - transform-origin: center; - animation: pulseLoop 12000ms linear infinite; -} - -.pulse-1 { - animation-delay: -4000ms; -} - -.pulse-2 { - animation-delay: -8000ms; -} - -.translate-z-0 { - transform: translateZ(0); -} - -/* Custom AOS distance */ -@media screen { - html:not(.no-js) [data-aos=fade-up] { - -webkit-transform: translate3d(0, 14px, 0); - transform: translate3d(0, 14px, 0); - } - - html:not(.no-js) [data-aos=fade-down] { - -webkit-transform: translate3d(0, -14px, 0); - transform: translate3d(0, -14px, 0); - } - - html:not(.no-js) [data-aos=fade-right] { - -webkit-transform: translate3d(-14px, 0, 0); - transform: translate3d(-14px, 0, 0); - } - - html:not(.no-js) [data-aos=fade-left] { - -webkit-transform: translate3d(14px, 0, 0); - transform: translate3d(14px, 0, 0); - } - - html:not(.no-js) [data-aos=fade-up-right] { - -webkit-transform: translate3d(-14px, 14px, 0); - transform: translate3d(-14px, 14px, 0); - } - - html:not(.no-js) [data-aos=fade-up-left] { - -webkit-transform: translate3d(14px, 14px, 0); - transform: translate3d(14px, 14px, 0); - } - - html:not(.no-js) [data-aos=fade-down-right] { - -webkit-transform: translate3d(-14px, -14px, 0); - transform: translate3d(-14px, -14px, 0); - } - - html:not(.no-js) [data-aos=fade-down-left] { - -webkit-transform: translate3d(14px, -14px, 0); - transform: translate3d(14px, -14px, 0); - } - - html:not(.no-js) [data-aos=zoom-in-up] { - -webkit-transform: translate3d(0, 14px, 0) scale(.6); - transform: translate3d(0, 14px, 0) scale(.6); - } - - html:not(.no-js) [data-aos=zoom-in-down] { - -webkit-transform: translate3d(0, -14px, 0) scale(.6); - transform: translate3d(0, -14px, 0) scale(.6); - } - - html:not(.no-js) [data-aos=zoom-in-right] { - -webkit-transform: translate3d(-14px, 0, 0) scale(.6); - transform: translate3d(-14px, 0, 0) scale(.6); - } - - html:not(.no-js) [data-aos=zoom-in-left] { - -webkit-transform: translate3d(14px, 0, 0) scale(.6); - transform: translate3d(14px, 0, 0) scale(.6); - } - - html:not(.no-js) [data-aos=zoom-out-up] { - -webkit-transform: translate3d(0, 14px, 0) scale(1.2); - transform: translate3d(0, 14px, 0) scale(1.2); - } - - html:not(.no-js) [data-aos=zoom-out-down] { - -webkit-transform: translate3d(0, -14px, 0) scale(1.2); - transform: translate3d(0, -14px, 0) scale(1.2); - } - - html:not(.no-js) [data-aos=zoom-out-right] { - -webkit-transform: translate3d(-14px, 0, 0) scale(1.2); - transform: translate3d(-14px, 0, 0) scale(1.2); - } - - html:not(.no-js) [data-aos=zoom-out-left] { - -webkit-transform: translate3d(14px, 0, 0) scale(1.2); - transform: translate3d(14px, 0, 0) scale(1.2); - } -} diff --git a/src/main.js b/src/main.js deleted file mode 100644 index d69b7fb5..00000000 --- a/src/main.js +++ /dev/null @@ -1,3 +0,0 @@ -import "./controllers" -import "./theme" -import "./style.css" diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 00000000..e69de29b diff --git a/tailwind.config.cjs b/tailwind.config.js similarity index 91% rename from tailwind.config.cjs rename to tailwind.config.js index fda48ebc..e82295e2 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.js @@ -1,8 +1,9 @@ module.exports = { content: [ - "./index.html", - "./**/*.html", - "./src/**/*.js", + './app/views/**/*.html.erb', + './app/helpers/**/*.rb', + './app/assets/stylesheets/**/*.css', + './app/javascript/**/*.js' ], theme: { extend: { diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 00000000..d19212ab --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/channels/application_cable/connection_test.rb b/test/channels/application_cable/connection_test.rb new file mode 100644 index 00000000..6340bf9c --- /dev/null +++ b/test/channels/application_cable/connection_test.rb @@ -0,0 +1,13 @@ +require "test_helper" + +module ApplicationCable + class ConnectionTest < ActionCable::Connection::TestCase + # test "connects with cookies" do + # cookies.signed[:user_id] = 42 + # + # connect + # + # assert_equal connection.user_id, "42" + # end + end +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/controllers/page_controller_test.rb b/test/controllers/page_controller_test.rb new file mode 100644 index 00000000..7520267f --- /dev/null +++ b/test/controllers/page_controller_test.rb @@ -0,0 +1,8 @@ +require "test_helper" + +class PageControllerTest < ActionDispatch::IntegrationTest + test "should get home" do + get page_home_url + assert_response :success + end +end diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 00000000..0c22470e --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,15 @@ +ENV["RAILS_ENV"] ||= "test" +require_relative "../config/environment" +require "rails/test_help" + +module ActiveSupport + class TestCase + # Run tests in parallel with specified workers + parallelize(workers: :number_of_processors) + + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... + end +end diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 00000000..e69de29b diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..5f0e622d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vite' +// import Ruby from 'vite-plugin-ruby' +import Rails from 'vite-plugin-rails' +// import FullReload from 'vite-plugin-full-reload' +// import StimulusHMR from 'vite-plugin-stimulus-hmr' + +export default defineConfig({ + plugins: [ + Rails() + ], + server: { + fs: { + // Allow serving files from three levels up to the project root + allow: ['../../..'], + }, + }, +}) diff --git a/yarn.lock b/yarn.lock index 8c339fa1..51a0640b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,15 +7,243 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@esbuild/linux-loong64@0.14.53": - version "0.14.53" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz#251b4cd6760fadb4d68a05815e6dc5e432d69cd6" - integrity sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg== +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz#91a3b1b4a68c01ffdd5d8ffffb0a83178a366ae0" + integrity sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.3.tgz#08bd09f2ebc312422f4e94ae954821f9cf37b39e" + integrity sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/android-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.3.tgz#b1dffec99ed5505fc57561e8758b449dba4924fe" + integrity sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz#2e0db5ad26313c7f420f2cd76d9d263fc49cb549" + integrity sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/darwin-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz#ebe99f35049180023bb37999bddbe306b076a484" + integrity sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz#cf8b58ba5173440ea6124a3d0278bfe4ce181c20" + integrity sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/freebsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz#3f283099810ef1b8468cd1a9400c042e3f12e2a7" + integrity sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz#a8b3aa69653ac504a51aa73739fb06de3a04d1ff" + integrity sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz#ff6a2f68d4fc3ab46f614bca667a1a81ed6eea26" + integrity sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz#5813baf70e406304e8931b200e39d0293b488073" + integrity sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-loong64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz#21110f29b5e31dc865c7253fde8a2003f7e8b6fd" + integrity sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-mips64el@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz#4530fc416651eadeb1acc27003c00eac769eb8fd" + integrity sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-ppc64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz#facf910b0d397e391b37b01a1b4f6e363b04e56b" + integrity sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-riscv64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz#4a67abe97a495430d5867340982f5424a64f2aac" + integrity sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-s390x@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz#c5fb47474b9f816d81876c119dbccadf671cc5f6" + integrity sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/linux-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz#f22d659969ab78dc422f1df8d9a79bc1e7b12ee3" + integrity sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/netbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz#e9b046934996991f46b8c1cadac815aa45f84fd4" + integrity sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/openbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz#b287ef4841fc1067bbbd9a60549e8f9cf1b7ee3a" + integrity sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/sunos-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz#b2b8ba7d27907c7245f6e57dc62f3b88693f84b0" + integrity sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz#1974c8c180c9add4962235662c569fcc4c8f43dd" + integrity sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz#b02cc2dd8b6aed042069680f01f45fdfd3de5bc4" + integrity sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@esbuild/win32-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz#e5036be529f757e58d9a7771f2f1b14782986a74" + integrity sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw== + +"@hotwired/stimulus@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608" + integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A== + +"@hotwired/turbo-rails@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@hotwired/turbo-rails/-/turbo-rails-7.3.0.tgz#422c21752509f3edcd6c7b2725bbe9e157815f51" + integrity sha512-fvhO64vp/a2UVQ3jue9WTc2JisMv9XilIC7ViZmXAREVwiQ2S4UC7Go8f9A1j4Xu7DBI6SbFdqILk5ImqVoqyA== + dependencies: + "@hotwired/turbo" "^7.3.0" + "@rails/actioncable" "^7.0" -"@hotwired/stimulus@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.1.0.tgz#20215251e5afe6e0a3787285181ba1bfc9097df0" - integrity sha512-iDMHUhiEJ1xFeicyHcZQQgBzhtk5mPR0QZO3L6wtqzMsJEk2TKECuCQTGKjm+KJTHVY0dKq1dOOAWvODjpd2Mg== +"@hotwired/turbo@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-7.3.0.tgz#2226000fff1aabda9fd9587474565c9929dbf15d" + integrity sha512-Dcu+NaSvHLT7EjrDrkEmH4qET2ZJZ5IcCWmNXxNQTBwlnE5tBZfN6WxZ842n5cHV52DH/AKNirbPBtcEXDLW4g== "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" @@ -70,6 +298,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@rails/actioncable@^7.0": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.8.tgz#f44e7517f2d1570f1eabeea457dbeb17ed3a2d12" + integrity sha512-GjYQv89ZOOfbFw8VMNUOG33GXzyAA/TCVoD+742Ob4svm1XXUkd+w+ewqUXd+7VHQtV35y1/O78AGIPeJDTy/g== + "@tailwindcss/forms@^0.5.6": version "0.5.6" resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.6.tgz#29c6c2b032b363e0c5110efed1499867f6d7e868" @@ -114,13 +347,13 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -autoprefixer@^10.4.12: - version "10.4.12" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" - integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q== +autoprefixer@^10.4.15: + version "10.4.15" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001407" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -151,25 +384,25 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.21.10: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001407: - version "1.0.30001412" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001412.tgz#30f67d55a865da43e0aeec003f073ea8764d5d7c" - integrity sha512-+TeEIee1gS5bYOiuf+PS/kp2mrXic37Hl66VY6EAfxasIk5fELTktK2oOezYed12H8w7jt3s512PpulQidPjwA== +caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001534" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz#f24a9b2a6d39630bac5c132b5dff89b39a12e7dd" + integrity sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q== chokidar@^3.5.3: version "3.5.3" @@ -206,6 +439,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +debug@^4.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + devicon@^2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/devicon/-/devicon-2.15.1.tgz#148b791886f3d085f0f0b9aba72da71b2070dc56" @@ -221,137 +461,73 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -electron-to-chromium@^1.4.251: - version "1.4.264" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz#2f68a062c38b7a04bf57f3e6954b868672fbdcd3" - integrity sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw== - -esbuild-android-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz#259bc3ef1399a3cad8f4f67c40ee20779c4de675" - integrity sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA== - -esbuild-android-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz#2158253d4e8f9fdd2a081bbb4f73b8806178841e" - integrity sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A== - -esbuild-darwin-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz#b4681831fd8f8d06feb5048acbe90d742074cc2a" - integrity sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg== - -esbuild-darwin-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz#d267d957852d121b261b3f76ead86e5b5463acc9" - integrity sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA== - -esbuild-freebsd-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz#aca2af6d72b537fe66a38eb8f374fb66d4c98ca0" - integrity sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w== - -esbuild-freebsd-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz#76282e19312d914c34343c8a7da6cc5f051580b9" - integrity sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ== - -esbuild-linux-32@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz#1045d34cf7c5faaf2af3b29cc1573b06580c37e5" - integrity sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg== - -esbuild-linux-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz#ab3f2ee2ebb5a6930c72d9539cb34b428808cbe4" - integrity sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ== - -esbuild-linux-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz#1f5530412f6690949e78297122350488d3266cfe" - integrity sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw== - -esbuild-linux-arm@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz#a44ec9b5b42007ab6c0d65a224ccc6bbd97c54cf" - integrity sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA== - -esbuild-linux-mips64le@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz#a4d0b6b17cfdeea4e41b0b085a5f73d99311be9f" - integrity sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ== - -esbuild-linux-ppc64le@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz#8c331822c85465434e086e3e6065863770c38139" - integrity sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA== - -esbuild-linux-riscv64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz#36fd75543401304bea8a2d63bf8ea18aaa508e00" - integrity sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ== - -esbuild-linux-s390x@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz#1622677ab6824123f48f75d3afc031cd41936129" - integrity sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg== - -esbuild-netbsd-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz#e86d0efd0116658be335492ed12e66b26b4baf52" - integrity sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ== - -esbuild-openbsd-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz#9bcbbe6f86304872c6e91f64c8eb73fc29c3588b" - integrity sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ== - -esbuild-sunos-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz#f7a872f7460bfb7b131f7188a95fbce3d1c577e8" - integrity sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g== - -esbuild-windows-32@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz#c5e3ca50e2d1439cc2c9fe4defa63bcd474ce709" - integrity sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg== - -esbuild-windows-64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz#ec2ab4a60c5215f092ffe1eab6d01319e88238af" - integrity sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ== - -esbuild-windows-arm64@0.14.53: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz#f71d403806bdf9f4a1f9d097db9aec949bd675c8" - integrity sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ== - -esbuild@^0.14.47: - version "0.14.53" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.53.tgz#20b1007f686e8584f2a01a1bec5a37aac9498ce4" - integrity sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw== +electron-to-chromium@^1.4.477: + version "1.4.523" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz#f82f99243c827df05c26776d49712cb284972df6" + integrity sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg== + +esbuild-rails@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/esbuild-rails/-/esbuild-rails-1.0.7.tgz#3c8f76dc891d5b2105cb683ace0a15d11c91a973" + integrity sha512-6LuKQnYY32fisBSJoMeDQm1V4MB17P95oV8Er145j77Yr7sDE6TpKKtXeprApN3YxE2rQUeU3il4LR3GHh5fIw== + dependencies: + fast-glob "^3.2.12" + +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +esbuild@^0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.3.tgz#d9268cd23358eef9d76146f184e0c55ff8da7bb6" + integrity sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw== optionalDependencies: - "@esbuild/linux-loong64" "0.14.53" - esbuild-android-64 "0.14.53" - esbuild-android-arm64 "0.14.53" - esbuild-darwin-64 "0.14.53" - esbuild-darwin-arm64 "0.14.53" - esbuild-freebsd-64 "0.14.53" - esbuild-freebsd-arm64 "0.14.53" - esbuild-linux-32 "0.14.53" - esbuild-linux-64 "0.14.53" - esbuild-linux-arm "0.14.53" - esbuild-linux-arm64 "0.14.53" - esbuild-linux-mips64le "0.14.53" - esbuild-linux-ppc64le "0.14.53" - esbuild-linux-riscv64 "0.14.53" - esbuild-linux-s390x "0.14.53" - esbuild-netbsd-64 "0.14.53" - esbuild-openbsd-64 "0.14.53" - esbuild-sunos-64 "0.14.53" - esbuild-windows-32 "0.14.53" - esbuild-windows-64 "0.14.53" - esbuild-windows-arm64 "0.14.53" + "@esbuild/android-arm" "0.19.3" + "@esbuild/android-arm64" "0.19.3" + "@esbuild/android-x64" "0.19.3" + "@esbuild/darwin-arm64" "0.19.3" + "@esbuild/darwin-x64" "0.19.3" + "@esbuild/freebsd-arm64" "0.19.3" + "@esbuild/freebsd-x64" "0.19.3" + "@esbuild/linux-arm" "0.19.3" + "@esbuild/linux-arm64" "0.19.3" + "@esbuild/linux-ia32" "0.19.3" + "@esbuild/linux-loong64" "0.19.3" + "@esbuild/linux-mips64el" "0.19.3" + "@esbuild/linux-ppc64" "0.19.3" + "@esbuild/linux-riscv64" "0.19.3" + "@esbuild/linux-s390x" "0.19.3" + "@esbuild/linux-x64" "0.19.3" + "@esbuild/netbsd-x64" "0.19.3" + "@esbuild/openbsd-x64" "0.19.3" + "@esbuild/sunos-x64" "0.19.3" + "@esbuild/win32-arm64" "0.19.3" + "@esbuild/win32-ia32" "0.19.3" + "@esbuild/win32-x64" "0.19.3" escalade@^3.1.1: version "3.1.1" @@ -557,6 +733,11 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -566,20 +747,15 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -690,16 +866,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.14, postcss@^8.4.16: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.23: +postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.29: version "8.4.29" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== @@ -727,7 +894,7 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -resolve@^1.1.7, resolve@^1.22.1: +resolve@^1.1.7: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -750,10 +917,15 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rollup@^2.75.6: - version "2.77.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.2.tgz#6b6075c55f9cc2040a5912e6e062151e42e2c4e3" - integrity sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g== +rollup-plugin-gzip@^3.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-gzip/-/rollup-plugin-gzip-3.1.0.tgz#ce439ba9cd212c0e2c131d91e6214044e8972485" + integrity sha512-PFS9s6/w6dCra6/Z8PGD+ug3aaaqKLDCbr5y1Ek71Wd4rQSmMnOqCIIMgwbYxZ9A/gjP3pCN6rA4pAG47jxF0w== + +rollup@^3.27.1: + version "3.29.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.2.tgz#cbc76cd5b03b9f9e93be991d23a1dff9c6d5b740" + integrity sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A== optionalDependencies: fsevents "~2.3.2" @@ -851,10 +1023,10 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -update-browserslist-db@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" - integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -864,15 +1036,60 @@ util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.4.tgz#c61688d6b97573e96cf5ac25f2d68597b5ce68e8" - integrity sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA== +vite-plugin-environment@^1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/vite-plugin-environment/-/vite-plugin-environment-1.1.3.tgz#d01a04abb2f69730a4866c9c9db51d3dab74645b" + integrity sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA== + +vite-plugin-full-reload@^1.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz#6cddfa94e51909843bc7156ab728dbac972b8560" + integrity sha512-kVZFDFWr0DxiHn6MuDVTQf7gnWIdETGlZh0hvTiMXzRN80vgF4PKbONSq8U1d0WtHsKaFODTQgJeakLacoPZEQ== + dependencies: + picocolors "^1.0.0" + picomatch "^2.3.1" + +vite-plugin-manifest-sri@^0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/vite-plugin-manifest-sri/-/vite-plugin-manifest-sri-0.1.0.tgz#e2b9d0cebf7c7c307cee8aab3a8b3cf604bca921" + integrity sha512-m4gcEXwcA1MfCVYTLVHYsB03Xsc6L4VYfhxXmcYcS+rN3kTjuWkXMaA8OuOV1gFdi1bMJFkLTJCPciYApvCm/g== + +vite-plugin-rails@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/vite-plugin-rails/-/vite-plugin-rails-0.1.0.tgz#e01f034f8b08c5159fe949592dd7709c5a9ffcd9" + integrity sha512-XA6rIgXwXnwHOr/o8BrTFyk7rsgzSC08ANm+pNSHeAHhbd9m1ItJZeY8N2Q47PweSYpQP28ic3pqd+lDSn2WVg== + dependencies: + rollup-plugin-gzip "^3.0" + vite-plugin-environment "^1.1" + vite-plugin-full-reload "^1.0" + vite-plugin-manifest-sri "^0.1" + vite-plugin-ruby "^3.1" + vite-plugin-stimulus-hmr "^3.0" + +vite-plugin-ruby@^3.1, vite-plugin-ruby@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vite-plugin-ruby/-/vite-plugin-ruby-3.2.2.tgz#a174bc435b11350cfcb1b976342ca740d0bcaed2" + integrity sha512-cuHG1MajRWPR8YdfF6lvgsQRnKFEBRwZF//asFbRiI1psacxB5aPlHSvYZYxAu5IflrAa0MdR0HxEq+g98M3iQ== + dependencies: + debug "^4.3.4" + fast-glob "^3.2.12" + +vite-plugin-stimulus-hmr@^3.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/vite-plugin-stimulus-hmr/-/vite-plugin-stimulus-hmr-3.0.0.tgz#60410a69486e86a8c1a769fe4b10039ac5f8d910" + integrity sha512-KElOiZOlaG4XilQQHrzK8M1u5UfK4EFfADJKQYbnmsUMifDOnPR6anVYgHAN95QyWJ67Q/rYWe5BB9M5OxocfQ== + dependencies: + debug "^4.3" + stimulus-vite-helpers "^3.0.0" + +vite@^4.3.0: + version "4.4.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" + integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== dependencies: - esbuild "^0.14.47" - postcss "^8.4.14" - resolve "^1.22.1" - rollup "^2.75.6" + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" optionalDependencies: fsevents "~2.3.2"