From adc00e108744e746169b0098e1f706ead6f62147 Mon Sep 17 00:00:00 2001 From: Alex Ghiculescu Date: Mon, 9 Jan 2023 12:57:05 -0700 Subject: [PATCH 001/274] Simplify "Building for testing" Now that https://github.com/rails/rails/pull/46664 is merged, we can simplify the testing instructions. Technically these instructions aren't true until Rails 7.1, so I'm happy to leave the PR open until then if that's preferred. --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index db1a12cd..3fa69ef7 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,8 @@ The `tailwindcss:build` is automatically attached to `assets:precompile`, so bef ### Building for testing -The `tailwindcss:build` task is automatically attached to the `test:prepare` Rake task. The `test:prepare` task is run before some test tasks (e.g. `test:all` and `test:controllers`), but not before the bare `test` task. +The `tailwindcss:build` task is automatically attached to the `test:prepare` Rake task. This task runs before test commands. If you run `bin/rails test` in your CI environment, your Tailwind output will be generated before tests run. -If your tests need Tailwind assets in your CI environment, it's best to be explicit and run this command: - -``` -bin/rails test:prepare test -``` ### Update assets automatically From e07a765e228c7f90d5229a789d2248669b6a7e91 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 5 Mar 2023 09:44:02 -0500 Subject: [PATCH 002/274] dev: update Gemfile.lock --- Gemfile.lock | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e6a9169f..45b315c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,45 +1,45 @@ PATH remote: . specs: - tailwindcss-rails (2.0.23) + tailwindcss-rails (2.0.24) railties (>= 6.0.0) GEM remote: https://rubygems.org/ specs: - actionmailer (7.0.4.2) - actionpack (= 7.0.4.2) - actionview (= 7.0.4.2) - activejob (= 7.0.4.2) - activesupport (= 7.0.4.2) + actionmailer (7.0.4.3) + actionpack (= 7.0.4.3) + actionview (= 7.0.4.3) + activejob (= 7.0.4.3) + activesupport (= 7.0.4.3) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.0) - actionpack (7.0.4.2) - actionview (= 7.0.4.2) - activesupport (= 7.0.4.2) + actionpack (7.0.4.3) + actionview (= 7.0.4.3) + activesupport (= 7.0.4.3) rack (~> 2.0, >= 2.2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actionview (7.0.4.2) - activesupport (= 7.0.4.2) + actionview (7.0.4.3) + activesupport (= 7.0.4.3) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (7.0.4.2) - activesupport (= 7.0.4.2) + activejob (7.0.4.3) + activesupport (= 7.0.4.3) globalid (>= 0.3.6) - activesupport (7.0.4.2) + activesupport (7.0.4.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) builder (3.2.4) - concurrent-ruby (1.2.0) + concurrent-ruby (1.2.2) crass (1.0.6) date (3.3.3) debug (1.7.1) @@ -59,7 +59,7 @@ GEM method_source (1.0.0) mini_mime (1.1.2) mini_portile2 (2.8.1) - minitest (5.17.0) + minitest (5.18.0) net-imap (0.3.4) date net-protocol @@ -69,15 +69,15 @@ GEM timeout net-smtp (0.3.3) net-protocol - nokogiri (1.14.1) + nokogiri (1.14.2) mini_portile2 (~> 2.8.0) racc (~> 1.4) - nokogiri (1.14.1-x86_64-darwin) + nokogiri (1.14.2-x86_64-darwin) racc (~> 1.4) - nokogiri (1.14.1-x86_64-linux) + nokogiri (1.14.2-x86_64-linux) racc (~> 1.4) racc (1.6.2) - rack (2.2.6.2) + rack (2.2.6.4) rack-test (2.0.2) rack (>= 1.3) rails-dom-testing (2.0.3) @@ -85,19 +85,19 @@ GEM nokogiri (>= 1.6) rails-html-sanitizer (1.5.0) loofah (~> 2.19, >= 2.19.1) - railties (7.0.4.2) - actionpack (= 7.0.4.2) - activesupport (= 7.0.4.2) + railties (7.0.4.3) + actionpack (= 7.0.4.3) + activesupport (= 7.0.4.3) method_source rake (>= 12.2) thor (~> 1.0) zeitwerk (~> 2.5) rake (13.0.6) thor (1.2.1) - timeout (0.3.1) + timeout (0.3.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - zeitwerk (2.6.6) + zeitwerk (2.6.7) PLATFORMS ruby @@ -110,4 +110,4 @@ DEPENDENCIES tailwindcss-rails! BUNDLED WITH - 2.3.14 + 2.4.7 From cbf5512abc04660e74212e781487824f56d2ccb3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 14 Mar 2023 10:41:52 -0400 Subject: [PATCH 003/274] version bump to v2.0.25 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc9770bc..9ab95abb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## v2.0.25 / 2023-03-14 + +* Installer now includes all 5 official Tailwind plugins (adding `line-clamp` and `container-queries`). (#254) by @Kentasmic + + ## v2.0.24 / 2023-03-05 * When Rails CSS compression is on, avoid generating minified tailwindcss assets. (#253) by [@flavorjones](https://github.com/flavorjones). diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 11a309fe..b073fed9 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.24" + VERSION = "2.0.25" end From 4c0de9a020ff4cbbae6e7c5c33b8861548288073 Mon Sep 17 00:00:00 2001 From: Tyson Gach Date: Tue, 28 Mar 2023 10:52:04 -0500 Subject: [PATCH 004/274] Update tailwindcss to v3.3.0 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.0 The line-clamp plugin is now baked into the framework itself: https://tailwindcss.com/blog/tailwindcss-v3-3 --- lib/install/tailwind.config.js | 1 - lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/install/tailwind.config.js b/lib/install/tailwind.config.js index 4476e099..39364deb 100644 --- a/lib/install/tailwind.config.js +++ b/lib/install/tailwind.config.js @@ -18,7 +18,6 @@ module.exports = { require('@tailwindcss/forms'), require('@tailwindcss/aspect-ratio'), require('@tailwindcss/typography'), - require('@tailwindcss/line-clamp'), require('@tailwindcss/container-queries'), ] } diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 3fa169b5..ee759439 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.2.7" + VERSION = "v3.3.0" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From c2fced8a580e92d91d60c79bd0b2ab5051974956 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 29 Mar 2023 22:47:26 -0400 Subject: [PATCH 005/274] doc: update CHANGELOG [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ab95abb..7b776444 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.3.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.0) by @tysongach + + ## v2.0.25 / 2023-03-14 * Installer now includes all 5 official Tailwind plugins (adding `line-clamp` and `container-queries`). (#254) by @Kentasmic From 56bdb1fddffa798563ce22b1fbc9e9235ef88337 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 30 Mar 2023 00:34:10 -0400 Subject: [PATCH 006/274] use a local tailwindcss binary by setting TAILWINDCSS_INSTALL_DIR this will work for both the vanilla "ruby" platform as well as override the behavior of the native platform gem. --- CHANGELOG.md | 1 + README.md | 29 +++++++++- lib/tailwindcss/commands.rb | 45 +++++++++++----- test/lib/tailwindcss/commands_test.rb | 78 +++++++++++++++++++++++++-- 4 files changed, 133 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b776444..1d1ac58b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## next / unreleased * Update to [Tailwind CSS v3.3.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.0) by @tysongach +* Users can use a locally-installed `tailwindcss` executable by setting a `TAILWINDCSS_INSTALL_DIR` environment variable. (#224, #226) by @flavorjones ## v2.0.25 / 2023-03-14 diff --git a/README.md b/README.md index db1a12cd..aa4aed4b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,34 @@ With Rails 7 you can generate a new application preconfigured with Tailwind by u 1. Run `./bin/bundle add tailwindcss-rails` 2. Run `./bin/rails tailwindcss:install` -This gem wraps [the standalone executable version](https://tailwindcss.com/blog/standalone-cli) of the Tailwind CSS v3 framework. These executables are platform specific, so there are actually separate underlying gems per platform, but the correct gem will automatically be picked for your platform. Supported platforms are Linux x64, macOS arm64, macOS x64, and Windows x64. (Note that due to this setup, you must install the actual gems – you can't pin your gem to the github repo.) +This gem wraps [the standalone executable version](https://tailwindcss.com/blog/standalone-cli) of the Tailwind CSS v3 framework. These executables are platform specific, so there are actually separate underlying gems per platform, but the correct gem will automatically be picked for your platform. + +Supported platforms are: + +- arm64-darwin (macos-arm64) +- x64-mingw32 (windows-x64) +- x64-mingw-ucr (windows-x64) +- x86_64-darwin (macos-x64) +- x86_64-linux (linux-x64) +- aarch64-linux (linux-arm64) +- arm-linux (linux-armv7) + + +### Using a local installation of `tailwindcss` + +If you are not able to use the vendored standalone executables (for example, if you're on an unsupported platform), you can use a local installation of the `tailwindcss` executable by setting an environment variable named `TAILWINDCSS_INSTALL_DIR` to the directory containing the executable. + +For example, if you've installed `tailwindcss` so that the executable is found at `/node_modules/bin/tailwindcss`, then you should set your environment variable like so: + +``` sh +TAILWINDCSS_INSTALL_DIR=/path/to/node_modules/bin +``` + +This also works with relative paths. If you've installed into your app's directory at `./node_modules/.bin/tailwindcss`: + +``` sh +TAILWINDCSS_INSTALL_DIR=node_modules/.bin +``` ## Developing with Tailwindcss diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 4c91428c..448e08f9 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -2,6 +2,8 @@ module Tailwindcss module Commands + DEFAULT_DIR = File.expand_path(File.join(__dir__, "..", "..", "exe")) + # raised when the host platform is not supported by upstream tailwindcss's binary releases class UnsupportedPlatformException < StandardError end @@ -10,26 +12,41 @@ class UnsupportedPlatformException < StandardError class ExecutableNotFoundException < StandardError end + # raised when TAILWINDCSS_INSTALL_DIR does not exist + class DirectoryNotFoundException < StandardError + end + class << self def platform [:cpu, :os].map { |m| Gem::Platform.local.send(m) }.join("-") end - def executable( - exe_path: File.expand_path(File.join(__dir__, "..", "..", "exe")) - ) - if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match(Gem::Platform.new(p)) } - raise UnsupportedPlatformException, <<~MESSAGE - tailwindcss-rails does not support the #{platform} platform - Please install tailwindcss following instructions at https://tailwindcss.com/docs/installation - MESSAGE - end - - exe_path = Dir.glob(File.expand_path(File.join(exe_path, "*", "tailwindcss"))).find do |f| - Gem::Platform.match(Gem::Platform.new(File.basename(File.dirname(f)))) + def executable(exe_path: DEFAULT_DIR) + tailwindcss_install_dir = ENV["TAILWINDCSS_INSTALL_DIR"] + if tailwindcss_install_dir + if File.directory?(tailwindcss_install_dir) + warn "NOTE: using TAILWINDCSS_INSTALL_DIR to find tailwindcss executable: #{tailwindcss_install_dir}" + exe_path = tailwindcss_install_dir + exe_file = File.expand_path(File.join(tailwindcss_install_dir, "tailwindcss")) + else + raise DirectoryNotFoundException, <<~MESSAGE + TAILWINDCSS_INSTALL_DIR is set to #{tailwindcss_install_dir}, but that directory does not exist. + MESSAGE + end + else + if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match(Gem::Platform.new(p)) } + raise UnsupportedPlatformException, <<~MESSAGE + tailwindcss-rails does not support the #{platform} platform + Please install tailwindcss following instructions at https://tailwindcss.com/docs/installation + MESSAGE + end + + exe_file = Dir.glob(File.expand_path(File.join(exe_path, "*", "tailwindcss"))).find do |f| + Gem::Platform.match(Gem::Platform.new(File.basename(File.dirname(f)))) + end end - if exe_path.nil? + if exe_file.nil? || !File.exist?(exe_file) raise ExecutableNotFoundException, <<~MESSAGE Cannot find the tailwindcss executable for #{platform} in #{exe_path} @@ -52,7 +69,7 @@ def executable( MESSAGE end - exe_path + exe_file end def compile_command(debug: false, **kwargs) diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index ac8f9d05..6ddc6a25 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -2,11 +2,6 @@ require "minitest/mock" class Tailwindcss::CommandsTest < ActiveSupport::TestCase - test ".platform is a string containing just the cpu and os (not the version)" do - expected = "#{Gem::Platform.local.cpu}-#{Gem::Platform.local.os}" - assert_equal(expected, Tailwindcss::Commands.platform) - end - def mock_exe_directory(platform) Dir.mktmpdir do |dir| FileUtils.mkdir(File.join(dir, platform)) @@ -18,6 +13,19 @@ def mock_exe_directory(platform) end end + def mock_local_tailwindcss_install + Dir.mktmpdir do |dir| + path = File.join(dir, "tailwindcss") + FileUtils.touch(path) + yield(dir, path) + end + end + + test ".platform is a string containing just the cpu and os (not the version)" do + expected = "#{Gem::Platform.local.cpu}-#{Gem::Platform.local.os}" + assert_equal(expected, Tailwindcss::Commands.platform) + end + test ".executable returns the absolute path to the binary" do mock_exe_directory("sparc-solaris2.8") do |dir, executable| expected = File.expand_path(File.join(dir, "sparc-solaris2.8", "tailwindcss")) @@ -42,6 +50,66 @@ def mock_exe_directory(platform) end end + test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR when no packaged binary exists" do + mock_local_tailwindcss_install do |local_install_dir, expected| + result = nil + begin + ENV["TAILWINDCSS_INSTALL_DIR"] = local_install_dir + assert_output(nil, /using TAILWINDCSS_INSTALL_DIR/) do + result = Tailwindcss::Commands.executable(exe_path: "/does/not/exist") + end + ensure + ENV["TAILWINDCSS_INSTALL_DIR"] = nil + end + assert_equal(expected, result) + end + end + + test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR when we're not on a supported platform" do + Gem::Platform.stub(:match, false) do # nothing is supported + mock_local_tailwindcss_install do |local_install_dir, expected| + result = nil + begin + ENV["TAILWINDCSS_INSTALL_DIR"] = local_install_dir + assert_output(nil, /using TAILWINDCSS_INSTALL_DIR/) do + result = Tailwindcss::Commands.executable + end + ensure + ENV["TAILWINDCSS_INSTALL_DIR"] = nil + end + assert_equal(expected, result) + end + end + end + + test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR even when a packaged binary exists" do + mock_exe_directory("sparc-solaris2.8") do |dir, _executable| + mock_local_tailwindcss_install do |local_install_dir, expected| + result = nil + begin + ENV["TAILWINDCSS_INSTALL_DIR"] = local_install_dir + assert_output(nil, /using TAILWINDCSS_INSTALL_DIR/) do + result = Tailwindcss::Commands.executable(exe_path: dir) + end + ensure + ENV["TAILWINDCSS_INSTALL_DIR"] = nil + end + assert_equal(expected, result) + end + end + end + + test ".executable raises ExecutableNotFoundException is TAILWINDCSS_INSTALL_DIR is set to a nonexistent dir" do + begin + ENV["TAILWINDCSS_INSTALL_DIR"] = "/does/not/exist" + assert_raises(Tailwindcss::Commands::DirectoryNotFoundException) do + Tailwindcss::Commands.executable + end + ensure + ENV["TAILWINDCSS_INSTALL_DIR"] = nil + end + end + test ".compile_command" do mock_exe_directory("sparc-solaris2.8") do |dir, executable| Rails.stub(:root, File) do # Rails.root won't work in this test suite From 3f091fe9bda8a05b28449a9f1619059ac293cea6 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 30 Mar 2023 01:44:11 -0400 Subject: [PATCH 007/274] version bump to v2.0.26 --- CHANGELOG.md | 4 ++-- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d1ac58b..d9a614d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ -## next / unreleased +## v2.0.26 / 2023-03-30 * Update to [Tailwind CSS v3.3.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.0) by @tysongach -* Users can use a locally-installed `tailwindcss` executable by setting a `TAILWINDCSS_INSTALL_DIR` environment variable. (#224, #226) by @flavorjones +* Use a locally-installed `tailwindcss` executable by setting a `TAILWINDCSS_INSTALL_DIR` environment variable. (#224, #226) by @flavorjones ## v2.0.25 / 2023-03-14 diff --git a/Gemfile.lock b/Gemfile.lock index 45b315c9..762cadd3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.0.24) + tailwindcss-rails (2.0.26) railties (>= 6.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index b073fed9..d37ae321 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.25" + VERSION = "2.0.26" end From ee5dca524a9c8f84b1a9b1ffccfb1cb9d1c02efd Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 2 Apr 2023 09:06:20 -0400 Subject: [PATCH 008/274] dep: update tailwindcss to v3.3.1 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.1 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a614d0..201b4d26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.3.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.1) by @flavorjones + + ## v2.0.26 / 2023-03-30 * Update to [Tailwind CSS v3.3.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.0) by @tysongach diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index ee759439..273a69b4 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.0" + VERSION = "v3.3.1" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 5777017729a2990ac485d86a6fed3df2fcaf8d23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 20:53:16 +0000 Subject: [PATCH 009/274] build(deps): bump nokogiri from 1.14.2 to 1.14.3 Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.14.2 to 1.14.3. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.14.2...v1.14.3) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 762cadd3..f79fc0dc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -69,12 +69,12 @@ GEM timeout net-smtp (0.3.3) net-protocol - nokogiri (1.14.2) + nokogiri (1.14.3) mini_portile2 (~> 2.8.0) racc (~> 1.4) - nokogiri (1.14.2-x86_64-darwin) + nokogiri (1.14.3-x86_64-darwin) racc (~> 1.4) - nokogiri (1.14.2-x86_64-linux) + nokogiri (1.14.3-x86_64-linux) racc (~> 1.4) racc (1.6.2) rack (2.2.6.4) From f44a6dbfbe6ae288cbcb82f1d3868cf571870c76 Mon Sep 17 00:00:00 2001 From: Gord Pearson Date: Thu, 20 Apr 2023 16:18:17 -0400 Subject: [PATCH 010/274] Handle `tailwindcss:watch[always]` --- lib/tailwindcss/commands.rb | 3 ++- lib/tasks/build.rake | 3 ++- test/lib/tailwindcss/commands_test.rb | 7 +++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 448e08f9..0020a973 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -83,9 +83,10 @@ def compile_command(debug: false, **kwargs) end end - def watch_command(poll: false, **kwargs) + def watch_command(always: false, poll: false, **kwargs) compile_command(**kwargs).tap do |command| command << "-w" + command << "always" if always command << "-p" if poll end end diff --git a/lib/tasks/build.rake b/lib/tasks/build.rake index 27653811..13407699 100644 --- a/lib/tasks/build.rake +++ b/lib/tasks/build.rake @@ -11,7 +11,8 @@ namespace :tailwindcss do task watch: :environment do |_, args| debug = args.extras.include?("debug") poll = args.extras.include?("poll") - command = Tailwindcss::Commands.watch_command(debug: debug, poll: poll) + always = args.extras.include?("always") + command = Tailwindcss::Commands.watch_command(always: always, debug: debug, poll: poll) puts command.inspect if args.extras.include?("verbose") system(*command) end diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 6ddc6a25..142efcfc 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -165,8 +165,15 @@ def mock_local_tailwindcss_install assert_kind_of(Array, actual) assert_equal(executable, actual.first) assert_includes(actual, "-w") + refute_includes(actual, "always") assert_includes(actual, "-p") assert_includes(actual, "--minify") + + actual = Tailwindcss::Commands.watch_command(exe_path: dir, always: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + assert_includes(actual, "always") end end end From 86b93cd2981d2b764a970e3ef277496ef6b62483 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 2 Apr 2023 09:13:49 -0400 Subject: [PATCH 011/274] version bump to v2.0.27 (backport commit) --- CHANGELOG.md | 2 +- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 201b4d26..590a2b09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ -## next / unreleased +## v2.0.27 / 2023-04-02 * Update to [Tailwind CSS v3.3.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.1) by @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index f79fc0dc..0ee303aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.0.26) + tailwindcss-rails (2.0.27) railties (>= 6.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index d37ae321..a2163aaa 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.26" + VERSION = "2.0.27" end From e665b097ae51e4e4d388370352a6390d41e685fd Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 21 Apr 2023 12:26:25 -0400 Subject: [PATCH 012/274] doc: update README to describe `watch[always]` See #262 [skip ci] --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aa4aed4b..c0394640 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,11 @@ While you're developing your application, you want to run Tailwind in "watch" mo - running `rails tailwindcss:watch` as a separate process, - or by running `./bin/dev` which uses [foreman](https://github.com/ddollar/foreman) to start both the Tailwind watch process and the rails server in development mode. +If you are running `rails tailwindcss:watch` on a system that doesn't fully support file system events, pass a `poll` argument to the task to instruct tailwindcss to instead use polling: `rails tailwindcss:watch[poll]`. If you use `bin/dev` then you should modify your `Procfile.dev`. + If you are running `rails tailwindcss:watch` as a process in a Docker container, set `tty: true` in `docker-compose.yml` for the appropriate container to keep the watch process running. -If you are running `rails tailwindcss:watch` on a system that doesn't fully support file system events, pass a `poll` argument to the task to instruct tailwindcss to instead use polling: `rails tailwindcss:watch[poll]`. If you use `bin/dev` then you should modify your `Procfile.dev`. +If you are running `rails tailwindcss:watch` in a docker container without a tty, pass the `always` argument to the task to instruct tailwindcss to keep the watcher alive even when `stdin` is closed: `rails tailwindcss:watch[always]`. If you use `bin/dev` then you should modify your `Procfile.dev`. ### Debugging with unminified assets From 0f9965a33a5f94781585ce36700a575b9163c224 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 21 Apr 2023 12:46:10 -0400 Subject: [PATCH 013/274] dep: bundle update --- Gemfile.lock | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0ee303aa..2eab2979 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -42,13 +42,18 @@ GEM concurrent-ruby (1.2.2) crass (1.0.6) date (3.3.3) - debug (1.7.1) + debug (1.7.2) + irb (>= 1.5.0) + reline (>= 0.3.1) erubi (1.12.0) globalid (1.1.0) activesupport (>= 5.0) i18n (1.12.0) concurrent-ruby (~> 1.0) - loofah (2.19.1) + io-console (0.6.0) + irb (1.6.4) + reline (>= 0.3.0) + loofah (2.20.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.8.1) @@ -78,7 +83,7 @@ GEM racc (~> 1.4) racc (1.6.2) rack (2.2.6.4) - rack-test (2.0.2) + rack-test (2.1.0) rack (>= 1.3) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) @@ -93,6 +98,8 @@ GEM thor (~> 1.0) zeitwerk (~> 2.5) rake (13.0.6) + reline (0.3.3) + io-console (~> 0.5) thor (1.2.1) timeout (0.3.2) tzinfo (2.0.6) From 83aeedecae1f938c4ed1ef348eebd78620502624 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 21 Apr 2023 12:49:24 -0400 Subject: [PATCH 014/274] version bump to v2.0.28 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 590a2b09..bb30202e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## v2.0.28 / 2023-04-21 + +* The `watch` task accepts an `always` argument to keep the watcher alive when stdin is closed: `rails tailwindcss:watch[always]`. #262 by @GoodForOneFare + + ## v2.0.27 / 2023-04-02 * Update to [Tailwind CSS v3.3.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.1) by @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index a2163aaa..7e61754a 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.27" + VERSION = "2.0.28" end From 92f6cdb33604d6b55127c97ac21e61e3baa083f7 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 26 Apr 2023 09:36:39 -0400 Subject: [PATCH 015/274] dep: update tailwindcss to v3.3.2 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.2 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb30202e..0f2d20df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.3.2](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.2) by @flavorjones + + ## v2.0.28 / 2023-04-21 * The `watch` task accepts an `always` argument to keep the watcher alive when stdin is closed: `rails tailwindcss:watch[always]`. #262 by @GoodForOneFare diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 273a69b4..1048f0fb 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.1" + VERSION = "v3.3.2" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From b6d9029058f901a30f19df3fd5ca0321425612a8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 26 Apr 2023 09:58:49 -0400 Subject: [PATCH 016/274] version bump to v2.0.29 and update Gemfile.lock --- CHANGELOG.md | 2 +- Gemfile.lock | 6 +++--- lib/tailwindcss/version.rb | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f2d20df..3102d87d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ -## next / unreleased +## v2.0.29 / 2023-04-26 * Update to [Tailwind CSS v3.3.2](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.2) by @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 2eab2979..ed969420 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.0.27) + tailwindcss-rails (2.0.29) railties (>= 6.0.0) GEM @@ -48,7 +48,7 @@ GEM erubi (1.12.0) globalid (1.1.0) activesupport (>= 5.0) - i18n (1.12.0) + i18n (1.13.0) concurrent-ruby (~> 1.0) io-console (0.6.0) irb (1.6.4) @@ -82,7 +82,7 @@ GEM nokogiri (1.14.3-x86_64-linux) racc (~> 1.4) racc (1.6.2) - rack (2.2.6.4) + rack (2.2.7) rack-test (2.1.0) rack (>= 1.3) rails-dom-testing (2.0.3) diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 7e61754a..41639b39 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.28" + VERSION = "2.0.29" end From e333322623cdc8ebbe953222cd7e064fe6b49e23 Mon Sep 17 00:00:00 2001 From: Robin Mehner Date: Tue, 20 Jun 2023 20:25:22 +0200 Subject: [PATCH 017/274] Enhance spec:prepare command with tailwindcss:build command jsbundling-rails (https://github.com/rails/jsbundling-rails/pull/128) and cssbundling-rails (https://github.com/rails/cssbundling-rails/pull/116) do the same and it's useful for people who are using RSpec. --- lib/tasks/build.rake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/tasks/build.rake b/lib/tasks/build.rake index 13407699..8f61bf8e 100644 --- a/lib/tasks/build.rake +++ b/lib/tasks/build.rake @@ -22,6 +22,8 @@ Rake::Task["assets:precompile"].enhance(["tailwindcss:build"]) if Rake::Task.task_defined?("test:prepare") Rake::Task["test:prepare"].enhance(["tailwindcss:build"]) +elsif Rake::Task.task_defined?("spec:prepare") + Rake::Task["spec:prepare"].enhance(["tailwindcss:build"]) elsif Rake::Task.task_defined?("db:test:prepare") Rake::Task["db:test:prepare"].enhance(["tailwindcss:build"]) end From da6e52630cc1885d24b34e8a33f849eb2d6507d1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 21 Jun 2023 16:43:32 -0400 Subject: [PATCH 018/274] update CHANGELOG [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3102d87d..5fd59751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## next / unreleased + +* If defined, the `spec:prepare` rake task will be decorated with `tailwindcss:build` (#271) by @rmehner + + ## v2.0.29 / 2023-04-26 * Update to [Tailwind CSS v3.3.2](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.2) by @flavorjones From 3f24769fa4feaf115d8a346da4df027a3bf7c080 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 13 Jul 2023 13:11:32 -0400 Subject: [PATCH 019/274] dep: bundle update Gemfile.lock --- Gemfile.lock | 80 +++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ed969420..faae2446 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,33 +7,33 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.0.4.3) - actionpack (= 7.0.4.3) - actionview (= 7.0.4.3) - activejob (= 7.0.4.3) - activesupport (= 7.0.4.3) + actionmailer (7.0.6) + actionpack (= 7.0.6) + actionview (= 7.0.6) + activejob (= 7.0.6) + activesupport (= 7.0.6) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.0) - actionpack (7.0.4.3) - actionview (= 7.0.4.3) - activesupport (= 7.0.4.3) - rack (~> 2.0, >= 2.2.0) + actionpack (7.0.6) + actionview (= 7.0.6) + activesupport (= 7.0.6) + rack (~> 2.0, >= 2.2.4) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actionview (7.0.4.3) - activesupport (= 7.0.4.3) + actionview (7.0.6) + activesupport (= 7.0.6) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (7.0.4.3) - activesupport (= 7.0.4.3) + activejob (7.0.6) + activesupport (= 7.0.6) globalid (>= 0.3.6) - activesupport (7.0.4.3) + activesupport (7.0.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -42,20 +42,20 @@ GEM concurrent-ruby (1.2.2) crass (1.0.6) date (3.3.3) - debug (1.7.2) + debug (1.8.0) irb (>= 1.5.0) reline (>= 0.3.1) erubi (1.12.0) globalid (1.1.0) activesupport (>= 5.0) - i18n (1.13.0) + i18n (1.14.1) concurrent-ruby (~> 1.0) io-console (0.6.0) - irb (1.6.4) - reline (>= 0.3.0) - loofah (2.20.0) + irb (1.7.3) + reline (>= 0.3.6) + loofah (2.21.3) crass (~> 1.0.2) - nokogiri (>= 1.5.9) + nokogiri (>= 1.12.0) mail (2.8.1) mini_mime (>= 0.1.1) net-imap @@ -63,9 +63,9 @@ GEM net-smtp method_source (1.0.0) mini_mime (1.1.2) - mini_portile2 (2.8.1) - minitest (5.18.0) - net-imap (0.3.4) + mini_portile2 (2.8.2) + minitest (5.18.1) + net-imap (0.3.6) date net-protocol net-pop (0.1.2) @@ -74,37 +74,39 @@ GEM timeout net-smtp (0.3.3) net-protocol - nokogiri (1.14.3) - mini_portile2 (~> 2.8.0) + nokogiri (1.15.3) + mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.14.3-x86_64-darwin) + nokogiri (1.15.3-x86_64-darwin) racc (~> 1.4) - nokogiri (1.14.3-x86_64-linux) + nokogiri (1.15.3-x86_64-linux) racc (~> 1.4) - racc (1.6.2) + racc (1.7.1) rack (2.2.7) rack-test (2.1.0) rack (>= 1.3) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rails-dom-testing (2.1.1) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.5.0) - loofah (~> 2.19, >= 2.19.1) - railties (7.0.4.3) - actionpack (= 7.0.4.3) - activesupport (= 7.0.4.3) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (7.0.6) + actionpack (= 7.0.6) + activesupport (= 7.0.6) method_source rake (>= 12.2) thor (~> 1.0) zeitwerk (~> 2.5) rake (13.0.6) - reline (0.3.3) + reline (0.3.6) io-console (~> 0.5) - thor (1.2.1) - timeout (0.3.2) + thor (1.2.2) + timeout (0.4.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - zeitwerk (2.6.7) + zeitwerk (2.6.8) PLATFORMS ruby From f49eeda701d7ef1f0cb939cac911d2fa1c08a94d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 13 Jul 2023 13:15:29 -0400 Subject: [PATCH 020/274] dep: update tailwindcss to v3.3.3 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.3 --- CHANGELOG.md | 1 + lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fd59751..c35b7ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## next / unreleased +* Update to [Tailwind CSS v3.3.3](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.3) by @flavorjones * If defined, the `spec:prepare` rake task will be decorated with `tailwindcss:build` (#271) by @rmehner diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 1048f0fb..62ed8fc2 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.2" + VERSION = "v3.3.3" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 9e64982ea500e2b498a3a2f2f788b8fc0ffcb43a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 13 Jul 2023 13:28:02 -0400 Subject: [PATCH 021/274] version bump to v2.0.30 --- CHANGELOG.md | 2 +- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c35b7ac6..0ad83495 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ -## next / unreleased +## v2.0.30 / 2023-07-13 * Update to [Tailwind CSS v3.3.3](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.3) by @flavorjones * If defined, the `spec:prepare` rake task will be decorated with `tailwindcss:build` (#271) by @rmehner diff --git a/Gemfile.lock b/Gemfile.lock index faae2446..4f3dc109 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.0.29) + tailwindcss-rails (2.0.30) railties (>= 6.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 41639b39..644ed51d 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.29" + VERSION = "2.0.30" end From 788f01f618ff51c533408269cb6a0521a202f740 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 17 Aug 2023 13:55:12 -0700 Subject: [PATCH 022/274] Consistently use double quotes in all templates --- lib/generators/tailwindcss/scaffold/scaffold_generator.rb | 2 +- .../tailwindcss/scaffold/templates/index.html.erb.tt | 2 +- .../tailwindcss/scaffold/templates/new.html.erb.tt | 2 +- .../tailwindcss/scaffold/templates/partial.html.erb.tt | 2 +- .../tailwindcss/scaffold/templates/show.html.erb.tt | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb index 6c1a2101..e50ea3e8 100644 --- a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb +++ b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb @@ -1,4 +1,4 @@ -require 'rails/generators/erb/scaffold/scaffold_generator' +require "rails/generators/erb/scaffold/scaffold_generator" require "rails/generators/resource_helpers" module Tailwindcss diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index c65409fa..c29d5e6e 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -5,7 +5,7 @@

<%= human_name.pluralize %>

- <%%= link_to 'New <%= human_name.downcase %>', new_<%= singular_route_name %>_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %> + <%%= link_to "New <%= human_name.downcase %>", new_<%= singular_route_name %>_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt index 1f7870f6..61c0a450 100644 --- a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt @@ -3,5 +3,5 @@ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to 'Back to <%= human_name.pluralize.downcase %>', <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt index 55717003..60a0de20 100644 --- a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt @@ -16,7 +16,7 @@ <% end -%> <%% if action_name != "show" %> <%%= link_to "Show this <%= human_name.downcase %>", <%= singular_name %>, class: "rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%%= link_to 'Edit this <%= human_name.downcase %>', edit_<%= singular_name %>_path(<%= singular_name %>), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Edit this <%= human_name.downcase %>", edit_<%= singular_name %>_path(<%= singular_name %>), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %>
<%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index 4bf94e8f..c386118c 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -6,10 +6,10 @@ <%%= render @<%= singular_table_name %> %> - <%%= link_to 'Edit this <%= singular_table_name %>', edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Edit this <%= singular_table_name %>", edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
- <%%= button_to 'Destroy this <%= singular_table_name %>', <%= singular_table_name %>_path(@<%= singular_table_name %>), method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %> + <%%= button_to "Destroy this <%= singular_table_name %>", <%= singular_table_name %>_path(@<%= singular_table_name %>), method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>
- <%%= link_to 'Back to <%= plural_table_name %>', <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Back to <%= plural_table_name %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> From 3dfd6f7b5cf8775863bc24994037e3dd0d46e887 Mon Sep 17 00:00:00 2001 From: Cadu Ribeiro Date: Tue, 10 Oct 2023 13:29:07 -0300 Subject: [PATCH 023/274] Run the server with remote debugging enabled This commit adds the `--open` option so a remote session can be started using `rdbg --attach`. This allows to debug inside a foreman process. --- CHANGELOG.md | 3 +++ lib/install/Procfile.dev | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ad83495..a03a9cc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## next / unreleased + +* Update Procfile.dev to run foreman with `--open` option allowing remote sessions with `rdbg --attach` by @duduribeiro ## v2.0.30 / 2023-07-13 diff --git a/lib/install/Procfile.dev b/lib/install/Procfile.dev index 023e98a0..59915d58 100644 --- a/lib/install/Procfile.dev +++ b/lib/install/Procfile.dev @@ -1,2 +1,2 @@ -web: bin/rails server -p 3000 +web: env RUBY_DEBUG_OPEN=true bin/rails server -p 3000 css: bin/rails tailwindcss:watch From 2da275cb7c600cfa5479018d22d33de628fad7eb Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 10 Oct 2023 14:20:51 -0400 Subject: [PATCH 024/274] test: fix user journey tests to support Rails 7.1 The "about" rake task was removed in e9540260 --- test/integration/user_journey_test.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index c714ea09..0656ba55 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -23,5 +23,11 @@ bundle install bin/rails tailwindcss:install +cat <> Rakefile +task :still_here do + puts "Rake process did not exit early" +end +EOF + # ensure rake tasks don't exec (#188) -bin/rails tailwindcss:build about | grep "About your application" +bin/rails tailwindcss:build still_here | grep "Rake process did not exit early" From 01f17082f8e5854671cfaacedf5fdff3395dea89 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 10 Oct 2023 14:24:56 -0400 Subject: [PATCH 025/274] dep: update Gemfile.lock --- Gemfile.lock | 114 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 44 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4f3dc109..270b56d7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,53 +7,66 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.0.6) - actionpack (= 7.0.6) - actionview (= 7.0.6) - activejob (= 7.0.6) - activesupport (= 7.0.6) + actionmailer (7.1.0) + actionpack (= 7.1.0) + actionview (= 7.1.0) + activejob (= 7.1.0) + activesupport (= 7.1.0) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp - rails-dom-testing (~> 2.0) - actionpack (7.0.6) - actionview (= 7.0.6) - activesupport (= 7.0.6) - rack (~> 2.0, >= 2.2.4) + rails-dom-testing (~> 2.2) + actionpack (7.1.0) + actionview (= 7.1.0) + activesupport (= 7.1.0) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actionview (7.0.6) - activesupport (= 7.0.6) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actionview (7.1.0) + activesupport (= 7.1.0) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (7.0.6) - activesupport (= 7.0.6) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (7.1.0) + activesupport (= 7.1.0) globalid (>= 0.3.6) - activesupport (7.0.6) + activesupport (7.1.0) + 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) + base64 (0.1.1) + bigdecimal (3.1.4) builder (3.2.4) concurrent-ruby (1.2.2) + connection_pool (2.4.1) crass (1.0.6) date (3.3.3) debug (1.8.0) irb (>= 1.5.0) reline (>= 0.3.1) + drb (2.1.1) + ruby2_keywords erubi (1.12.0) - globalid (1.1.0) - activesupport (>= 5.0) + globalid (1.2.1) + activesupport (>= 6.1) i18n (1.14.1) concurrent-ruby (~> 1.0) io-console (0.6.0) - irb (1.7.3) - reline (>= 0.3.6) - loofah (2.21.3) + irb (1.8.1) + rdoc + reline (>= 0.3.8) + loofah (2.21.4) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -61,52 +74,65 @@ GEM net-imap net-pop net-smtp - method_source (1.0.0) - mini_mime (1.1.2) - mini_portile2 (2.8.2) - minitest (5.18.1) - net-imap (0.3.6) + mini_mime (1.1.5) + mini_portile2 (2.8.4) + minitest (5.20.0) + mutex_m (0.1.2) + net-imap (0.4.1) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.1) timeout - net-smtp (0.3.3) + net-smtp (0.4.0) net-protocol - nokogiri (1.15.3) + nokogiri (1.15.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.15.3-x86_64-darwin) + nokogiri (1.15.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.15.3-x86_64-linux) + nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) + psych (5.1.0) + stringio racc (1.7.1) - rack (2.2.7) + rack (3.0.8) + rack-session (2.0.0) + rack (>= 3.0.0) rack-test (2.1.0) rack (>= 1.3) - rails-dom-testing (2.1.1) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + 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.0.6) - actionpack (= 7.0.6) - activesupport (= 7.0.6) - method_source + railties (7.1.0) + actionpack (= 7.1.0) + activesupport (= 7.1.0) + irb + rackup (>= 1.0.0) rake (>= 12.2) - thor (~> 1.0) - zeitwerk (~> 2.5) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) rake (13.0.6) - reline (0.3.6) + rdoc (6.5.0) + psych (>= 4.0.0) + reline (0.3.9) io-console (~> 0.5) + ruby2_keywords (0.0.5) + stringio (3.0.8) thor (1.2.2) timeout (0.4.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - zeitwerk (2.6.8) + webrick (1.8.1) + zeitwerk (2.6.12) PLATFORMS ruby From b473e19a13819638f6a4ff0504ba4da40c71a6aa Mon Sep 17 00:00:00 2001 From: Olly Headey Date: Mon, 9 Oct 2023 20:03:55 +0100 Subject: [PATCH 026/274] Fix deprecation warnings in 3.5.0 --- lib/tailwindcss/commands.rb | 4 ++-- test/lib/tailwindcss/commands_test.rb | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 0020a973..1a4b0855 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -34,7 +34,7 @@ def executable(exe_path: DEFAULT_DIR) MESSAGE end else - if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match(Gem::Platform.new(p)) } + if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match_gem?(Gem::Platform.new(p), nil) } raise UnsupportedPlatformException, <<~MESSAGE tailwindcss-rails does not support the #{platform} platform Please install tailwindcss following instructions at https://tailwindcss.com/docs/installation @@ -42,7 +42,7 @@ def executable(exe_path: DEFAULT_DIR) end exe_file = Dir.glob(File.expand_path(File.join(exe_path, "*", "tailwindcss"))).find do |f| - Gem::Platform.match(Gem::Platform.new(File.basename(File.dirname(f)))) + Gem::Platform.match_gem?(Gem::Platform.new(File.basename(File.dirname(f))), nil) end end diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 142efcfc..d09d8a94 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -7,7 +7,7 @@ def mock_exe_directory(platform) FileUtils.mkdir(File.join(dir, platform)) path = File.join(dir, platform, "tailwindcss") FileUtils.touch(path) - Gem::Platform.stub(:match, true) do + Gem::Platform.stub(:match_gem?, true) do yield(dir, path) end end @@ -35,7 +35,7 @@ def mock_local_tailwindcss_install end test ".executable raises UnsupportedPlatformException when we're not on a supported platform" do - Gem::Platform.stub(:match, false) do # nothing is supported + Gem::Platform.stub(:match_gem?, false) do # nothing is supported assert_raises(Tailwindcss::Commands::UnsupportedPlatformException) do Tailwindcss::Commands.executable end @@ -66,7 +66,7 @@ def mock_local_tailwindcss_install end test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR when we're not on a supported platform" do - Gem::Platform.stub(:match, false) do # nothing is supported + Gem::Platform.stub(:match_gem?, false) do # nothing is supported mock_local_tailwindcss_install do |local_install_dir, expected| result = nil begin From a5dd494944ce1d9271f9a69bb0ea725da2fa89a3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 10 Oct 2023 14:48:30 -0400 Subject: [PATCH 027/274] pass the gem name to Gem::Platform.match_gem? Although this argument isn't used in the CRuby implementation, other implementations (specifically TruffleRuby) reserve the right to re-implement this method with special cases for specific gems. More context at rubygems/rubygems#3817 --- lib/tailwindcss/commands.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 1a4b0855..b1367c66 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -3,6 +3,7 @@ module Tailwindcss module Commands DEFAULT_DIR = File.expand_path(File.join(__dir__, "..", "..", "exe")) + GEM_NAME = "tailwindcss-rails" # raised when the host platform is not supported by upstream tailwindcss's binary releases class UnsupportedPlatformException < StandardError @@ -34,7 +35,7 @@ def executable(exe_path: DEFAULT_DIR) MESSAGE end else - if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match_gem?(Gem::Platform.new(p), nil) } + if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match_gem?(Gem::Platform.new(p), GEM_NAME) } raise UnsupportedPlatformException, <<~MESSAGE tailwindcss-rails does not support the #{platform} platform Please install tailwindcss following instructions at https://tailwindcss.com/docs/installation @@ -42,7 +43,7 @@ def executable(exe_path: DEFAULT_DIR) end exe_file = Dir.glob(File.expand_path(File.join(exe_path, "*", "tailwindcss"))).find do |f| - Gem::Platform.match_gem?(Gem::Platform.new(File.basename(File.dirname(f))), nil) + Gem::Platform.match_gem?(Gem::Platform.new(File.basename(File.dirname(f))), GEM_NAME) end end From ad7edc914a33fb7e2b005135210e2e804e0abded Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 10 Oct 2023 15:05:49 -0400 Subject: [PATCH 028/274] version bump to v2.0.31 --- CHANGELOG.md | 6 ++++-- lib/tailwindcss/version.rb | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a03a9cc3..9c755e5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ -## next / unreleased +## v2.0.31 / 2023-10-10 + +* Update Procfile.dev to run foreman with `--open` option allowing remote sessions with `rdbg --attach` (#281) by @duduribeiro +* Address Rubygems 3.5.0 deprecation warnings (#280) by @lylo -* Update Procfile.dev to run foreman with `--open` option allowing remote sessions with `rdbg --attach` by @duduribeiro ## v2.0.30 / 2023-07-13 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 644ed51d..bb255445 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.30" + VERSION = "2.0.31" end From a648c2c13caf7b62ac4a2ce221c5322caed0d985 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 27 Oct 2023 13:56:30 -0400 Subject: [PATCH 029/274] dep: tailwindcss 3.3.5 (from 3.3.3) --- CHANGELOG.md | 6 ++++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c755e5d..fe3cb3c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.3.5](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.5) from v3.3.3 by @flavorjones + * Also see [v3.3.4 release notes](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.4) + + ## v2.0.31 / 2023-10-10 * Update Procfile.dev to run foreman with `--open` option allowing remote sessions with `rdbg --attach` (#281) by @duduribeiro diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 62ed8fc2..83f4daed 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.3" + VERSION = "v3.3.5" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From bcbd8360c8d9ff2df88f2396eb9bfa985a6d877d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 27 Oct 2023 15:11:29 -0400 Subject: [PATCH 030/274] test: assert on the existence of Gem::Platform.match_gem? to avoid stubbing a method that doesn't exist --- test/lib/tailwindcss/commands_test.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index d09d8a94..47112225 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -7,12 +7,19 @@ def mock_exe_directory(platform) FileUtils.mkdir(File.join(dir, platform)) path = File.join(dir, platform, "tailwindcss") FileUtils.touch(path) - Gem::Platform.stub(:match_gem?, true) do + stub_gem_platform_match_gem(true) do yield(dir, path) end end end + def stub_gem_platform_match_gem(value) + assert_respond_to(Gem::Platform, :match_gem?) + Gem::Platform.stub(:match_gem?, value) do + yield + end + end + def mock_local_tailwindcss_install Dir.mktmpdir do |dir| path = File.join(dir, "tailwindcss") @@ -35,7 +42,7 @@ def mock_local_tailwindcss_install end test ".executable raises UnsupportedPlatformException when we're not on a supported platform" do - Gem::Platform.stub(:match_gem?, false) do # nothing is supported + stub_gem_platform_match_gem(false) do # nothing is supported assert_raises(Tailwindcss::Commands::UnsupportedPlatformException) do Tailwindcss::Commands.executable end @@ -66,7 +73,7 @@ def mock_local_tailwindcss_install end test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR when we're not on a supported platform" do - Gem::Platform.stub(:match_gem?, false) do # nothing is supported + stub_gem_platform_match_gem(false) do # nothing is supported mock_local_tailwindcss_install do |local_install_dir, expected| result = nil begin From 44b470d18b46467e7340378914f805ade485079a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 27 Oct 2023 14:53:34 -0400 Subject: [PATCH 031/274] dep: rubygems >= 3.2.0 for Platform#match_gem? Closes #286 --- .github/workflows/ci.yml | 1 + tailwindcss-rails.gemspec | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 01135a4a..c78545e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: ${{matrix.ruby}} + rubygems: latest bundler: latest bundler-cache: true - name: Run tests diff --git a/tailwindcss-rails.gemspec b/tailwindcss-rails.gemspec index 672c9885..02c10fb5 100644 --- a/tailwindcss-rails.gemspec +++ b/tailwindcss-rails.gemspec @@ -14,6 +14,8 @@ Gem::Specification.new do |spec| "rubygems_mfa_required" => "true" } + spec.required_rubygems_version = ">= 3.2.0" # for Gem::Platform#match_gem? + spec.files = Dir["{app,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"] spec.bindir = "exe" spec.executables << "tailwindcss" From 8f33c4ff7b7a076f7634ce2c7e55bd742d8f0592 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 27 Oct 2023 15:22:28 -0400 Subject: [PATCH 032/274] version bump to v2.0.32 --- CHANGELOG.md | 3 ++- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe3cb3c2..99031742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ -## next / unreleased +## v2.0.32 / 2023-10-27 * Update to [Tailwind CSS v3.3.5](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.5) from v3.3.3 by @flavorjones * Also see [v3.3.4 release notes](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.4) +* Restore support for Ruby 2.7, broken in v2.0.31, by explicitly setting `required_rubygems_version = ">= 3.2.0"`. (#286) by @flavorjones ## v2.0.31 / 2023-10-10 diff --git a/Gemfile.lock b/Gemfile.lock index 270b56d7..5c4d2d0b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.0.30) + tailwindcss-rails (2.0.32) railties (>= 6.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index bb255445..892ad7b1 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.31" + VERSION = "2.0.32" end From ce371859952b5938a3695501a559cf0b889b1431 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 2 Dec 2023 15:20:28 -0500 Subject: [PATCH 033/274] ci: introduce a new empty workflow for upstream testing --- .github/workflows/upstream.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/upstream.yml diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml new file mode 100644 index 00000000..a9a64a00 --- /dev/null +++ b/.github/workflows/upstream.yml @@ -0,0 +1,20 @@ +name: upstream +concurrency: + group: "${{github.workflow}}-${{github.ref}}" + cancel-in-progress: true +on: + workflow_dispatch: + schedule: + - cron: "0 8 * * 3" # At 08:00 on Wednesday # https://crontab.guru/#0_8_*_*_3 + pull_request: + types: [opened, synchronize] + branches: + - '*' + paths: + - .github/workflows/upstream.yml # this file + +jobs: + rails: + name: empty job + steps: + run: echo hello world From 67910e0bdf54371ae903a8720aba796a2be36525 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 2 Dec 2023 15:22:05 -0500 Subject: [PATCH 034/274] ci: fix upstream pipeline --- .github/workflows/upstream.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index a9a64a00..df1a3305 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -17,4 +17,4 @@ jobs: rails: name: empty job steps: - run: echo hello world + - run: echo hello world From 9539fe525f89ba8d7649d1a7551e5e0ce4a2283d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 2 Dec 2023 15:22:59 -0500 Subject: [PATCH 035/274] ci: another fix for the upstream workflow --- .github/workflows/upstream.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index df1a3305..ab773d7e 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -16,5 +16,6 @@ on: jobs: rails: name: empty job + runs-on: ubuntu-latest steps: - run: echo hello world From faed80f38ee5e66a5fa250984844775b2f6f14b1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 2 Dec 2023 15:25:57 -0500 Subject: [PATCH 036/274] ci: more thorough user journey, integrated with rails main --- .github/workflows/ci.yml | 4 +--- .github/workflows/upstream.yml | 20 +++++++++++++---- test/integration/user_journey_test.sh | 32 ++++++++++++++++++++------- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c78545e4..131f660d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,11 +40,9 @@ jobs: runs-on: ${{matrix.plat}}-latest steps: - uses: actions/checkout@v3 - - run: rm Gemfile.lock - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" - bundler-cache: true + ruby-version: "3.2" bundler: latest - run: test/integration/user_journey_test.sh shell: bash diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index ab773d7e..4af7c643 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -14,8 +14,20 @@ on: - .github/workflows/upstream.yml # this file jobs: - rails: - name: empty job - runs-on: ubuntu-latest + user-journey: + name: "user-journey (rails main)" + strategy: + fail-fast: false + matrix: + plat: ["ubuntu", "windows", "macos"] + runs-on: ${{matrix.plat}}-latest + env: + RAILSOPTS: --git=https://github.com/rails/rails --branch main steps: - - run: echo hello world + - uses: actions/checkout@v3 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + bundler: latest + - run: test/integration/user_journey_test.sh + shell: bash diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 0656ba55..95c3174d 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -5,29 +5,45 @@ set -o pipefail set -eux +# set up dependencies +rm -f Gemfile.lock +bundle remove actionmailer +bundle add rails --skip-install ${RAILSOPTS:-} +bundle install + # fetch the upstream executables bundle exec rake download -# create a rails app in a directory with spaces in the name (#176, #184) -rm -rf "Has A Space" -mkdir "Has A Space" -pushd "Has A Space" +# do our work a directory with spaces in the name (#176, #184) +rm -rf "My Workspace" +mkdir "My Workspace" +pushd "My Workspace" -gem install rails -rails new test-app --skip-bundle +# create a rails app +bundle exec rails -v +bundle exec rails new test-app --skip-bundle pushd test-app -# install tailwindcss-rails +# make sure to use the same version of rails (e.g., install from git source if necessary) +bundle remove rails +bundle add rails --skip-install ${RAILSOPTS:-} + +# use the tailwindcss-rails under test bundle add tailwindcss-rails --path="../.." bundle install +bundle show --paths +# install tailwindcss bin/rails tailwindcss:install +# TEST: tailwind was installed correctly +grep tailwind app/views/layouts/application.html.erb + +# TEST: rake tasks don't exec (#188) cat <> Rakefile task :still_here do puts "Rake process did not exit early" end EOF -# ensure rake tasks don't exec (#188) bin/rails tailwindcss:build still_here | grep "Rake process did not exit early" From 13ceea6f9fde6ffbb4af07869f7cd4738bf05f4c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 2 Dec 2023 15:37:03 -0500 Subject: [PATCH 037/274] ci: latest alpine builds don't have build-base let's install it so we can compile C extensions when needed --- .github/workflows/gem-install.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml index 6f537004..0e569863 100644 --- a/.github/workflows/gem-install.yml +++ b/.github/workflows/gem-install.yml @@ -74,6 +74,7 @@ jobs: with: name: gem-x86_64-linux path: pkg + - run: "apk add build-base" # to compile racc, etc. - run: "gem update --system" # let's make sure the latest is working for us (upstream test, see #200) - run: "gem install pkg/tailwindcss-rails-*.gem" - run: "tailwindcss --help" From 5933a40bfa5337726edc882a9115c6c5ec163bc3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 2 Dec 2023 15:39:04 -0500 Subject: [PATCH 038/274] ci: update to test ruby 3.2, and add ruby-head coverage --- .github/workflows/ci.yml | 2 +- .github/workflows/gem-install.yml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 131f660d..1239459b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - ruby: ["2.7", "3.0", "3.1", "3.2"] + ruby: ["2.7", "3.0", "3.1", "3.2", "head"] steps: - uses: actions/checkout@v3 - run: rm Gemfile.lock diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml index 0e569863..8b2fc1fa 100644 --- a/.github/workflows/gem-install.yml +++ b/.github/workflows/gem-install.yml @@ -26,7 +26,7 @@ jobs: - run: rm Gemfile.lock - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.2" bundler: latest bundler-cache: true - run: "bundle exec rake gem:${{matrix.platform}}" @@ -42,7 +42,7 @@ jobs: steps: - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.2" - uses: actions/download-artifact@v3 with: name: gem-ruby @@ -56,7 +56,7 @@ jobs: steps: - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.2" - uses: actions/download-artifact@v3 with: name: gem-x86_64-linux @@ -68,7 +68,7 @@ jobs: needs: ["package"] runs-on: ubuntu-latest container: - image: ruby:3.1-alpine + image: ruby:3.2-alpine steps: - uses: actions/download-artifact@v3 with: @@ -89,7 +89,7 @@ jobs: path: pkg - run: | docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm -v "$(pwd):/test" -w /test --platform=linux/arm/v7 ruby:3.1 \ + docker run --rm -v "$(pwd):/test" -w /test --platform=linux/arm/v7 ruby:3.2 \ /bin/bash -c " set -ex gem install pkg/tailwindcss-rails-*.gem @@ -102,7 +102,7 @@ jobs: steps: - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.2" - uses: actions/download-artifact@v3 with: name: gem-x86_64-darwin @@ -130,7 +130,7 @@ jobs: steps: - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.2" - uses: actions/download-artifact@v3 with: name: gem-x64-mingw-ucrt From 0e62569bc587afc3bdce4fa36df506031f7b2858 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 9 Dec 2023 13:35:59 -0500 Subject: [PATCH 039/274] dep: update tailwindcss to 3.3.6 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99031742..93f9d4bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.3.6](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.6) from v3.3.5 by @flavorjones + + ## v2.0.32 / 2023-10-27 * Update to [Tailwind CSS v3.3.5](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.5) from v3.3.3 by @flavorjones diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 83f4daed..ffb2d85e 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.5" + VERSION = "v3.3.6" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 674551bd53f192fcc16bb14f34b7cbd90a923c68 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 9 Dec 2023 13:44:49 -0500 Subject: [PATCH 040/274] version bump to v2.0.33 --- CHANGELOG.md | 2 +- lib/tailwindcss/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93f9d4bf..73e33b30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v2.0.33 / 2023-12-09 * Update to [Tailwind CSS v3.3.6](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.6) from v3.3.5 by @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 892ad7b1..70ff0fcc 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.32" + VERSION = "2.0.33" end From 3d43f91c6133fa5f3aca1080111d3b84a3f7a3d8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 09:19:35 -0500 Subject: [PATCH 041/274] dep(lockfile): bundle update --- Gemfile.lock | 87 ++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5c4d2d0b..859c7b81 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,41 +1,42 @@ PATH remote: . specs: - tailwindcss-rails (2.0.32) + tailwindcss-rails (2.0.33) railties (>= 6.0.0) GEM remote: https://rubygems.org/ specs: - actionmailer (7.1.0) - actionpack (= 7.1.0) - actionview (= 7.1.0) - activejob (= 7.1.0) - activesupport (= 7.1.0) + actionmailer (7.1.2) + actionpack (= 7.1.2) + actionview (= 7.1.2) + activejob (= 7.1.2) + activesupport (= 7.1.2) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.0) - actionview (= 7.1.0) - activesupport (= 7.1.0) + actionpack (7.1.2) + actionview (= 7.1.2) + activesupport (= 7.1.2) nokogiri (>= 1.8.5) + racc rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.0) - activesupport (= 7.1.0) + actionview (7.1.2) + activesupport (= 7.1.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.0) - activesupport (= 7.1.0) + activejob (7.1.2) + activesupport (= 7.1.2) globalid (>= 0.3.6) - activesupport (7.1.0) + activesupport (7.1.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -45,28 +46,28 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - base64 (0.1.1) - bigdecimal (3.1.4) + base64 (0.2.0) + bigdecimal (3.1.5) builder (3.2.4) concurrent-ruby (1.2.2) connection_pool (2.4.1) crass (1.0.6) - date (3.3.3) - debug (1.8.0) - irb (>= 1.5.0) - reline (>= 0.3.1) - drb (2.1.1) + date (3.3.4) + debug (1.9.0) + irb (~> 1.10) + reline (>= 0.3.8) + drb (2.2.0) ruby2_keywords 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) + io-console (0.7.1) + irb (1.10.1) rdoc reline (>= 0.3.8) - loofah (2.21.4) + loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -75,28 +76,28 @@ GEM net-pop net-smtp mini_mime (1.1.5) - mini_portile2 (2.8.4) + mini_portile2 (2.8.5) minitest (5.20.0) - mutex_m (0.1.2) - net-imap (0.4.1) + mutex_m (0.2.0) + net-imap (0.4.8) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout net-smtp (0.4.0) net-protocol - nokogiri (1.15.4) + nokogiri (1.15.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.15.4-x86_64-darwin) + nokogiri (1.15.5-x86_64-darwin) racc (~> 1.4) - nokogiri (1.15.4-x86_64-linux) + nokogiri (1.15.5-x86_64-linux) racc (~> 1.4) - psych (5.1.0) + psych (5.1.2) stringio - racc (1.7.1) + racc (1.7.3) rack (3.0.8) rack-session (2.0.0) rack (>= 3.0.0) @@ -112,23 +113,23 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.0) - actionpack (= 7.1.0) - activesupport (= 7.1.0) + railties (7.1.2) + actionpack (= 7.1.2) + activesupport (= 7.1.2) 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) + rake (13.1.0) + rdoc (6.6.2) psych (>= 4.0.0) - reline (0.3.9) + reline (0.4.1) io-console (~> 0.5) ruby2_keywords (0.0.5) - stringio (3.0.8) - thor (1.2.2) - timeout (0.4.0) + stringio (3.1.0) + thor (1.3.0) + timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) webrick (1.8.1) @@ -145,4 +146,4 @@ DEPENDENCIES tailwindcss-rails! BUNDLED WITH - 2.4.7 + 2.5.1 From f995da2b3d6f145fadb64aab739240025c6164d9 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 09:20:27 -0500 Subject: [PATCH 042/274] dep: bump tailwindcss to v3.3.7 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.7 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73e33b30..40676c25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.3.7](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.7) from v3.3.6 by @flavorjones + + ## v2.0.33 / 2023-12-09 * Update to [Tailwind CSS v3.3.6](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.6) from v3.3.5 by @flavorjones diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index ffb2d85e..a64f6b34 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.6" + VERSION = "v3.3.7" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 05bc2d3963aa4045ca24c9286c56eb365c63f5c8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 10:10:33 -0500 Subject: [PATCH 043/274] ci: do not fail fast --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1239459b..066f9460 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,7 @@ jobs: tests: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: ruby: ["2.7", "3.0", "3.1", "3.2", "head"] steps: From 62339402ac980a5b68649b173e7553a718b0ee42 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 10:16:14 -0500 Subject: [PATCH 044/274] ci: pin rubygems update because latest rubygems-update doesn't support Ruby 2.7 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 066f9460..a35639b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: ${{matrix.ruby}} - rubygems: latest + rubygems: "3.4.22" # last version to support Ruby 2.7 bundler: latest bundler-cache: true - name: Run tests From 2523760fd11e41e11594ff8c40e4adba9e49a843 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 13:43:58 -0500 Subject: [PATCH 045/274] dep: update tailwindcss to v3.4.0 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.0 --- CHANGELOG.md | 2 +- lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40676c25..301dc562 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## next / unreleased -* Update to [Tailwind CSS v3.3.7](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.3.7) from v3.3.6 by @flavorjones +* Update to [Tailwind CSS v3.4.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.0) from v3.3.6 by @flavorjones ## v2.0.33 / 2023-12-09 diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index a64f6b34..ed11a88f 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.3.7" + VERSION = "v3.4.0" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 172b08086c06441aad9812dfb90e2579c71c2f82 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 14:57:40 -0500 Subject: [PATCH 046/274] version bump to v2.1.0 --- CHANGELOG.md | 2 +- lib/tailwindcss/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 301dc562..d1a7f5da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v2.1.0 / 2023-12-19 * Update to [Tailwind CSS v3.4.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.0) from v3.3.6 by @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 70ff0fcc..75b38451 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.0.33" + VERSION = "2.1.0" end From 8f7c0a3d52d4c3a1982dff0551989925bdec1746 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 19 Dec 2023 15:02:02 -0500 Subject: [PATCH 047/274] dep: bump Gemfile.lock --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 859c7b81..0a7c4626 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.0.33) + tailwindcss-rails (2.1.0) railties (>= 6.0.0) GEM From 79c1943d5d5ccee191b36e5f901e245612948f06 Mon Sep 17 00:00:00 2001 From: m-nakamura145 Date: Wed, 3 Jan 2024 21:38:36 +0900 Subject: [PATCH 048/274] Add Ruby 3.3 to CI matrix --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a35639b0..9aa5a379 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - ruby: ["2.7", "3.0", "3.1", "3.2", "head"] + ruby: ["2.7", "3.0", "3.1", "3.2", "3.3", "head"] steps: - uses: actions/checkout@v3 - run: rm Gemfile.lock From cf872d6d1935d127ac067dfd668d656acc8ce336 Mon Sep 17 00:00:00 2001 From: Nick Pezza Date: Wed, 20 Dec 2023 19:43:20 -0500 Subject: [PATCH 049/274] Add puma plugin --- README.md | 7 ++++ lib/puma/plugin/tailwindcss.rb | 63 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 lib/puma/plugin/tailwindcss.rb diff --git a/README.md b/README.md index 4c540e8c..91075bb0 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,13 @@ The inline version also works:
Has the image as it's background
``` +## Puma plugin +We provide a Puma plugin if you want to run the Tailwind watcher together with Puma and have Puma monitor and manage it. Add +```ruby +plugin :tailwindcss if ENV.fetch("RAILS_ENV", "development") == "development" +``` +to your `puma.rb` configuration. + ## License Tailwind for Rails is released under the [MIT License](https://opensource.org/licenses/MIT). diff --git a/lib/puma/plugin/tailwindcss.rb b/lib/puma/plugin/tailwindcss.rb new file mode 100644 index 00000000..d78b068e --- /dev/null +++ b/lib/puma/plugin/tailwindcss.rb @@ -0,0 +1,63 @@ +require "puma/plugin" + +Puma::Plugin.create do + attr_reader :puma_pid, :tailwind_pid, :log_writer + + def start(launcher) + @log_writer = launcher.log_writer + @puma_pid = $$ + @tailwind_pid = fork do + Thread.new { monitor_puma } + system(*Tailwindcss::Commands.watch_command) + end + + launcher.events.on_stopped { stop_tailwind } + + in_background do + monitor_tailwind + end + end + + private + def stop_tailwind + Process.waitpid(tailwind_pid, Process::WNOHANG) + log "Stopping tailwind..." + Process.kill(:INT, tailwind_pid) if tailwind_pid + Process.wait(tailwind_pid) + rescue Errno::ECHILD, Errno::ESRCH + end + + def monitor_puma + monitor(:puma_dead?, "Detected Puma has gone away, stopping tailwind...") + end + + def monitor_tailwind + monitor(:tailwind_dead?, "Detected tailwind has gone away, stopping Puma...") + end + + def monitor(process_dead, message) + loop do + if send(process_dead) + log message + Process.kill(:INT, $$) + break + end + sleep 2 + end + end + + def tailwind_dead? + Process.waitpid(tailwind_pid, Process::WNOHANG) + false + rescue Errno::ECHILD, Errno::ESRCH + true + end + + def puma_dead? + Process.ppid != puma_pid + end + + def log(...) + log_writer.log(...) + end +end From 18a721ec77bd6f95561b1f9544efb44e7b3dded8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 4 Jan 2024 16:52:17 -0500 Subject: [PATCH 050/274] doc: rework README to feature the Puma plugin and add a CHANGELOG entry --- CHANGELOG.md | 5 +++++ README.md | 34 ++++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1a7f5da..d79f9986 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Introduce a Puma plugin to manage the Tailwind "watch" process from `rails server`. (#300) @npezza93 + + ## v2.1.0 / 2023-12-19 * Update to [Tailwind CSS v3.4.0](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.0) from v3.3.6 by @flavorjones diff --git a/README.md b/README.md index 91075bb0..a78f6c8b 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,26 @@ The `tailwindcss:build` task is automatically attached to the `test:prepare` Rak ### Update assets automatically -While you're developing your application, you want to run Tailwind in "watch" mode, so changes are automatically reflected in the generated CSS output. You can do this by: +While you're developing your application, you want to run Tailwind in "watch" mode, so changes are automatically reflected in the generated CSS output. You can do this in a few different ways: -- running `rails tailwindcss:watch` as a separate process, -- or by running `./bin/dev` which uses [foreman](https://github.com/ddollar/foreman) to start both the Tailwind watch process and the rails server in development mode. +- use the [Puma](https://puma.io/) plugin to integrate "watch" with `rails server`, or +- run `rails tailwindcss:watch` as a separate process, or +- run `bin/dev` which uses [Foreman](https://github.com/ddollar/foreman) + +#### Puma plugin + +The Puma plugin requires you to add this line to your `puma.rb` configuration: + +```ruby +plugin :tailwindcss if ENV.fetch("RAILS_ENV", "development") == "development" +``` + +and then running `rails server` will run the Tailwind watch process in the background + + +#### Run `rails tailwindcss:watch` + +This is a flexible command, which can be run with a few different options. If you are running `rails tailwindcss:watch` on a system that doesn't fully support file system events, pass a `poll` argument to the task to instruct tailwindcss to instead use polling: `rails tailwindcss:watch[poll]`. If you use `bin/dev` then you should modify your `Procfile.dev`. @@ -72,6 +88,11 @@ If you are running `rails tailwindcss:watch` as a process in a Docker container, If you are running `rails tailwindcss:watch` in a docker container without a tty, pass the `always` argument to the task to instruct tailwindcss to keep the watcher alive even when `stdin` is closed: `rails tailwindcss:watch[always]`. If you use `bin/dev` then you should modify your `Procfile.dev`. +#### Foreman + +Running `bin/dev` invokes Foreman to start both the Tailwind watch process and the rails server in development mode based on your `Procfile.dev` file. + + ### Debugging with unminified assets If you want unminified assets, you can pass a `debug` argument to the rake task, i.e. `rails tailwindcss:build[debug]` or `rails tailwindcss:watch[debug]`. @@ -171,13 +192,6 @@ The inline version also works:
Has the image as it's background
``` -## Puma plugin -We provide a Puma plugin if you want to run the Tailwind watcher together with Puma and have Puma monitor and manage it. Add -```ruby -plugin :tailwindcss if ENV.fetch("RAILS_ENV", "development") == "development" -``` -to your `puma.rb` configuration. - ## License Tailwind for Rails is released under the [MIT License](https://opensource.org/licenses/MIT). From cbc1ca7f70db18c4fb90aa1e13be564be603609a Mon Sep 17 00:00:00 2001 From: Elia Schito Date: Thu, 16 Nov 2023 11:58:36 +0100 Subject: [PATCH 051/274] Default to port 3000 while allowing override With this configuration `bin/dev` will use port 3000, but `bin/dev -p 3001` will correctly start the server on port 3001. --- lib/install/Procfile.dev | 2 +- lib/install/dev | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/install/Procfile.dev b/lib/install/Procfile.dev index 59915d58..cce5ded9 100644 --- a/lib/install/Procfile.dev +++ b/lib/install/Procfile.dev @@ -1,2 +1,2 @@ -web: env RUBY_DEBUG_OPEN=true bin/rails server -p 3000 +web: env RUBY_DEBUG_OPEN=true bin/rails server css: bin/rails tailwindcss:watch diff --git a/lib/install/dev b/lib/install/dev index 74ade166..a4e05fa1 100755 --- a/lib/install/dev +++ b/lib/install/dev @@ -5,4 +5,7 @@ if ! gem list foreman -i --silent; then gem install foreman fi +# Default to port 3000 if not specified +export PORT="${PORT:-3000}" + exec foreman start -f Procfile.dev "$@" From 313f257697ff5ca3a637905f811064c8576f4276 Mon Sep 17 00:00:00 2001 From: Elia Schito Date: Thu, 16 Nov 2023 12:01:26 +0100 Subject: [PATCH 052/274] Lazily load the debugger gem Some docker environments will trigger an error related to unix sockets and permissions on temporary folders. Loading the debugger lazily mitigates the issue so at least rails can be started without crashing, while keeping the remote debugging available for other environments that support it. --- lib/install/Procfile.dev | 2 +- lib/install/dev | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/install/Procfile.dev b/lib/install/Procfile.dev index cce5ded9..da151fee 100644 --- a/lib/install/Procfile.dev +++ b/lib/install/Procfile.dev @@ -1,2 +1,2 @@ -web: env RUBY_DEBUG_OPEN=true bin/rails server +web: bin/rails server css: bin/rails tailwindcss:watch diff --git a/lib/install/dev b/lib/install/dev index a4e05fa1..ad72c7d5 100755 --- a/lib/install/dev +++ b/lib/install/dev @@ -8,4 +8,9 @@ fi # Default to port 3000 if not specified export PORT="${PORT:-3000}" +# Let the debug gem allow remote connections, +# but avoid loading until `debugger` is called +export RUBY_DEBUG_OPEN="true" +export RUBY_DEBUG_LAZY="true" + exec foreman start -f Procfile.dev "$@" From c8851a62688ed9b6b071cb749fe8fdec3a8b98ca Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 4 Jan 2024 17:13:18 -0500 Subject: [PATCH 053/274] doc: update CHANGELOG [skip ci] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d79f9986..e01afaa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## next / unreleased * Introduce a Puma plugin to manage the Tailwind "watch" process from `rails server`. (#300) @npezza93 +* Lazily load the debugger gem when running `bin/dev` (#292) @elia +* Allow choosing a custom port with a `PORT` environment variable when running `bin/dev` (#292) @elia ## v2.1.0 / 2023-12-19 From 8658b4bfba528f5d26422bb9012f9fc9d957ea84 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 4 Jan 2024 17:20:04 -0500 Subject: [PATCH 054/274] version bump to v2.2.0 --- CHANGELOG.md | 2 +- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e01afaa5..b165388d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v2.2.0 / 2023-01-04 * Introduce a Puma plugin to manage the Tailwind "watch" process from `rails server`. (#300) @npezza93 * Lazily load the debugger gem when running `bin/dev` (#292) @elia diff --git a/Gemfile.lock b/Gemfile.lock index 0a7c4626..6a50164e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.1.0) + tailwindcss-rails (2.2.0) railties (>= 6.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 75b38451..8c83c66c 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.1.0" + VERSION = "2.2.0" end From f989541ccfd8029fd0fdc967bb50ee6d62e8b51c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 09:54:04 -0500 Subject: [PATCH 055/274] dep: update tailwindcss to v3.4.1 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b165388d..38f93f37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones + + ## v2.2.0 / 2023-01-04 * Introduce a Puma plugin to manage the Tailwind "watch" process from `rails server`. (#300) @npezza93 diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index ed11a88f..8dd7d8e5 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.0" + VERSION = "v3.4.1" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 66d81141499cf6b3602ac7fa54dd6d89e7831e1c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 11:57:59 -0500 Subject: [PATCH 056/274] dev: validate sha256 checksums from upstream when packaging --- rakelib/package.rake | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/rakelib/package.rake b/rakelib/package.rake index 53416ac5..095ef445 100644 --- a/rakelib/package.rake +++ b/rakelib/package.rake @@ -74,6 +74,9 @@ end TAILWINDCSS_RAILS_GEMSPEC = Bundler.load_gemspec("tailwindcss-rails.gemspec") +# prepend the download task before the Gem::PackageTask tasks +task :package => :download + gem_path = Gem::PackageTask.new(TAILWINDCSS_RAILS_GEMSPEC).define desc "Build the ruby gem" task "gem:ruby" => [gem_path] @@ -110,7 +113,33 @@ Tailwindcss::Upstream::NATIVE_PLATFORMS.each do |platform, filename| end end +desc "Validate checksums for tailwindcss binaries" +task "check" => exepaths do + sha_filename = "sha256sums.txt" + sha_url = tailwindcss_download_url(sha_filename) + gemspec = TAILWINDCSS_RAILS_GEMSPEC + + checksums = URI.open(sha_url).each_line.map do |line| + checksum, file = line.split + [File.basename(file), checksum] + end.to_h + + Tailwindcss::Upstream::NATIVE_PLATFORMS.each do |platform, filename| + exedir = File.join(gemspec.bindir, platform) # "exe/x86_64-linux" + exepath = File.join(exedir, "tailwindcss") # "exe/x86_64-linux/tailwindcss" + + local_sha256 = Digest::SHA256.file(exepath).hexdigest + remote_sha256 = checksums.fetch(filename) + + if local_sha256 == remote_sha256 + puts "Checksum OK for #{exepath} (#{local_sha256})" + else + abort "Checksum mismatch for #{exepath} (#{local_sha256} != #{remote_sha256})" + end + end +end + desc "Download all tailwindcss binaries" -task "download" => exepaths +task "download" => :check CLOBBER.add(exepaths.map { |p| File.dirname(p) }) From bfe600b96c8b6f4a8a95632db1e23a4dd9fc1bcd Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 12:32:56 -0500 Subject: [PATCH 057/274] fix: password form field classes Fixes #304 --- lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index ed1a4e1c..adbd5b7e 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -15,7 +15,7 @@
<% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password %> + <%%= form.password_field :password, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %>
From 2cbf5cce86dc4afb451ee5774e4a5869691bc31f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 13:37:17 -0500 Subject: [PATCH 058/274] fix: mailer generation with namespaces Fixes #272 --- .../mailer/templates/layout.html.erb.tt | 13 ++++++++ .../mailer/templates/layout.text.erb.tt | 1 + .../tailwindcss/mailer_generator_test.rb | 32 ++++++++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 lib/generators/tailwindcss/mailer/templates/layout.html.erb.tt create mode 100644 lib/generators/tailwindcss/mailer/templates/layout.text.erb.tt diff --git a/lib/generators/tailwindcss/mailer/templates/layout.html.erb.tt b/lib/generators/tailwindcss/mailer/templates/layout.html.erb.tt new file mode 100644 index 00000000..116e625b --- /dev/null +++ b/lib/generators/tailwindcss/mailer/templates/layout.html.erb.tt @@ -0,0 +1,13 @@ + + + + + + + + + <%%= yield %> + + diff --git a/lib/generators/tailwindcss/mailer/templates/layout.text.erb.tt b/lib/generators/tailwindcss/mailer/templates/layout.text.erb.tt new file mode 100644 index 00000000..6363733e --- /dev/null +++ b/lib/generators/tailwindcss/mailer/templates/layout.text.erb.tt @@ -0,0 +1 @@ +<%%= yield %> diff --git a/test/lib/generators/tailwindcss/mailer_generator_test.rb b/test/lib/generators/tailwindcss/mailer_generator_test.rb index db604bd3..a8a65d96 100644 --- a/test/lib/generators/tailwindcss/mailer_generator_test.rb +++ b/test/lib/generators/tailwindcss/mailer_generator_test.rb @@ -3,7 +3,7 @@ require "generators/tailwindcss/mailer/mailer_generator" class Tailwindcss::Generators::MailerGeneratorTest < Rails::Generators::TestCase - tests Rails::Generators::MailerGenerator + tests Tailwindcss::Generators::MailerGenerator destination Dir.mktmpdir arguments %w(Notifications invoice) @@ -20,6 +20,36 @@ class Tailwindcss::Generators::MailerGeneratorTest < Rails::Generators::TestCase assert_match %r(app/views/notifications_mailer/invoice\.text\.erb), view assert_match(/\= @greeting/, view) end + + assert_file "app/views/layouts/mailer.text.erb" do |view| + assert_match("<%= yield %>", view) + end + + assert_file "app/views/layouts/mailer.html.erb" do |view| + assert_match("<%= yield %>", view) + end + end + + test "generates correct mailer view templates with namespace" do + run_generator ["admin/notifications", "invoice"] + + assert_file "app/views/admin/notifications_mailer/invoice.html.erb" do |view| + assert_match %r(app/views/admin/notifications_mailer/invoice\.html\.erb), view + assert_match(/\= @greeting/, view) + end + + assert_file "app/views/admin/notifications_mailer/invoice.text.erb" do |view| + assert_match %r(app/views/admin/notifications_mailer/invoice\.text\.erb), view + assert_match(/\= @greeting/, view) + end + + assert_file "app/views/layouts/admin/mailer.text.erb" do |view| + assert_match("<%= yield %>", view) + end + + assert_file "app/views/layouts/admin/mailer.html.erb" do |view| + assert_match("<%= yield %>", view) + end end end From e22c8cee8f7e7b92d2cfd3cf3fffdd5e922ae3fe Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 14:13:41 -0500 Subject: [PATCH 059/274] doc: update CHANGELOG.md and CONTRIBUTING.md [skip ci] --- CHANGELOG.md | 1 + CONTRIBUTING.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38f93f37..98cc3cbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## next / unreleased * Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones +* Fix `password` form field styling in generated scaffold forms. (#304, #307) @flavorjones ## v2.2.0 / 2023-01-04 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dd892f92..8c68f93c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,27 @@ This doc is a brief introduction on modifying and maintaining this gem. + +## Testing this gem + +### Running the test suite + +The unit tests are run with `bundle exec rake test` + +There is an additional integration test which runs in CI, `test/integration/user_journey_test.sh` which you may also want to run. + + +### Testing in a Rails app + +If you want to test modifications to this gem, you must run `rake download` once to download the upstream `tailwindcss` executables. + +Then you can point your Rails application's `Gemfile` at the local version of the gem as you normally would: + +``` ruby +gem "tailwindcss-rails", path: "/path/to/tailwindcss-rails" +``` + + ## Updating to the latest upstream tailwindcss version Update `lib/tailwindcss/upstream.rb` with the upstream version. From 682658b6be2e24ffa8aac2579ca269c5f874d44e Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 14:24:34 -0500 Subject: [PATCH 060/274] dev: bundle update --- Gemfile.lock | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6a50164e..2a9461bb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -53,7 +53,7 @@ GEM connection_pool (2.4.1) crass (1.0.6) date (3.3.4) - debug (1.9.0) + debug (1.9.1) irb (~> 1.10) reline (>= 0.3.8) drb (2.2.0) @@ -64,7 +64,7 @@ GEM i18n (1.14.1) concurrent-ruby (~> 1.0) io-console (0.7.1) - irb (1.10.1) + irb (1.11.0) rdoc reline (>= 0.3.8) loofah (2.22.0) @@ -79,21 +79,23 @@ GEM mini_portile2 (2.8.5) minitest (5.20.0) mutex_m (0.2.0) - net-imap (0.4.8) + net-imap (0.4.9.1) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0) + net-smtp (0.4.0.1) net-protocol - nokogiri (1.15.5) + nokogiri (1.16.0) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.15.5-x86_64-darwin) + nokogiri (1.16.0-arm64-darwin) racc (~> 1.4) - nokogiri (1.15.5-x86_64-linux) + nokogiri (1.16.0-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.16.0-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio @@ -124,7 +126,7 @@ GEM rake (13.1.0) rdoc (6.6.2) psych (>= 4.0.0) - reline (0.4.1) + reline (0.4.2) io-console (~> 0.5) ruby2_keywords (0.0.5) stringio (3.1.0) @@ -136,6 +138,7 @@ GEM zeitwerk (2.6.12) PLATFORMS + arm64-darwin ruby x86_64-darwin x86_64-linux @@ -146,4 +149,4 @@ DEPENDENCIES tailwindcss-rails! BUNDLED WITH - 2.5.1 + 2.5.4 From 67e6d670047315c576e4cb151af24ebbddeedf4d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 14:24:53 -0500 Subject: [PATCH 061/274] doc: update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98cc3cbe..4726dfe6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones * Fix `password` form field styling in generated scaffold forms. (#304, #307) @flavorjones +* Fix namespaced mailer generation. (#272, #308) @flavorjones ## v2.2.0 / 2023-01-04 From 45a182e2767515099dec5a2f14905c3303e2fe69 Mon Sep 17 00:00:00 2001 From: Florian Ebeling Date: Sun, 7 Jan 2024 20:52:14 +0100 Subject: [PATCH 062/274] Add section about conflict with with asset pipeline Add a paragraph to the Troubleshooting section about resolving a misconfiguration that otherwise causes double-processing of Tailwind's entry file, as described in issue #190. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a78f6c8b..59f71cf5 100644 --- a/README.md +++ b/README.md @@ -192,6 +192,12 @@ The inline version also works:
Has the image as it's background
``` +### Conflict with pre-existing asset pipeline stylesheets + +If you get a warning `Unrecognized at-rule or error parsing at-rule ‘@tailwind’.` in the browser console after installation, you incorrectly double-process `application.tailwind.css`. This is a misconfiguration, even though the styles will be fully effective in many cases. The file `application.tailwind.css` is installed when running `rails tailwindcss:install` and is placed alongside the common `application.css` in `app/assets/stylesheets`. Because the `application.css` in a newly generated Rails app includes a `require_tree .` directive, the asset pipeline incorrectly processes `application.tailwind.css`, where it should be taken care of by `tailwindcss`. The asset pipeline ignores TailwindCSS's at-directives, and the browser can't process them. + +To fix the warning, you can either remove the `application.css`, if you don't plan to use the asset pipeline for stylesheets, and instead rely on TailwindCSS completely for styles. This is what this installer assumes. Else, if you do want to keep using the asset pipeline in parallel, make sure to remove the `require_tree .` line from the `application.css`. + ## License Tailwind for Rails is released under the [MIT License](https://opensource.org/licenses/MIT). From de635629dc41b1928ca612e410f45672c9fa1431 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 17:51:11 -0500 Subject: [PATCH 063/274] ci: add a job that tests against Rails 6.1 because the scaffold generation changed in Rails 7 --- .github/workflows/ci.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9aa5a379..d7ece617 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,6 +33,24 @@ jobs: - name: Run tests run: bin/test + rails6: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: rm Gemfile.lock + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + bundler: latest + - name: "Pin to Rails 6.1" + run: | + bundle remove actionmailer + bundle add actionmailer --version "~> 6.1" --skip-install + bundle add railties --version "~> 6.1" --skip-install + bundle install + - name: Run tests + run: bin/test + user-journey: strategy: fail-fast: false From 7d35f299ea935a14eb06761b9ec38957e7f025ce Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 21:33:45 -0500 Subject: [PATCH 064/274] version bump to v2.2.1 --- CHANGELOG.md | 2 +- lib/tailwindcss/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4726dfe6..7049d673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v2.2.1 / 2023-01-07 * Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones * Fix `password` form field styling in generated scaffold forms. (#304, #307) @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 8c83c66c..405219b2 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.2.0" + VERSION = "2.2.1" end From 17f18a5735faef051cdbfaa9e7f3480fbc8651fe Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 8 Jan 2024 15:39:59 -0500 Subject: [PATCH 065/274] dev: update tailwindcss-rails version in Gemfile.lock [skip ci] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2a9461bb..5502d297 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.2.0) + tailwindcss-rails (2.2.1) railties (>= 6.0.0) GEM From 23869f560dcebe7a1eb39dfb198210927a23816e Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 16:55:17 -0500 Subject: [PATCH 066/274] style: prefer __dir__ to __FILE__ See rails/rails@40bdbce1 --- lib/generators/tailwindcss/controller/controller_generator.rb | 2 +- lib/generators/tailwindcss/mailer/mailer_generator.rb | 2 +- lib/generators/tailwindcss/scaffold/scaffold_generator.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/generators/tailwindcss/controller/controller_generator.rb b/lib/generators/tailwindcss/controller/controller_generator.rb index 77cc4cc5..1fee0873 100644 --- a/lib/generators/tailwindcss/controller/controller_generator.rb +++ b/lib/generators/tailwindcss/controller/controller_generator.rb @@ -3,7 +3,7 @@ module Tailwindcss module Generators class ControllerGenerator < Erb::Generators::ControllerGenerator - source_root File.expand_path("../templates", __FILE__) + source_root File.expand_path("templates", __dir__) end end end diff --git a/lib/generators/tailwindcss/mailer/mailer_generator.rb b/lib/generators/tailwindcss/mailer/mailer_generator.rb index 730b78c2..eb96b2c7 100644 --- a/lib/generators/tailwindcss/mailer/mailer_generator.rb +++ b/lib/generators/tailwindcss/mailer/mailer_generator.rb @@ -3,7 +3,7 @@ module Tailwindcss module Generators class MailerGenerator < Erb::Generators::MailerGenerator - source_root File.expand_path("../templates", __FILE__) + source_root File.expand_path("templates", __dir__) end end end diff --git a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb index e50ea3e8..ee2b0fad 100644 --- a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb +++ b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb @@ -6,7 +6,7 @@ module Generators class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator include Rails::Generators::ResourceHelpers - source_root File.expand_path("../templates", __FILE__) + source_root File.expand_path("templates", __dir__) argument :attributes, type: :array, default: [], banner: "field:type field:type" From 8f0cd5096fd55c8d59ef37a81591425514844ab5 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 17:20:08 -0500 Subject: [PATCH 067/274] test: use the same temporary directory for the whole test suite and set Rails::Generators.templates_path to include it before the generator classes are instantiated so that the local 'lib/templates' directory is part of the generators' `source_paths`. Also see railties/lib/rails/generators/base.rb and `Rails::Generators::Base.inherited` --- .../tailwindcss/controller_generator_test.rb | 2 +- .../tailwindcss/mailer_generator_test.rb | 2 +- .../tailwindcss/scaffold_generator_test.rb | 14 +++++++++----- test/test_helper.rb | 14 +++++++++++++- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/test/lib/generators/tailwindcss/controller_generator_test.rb b/test/lib/generators/tailwindcss/controller_generator_test.rb index 42b67ec6..d20fdbf5 100644 --- a/test/lib/generators/tailwindcss/controller_generator_test.rb +++ b/test/lib/generators/tailwindcss/controller_generator_test.rb @@ -3,7 +3,7 @@ class Tailwindcss::Generators::ControllerGeneratorTest < Rails::Generators::TestCase tests Tailwindcss::Generators::ControllerGenerator - destination Dir.mktmpdir + destination TAILWINDCSS_TEST_APP_ROOT arguments %w(Messages index show) diff --git a/test/lib/generators/tailwindcss/mailer_generator_test.rb b/test/lib/generators/tailwindcss/mailer_generator_test.rb index a8a65d96..32d3d34f 100644 --- a/test/lib/generators/tailwindcss/mailer_generator_test.rb +++ b/test/lib/generators/tailwindcss/mailer_generator_test.rb @@ -4,7 +4,7 @@ class Tailwindcss::Generators::MailerGeneratorTest < Rails::Generators::TestCase tests Tailwindcss::Generators::MailerGenerator - destination Dir.mktmpdir + destination TAILWINDCSS_TEST_APP_ROOT arguments %w(Notifications invoice) diff --git a/test/lib/generators/tailwindcss/scaffold_generator_test.rb b/test/lib/generators/tailwindcss/scaffold_generator_test.rb index 01d892b2..68e0fe28 100644 --- a/test/lib/generators/tailwindcss/scaffold_generator_test.rb +++ b/test/lib/generators/tailwindcss/scaffold_generator_test.rb @@ -3,19 +3,23 @@ class Tailwindcss::Generators::ScaffoldGeneratorTest < Rails::Generators::TestCase tests Tailwindcss::Generators::ScaffoldGenerator - destination Dir.mktmpdir + destination TAILWINDCSS_TEST_APP_ROOT arguments %w(message title:string content:text) - test "generates correct view templates" do + test "generates view templates" do run_generator - %w(index edit new show _form _message).each { |view| assert_file "app/views/messages/#{view}.html.erb" } + %w(index edit new show _form _message).each do |view| + assert_file "app/views/messages/#{view}.html.erb" + end end - test "with namespace invoked" do + test "generates view templates with namespace" do run_generator [ "admin/role", "name:string", "description:string" ] - %w(index edit new show _form _role).each { |view| assert_file "app/views/admin/roles/#{view}.html.erb" } + %w(index edit new show _form _role).each do |view| + assert_file "app/views/admin/roles/#{view}.html.erb" + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index da96cabe..68614219 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,10 +4,22 @@ require "rails" require "rails/test_help" require "debug" -require_relative "../lib/tailwindcss-rails" require "rails/test_unit/reporter" Rails::TestUnitReporter.executable = "bin/test" +TAILWINDCSS_TEST_APP_ROOT = Dir.mktmpdir +Rails::Generators.templates_path << File.join(TAILWINDCSS_TEST_APP_ROOT, "lib/templates") + class ActiveSupport::TestCase + def setup + FileUtils.rm_rf(TAILWINDCSS_TEST_APP_ROOT) + FileUtils.mkdir_p(TAILWINDCSS_TEST_APP_ROOT) + end + + def teardown + FileUtils.rm_rf(TAILWINDCSS_TEST_APP_ROOT) + end end + +require_relative "../lib/tailwindcss-rails" From 85c2c4a8a6f9f359d586cf27f4af5a92341dbfc2 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 7 Jan 2024 17:35:24 -0500 Subject: [PATCH 068/274] fix: allow applications to override templates Note that developers can override by placing templates in either: - lib/templates/tailwindcss/{scaffold,mailer,controller} - lib/templates/erb/{scaffold,mailer,controller} --- CHANGELOG.md | 1 + .../controller/controller_generator.rb | 1 + .../tailwindcss/mailer/mailer_generator.rb | 1 + .../scaffold/scaffold_generator.rb | 1 + .../tailwindcss/controller_generator_test.rb | 37 +++++++++++++++++-- .../tailwindcss/mailer_generator_test.rb | 26 ++++++++++++- .../tailwindcss/scaffold_generator_test.rb | 24 ++++++++++++ 7 files changed, 87 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7049d673..4403ce10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ * Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones * Fix `password` form field styling in generated scaffold forms. (#304, #307) @flavorjones * Fix namespaced mailer generation. (#272, #308) @flavorjones +* Allow overriding the generator templates by placing application templates in either `lib/templates/tailwindcss/{scaffold,mailer,controller}` or `lib/templates/erb/{scaffold,mailer,controller}`. (#164, #314) @flavorjones ## v2.2.0 / 2023-01-04 diff --git a/lib/generators/tailwindcss/controller/controller_generator.rb b/lib/generators/tailwindcss/controller/controller_generator.rb index 1fee0873..1022bff6 100644 --- a/lib/generators/tailwindcss/controller/controller_generator.rb +++ b/lib/generators/tailwindcss/controller/controller_generator.rb @@ -4,6 +4,7 @@ module Tailwindcss module Generators class ControllerGenerator < Erb::Generators::ControllerGenerator source_root File.expand_path("templates", __dir__) + source_paths << "lib/templates/erb/controller" end end end diff --git a/lib/generators/tailwindcss/mailer/mailer_generator.rb b/lib/generators/tailwindcss/mailer/mailer_generator.rb index eb96b2c7..b0c9b5d6 100644 --- a/lib/generators/tailwindcss/mailer/mailer_generator.rb +++ b/lib/generators/tailwindcss/mailer/mailer_generator.rb @@ -4,6 +4,7 @@ module Tailwindcss module Generators class MailerGenerator < Erb::Generators::MailerGenerator source_root File.expand_path("templates", __dir__) + source_paths << "lib/templates/erb/mailer" end end end diff --git a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb index ee2b0fad..39c2da1f 100644 --- a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb +++ b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb @@ -7,6 +7,7 @@ class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator include Rails::Generators::ResourceHelpers source_root File.expand_path("templates", __dir__) + source_paths << "lib/templates/erb/scaffold" argument :attributes, type: :array, default: [], banner: "field:type field:type" diff --git a/test/lib/generators/tailwindcss/controller_generator_test.rb b/test/lib/generators/tailwindcss/controller_generator_test.rb index d20fdbf5..62f3b1ee 100644 --- a/test/lib/generators/tailwindcss/controller_generator_test.rb +++ b/test/lib/generators/tailwindcss/controller_generator_test.rb @@ -9,8 +9,39 @@ class Tailwindcss::Generators::ControllerGeneratorTest < Rails::Generators::Test test "generates correct view templates" do run_generator - assert_file "app/views/messages/index.html.erb" - assert_file "app/views/messages/show.html.erb" + + ["index", "show"].each do |view| + assert_file "app/views/messages/#{view}.html.erb" + end + end + + test "generates correct view templates when namespaced" do + run_generator ["admin/messages", "index", "show"] + + ["index", "show"].each do |view| + assert_file "app/views/admin/messages/#{view}.html.erb" + end end -end + [ + "lib/templates/erb/controller", + "lib/templates/tailwindcss/controller", + ].each do |templates_path| + test "overriding generator templates in #{templates_path}" do + override_dir = File.join(destination_root, templates_path) + FileUtils.mkdir_p override_dir + File.open(File.join(override_dir, "view.html.erb"), "w") { |f| f.puts "This is a custom template" } + + # change directory because the generator adds a relative path to source_paths + Dir.chdir(destination_root) do + run_generator + end + + ["index", "show"].each do |view| + assert_file "app/views/messages/#{view}.html.erb" do |body| + assert_match("This is a custom template", body, "index custom template should be used") + end + end + end + end +end diff --git a/test/lib/generators/tailwindcss/mailer_generator_test.rb b/test/lib/generators/tailwindcss/mailer_generator_test.rb index 32d3d34f..e6fa61cc 100644 --- a/test/lib/generators/tailwindcss/mailer_generator_test.rb +++ b/test/lib/generators/tailwindcss/mailer_generator_test.rb @@ -51,5 +51,29 @@ class Tailwindcss::Generators::MailerGeneratorTest < Rails::Generators::TestCase assert_match("<%= yield %>", view) end end -end + [ + "lib/templates/erb/mailer", + "lib/templates/tailwindcss/mailer", + ].each do |templates_path| + test "overriding generator templates in #{templates_path}" do + override_dir = File.join(destination_root, templates_path) + FileUtils.mkdir_p override_dir + File.open(File.join(override_dir, "view.html.erb"), "w") { |f| f.puts "This is a custom template" } + File.open(File.join(override_dir, "layout.html.erb"), "w") { |f| f.puts "This is a custom layout" } + + # change directory because the generator adds a relative path to source_paths + Dir.chdir(destination_root) do + run_generator + end + + assert_file "app/views/notifications_mailer/invoice.html.erb" do |view| + assert_match("This is a custom template", view) + end + + assert_file "app/views/layouts/mailer.html.erb" do |view| + assert_match("This is a custom layout", view) + end + end + end +end diff --git a/test/lib/generators/tailwindcss/scaffold_generator_test.rb b/test/lib/generators/tailwindcss/scaffold_generator_test.rb index 68e0fe28..fb7db462 100644 --- a/test/lib/generators/tailwindcss/scaffold_generator_test.rb +++ b/test/lib/generators/tailwindcss/scaffold_generator_test.rb @@ -22,4 +22,28 @@ class Tailwindcss::Generators::ScaffoldGeneratorTest < Rails::Generators::TestCa assert_file "app/views/admin/roles/#{view}.html.erb" end end + + [ + "lib/templates/tailwindcss/scaffold", + "lib/templates/erb/scaffold", + ].each do |templates_path| + test "overriding generator templates in #{templates_path}" do + override_dir = File.join(destination_root, templates_path) + FileUtils.mkdir_p override_dir + File.open(File.join(override_dir, "index.html.erb"), "w") { |f| f.puts "This is a custom template" } + + # change directory because the generator adds a relative path to source_paths + Dir.chdir(destination_root) do + run_generator + end + + %w(edit new show _form _message).each do |view| + assert_file "app/views/messages/#{view}.html.erb" + end + + assert_file "app/views/messages/index.html.erb" do |body| + assert_match("This is a custom template", body, "index custom template should be used") + end + end + end end From d3fbaf3ff879d16002b7f391f65eab269452caac Mon Sep 17 00:00:00 2001 From: Andre Meij Date: Mon, 8 Jan 2024 20:27:32 +0000 Subject: [PATCH 069/274] Allow custom postcss.config.js Updating test and README for custom postcss.config.js --- README.md | 14 ++++++++++++++ lib/tailwindcss/commands.rb | 1 + test/lib/tailwindcss/commands_test.rb | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/README.md b/README.md index 59f71cf5..6f73db9b 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,20 @@ This also works with relative paths. If you've installed into your app's directo TAILWINDCSS_INSTALL_DIR=node_modules/.bin ``` +### Using a custom postcss.config.js + +If you want to use a custom `postcss.config.js`, for example to enable nesting, you can place it in the `config` folder and it will be loaded automatically. + +``` +module.exports = { + plugins: { + 'postcss-import': {}, + 'tailwindcss/nesting': {}, + tailwindcss: {}, + autoprefixer: {}, + }, +} +``` ## Developing with Tailwindcss diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index b1367c66..60a17053 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -81,6 +81,7 @@ def compile_command(debug: false, **kwargs) "-c", Rails.root.join("config/tailwind.config.js").to_s, ].tap do |command| command << "--minify" unless (debug || rails_css_compressor?) + command << "--postcss #{Rails.root.join("config/postcss.config.js")}" if File.exist?(Rails.root.join("config/postcss.config.js")) end end diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 47112225..c95123af 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -151,6 +151,27 @@ def mock_local_tailwindcss_install end end + test ".compile_command when postcss.config.js exists" do + mock_exe_directory("sparc-solaris2.8") do |dir, executable| + Dir.mktmpdir do |tmpdir| + Rails.stub(:root, Pathname.new(tmpdir)) do # Rails.root won't work in this test suite + actual = Tailwindcss::Commands.compile_command(exe_path: dir) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + refute_includes(actual, "--postcss config/postcss.config.js") + + config_file = Rails.root.join("config/postcss.config.js") + FileUtils.mkdir_p(Rails.root.join("config")) + FileUtils.touch(config_file) + actual = Tailwindcss::Commands.compile_command(exe_path: dir) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "--postcss #{config_file}") + end + end + end + end + test ".watch_command" do mock_exe_directory("sparc-solaris2.8") do |dir, executable| Rails.stub(:root, File) do # Rails.root won't work in this test suite From 5caa7ebac34d2326e1c8b6162619fd65d09d147b Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 10 Jan 2024 16:34:03 -0500 Subject: [PATCH 070/274] command postcss flag argument is a separate array member following the convention used for assembling the overall command --- lib/tailwindcss/commands.rb | 14 +++++++++----- test/lib/tailwindcss/commands_test.rb | 6 ++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 60a17053..08b70d33 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -74,15 +74,19 @@ def executable(exe_path: DEFAULT_DIR) end def compile_command(debug: false, **kwargs) - [ + command = [ executable(**kwargs), "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s, "-c", Rails.root.join("config/tailwind.config.js").to_s, - ].tap do |command| - command << "--minify" unless (debug || rails_css_compressor?) - command << "--postcss #{Rails.root.join("config/postcss.config.js")}" if File.exist?(Rails.root.join("config/postcss.config.js")) - end + ] + + command << "--minify" unless (debug || rails_css_compressor?) + + postcss_path = Rails.root.join("config/postcss.config.js") + command += ["--postcss", postcss_path.to_s] if File.exist?(postcss_path) + + command end def watch_command(always: false, poll: false, **kwargs) diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index c95123af..0be78894 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -158,7 +158,7 @@ def mock_local_tailwindcss_install actual = Tailwindcss::Commands.compile_command(exe_path: dir) assert_kind_of(Array, actual) assert_equal(executable, actual.first) - refute_includes(actual, "--postcss config/postcss.config.js") + refute_includes(actual, "--postcss") config_file = Rails.root.join("config/postcss.config.js") FileUtils.mkdir_p(Rails.root.join("config")) @@ -166,7 +166,9 @@ def mock_local_tailwindcss_install actual = Tailwindcss::Commands.compile_command(exe_path: dir) assert_kind_of(Array, actual) assert_equal(executable, actual.first) - assert_includes(actual, "--postcss #{config_file}") + assert_includes(actual, "--postcss") + postcss_index = actual.index("--postcss") + assert_equal(actual[postcss_index + 1], config_file.to_s) end end end From a30ad61d553f707ae47dd87e6fe054d2aac8af0f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 10 Jan 2024 16:41:26 -0500 Subject: [PATCH 071/274] doc: update README section on postcss --- README.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 6f73db9b..1f13e498 100644 --- a/README.md +++ b/README.md @@ -38,21 +38,6 @@ This also works with relative paths. If you've installed into your app's directo TAILWINDCSS_INSTALL_DIR=node_modules/.bin ``` -### Using a custom postcss.config.js - -If you want to use a custom `postcss.config.js`, for example to enable nesting, you can place it in the `config` folder and it will be loaded automatically. - -``` -module.exports = { - plugins: { - 'postcss-import': {}, - 'tailwindcss/nesting': {}, - tailwindcss: {}, - autoprefixer: {}, - }, -} -``` - ## Developing with Tailwindcss ### Configuration @@ -114,6 +99,24 @@ If you want unminified assets, you can pass a `debug` argument to the rake task, Note that you can combine task options, e.g. `rails tailwindcss:watch[debug,poll]`. +### Using with PostCSS + +If you want to use PostCSS as a preprocessor, create a custom `config/postcss.config.js` and it will be loaded automatically. + +For example, to enable nesting: + +```js +// config/postcss.config.js +module.exports = { + plugins: { + 'postcss-import': {}, + 'tailwindcss/nesting': {}, + tailwindcss: {}, + autoprefixer: {}, + }, +} +``` + ### Custom inputs or outputs If you need to use a custom input or output file, you can run `bundle exec tailwindcss` to access the platform-specific executable, and give it your own build options. From 6ccd14b66b73300bd464ab4ff367759be8313544 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 10 Jan 2024 16:57:04 -0500 Subject: [PATCH 072/274] doc: update CHANGELOG [skip ci] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4403ce10..a832a6e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## next / unreleased + +* Allow applications to override the generator templates. (#314) @flavorjones +* Support using PostCSS as a preprocessor. (#316) @ahmeij + + ## v2.2.1 / 2023-01-07 * Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones From 9118fbc6acd237a870bc94577c96adcdc9358712 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 10 Jan 2024 16:59:21 -0500 Subject: [PATCH 073/274] version bump to v2.3.0 --- CHANGELOG.md | 2 +- lib/tailwindcss/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a832a6e9..8e7056bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v2.3.0 / 2023-01-10 * Allow applications to override the generator templates. (#314) @flavorjones * Support using PostCSS as a preprocessor. (#316) @ahmeij diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 405219b2..bd5ad174 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.2.1" + VERSION = "2.3.0" end From 904facc0a34178a52c9f64223446b15225835ce4 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 18 Jan 2024 08:59:14 -0500 Subject: [PATCH 074/274] doc: fix dates in CHANGELOG [skip ci] --- CHANGELOG.md | 6 +++--- Gemfile.lock | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e7056bd..7736a540 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,10 @@ -## v2.3.0 / 2023-01-10 +## v2.3.0 / 2024-01-10 * Allow applications to override the generator templates. (#314) @flavorjones * Support using PostCSS as a preprocessor. (#316) @ahmeij -## v2.2.1 / 2023-01-07 +## v2.2.1 / 2024-01-07 * Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones * Fix `password` form field styling in generated scaffold forms. (#304, #307) @flavorjones @@ -12,7 +12,7 @@ * Allow overriding the generator templates by placing application templates in either `lib/templates/tailwindcss/{scaffold,mailer,controller}` or `lib/templates/erb/{scaffold,mailer,controller}`. (#164, #314) @flavorjones -## v2.2.0 / 2023-01-04 +## v2.2.0 / 2024-01-04 * Introduce a Puma plugin to manage the Tailwind "watch" process from `rails server`. (#300) @npezza93 * Lazily load the debugger gem when running `bin/dev` (#292) @elia diff --git a/Gemfile.lock b/Gemfile.lock index 5502d297..916b4c9e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.2.1) + tailwindcss-rails (2.3.0) railties (>= 6.0.0) GEM From bbaf2dfdbdce290c7727b053c7636258d3ad5a3c Mon Sep 17 00:00:00 2001 From: m-nakamura145 Date: Mon, 5 Feb 2024 21:43:19 +0900 Subject: [PATCH 075/274] Bump actions/checkout --- .github/workflows/ci.yml | 6 +++--- .github/workflows/gem-install.yml | 2 +- .github/workflows/upstream.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d7ece617..6af43c2a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: matrix: ruby: ["2.7", "3.0", "3.1", "3.2", "3.3", "head"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: rm Gemfile.lock - uses: ruby/setup-ruby@v1 with: @@ -36,7 +36,7 @@ jobs: rails6: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: rm Gemfile.lock - uses: ruby/setup-ruby@v1 with: @@ -58,7 +58,7 @@ jobs: plat: ["ubuntu", "windows", "macos"] runs-on: ${{matrix.plat}}-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml index 8b2fc1fa..09271372 100644 --- a/.github/workflows/gem-install.yml +++ b/.github/workflows/gem-install.yml @@ -22,7 +22,7 @@ jobs: platform: ["ruby", "x64-mingw32", "x64-mingw-ucrt", "x86_64-darwin", "x86_64-linux", "arm-linux"] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: rm Gemfile.lock - uses: ruby/setup-ruby@v1 with: diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 4af7c643..b2dda2bc 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -24,7 +24,7 @@ jobs: env: RAILSOPTS: --git=https://github.com/rails/rails --branch main steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" From 88bf2915a3e29adcdf2c95afbd662f12957e3ef8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 7 Feb 2024 08:30:52 -0500 Subject: [PATCH 076/274] doc: improve README - add table of contents - new troubleshooting section on docker/tty - add "commands" synopsis - clarify language in a few sections - remove musl section of troubleshooting (because https://github.com/tailwindlabs/tailwindcss/discussions/6785 was merged upstream) --- README.md | 131 +++++++++++++++++++++++++++++++++++++++--------------- Rakefile | 12 +++++ 2 files changed, 106 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 1f13e498..ab0f5aa1 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,31 @@ [Tailwind CSS](https://tailwindcss.com) is a utility-first CSS framework packed with classes like flex, pt-4, text-center and rotate-90 that can be composed to build any design, directly in your markup. + + + + +- [Installation](#installation) + * [Using a local installation of `tailwindcss`](#using-a-local-installation-of-tailwindcss) +- [Developing with Tailwindcss](#developing-with-tailwindcss) + * [Configuration and commands](#configuration-and-commands) + * [Building for production](#building-for-production) + * [Building for testing](#building-for-testing) + * [Building unminified assets](#building-unminified-assets) + * [Live rebuild](#live-rebuild) + * [Using with PostCSS](#using-with-postcss) + * [Custom inputs or outputs](#custom-inputs-or-outputs) +- [Troubleshooting](#troubleshooting) + * [Running in a docker container exits prematurely](#running-in-a-docker-container-exits-prematurely) + * [Conflict with sassc-rails](#conflict-with-sassc-rails) + * [Class names must be spelled out](#class-names-must-be-spelled-out) + * [`ERROR: Cannot find the tailwindcss executable` for supported platform](#error-cannot-find-the-tailwindcss-executable-for-supported-platform) + * [Using asset-pipeline assets](#using-asset-pipeline-assets) + * [Conflict with pre-existing asset pipeline stylesheets](#conflict-with-pre-existing-asset-pipeline-stylesheets) +- [License](#license) + + + ## Installation With Rails 7 you can generate a new application preconfigured with Tailwind by using `--css tailwind`. If you're adding Tailwind later, you need to: @@ -24,27 +49,56 @@ Supported platforms are: ### Using a local installation of `tailwindcss` -If you are not able to use the vendored standalone executables (for example, if you're on an unsupported platform), you can use a local installation of the `tailwindcss` executable by setting an environment variable named `TAILWINDCSS_INSTALL_DIR` to the directory containing the executable. +If you are not able to use the vendored standalone executables (for example, if you're on an unsupported platform), you can use a local installation of the `tailwindcss` executable by setting an environment variable named `TAILWINDCSS_INSTALL_DIR` to the directory path containing the executable. -For example, if you've installed `tailwindcss` so that the executable is found at `/node_modules/bin/tailwindcss`, then you should set your environment variable like so: +For example, if you've installed `tailwindcss` so that the executable is found at `/path/to/node_modules/bin/tailwindcss`, then you should set your environment variable like so: ``` sh TAILWINDCSS_INSTALL_DIR=/path/to/node_modules/bin ``` -This also works with relative paths. If you've installed into your app's directory at `./node_modules/.bin/tailwindcss`: +or, for relative paths like `./node_modules/.bin/tailwindcss`: ``` sh TAILWINDCSS_INSTALL_DIR=node_modules/.bin ``` + ## Developing with Tailwindcss -### Configuration +### Configuration and commands + +#### Configuration file: `config/tailwind.config.js` You can customize the Tailwind build through the `config/tailwind.config.js` file, just like you would if Tailwind was running in a traditional node installation. All the first-party plugins are supported. -The installer will create your Tailwind input file in `app/assets/stylesheets/application.tailwind.css`. This is where you import the plugins you want to use, and where you can setup your custom `@apply` rules. When you run `rails tailwindcss:build`, this input file will be used to generate the output in `app/assets/builds/tailwind.css`. That's the output CSS that you'll include in your app (the installer automatically configures this, alongside the Inter font as well). +#### Input file: `app/assets/stylesheets/application.tailwind.css` + +The installer will generate a Tailwind input file in `app/assets/stylesheets/application.tailwind.css`. This is where you import the plugins you want to use, and where you can setup your custom `@apply` rules. + +#### Output file: `app/assets/builds/tailwind.css` + +When you run `rails tailwindcss:build`, the input file will be used to generate the output in `app/assets/builds/tailwind.css`. That's the output CSS that you'll include in your app (the installer automatically configures this, alongside the Inter font as well). + +#### Commands + +This gem makes several Rails tasks available, some of which have multiple options which can be combined. + +Synopsis: + +- `bin/rails tailwindcss:install` - installs the configuration file, output file, and `Procfile.dev` +- `bin/rails tailwindcss:build` - generate the output file + - `bin/rails tailwindcss:build[debug]` - generate unminimized output +- `bin/rails tailwindcss:watch` - start live rebuilds, generating output on file changes + - `bin/rails tailwindcss:watch[debug]` - generate unminimized output + - `bin/rails tailwindcss:watch[poll]` - for systems without file system events + - `bin/rails tailwindcss:watch[always]` - for systems without TTY (e.g., some docker containers) + +Note that you can combine task options, e.g. `rails tailwindcss:watch[debug,poll]`. + +This gem also makes available a Puma plugin to manage a live rebuild process when you run `rails server` (see "Live Rebuild" section below). + +This gem also generates a `Procfile.dev` file which will run both the rails server and a live rebuild process (see "Live Rebuild" section below). ### Building for production @@ -57,17 +111,23 @@ The `tailwindcss:build` is automatically attached to `assets:precompile`, so bef The `tailwindcss:build` task is automatically attached to the `test:prepare` Rake task. This task runs before test commands. If you run `bin/rails test` in your CI environment, your Tailwind output will be generated before tests run. -### Update assets automatically +### Building unminified assets + +If you want unminified assets, you can pass a `debug` argument to the rake task, i.e. `rails tailwindcss:build[debug]` or `rails tailwindcss:watch[debug]`. + + +### Live rebuild While you're developing your application, you want to run Tailwind in "watch" mode, so changes are automatically reflected in the generated CSS output. You can do this in a few different ways: -- use the [Puma](https://puma.io/) plugin to integrate "watch" with `rails server`, or -- run `rails tailwindcss:watch` as a separate process, or -- run `bin/dev` which uses [Foreman](https://github.com/ddollar/foreman) +- use this gem's [Puma](https://puma.io/) plugin to integrate "watch" with `rails server`, +- or run `rails tailwindcss:watch` as a separate process, +- or run `bin/dev` which uses [Foreman](https://github.com/ddollar/foreman) + #### Puma plugin -The Puma plugin requires you to add this line to your `puma.rb` configuration: +This gem ships with a Puma plugin. To use it, add this line to your `puma.rb` configuration: ```ruby plugin :tailwindcss if ENV.fetch("RAILS_ENV", "development") == "development" @@ -80,7 +140,13 @@ and then running `rails server` will run the Tailwind watch process in the backg This is a flexible command, which can be run with a few different options. -If you are running `rails tailwindcss:watch` on a system that doesn't fully support file system events, pass a `poll` argument to the task to instruct tailwindcss to instead use polling: `rails tailwindcss:watch[poll]`. If you use `bin/dev` then you should modify your `Procfile.dev`. +If you are running `rails tailwindcss:watch` on a system that doesn't fully support file system events, pass a `poll` argument to the task to instruct tailwindcss to instead use polling: + +``` +rails tailwindcss:watch[poll] +``` + +(If you use `bin/dev` then you should modify your `Procfile.dev` to use the `poll` option.) If you are running `rails tailwindcss:watch` as a process in a Docker container, set `tty: true` in `docker-compose.yml` for the appropriate container to keep the watch process running. @@ -92,13 +158,6 @@ If you are running `rails tailwindcss:watch` in a docker container without a tty Running `bin/dev` invokes Foreman to start both the Tailwind watch process and the rails server in development mode based on your `Procfile.dev` file. -### Debugging with unminified assets - -If you want unminified assets, you can pass a `debug` argument to the rake task, i.e. `rails tailwindcss:build[debug]` or `rails tailwindcss:watch[debug]`. - -Note that you can combine task options, e.g. `rails tailwindcss:watch[debug,poll]`. - - ### Using with PostCSS If you want to use PostCSS as a preprocessor, create a custom `config/postcss.config.js` and it will be loaded automatically. @@ -126,6 +185,12 @@ If you need to use a custom input or output file, you can run `bundle exec tailw Some common problems experienced by users ... +### Running in a docker container exits prematurely + +If you are running `rails tailwindcss:watch` as a process in a Docker container, set `tty: true` in `docker-compose.yml` for the appropriate container to keep the watch process running. + +If you are running `rails tailwindcss:watch` in a docker container without a tty, pass the `always` argument to the task to instruct tailwindcss to keep the watcher alive even when `stdin` is closed: `rails tailwindcss:watch[always]`. If you use `bin/dev` then you should modify your `Procfile.dev`. + ### Conflict with sassc-rails Tailwind uses modern CSS features that are not recognized by the `sassc-rails` extension that was included by default in the Gemfile for Rails 6. In order to avoid any errors like `SassC::SyntaxError`, you must remove that gem from your Gemfile. @@ -134,7 +199,7 @@ Tailwind uses modern CSS features that are not recognized by the `sassc-rails` e For Tailwind to work, your class names need to be spelled out. If you need to make sure Tailwind generates class names that don't exist in your content files or that are programmatically composed, use the [safelist option](https://tailwindcss.com/docs/content-configuration#safelisting-classes). -### ERROR: Cannot find the tailwindcss executable for <supported platform> +### `ERROR: Cannot find the tailwindcss executable` for supported platform Some users are reporting this error even when running on one of the supported native platforms: @@ -172,24 +237,11 @@ and re-bundle. See https://bundler.io/man/bundle-config.1.html for more information. -### "No such file or directory" running on Alpine (musl) - -When running `tailwindcss` on an Alpine system, some users report a "No such file or directory" error message. - - -#### Install gnu libc compatibility - -The cause of this is the upstream `tailwindcss` binary executables being built on a gnu libc system, making them incompatible with standard musl libc systems. - -A fix for this has been proposed upstream at https://github.com/tailwindlabs/tailwindcss/discussions/6785, but in the meantime a workaround is to install compatibility libraries: - -``` sh -apk add build-base gcompat -``` - ### Using asset-pipeline assets -In Rails, you want to use [assets from the asset pipeline to get fingerprinting](https://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care-questionmark). However, Tailwind isn't aware of those assets. To use assets from the pipeline, use `url(image.svg)`. [Since Sprockets v3.3.0](https://github.com/rails/sprockets-rails/pull/476) `url(image.svg)` will then automatically be rewritten to `/path/to/assets/image-7801e7538c6f1cc57aa75a5876ab0cac.svg`. So the output CSS will have the correct path to those assets. +In Rails, you want to use [assets from the asset pipeline to get fingerprinting](https://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care-questionmark). However, Tailwind isn't aware of those assets. + +To use assets from the pipeline, use `url(image.svg)`. [Since Sprockets v3.3.0](https://github.com/rails/sprockets-rails/pull/476) `url(image.svg)` is rewritten to `/path/to/assets/image-7801e7538c6f1cc57aa75a5876ab0cac.svg` so output CSS will have the correct path to those assets. ```js module.exports = { @@ -211,9 +263,14 @@ The inline version also works: ### Conflict with pre-existing asset pipeline stylesheets -If you get a warning `Unrecognized at-rule or error parsing at-rule ‘@tailwind’.` in the browser console after installation, you incorrectly double-process `application.tailwind.css`. This is a misconfiguration, even though the styles will be fully effective in many cases. The file `application.tailwind.css` is installed when running `rails tailwindcss:install` and is placed alongside the common `application.css` in `app/assets/stylesheets`. Because the `application.css` in a newly generated Rails app includes a `require_tree .` directive, the asset pipeline incorrectly processes `application.tailwind.css`, where it should be taken care of by `tailwindcss`. The asset pipeline ignores TailwindCSS's at-directives, and the browser can't process them. +If you get a warning `Unrecognized at-rule or error parsing at-rule ‘@tailwind’.` in the browser console after installation, you are incorrectly double-processing `application.tailwind.css`. This is a misconfiguration, even though the styles will be fully effective in many cases. + +The file `application.tailwind.css` is installed when running `rails tailwindcss:install` and is placed alongside the common `application.css` in `app/assets/stylesheets`. Because the `application.css` in a newly generated Rails app includes a `require_tree .` directive, the asset pipeline incorrectly processes `application.tailwind.css`, where it should be taken care of by `tailwindcss`. The asset pipeline ignores TailwindCSS's at-directives, and the browser can't process them. + +To fix the warning, you can either remove the `application.css`, if you don't plan to use the asset pipeline for stylesheets, and instead rely on TailwindCSS completely for styles. This is what this installer assumes. + +Or, if you do want to keep using the asset pipeline in parallel, make sure to remove the `require_tree .` line from the `application.css`. -To fix the warning, you can either remove the `application.css`, if you don't plan to use the asset pipeline for stylesheets, and instead rely on TailwindCSS completely for styles. This is what this installer assumes. Else, if you do want to keep using the asset pipeline in parallel, make sure to remove the `require_tree .` line from the `application.css`. ## License diff --git a/Rakefile b/Rakefile index 83a3a2fe..30b6a94c 100644 --- a/Rakefile +++ b/Rakefile @@ -12,3 +12,15 @@ Rake::TestTask.new(:test) do |t| end task default: :test + +namespace "format" do + desc "Regenerate table of contents in README" + task "toc" do + require "mkmf" + if find_executable0("markdown-toc") + sh "markdown-toc --maxdepth=3 -i README.md" + else + puts "WARN: cannot find markdown-toc, skipping. install with 'npm install markdown-toc'" + end + end +end From 733b18e58e13464c197fbed1bf8618ad2a4f99bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:43:03 +0000 Subject: [PATCH 077/274] build(deps): bump nokogiri from 1.16.0 to 1.16.2 Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.16.0 to 1.16.2. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.16.0...v1.16.2) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 916b4c9e..10e60749 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -88,14 +88,14 @@ GEM timeout net-smtp (0.4.0.1) net-protocol - nokogiri (1.16.0) + nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.0-arm64-darwin) + nokogiri (1.16.2-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.0-x86_64-darwin) + nokogiri (1.16.2-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.0-x86_64-linux) + nokogiri (1.16.2-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio From 981fced9f935cef9be98c6ac01ca40ac264fd385 Mon Sep 17 00:00:00 2001 From: David Celis Date: Fri, 23 Feb 2024 15:25:46 -0800 Subject: [PATCH 078/274] Rescue from `Interrupt` in `tailwindcss:watch` When sending a SIGINT to end the `rake tailwindcss:watch` (or, for modern Procfile-based Rails applications, `bin/dev`) task, Ruby processes this via an `Interrupt` exception that can be rescued to handle gracefully tearing the process down. The `tailwindcss:watch` task, however, does not handle this exception, so when the task (or Rails' server via `bin/dev`) is terminated via the standard practice of using `^C`, that exception propagates and can result in a large backtrace; this can erroneously lead developers to think something is wrong. This patch fixes #318 by rescuing `Interrupt` exceptions, which I've verified in my own applications that use this gem. It didn't seem like there's any necessary teardown that needs to happen upon quitting the process, so I left the `rescue` clause blank except for a log line when in verbose mode. I'm happy to make any necessary changes there, however! Additionally, if that `rescue` should occur elsewhere, like directly in `exe/tailwindcss`, I'm happy to do so there as well. I wasn't sure if that's where it belonged, however, as the other commands aren't meant to run indefinitely until killed. --- lib/tasks/build.rake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/tasks/build.rake b/lib/tasks/build.rake index 8f61bf8e..3044ff05 100644 --- a/lib/tasks/build.rake +++ b/lib/tasks/build.rake @@ -15,6 +15,8 @@ namespace :tailwindcss do command = Tailwindcss::Commands.watch_command(always: always, debug: debug, poll: poll) puts command.inspect if args.extras.include?("verbose") system(*command) + rescue Interrupt + puts "Received interrupt, exiting tailwindcss:watch" if args.extras.include?("verbose") end end From 01b0862d5a29f0389a1a717475c9f117d403826e Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 7 Mar 2024 09:50:43 -0500 Subject: [PATCH 079/274] doc: update CHANGELOG [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7736a540..97952494 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* The `tailwindcss:watch` task handles interrupts more cleanly. (#318, #336) @davidcelis + + ## v2.3.0 / 2024-01-10 * Allow applications to override the generator templates. (#314) @flavorjones From 27974ce5276942457cd48d42098f7cb4bf1621ae Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 8 Apr 2024 10:00:11 -0400 Subject: [PATCH 080/274] dev: bundle update --- Gemfile.lock | 76 +++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 10e60749..2a644a78 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,19 +7,19 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.1.2) - actionpack (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activesupport (= 7.1.2) + actionmailer (7.1.3.2) + actionpack (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activesupport (= 7.1.3.2) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.2) - actionview (= 7.1.2) - activesupport (= 7.1.2) + actionpack (7.1.3.2) + actionview (= 7.1.3.2) + activesupport (= 7.1.3.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -27,16 +27,16 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.2) - activesupport (= 7.1.2) + actionview (7.1.3.2) + activesupport (= 7.1.3.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.2) - activesupport (= 7.1.2) + activejob (7.1.3.2) + activesupport (= 7.1.3.2) globalid (>= 0.3.6) - activesupport (7.1.2) + activesupport (7.1.3.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -47,26 +47,25 @@ GEM mutex_m tzinfo (~> 2.0) base64 (0.2.0) - bigdecimal (3.1.5) + bigdecimal (3.1.7) builder (3.2.4) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) - debug (1.9.1) + debug (1.9.2) irb (~> 1.10) reline (>= 0.3.8) - drb (2.2.0) - ruby2_keywords + drb (2.2.1) erubi (1.12.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.1) + i18n (1.14.4) concurrent-ruby (~> 1.0) - io-console (0.7.1) - irb (1.11.0) + io-console (0.7.2) + irb (1.12.0) rdoc - reline (>= 0.3.8) + reline (>= 0.4.2) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -77,30 +76,30 @@ GEM net-smtp mini_mime (1.1.5) mini_portile2 (2.8.5) - minitest (5.20.0) + minitest (5.22.3) mutex_m (0.2.0) - net-imap (0.4.9.1) + net-imap (0.4.10) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0.1) + net-smtp (0.5.0) net-protocol - nokogiri (1.16.2) + nokogiri (1.16.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.2-arm64-darwin) + nokogiri (1.16.3-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.2-x86_64-darwin) + nokogiri (1.16.3-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.2-x86_64-linux) + nokogiri (1.16.3-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio racc (1.7.3) - rack (3.0.8) + rack (3.0.10) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -115,27 +114,26 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + railties (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) irb rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) - rake (13.1.0) - rdoc (6.6.2) + rake (13.2.1) + rdoc (6.6.3.1) psych (>= 4.0.0) - reline (0.4.2) + reline (0.5.0) io-console (~> 0.5) - ruby2_keywords (0.0.5) stringio (3.1.0) - thor (1.3.0) + thor (1.3.1) timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) webrick (1.8.1) - zeitwerk (2.6.12) + zeitwerk (2.6.13) PLATFORMS arm64-darwin From 3df3d93be1ead5a4560536eeff627d087ab10f9b Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 8 Apr 2024 10:00:23 -0400 Subject: [PATCH 081/274] dep: update tailwindcss to 3.4.3 (from 3.4.1) - https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.2 - https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.3 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 8dd7d8e5..120c37b8 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.1" + VERSION = "v3.4.3" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From fe5a6f7b688d89e146e8c8805520277820994264 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 8 Apr 2024 10:36:40 -0400 Subject: [PATCH 082/274] version bump to v2.4.0 --- CHANGELOG.md | 3 ++- lib/tailwindcss/version.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97952494..fa699e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ -## next / unreleased +## v2.4.0 / 2024-04-08 +* Update to [Tailwind CSS v3.4.3](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.3) from v3.4.1 by @flavorjones * The `tailwindcss:watch` task handles interrupts more cleanly. (#318, #336) @davidcelis diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index bd5ad174..9e7d354c 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.3.0" + VERSION = "2.4.0" end From 828eacce74756a4fabd131d917818c07b52631b8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 22 Apr 2024 16:51:03 -0400 Subject: [PATCH 083/274] doc: add note about debug and reline to Troubleshooting Related to https://github.com/rails/tailwindcss-rails/discussions/346 [skip ci] --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index ab0f5aa1..205dd52f 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ * [Using with PostCSS](#using-with-postcss) * [Custom inputs or outputs](#custom-inputs-or-outputs) - [Troubleshooting](#troubleshooting) + * [Lost keystrokes or hanging when using `ruby/debug` with the Puma plugin](#lost-keystrokes-or-hanging-when-using-rubydebug-with-the-puma-plugin) * [Running in a docker container exits prematurely](#running-in-a-docker-container-exits-prematurely) * [Conflict with sassc-rails](#conflict-with-sassc-rails) * [Class names must be spelled out](#class-names-must-be-spelled-out) @@ -185,6 +186,17 @@ If you need to use a custom input or output file, you can run `bundle exec tailw Some common problems experienced by users ... +### Lost keystrokes or hanging when using `ruby/debug` with the Puma plugin + +If you are using the `ruby/debug` debugger while using the Puma plugin from this gem, and you're experiencing what looks like hanging or lost keystrokes, then you'll need to disable Reline. + +You can read the [`debug` documentation](https://github.com/ruby/debug?tab=readme-ov-file#configuration) for more information, but the easiest thing to do is to set the environment variable `RUBY_DEBUG_NO_RELINE`: + +``` sh +RUBY_DEBUG_NO_RELINE=1 rails server +``` + + ### Running in a docker container exits prematurely If you are running `rails tailwindcss:watch` as a process in a Docker container, set `tty: true` in `docker-compose.yml` for the appropriate container to keep the watch process running. From edd90d55461127bc46192de0eb8f0b89b19a98c3 Mon Sep 17 00:00:00 2001 From: tompng Date: Wed, 24 Apr 2024 22:17:58 +0900 Subject: [PATCH 084/274] Use IO.popen instead of system to avoid stdin read by tailwindcss watch command `tailwindcss -w` reads stdin, probably to detect stdin close. When using binding.irb or debugger with tailwindcss-rails, some keystrokes are taken by tailwindcss. To not let tailwindcss watch command read stdin, we should use `IO.popen(command, 'r+')` instead of `system(*command)`. Workaround for https://github.com/rails/tailwindcss-rails/discussions/346 --- lib/puma/plugin/tailwindcss.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/puma/plugin/tailwindcss.rb b/lib/puma/plugin/tailwindcss.rb index d78b068e..e614d62a 100644 --- a/lib/puma/plugin/tailwindcss.rb +++ b/lib/puma/plugin/tailwindcss.rb @@ -8,7 +8,12 @@ def start(launcher) @puma_pid = $$ @tailwind_pid = fork do Thread.new { monitor_puma } - system(*Tailwindcss::Commands.watch_command) + # Using IO.popen(command, 'r+') will avoid watch_command read from $stdin. + # If we use system(*command) instead, IRB and Debug can't read from $stdin + # correctly bacause some keystrokes will be taken by watch_command. + IO.popen(Tailwindcss::Commands.watch_command, 'r+') do |io| + IO.copy_stream(io, $stdout) + end end launcher.events.on_stopped { stop_tailwind } From 272658bc100777bc036555efe8a97f62ddbb633b Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 25 Apr 2024 11:19:26 -0400 Subject: [PATCH 085/274] dev: bundle update --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2a644a78..69df200a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,7 +75,7 @@ GEM net-pop net-smtp mini_mime (1.1.5) - mini_portile2 (2.8.5) + mini_portile2 (2.8.6) minitest (5.22.3) mutex_m (0.2.0) net-imap (0.4.10) @@ -87,14 +87,14 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.3) + nokogiri (1.16.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.3-arm64-darwin) + nokogiri (1.16.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.3-x86_64-darwin) + nokogiri (1.16.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.3-x86_64-linux) + nokogiri (1.16.4-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio @@ -125,7 +125,7 @@ GEM rake (13.2.1) rdoc (6.6.3.1) psych (>= 4.0.0) - reline (0.5.0) + reline (0.5.3) io-console (~> 0.5) stringio (3.1.0) thor (1.3.1) From ebfe29920a988636817f703907797925d0c27a73 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 25 Apr 2024 11:19:40 -0400 Subject: [PATCH 086/274] version bump to v2.4.1 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa699e71..0e7f8f2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.4.1 / 2024-04-25 + +* Fix debugger repl when using the Puma plugin. (#349) @tompng + + ## v2.4.0 / 2024-04-08 * Update to [Tailwind CSS v3.4.3](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.3) from v3.4.1 by @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 69df200a..c3fe8c8a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.3.0) + tailwindcss-rails (2.4.1) railties (>= 6.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 9e7d354c..11458afe 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.4.0" + VERSION = "2.4.1" end From db81dab83d76a1efb6ab5ae7f6c02a4156ae22d2 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Thu, 25 Apr 2024 17:00:25 +0100 Subject: [PATCH 087/274] Update troubleshooting advice on the debugger issue with puma plugin --- README.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 205dd52f..01fa023b 100644 --- a/README.md +++ b/README.md @@ -186,16 +186,9 @@ If you need to use a custom input or output file, you can run `bundle exec tailw Some common problems experienced by users ... -### Lost keystrokes or hanging when using `ruby/debug` with the Puma plugin - -If you are using the `ruby/debug` debugger while using the Puma plugin from this gem, and you're experiencing what looks like hanging or lost keystrokes, then you'll need to disable Reline. - -You can read the [`debug` documentation](https://github.com/ruby/debug?tab=readme-ov-file#configuration) for more information, but the easiest thing to do is to set the environment variable `RUBY_DEBUG_NO_RELINE`: - -``` sh -RUBY_DEBUG_NO_RELINE=1 rails server -``` +### Lost keystrokes or hanging when using terminal-based debugging tools (e.g. IRB, Pry, `ruby/debug`...etc.) with the Puma plugin +We've addressed the issue and you can avoid the problem by upgrading `tailwindcss-rails` to [v2.4.1](https://github.com/rails/tailwindcss-rails/releases/tag/v2.4.1) or later versions. ### Running in a docker container exits prematurely From 76fd71aa88b81ea7f5bfed337be43f01fd7e1a26 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 26 Apr 2024 10:49:30 -0400 Subject: [PATCH 088/274] ci: add arm64-darwin coverage on macos-14 and pin x86_64-darwin to macos-13 See flavorjones/ruby-c-extensions-explained#30 for context --- .github/workflows/gem-install.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml index 09271372..d2babe6a 100644 --- a/.github/workflows/gem-install.yml +++ b/.github/workflows/gem-install.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - platform: ["ruby", "x64-mingw32", "x64-mingw-ucrt", "x86_64-darwin", "x86_64-linux", "arm-linux"] + platform: ["ruby", "x64-mingw32", "x64-mingw-ucrt", "x86_64-darwin", "arm64-darwin", "x86_64-linux", "arm-linux"] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -96,9 +96,9 @@ jobs: tailwindcss --help " - darwin-install: + darwin-x86_64-install: needs: ["package"] - runs-on: macos-latest + runs-on: macos-13 steps: - uses: ruby/setup-ruby@v1 with: @@ -110,6 +110,20 @@ jobs: - run: "gem install pkg/tailwindcss-rails-*.gem" - run: "tailwindcss --help" + darwin-arm64-install: + needs: ["package"] + runs-on: macos-14 + steps: + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + - uses: actions/download-artifact@v3 + with: + name: gem-arm64-darwin + path: pkg + - run: "gem install pkg/tailwindcss-rails-*.gem" + - run: "tailwindcss --help" + windows-install: needs: ["package"] runs-on: windows-latest From ec4d806a80aa68fa6d3c85c4d4f2293b7bef6b29 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 26 Apr 2024 16:36:26 -0400 Subject: [PATCH 089/274] generator: drop the tailwind aspect-ratio plugin This plugin was originally a polyfill to handle the time gap until Safari 15 was released (in Fall 2021), and so is beyond its useful lifetime for anyone not targetting ancient browsers. Co-authored-by: Justin Searls --- CHANGELOG.md | 5 +++++ lib/install/tailwind.config.js | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e7f8f2f..2220e787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Remove the `@tailwindcss/aspect-ratio` plugin from the `tailwind.config.js` that gets installed by the generator. (#344) @flavorjones @searls + + ## v2.4.1 / 2024-04-25 * Fix debugger repl when using the Puma plugin. (#349) @tompng diff --git a/lib/install/tailwind.config.js b/lib/install/tailwind.config.js index 39364deb..d6ad82c0 100644 --- a/lib/install/tailwind.config.js +++ b/lib/install/tailwind.config.js @@ -16,7 +16,6 @@ module.exports = { }, plugins: [ require('@tailwindcss/forms'), - require('@tailwindcss/aspect-ratio'), require('@tailwindcss/typography'), require('@tailwindcss/container-queries'), ] From 6e6e34a334c419b4565dfcc6925fddae459485dc Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 27 Apr 2024 15:09:43 -0400 Subject: [PATCH 090/274] version bump to v2.5.0 --- CHANGELOG.md | 4 ++-- lib/tailwindcss/version.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2220e787..02a804bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -## next / unreleased +## v2.5.0 / 2024-04-27 -* Remove the `@tailwindcss/aspect-ratio` plugin from the `tailwind.config.js` that gets installed by the generator. (#344) @flavorjones @searls +* Remove the `@tailwindcss/aspect-ratio` plugin from the `tailwind.config.js` that gets installed by the generator. This plugin was originally a polyfill until Safari 15 was released (in Fall 2021), and so is beyond its useful lifetime for anyone not targetting ancient browsers. (#344) @flavorjones @searls ## v2.4.1 / 2024-04-25 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 11458afe..53892fe2 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.4.1" + VERSION = "2.5.0" end From e9c3f80d957bbe6442a63e10c19dad18edd97d15 Mon Sep 17 00:00:00 2001 From: Olivier Lacan Date: Mon, 29 Apr 2024 02:13:47 -0700 Subject: [PATCH 091/274] Increase form input field border contrast The contrast provided by the border-gray-200 Tailwind utility class is very poor. It's nearly impossible to distinguish the edges of an input field on a white background. That's not a great default experience for Rails scaffolds. With a slight bump to border-gray-400, things are much easier to distinguish. --- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index adbd5b7e..5ee5ecf0 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -15,23 +15,23 @@
<% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %>
<%%= form.label :password_confirmation %> - <%%= form.password_field :password_confirmation, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password_confirmation, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :text_area -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> <% elsif attribute.field_type == :check_box -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block mt-2 h-5 w-5" %> <% else -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> <% end -%> <% end -%>
From 6208f900c02e6cb565428bdaa03be442fbdbbae0 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 30 Apr 2024 11:23:00 -0400 Subject: [PATCH 092/274] dev: get dependabot updates for gems and github actions --- dependabot.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 dependabot.yml diff --git a/dependabot.yml b/dependabot.yml new file mode 100644 index 00000000..01d8316b --- /dev/null +++ b/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + - package-ecosystem: "bundler" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + github-actions: + applies-to: version-updates From 5a5e39506e695aa97203fe917dc8ee820cc6f25f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 30 Apr 2024 11:26:49 -0400 Subject: [PATCH 093/274] fix location of dependabot.yml --- dependabot.yml => .github/dependabot.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename dependabot.yml => .github/dependabot.yml (100%) diff --git a/dependabot.yml b/.github/dependabot.yml similarity index 100% rename from dependabot.yml rename to .github/dependabot.yml From a64b7a4c6542f3ddaf385beae010481596a03549 Mon Sep 17 00:00:00 2001 From: Kingsley Chijioke Date: Mon, 29 Apr 2024 19:37:57 +0100 Subject: [PATCH 094/274] generator: sync erb template This updates the erb template to be in sync with the template in rails/rails --- CHANGELOG.md | 5 +++++ .../tailwindcss/scaffold/templates/edit.html.erb.tt | 2 +- .../tailwindcss/scaffold/templates/index.html.erb.tt | 9 ++++++++- .../tailwindcss/scaffold/templates/partial.html.erb.tt | 5 ----- .../tailwindcss/scaffold/templates/show.html.erb.tt | 6 +++--- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02a804bd..2722f5f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## unreleased + +* Bring the scaffold templates up to date with rails/rails as much as possible without breaking 6.1 compatibility. (#357) @kinsomicrote + + ## v2.5.0 / 2024-04-27 * Remove the `@tailwindcss/aspect-ratio` plugin from the `tailwind.config.js` that gets installed by the generator. This plugin was originally a polyfill until Safari 15 was released (in Fall 2021), and so is beyond its useful lifetime for anyone not targetting ancient browsers. (#344) @flavorjones @searls diff --git a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt index 34756518..a1e3772b 100644 --- a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt @@ -3,6 +3,6 @@ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to "Show this <%= human_name.downcase %>", @<%= singular_table_name %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index c29d5e6e..f0a4bb9d 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -3,12 +3,19 @@

<%%= notice %>

<%% end %> + <%% content_for :title, "<%= human_name.pluralize %>" %> +

<%= human_name.pluralize %>

<%%= link_to "New <%= human_name.downcase %>", new_<%= singular_route_name %>_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %>
- <%%= render @<%= plural_table_name %> %> + <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %> + <%%= render <%= singular_table_name %> %> +

+ <%%= link_to "Show this <%= human_name.downcase %>", <%= singular_name %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> +

+ <%% end %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt index 60a0de20..e1a45470 100644 --- a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt @@ -14,9 +14,4 @@

<% end -%> - <%% if action_name != "show" %> - <%%= link_to "Show this <%= human_name.downcase %>", <%= singular_name %>, class: "rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%%= link_to "Edit this <%= human_name.downcase %>", edit_<%= singular_name %>_path(<%= singular_name %>), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %> -
- <%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index c386118c..fafb05a7 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -6,10 +6,10 @@ <%%= render @<%= singular_table_name %> %> - <%%= link_to "Edit this <%= singular_table_name %>", edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Edit this <%= human_name.downcase %>", edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
- <%%= button_to "Destroy this <%= singular_table_name %>", <%= singular_table_name %>_path(@<%= singular_table_name %>), method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %> + <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>
- <%%= link_to "Back to <%= plural_table_name %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> From d896e9523cc8ebf58e56e40edf7540270e1fc6f1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 1 May 2024 09:32:12 -0400 Subject: [PATCH 095/274] dev: remove attempt at dependabot grouping --- .github/dependabot.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 01d8316b..403b3087 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,6 +8,3 @@ updates: directory: "/" schedule: interval: "weekly" - groups: - github-actions: - applies-to: version-updates From 95ffac7ea1d0a9ef7d8edac38358a3352650b11d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 13:33:05 +0000 Subject: [PATCH 096/274] build(deps): bump actions/download-artifact from 3 to 4 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/gem-install.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml index d2babe6a..f0b5d516 100644 --- a/.github/workflows/gem-install.yml +++ b/.github/workflows/gem-install.yml @@ -43,7 +43,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-ruby path: pkg @@ -57,7 +57,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-x86_64-linux path: pkg @@ -70,7 +70,7 @@ jobs: container: image: ruby:3.2-alpine steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-x86_64-linux path: pkg @@ -83,7 +83,7 @@ jobs: needs: ["package"] runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-arm-linux path: pkg @@ -103,7 +103,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-x86_64-darwin path: pkg @@ -117,7 +117,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-arm64-darwin path: pkg @@ -131,7 +131,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: "3.0" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-x64-mingw32 path: pkg @@ -145,7 +145,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: ruby-version: "3.2" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: gem-x64-mingw-ucrt path: pkg From 1fc0541e57227f970690845ee518c9126c73a538 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 30 Apr 2024 11:13:57 -0400 Subject: [PATCH 097/274] dep: drop support for Rails 6.0 which reached EOL 11 months ago, in June 2023 --- CHANGELOG.md | 1 + Gemfile | 2 +- Gemfile.lock | 9 ++++----- tailwindcss-rails.gemspec | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2722f5f3..6e9718e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## unreleased * Bring the scaffold templates up to date with rails/rails as much as possible without breaking 6.1 compatibility. (#357) @kinsomicrote +* Drop support for Rails 6.0, which reached end-of-life in June 2023. ## v2.5.0 / 2024-04-27 diff --git a/Gemfile b/Gemfile index cf00e45c..7a21e102 100644 --- a/Gemfile +++ b/Gemfile @@ -5,5 +5,5 @@ gemspec gem "debug", ">= 1.0.0" group :test do - gem "actionmailer", ">= 6.0.0" + gem "actionmailer", ">= 6.1.0" end diff --git a/Gemfile.lock b/Gemfile.lock index c3fe8c8a..75b24379 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ PATH remote: . specs: - tailwindcss-rails (2.4.1) - railties (>= 6.0.0) + tailwindcss-rails (2.5.0) + railties (>= 6.1.0) GEM remote: https://rubygems.org/ @@ -82,7 +82,6 @@ GEM date net-protocol net-pop (0.1.2) - net-protocol net-protocol (0.2.2) timeout net-smtp (0.5.0) @@ -125,7 +124,7 @@ GEM rake (13.2.1) rdoc (6.6.3.1) psych (>= 4.0.0) - reline (0.5.3) + reline (0.5.4) io-console (~> 0.5) stringio (3.1.0) thor (1.3.1) @@ -142,7 +141,7 @@ PLATFORMS x86_64-linux DEPENDENCIES - actionmailer (>= 6.0.0) + actionmailer (>= 6.1.0) debug (>= 1.0.0) tailwindcss-rails! diff --git a/tailwindcss-rails.gemspec b/tailwindcss-rails.gemspec index 02c10fb5..237161ff 100644 --- a/tailwindcss-rails.gemspec +++ b/tailwindcss-rails.gemspec @@ -20,5 +20,5 @@ Gem::Specification.new do |spec| spec.bindir = "exe" spec.executables << "tailwindcss" - spec.add_dependency "railties", ">= 6.0.0" + spec.add_dependency "railties", ">= 6.1.0" end From 1c7e4dc2db2cedf9fefa5c0b78fba700b2ddcaed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 13:33:02 +0000 Subject: [PATCH 098/274] build(deps): bump actions/upload-artifact from 3 to 4 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/gem-install.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml index f0b5d516..eb1300d6 100644 --- a/.github/workflows/gem-install.yml +++ b/.github/workflows/gem-install.yml @@ -30,7 +30,7 @@ jobs: bundler: latest bundler-cache: true - run: "bundle exec rake gem:${{matrix.platform}}" - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: gem-${{matrix.platform}} path: pkg From 94128542a7d918116ab56e5be1f8fc9d7c18da7f Mon Sep 17 00:00:00 2001 From: Kingsley Chijioke Date: Mon, 29 Apr 2024 19:37:57 +0100 Subject: [PATCH 099/274] generator: sync erb template to use Rails 7.0 APIs This updates the erb template to be in sync with the template in rails/rails --- lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt | 2 +- lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt | 2 +- lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt | 2 +- lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt index a1e3772b..fab779d1 100644 --- a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt @@ -4,5 +4,5 @@ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index f0a4bb9d..65cf06b5 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -14,7 +14,7 @@ <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %> <%%= render <%= singular_table_name %> %>

- <%%= link_to "Show this <%= human_name.downcase %>", <%= singular_name %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>

<%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt index 61c0a450..665532e5 100644 --- a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt @@ -3,5 +3,5 @@ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index fafb05a7..17d0febf 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -6,7 +6,7 @@ <%%= render @<%= singular_table_name %> %> - <%%= link_to "Edit this <%= human_name.downcase %>", edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
<%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %> From 3bf5cb93caa4de842ad4c40f5cd02d8cb05dd89c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 1 May 2024 10:15:49 -0400 Subject: [PATCH 100/274] dep: drop feature and bugfix support for Rails 6.1 We will still provide security support for the previous minor release while Rails 6.1 is supported. --- .github/workflows/ci.yml | 18 ------------------ CHANGELOG.md | 3 ++- Gemfile | 2 +- Gemfile.lock | 4 ++-- tailwindcss-rails.gemspec | 2 +- 5 files changed, 6 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6af43c2a..db04fb3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,24 +33,6 @@ jobs: - name: Run tests run: bin/test - rails6: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - run: rm Gemfile.lock - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - bundler: latest - - name: "Pin to Rails 6.1" - run: | - bundle remove actionmailer - bundle add actionmailer --version "~> 6.1" --skip-install - bundle add railties --version "~> 6.1" --skip-install - bundle install - - name: Run tests - run: bin/test - user-journey: strategy: fail-fast: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e9718e0..e0db08db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## unreleased -* Bring the scaffold templates up to date with rails/rails as much as possible without breaking 6.1 compatibility. (#357) @kinsomicrote +* Bring the scaffold templates up to date with rails/rails. (#357, #359) @kinsomicrote * Drop support for Rails 6.0, which reached end-of-life in June 2023. +* Drop feature and bug fix support for Rails 6.1. The previous minor release will still receive security support while Rails 6.1 is supported. ## v2.5.0 / 2024-04-27 diff --git a/Gemfile b/Gemfile index 7a21e102..46788894 100644 --- a/Gemfile +++ b/Gemfile @@ -5,5 +5,5 @@ gemspec gem "debug", ">= 1.0.0" group :test do - gem "actionmailer", ">= 6.1.0" + gem "actionmailer", ">= 7.0.0" end diff --git a/Gemfile.lock b/Gemfile.lock index 75b24379..0b99151e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,7 +2,7 @@ PATH remote: . specs: tailwindcss-rails (2.5.0) - railties (>= 6.1.0) + railties (>= 7.0.0) GEM remote: https://rubygems.org/ @@ -141,7 +141,7 @@ PLATFORMS x86_64-linux DEPENDENCIES - actionmailer (>= 6.1.0) + actionmailer (>= 7.0.0) debug (>= 1.0.0) tailwindcss-rails! diff --git a/tailwindcss-rails.gemspec b/tailwindcss-rails.gemspec index 237161ff..7535ccc7 100644 --- a/tailwindcss-rails.gemspec +++ b/tailwindcss-rails.gemspec @@ -20,5 +20,5 @@ Gem::Specification.new do |spec| spec.bindir = "exe" spec.executables << "tailwindcss" - spec.add_dependency "railties", ">= 6.1.0" + spec.add_dependency "railties", ">= 7.0.0" end From ec2725789e062fc93df9c9a9d57acfe847187702 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 4 May 2024 13:23:56 -0400 Subject: [PATCH 101/274] version bump to v2.6.0 --- CHANGELOG.md | 7 ++++--- lib/tailwindcss/version.rb | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0db08db..90c49f9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ -## unreleased +## v2.6.0 / 2024-05-04 +* Increase form input field border contrast. (#356) @olivierlacan * Bring the scaffold templates up to date with rails/rails. (#357, #359) @kinsomicrote -* Drop support for Rails 6.0, which reached end-of-life in June 2023. -* Drop feature and bug fix support for Rails 6.1. The previous minor release will still receive security support while Rails 6.1 is supported. +* Drop support for Rails 6.0, which reached end-of-life in June 2023. (#358) @flavorjones +* Drop feature and bug fix support for Rails 6.1. The previous minor release will still receive security support while Rails 6.1 is supported. (#359) @flavorjones ## v2.5.0 / 2024-04-27 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 53892fe2..0775ed7e 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.5.0" + VERSION = "2.6.0" end From 72aa03cbdf96f5b3406a56a404e193b028799d9a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 19 May 2024 14:13:34 -0400 Subject: [PATCH 102/274] wip: try to work around bcrypt_pbkdf issue on windows --- test/integration/user_journey_test.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 95c3174d..b4242e0c 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -25,9 +25,12 @@ bundle exec rails new test-app --skip-bundle pushd test-app # make sure to use the same version of rails (e.g., install from git source if necessary) -bundle remove rails +bundle remove rails --skip-install bundle add rails --skip-install ${RAILSOPTS:-} +# work around https://github.com/net-ssh/bcrypt_pbkdf-ruby/issues/24 +bundle add bcrypt_pbkdf -v 1.1.1.rc2 --skip-install + # use the tailwindcss-rails under test bundle add tailwindcss-rails --path="../.." bundle install From a4251ccfed27997b2f594bd0e559bf8ab2a6a07a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 19 May 2024 14:19:43 -0400 Subject: [PATCH 103/274] dep: bundle update --- Gemfile.lock | 60 ++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0b99151e..4b5e22c5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,25 +1,25 @@ PATH remote: . specs: - tailwindcss-rails (2.5.0) + tailwindcss-rails (2.6.0) railties (>= 7.0.0) GEM remote: https://rubygems.org/ specs: - actionmailer (7.1.3.2) - actionpack (= 7.1.3.2) - actionview (= 7.1.3.2) - activejob (= 7.1.3.2) - activesupport (= 7.1.3.2) + actionmailer (7.1.3.3) + actionpack (= 7.1.3.3) + actionview (= 7.1.3.3) + activejob (= 7.1.3.3) + activesupport (= 7.1.3.3) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.2) - actionview (= 7.1.3.2) - activesupport (= 7.1.3.2) + actionpack (7.1.3.3) + actionview (= 7.1.3.3) + activesupport (= 7.1.3.3) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -27,16 +27,16 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.3.2) - activesupport (= 7.1.3.2) + actionview (7.1.3.3) + activesupport (= 7.1.3.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.2) - activesupport (= 7.1.3.2) + activejob (7.1.3.3) + activesupport (= 7.1.3.3) globalid (>= 0.3.6) - activesupport (7.1.3.2) + activesupport (7.1.3.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -47,7 +47,7 @@ GEM mutex_m tzinfo (~> 2.0) base64 (0.2.0) - bigdecimal (3.1.7) + bigdecimal (3.1.8) builder (3.2.4) concurrent-ruby (1.2.3) connection_pool (2.4.1) @@ -60,11 +60,11 @@ GEM erubi (1.12.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.4) + i18n (1.14.5) concurrent-ruby (~> 1.0) io-console (0.7.2) - irb (1.12.0) - rdoc + irb (1.13.1) + rdoc (>= 4.0.0) reline (>= 0.4.2) loofah (2.22.0) crass (~> 1.0.2) @@ -76,9 +76,9 @@ GEM net-smtp mini_mime (1.1.5) mini_portile2 (2.8.6) - minitest (5.22.3) + minitest (5.23.0) mutex_m (0.2.0) - net-imap (0.4.10) + net-imap (0.4.11) date net-protocol net-pop (0.1.2) @@ -86,19 +86,19 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.4) + nokogiri (1.16.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.4-arm64-darwin) + nokogiri (1.16.5-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.4-x86_64-darwin) + nokogiri (1.16.5-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.4-x86_64-linux) + nokogiri (1.16.5-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio racc (1.7.3) - rack (3.0.10) + rack (3.0.11) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -113,9 +113,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.2) - actionpack (= 7.1.3.2) - activesupport (= 7.1.3.2) + railties (7.1.3.3) + actionpack (= 7.1.3.3) + activesupport (= 7.1.3.3) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -124,7 +124,7 @@ GEM rake (13.2.1) rdoc (6.6.3.1) psych (>= 4.0.0) - reline (0.5.4) + reline (0.5.7) io-console (~> 0.5) stringio (3.1.0) thor (1.3.1) @@ -132,7 +132,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) webrick (1.8.1) - zeitwerk (2.6.13) + zeitwerk (2.6.14) PLATFORMS arm64-darwin From 1a81295cc106a93da775624e72e6b8728c320705 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 19 May 2024 14:27:06 -0400 Subject: [PATCH 104/274] dep: drop bcrypt_pbkdf workaround --- test/integration/user_journey_test.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index b4242e0c..4016ec20 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -28,9 +28,6 @@ pushd test-app bundle remove rails --skip-install bundle add rails --skip-install ${RAILSOPTS:-} -# work around https://github.com/net-ssh/bcrypt_pbkdf-ruby/issues/24 -bundle add bcrypt_pbkdf -v 1.1.1.rc2 --skip-install - # use the tailwindcss-rails under test bundle add tailwindcss-rails --path="../.." bundle install From b11786f283f9d3eb8eccc491d727bac30a56ee88 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Jun 2024 14:51:47 -0400 Subject: [PATCH 105/274] dep: update packaged tailwindcss to 3.4.4 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.4 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 120c37b8..2092d92a 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.3" + VERSION = "v3.4.4" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 6a592b7bb7eb6c3bfc1e8d524985d685f0939f4e Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Jun 2024 15:19:25 -0400 Subject: [PATCH 106/274] version bump to v2.6.1 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c49f9d..fc8ffb4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.6.1 / 2024-06-05 + +* Update to [Tailwind CSS v3.4.4](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.4) (#373) @flavorjones + + ## v2.6.0 / 2024-05-04 * Increase form input field border contrast. (#356) @olivierlacan diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 0775ed7e..cd81e4f8 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.6.0" + VERSION = "2.6.1" end From 0ea974af3469b61c7e8fbc1100d8c58194454b96 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Jun 2024 15:26:53 -0400 Subject: [PATCH 107/274] dep: bundle update Should resolve https://github.com/rails/tailwindcss-rails/security/dependabot/52 --- Gemfile.lock | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4b5e22c5..57593b77 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,25 +1,25 @@ PATH remote: . specs: - tailwindcss-rails (2.6.0) + tailwindcss-rails (2.6.1) railties (>= 7.0.0) GEM remote: https://rubygems.org/ specs: - actionmailer (7.1.3.3) - actionpack (= 7.1.3.3) - actionview (= 7.1.3.3) - activejob (= 7.1.3.3) - activesupport (= 7.1.3.3) + actionmailer (7.1.3.4) + actionpack (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.3) - actionview (= 7.1.3.3) - activesupport (= 7.1.3.3) + actionpack (7.1.3.4) + actionview (= 7.1.3.4) + activesupport (= 7.1.3.4) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -27,16 +27,16 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.3.3) - activesupport (= 7.1.3.3) + actionview (7.1.3.4) + activesupport (= 7.1.3.4) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.3) - activesupport (= 7.1.3.3) + activejob (7.1.3.4) + activesupport (= 7.1.3.4) globalid (>= 0.3.6) - activesupport (7.1.3.3) + activesupport (7.1.3.4) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -49,7 +49,7 @@ GEM base64 (0.2.0) bigdecimal (3.1.8) builder (3.2.4) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.1) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) @@ -75,10 +75,10 @@ GEM net-pop net-smtp mini_mime (1.1.5) - mini_portile2 (2.8.6) - minitest (5.23.0) + mini_portile2 (2.8.7) + minitest (5.23.1) mutex_m (0.2.0) - net-imap (0.4.11) + net-imap (0.4.12) date net-protocol net-pop (0.1.2) @@ -97,7 +97,7 @@ GEM racc (~> 1.4) psych (5.1.2) stringio - racc (1.7.3) + racc (1.8.0) rack (3.0.11) rack-session (2.0.0) rack (>= 3.0.0) @@ -113,18 +113,18 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.3) - actionpack (= 7.1.3.3) - activesupport (= 7.1.3.3) + railties (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) irb rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.6.3.1) + rdoc (6.7.0) psych (>= 4.0.0) - reline (0.5.7) + reline (0.5.8) io-console (~> 0.5) stringio (3.1.0) thor (1.3.1) @@ -132,7 +132,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) webrick (1.8.1) - zeitwerk (2.6.14) + zeitwerk (2.6.15) PLATFORMS arm64-darwin From 700003569e7c740cce8ff4a03b50218f8d39f3a2 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 15 Jul 2024 17:16:08 -0400 Subject: [PATCH 108/274] dep: bump vendored tailwindcss to v3.4.5 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.5 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 2092d92a..872cbe4e 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.4" + VERSION = "v3.4.5" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 20c832d528c4c4b8944f73822638c8ef3dab3bb6 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 15 Jul 2024 17:16:51 -0400 Subject: [PATCH 109/274] dep: bundle update --- Gemfile.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 57593b77..b788d0ab 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -48,8 +48,8 @@ GEM tzinfo (~> 2.0) base64 (0.2.0) bigdecimal (3.1.8) - builder (3.2.4) - concurrent-ruby (1.3.1) + builder (3.3.0) + concurrent-ruby (1.3.3) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) @@ -57,13 +57,13 @@ GEM irb (~> 1.10) reline (>= 0.3.8) drb (2.2.1) - erubi (1.12.0) + erubi (1.13.0) globalid (1.2.1) activesupport (>= 6.1) i18n (1.14.5) concurrent-ruby (~> 1.0) io-console (0.7.2) - irb (1.13.1) + irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) loofah (2.22.0) @@ -76,9 +76,9 @@ GEM net-smtp mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.23.1) + minitest (5.24.1) mutex_m (0.2.0) - net-imap (0.4.12) + net-imap (0.4.14) date net-protocol net-pop (0.1.2) @@ -86,19 +86,19 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.5) + nokogiri (1.16.6) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.5-arm64-darwin) + nokogiri (1.16.6-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.5-x86_64-darwin) + nokogiri (1.16.6-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.5-x86_64-linux) + nokogiri (1.16.6-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio racc (1.8.0) - rack (3.0.11) + rack (3.1.7) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -124,15 +124,15 @@ GEM rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) - reline (0.5.8) + reline (0.5.9) io-console (~> 0.5) - stringio (3.1.0) + stringio (3.1.1) thor (1.3.1) timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) webrick (1.8.1) - zeitwerk (2.6.15) + zeitwerk (2.6.16) PLATFORMS arm64-darwin From a1fb3b42bbbbf6930334be2ad7a2764c550e784c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 15 Jul 2024 17:26:27 -0400 Subject: [PATCH 110/274] version bump to v2.6.2 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc8ffb4b..69ccfcc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.6.2 / 2024-07-15 + +* Update to [Tailwind CSS v3.4.5](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.5) (#380) @flavorjones + + ## v2.6.1 / 2024-06-05 * Update to [Tailwind CSS v3.4.4](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.4) (#373) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index b788d0ab..6b876b7a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.6.1) + tailwindcss-rails (2.6.2) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index cd81e4f8..679b0bca 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.6.1" + VERSION = "2.6.2" end From c59b4f768488981c7da006bebcdb4c5795ed92d3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 16 Jul 2024 11:46:26 -0400 Subject: [PATCH 111/274] dep: update packaged tailwindcss to v3.4.6 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.6 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 872cbe4e..6502cde6 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.5" + VERSION = "v3.4.6" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 7c3ebd1ab1436a063f3f51274170b526bd221c08 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 16 Jul 2024 12:05:16 -0400 Subject: [PATCH 112/274] version bump to v2.6.3 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69ccfcc7..4315703c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.6.3 / 2024-07-16 + +* Update to [Tailwind CSS v3.4.6](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.6) (#381) @flavorjones + + ## v2.6.2 / 2024-07-15 * Update to [Tailwind CSS v3.4.5](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.5) (#380) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 6b876b7a..617615b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.6.2) + tailwindcss-rails (2.6.3) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 679b0bca..cf9af227 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.6.2" + VERSION = "2.6.3" end From c09844ce9e948d47a41cf825b62c91cea1e8520d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 27 Jul 2024 17:17:38 -0400 Subject: [PATCH 113/274] dev: allow us to provide checksums when upstream does not See https://github.com/tailwindlabs/tailwindcss/issues/14072 for context --- rakelib/package.rake | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rakelib/package.rake b/rakelib/package.rake index 095ef445..7cab2924 100644 --- a/rakelib/package.rake +++ b/rakelib/package.rake @@ -115,8 +115,12 @@ end desc "Validate checksums for tailwindcss binaries" task "check" => exepaths do - sha_filename = "sha256sums.txt" - sha_url = tailwindcss_download_url(sha_filename) + sha_filename = File.absolute_path("../package/tailwindcss-#{Tailwindcss::Upstream::VERSION}-checksums.txt", __dir__) + sha_url = if File.exist?(sha_filename) + sha_filename + else + sha_url = tailwindcss_download_url("sha256sums.txt") + end gemspec = TAILWINDCSS_RAILS_GEMSPEC checksums = URI.open(sha_url).each_line.map do |line| From 1446f6221facdf9ef7436a74f8981c384b45cfed Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 27 Jul 2024 17:23:24 -0400 Subject: [PATCH 114/274] dep: update packaged tailwindcss to v3.4.7 --- lib/tailwindcss/upstream.rb | 2 +- package/tailwindcss-v3.4.7-checksums.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 package/tailwindcss-v3.4.7-checksums.txt diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 6502cde6..4b618de4 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.6" + VERSION = "v3.4.7" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { diff --git a/package/tailwindcss-v3.4.7-checksums.txt b/package/tailwindcss-v3.4.7-checksums.txt new file mode 100644 index 00000000..0d5079d3 --- /dev/null +++ b/package/tailwindcss-v3.4.7-checksums.txt @@ -0,0 +1,6 @@ +8f8b5cd32fc35843ec24bbcdb214e972df6a9c485bf4d4fd049140fbcc766bcc tailwindcss-macos-x64 +0eda3bc8fe90506b7b9e5cb930312042730b76a7f18026d19414d48fbb3100ed tailwindcss-macos-arm64 +3c2321e66718f39e48388707ce8b587946338f82ef3d636c8ee19670514d3394 tailwindcss-linux-x64 +4146a6f534fffb27f95de9926d7806a6e432eeb7e55cb8850a57c4e062689c2b tailwindcss-linux-arm64 +85c4c71618f0bfcdb0edf246ed6ee394a7addb8af34ed7dbdce9298279243994 tailwindcss-linux-armv7 +e6891c3d181314b7d78382fe93121ff8957a9dbb1132a47afb064c0ed1f906e4 tailwindcss-windows-x64.exe From 31ee0f79926b1fd8d8838d50d1dad2a22bc8028a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 27 Jul 2024 17:36:15 -0400 Subject: [PATCH 115/274] version bump to v2.6.4 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4315703c..682ac6ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.6.4 / 2024-07-27 + +* Update to [Tailwind CSS v3.4.7](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.7) (#383) @flavorjones + + ## v2.6.3 / 2024-07-16 * Update to [Tailwind CSS v3.4.6](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.6) (#381) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 617615b3..11592706 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.6.3) + tailwindcss-rails (2.6.4) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index cf9af227..7d02f5fe 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.6.3" + VERSION = "2.6.4" end From c0e1e52b223bfa9b3748ab6c1e50a84ccd0b818f Mon Sep 17 00:00:00 2001 From: Jerome Dalbert Date: Tue, 30 Jul 2024 07:07:43 -0700 Subject: [PATCH 116/274] Force bin/dev overwrite to deal with new default bin/dev file (#385) See Rails https://github.com/rails/rails/pull/52433 --- lib/install/tailwindcss.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/install/tailwindcss.rb b/lib/install/tailwindcss.rb index 413f86b8..2c2ba50c 100644 --- a/lib/install/tailwindcss.rb +++ b/lib/install/tailwindcss.rb @@ -49,7 +49,7 @@ end say "Add bin/dev to start foreman" -copy_file "#{__dir__}/dev", "bin/dev" +copy_file "#{__dir__}/dev", "bin/dev", force: true chmod "bin/dev", 0755, verbose: false say "Compile initial Tailwind build" From 84c08f81ae2d65f6522d679711d6a8976978b158 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 30 Jul 2024 14:19:58 -0400 Subject: [PATCH 117/274] version bump to v2.6.5 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 682ac6ac..e1259252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.6.5 / 2024-07-30 + +* During installation, clobber the Rails v8 default `bin/dev` file without requiring human intervention. (#385) @jeromedalbert + + ## v2.6.4 / 2024-07-27 * Update to [Tailwind CSS v3.4.7](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.7) (#383) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 11592706..331eb72c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.6.4) + tailwindcss-rails (2.6.5) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 7d02f5fe..17119e4b 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.6.4" + VERSION = "2.6.5" end From a0783a7135df01682f24248724ef0bacc912d6fa Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 29 Jul 2024 13:26:30 -0400 Subject: [PATCH 118/274] introduce specialized view for rails 8 authentication generator Co-authored-by: yshmarov --- .../authentication_generator.rb | 9 ++++++++ .../templates/views/sessions/new.html.erb | 22 +++++++++++++++++++ .../authentication_generator_test.rb | 16 ++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 lib/generators/tailwindcss/authentication/authentication_generator.rb create mode 100644 lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb create mode 100644 test/lib/generators/tailwindcss/authentication_generator_test.rb diff --git a/lib/generators/tailwindcss/authentication/authentication_generator.rb b/lib/generators/tailwindcss/authentication/authentication_generator.rb new file mode 100644 index 00000000..aa6fc23b --- /dev/null +++ b/lib/generators/tailwindcss/authentication/authentication_generator.rb @@ -0,0 +1,9 @@ +require "rails/generators/erb/authentication/authentication_generator" + +module Tailwindcss + module Generators + class AuthenticationGenerator < Erb::Generators::AuthenticationGenerator + source_root File.expand_path("templates", __dir__) + end + end +end diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb new file mode 100644 index 00000000..824b506a --- /dev/null +++ b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb @@ -0,0 +1,22 @@ +
+

Sign in

+ + <%% if alert = flash[:alert] %> +

<%%= alert %>

+ <%% end %> + + <%%= form_with url: session_url, class: "contents" do |form| %> +
+ <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.submit "Sign in", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ <%% end %> +
+ diff --git a/test/lib/generators/tailwindcss/authentication_generator_test.rb b/test/lib/generators/tailwindcss/authentication_generator_test.rb new file mode 100644 index 00000000..bdf712b0 --- /dev/null +++ b/test/lib/generators/tailwindcss/authentication_generator_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +if Rails::VERSION::MAJOR >= 8 + require "generators/tailwindcss/authentication/authentication_generator" + + class Tailwindcss::Generators::AuthenticationGeneratorTest < Rails::Generators::TestCase + tests Tailwindcss::Generators::AuthenticationGenerator + destination TAILWINDCSS_TEST_APP_ROOT + + test "generates the new session template" do + run_generator + + assert_file "app/views/sessions/new.html.erb" + end + end +end From 381446b2405dbbf028c3afcd8606de700400b7e5 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 30 Jul 2024 15:20:38 -0400 Subject: [PATCH 119/274] ci: add unit tests to the upstream workflow because the authentication template is only on rails edge --- .github/workflows/upstream.yml | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index b2dda2bc..0b0f35eb 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -14,20 +14,42 @@ on: - .github/workflows/upstream.yml # this file jobs: + tests: + name: "tests (rails main)" + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + ruby: ["3.3"] + steps: + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{matrix.ruby}} + - run: | + rm Gemfile.lock + bundle remove actionmailer + git clone --depth 1 --branch main https://github.com/rails/rails + bundle add actionmailer --path=rails + bundle add railties --path=rails + bundle install + - name: Run tests + run: bin/test + user-journey: name: "user-journey (rails main)" + runs-on: ${{matrix.plat}}-latest strategy: fail-fast: false matrix: plat: ["ubuntu", "windows", "macos"] - runs-on: ${{matrix.plat}}-latest env: RAILSOPTS: --git=https://github.com/rails/rails --branch main steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.2" + ruby-version: "3.3" bundler: latest - run: test/integration/user_journey_test.sh shell: bash From 1d84cd12d97a2a87ef935a4fc45b2b340cc70bc4 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 3 Aug 2024 15:56:42 -0700 Subject: [PATCH 120/274] Add templates for password reset templates --- .../templates/views/passwords/edit.html.erb | 21 +++++++++++++++++++ .../templates/views/passwords/new.html.erb | 17 +++++++++++++++ .../templates/views/sessions/new.html.erb | 14 +++++++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb create mode 100644 lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb new file mode 100644 index 00000000..f648e89a --- /dev/null +++ b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb @@ -0,0 +1,21 @@ +
+

Update your password

+ + <%% if alert = flash[:alert] %> +

<%%= alert %>

+ <%% end %> + + <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %> +
+ <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.submit "Save", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ <%% end %> +
diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb new file mode 100644 index 00000000..431cf70b --- /dev/null +++ b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb @@ -0,0 +1,17 @@ +
+

Forgot your password?

+ + <%% if alert = flash[:alert] %> +

<%%= alert %>

+ <%% end %> + + <%%= form_with url: passwords_path, class: "contents" do |form| %> +
+ <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.submit "Email reset instructions", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ <%% end %> +
diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb index 824b506a..aebe9991 100644 --- a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb @@ -5,6 +5,10 @@

<%%= alert %>

<%% end %> + <%% if notice = flash[:notice] %> +

<%%= notice %>

+ <%% end %> + <%%= form_with url: session_url, class: "contents" do |form| %>
<%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> @@ -14,8 +18,14 @@ <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %>
-
- <%%= form.submit "Sign in", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+
+ <%%= form.submit "Sign in", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ +
+ <%%= link_to "Forgot password?", new_password_path, class: "text-gray-700 underline" %> +
<%% end %>
From dfafa4c329e655383fe72189ea17c85fb5201e04 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 3 Aug 2024 15:57:25 -0700 Subject: [PATCH 121/274] Excess CR --- .../authentication/templates/views/sessions/new.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb index aebe9991..644b578a 100644 --- a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb @@ -29,4 +29,3 @@
<%% end %> - From 6116343e842f876fd5e5735f807bac8af0b6c6e8 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 3 Aug 2024 17:21:55 -0700 Subject: [PATCH 122/274] Alerts and notices look better above the heading --- .../authentication/templates/views/passwords/edit.html.erb | 4 ++-- .../authentication/templates/views/passwords/new.html.erb | 4 ++-- .../authentication/templates/views/sessions/new.html.erb | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb index f648e89a..939b0b8d 100644 --- a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb @@ -1,10 +1,10 @@
-

Update your password

- <%% if alert = flash[:alert] %>

<%%= alert %>

<%% end %> +

Update your password

+ <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %>
<%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb index 431cf70b..e5d88197 100644 --- a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb @@ -1,10 +1,10 @@
-

Forgot your password?

- <%% if alert = flash[:alert] %>

<%%= alert %>

<%% end %> +

Forgot your password?

+ <%%= form_with url: passwords_path, class: "contents" do |form| %>
<%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb index 644b578a..a4751541 100644 --- a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb @@ -1,6 +1,4 @@
-

Sign in

- <%% if alert = flash[:alert] %>

<%%= alert %>

<%% end %> @@ -9,6 +7,8 @@

<%%= notice %>

<%% end %> +

Sign in

+ <%%= form_with url: session_url, class: "contents" do |form| %>
<%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> From 4249afa4141cf2a0ca220efe8dc8451cdb1dd189 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 5 Aug 2024 09:38:49 -0400 Subject: [PATCH 123/274] version bump to v2.7.0 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1259252..aa109e1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.0 / 2024-08-05 + +* Add specialized views for the new authentication generator coming in Rails 8. (#384) @yshmarov @dhh @flavorjones + + ## v2.6.5 / 2024-07-30 * During installation, clobber the Rails v8 default `bin/dev` file without requiring human intervention. (#385) @jeromedalbert diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 17119e4b..4797a70a 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.6.5" + VERSION = "2.7.0" end From 99f60358a6d6bcdc726558e505253c7586140919 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 7 Aug 2024 14:22:30 -0400 Subject: [PATCH 124/274] dep: update packaged tailwindcss to v3.4.8 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.8 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 4b618de4..46b3a36e 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.7" + VERSION = "v3.4.8" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 68f0bd4ae610e1060f5fcf58f474f2ce38878065 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 7 Aug 2024 14:28:52 -0400 Subject: [PATCH 125/274] version bump to v2.7.1 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa109e1f..d3318bb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.1 / 2024-08-07 + +* Update to [Tailwind CSS v3.4.8](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.8) @flavorjones + + ## v2.7.0 / 2024-08-05 * Add specialized views for the new authentication generator coming in Rails 8. (#384) @yshmarov @dhh @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 331eb72c..bc4f5a0b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.6.5) + tailwindcss-rails (2.7.1) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 4797a70a..3bee3ccb 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.0" + VERSION = "2.7.1" end From 2a8d5825dc8209f8bc0dd97bfd3c41863f22ef40 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 8 Aug 2024 14:00:58 -0400 Subject: [PATCH 126/274] dep: bump tailwindcss to v3.4.9 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.9 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 46b3a36e..7d62c5c7 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.8" + VERSION = "v3.4.9" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 0301c4a8ce3f23a6da2db07658fba5288a9fc7d1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 8 Aug 2024 14:06:43 -0400 Subject: [PATCH 127/274] version bump to v2.7.2 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3318bb3..012182dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.2 / 2024-08-08 + +* Update to [Tailwind CSS v3.4.9](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.9) @flavorjones + + ## v2.7.1 / 2024-08-07 * Update to [Tailwind CSS v3.4.8](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.8) @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 3bee3ccb..dcdcff4b 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.1" + VERSION = "2.7.2" end From 082ccca8130a40a4008ec13b781418129f3a7e79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 14:43:54 +0000 Subject: [PATCH 128/274] build(deps): bump railties from 7.1.3.4 to 7.2.0 Bumps [railties](https://github.com/rails/rails) from 7.1.3.4 to 7.2.0. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.0/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.1.3.4...v7.2.0) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 67 ++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index bc4f5a0b..b3e1b73f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,49 +7,48 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.1.3.4) - actionpack (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activesupport (= 7.1.3.4) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp + actionmailer (7.2.0) + actionpack (= 7.2.0) + actionview (= 7.2.0) + activejob (= 7.2.0) + activesupport (= 7.2.0) + mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.1.3.4) - actionview (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionpack (7.2.0) + actionview (= 7.2.0) + activesupport (= 7.2.0) nokogiri (>= 1.8.5) racc - rack (>= 2.2.4) + rack (>= 2.2.4, < 3.2) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.3.4) - activesupport (= 7.1.3.4) + useragent (~> 0.16) + actionview (7.2.0) + activesupport (= 7.2.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.4) - activesupport (= 7.1.3.4) + activejob (7.2.0) + activesupport (= 7.2.0) globalid (>= 0.3.6) - activesupport (7.1.3.4) + activesupport (7.2.0) base64 bigdecimal - concurrent-ruby (~> 1.0, >= 1.0.2) + concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) - mutex_m - tzinfo (~> 2.0) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) base64 (0.2.0) bigdecimal (3.1.8) builder (3.3.0) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) @@ -66,6 +65,7 @@ GEM irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) + logger (1.6.0) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -77,7 +77,6 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.7) minitest (5.24.1) - mutex_m (0.2.0) net-imap (0.4.14) date net-protocol @@ -86,18 +85,18 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.6) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.6-arm64-darwin) + nokogiri (1.16.7-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.6-x86_64-darwin) + nokogiri (1.16.7-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio - racc (1.8.0) + racc (1.8.1) rack (3.1.7) rack-session (2.0.0) rack (>= 3.0.0) @@ -113,10 +112,10 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) - irb + railties (7.2.0) + actionpack (= 7.2.0) + activesupport (= 7.2.0) + irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) @@ -126,13 +125,15 @@ GEM psych (>= 4.0.0) reline (0.5.9) io-console (~> 0.5) + securerandom (0.3.1) stringio (3.1.1) thor (1.3.1) timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) + useragent (0.16.10) webrick (1.8.1) - zeitwerk (2.6.16) + zeitwerk (2.6.17) PLATFORMS arm64-darwin From 3fbcbe93ba3ccbdbfe030e7643270995a75551e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 14:44:05 +0000 Subject: [PATCH 129/274] build(deps-dev): bump actionmailer from 7.1.3.4 to 7.2.0 Bumps [actionmailer](https://github.com/rails/rails) from 7.1.3.4 to 7.2.0. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.0/actionmailer/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.1.3.4...v7.2.0) --- updated-dependencies: - dependency-name: actionmailer dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 66 +++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index bc4f5a0b..d3436d9d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,49 +7,48 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.1.3.4) - actionpack (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activesupport (= 7.1.3.4) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp + actionmailer (7.2.0) + actionpack (= 7.2.0) + actionview (= 7.2.0) + activejob (= 7.2.0) + activesupport (= 7.2.0) + mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.1.3.4) - actionview (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionpack (7.2.0) + actionview (= 7.2.0) + activesupport (= 7.2.0) nokogiri (>= 1.8.5) racc - rack (>= 2.2.4) + rack (>= 2.2.4, < 3.2) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.3.4) - activesupport (= 7.1.3.4) + useragent (~> 0.16) + actionview (7.2.0) + activesupport (= 7.2.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.3.4) - activesupport (= 7.1.3.4) + activejob (7.2.0) + activesupport (= 7.2.0) globalid (>= 0.3.6) - activesupport (7.1.3.4) + activesupport (7.2.0) base64 bigdecimal - concurrent-ruby (~> 1.0, >= 1.0.2) + concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) - mutex_m - tzinfo (~> 2.0) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) base64 (0.2.0) bigdecimal (3.1.8) builder (3.3.0) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) crass (1.0.6) date (3.3.4) @@ -66,6 +65,7 @@ GEM irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) + logger (1.6.0) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -77,27 +77,27 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.7) minitest (5.24.1) - mutex_m (0.2.0) net-imap (0.4.14) date net-protocol net-pop (0.1.2) + net-protocol net-protocol (0.2.2) timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.6) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.6-arm64-darwin) + nokogiri (1.16.7-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.6-x86_64-darwin) + nokogiri (1.16.7-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) psych (5.1.2) stringio - racc (1.8.0) + racc (1.8.1) rack (3.1.7) rack-session (2.0.0) rack (>= 3.0.0) @@ -113,10 +113,10 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) - irb + railties (7.2.0) + actionpack (= 7.2.0) + activesupport (= 7.2.0) + irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) @@ -126,11 +126,13 @@ GEM psych (>= 4.0.0) reline (0.5.9) io-console (~> 0.5) + securerandom (0.3.1) stringio (3.1.1) thor (1.3.1) timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) + useragent (0.16.10) webrick (1.8.1) zeitwerk (2.6.16) From df0c5716c7574c6e1e745dc873d64aaad5cfed6d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 14 Aug 2024 14:40:32 -0400 Subject: [PATCH 130/274] dep: update vendored tailwindcss to v3.4.10 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.10 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/upstream.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 012182dd..943b366b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Update to [Tailwind CSS v3.4.10](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.10) @flavorjones + + ## v2.7.2 / 2024-08-08 * Update to [Tailwind CSS v3.4.9](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.9) @flavorjones diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 7d62c5c7..0508b1fc 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.9" + VERSION = "v3.4.10" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From eeac920f92e6bea06a88f944db346908c2ff189f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 14 Aug 2024 14:48:02 -0400 Subject: [PATCH 131/274] version bump to v2.7.3 --- CHANGELOG.md | 2 +- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 943b366b..dd8404f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v2.7.3 / 2024-08-14 * Update to [Tailwind CSS v3.4.10](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.10) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 3921c244..b17a6dff 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.7.1) + tailwindcss-rails (2.7.3) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index dcdcff4b..672fec0c 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.2" + VERSION = "2.7.3" end From 00f2cdbe54078832b1bd9ca4e4825063bb220057 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:49:45 +0000 Subject: [PATCH 132/274] build(deps-dev): bump actionmailer from 7.2.0 to 7.2.1 Bumps [actionmailer](https://github.com/rails/rails) from 7.2.0 to 7.2.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1/actionmailer/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.0...v7.2.1) --- updated-dependencies: - dependency-name: actionmailer dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b17a6dff..df718d3e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,16 +7,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.0) - actionpack (= 7.2.0) - actionview (= 7.2.0) - activejob (= 7.2.0) - activesupport (= 7.2.0) + actionmailer (7.2.1) + actionpack (= 7.2.1) + actionview (= 7.2.1) + activejob (= 7.2.1) + activesupport (= 7.2.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.0) - actionview (= 7.2.0) - activesupport (= 7.2.0) + actionpack (7.2.1) + actionview (= 7.2.1) + activesupport (= 7.2.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -25,16 +25,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.0) - activesupport (= 7.2.0) + actionview (7.2.1) + activesupport (= 7.2.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.0) - activesupport (= 7.2.0) + activejob (7.2.1) + activesupport (= 7.2.1) globalid (>= 0.3.6) - activesupport (7.2.0) + activesupport (7.2.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -76,7 +76,7 @@ GEM net-smtp mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) net-imap (0.4.14) date net-protocol @@ -113,9 +113,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.0) - actionpack (= 7.2.0) - activesupport (= 7.2.0) + railties (7.2.1) + actionpack (= 7.2.1) + activesupport (= 7.2.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 7388f4c95c421c1754f3903cc5f162b009901651 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:49:56 +0000 Subject: [PATCH 133/274] build(deps): bump railties from 7.2.0 to 7.2.1 Bumps [railties](https://github.com/rails/rails) from 7.2.0 to 7.2.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.0...v7.2.1) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b17a6dff..df718d3e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,16 +7,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.0) - actionpack (= 7.2.0) - actionview (= 7.2.0) - activejob (= 7.2.0) - activesupport (= 7.2.0) + actionmailer (7.2.1) + actionpack (= 7.2.1) + actionview (= 7.2.1) + activejob (= 7.2.1) + activesupport (= 7.2.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.0) - actionview (= 7.2.0) - activesupport (= 7.2.0) + actionpack (7.2.1) + actionview (= 7.2.1) + activesupport (= 7.2.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -25,16 +25,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.0) - activesupport (= 7.2.0) + actionview (7.2.1) + activesupport (= 7.2.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.0) - activesupport (= 7.2.0) + activejob (7.2.1) + activesupport (= 7.2.1) globalid (>= 0.3.6) - activesupport (7.2.0) + activesupport (7.2.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -76,7 +76,7 @@ GEM net-smtp mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) net-imap (0.4.14) date net-protocol @@ -113,9 +113,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.0) - actionpack (= 7.2.0) - activesupport (= 7.2.0) + railties (7.2.1) + actionpack (= 7.2.1) + activesupport (= 7.2.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 985ca94367ab2d5a7363d872071fbe9d474f67f6 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 13 Sep 2024 13:36:32 -0400 Subject: [PATCH 134/274] dep: update tailwindcss to v3.4.11 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.11 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index 0508b1fc..ddf1a330 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.10" + VERSION = "v3.4.11" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 1b5c8f2a6d4066319f9f86ce0af68d76a5cd7e99 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 13 Sep 2024 13:53:30 -0400 Subject: [PATCH 135/274] version bump to v2.7.4 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd8404f3..a633c21d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.4 / 2024-09-13 + +* Update to [Tailwind CSS v3.4.11](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.11) @flavorjones + + ## v2.7.3 / 2024-08-14 * Update to [Tailwind CSS v3.4.10](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.10) @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 672fec0c..5678e7df 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.3" + VERSION = "2.7.4" end From 1b5957f23e1bb6375f1698fc548c16c45f835424 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 13 Sep 2024 14:09:27 -0400 Subject: [PATCH 136/274] bump Gemfile --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index df718d3e..e107279a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.7.3) + tailwindcss-rails (2.7.4) railties (>= 7.0.0) GEM From 8b750d0f2f3e9f81d2dde4ecbab036eb03fdfc4f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 13 Sep 2024 14:10:17 -0400 Subject: [PATCH 137/274] doc: clarify CONTRIBUTING.md [skip ci] --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8c68f93c..8dfb3c45 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ Update `lib/tailwindcss/upstream.rb` with the upstream version. Run `bundle exec rake clobber` then `bundle exec rake download` to ensure the tailwindcss binaries can be downloaded, and that you have the correct versions on local disk. -## Cutting a release +## Cutting a release of tailwindcss-rails - bump the version - [ ] update `lib/tailwindcss/version.rb` @@ -40,6 +40,6 @@ Run `bundle exec rake clobber` then `bundle exec rake download` to ensure the ta - [ ] `bundle exec rake package` - push - [ ] `for g in pkg/*.gem ; do gem push $g ; done` - - [ ] `git push` + - [ ] `git push && git push --tags` - announce - [ ] create a release at https://github.com/rails/tailwindcss-rails/releases From a8258a3795206762f54f3fde960141461572c4a4 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 18 Sep 2024 10:49:28 -0400 Subject: [PATCH 138/274] dep: bump tailwindcss to v3.4.12 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.12 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index ddf1a330..d541e8c1 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.11" + VERSION = "v3.4.12" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 6647919ea332095ab648a0f447e4c1ae30e5c9e7 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 18 Sep 2024 10:56:05 -0400 Subject: [PATCH 139/274] version bump to v2.7.5 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a633c21d..656477c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.5 / 2024-09-18 + +* Update to [Tailwind CSS v3.4.12](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.12) @flavorjones + + ## v2.7.4 / 2024-09-13 * Update to [Tailwind CSS v3.4.11](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.11) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index e107279a..368d7260 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.7.4) + tailwindcss-rails (2.7.5) railties (>= 7.0.0) GEM diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 5678e7df..49eecaf0 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.4" + VERSION = "2.7.5" end From ee6f60b072475e1e36442747a4a7c1611dd0eb79 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 23 Sep 2024 16:24:24 -0400 Subject: [PATCH 140/274] dep: bump tailwindcss to 3.4.13 https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.13 --- lib/tailwindcss/upstream.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index d541e8c1..a2399140 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,7 +1,7 @@ module Tailwindcss # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.12" + VERSION = "v3.4.13" # rubygems platform name => upstream release filename NATIVE_PLATFORMS = { From 3dfdcb9f8ff88f99187434a7aa295f7a67d6c866 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 23 Sep 2024 16:31:23 -0400 Subject: [PATCH 141/274] version bump to v2.7.6 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 656477c3..19620bb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.6 / 2024-09-18 + +* Update to [Tailwind CSS v3.4.13](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.13) @flavorjones + + ## v2.7.5 / 2024-09-18 * Update to [Tailwind CSS v3.4.12](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.12) @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 49eecaf0..83f9738e 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.5" + VERSION = "2.7.6" end From 67500d65cabef1f8bd2aba45764abd0b239c854d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 23 Sep 2024 16:33:51 -0400 Subject: [PATCH 142/274] doc: fix date in changelog also update Gemfile.lock [skip ci] --- CHANGELOG.md | 2 +- Gemfile.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19620bb3..59afb8e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## v2.7.6 / 2024-09-18 +## v2.7.6 / 2024-09-23 * Update to [Tailwind CSS v3.4.13](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.13) @flavorjones diff --git a/Gemfile.lock b/Gemfile.lock index 368d7260..3eb21c65 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.7.5) + tailwindcss-rails (2.7.6) railties (>= 7.0.0) GEM From 845c3f4d2de523f2d55816f21aee84720d3254dd Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 24 Sep 2024 13:24:29 -0400 Subject: [PATCH 143/274] dep: update webrick to 1.8.2 to address https://github.com/rails/tailwindcss-rails/security/dependabot/53 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3eb21c65..922d259d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -133,7 +133,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) useragent (0.16.10) - webrick (1.8.1) + webrick (1.8.2) zeitwerk (2.6.17) PLATFORMS From 328b96b862b166395007cd705de8a9315bc84e81 Mon Sep 17 00:00:00 2001 From: Sean Doyle Date: Sun, 29 Sep 2024 19:48:11 -0400 Subject: [PATCH 144/274] Rename Authentication template files Follow-up to [#53098][] The corresponding commit in `rails/rails` nested the template files (including the view templates) under an `app/` directory. This commit makes a corresponding change, nesting the `views/` templates under `app/views/`. [#53098]: https://github.com/rails/rails/pull/53098#issuecomment-2381650236 Co-authored-by: Jerome Dalbert --- .../templates/{ => app}/views/passwords/edit.html.erb | 0 .../templates/{ => app}/views/passwords/new.html.erb | 0 .../templates/{ => app}/views/sessions/new.html.erb | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename lib/generators/tailwindcss/authentication/templates/{ => app}/views/passwords/edit.html.erb (100%) rename lib/generators/tailwindcss/authentication/templates/{ => app}/views/passwords/new.html.erb (100%) rename lib/generators/tailwindcss/authentication/templates/{ => app}/views/sessions/new.html.erb (100%) diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb similarity index 100% rename from lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb rename to lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb similarity index 100% rename from lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb rename to lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb similarity index 100% rename from lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb rename to lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb From bed38c6591443065045e76ef9c0f87a6196a99f3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 1 Oct 2024 18:50:52 -0400 Subject: [PATCH 145/274] test: add coverage for generator templates and matrix across Rails 7.2, 8.0, and main --- .github/workflows/upstream.yml | 9 ++++----- test/integration/user_journey_test.sh | 13 ++++++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 0b0f35eb..0ba5507a 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -10,8 +10,6 @@ on: types: [opened, synchronize] branches: - '*' - paths: - - .github/workflows/upstream.yml # this file jobs: tests: @@ -37,14 +35,15 @@ jobs: run: bin/test user-journey: - name: "user-journey (rails main)" + name: "user-journey (rails ${{ matrix.ref }})" runs-on: ${{matrix.plat}}-latest strategy: fail-fast: false matrix: - plat: ["ubuntu", "windows", "macos"] + plat: ["ubuntu"] + ref: ["7-2-stable", "v8.0.0.beta1", "main"] env: - RAILSOPTS: --git=https://github.com/rails/rails --branch main + RAILSOPTS: --git=https://github.com/rails/rails --ref=${{ matrix.ref }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 4016ec20..1877e871 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -32,12 +32,13 @@ bundle add rails --skip-install ${RAILSOPTS:-} bundle add tailwindcss-rails --path="../.." bundle install bundle show --paths +bundle binstubs --all # install tailwindcss bin/rails tailwindcss:install # TEST: tailwind was installed correctly -grep tailwind app/views/layouts/application.html.erb +grep -q tailwind app/views/layouts/application.html.erb # TEST: rake tasks don't exec (#188) cat <> Rakefile @@ -47,3 +48,13 @@ end EOF bin/rails tailwindcss:build still_here | grep "Rake process did not exit early" + +if [[ $(rails -v) > "Rails 8.0.0.beta" ]] ; then + # TEST: presence of the generated file + bin/rails generate authentication + grep -q PasswordsController app/controllers/passwords_controller.rb +fi + +# TEST: presence of the generated file +bin/rails generate scaffold post title:string body:text published:boolean +grep -q "Show this post" app/views/posts/index.html.erb From 9dee33a64db4323414bab5910f379b38fb8b0d47 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 1 Oct 2024 18:20:05 -0400 Subject: [PATCH 146/274] Make copies of the auth templates for Rails 8 beta1 We can revert this once beta2 is out. --- .../templates/views/passwords/edit.html.erb | 21 +++++++++++++ .../templates/views/passwords/new.html.erb | 17 ++++++++++ .../templates/views/sessions/new.html.erb | 31 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb create mode 100644 lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb create mode 100644 lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb new file mode 100644 index 00000000..939b0b8d --- /dev/null +++ b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb @@ -0,0 +1,21 @@ +
+ <%% if alert = flash[:alert] %> +

<%%= alert %>

+ <%% end %> + +

Update your password

+ + <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %> +
+ <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.submit "Save", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ <%% end %> +
diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb new file mode 100644 index 00000000..e5d88197 --- /dev/null +++ b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb @@ -0,0 +1,17 @@ +
+ <%% if alert = flash[:alert] %> +

<%%= alert %>

+ <%% end %> + +

Forgot your password?

+ + <%%= form_with url: passwords_path, class: "contents" do |form| %> +
+ <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.submit "Email reset instructions", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ <%% end %> +
diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb new file mode 100644 index 00000000..a4751541 --- /dev/null +++ b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb @@ -0,0 +1,31 @@ +
+ <%% if alert = flash[:alert] %> +

<%%= alert %>

+ <%% end %> + + <%% if notice = flash[:notice] %> +

<%%= notice %>

+ <%% end %> + +

Sign in

+ + <%%= form_with url: session_url, class: "contents" do |form| %> +
+ <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+ <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> +
+ +
+
+ <%%= form.submit "Sign in", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> +
+ +
+ <%%= link_to "Forgot password?", new_password_path, class: "text-gray-700 underline" %> +
+
+ <%% end %> +
From d0c0590390e698586554e6769f6ec5e296d99c5b Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 2 Oct 2024 08:43:23 -0400 Subject: [PATCH 147/274] version bump to v2.7.7 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59afb8e1..63d2e03c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v2.7.7 / 2024-10-02 + +* Proactively support changes to Rails's authentication templates shipping in Rails 8.0.0.beta2 (which is not yet released). (#407, #408) @seanpdoyle @flavorjones + + ## v2.7.6 / 2024-09-23 * Update to [Tailwind CSS v3.4.13](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.13) @flavorjones diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 83f9738e..6f849135 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.6" + VERSION = "2.7.7" end From 97dce5fe4bf57c53c715ed672308a394574a94d8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 2 Oct 2024 08:54:03 -0400 Subject: [PATCH 148/274] dev: update Gemfile.lock [skip ci] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 922d259d..0c679b3c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.7.6) + tailwindcss-rails (2.7.7) railties (>= 7.0.0) GEM From 27ba067699458fe9c2cda83ad4f7114badd79375 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 25 Sep 2024 17:44:34 -0400 Subject: [PATCH 149/274] Remove the upstream tailwindcss packaging This is being extracted into the tailwindcss-ruby gem. --- .gitignore | 1 - CHANGELOG.md | 11 + CONTRIBUTING.md | 11 +- Gemfile.lock | 2 + LICENSE-DEPENDENCIES | 26 --- README.md | 66 +----- exe/tailwindcss | 19 -- lib/tailwindcss-rails.rb | 1 - lib/tailwindcss/commands.rb | 74 +------ lib/tailwindcss/upstream.rb | 15 +- package/tailwindcss-v3.4.7-checksums.txt | 6 - rakelib/package.rake | 149 -------------- tailwindcss-rails.gemspec | 3 +- test/integration/user_journey_test.sh | 3 - test/lib/tailwindcss/commands_test.rb | 246 ++++++----------------- 15 files changed, 86 insertions(+), 547 deletions(-) delete mode 100644 LICENSE-DEPENDENCIES delete mode 100755 exe/tailwindcss delete mode 100644 package/tailwindcss-v3.4.7-checksums.txt delete mode 100644 rakelib/package.rake diff --git a/.gitignore b/.gitignore index b2a14451..de5dc1de 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,3 @@ *.gem .idea/ **/tmp/ -/exe/*/tailwindcss diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d2e03c..19fcccb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## next / unreleased + +### Notable changes + +* The upstream `tailwindcss` executable has been extracted from this gem into a new dependency, `tailwindcss-ruby`. + + In advance of the upcoming TailwindCSS v4 release, we are decoupling the `tailwindcss` executable + from the Rails integration. This will allow users to upgrade TailwindCSS at a time of their + choosing, and allow early adopters to start using the beta releases. + + ## v2.7.7 / 2024-10-02 * Proactively support changes to Rails's authentication templates shipping in Rails 8.0.0.beta2 (which is not yet released). (#407, #408) @seanpdoyle @flavorjones diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8dfb3c45..debab121 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,23 +23,14 @@ gem "tailwindcss-rails", path: "/path/to/tailwindcss-rails" ``` -## Updating to the latest upstream tailwindcss version - -Update `lib/tailwindcss/upstream.rb` with the upstream version. - -Run `bundle exec rake clobber` then `bundle exec rake download` to ensure the tailwindcss binaries can be downloaded, and that you have the correct versions on local disk. - ## Cutting a release of tailwindcss-rails - bump the version - [ ] update `lib/tailwindcss/version.rb` - [ ] update `CHANGELOG.md` - [ ] commit and create a git tag -- build the native gems: - - [ ] `bundle exec rake clobber` to clean up possibly-old tailwindcss executables - - [ ] `bundle exec rake package` - push - - [ ] `for g in pkg/*.gem ; do gem push $g ; done` + - [ ] `gem push pkg/*.gem` - [ ] `git push && git push --tags` - announce - [ ] create a release at https://github.com/rails/tailwindcss-rails/releases diff --git a/Gemfile.lock b/Gemfile.lock index 0c679b3c..7e6f5372 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,6 +3,7 @@ PATH specs: tailwindcss-rails (2.7.7) railties (>= 7.0.0) + tailwindcss-ruby GEM remote: https://rubygems.org/ @@ -128,6 +129,7 @@ GEM io-console (~> 0.5) securerandom (0.3.1) stringio (3.1.1) + tailwindcss-ruby (0.1.0-x86_64-linux) thor (1.3.1) timeout (0.4.1) tzinfo (2.0.6) diff --git a/LICENSE-DEPENDENCIES b/LICENSE-DEPENDENCIES deleted file mode 100644 index 93a34024..00000000 --- a/LICENSE-DEPENDENCIES +++ /dev/null @@ -1,26 +0,0 @@ -tailwindcss-rails may redistribute executables from the https://github.com/tailwindlabs/tailwindcss project - -The license for that software can be found at https://github.com/tailwindlabs/tailwindcss/blob/master/LICENSE which is reproduced here for your convenience: - - MIT License - - Copyright (c) Adam Wathan - Copyright (c) Jonathan Reinink - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. diff --git a/README.md b/README.md index 01fa023b..dc689b60 100644 --- a/README.md +++ b/README.md @@ -35,34 +35,7 @@ With Rails 7 you can generate a new application preconfigured with Tailwind by u 1. Run `./bin/bundle add tailwindcss-rails` 2. Run `./bin/rails tailwindcss:install` -This gem wraps [the standalone executable version](https://tailwindcss.com/blog/standalone-cli) of the Tailwind CSS v3 framework. These executables are platform specific, so there are actually separate underlying gems per platform, but the correct gem will automatically be picked for your platform. - -Supported platforms are: - -- arm64-darwin (macos-arm64) -- x64-mingw32 (windows-x64) -- x64-mingw-ucr (windows-x64) -- x86_64-darwin (macos-x64) -- x86_64-linux (linux-x64) -- aarch64-linux (linux-arm64) -- arm-linux (linux-armv7) - - -### Using a local installation of `tailwindcss` - -If you are not able to use the vendored standalone executables (for example, if you're on an unsupported platform), you can use a local installation of the `tailwindcss` executable by setting an environment variable named `TAILWINDCSS_INSTALL_DIR` to the directory path containing the executable. - -For example, if you've installed `tailwindcss` so that the executable is found at `/path/to/node_modules/bin/tailwindcss`, then you should set your environment variable like so: - -``` sh -TAILWINDCSS_INSTALL_DIR=/path/to/node_modules/bin -``` - -or, for relative paths like `./node_modules/.bin/tailwindcss`: - -``` sh -TAILWINDCSS_INSTALL_DIR=node_modules/.bin -``` +This gem depends on the `tailwindcss-ruby` gem to install a working tailwind executable. You can also use a local (npm-based) installation if you prefer, please go to https://github.com/flavorjones/tailwindcss-ruby for more information. ## Developing with Tailwindcss @@ -206,41 +179,7 @@ For Tailwind to work, your class names need to be spelled out. If you need to ma ### `ERROR: Cannot find the tailwindcss executable` for supported platform -Some users are reporting this error even when running on one of the supported native platforms: - -- arm64-darwin -- x64-mingw32 -- x64-mingw-ucrt -- x86_64-darwin -- x86_64-linux -- aarch64-linux - -#### Check Bundler PLATFORMS - -A possible cause of this is that Bundler has not been told to include native gems for your current platform. Please check your `Gemfile.lock` file to see whether your native platform is included in the `PLATFORMS` section. If necessary, run: - -``` sh -bundle lock --add-platform -``` - -and re-bundle. - - -#### Check BUNDLE_FORCE_RUBY_PLATFORM - -Another common cause of this is that bundler is configured to always use the "ruby" platform via the -`BUNDLE_FORCE_RUBY_PLATFORM` config parameter being set to `true`. Please remove this configuration: - -``` sh -bundle config unset force_ruby_platform -# or -bundle config set --local force_ruby_platform false -``` - -and re-bundle. - -See https://bundler.io/man/bundle-config.1.html for more information. - +See https://github.com/flavorjones/tailwindcss-ruby for help. ### Using asset-pipeline assets @@ -280,5 +219,4 @@ Or, if you do want to keep using the asset pipeline in parallel, make sure to re ## License Tailwind for Rails is released under the [MIT License](https://opensource.org/licenses/MIT). -Tailwind CSS is released under the [MIT License](https://opensource.org/licenses/MIT). The Inter font is released under the [SIL Open Font License, Version 1.1](https://github.com/rsms/inter/blob/master/LICENSE.txt). diff --git a/exe/tailwindcss b/exe/tailwindcss deleted file mode 100755 index ce4a4437..00000000 --- a/exe/tailwindcss +++ /dev/null @@ -1,19 +0,0 @@ -#! /usr/bin/env ruby -# because rubygems shims assume a gem's executables are Ruby - -require "tailwindcss/commands" - -begin - command = [Tailwindcss::Commands.executable, *ARGV] - puts command.inspect - if Gem.win_platform? - # use system rather than exec as exec inexplicably fails to find the executable on Windows - # see related https://github.com/rubys/sprockets-esbuild/pull/4 - system(*command, exception: true) - else - exec(*command) - end -rescue Tailwindcss::Commands::UnsupportedPlatformException, Tailwindcss::Commands::ExecutableNotFoundException => e - STDERR.puts("ERROR: " + e.message) - exit 1 -end diff --git a/lib/tailwindcss-rails.rb b/lib/tailwindcss-rails.rb index 112809c5..2b86ff1c 100644 --- a/lib/tailwindcss-rails.rb +++ b/lib/tailwindcss-rails.rb @@ -1,7 +1,6 @@ module Tailwindcss end -require_relative "tailwindcss/upstream" require_relative "tailwindcss/version" require_relative "tailwindcss/engine" require_relative "tailwindcss/commands" diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 08b70d33..26c5178a 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -1,81 +1,11 @@ -require_relative "upstream" +require "tailwindcss/ruby" module Tailwindcss module Commands - DEFAULT_DIR = File.expand_path(File.join(__dir__, "..", "..", "exe")) - GEM_NAME = "tailwindcss-rails" - - # raised when the host platform is not supported by upstream tailwindcss's binary releases - class UnsupportedPlatformException < StandardError - end - - # raised when the tailwindcss executable could not be found where we expected it to be - class ExecutableNotFoundException < StandardError - end - - # raised when TAILWINDCSS_INSTALL_DIR does not exist - class DirectoryNotFoundException < StandardError - end - class << self - def platform - [:cpu, :os].map { |m| Gem::Platform.local.send(m) }.join("-") - end - - def executable(exe_path: DEFAULT_DIR) - tailwindcss_install_dir = ENV["TAILWINDCSS_INSTALL_DIR"] - if tailwindcss_install_dir - if File.directory?(tailwindcss_install_dir) - warn "NOTE: using TAILWINDCSS_INSTALL_DIR to find tailwindcss executable: #{tailwindcss_install_dir}" - exe_path = tailwindcss_install_dir - exe_file = File.expand_path(File.join(tailwindcss_install_dir, "tailwindcss")) - else - raise DirectoryNotFoundException, <<~MESSAGE - TAILWINDCSS_INSTALL_DIR is set to #{tailwindcss_install_dir}, but that directory does not exist. - MESSAGE - end - else - if Tailwindcss::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match_gem?(Gem::Platform.new(p), GEM_NAME) } - raise UnsupportedPlatformException, <<~MESSAGE - tailwindcss-rails does not support the #{platform} platform - Please install tailwindcss following instructions at https://tailwindcss.com/docs/installation - MESSAGE - end - - exe_file = Dir.glob(File.expand_path(File.join(exe_path, "*", "tailwindcss"))).find do |f| - Gem::Platform.match_gem?(Gem::Platform.new(File.basename(File.dirname(f))), GEM_NAME) - end - end - - if exe_file.nil? || !File.exist?(exe_file) - raise ExecutableNotFoundException, <<~MESSAGE - Cannot find the tailwindcss executable for #{platform} in #{exe_path} - - If you're using bundler, please make sure you're on the latest bundler version: - - gem install bundler - bundle update --bundler - - Then make sure your lock file includes this platform by running: - - bundle lock --add-platform #{platform} - bundle install - - See `bundle lock --help` output for details. - - If you're still seeing this message after taking those steps, try running - `bundle config` and ensure `force_ruby_platform` isn't set to `true`. See - https://github.com/rails/tailwindcss-rails#check-bundle_force_ruby_platform - for more details. - MESSAGE - end - - exe_file - end - def compile_command(debug: false, **kwargs) command = [ - executable(**kwargs), + Tailwindcss::Ruby.executable(**kwargs), "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s, "-c", Rails.root.join("config/tailwind.config.js").to_s, diff --git a/lib/tailwindcss/upstream.rb b/lib/tailwindcss/upstream.rb index a2399140..358db1c0 100644 --- a/lib/tailwindcss/upstream.rb +++ b/lib/tailwindcss/upstream.rb @@ -1,17 +1,6 @@ module Tailwindcss - # constants describing the upstream tailwindcss project module Upstream - VERSION = "v3.4.13" - - # rubygems platform name => upstream release filename - NATIVE_PLATFORMS = { - "arm64-darwin" => "tailwindcss-macos-arm64", - "x64-mingw32" => "tailwindcss-windows-x64.exe", - "x64-mingw-ucrt" => "tailwindcss-windows-x64.exe", - "x86_64-darwin" => "tailwindcss-macos-x64", - "x86_64-linux" => "tailwindcss-linux-x64", - "aarch64-linux" => "tailwindcss-linux-arm64", - "arm-linux" => "tailwindcss-linux-armv7", - } + VERSION = Tailwindcss::Ruby::Upstream::VERSION + deprecate_constant :VERSION end end diff --git a/package/tailwindcss-v3.4.7-checksums.txt b/package/tailwindcss-v3.4.7-checksums.txt deleted file mode 100644 index 0d5079d3..00000000 --- a/package/tailwindcss-v3.4.7-checksums.txt +++ /dev/null @@ -1,6 +0,0 @@ -8f8b5cd32fc35843ec24bbcdb214e972df6a9c485bf4d4fd049140fbcc766bcc tailwindcss-macos-x64 -0eda3bc8fe90506b7b9e5cb930312042730b76a7f18026d19414d48fbb3100ed tailwindcss-macos-arm64 -3c2321e66718f39e48388707ce8b587946338f82ef3d636c8ee19670514d3394 tailwindcss-linux-x64 -4146a6f534fffb27f95de9926d7806a6e432eeb7e55cb8850a57c4e062689c2b tailwindcss-linux-arm64 -85c4c71618f0bfcdb0edf246ed6ee394a7addb8af34ed7dbdce9298279243994 tailwindcss-linux-armv7 -e6891c3d181314b7d78382fe93121ff8957a9dbb1132a47afb064c0ed1f906e4 tailwindcss-windows-x64.exe diff --git a/rakelib/package.rake b/rakelib/package.rake deleted file mode 100644 index 7cab2924..00000000 --- a/rakelib/package.rake +++ /dev/null @@ -1,149 +0,0 @@ -# coding: utf-8 -# -# Rake tasks to manage native gem packages with binary executables from tailwindlabs/tailwindcss -# -# TL;DR: run "rake package" -# -# The native platform gems (defined by Tailwindcss::Upstream::NATIVE_PLATFORMS) will each contain -# two files in addition to what the vanilla ruby gem contains: -# -# exe/ -# ├── tailwindcss # generic ruby script to find and run the binary -# └── / -# └── tailwindcss # the tailwindcss binary executable -# -# The ruby script `exe/tailwindcss` is installed into the user's path, and it simply locates the -# binary and executes it. Note that this script is required because rubygems requires that -# executables declared in a gemspec must be Ruby scripts. -# -# Windows support note: we ship the same executable in two gems, the `x64-mingw32` and -# `x64-mingw-ucrt` flavors because Ruby < 3.1 uses the MSCVRT runtime libraries, and Ruby >= 3.1 -# uses the UCRT runtime libraries. You can read more about this change here: -# -# https://rubyinstaller.org/2021/12/31/rubyinstaller-3.1.0-1-released.html -# -# As a concrete example, an x86_64-linux system will see these files on disk after installing -# tailwindcss-rails-1.x.x-x86_64-linux.gem: -# -# exe/ -# ├── tailwindcss -# └── x86_64-linux/ -# └── tailwindcss -# -# So the full set of gem files created will be: -# -# - pkg/tailwindcss-rails-1.0.0.gem -# - pkg/tailwindcss-rails-1.0.0-aarch64-linux.gem -# - pkg/tailwindcss-rails-1.0.0-arm64-darwin.gem -# - pkg/tailwindcss-rails-1.0.0-x64-mingw32.gem -# - pkg/tailwindcss-rails-1.0.0-x64-mingw-ucrt.gem -# - pkg/tailwindcss-rails-1.0.0-x86_64-darwin.gem -# - pkg/tailwindcss-rails-1.0.0-x86_64-linux.gem -# -# Note that in addition to the native gems, a vanilla "ruby" gem will also be created without -# either the `exe/tailwindcss` script or a binary executable present. -# -# -# New rake tasks created: -# -# - rake gem:ruby # Build the ruby gem -# - rake gem:aarch64-linux # Build the aarch64-linux gem -# - rake gem:arm64-darwin # Build the arm64-darwin gem -# - rake gem:x64-mingw32 # Build the x64-mingw32 gem -# - rake gem:x64-mingw-ucrt # Build the x64-mingw-ucrt gem -# - rake gem:x86_64-darwin # Build the x86_64-darwin gem -# - rake gem:x86_64-linux # Build the x86_64-linux gem -# - rake download # Download all tailwindcss binaries -# -# Modified rake tasks: -# -# - rake gem # Build all the gem files -# - rake package # Build all the gem files (same as `gem`) -# - rake repackage # Force a rebuild of all the gem files -# -# Note also that the binary executables will be lazily downloaded when needed, but you can -# explicitly download them with the `rake download` command. -# -require "rubygems/package_task" -require "open-uri" -require_relative "../lib/tailwindcss/upstream" - -def tailwindcss_download_url(filename) - "https://github.com/tailwindlabs/tailwindcss/releases/download/#{Tailwindcss::Upstream::VERSION}/#{filename}" -end - -TAILWINDCSS_RAILS_GEMSPEC = Bundler.load_gemspec("tailwindcss-rails.gemspec") - -# prepend the download task before the Gem::PackageTask tasks -task :package => :download - -gem_path = Gem::PackageTask.new(TAILWINDCSS_RAILS_GEMSPEC).define -desc "Build the ruby gem" -task "gem:ruby" => [gem_path] - -exepaths = [] -Tailwindcss::Upstream::NATIVE_PLATFORMS.each do |platform, filename| - TAILWINDCSS_RAILS_GEMSPEC.dup.tap do |gemspec| - exedir = File.join(gemspec.bindir, platform) # "exe/x86_64-linux" - exepath = File.join(exedir, "tailwindcss") # "exe/x86_64-linux/tailwindcss" - exepaths << exepath - - # modify a copy of the gemspec to include the native executable - gemspec.platform = platform - gemspec.files += [exepath, "LICENSE-DEPENDENCIES"] - - # create a package task - gem_path = Gem::PackageTask.new(gemspec).define - desc "Build the #{platform} gem" - task "gem:#{platform}" => [gem_path] - - directory exedir - file exepath => [exedir] do - release_url = tailwindcss_download_url(filename) - warn "Downloading #{exepath} from #{release_url} ..." - - # lazy, but fine for now. - URI.open(release_url) do |remote| - File.open(exepath, "wb") do |local| - local.write(remote.read) - end - end - FileUtils.chmod(0755, exepath, verbose: true) - end - end -end - -desc "Validate checksums for tailwindcss binaries" -task "check" => exepaths do - sha_filename = File.absolute_path("../package/tailwindcss-#{Tailwindcss::Upstream::VERSION}-checksums.txt", __dir__) - sha_url = if File.exist?(sha_filename) - sha_filename - else - sha_url = tailwindcss_download_url("sha256sums.txt") - end - gemspec = TAILWINDCSS_RAILS_GEMSPEC - - checksums = URI.open(sha_url).each_line.map do |line| - checksum, file = line.split - [File.basename(file), checksum] - end.to_h - - Tailwindcss::Upstream::NATIVE_PLATFORMS.each do |platform, filename| - exedir = File.join(gemspec.bindir, platform) # "exe/x86_64-linux" - exepath = File.join(exedir, "tailwindcss") # "exe/x86_64-linux/tailwindcss" - - local_sha256 = Digest::SHA256.file(exepath).hexdigest - remote_sha256 = checksums.fetch(filename) - - if local_sha256 == remote_sha256 - puts "Checksum OK for #{exepath} (#{local_sha256})" - else - abort "Checksum mismatch for #{exepath} (#{local_sha256} != #{remote_sha256})" - end - end -end - -desc "Download all tailwindcss binaries" -task "download" => :check - -CLOBBER.add(exepaths.map { |p| File.dirname(p) }) diff --git a/tailwindcss-rails.gemspec b/tailwindcss-rails.gemspec index 7535ccc7..8d893029 100644 --- a/tailwindcss-rails.gemspec +++ b/tailwindcss-rails.gemspec @@ -17,8 +17,7 @@ Gem::Specification.new do |spec| spec.required_rubygems_version = ">= 3.2.0" # for Gem::Platform#match_gem? spec.files = Dir["{app,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"] - spec.bindir = "exe" - spec.executables << "tailwindcss" spec.add_dependency "railties", ">= 7.0.0" + spec.add_dependency "tailwindcss-ruby" end diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 1877e871..00818f2d 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -11,9 +11,6 @@ bundle remove actionmailer bundle add rails --skip-install ${RAILSOPTS:-} bundle install -# fetch the upstream executables -bundle exec rake download - # do our work a directory with spaces in the name (#176, #184) rm -rf "My Workspace" mkdir "My Workspace" diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 0be78894..a273e45e 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -2,209 +2,93 @@ require "minitest/mock" class Tailwindcss::CommandsTest < ActiveSupport::TestCase - def mock_exe_directory(platform) - Dir.mktmpdir do |dir| - FileUtils.mkdir(File.join(dir, platform)) - path = File.join(dir, platform, "tailwindcss") - FileUtils.touch(path) - stub_gem_platform_match_gem(true) do - yield(dir, path) - end - end - end - - def stub_gem_platform_match_gem(value) - assert_respond_to(Gem::Platform, :match_gem?) - Gem::Platform.stub(:match_gem?, value) do - yield - end - end - - def mock_local_tailwindcss_install - Dir.mktmpdir do |dir| - path = File.join(dir, "tailwindcss") - FileUtils.touch(path) - yield(dir, path) - end - end - - test ".platform is a string containing just the cpu and os (not the version)" do - expected = "#{Gem::Platform.local.cpu}-#{Gem::Platform.local.os}" - assert_equal(expected, Tailwindcss::Commands.platform) - end - - test ".executable returns the absolute path to the binary" do - mock_exe_directory("sparc-solaris2.8") do |dir, executable| - expected = File.expand_path(File.join(dir, "sparc-solaris2.8", "tailwindcss")) - assert_equal(expected, executable, "assert on setup") - assert_equal(expected, Tailwindcss::Commands.executable(exe_path: dir)) - end - end - - test ".executable raises UnsupportedPlatformException when we're not on a supported platform" do - stub_gem_platform_match_gem(false) do # nothing is supported - assert_raises(Tailwindcss::Commands::UnsupportedPlatformException) do - Tailwindcss::Commands.executable - end - end - end - - test ".executable raises ExecutableNotFoundException when we can't find the executable we expect" do - Dir.mktmpdir do |dir| # empty directory - assert_raises(Tailwindcss::Commands::ExecutableNotFoundException) do - Tailwindcss::Commands.executable(exe_path: dir) - end - end - end + attr_accessor :executable - test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR when no packaged binary exists" do - mock_local_tailwindcss_install do |local_install_dir, expected| - result = nil - begin - ENV["TAILWINDCSS_INSTALL_DIR"] = local_install_dir - assert_output(nil, /using TAILWINDCSS_INSTALL_DIR/) do - result = Tailwindcss::Commands.executable(exe_path: "/does/not/exist") - end - ensure - ENV["TAILWINDCSS_INSTALL_DIR"] = nil - end - assert_equal(expected, result) - end + def setup + super + @executable = Tailwindcss::Ruby.executable end - test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR when we're not on a supported platform" do - stub_gem_platform_match_gem(false) do # nothing is supported - mock_local_tailwindcss_install do |local_install_dir, expected| - result = nil - begin - ENV["TAILWINDCSS_INSTALL_DIR"] = local_install_dir - assert_output(nil, /using TAILWINDCSS_INSTALL_DIR/) do - result = Tailwindcss::Commands.executable - end - ensure - ENV["TAILWINDCSS_INSTALL_DIR"] = nil - end - assert_equal(expected, result) - end + test ".compile_command" do + Rails.stub(:root, File) do # Rails.root won't work in this test suite + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "--minify") + + actual = Tailwindcss::Commands.compile_command(debug: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + refute_includes(actual, "--minify") end end - test ".executable returns the executable in TAILWINDCSS_INSTALL_DIR even when a packaged binary exists" do - mock_exe_directory("sparc-solaris2.8") do |dir, _executable| - mock_local_tailwindcss_install do |local_install_dir, expected| - result = nil - begin - ENV["TAILWINDCSS_INSTALL_DIR"] = local_install_dir - assert_output(nil, /using TAILWINDCSS_INSTALL_DIR/) do - result = Tailwindcss::Commands.executable(exe_path: dir) - end - ensure - ENV["TAILWINDCSS_INSTALL_DIR"] = nil - end - assert_equal(expected, result) + test ".compile_command when Rails compression is on" do + Rails.stub(:root, File) do # Rails.root won't work in this test suite + Tailwindcss::Commands.stub(:rails_css_compressor?, true) do + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + refute_includes(actual, "--minify") end - end - end - test ".executable raises ExecutableNotFoundException is TAILWINDCSS_INSTALL_DIR is set to a nonexistent dir" do - begin - ENV["TAILWINDCSS_INSTALL_DIR"] = "/does/not/exist" - assert_raises(Tailwindcss::Commands::DirectoryNotFoundException) do - Tailwindcss::Commands.executable + Tailwindcss::Commands.stub(:rails_css_compressor?, false) do + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + assert_includes(actual, "--minify") end - ensure - ENV["TAILWINDCSS_INSTALL_DIR"] = nil end end - test ".compile_command" do - mock_exe_directory("sparc-solaris2.8") do |dir, executable| - Rails.stub(:root, File) do # Rails.root won't work in this test suite - actual = Tailwindcss::Commands.compile_command(exe_path: dir) + test ".compile_command when postcss.config.js exists" do + Dir.mktmpdir do |tmpdir| + Rails.stub(:root, Pathname.new(tmpdir)) do # Rails.root won't work in this test suite + actual = Tailwindcss::Commands.compile_command assert_kind_of(Array, actual) assert_equal(executable, actual.first) - assert_includes(actual, "--minify") + refute_includes(actual, "--postcss") - actual = Tailwindcss::Commands.compile_command(exe_path: dir, debug: true) + config_file = Rails.root.join("config/postcss.config.js") + FileUtils.mkdir_p(Rails.root.join("config")) + FileUtils.touch(config_file) + actual = Tailwindcss::Commands.compile_command assert_kind_of(Array, actual) assert_equal(executable, actual.first) - refute_includes(actual, "--minify") - end - end - end - - test ".compile_command when Rails compression is on" do - mock_exe_directory("sparc-solaris2.8") do |dir, executable| - Rails.stub(:root, File) do # Rails.root won't work in this test suite - Tailwindcss::Commands.stub(:rails_css_compressor?, true) do - actual = Tailwindcss::Commands.compile_command(exe_path: dir) - assert_kind_of(Array, actual) - refute_includes(actual, "--minify") - end - - Tailwindcss::Commands.stub(:rails_css_compressor?, false) do - actual = Tailwindcss::Commands.compile_command(exe_path: dir) - assert_kind_of(Array, actual) - assert_includes(actual, "--minify") - end - end - end - end - - test ".compile_command when postcss.config.js exists" do - mock_exe_directory("sparc-solaris2.8") do |dir, executable| - Dir.mktmpdir do |tmpdir| - Rails.stub(:root, Pathname.new(tmpdir)) do # Rails.root won't work in this test suite - actual = Tailwindcss::Commands.compile_command(exe_path: dir) - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - refute_includes(actual, "--postcss") - - config_file = Rails.root.join("config/postcss.config.js") - FileUtils.mkdir_p(Rails.root.join("config")) - FileUtils.touch(config_file) - actual = Tailwindcss::Commands.compile_command(exe_path: dir) - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - assert_includes(actual, "--postcss") - postcss_index = actual.index("--postcss") - assert_equal(actual[postcss_index + 1], config_file.to_s) - end + assert_includes(actual, "--postcss") + postcss_index = actual.index("--postcss") + assert_equal(actual[postcss_index + 1], config_file.to_s) end end end test ".watch_command" do - mock_exe_directory("sparc-solaris2.8") do |dir, executable| - Rails.stub(:root, File) do # Rails.root won't work in this test suite - actual = Tailwindcss::Commands.watch_command(exe_path: dir) - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - assert_includes(actual, "-w") - refute_includes(actual, "-p") - assert_includes(actual, "--minify") - - actual = Tailwindcss::Commands.watch_command(exe_path: dir, debug: true) - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - assert_includes(actual, "-w") - refute_includes(actual, "-p") - refute_includes(actual, "--minify") - - actual = Tailwindcss::Commands.watch_command(exe_path: dir, poll: true) - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - assert_includes(actual, "-w") - refute_includes(actual, "always") - assert_includes(actual, "-p") - assert_includes(actual, "--minify") - - actual = Tailwindcss::Commands.watch_command(exe_path: dir, always: true) - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - assert_includes(actual, "-w") - assert_includes(actual, "always") - end + Rails.stub(:root, File) do # Rails.root won't work in this test suite + actual = Tailwindcss::Commands.watch_command + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + refute_includes(actual, "-p") + assert_includes(actual, "--minify") + + actual = Tailwindcss::Commands.watch_command(debug: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + refute_includes(actual, "-p") + refute_includes(actual, "--minify") + + actual = Tailwindcss::Commands.watch_command(poll: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + refute_includes(actual, "always") + assert_includes(actual, "-p") + assert_includes(actual, "--minify") + + actual = Tailwindcss::Commands.watch_command(always: true) + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-w") + assert_includes(actual, "always") end end end From 297b570ebaf641dd9aa9deaf9d09679ea2b2b032 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 25 Sep 2024 17:45:07 -0400 Subject: [PATCH 150/274] ci: drop rubies that are out of upstream support --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db04fb3f..78413ae9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,14 +20,13 @@ jobs: strategy: fail-fast: false matrix: - ruby: ["2.7", "3.0", "3.1", "3.2", "3.3", "head"] + ruby: ["3.1", "3.2", "3.3", "head"] steps: - uses: actions/checkout@v4 - run: rm Gemfile.lock - uses: ruby/setup-ruby@v1 with: ruby-version: ${{matrix.ruby}} - rubygems: "3.4.22" # last version to support Ruby 2.7 bundler: latest bundler-cache: true - name: Run tests From 7ce669b65800e289d0939bb422cc77b7d19be381 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 25 Sep 2024 18:10:38 -0400 Subject: [PATCH 151/274] ci: drop the native gem building pipeline --- .github/workflows/gem-install.yml | 153 ------------------------------ 1 file changed, 153 deletions(-) delete mode 100644 .github/workflows/gem-install.yml diff --git a/.github/workflows/gem-install.yml b/.github/workflows/gem-install.yml deleted file mode 100644 index eb1300d6..00000000 --- a/.github/workflows/gem-install.yml +++ /dev/null @@ -1,153 +0,0 @@ -name: Native Gems -concurrency: - group: "${{github.workflow}}-${{github.ref}}" - cancel-in-progress: true -on: - workflow_dispatch: - push: - branches: - - main - tags: - - v*.*.* - pull_request: - types: [opened, synchronize] - branches: - - '*' - -jobs: - package: - strategy: - fail-fast: false - matrix: - platform: ["ruby", "x64-mingw32", "x64-mingw-ucrt", "x86_64-darwin", "arm64-darwin", "x86_64-linux", "arm-linux"] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - run: rm Gemfile.lock - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - bundler: latest - bundler-cache: true - - run: "bundle exec rake gem:${{matrix.platform}}" - - uses: actions/upload-artifact@v4 - with: - name: gem-${{matrix.platform}} - path: pkg - retention-days: 1 - - vanilla-install: - needs: ["package"] - runs-on: ubuntu-latest - steps: - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - - uses: actions/download-artifact@v4 - with: - name: gem-ruby - path: pkg - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss 2>&1 | fgrep 'ERROR: Cannot find the tailwindcss executable'" - - linux-install: - needs: ["package"] - runs-on: ubuntu-latest - steps: - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - - uses: actions/download-artifact@v4 - with: - name: gem-x86_64-linux - path: pkg - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss --help" - - linux-musl-install: - needs: ["package"] - runs-on: ubuntu-latest - container: - image: ruby:3.2-alpine - steps: - - uses: actions/download-artifact@v4 - with: - name: gem-x86_64-linux - path: pkg - - run: "apk add build-base" # to compile racc, etc. - - run: "gem update --system" # let's make sure the latest is working for us (upstream test, see #200) - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss --help" - - linux-arm-install: - needs: ["package"] - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v4 - with: - name: gem-arm-linux - path: pkg - - run: | - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm -v "$(pwd):/test" -w /test --platform=linux/arm/v7 ruby:3.2 \ - /bin/bash -c " - set -ex - gem install pkg/tailwindcss-rails-*.gem - tailwindcss --help - " - - darwin-x86_64-install: - needs: ["package"] - runs-on: macos-13 - steps: - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - - uses: actions/download-artifact@v4 - with: - name: gem-x86_64-darwin - path: pkg - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss --help" - - darwin-arm64-install: - needs: ["package"] - runs-on: macos-14 - steps: - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - - uses: actions/download-artifact@v4 - with: - name: gem-arm64-darwin - path: pkg - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss --help" - - windows-install: - needs: ["package"] - runs-on: windows-latest - steps: - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.0" - - uses: actions/download-artifact@v4 - with: - name: gem-x64-mingw32 - path: pkg - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss --help" - - windows-ucrt-install: - needs: ["package"] - runs-on: windows-2022 - steps: - - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - - uses: actions/download-artifact@v4 - with: - name: gem-x64-mingw-ucrt - path: pkg - - run: "gem install pkg/tailwindcss-rails-*.gem" - - run: "tailwindcss --help" From d46ca0c01caeae8eae1a2e0dadb3f4f78f5735f0 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 26 Sep 2024 21:56:23 -0400 Subject: [PATCH 152/274] doc: add a README section on choosing a specific version of tailwindcss --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dc689b60..2887ab3f 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ - [Installation](#installation) + * [Choosing a specific version of `tailwindcss`](#choosing-a-specific-version-of-tailwindcss) * [Using a local installation of `tailwindcss`](#using-a-local-installation-of-tailwindcss) - [Developing with Tailwindcss](#developing-with-tailwindcss) * [Configuration and commands](#configuration-and-commands) @@ -17,7 +18,7 @@ * [Using with PostCSS](#using-with-postcss) * [Custom inputs or outputs](#custom-inputs-or-outputs) - [Troubleshooting](#troubleshooting) - * [Lost keystrokes or hanging when using `ruby/debug` with the Puma plugin](#lost-keystrokes-or-hanging-when-using-rubydebug-with-the-puma-plugin) + * [Lost keystrokes or hanging when using terminal-based debugging tools (e.g. IRB, Pry, `ruby/debug`...etc.) with the Puma plugin](#lost-keystrokes-or-hanging-when-using-terminal-based-debugging-tools-eg-irb-pry-rubydebugetc-with-the-puma-plugin) * [Running in a docker container exits prematurely](#running-in-a-docker-container-exits-prematurely) * [Conflict with sassc-rails](#conflict-with-sassc-rails) * [Class names must be spelled out](#class-names-must-be-spelled-out) @@ -35,7 +36,23 @@ With Rails 7 you can generate a new application preconfigured with Tailwind by u 1. Run `./bin/bundle add tailwindcss-rails` 2. Run `./bin/rails tailwindcss:install` -This gem depends on the `tailwindcss-ruby` gem to install a working tailwind executable. You can also use a local (npm-based) installation if you prefer, please go to https://github.com/flavorjones/tailwindcss-ruby for more information. +This gem depends on the `tailwindcss-ruby` gem to install a working tailwind executable. + + +### Choosing a specific version of `tailwindcss` + +The `tailwindcss-ruby` gem is declared as a floating dependency of this gem, so by default you will get the most recent stable version. However, you can select a specific version of tailwind by pinning that gem to the analogous version in your application's `Gemfile`. For example, + +``` ruby +gem "tailwindcss-rails" + +# pin to tailwindcss version 3.4.13 +gem "tailwindcss-ruby", "3.4.13" +``` + +### Using a local installation of `tailwindcss` + +You can also use a local (npm-based) installation if you prefer, please go to https://github.com/flavorjones/tailwindcss-ruby for more information. ## Developing with Tailwindcss From 5562096af1e440334614d230724fec1a49adef11 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 26 Sep 2024 21:47:45 -0400 Subject: [PATCH 153/274] dev: re-bundle --- Gemfile.lock | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7e6f5372..d486fe4c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -60,13 +60,13 @@ GEM erubi (1.13.0) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.7.2) - irb (1.14.0) + irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.0) + logger (1.6.1) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -76,9 +76,8 @@ GEM net-pop net-smtp mini_mime (1.1.5) - mini_portile2 (2.8.7) minitest (5.25.1) - net-imap (0.4.14) + net-imap (0.4.16) date net-protocol net-pop (0.1.2) @@ -87,11 +86,14 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.7) - mini_portile2 (~> 2.8.2) + nokogiri (1.16.7-aarch64-linux) + racc (~> 1.4) + nokogiri (1.16.7-arm-linux) racc (~> 1.4) nokogiri (1.16.7-arm64-darwin) racc (~> 1.4) + nokogiri (1.16.7-x86-linux) + racc (~> 1.4) nokogiri (1.16.7-x86_64-darwin) racc (~> 1.4) nokogiri (1.16.7-x86_64-linux) @@ -125,22 +127,29 @@ GEM rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) - reline (0.5.9) + reline (0.5.10) io-console (~> 0.5) securerandom (0.3.1) stringio (3.1.1) - tailwindcss-ruby (0.1.0-x86_64-linux) - thor (1.3.1) + tailwindcss-ruby (3.4.13) + tailwindcss-ruby (3.4.13-aarch64-linux) + tailwindcss-ruby (3.4.13-arm-linux) + tailwindcss-ruby (3.4.13-arm64-darwin) + tailwindcss-ruby (3.4.13-x86_64-darwin) + tailwindcss-ruby (3.4.13-x86_64-linux) + thor (1.3.2) timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) useragent (0.16.10) webrick (1.8.2) - zeitwerk (2.6.17) + zeitwerk (2.6.18) PLATFORMS + aarch64-linux + arm-linux arm64-darwin - ruby + x86-linux x86_64-darwin x86_64-linux @@ -150,4 +159,4 @@ DEPENDENCIES tailwindcss-rails! BUNDLED WITH - 2.5.4 + 2.5.20 From 11d77640b01da4d3caabe86d6f8c8614068cfdf3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 2 Oct 2024 10:29:58 -0400 Subject: [PATCH 154/274] version bump to v3.0.0.rc1 --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 3 ++- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19fcccb4..fc74d110 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## next / unreleased +## v3.0.0rc1 ### Notable changes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index debab121..a4040dfa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,8 @@ gem "tailwindcss-rails", path: "/path/to/tailwindcss-rails" - [ ] update `lib/tailwindcss/version.rb` - [ ] update `CHANGELOG.md` - [ ] commit and create a git tag -- push +- package and push + - [ ] `bundle exec rake build` - [ ] `gem push pkg/*.gem` - [ ] `git push && git push --tags` - announce diff --git a/Gemfile.lock b/Gemfile.lock index d486fe4c..b07ebd0a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (2.7.7) + tailwindcss-rails (3.0.0.rc1) railties (>= 7.0.0) tailwindcss-ruby diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 6f849135..e2f6fd49 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "2.7.7" + VERSION = "3.0.0.rc1" end From 0427a3bfd3ff0a9f71ea7d2d8884b76407c2ab9c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 2 Oct 2024 10:40:03 -0400 Subject: [PATCH 155/274] Update changelog [skip ci] --- CHANGELOG.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc74d110..8b04a9e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,9 @@ ### Notable changes -* The upstream `tailwindcss` executable has been extracted from this gem into a new dependency, `tailwindcss-ruby`. +* The upstream `tailwindcss` executable has been extracted from this gem into a new dependency, `tailwindcss-ruby`. @flavorjones - In advance of the upcoming TailwindCSS v4 release, we are decoupling the `tailwindcss` executable - from the Rails integration. This will allow users to upgrade TailwindCSS at a time of their - choosing, and allow early adopters to start using the beta releases. + In advance of the upcoming TailwindCSS v4 release, we are decoupling the `tailwindcss` executable from the Rails integration. This will allow users to upgrade TailwindCSS at a time of their choosing, and allow early adopters to start using the beta releases. ## v2.7.7 / 2024-10-02 From db80e8828835279238aa3d3c942933a018295571 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 2 Oct 2024 10:40:37 -0400 Subject: [PATCH 156/274] Update changelog [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b04a9e8..efd53447 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## v3.0.0rc1 +## v3.0.0.rc1 ### Notable changes From dde766d894b49bceaeccb9494a1e82fd9bce0687 Mon Sep 17 00:00:00 2001 From: Ender Ahmet Yurt Date: Tue, 8 Oct 2024 16:29:16 +0300 Subject: [PATCH 157/274] Fix naming regarding Rails form naming --- lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 5ee5ecf0..4ce66d6f 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -28,7 +28,7 @@ <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :text_area -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -<% elsif attribute.field_type == :check_box -%> +<% elsif attribute.field_type == :checkbox -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block mt-2 h-5 w-5" %> <% else -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> From 24d272bf7398744a129b8f8da3f4a85e608deeea Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 8 Oct 2024 14:53:18 -0400 Subject: [PATCH 158/274] doc: update CHANGELOG for 2.7.8 [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index efd53447..fecfced1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ In advance of the upcoming TailwindCSS v4 release, we are decoupling the `tailwindcss` executable from the Rails integration. This will allow users to upgrade TailwindCSS at a time of their choosing, and allow early adopters to start using the beta releases. +## v2.7.8 / 2024-10-08 + +* Fix the scaffold form template to render checkboxes properly. (#416) @enderahmetyurt + + ## v2.7.7 / 2024-10-02 * Proactively support changes to Rails's authentication templates shipping in Rails 8.0.0.beta2 (which is not yet released). (#407, #408) @seanpdoyle @flavorjones From 68d819afc165f3b74226130cabec334a8ce8b9d3 Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:20:26 +0200 Subject: [PATCH 159/274] Handle both rails 7.2 and rails 8.0 field types They got renamed in: * https://github.com/rails/rails/pull/52432 * https://github.com/rails/rails/pull/52467 This ensures the correct classes are generated for both old and new versions --- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 4ce66d6f..487f2f5f 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -26,9 +26,9 @@ <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> -<% if attribute.field_type == :text_area -%> +<% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -<% elsif attribute.field_type == :checkbox -%> +<% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block mt-2 h-5 w-5" %> <% else -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> From cb31a22af9ce953edb1c26fc7ce99fbd30cd5a60 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 15 Oct 2024 16:51:59 -0400 Subject: [PATCH 160/274] doc: update CHANGELOG for 2.7.9 [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fecfced1..6d34be2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ In advance of the upcoming TailwindCSS v4 release, we are decoupling the `tailwindcss` executable from the Rails integration. This will allow users to upgrade TailwindCSS at a time of their choosing, and allow early adopters to start using the beta releases. +## v2.7.9 / 2024-10-10 + +* Fix the scaffold form template to render text forms and check boxes properly in all versions of Rails. (#418) @Earlopain + + ## v2.7.8 / 2024-10-08 * Fix the scaffold form template to render checkboxes properly. (#416) @enderahmetyurt From 61cadc1b9d8dc9a525ca46ad3722e041590cbb35 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 15 Oct 2024 16:57:34 -0400 Subject: [PATCH 161/274] version bump to v3.0.0 --- CHANGELOG.md | 2 +- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d34be2c..26d72880 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## v3.0.0.rc1 +## v3.0.0 ### Notable changes diff --git a/Gemfile.lock b/Gemfile.lock index b07ebd0a..96696921 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (3.0.0.rc1) + tailwindcss-rails (3.0.0) railties (>= 7.0.0) tailwindcss-ruby diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index e2f6fd49..2bc244fc 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "3.0.0.rc1" + VERSION = "3.0.0" end From a6baeb5fc62357a16db1d581c7f5a4c8171be7e5 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 17 Oct 2024 10:58:16 -0400 Subject: [PATCH 162/274] test: verify the contents of tailwind.css in integration test --- test/integration/user_journey_test.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 00818f2d..a585017b 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -55,3 +55,9 @@ fi # TEST: presence of the generated file bin/rails generate scaffold post title:string body:text published:boolean grep -q "Show this post" app/views/posts/index.html.erb + +# TEST: contents of the css file +bin/rails tailwindcss:build[verbose] +grep -q "py-2" app/assets/builds/tailwind.css + +echo "OK" From 3a3a0eb4127128de171618057ad3b187e711bf15 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 17 Oct 2024 10:58:47 -0400 Subject: [PATCH 163/274] test: matrix tailwind 3.4 and 4.0 in integration test --- .github/workflows/ci.yml | 3 +++ .github/workflows/upstream.yml | 2 ++ test/integration/user_journey_test.sh | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 78413ae9..190294f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,10 @@ jobs: fail-fast: false matrix: plat: ["ubuntu", "windows", "macos"] + tailwind: ["--version=~>3.4.14", "--version=~>4.0.0.alpha.27"] + env: runs-on: ${{matrix.plat}}-latest + TAILWINDCSSOPTS: ${{ matrix.tailwind }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 0ba5507a..17e02892 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -42,8 +42,10 @@ jobs: matrix: plat: ["ubuntu"] ref: ["7-2-stable", "v8.0.0.beta1", "main"] + tailwind: ["--version=~>3.4.14", "--version=~>4.0.0.alpha.27"] env: RAILSOPTS: --git=https://github.com/rails/rails --ref=${{ matrix.ref }} + TAILWINDCSSOPTS: ${{ matrix.tailwind }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index a585017b..178d5a57 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -26,7 +26,8 @@ bundle remove rails --skip-install bundle add rails --skip-install ${RAILSOPTS:-} # use the tailwindcss-rails under test -bundle add tailwindcss-rails --path="../.." +bundle add tailwindcss-rails --skip-install --path="../.." +bundle add tailwindcss-ruby --skip-install ${TAILWINDCSSOPTS:-} bundle install bundle show --paths bundle binstubs --all From 6e828ebf094e43ffa01add8f5233316a397e94d8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 17 Oct 2024 11:14:16 -0400 Subject: [PATCH 164/274] Add support for Tailwind CSS v4 which doesn't need a config file or an input file anymore. Closes #419 --- CHANGELOG.md | 5 +++++ lib/tailwindcss/commands.rb | 15 +++++++++++--- test/lib/tailwindcss/commands_test.rb | 28 ++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d72880..dc3b89b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## next / unreleased + +* Add experimental support for Tailwind CSS v4. (#420) @flavorjones + + ## v3.0.0 ### Notable changes diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 26c5178a..c065b91a 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -3,14 +3,23 @@ module Tailwindcss module Commands class << self + def tailwindcss_version + Tailwindcss::Ruby::VERSION + end + def compile_command(debug: false, **kwargs) command = [ Tailwindcss::Ruby.executable(**kwargs), - "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, - "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s, - "-c", Rails.root.join("config/tailwind.config.js").to_s, + "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s ] + unless tailwindcss_version >= "4.0" + command += [ + "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, + "-c", Rails.root.join("config/tailwind.config.js").to_s, + ] + end + command << "--minify" unless (debug || rails_css_compressor?) postcss_path = Rails.root.join("config/postcss.config.js") diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index a273e45e..ef0e80ba 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -9,7 +9,33 @@ def setup @executable = Tailwindcss::Ruby.executable end - test ".compile_command" do + test ".compile_command with tailwindcss v3" do + Rails.stub(:root, File) do # Rails.root won't work in this test suite + Tailwindcss::Commands.stub(:tailwindcss_version, "3.4.13") do + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-i") + assert_includes(actual, "-c") + assert_includes(actual, "-o") + end + end + end + + test ".compile_command with tailwindcss v4" do + Rails.stub(:root, File) do # Rails.root won't work in this test suite + Tailwindcss::Commands.stub(:tailwindcss_version, "4.0.0") do + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + refute_includes(actual, "-i") + refute_includes(actual, "-c") + assert_includes(actual, "-o") + end + end + end + + test ".compile_command debug flag" do Rails.stub(:root, File) do # Rails.root won't work in this test suite actual = Tailwindcss::Commands.compile_command assert_kind_of(Array, actual) From 0f282e2daf60e52e5523beada6ee2a546eb08103 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 17 Oct 2024 21:43:13 -0400 Subject: [PATCH 165/274] ci: fix pipeline --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 190294f1..56e245b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,8 +38,8 @@ jobs: matrix: plat: ["ubuntu", "windows", "macos"] tailwind: ["--version=~>3.4.14", "--version=~>4.0.0.alpha.27"] - env: runs-on: ${{matrix.plat}}-latest + env: TAILWINDCSSOPTS: ${{ matrix.tailwind }} steps: - uses: actions/checkout@v4 From 1acd6c56e12d5c1e51c54fe0ca8e3552eb87ecc9 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 17 Oct 2024 22:31:36 -0400 Subject: [PATCH 166/274] Unbreak support for v4 input file. Reverts part of 6e828ebf but adds to test coverage now that I understand the other changes v4 requires. --- CHANGELOG.md | 2 +- lib/tailwindcss/commands.rb | 15 +++----------- test/integration/user_journey_test.sh | 18 +++++++++++++++++ test/lib/tailwindcss/commands_test.rb | 29 +++++++-------------------- 4 files changed, 29 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc3b89b8..d33a4893 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## next / unreleased -* Add experimental support for Tailwind CSS v4. (#420) @flavorjones +* Add experimental support for Tailwind CSS v4. (#420, #423) @flavorjones ## v3.0.0 diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index c065b91a..26c5178a 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -3,23 +3,14 @@ module Tailwindcss module Commands class << self - def tailwindcss_version - Tailwindcss::Ruby::VERSION - end - def compile_command(debug: false, **kwargs) command = [ Tailwindcss::Ruby.executable(**kwargs), - "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s + "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, + "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s, + "-c", Rails.root.join("config/tailwind.config.js").to_s, ] - unless tailwindcss_version >= "4.0" - command += [ - "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, - "-c", Rails.root.join("config/tailwind.config.js").to_s, - ] - end - command << "--minify" unless (debug || rails_css_compressor?) postcss_path = Rails.root.join("config/postcss.config.js") diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 178d5a57..14f4597a 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -32,6 +32,12 @@ bundle install bundle show --paths bundle binstubs --all +if bundle show | fgrep tailwindcss-ruby | fgrep -q "(4." ; then + TAILWIND4=1 +else + TAILWIND4=0 +fi + # install tailwindcss bin/rails tailwindcss:install @@ -45,6 +51,13 @@ task :still_here do end EOF +if [[ $TAILWIND4 = 1 ]] ; then + cat > app/assets/stylesheets/application.tailwind.css < "Rails 8.0.0.beta" ]] ; then @@ -61,4 +74,9 @@ grep -q "Show this post" app/views/posts/index.html.erb bin/rails tailwindcss:build[verbose] grep -q "py-2" app/assets/builds/tailwind.css +if [[ $TAILWIND4 = 1 ]] ; then + # TEST: contents include application.tailwind.css + grep -q "#abc12399" app/assets/builds/tailwind.css +fi + echo "OK" diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index ef0e80ba..1ec6ce2b 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -9,29 +9,14 @@ def setup @executable = Tailwindcss::Ruby.executable end - test ".compile_command with tailwindcss v3" do + test ".compile_command" do Rails.stub(:root, File) do # Rails.root won't work in this test suite - Tailwindcss::Commands.stub(:tailwindcss_version, "3.4.13") do - actual = Tailwindcss::Commands.compile_command - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - assert_includes(actual, "-i") - assert_includes(actual, "-c") - assert_includes(actual, "-o") - end - end - end - - test ".compile_command with tailwindcss v4" do - Rails.stub(:root, File) do # Rails.root won't work in this test suite - Tailwindcss::Commands.stub(:tailwindcss_version, "4.0.0") do - actual = Tailwindcss::Commands.compile_command - assert_kind_of(Array, actual) - assert_equal(executable, actual.first) - refute_includes(actual, "-i") - refute_includes(actual, "-c") - assert_includes(actual, "-o") - end + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + assert_equal(executable, actual.first) + assert_includes(actual, "-i") + assert_includes(actual, "-c") + assert_includes(actual, "-o") end end From 04bf4ba4cd929569dfa23efc39c18190a5714b86 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 18 Oct 2024 09:07:49 -0400 Subject: [PATCH 167/274] doc: update CHANGELOG to remove note about reverted change [skip ci] --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d33a4893..55d2ec04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,5 @@ ## next / unreleased -* Add experimental support for Tailwind CSS v4. (#420, #423) @flavorjones - - ## v3.0.0 ### Notable changes From c6668290f333dad080ac54f3d4572d9940af7f7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:59:33 +0000 Subject: [PATCH 168/274] build(deps): bump railties from 7.2.1 to 7.2.1.1 Bumps [railties](https://github.com/rails/rails) from 7.2.1 to 7.2.1.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1.1/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.1...v7.2.1.1) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 96696921..3c698704 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.1) - actionpack (= 7.2.1) - actionview (= 7.2.1) - activejob (= 7.2.1) - activesupport (= 7.2.1) + actionmailer (7.2.1.1) + actionpack (= 7.2.1.1) + actionview (= 7.2.1.1) + activejob (= 7.2.1.1) + activesupport (= 7.2.1.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.1) - actionview (= 7.2.1) - activesupport (= 7.2.1) + actionpack (7.2.1.1) + actionview (= 7.2.1.1) + activesupport (= 7.2.1.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -26,16 +26,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.1) - activesupport (= 7.2.1) + actionview (7.2.1.1) + activesupport (= 7.2.1.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.1) - activesupport (= 7.2.1) + activejob (7.2.1.1) + activesupport (= 7.2.1.1) globalid (>= 0.3.6) - activesupport (7.2.1) + activesupport (7.2.1.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -101,7 +101,7 @@ GEM psych (5.1.2) stringio racc (1.8.1) - rack (3.1.7) + rack (3.1.8) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -116,9 +116,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.1) - actionpack (= 7.2.1) - activesupport (= 7.2.1) + railties (7.2.1.1) + actionpack (= 7.2.1.1) + activesupport (= 7.2.1.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -143,7 +143,7 @@ GEM concurrent-ruby (~> 1.0) useragent (0.16.10) webrick (1.8.2) - zeitwerk (2.6.18) + zeitwerk (2.7.1) PLATFORMS aarch64-linux From 24512d49751209cd73377485c49ae8cee526c4ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:59:45 +0000 Subject: [PATCH 169/274] build(deps-dev): bump actionmailer from 7.2.1 to 7.2.1.1 Bumps [actionmailer](https://github.com/rails/rails) from 7.2.1 to 7.2.1.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1.1/actionmailer/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.1...v7.2.1.1) --- updated-dependencies: - dependency-name: actionmailer dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 96696921..b81e81df 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.1) - actionpack (= 7.2.1) - actionview (= 7.2.1) - activejob (= 7.2.1) - activesupport (= 7.2.1) + actionmailer (7.2.1.1) + actionpack (= 7.2.1.1) + actionview (= 7.2.1.1) + activejob (= 7.2.1.1) + activesupport (= 7.2.1.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.1) - actionview (= 7.2.1) - activesupport (= 7.2.1) + actionpack (7.2.1.1) + actionview (= 7.2.1.1) + activesupport (= 7.2.1.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -26,16 +26,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.1) - activesupport (= 7.2.1) + actionview (7.2.1.1) + activesupport (= 7.2.1.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.1) - activesupport (= 7.2.1) + activejob (7.2.1.1) + activesupport (= 7.2.1.1) globalid (>= 0.3.6) - activesupport (7.2.1) + activesupport (7.2.1.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -77,7 +77,7 @@ GEM net-smtp mini_mime (1.1.5) minitest (5.25.1) - net-imap (0.4.16) + net-imap (0.5.0) date net-protocol net-pop (0.1.2) @@ -101,7 +101,7 @@ GEM psych (5.1.2) stringio racc (1.8.1) - rack (3.1.7) + rack (3.1.8) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -116,9 +116,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.1) - actionpack (= 7.2.1) - activesupport (= 7.2.1) + railties (7.2.1.1) + actionpack (= 7.2.1.1) + activesupport (= 7.2.1.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 2a80e88f3a05f155538d2e52b5dcf99b4869cd7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:59:53 +0000 Subject: [PATCH 170/274] build(deps): bump tailwindcss-ruby from 3.4.13 to 3.4.14 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 3.4.13 to 3.4.14. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v3.4.13...v3.4.14) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 96696921..045ab323 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,12 +131,12 @@ GEM io-console (~> 0.5) securerandom (0.3.1) stringio (3.1.1) - tailwindcss-ruby (3.4.13) - tailwindcss-ruby (3.4.13-aarch64-linux) - tailwindcss-ruby (3.4.13-arm-linux) - tailwindcss-ruby (3.4.13-arm64-darwin) - tailwindcss-ruby (3.4.13-x86_64-darwin) - tailwindcss-ruby (3.4.13-x86_64-linux) + tailwindcss-ruby (3.4.14) + tailwindcss-ruby (3.4.14-aarch64-linux) + tailwindcss-ruby (3.4.14-arm-linux) + tailwindcss-ruby (3.4.14-arm64-darwin) + tailwindcss-ruby (3.4.14-x86_64-darwin) + tailwindcss-ruby (3.4.14-x86_64-linux) thor (1.3.2) timeout (0.4.1) tzinfo (2.0.6) From 5fd6372e07feacba44e3cbfab089e8d7848c8c80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:00:10 +0000 Subject: [PATCH 171/274] build(deps-dev): bump actionmailer from 7.2.1.1 to 7.2.1.2 Bumps [actionmailer](https://github.com/rails/rails) from 7.2.1.1 to 7.2.1.2. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1.2/actionmailer/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.1.1...v7.2.1.2) --- updated-dependencies: - dependency-name: actionmailer dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 10ffe3ab..0ff856a2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.1.1) - actionpack (= 7.2.1.1) - actionview (= 7.2.1.1) - activejob (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionmailer (7.2.1.2) + actionpack (= 7.2.1.2) + actionview (= 7.2.1.2) + activejob (= 7.2.1.2) + activesupport (= 7.2.1.2) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.1.1) - actionview (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionpack (7.2.1.2) + actionview (= 7.2.1.2) + activesupport (= 7.2.1.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -26,16 +26,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.1.1) - activesupport (= 7.2.1.1) + actionview (7.2.1.2) + activesupport (= 7.2.1.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.1.1) - activesupport (= 7.2.1.1) + activejob (7.2.1.2) + activesupport (= 7.2.1.2) globalid (>= 0.3.6) - activesupport (7.2.1.1) + activesupport (7.2.1.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -67,7 +67,7 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) logger (1.6.1) - loofah (2.22.0) + loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -116,9 +116,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.1.1) - actionpack (= 7.2.1.1) - activesupport (= 7.2.1.1) + railties (7.2.1.2) + actionpack (= 7.2.1.2) + activesupport (= 7.2.1.2) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From bcf44064667f7445360617b346bd7d7ebb0e99bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:00:24 +0000 Subject: [PATCH 172/274] build(deps): bump railties from 7.2.1.1 to 7.2.1.2 Bumps [railties](https://github.com/rails/rails) from 7.2.1.1 to 7.2.1.2. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1.2/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.1.1...v7.2.1.2) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 10ffe3ab..0ff856a2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.1.1) - actionpack (= 7.2.1.1) - actionview (= 7.2.1.1) - activejob (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionmailer (7.2.1.2) + actionpack (= 7.2.1.2) + actionview (= 7.2.1.2) + activejob (= 7.2.1.2) + activesupport (= 7.2.1.2) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.1.1) - actionview (= 7.2.1.1) - activesupport (= 7.2.1.1) + actionpack (7.2.1.2) + actionview (= 7.2.1.2) + activesupport (= 7.2.1.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -26,16 +26,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.1.1) - activesupport (= 7.2.1.1) + actionview (7.2.1.2) + activesupport (= 7.2.1.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.1.1) - activesupport (= 7.2.1.1) + activejob (7.2.1.2) + activesupport (= 7.2.1.2) globalid (>= 0.3.6) - activesupport (7.2.1.1) + activesupport (7.2.1.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -67,7 +67,7 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) logger (1.6.1) - loofah (2.22.0) + loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -116,9 +116,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.1.1) - actionpack (= 7.2.1.1) - activesupport (= 7.2.1.1) + railties (7.2.1.2) + actionpack (= 7.2.1.2) + activesupport (= 7.2.1.2) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 6c6aaf0b2b1550f4b95de2a44ec50891bcbfeae6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 14:45:16 +0000 Subject: [PATCH 173/274] build(deps): bump railties from 7.2.1.2 to 7.2.2 Bumps [railties](https://github.com/rails/rails) from 7.2.1.2 to 7.2.2. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.2/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.1.2...v7.2.2) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0ff856a2..65dee87d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.1.2) - actionpack (= 7.2.1.2) - actionview (= 7.2.1.2) - activejob (= 7.2.1.2) - activesupport (= 7.2.1.2) + actionmailer (7.2.2) + actionpack (= 7.2.2) + actionview (= 7.2.2) + activejob (= 7.2.2) + activesupport (= 7.2.2) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.1.2) - actionview (= 7.2.1.2) - activesupport (= 7.2.1.2) + actionpack (7.2.2) + actionview (= 7.2.2) + activesupport (= 7.2.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -26,17 +26,18 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.1.2) - activesupport (= 7.2.1.2) + actionview (7.2.2) + activesupport (= 7.2.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.1.2) - activesupport (= 7.2.1.2) + activejob (7.2.2) + activesupport (= 7.2.2) globalid (>= 0.3.6) - activesupport (7.2.1.2) + activesupport (7.2.2) base64 + benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) @@ -47,6 +48,7 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) base64 (0.2.0) + benchmark (0.3.0) bigdecimal (3.1.8) builder (3.3.0) concurrent-ruby (1.3.4) @@ -106,9 +108,8 @@ GEM rack (>= 3.0.0) rack-test (2.1.0) rack (>= 1.3) - rackup (2.1.0) + rackup (2.2.0) rack (>= 3) - webrick (~> 1.8) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -116,9 +117,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.1.2) - actionpack (= 7.2.1.2) - activesupport (= 7.2.1.2) + railties (7.2.2) + actionpack (= 7.2.2) + activesupport (= 7.2.2) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -142,7 +143,6 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) useragent (0.16.10) - webrick (1.8.2) zeitwerk (2.7.1) PLATFORMS From a812bdee79c2c32f745643ca39a13df75b40dd43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:27:06 +0000 Subject: [PATCH 174/274] build(deps): bump railties from 7.2.2 to 8.0.0 Bumps [railties](https://github.com/rails/rails) from 7.2.2 to 8.0.0. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v8.0.0/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v7.2.2...v8.0.0) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 65dee87d..7b8965d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,34 +8,33 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (7.2.2) - actionpack (= 7.2.2) - actionview (= 7.2.2) - activejob (= 7.2.2) - activesupport (= 7.2.2) + actionmailer (8.0.0) + actionpack (= 8.0.0) + actionview (= 8.0.0) + activejob (= 8.0.0) + activesupport (= 8.0.0) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.2) - actionview (= 7.2.2) - activesupport (= 7.2.2) + actionpack (8.0.0) + actionview (= 8.0.0) + activesupport (= 8.0.0) nokogiri (>= 1.8.5) - racc - rack (>= 2.2.4, < 3.2) + rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (7.2.2) - activesupport (= 7.2.2) + actionview (8.0.0) + activesupport (= 8.0.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.2) - activesupport (= 7.2.2) + activejob (8.0.0) + activesupport (= 8.0.0) globalid (>= 0.3.6) - activesupport (7.2.2) + activesupport (8.0.0) base64 benchmark (>= 0.3) bigdecimal @@ -47,8 +46,9 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) base64 (0.2.0) - benchmark (0.3.0) + benchmark (0.4.0) bigdecimal (3.1.8) builder (3.3.0) concurrent-ruby (1.3.4) @@ -100,7 +100,7 @@ GEM racc (~> 1.4) nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) - psych (5.1.2) + psych (5.2.0) stringio racc (1.8.1) rack (3.1.8) @@ -117,9 +117,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.2.2) - actionpack (= 7.2.2) - activesupport (= 7.2.2) + railties (8.0.0) + actionpack (= 8.0.0) + activesupport (= 8.0.0) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -128,10 +128,10 @@ GEM rake (13.2.1) rdoc (6.7.0) psych (>= 4.0.0) - reline (0.5.10) + reline (0.5.11) io-console (~> 0.5) - securerandom (0.3.1) - stringio (3.1.1) + securerandom (0.3.2) + stringio (3.1.2) tailwindcss-ruby (3.4.14) tailwindcss-ruby (3.4.14-aarch64-linux) tailwindcss-ruby (3.4.14-arm-linux) @@ -142,6 +142,7 @@ GEM timeout (0.4.1) tzinfo (2.0.6) concurrent-ruby (~> 1.0) + uri (1.0.1) useragent (0.16.10) zeitwerk (2.7.1) From bb3280a9204757600e29e1c9c722dd57b12b4393 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 1 Oct 2024 19:21:06 -0400 Subject: [PATCH 175/274] Revert "Make copies of the auth templates for Rails 8 beta1" This reverts commit 9dee33a64db4323414bab5910f379b38fb8b0d47. --- .../templates/views/passwords/edit.html.erb | 21 ------------- .../templates/views/passwords/new.html.erb | 17 ---------- .../templates/views/sessions/new.html.erb | 31 ------------------- 3 files changed, 69 deletions(-) delete mode 100644 lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb delete mode 100644 lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb delete mode 100644 lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb deleted file mode 100644 index 939b0b8d..00000000 --- a/lib/generators/tailwindcss/authentication/templates/views/passwords/edit.html.erb +++ /dev/null @@ -1,21 +0,0 @@ -
- <%% if alert = flash[:alert] %> -

<%%= alert %>

- <%% end %> - -

Update your password

- - <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %> -
- <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -
- -
- <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -
- -
- <%%= form.submit "Save", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> -
- <%% end %> -
diff --git a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb deleted file mode 100644 index e5d88197..00000000 --- a/lib/generators/tailwindcss/authentication/templates/views/passwords/new.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -
- <%% if alert = flash[:alert] %> -

<%%= alert %>

- <%% end %> - -

Forgot your password?

- - <%%= form_with url: passwords_path, class: "contents" do |form| %> -
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -
- -
- <%%= form.submit "Email reset instructions", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> -
- <%% end %> -
diff --git a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb deleted file mode 100644 index a4751541..00000000 --- a/lib/generators/tailwindcss/authentication/templates/views/sessions/new.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -
- <%% if alert = flash[:alert] %> -

<%%= alert %>

- <%% end %> - - <%% if notice = flash[:notice] %> -

<%%= notice %>

- <%% end %> - -

Sign in

- - <%%= form_with url: session_url, class: "contents" do |form| %> -
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -
- -
- <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> -
- -
-
- <%%= form.submit "Sign in", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> -
- -
- <%%= link_to "Forgot password?", new_password_path, class: "text-gray-700 underline" %> -
-
- <%% end %> -
From cfa33d9124c8add17ea3ba8a8783be798ae68c43 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 15 Nov 2024 10:35:30 -0500 Subject: [PATCH 176/274] ci: bump upstream matrix to include 8-0-stable --- .github/workflows/upstream.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 17e02892..5c213e6e 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -41,7 +41,7 @@ jobs: fail-fast: false matrix: plat: ["ubuntu"] - ref: ["7-2-stable", "v8.0.0.beta1", "main"] + ref: ["7-2-stable", "8-0-stable", "main"] tailwind: ["--version=~>3.4.14", "--version=~>4.0.0.alpha.27"] env: RAILSOPTS: --git=https://github.com/rails/rails --ref=${{ matrix.ref }} From 304dd879d80d9d21c42b1a49cee02a4f567f43c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:04:14 +0000 Subject: [PATCH 177/274] build(deps): bump tailwindcss-ruby from 3.4.14 to 3.4.15 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 3.4.14 to 3.4.15. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v3.4.14...v3.4.15) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7b8965d9..29f197f9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -132,12 +132,12 @@ GEM io-console (~> 0.5) securerandom (0.3.2) stringio (3.1.2) - tailwindcss-ruby (3.4.14) - tailwindcss-ruby (3.4.14-aarch64-linux) - tailwindcss-ruby (3.4.14-arm-linux) - tailwindcss-ruby (3.4.14-arm64-darwin) - tailwindcss-ruby (3.4.14-x86_64-darwin) - tailwindcss-ruby (3.4.14-x86_64-linux) + tailwindcss-ruby (3.4.15) + tailwindcss-ruby (3.4.15-aarch64-linux) + tailwindcss-ruby (3.4.15-arm-linux) + tailwindcss-ruby (3.4.15-arm64-darwin) + tailwindcss-ruby (3.4.15-x86_64-darwin) + tailwindcss-ruby (3.4.15-x86_64-linux) thor (1.3.2) timeout (0.4.1) tzinfo (2.0.6) From d4afb9d20bf19ec8386fbfe950643171e93e6002 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 3 Dec 2024 09:15:03 -0500 Subject: [PATCH 178/274] dev: bundle update --- Gemfile.lock | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 29f197f9..604d7041 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -54,7 +54,7 @@ GEM concurrent-ruby (1.3.4) connection_pool (2.4.1) crass (1.0.6) - date (3.3.4) + date (3.4.1) debug (1.9.2) irb (~> 1.10) reline (>= 0.3.8) @@ -64,11 +64,11 @@ GEM activesupport (>= 6.1) i18n (1.14.6) concurrent-ruby (~> 1.0) - io-console (0.7.2) + io-console (0.8.0) irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.1) + logger (1.6.2) loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -78,8 +78,8 @@ GEM net-pop net-smtp mini_mime (1.1.5) - minitest (5.25.1) - net-imap (0.5.0) + minitest (5.25.2) + net-imap (0.5.1) date net-protocol net-pop (0.1.2) @@ -88,19 +88,20 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.7-aarch64-linux) + nokogiri (1.16.8-aarch64-linux) racc (~> 1.4) - nokogiri (1.16.7-arm-linux) + nokogiri (1.16.8-arm-linux) racc (~> 1.4) - nokogiri (1.16.7-arm64-darwin) + nokogiri (1.16.8-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.7-x86-linux) + nokogiri (1.16.8-x86-linux) racc (~> 1.4) - nokogiri (1.16.7-x86_64-darwin) + nokogiri (1.16.8-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.7-x86_64-linux) + nokogiri (1.16.8-x86_64-linux) racc (~> 1.4) - psych (5.2.0) + psych (5.2.1) + date stringio racc (1.8.1) rack (3.1.8) @@ -108,15 +109,15 @@ GEM rack (>= 3.0.0) rack-test (2.1.0) rack (>= 1.3) - rackup (2.2.0) + rackup (2.2.1) rack (>= 3) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.0) + rails-html-sanitizer (1.6.1) loofah (~> 2.21) - nokogiri (~> 1.14) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) railties (8.0.0) actionpack (= 8.0.0) activesupport (= 8.0.0) @@ -126,11 +127,11 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.7.0) + rdoc (6.8.1) psych (>= 4.0.0) - reline (0.5.11) + reline (0.5.12) io-console (~> 0.5) - securerandom (0.3.2) + securerandom (0.4.0) stringio (3.1.2) tailwindcss-ruby (3.4.15) tailwindcss-ruby (3.4.15-aarch64-linux) @@ -139,10 +140,10 @@ GEM tailwindcss-ruby (3.4.15-x86_64-darwin) tailwindcss-ruby (3.4.15-x86_64-linux) thor (1.3.2) - timeout (0.4.1) + timeout (0.4.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - uri (1.0.1) + uri (1.0.2) useragent (0.16.10) zeitwerk (2.7.1) @@ -160,4 +161,4 @@ DEPENDENCIES tailwindcss-rails! BUNDLED WITH - 2.5.20 + 2.5.23 From e358ae13ecc2c1419bbe5e2096c5ee0109d5d9fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 14:41:45 +0000 Subject: [PATCH 179/274] build(deps): bump tailwindcss-ruby from 3.4.15 to 3.4.16 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 3.4.15 to 3.4.16. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v3.4.15...v3.4.16) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 604d7041..1675ef60 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -133,12 +133,12 @@ GEM io-console (~> 0.5) securerandom (0.4.0) stringio (3.1.2) - tailwindcss-ruby (3.4.15) - tailwindcss-ruby (3.4.15-aarch64-linux) - tailwindcss-ruby (3.4.15-arm-linux) - tailwindcss-ruby (3.4.15-arm64-darwin) - tailwindcss-ruby (3.4.15-x86_64-darwin) - tailwindcss-ruby (3.4.15-x86_64-linux) + tailwindcss-ruby (3.4.16) + tailwindcss-ruby (3.4.16-aarch64-linux) + tailwindcss-ruby (3.4.16-arm-linux) + tailwindcss-ruby (3.4.16-arm64-darwin) + tailwindcss-ruby (3.4.16-x86_64-darwin) + tailwindcss-ruby (3.4.16-x86_64-linux) thor (1.3.2) timeout (0.4.2) tzinfo (2.0.6) From 2936d40fc8c90c10b800155b0c355c9ea2c9cedc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 14:32:27 +0000 Subject: [PATCH 180/274] build(deps): bump railties from 8.0.0 to 8.0.1 Bumps [railties](https://github.com/rails/rails) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v8.0.1/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v8.0.0...v8.0.1) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 58 ++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1675ef60..980cc42a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (8.0.0) - actionpack (= 8.0.0) - actionview (= 8.0.0) - activejob (= 8.0.0) - activesupport (= 8.0.0) + actionmailer (8.0.1) + actionpack (= 8.0.1) + actionview (= 8.0.1) + activejob (= 8.0.1) + activesupport (= 8.0.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.0) - actionview (= 8.0.0) - activesupport (= 8.0.0) + actionpack (8.0.1) + actionview (= 8.0.1) + activesupport (= 8.0.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -25,16 +25,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (8.0.0) - activesupport (= 8.0.0) + actionview (8.0.1) + activesupport (= 8.0.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.0) - activesupport (= 8.0.0) + activejob (8.0.1) + activesupport (= 8.0.1) globalid (>= 0.3.6) - activesupport (8.0.0) + activesupport (8.0.1) base64 benchmark (>= 0.3) bigdecimal @@ -65,10 +65,10 @@ GEM i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.8.0) - irb (1.14.1) + irb (1.14.2) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.2) + logger (1.6.3) loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -78,7 +78,7 @@ GEM net-pop net-smtp mini_mime (1.1.5) - minitest (5.25.2) + minitest (5.25.4) net-imap (0.5.1) date net-protocol @@ -88,17 +88,17 @@ GEM timeout net-smtp (0.5.0) net-protocol - nokogiri (1.16.8-aarch64-linux) + nokogiri (1.17.2-aarch64-linux) racc (~> 1.4) - nokogiri (1.16.8-arm-linux) + nokogiri (1.17.2-arm-linux) racc (~> 1.4) - nokogiri (1.16.8-arm64-darwin) + nokogiri (1.17.2-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.8-x86-linux) + nokogiri (1.17.2-x86-linux) racc (~> 1.4) - nokogiri (1.16.8-x86_64-darwin) + nokogiri (1.17.2-x86_64-darwin) racc (~> 1.4) - nokogiri (1.16.8-x86_64-linux) + nokogiri (1.17.2-x86_64-linux) racc (~> 1.4) psych (5.2.1) date @@ -115,23 +115,23 @@ GEM activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.1) + rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.0) - actionpack (= 8.0.0) - activesupport (= 8.0.0) + railties (8.0.1) + actionpack (= 8.0.1) + activesupport (= 8.0.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.8.1) + rdoc (6.9.1) psych (>= 4.0.0) reline (0.5.12) io-console (~> 0.5) - securerandom (0.4.0) + securerandom (0.4.1) stringio (3.1.2) tailwindcss-ruby (3.4.16) tailwindcss-ruby (3.4.16-aarch64-linux) @@ -144,7 +144,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) uri (1.0.2) - useragent (0.16.10) + useragent (0.16.11) zeitwerk (2.7.1) PLATFORMS From fcc31c15400e7a85fa436824aa88c97a1fe00ad1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 18 Dec 2024 19:10:28 -0500 Subject: [PATCH 181/274] Drop default plugins form, typography, and container-queries taking care to fix up the form styling. --- .../templates/app/views/passwords/edit.html.erb | 4 ++-- .../templates/app/views/passwords/new.html.erb | 2 +- .../templates/app/views/sessions/new.html.erb | 4 ++-- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 12 ++++++------ lib/install/tailwind.config.js | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb index 939b0b8d..4ea2c812 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb @@ -7,11 +7,11 @@ <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %>
- <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
- <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb index e5d88197..2e7b1e9d 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb @@ -7,7 +7,7 @@ <%%= form_with url: passwords_path, class: "contents" do |form| %>
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb index a4751541..5176bc89 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb @@ -11,11 +11,11 @@ <%%= form_with url: session_url, class: "contents" do |form| %>
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
- <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 487f2f5f..c76993bf 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -15,23 +15,23 @@
<% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
<%%= form.label :password_confirmation %> - <%%= form.password_field :password_confirmation, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password_confirmation, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> <% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block mt-2 h-5 w-5" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 mt-2 h-5 w-5" %> <% else -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> <% end -%> <% end -%>
diff --git a/lib/install/tailwind.config.js b/lib/install/tailwind.config.js index d6ad82c0..c3deef14 100644 --- a/lib/install/tailwind.config.js +++ b/lib/install/tailwind.config.js @@ -15,8 +15,8 @@ module.exports = { }, }, plugins: [ - require('@tailwindcss/forms'), - require('@tailwindcss/typography'), - require('@tailwindcss/container-queries'), + // require('@tailwindcss/forms'), + // require('@tailwindcss/typography'), + // require('@tailwindcss/container-queries'), ] } From a4015e8c9b504e2861b6d2fbad3512df80f910ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:27:07 +0000 Subject: [PATCH 182/274] build(deps): bump debug from 1.9.2 to 1.10.0 Bumps [debug](https://github.com/ruby/debug) from 1.9.2 to 1.10.0. - [Release notes](https://github.com/ruby/debug/releases) - [Commits](https://github.com/ruby/debug/compare/v1.9.2...v1.10.0) --- updated-dependencies: - dependency-name: debug dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 980cc42a..7cf2130c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -55,7 +55,7 @@ GEM connection_pool (2.4.1) crass (1.0.6) date (3.4.1) - debug (1.9.2) + debug (1.10.0) irb (~> 1.10) reline (>= 0.3.8) drb (2.2.1) @@ -65,7 +65,7 @@ GEM i18n (1.14.6) concurrent-ruby (~> 1.0) io-console (0.8.0) - irb (1.14.2) + irb (1.14.3) rdoc (>= 4.0.0) reline (>= 0.4.2) logger (1.6.3) @@ -100,7 +100,7 @@ GEM racc (~> 1.4) nokogiri (1.17.2-x86_64-linux) racc (~> 1.4) - psych (5.2.1) + psych (5.2.2) date stringio racc (1.8.1) @@ -127,9 +127,9 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.9.1) + rdoc (6.10.0) psych (>= 4.0.0) - reline (0.5.12) + reline (0.6.0) io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.2) From dfd566f81e5a3831b5cde59f3d355d06043aa825 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:27:14 +0000 Subject: [PATCH 183/274] build(deps): bump tailwindcss-ruby from 3.4.16 to 3.4.17 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 3.4.16 to 3.4.17. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v3.4.16...v3.4.17) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 980cc42a..de04cbaa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -133,12 +133,12 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.2) - tailwindcss-ruby (3.4.16) - tailwindcss-ruby (3.4.16-aarch64-linux) - tailwindcss-ruby (3.4.16-arm-linux) - tailwindcss-ruby (3.4.16-arm64-darwin) - tailwindcss-ruby (3.4.16-x86_64-darwin) - tailwindcss-ruby (3.4.16-x86_64-linux) + tailwindcss-ruby (3.4.17) + tailwindcss-ruby (3.4.17-aarch64-linux) + tailwindcss-ruby (3.4.17-arm-linux) + tailwindcss-ruby (3.4.17-arm64-darwin) + tailwindcss-ruby (3.4.17-x86_64-darwin) + tailwindcss-ruby (3.4.17-x86_64-linux) thor (1.3.2) timeout (0.4.2) tzinfo (2.0.6) From 21e8963397502be5b53d0528751e0020c7538cb1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 29 Dec 2024 14:01:12 -0500 Subject: [PATCH 184/274] version bump to v3.1.0 --- CHANGELOG.md | 9 ++++++++- lib/tailwindcss/version.rb | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55d2ec04..3e7a5a36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ ## next / unreleased -## v3.0.0 +## v3.1.0 / 2024-12-29 + +### Notable changes + +The tailwindcss plugins "form", "typography", and "container-queries" have been dropped from the default generated `tailwind.config.js` file. If you'd like to use them, you can re-add them to your project by uncommenting the appropriate lines in your config file. (#446) @flavorjones + + +## v3.0.0 / 2024-10-15 ### Notable changes diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 2bc244fc..e13fdb74 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "3.0.0" + VERSION = "3.1.0" end From af38df9105058f4ccc956beec94011cbf3090302 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Fri, 10 Jan 2025 11:34:02 -0300 Subject: [PATCH 185/274] Improve scaffold views --- Gemfile.lock | 2 +- .../app/views/passwords/edit.html.erb | 2 +- .../app/views/passwords/new.html.erb | 2 +- .../templates/app/views/sessions/new.html.erb | 4 +-- .../scaffold/templates/_form.html.erb.tt | 22 +++++++-------- .../scaffold/templates/edit.html.erb.tt | 8 ++++-- .../scaffold/templates/index.html.erb.tt | 22 +++++++++------ .../scaffold/templates/new.html.erb.tt | 6 ++-- .../scaffold/templates/partial.html.erb.tt | 1 - .../scaffold/templates/show.html.erb.tt | 28 ++++++++++--------- 10 files changed, 53 insertions(+), 44 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 32cb5b53..7e1c0c73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (3.0.0) + tailwindcss-rails (3.1.0) railties (>= 7.0.0) tailwindcss-ruby diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb index 4ea2c812..707bbe5c 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb @@ -15,7 +15,7 @@
- <%%= form.submit "Save", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit "Save", class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
<%% end %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb index 2e7b1e9d..72c434de 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb @@ -11,7 +11,7 @@
- <%%= form.submit "Email reset instructions", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit "Email reset instructions", class: "rounded-lg px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
<%% end %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb index 5176bc89..92d64b79 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb @@ -20,11 +20,11 @@
- <%%= form.submit "Sign in", class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit "Sign in", class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
- <%%= link_to "Forgot password?", new_password_path, class: "text-gray-700 underline" %> + <%%= link_to "Forgot password?", new_password_path, class: "text-gray-700 underline hover:no-underline" %>
<%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index c76993bf..93490a15 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -1,9 +1,9 @@ <%%= form_with(model: <%= model_resource_name %>, class: "contents") do |form| %> <%% if <%= singular_table_name %>.errors.any? %> -
+

<%%= pluralize(<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:

-
    +
      <%% <%= singular_table_name %>.errors.each do |error| %>
    • <%%= error.full_message %>
    • <%% end %> @@ -15,29 +15,29 @@
      <% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> -
      + <%%= form.password_field :password, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> +
-
+
<%%= form.label :password_confirmation %> - <%%= form.password_field :password_confirmation, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password_confirmation, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 mt-2 h-5 w-5" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow rounded-md border outline-none mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% else -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% end -%> <% end -%>
<% end -%>
- <%%= form.submit class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
<%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt index fab779d1..74edd3de 100644 --- a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt @@ -1,8 +1,10 @@ -
+<%% content_for :title, "Editing <%= human_name.downcase %>" %> + +

Editing <%= human_name.downcase %>

<%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index 65cf06b5..3d337f95 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -1,21 +1,25 @@ +<%% content_for :title, "<%= human_name.pluralize %>" %> +
<%% if notice.present? %> -

<%%= notice %>

+

<%%= notice %>

<%% end %> - <%% content_for :title, "<%= human_name.pluralize %>" %> -

<%= human_name.pluralize %>

- <%%= link_to "New <%= human_name.downcase %>", new_<%= singular_route_name %>_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %> + <%%= link_to "New <%= human_name.downcase %>", new_<%= singular_route_name %>_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
- <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %> - <%%= render <%= singular_table_name %> %> -

- <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> -

+ <%% if @<%= plural_table_name %>.any? %> + <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %> + <%%= render <%= singular_table_name %> %> +

+ <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +

+ <%% end %> + <%% else %> +

No <%= human_name.downcase.pluralize %> found.

<%% end %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt index 665532e5..0a10d967 100644 --- a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt @@ -1,7 +1,9 @@ -
+<%% content_for :title, "New <%= human_name.downcase %>" %> + +

New <%= human_name.downcase %>

<%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt index e1a45470..88dc3eda 100644 --- a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt @@ -12,6 +12,5 @@ <%%= <%= singular_name %>.<%= attribute.column_name %> %> <% end -%>

- <% end -%>
diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index 17d0febf..3a49e9a0 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -1,15 +1,17 @@ -
-
- <%% if notice.present? %> -

<%%= notice %>

- <%% end %> - - <%%= render @<%= singular_table_name %> %> - - <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> -
- <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %> -
+<%% content_for :title, "Showing <%= human_name.downcase %>" %> + +
+ <%% if notice.present? %> +

<%%= notice %>

+ <%% end %> + +

Showing <%= human_name.downcase %>

+ + <%%= render @<%= singular_table_name %> %> + + <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "mt-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
+ <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium" %>
From 82aae1ac72e63d8898bd40fc1413658a5c362561 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 10 Jan 2025 12:05:18 -0500 Subject: [PATCH 186/274] dev: bundle update --- Gemfile.lock | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7e1c0c73..abbf5f76 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -49,17 +49,17 @@ GEM uri (>= 0.13.1) base64 (0.2.0) benchmark (0.4.0) - bigdecimal (3.1.8) + bigdecimal (3.1.9) builder (3.3.0) concurrent-ruby (1.3.4) - connection_pool (2.4.1) + connection_pool (2.5.0) crass (1.0.6) date (3.4.1) debug (1.10.0) irb (~> 1.10) reline (>= 0.3.8) drb (2.2.1) - erubi (1.13.0) + erubi (1.13.1) globalid (1.2.1) activesupport (>= 6.1) i18n (1.14.6) @@ -68,8 +68,8 @@ GEM irb (1.14.3) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.3) - loofah (2.23.1) + logger (1.6.5) + loofah (2.24.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -78,8 +78,9 @@ GEM net-pop net-smtp mini_mime (1.1.5) + mini_portile2 (2.8.8) minitest (5.25.4) - net-imap (0.5.1) + net-imap (0.5.5) date net-protocol net-pop (0.1.2) @@ -87,27 +88,28 @@ GEM net-protocol (0.2.2) timeout net-smtp (0.5.0) - net-protocol - nokogiri (1.17.2-aarch64-linux) + nokogiri (1.18.1) + mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.17.2-arm-linux) + nokogiri (1.18.1-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.17.2-arm64-darwin) + nokogiri (1.18.1-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.17.2-x86-linux) + nokogiri (1.18.1-arm64-darwin) racc (~> 1.4) - nokogiri (1.17.2-x86_64-darwin) + nokogiri (1.18.1-x86_64-darwin) racc (~> 1.4) - nokogiri (1.17.2-x86_64-linux) + nokogiri (1.18.1-x86_64-linux-gnu) racc (~> 1.4) psych (5.2.2) date stringio racc (1.8.1) rack (3.1.8) - rack-session (2.0.0) + rack-session (2.1.0) + base64 (>= 0.1.0) rack (>= 3.0.0) - rack-test (2.1.0) + rack-test (2.2.0) rack (>= 1.3) rackup (2.2.1) rack (>= 3) @@ -140,7 +142,7 @@ GEM tailwindcss-ruby (3.4.17-x86_64-darwin) tailwindcss-ruby (3.4.17-x86_64-linux) thor (1.3.2) - timeout (0.4.2) + timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uri (1.0.2) From 4e6f3cb25108b8764709429d2d1e91c0c2cda3f1 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 10 Jan 2025 12:05:29 -0500 Subject: [PATCH 187/274] ci: test with ruby 3.4 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56e245b3..3889c27c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - ruby: ["3.1", "3.2", "3.3", "head"] + ruby: ["3.1", "3.2", "3.3", "3.4", "head"] steps: - uses: actions/checkout@v4 - run: rm Gemfile.lock @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: - ruby-version: "3.2" + ruby-version: "3.4" bundler: latest - run: test/integration/user_journey_test.sh shell: bash From 32d4da0920d1f279e1d834ee0524049641ba15ce Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 10 Jan 2025 12:18:49 -0500 Subject: [PATCH 188/274] doc: update README with caveats about postcss Co-authored-by: Andre Meij --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2887ab3f..60b2f27e 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ Running `bin/dev` invokes Foreman to start both the Tailwind watch process and t ### Using with PostCSS -If you want to use PostCSS as a preprocessor, create a custom `config/postcss.config.js` and it will be loaded automatically. +If you want to use PostCSS as a preprocessor, create a custom `config/postcss.config.js` and that file will be loaded by tailwind automatically. For example, to enable nesting: @@ -167,6 +167,25 @@ module.exports = { } ``` +⚠ Note that PostCSS is a javascript tool with its own prerequisites! By default `tailwindcss-rails` does not require any javascript tooling, so in order to use PostCSS, a `package.json` with dependencies for your plugins and a package manager like `yarn` or `npm` is required, for example: + +```json +// package.json +{ + "name": "my app", + "private": true, + "dependencies": { + "postcss-advanced-variables": "^4.0.0", + "postcss-import": "^16.0.1", + "postcss-mixins": "^9.0.4", + "tailwindcss": "^3.4.1" + } +} +``` + +Then you can use yarn or npm to install the dependencies. + + ### Custom inputs or outputs If you need to use a custom input or output file, you can run `bundle exec tailwindcss` to access the platform-specific executable, and give it your own build options. From b128001b4135f760e81b7cd6489583dc6d7908cf Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 10 Jan 2025 12:20:20 -0500 Subject: [PATCH 189/274] version bump to v3.2.0 --- CHANGELOG.md | 5 +++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e7a5a36..7f07f0c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ## next / unreleased +## v3.2.0 / 2025-01-10 + +* Improve the scaffold views by making positions, padding, and sizes more consistent, add titles to all pages, add hover states and semantic colors to buttons and links, and change border and focus colors on fields with errors. (#452) @patriciomacadden + + ## v3.1.0 / 2024-12-29 ### Notable changes diff --git a/Gemfile.lock b/Gemfile.lock index abbf5f76..8c603c6d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (3.1.0) + tailwindcss-rails (3.2.0) railties (>= 7.0.0) tailwindcss-ruby diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index e13fdb74..9e5b6e3d 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "3.1.0" + VERSION = "3.2.0" end From ca7812a355320e08c63c04c1a0a5cc97a0528783 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 19 Jan 2025 14:45:08 -0500 Subject: [PATCH 190/274] feat: support running the puma plugin in a bare puma process that is, not in `rails server`. Closes #458 --- CHANGELOG.md | 5 +++++ README.md | 2 +- lib/puma/plugin/tailwindcss.rb | 8 ++++++-- lib/tailwindcss/commands.rb | 10 ++++++---- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f07f0c4..00a78f83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ## next / unreleased +## v3.3.0 / unreleased + +* Add support for running the puma plugin outside of `rails server`. (#458) @flavorjones + + ## v3.2.0 / 2025-01-10 * Improve the scaffold views by making positions, padding, and sizes more consistent, add titles to all pages, add hover states and semantic colors to buttons and links, and change border and focus colors on fields with errors. (#452) @patriciomacadden diff --git a/README.md b/README.md index 60b2f27e..e81a5474 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ This gem ships with a Puma plugin. To use it, add this line to your `puma.rb` co plugin :tailwindcss if ENV.fetch("RAILS_ENV", "development") == "development" ``` -and then running `rails server` will run the Tailwind watch process in the background +and then running `rails server` (or just `puma`) will run the Tailwind watch process in the background. #### Run `rails tailwindcss:watch` diff --git a/lib/puma/plugin/tailwindcss.rb b/lib/puma/plugin/tailwindcss.rb index e614d62a..4624d7e8 100644 --- a/lib/puma/plugin/tailwindcss.rb +++ b/lib/puma/plugin/tailwindcss.rb @@ -1,4 +1,5 @@ require "puma/plugin" +require "tailwindcss/commands" Puma::Plugin.create do attr_reader :puma_pid, :tailwind_pid, :log_writer @@ -11,8 +12,11 @@ def start(launcher) # Using IO.popen(command, 'r+') will avoid watch_command read from $stdin. # If we use system(*command) instead, IRB and Debug can't read from $stdin # correctly bacause some keystrokes will be taken by watch_command. - IO.popen(Tailwindcss::Commands.watch_command, 'r+') do |io| - IO.copy_stream(io, $stdout) + begin + IO.popen(Tailwindcss::Commands.watch_command, 'r+') do |io| + IO.copy_stream(io, $stdout) + end + rescue Interrupt end end diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 26c5178a..40d983a6 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -4,16 +4,18 @@ module Tailwindcss module Commands class << self def compile_command(debug: false, **kwargs) + rails_root = defined?(Rails) ? Rails.root : Pathname.new(Dir.pwd) + command = [ Tailwindcss::Ruby.executable(**kwargs), - "-i", Rails.root.join("app/assets/stylesheets/application.tailwind.css").to_s, - "-o", Rails.root.join("app/assets/builds/tailwind.css").to_s, - "-c", Rails.root.join("config/tailwind.config.js").to_s, + "-i", rails_root.join("app/assets/stylesheets/application.tailwind.css").to_s, + "-o", rails_root.join("app/assets/builds/tailwind.css").to_s, + "-c", rails_root.join("config/tailwind.config.js").to_s, ] command << "--minify" unless (debug || rails_css_compressor?) - postcss_path = Rails.root.join("config/postcss.config.js") + postcss_path = rails_root.join("config/postcss.config.js") command += ["--postcss", postcss_path.to_s] if File.exist?(postcss_path) command From 968ba5c1d6aa6ac4f91dd7d6f350b0d95fcaf4db Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 19 Jan 2025 15:11:00 -0500 Subject: [PATCH 191/274] version bump to v3.3.0 --- CHANGELOG.md | 4 ++-- lib/tailwindcss/version.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a78f83..39f9bc25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ ## next / unreleased -## v3.3.0 / unreleased +## v3.3.0 / 2025-01-19 -* Add support for running the puma plugin outside of `rails server`. (#458) @flavorjones +* Add support for using the puma plugin in a standalone puma process (outside of `rails server`). (#458) @flavorjones ## v3.2.0 / 2025-01-10 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 9e5b6e3d..5c301936 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "3.2.0" + VERSION = "3.3.0" end From 4196564a4f77546a654828166195b6f7ed05991d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 19 Jan 2025 15:13:45 -0500 Subject: [PATCH 192/274] dep: update gemfile.lock --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8c603c6d..42142bf2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (3.2.0) + tailwindcss-rails (3.3.0) railties (>= 7.0.0) tailwindcss-ruby From 573855951ca13ebf5348372858ae0505b8a4f2cb Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Mon, 20 Jan 2025 12:14:05 -0300 Subject: [PATCH 193/274] improve partial: correct use of tags + attachment links styling --- .../tailwindcss/scaffold/templates/partial.html.erb.tt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt index 88dc3eda..ed89fc34 100644 --- a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt @@ -1,16 +1,16 @@ -
+
<% attributes.reject(&:password_digest?).each do |attribute| -%> -

+

<%= attribute.human_name %>: <% if attribute.attachment? -%> - <%%= link_to <%= singular_name %>.<%= attribute.column_name %>.filename, <%= singular_name %>.<%= attribute.column_name %> if <%= singular_name %>.<%= attribute.column_name %>.attached? %> + <%%= link_to <%= singular_name %>.<%= attribute.column_name %>.filename, <%= singular_name %>.<%= attribute.column_name %>, class: "text-gray-700 underline hover:no-underline" if <%= singular_name %>.<%= attribute.column_name %>.attached? %> <% elsif attribute.attachments? -%> <%% <%= singular_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %> -
<%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %>
+
<%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %>, class: "text-gray-700 underline hover:no-underline" %>
<%% end %> <% else -%> <%%= <%= singular_name %>.<%= attribute.column_name %> %> <% end -%> -

+
<% end -%>
From 731d5c42e018215d70461012b60bbcdf29f0fd2c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 21 Jan 2025 12:29:35 -0500 Subject: [PATCH 194/274] dev: bundle update --- Gemfile.lock | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 42142bf2..cd3b9354 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -51,7 +51,7 @@ GEM benchmark (0.4.0) bigdecimal (3.1.9) builder (3.3.0) - concurrent-ruby (1.3.4) + concurrent-ruby (1.3.5) connection_pool (2.5.0) crass (1.0.6) date (3.4.1) @@ -62,10 +62,11 @@ GEM erubi (1.13.1) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.6) + i18n (1.14.7) concurrent-ruby (~> 1.0) io-console (0.8.0) - irb (1.14.3) + irb (1.15.0) + pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) logger (1.6.5) @@ -88,20 +89,24 @@ GEM net-protocol (0.2.2) timeout net-smtp (0.5.0) - nokogiri (1.18.1) + net-protocol + nokogiri (1.18.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.1-aarch64-linux-gnu) + nokogiri (1.18.2-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.1-arm-linux-gnu) + nokogiri (1.18.2-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.1-arm64-darwin) + nokogiri (1.18.2-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.1-x86_64-darwin) + nokogiri (1.18.2-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.1-x86_64-linux-gnu) + nokogiri (1.18.2-x86_64-linux-gnu) racc (~> 1.4) - psych (5.2.2) + pp (0.6.2) + prettyprint + prettyprint (0.2.0) + psych (5.2.3) date stringio racc (1.8.1) @@ -129,7 +134,7 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.10.0) + rdoc (6.11.0) psych (>= 4.0.0) reline (0.6.0) io-console (~> 0.5) From 2895fc97a87ed7b45bb7bf61664ba8ab9cab167a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 09:19:08 -0500 Subject: [PATCH 195/274] dep: bump tailwindcss-ruby to ~> 4.0 --- .github/workflows/ci.yml | 3 --- .github/workflows/upstream.yml | 2 -- Gemfile.lock | 13 ++++++------- tailwindcss-rails.gemspec | 2 +- test/integration/user_journey_test.sh | 1 - 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3889c27c..07fb8285 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,10 +37,7 @@ jobs: fail-fast: false matrix: plat: ["ubuntu", "windows", "macos"] - tailwind: ["--version=~>3.4.14", "--version=~>4.0.0.alpha.27"] runs-on: ${{matrix.plat}}-latest - env: - TAILWINDCSSOPTS: ${{ matrix.tailwind }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 5c213e6e..e491a957 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -42,10 +42,8 @@ jobs: matrix: plat: ["ubuntu"] ref: ["7-2-stable", "8-0-stable", "main"] - tailwind: ["--version=~>3.4.14", "--version=~>4.0.0.alpha.27"] env: RAILSOPTS: --git=https://github.com/rails/rails --ref=${{ matrix.ref }} - TAILWINDCSSOPTS: ${{ matrix.tailwind }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/Gemfile.lock b/Gemfile.lock index cd3b9354..c671e3a8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,7 +3,7 @@ PATH specs: tailwindcss-rails (3.3.0) railties (>= 7.0.0) - tailwindcss-ruby + tailwindcss-ruby (~> 4.0) GEM remote: https://rubygems.org/ @@ -140,12 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.2) - tailwindcss-ruby (3.4.17) - tailwindcss-ruby (3.4.17-aarch64-linux) - tailwindcss-ruby (3.4.17-arm-linux) - tailwindcss-ruby (3.4.17-arm64-darwin) - tailwindcss-ruby (3.4.17-x86_64-darwin) - tailwindcss-ruby (3.4.17-x86_64-linux) + tailwindcss-ruby (4.0.0) + tailwindcss-ruby (4.0.0-aarch64-linux-gnu) + tailwindcss-ruby (4.0.0-arm64-darwin) + tailwindcss-ruby (4.0.0-x86_64-darwin) + tailwindcss-ruby (4.0.0-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) diff --git a/tailwindcss-rails.gemspec b/tailwindcss-rails.gemspec index 8d893029..0b31c4a8 100644 --- a/tailwindcss-rails.gemspec +++ b/tailwindcss-rails.gemspec @@ -19,5 +19,5 @@ Gem::Specification.new do |spec| spec.files = Dir["{app,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"] spec.add_dependency "railties", ">= 7.0.0" - spec.add_dependency "tailwindcss-ruby" + spec.add_dependency "tailwindcss-ruby", "~> 4.0" end diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index 14f4597a..b8f6d961 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -27,7 +27,6 @@ bundle add rails --skip-install ${RAILSOPTS:-} # use the tailwindcss-rails under test bundle add tailwindcss-rails --skip-install --path="../.." -bundle add tailwindcss-ruby --skip-install ${TAILWINDCSSOPTS:-} bundle install bundle show --paths bundle binstubs --all From 768594ad954c41d844c534d90507aca4b6a6dc00 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 10:04:59 -0500 Subject: [PATCH 196/274] Remove tailwind.config.js from the generator Tailwind v4 doesn't need a config file. --- README.md | 6 +----- lib/install/application.tailwind.css | 14 +------------- lib/install/tailwind.config.js | 22 ---------------------- lib/install/tailwindcss.rb | 5 ----- lib/tailwindcss/commands.rb | 1 - test/integration/user_journey_test.sh | 21 +++++---------------- test/lib/tailwindcss/commands_test.rb | 1 - 7 files changed, 7 insertions(+), 63 deletions(-) delete mode 100644 lib/install/tailwind.config.js diff --git a/README.md b/README.md index e81a5474..5b2d11c6 100644 --- a/README.md +++ b/README.md @@ -59,13 +59,9 @@ You can also use a local (npm-based) installation if you prefer, please go to ht ### Configuration and commands -#### Configuration file: `config/tailwind.config.js` - -You can customize the Tailwind build through the `config/tailwind.config.js` file, just like you would if Tailwind was running in a traditional node installation. All the first-party plugins are supported. - #### Input file: `app/assets/stylesheets/application.tailwind.css` -The installer will generate a Tailwind input file in `app/assets/stylesheets/application.tailwind.css`. This is where you import the plugins you want to use, and where you can setup your custom `@apply` rules. +The installer will generate a Tailwind input file in `app/assets/stylesheets/application.tailwind.css`. This is where you import the plugins you want to use and where you can setup your custom `@apply` rules. #### Output file: `app/assets/builds/tailwind.css` diff --git a/lib/install/application.tailwind.css b/lib/install/application.tailwind.css index 8666d2f3..f1d8c73c 100644 --- a/lib/install/application.tailwind.css +++ b/lib/install/application.tailwind.css @@ -1,13 +1 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -/* - -@layer components { - .btn-primary { - @apply py-2 px-4 bg-blue-200; - } -} - -*/ +@import "tailwindcss"; diff --git a/lib/install/tailwind.config.js b/lib/install/tailwind.config.js deleted file mode 100644 index c3deef14..00000000 --- a/lib/install/tailwind.config.js +++ /dev/null @@ -1,22 +0,0 @@ -const defaultTheme = require('tailwindcss/defaultTheme') - -module.exports = { - content: [ - './public/*.html', - './app/helpers/**/*.rb', - './app/javascript/**/*.js', - './app/views/**/*.{erb,haml,html,slim}' - ], - theme: { - extend: { - fontFamily: { - sans: ['Inter var', ...defaultTheme.fontFamily.sans], - }, - }, - }, - plugins: [ - // require('@tailwindcss/forms'), - // require('@tailwindcss/typography'), - // require('@tailwindcss/container-queries'), - ] -} diff --git a/lib/install/tailwindcss.rb b/lib/install/tailwindcss.rb index 2c2ba50c..b48cb398 100644 --- a/lib/install/tailwindcss.rb +++ b/lib/install/tailwindcss.rb @@ -28,11 +28,6 @@ append_to_file(".gitignore", %(\n/app/assets/builds/*\n!/app/assets/builds/.keep\n)) end -unless Rails.root.join("config/tailwind.config.js").exist? - say "Add default config/tailwindcss.config.js" - copy_file "#{__dir__}/tailwind.config.js", "config/tailwind.config.js" -end - unless Rails.root.join("app/assets/stylesheets/application.tailwind.css").exist? say "Add default app/assets/stylesheets/application.tailwind.css" copy_file "#{__dir__}/application.tailwind.css", "app/assets/stylesheets/application.tailwind.css" diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 40d983a6..ce08bb38 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -10,7 +10,6 @@ def compile_command(debug: false, **kwargs) Tailwindcss::Ruby.executable(**kwargs), "-i", rails_root.join("app/assets/stylesheets/application.tailwind.css").to_s, "-o", rails_root.join("app/assets/builds/tailwind.css").to_s, - "-c", rails_root.join("config/tailwind.config.js").to_s, ] command << "--minify" unless (debug || rails_css_compressor?) diff --git a/test/integration/user_journey_test.sh b/test/integration/user_journey_test.sh index b8f6d961..985b72c4 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_journey_test.sh @@ -9,7 +9,7 @@ set -eux rm -f Gemfile.lock bundle remove actionmailer bundle add rails --skip-install ${RAILSOPTS:-} -bundle install +bundle install --prefer-local # do our work a directory with spaces in the name (#176, #184) rm -rf "My Workspace" @@ -27,16 +27,10 @@ bundle add rails --skip-install ${RAILSOPTS:-} # use the tailwindcss-rails under test bundle add tailwindcss-rails --skip-install --path="../.." -bundle install +bundle install --prefer-local bundle show --paths bundle binstubs --all -if bundle show | fgrep tailwindcss-ruby | fgrep -q "(4." ; then - TAILWIND4=1 -else - TAILWIND4=0 -fi - # install tailwindcss bin/rails tailwindcss:install @@ -50,12 +44,9 @@ task :still_here do end EOF -if [[ $TAILWIND4 = 1 ]] ; then - cat > app/assets/stylesheets/application.tailwind.css <> app/assets/stylesheets/application.tailwind.css < Date: Thu, 23 Jan 2025 10:30:16 -0500 Subject: [PATCH 197/274] Remove remaining traces of the Inter font. Note: we will need to smooth this out in an upgrade step. --- README.md | 2 +- app/assets/stylesheets/inter-font.css | 194 -------------------------- lib/install/tailwindcss.rb | 4 +- lib/tailwindcss/engine.rb | 4 - 4 files changed, 3 insertions(+), 201 deletions(-) delete mode 100644 app/assets/stylesheets/inter-font.css diff --git a/README.md b/README.md index 5b2d11c6..c80bae4d 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ The installer will generate a Tailwind input file in `app/assets/stylesheets/app #### Output file: `app/assets/builds/tailwind.css` -When you run `rails tailwindcss:build`, the input file will be used to generate the output in `app/assets/builds/tailwind.css`. That's the output CSS that you'll include in your app (the installer automatically configures this, alongside the Inter font as well). +When you run `rails tailwindcss:build`, the input file will be used to generate the output in `app/assets/builds/tailwind.css`. That's the output CSS that you'll include in your app. #### Commands diff --git a/app/assets/stylesheets/inter-font.css b/app/assets/stylesheets/inter-font.css deleted file mode 100644 index ddeabaf5..00000000 --- a/app/assets/stylesheets/inter-font.css +++ /dev/null @@ -1,194 +0,0 @@ -/* - *= link_directory ../fonts - */ - -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.extra.var.woff2') format('woff2'); - unicode-range: U+E000,U+E002-E081,U+E093-E097,U+E0A5-E0E7,U+E0F3-E11D,U+E11E-E165,U+EE01,U+F6C3; - font-named-instance: 'Italic'; -} -/* alternates */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.alternates.var.woff2') format('woff2'); - unicode-range: U+E000,U+E002-E081,U+E093-E097,U+E0A5-E0E7,U+E0F3-E11D,U+E11E-E165,U+EE01,U+F6C3; - font-named-instance: 'Italic'; -} -/* symbols */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.symbols.var.woff2') format('woff2'); - unicode-range: U+20DD-20DF,U+2190-219A,U+21A9-21AB,U+21B0-21B2,U+21B3-21B6,U+21BA-21BC,U+21D0,U+21D2,U+21D4,U+21DE-21E0,U+21E4-21E6,U+21E7,U+21EA,U+2303,U+2305,U+2318,U+2325-2328,U+232B,U+2380,U+2387,U+238B,U+23CE-23D0,U+2460-2469,U+24B6-24D0,U+24EA,U+25A0-25A3,U+25B2-25B4,U+25B6-25B8,U+25BA-25BE,U+25C0-25C2,U+25C4-25C8,U+25CB,U+25CF,U+25EF,U+2600,U+2605-2607,U+263C,U+2661,U+2665,U+26A0,U+2713,U+2717,U+2756,U+2764,U+2780-2789,U+27F5-27FB,U+2B06,U+2B12-2B14,U+2B1C,U+E000,U+E12B-E164,U+1F130-1F14A,U+1F850,U+1F852; - font-named-instance: 'Italic'; -} - -/* extra */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.extra.var.woff2') format('woff2'); - unicode-range: U+E000,U+E002-E081,U+E093-E097,U+E0A5-E0E7,U+E0F3-E11D,U+E11E-E165,U+EE01,U+F6C3; - font-named-instance: 'Italic'; -} -/* alternates */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.alternates.var.woff2') format('woff2'); - unicode-range: U+E000,U+E002-E081,U+E093-E097,U+E0A5-E0E7,U+E0F3-E11D,U+E11E-E165,U+EE01,U+F6C3; - font-named-instance: 'Italic'; -} -/* symbols */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.symbols.var.woff2') format('woff2'); - unicode-range: U+20DD-20DF,U+2190-219A,U+21A9-21AB,U+21B0-21B2,U+21B3-21B6,U+21BA-21BC,U+21D0,U+21D2,U+21D4,U+21DE-21E0,U+21E4-21E6,U+21E7,U+21EA,U+2303,U+2305,U+2318,U+2325-2328,U+232B,U+2380,U+2387,U+238B,U+23CE-23D0,U+2460-2469,U+24B6-24D0,U+24EA,U+25A0-25A3,U+25B2-25B4,U+25B6-25B8,U+25BA-25BE,U+25C0-25C2,U+25C4-25C8,U+25CB,U+25CF,U+25EF,U+2600,U+2605-2607,U+263C,U+2661,U+2665,U+26A0,U+2713,U+2717,U+2756,U+2764,U+2780-2789,U+27F5-27FB,U+2B06,U+2B12-2B14,U+2B1C,U+E000,U+E12B-E164,U+1F130-1F14A,U+1F850,U+1F852; - font-named-instance: 'Italic'; -} -/* cyrillic */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.cyrillic.var.woff2') format('woff2'); - unicode-range: U+0400-049E,U+04A0-0500,U+052F,U+20B4,U+2116,U+2DFF,U+A69F; - font-named-instance: 'Italic'; -} -/* greek */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.greek.var.woff2') format('woff2'); - unicode-range: U+0370-0378,U+037A-0380,U+0384-038B,U+038C,U+038E-03A2,U+03A3-03E2,U+03F0-0400,U+1F00-1F16,U+1F18-1F1E,U+1F20-1F46,U+1F48-1F4E,U+1F50-1F58,U+1F59,U+1F5B,U+1F5D,U+1F5F-1F7E,U+1F80-1FB5,U+1FB6-1FC5,U+1FC6-1FD4,U+1FD6-1FDC,U+1FDD-1FF0,U+1FF2-1FF5,U+1FF6-1FFF; - font-named-instance: 'Italic'; -} -/* vietnamese */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.vietnamese.var.woff2') format('woff2'); - unicode-range: U+0102-0104,U+0110-0112,U+0128-012A,U+0168-016A,U+01A0-01A2,U+01AF-01B1,U+1EA0-1EFA,U+20AB; - font-named-instance: 'Italic'; -} -/* latin-ext */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.latin-ext.var.woff2') format('woff2'); - unicode-range: U+0100-0149,U+014A-01C4,U+01C5-0250,U+0259,U+1E00-1F00,U+2020,U+20A0-20AC,U+20AD-20C0,U+2113,U+2C7C,U+2C7F,U+A7FF; - font-named-instance: 'Italic'; -} -/* latin */ -@font-face { - font-family: 'Inter var'; - font-style: italic; - font-weight: 100 900; - font-display: swap; - src: url('Inter-italic.latin.var.woff2') format('woff2'); - unicode-range: U+0000-007F,U+00A0-0100,U+0131,U+0152-0154,U+02BB-02BD,U+02C6,U+02DA,U+02DC,U+2000-200C,U+2010-2028,U+202F-2060,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+FEFF; - font-named-instance: 'Italic'; -} -/* extra */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.extra.var.woff2') format('woff2'); - unicode-range: U+E000,U+E002-E081,U+E093-E097,U+E0A5-E0E7,U+E0F3-E11D,U+E11E-E165,U+EE01,U+F6C3; - font-named-instance: 'Regular'; -} -/* alternates */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.alternates.var.woff2') format('woff2'); - unicode-range: U+E000,U+E002-E081,U+E093-E097,U+E0A5-E0E7,U+E0F3-E11D,U+E11E-E165,U+EE01,U+F6C3; - font-named-instance: 'Regular'; -} -/* symbols */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.symbols.var.woff2') format('woff2'); - unicode-range: U+20DD-20DF,U+2190-219A,U+21A9-21AB,U+21B0-21B2,U+21B3-21B6,U+21BA-21BC,U+21D0,U+21D2,U+21D4,U+21DE-21E0,U+21E4-21E6,U+21E7,U+21EA,U+2303,U+2305,U+2318,U+2325-2328,U+232B,U+2380,U+2387,U+238B,U+23CE-23D0,U+2460-2469,U+24B6-24D0,U+24EA,U+25A0-25A3,U+25B2-25B4,U+25B6-25B8,U+25BA-25BE,U+25C0-25C2,U+25C4-25C8,U+25CB,U+25CF,U+25EF,U+2600,U+2605-2607,U+263C,U+2661,U+2665,U+26A0,U+2713,U+2717,U+2756,U+2764,U+2780-2789,U+27F5-27FB,U+2B06,U+2B12-2B14,U+2B1C,U+E000,U+E12B-E164,U+1F130-1F14A,U+1F850,U+1F852; - font-named-instance: 'Regular'; -} -/* cyrillic */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.cyrillic.var.woff2') format('woff2'); - unicode-range: U+0400-049E,U+04A0-0500,U+052F,U+20B4,U+2116,U+2DFF,U+A69F; - font-named-instance: 'Regular'; -} -/* greek */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.greek.var.woff2') format('woff2'); - unicode-range: U+0370-0378,U+037A-0380,U+0384-038B,U+038C,U+038E-03A2,U+03A3-03E2,U+03F0-0400,U+1F00-1F16,U+1F18-1F1E,U+1F20-1F46,U+1F48-1F4E,U+1F50-1F58,U+1F59,U+1F5B,U+1F5D,U+1F5F-1F7E,U+1F80-1FB5,U+1FB6-1FC5,U+1FC6-1FD4,U+1FD6-1FDC,U+1FDD-1FF0,U+1FF2-1FF5,U+1FF6-1FFF; - font-named-instance: 'Regular'; -} -/* vietnamese */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.vietnamese.var.woff2') format('woff2'); - unicode-range: U+0102-0104,U+0110-0112,U+0128-012A,U+0168-016A,U+01A0-01A2,U+01AF-01B1,U+1EA0-1EFA,U+20AB; - font-named-instance: 'Regular'; -} -/* latin-ext */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.latin-ext.var.woff2') format('woff2'); - unicode-range: U+0100-0149,U+014A-01C4,U+01C5-0250,U+0259,U+1E00-1F00,U+2020,U+20A0-20AC,U+20AD-20C0,U+2113,U+2C7C,U+2C7F,U+A7FF; - font-named-instance: 'Regular'; -} -/* latin */ -@font-face { - font-family: 'Inter var'; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url('Inter-roman.latin.var.woff2') format('woff2'); - unicode-range: U+0000-007F,U+00A0-0100,U+0131,U+0152-0154,U+02BB-02BD,U+02C6,U+02DA,U+02DC,U+2000-200C,U+2010-2028,U+202F-2060,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+FEFF; - font-named-instance: 'Regular'; -} \ No newline at end of file diff --git a/lib/install/tailwindcss.rb b/lib/install/tailwindcss.rb index b48cb398..61fe3fac 100644 --- a/lib/install/tailwindcss.rb +++ b/lib/install/tailwindcss.rb @@ -4,7 +4,7 @@ if APPLICATION_LAYOUT_PATH.exist? say "Add Tailwindcss include tags and container element in application layout" insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(4), before: /^\s*<%= stylesheet_link_tag/ - <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %> + <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> ERB if File.open(APPLICATION_LAYOUT_PATH).read =~ /\n\s*<%= yield %>\n\s*<\/body>/ @@ -13,7 +13,7 @@ end else say "Default application.html.erb is missing!", :red - say %( Add <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %> within the tag in your custom layout.) + say %( Add <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> within the tag in your custom layout.) end say "Build into app/assets/builds" diff --git a/lib/tailwindcss/engine.rb b/lib/tailwindcss/engine.rb index 4b9b9fdc..080416c4 100644 --- a/lib/tailwindcss/engine.rb +++ b/lib/tailwindcss/engine.rb @@ -2,10 +2,6 @@ module Tailwindcss class Engine < ::Rails::Engine - initializer "tailwindcss.assets" do - Rails.application.config.assets.precompile += %w( inter-font.css ) - end - initializer "tailwindcss.disable_generator_stylesheets" do Rails.application.config.generators.stylesheets = false end From 67a17e007acc608a37bdd21000544a0b114484c3 Mon Sep 17 00:00:00 2001 From: Eric Gusmao Date: Thu, 23 Jan 2025 12:48:55 -0300 Subject: [PATCH 198/274] Update generators utility classes to tailwind v4 --- .../templates/app/views/passwords/edit.html.erb | 4 ++-- .../templates/app/views/passwords/new.html.erb | 2 +- .../templates/app/views/sessions/new.html.erb | 4 ++-- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb index 707bbe5c..5c989810 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb @@ -7,11 +7,11 @@ <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %>
- <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 outline-hidden focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
- <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 outline-hidden focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb index 72c434de..e5862200 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb @@ -7,7 +7,7 @@ <%%= form_with url: passwords_path, class: "contents" do |form| %>
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 outline-none focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow-sm rounded-md border border-gray-400 outline-hidden focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb index 92d64b79..64c145c0 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb @@ -11,11 +11,11 @@ <%%= form_with url: session_url, class: "contents" do |form| %>
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow rounded-md border border-gray-400 focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow-sm rounded-md border border-gray-400 focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
- <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow rounded-md border border-gray-400 focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, required: true, autocomplete: "current-password", placeholder: "Enter your password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 93490a15..9e392609 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -15,23 +15,23 @@
<% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.password_field :password, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %>
<%%= form.label :password_confirmation %> - <%%= form.password_field :password_confirmation, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> + <%%= form.password_field :password_confirmation, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow rounded-md border outline-none mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% else -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow rounded-md border outline-none px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% end -%> <% end -%>
From e507b0ee1b89f90b31f5d9f0b7cfd929c540d5ff Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 12:26:15 -0500 Subject: [PATCH 199/274] prefactor: rename user_journey_test to user_install_test --- .github/workflows/ci.yml | 4 ++-- .github/workflows/upstream.yml | 6 +++--- CONTRIBUTING.md | 2 +- .../{user_journey_test.sh => user_install_test.sh} | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename test/integration/{user_journey_test.sh => user_install_test.sh} (96%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07fb8285..b53627e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: - name: Run tests run: bin/test - user-journey: + user-install: strategy: fail-fast: false matrix: @@ -44,5 +44,5 @@ jobs: with: ruby-version: "3.4" bundler: latest - - run: test/integration/user_journey_test.sh + - run: test/integration/user_install_test.sh shell: bash diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index e491a957..e38eac50 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -34,8 +34,8 @@ jobs: - name: Run tests run: bin/test - user-journey: - name: "user-journey (rails ${{ matrix.ref }})" + user-install: + name: "user-install (rails ${{ matrix.ref }})" runs-on: ${{matrix.plat}}-latest strategy: fail-fast: false @@ -50,5 +50,5 @@ jobs: with: ruby-version: "3.3" bundler: latest - - run: test/integration/user_journey_test.sh + - run: test/integration/user_install_test.sh shell: bash diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a4040dfa..c2e8746f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ This doc is a brief introduction on modifying and maintaining this gem. The unit tests are run with `bundle exec rake test` -There is an additional integration test which runs in CI, `test/integration/user_journey_test.sh` which you may also want to run. +There is an additional integration test which runs in CI, `test/integration/user_install_test.sh` which you may also want to run. ### Testing in a Rails app diff --git a/test/integration/user_journey_test.sh b/test/integration/user_install_test.sh similarity index 96% rename from test/integration/user_journey_test.sh rename to test/integration/user_install_test.sh index 985b72c4..dd36af25 100755 --- a/test/integration/user_journey_test.sh +++ b/test/integration/user_install_test.sh @@ -18,8 +18,8 @@ pushd "My Workspace" # create a rails app bundle exec rails -v -bundle exec rails new test-app --skip-bundle -pushd test-app +bundle exec rails new test-install --skip-bundle +pushd test-install # make sure to use the same version of rails (e.g., install from git source if necessary) bundle remove rails --skip-install From 25010f3aecff8a2335e23749cd02143d29fa538c Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 11:18:23 -0500 Subject: [PATCH 200/274] Introduce a 'tailwindcss:upgrade' task - rename install/tailwindcss.rb to install/install_tailwindcss.rb - new script install/upgrade_tailwindcss.rb which: - removes the "inter-font" CSS tag from the application layout - comments out references to 'defaultTheme' in tailwind.config.js - runs "npx @tailwindcss/upgrade@next" if npx is available - new integration test --- .github/workflows/ci.yml | 15 ++++ .github/workflows/upstream.yml | 19 +++++ ...{tailwindcss.rb => install_tailwindcss.rb} | 0 lib/install/upgrade_tailwindcss.rb | 42 +++++++++++ lib/tasks/install.rake | 2 +- lib/tasks/upgrade.rake | 6 ++ test/integration/user_upgrade_test.sh | 72 +++++++++++++++++++ 7 files changed, 155 insertions(+), 1 deletion(-) rename lib/install/{tailwindcss.rb => install_tailwindcss.rb} (100%) create mode 100644 lib/install/upgrade_tailwindcss.rb create mode 100644 lib/tasks/upgrade.rake create mode 100755 test/integration/user_upgrade_test.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b53627e4..3822e414 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,3 +46,18 @@ jobs: bundler: latest - run: test/integration/user_install_test.sh shell: bash + + user-upgrade: + strategy: + fail-fast: false + matrix: + plat: ["ubuntu", "macos"] # TODO: on windows the tailwind upgrader tests are failing + runs-on: ${{matrix.plat}}-latest + steps: + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.4" + bundler: latest + - run: test/integration/user_upgrade_test.sh + shell: bash diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index e38eac50..e1b12dea 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -52,3 +52,22 @@ jobs: bundler: latest - run: test/integration/user_install_test.sh shell: bash + + user-upgrade: + name: "user-upgrade (rails ${{ matrix.ref }})" + runs-on: ${{matrix.plat}}-latest + strategy: + fail-fast: false + matrix: + plat: ["ubuntu"] + ref: ["7-2-stable", "8-0-stable", "main"] + env: + RAILSOPTS: --git=https://github.com/rails/rails --ref=${{ matrix.ref }} + steps: + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.3" + bundler: latest + - run: test/integration/user_upgrade_test.sh + shell: bash diff --git a/lib/install/tailwindcss.rb b/lib/install/install_tailwindcss.rb similarity index 100% rename from lib/install/tailwindcss.rb rename to lib/install/install_tailwindcss.rb diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb new file mode 100644 index 00000000..24dd4551 --- /dev/null +++ b/lib/install/upgrade_tailwindcss.rb @@ -0,0 +1,42 @@ +TAILWIND_CONFIG_PATH = Rails.root.join("config/tailwind.config.js") +APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb") + +if TAILWIND_CONFIG_PATH.exist? + if File.read(TAILWIND_CONFIG_PATH).match?(/defaultTheme/) + say "Removing references to 'defaultTheme' from #{TAILWIND_CONFIG_PATH}" + gsub_file TAILWIND_CONFIG_PATH.to_s, /^(.*defaultTheme)/, "// \\1" + end + + if system("npx --version") + say "Running the upstream Tailwind CSS upgrader" + command = Shellwords.join(["npx", "@tailwindcss/upgrade@next", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) + success = run(command, abort_on_failure: false) + unless success + say "The upgrade tool failed!", :red + say %( You probably need to update your configuration. Please read the error messages,) + say %( and check the Tailwind CSS upgrade guide at https://tailwindcss.com/docs/upgrade-guide.) + abort + end + else + say "Could not run the Tailwind upgrade tool. Please see https://tailwindcss.com/docs/upgrade-guide for manual instructions.", :red + abort + end +else + say "Default tailwind.config.js is missing!", :red + abort +end + +if APPLICATION_LAYOUT_PATH.exist? + if File.read(APPLICATION_LAYOUT_PATH).match?(/"inter-font"/) + say "Strip Inter font CSS from application layout" + gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{, "inter-font"}, "" + else + say "Inter font CSS not detected.", :green + end +else + say "Default application.html.erb is missing!", :red + say %( Please check your layouts and remove any "inter-font" stylesheet links.) +end + +say "Compile initial Tailwind build" +run "rails tailwindcss:build" diff --git a/lib/tasks/install.rake b/lib/tasks/install.rake index 2a571cad..f94ec2a1 100644 --- a/lib/tasks/install.rake +++ b/lib/tasks/install.rake @@ -1,6 +1,6 @@ namespace :tailwindcss do desc "Install Tailwind CSS into the app" task :install do - system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/tailwindcss.rb", __dir__)}" + system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/install_tailwindcss.rb", __dir__)}" end end diff --git a/lib/tasks/upgrade.rake b/lib/tasks/upgrade.rake new file mode 100644 index 00000000..05047523 --- /dev/null +++ b/lib/tasks/upgrade.rake @@ -0,0 +1,6 @@ +namespace :tailwindcss do + desc "Upgrade app from Tailwind CSS v3 to v4" + task :upgrade do + system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/upgrade_tailwindcss.rb", __dir__)}" + end +end diff --git a/test/integration/user_upgrade_test.sh b/test/integration/user_upgrade_test.sh new file mode 100755 index 00000000..d2cc9d8f --- /dev/null +++ b/test/integration/user_upgrade_test.sh @@ -0,0 +1,72 @@ +#! /usr/bin/env bash +# reproduce the documented user journey for installing and running tailwindcss-rails +# this is run in the CI pipeline, non-zero exit code indicates a failure + +set -o pipefail +set -eux + +# set up dependencies +rm -f Gemfile.lock +bundle remove actionmailer +bundle add rails --skip-install ${RAILSOPTS:-} +bundle install --prefer-local + +# do our work a directory with spaces in the name (#176, #184) +rm -rf "My Workspace" +mkdir "My Workspace" +pushd "My Workspace" + +# create a rails app +bundle exec rails -v +bundle exec rails new test-upgrade --skip-bundle +pushd test-upgrade + +# make sure to use the same version of rails (e.g., install from git source if necessary) +bundle remove rails --skip-install +bundle add rails --skip-install ${RAILSOPTS:-} + +# set up app with tailwindcss-rails v3 and tailwindcss-ruby v3 +bundle add tailwindcss-rails --skip-install --version 3.3.0 +bundle add tailwindcss-ruby --skip-install --version 3.4.17 +bundle install --prefer-local +bundle show --paths +bundle binstubs --all + +# install tailwindcss +bin/rails tailwindcss:install +grep -q inter-font app/views/layouts/application.html.erb + +if [[ $(rails -v) > "Rails 8.0.0.beta" ]] ; then + # install auth templates + bin/rails generate authentication + grep -q PasswordsController app/controllers/passwords_controller.rb +fi + +# install scaffold templates +bin/rails generate scaffold post title:string body:text published:boolean +grep -q "Show this post" app/views/posts/index.html.erb + +# upgrade time! +bundle remove tailwindcss-rails --skip-install +bundle remove tailwindcss-ruby --skip-install + +bundle add tailwindcss-rails --skip-install --path="../.." +bundle add tailwindcss-ruby --skip-install --version 4.0.0 + +bundle install --prefer-local +bundle show --paths +bundle binstubs --all + +bin/rails tailwindcss:upgrade + +# TEST: removal of inter-font CSS +if grep -q inter-font app/views/layouts/application.html.erb ; then + echo "FAIL: inter-font CSS not removed" + exit 1 +fi + +# generate CSS +bin/rails tailwindcss:build[verbose] +grep -q "py-2" app/assets/builds/tailwind.css + +echo "OK" From fef615c401e54cd9ae1a089c8f4c9381ab5e2bea Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 14:06:58 -0500 Subject: [PATCH 201/274] If present, move config/postcss.config.js to root This is where the tailwind upgrade tool expects it to be, because that's the convention, apparently. --- lib/install/upgrade_tailwindcss.rb | 42 +++++++++++++++------------ test/integration/user_upgrade_test.sh | 15 ++++++++++ 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index 24dd4551..b5389c73 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -1,28 +1,34 @@ TAILWIND_CONFIG_PATH = Rails.root.join("config/tailwind.config.js") APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb") +POSTCSS_CONFIG_PATH = Rails.root.join("config/postcss.config.js") -if TAILWIND_CONFIG_PATH.exist? - if File.read(TAILWIND_CONFIG_PATH).match?(/defaultTheme/) - say "Removing references to 'defaultTheme' from #{TAILWIND_CONFIG_PATH}" - gsub_file TAILWIND_CONFIG_PATH.to_s, /^(.*defaultTheme)/, "// \\1" - end +unless TAILWIND_CONFIG_PATH.exist? + say "Default tailwind.config.js is missing!", :red + abort +end - if system("npx --version") - say "Running the upstream Tailwind CSS upgrader" - command = Shellwords.join(["npx", "@tailwindcss/upgrade@next", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) - success = run(command, abort_on_failure: false) - unless success - say "The upgrade tool failed!", :red - say %( You probably need to update your configuration. Please read the error messages,) - say %( and check the Tailwind CSS upgrade guide at https://tailwindcss.com/docs/upgrade-guide.) - abort - end - else - say "Could not run the Tailwind upgrade tool. Please see https://tailwindcss.com/docs/upgrade-guide for manual instructions.", :red +if File.read(TAILWIND_CONFIG_PATH).match?(/defaultTheme/) + say "Removing references to 'defaultTheme' from #{TAILWIND_CONFIG_PATH}" + gsub_file TAILWIND_CONFIG_PATH.to_s, /^(.*defaultTheme)/, "// \\1" +end + +if POSTCSS_CONFIG_PATH.exist? + say "Moving PostCSS configuration to application root directory" + FileUtils.mv(POSTCSS_CONFIG_PATH, Rails.root, verbose: true) || abort +end + +if system("npx --version") + say "Running the upstream Tailwind CSS upgrader" + command = Shellwords.join(["npx", "@tailwindcss/upgrade@next", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) + success = run(command, abort_on_failure: false) + unless success + say "The upgrade tool failed!", :red + say %( You probably need to update your configuration. Please read the error messages,) + say %( and check the Tailwind CSS upgrade guide at https://tailwindcss.com/docs/upgrade-guide.) abort end else - say "Default tailwind.config.js is missing!", :red + say "Could not run the Tailwind upgrade tool. Please see https://tailwindcss.com/docs/upgrade-guide for manual instructions.", :red abort end diff --git a/test/integration/user_upgrade_test.sh b/test/integration/user_upgrade_test.sh index d2cc9d8f..e4912818 100755 --- a/test/integration/user_upgrade_test.sh +++ b/test/integration/user_upgrade_test.sh @@ -57,6 +57,15 @@ bundle install --prefer-local bundle show --paths bundle binstubs --all +# create a postcss file +cat < config/postcss.config.js +module.exports = { + plugins: { + autoprefixer: {}, + }, +} +EOF + bin/rails tailwindcss:upgrade # TEST: removal of inter-font CSS @@ -65,6 +74,12 @@ if grep -q inter-font app/views/layouts/application.html.erb ; then exit 1 fi +# TEST: moving the postcss file +if [ ! -f postcss.config.js ] ; then + echo "FAIL: postcss.config.js not moved" + exit 1 +fi + # generate CSS bin/rails tailwindcss:build[verbose] grep -q "py-2" app/assets/builds/tailwind.css From 1edc8c00ecc0e81c8a0ef7a510bc5177cb27ff68 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 14:34:27 -0500 Subject: [PATCH 202/274] doc: add upgrade notes to the README and start a CHANGELOG entry --- CHANGELOG.md | 25 ++++++++++++ README.md | 110 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 132 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39f9bc25..b05f8fe5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ ## next / unreleased +## v4.0.0.rc1 / unreleased + +### Upgrade to Tailwind CSS v4 + +General changes: + +- Dependency on `tailwindcss-ruby` set to `~> 4.0`. +- The location of (optional) `postcss.config.js` has moved from the `config/` directory to the app root. + +Changes to the `tailwindcss:install` task: + +- The `tailwindcss:install` task no longer installs `config/tailwind.config.js`. +- The Inter font is no longer packaged with the gem. +- Some Tailwind class names are updated for v4. + +New task `tailwindcss:upgrade` upgrades many apps cleanly: + +- Cleans up some things in the generated `config/tailwind.config.js`. +- Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). +- Removes references to the Inter font from the application layout. +- If present, moves `config/postcss.config.js` to the root directory. + +Thanks to @EricGusmao and @excid3 for their help and advice on this work. + + ## v3.3.0 / 2025-01-19 * Add support for using the puma plugin in a standalone puma process (outside of `rails server`). (#458) @flavorjones diff --git a/README.md b/README.md index c80bae4d..7ea37753 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ - [Installation](#installation) * [Choosing a specific version of `tailwindcss`](#choosing-a-specific-version-of-tailwindcss) * [Using a local installation of `tailwindcss`](#using-a-local-installation-of-tailwindcss) +- [Upgrading your application from Tailwind v3 to v4](#upgrading-your-application-from-tailwind-v3-to-v4) + * [You don't _have_ to upgrade](#you-dont-_have_-to-upgrade) + * [Upgrade steps](#upgrade-steps) + * [Troubleshooting](#troubleshooting) - [Developing with Tailwindcss](#developing-with-tailwindcss) * [Configuration and commands](#configuration-and-commands) * [Building for production](#building-for-production) @@ -17,7 +21,7 @@ * [Live rebuild](#live-rebuild) * [Using with PostCSS](#using-with-postcss) * [Custom inputs or outputs](#custom-inputs-or-outputs) -- [Troubleshooting](#troubleshooting) +- [Troubleshooting](#troubleshooting-1) * [Lost keystrokes or hanging when using terminal-based debugging tools (e.g. IRB, Pry, `ruby/debug`...etc.) with the Puma plugin](#lost-keystrokes-or-hanging-when-using-terminal-based-debugging-tools-eg-irb-pry-rubydebugetc-with-the-puma-plugin) * [Running in a docker container exits prematurely](#running-in-a-docker-container-exits-prematurely) * [Conflict with sassc-rails](#conflict-with-sassc-rails) @@ -55,6 +59,106 @@ gem "tailwindcss-ruby", "3.4.13" You can also use a local (npm-based) installation if you prefer, please go to https://github.com/flavorjones/tailwindcss-ruby for more information. +## Upgrading your application from Tailwind v3 to v4 + +v4.x of this gem has been updated to work with Tailwind v4, including providing some help with upgrading your application. + +A full explanation of a Tailwind v4 upgrade is out of scope for this README, so we strongly urge you to read the [official Tailwind v4 upgrade guide](https://tailwindcss.com/docs/upgrade-guide) before embarking on an upgrade to an existing large app. + +This gem will help with some of the mechanics of the upgrade, however. + +### You don't _have_ to upgrade + +Keep in mind that you don't _need_ to upgrade. You can stay on Tailwind v3 for the foreseeable future if you prefer not to migrate now, or if your migration runs into problems. + +Just make sure you're pinning the version of **both** `tailwindcss-rails` and `tailwindcss-ruby`: + +``` ruby +# Gemfile +gem "tailwindcss-rails", "~> 3.3" +gem "tailwindcss-ruby", "~> 3.4" +``` + + +### Upgrade steps + +First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you're transitively depending on `tailwindcss-ruby` v4. + +``` html +# Gemfile +gem "tailwindcss-rails", "~> 4.0" +``` + +Then, run the `tailwindcss:upgrade` task. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. + +Here's what the upgrade task does: + +- Cleans up some things in the generated `config/tailwind.config.js`. +- Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). +- Removes references to the Inter font from the application layout. +- If present, moves `config/postcss.config.js` to the root directory. + +Here's what that upgrade looks like on a vanilla Rails app: + +``` sh +$ bin/rails tailwindcss:upgrade + apply /path/to/tailwindcss-rails/lib/install/upgrade_tailwindcss.rb + Removing references to 'defaultTheme' from /home/user/myapp/config/tailwind.config.js + gsub config/tailwind.config.js + Running the upstream Tailwind CSS upgrader + run npx @tailwindcss/upgrade@next --force --config /home/user/myapp/config/tailwind.config.js from "." +≈ tailwindcss v4.0.0 + +│ Searching for CSS files in the current directory and its subdirectories… + +│ ↳ Linked `./config/tailwind.config.js` to `./app/assets/stylesheets/application.tailwind.css` + +│ Migrating JavaScript configuration files… + +│ ↳ The configuration file at `./config/tailwind.config.js` could not be automatically migrated to the new CSS +│ configuration format, so your CSS has been updated to load your existing configuration file. + +│ Migrating templates… + +│ ↳ Migrated templates for configuration file: `./config/tailwind.config.js` + +│ Migrating stylesheets… + +│ ↳ Migrated stylesheet: `./app/assets/stylesheets/application.tailwind.css` + +│ ↳ No PostCSS config found, skipping migration. + +│ Updating dependencies… + +│ Could not detect a package manager. Please manually update `tailwindcss` to v4. + +│ Verify the changes and commit them to your repository. + + Strip Inter font CSS from application layout + gsub app/views/layouts/application.html.erb + Compile initial Tailwind build + run rails tailwindcss:build from "." +≈ tailwindcss v4.0.0 + +Done in 52ms + run bundle install --quiet +``` + +If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide)! + + +### Troubleshooting + +You may want to check out [TailwindCSS v4 - upgrade experience report · rails/tailwindcss-rails · Discussion #450](https://github.com/rails/tailwindcss-rails/discussions/450) if you're having trouble upgrading. + +We know there are some cases we haven't addressed with the upgrade task: + +- If the user isn’t using PostCSS, some migrations (e.g., updating class names in the view files) may fail +- In setups without JavaScript tooling, the update process may fail to fully migrate `tailwind.config.js` because the tool assumes that the imported packages (e.g., tailwind plugins) are installed via a package manager, allowing them to be called. + +We'll try to improve the upgrade process over time, but for now you may need to do some manual work to upgrade. + + ## Developing with Tailwindcss ### Configuration and commands @@ -147,12 +251,12 @@ Running `bin/dev` invokes Foreman to start both the Tailwind watch process and t ### Using with PostCSS -If you want to use PostCSS as a preprocessor, create a custom `config/postcss.config.js` and that file will be loaded by tailwind automatically. +If you want to use PostCSS as a preprocessor, create a custom `postcss.config.js` in your project root directory, and that file will be loaded by tailwind automatically. For example, to enable nesting: ```js -// config/postcss.config.js +// postcss.config.js module.exports = { plugins: { 'postcss-import': {}, From dd85c1d798ae8b94f238c26b06c47ecf7d026a64 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 14:56:40 -0500 Subject: [PATCH 203/274] version bump to v4.0.0.rc1 --- CHANGELOG.md | 2 +- lib/tailwindcss/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b05f8fe5..a013c4f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## next / unreleased -## v4.0.0.rc1 / unreleased +## v4.0.0.rc1 / 2025-01-23 ### Upgrade to Tailwind CSS v4 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 5c301936..18243054 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "3.3.0" + VERSION = "4.0.0.rc1" end From e57f34a3ac39fc652d537e8e5203b79ee4847e5a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 15:36:59 -0500 Subject: [PATCH 204/274] doc: merge CHANGELOG entry for v3.3.1 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a013c4f6..f978347c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,13 @@ New task `tailwindcss:upgrade` upgrades many apps cleanly: Thanks to @EricGusmao and @excid3 for their help and advice on this work. +## v3.3.1 / 2025-01-23 + +* Pin the dependency on `tailwindcss-ruby` to `~> 3.0` to prevent users from upgrading Tailwind while still on v3 of this gem. + + While it was useful during the Tailwind v4 beta period to allow users to float this dependency to try upgrading, we know (now that v4.0.0.rc1 of this gem is out) that not everything will work well if combining Tailwind v4 with `tailwindcss-rails` v3. Pinning this dependency should protect developers against unexpected issues. + + ## v3.3.0 / 2025-01-19 * Add support for using the puma plugin in a standalone puma process (outside of `rails server`). (#458) @flavorjones From 65dd6c5ef76e474bf73249a086437bafa58e49b4 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Thu, 23 Jan 2025 15:39:11 -0500 Subject: [PATCH 205/274] doc: update README with updated gemfile instructions because v3.3.1 pins tailwindcss-ruby to v3 [skip ci] --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7ea37753..303c7e21 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,14 @@ This gem will help with some of the mechanics of the upgrade, however. Keep in mind that you don't _need_ to upgrade. You can stay on Tailwind v3 for the foreseeable future if you prefer not to migrate now, or if your migration runs into problems. -Just make sure you're pinning the version of **both** `tailwindcss-rails` and `tailwindcss-ruby`: +Just make sure you're either pinned to v3.3.1 of this gem: + +``` ruby +# Gemfile +gem "tailwindcss-rails", "3.3.1" # which transitively pins tailwindcss-ruby to v3 +``` + +or if you're on an earlier version of this gem, make sure you're pinning the version of **both** `tailwindcss-rails` and `tailwindcss-ruby`: ``` ruby # Gemfile @@ -86,7 +93,7 @@ First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you ``` html # Gemfile -gem "tailwindcss-rails", "~> 4.0" +gem "tailwindcss-rails", "~> 4.0" # which transitively pins tailwindcss-ruby to v4 ``` Then, run the `tailwindcss:upgrade` task. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. From 5b478e7c5b900534962c0a563060bd7a5228005e Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Fri, 10 Jan 2025 18:23:04 -0300 Subject: [PATCH 206/274] Improve boolean fields --- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 4 ++-- .../tailwindcss/scaffold/templates/partial.html.erb.tt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 9e392609..43d06cb2 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -12,7 +12,7 @@ <%% end %> <% attributes.each do |attribute| -%> -
+
"> <% if attribute.password_digest? -%> <%%= form.label :password %> <%%= form.password_field :password, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> @@ -29,7 +29,7 @@ <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden order-first h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% else -%> <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% end -%> diff --git a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt index 88dc3eda..6062db24 100644 --- a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt @@ -8,6 +8,8 @@ <%% <%= singular_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
<%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %>
<%% end %> +<% elsif attribute.type == :boolean -%> + <%%= <%= singular_name %>.<%= attribute.column_name %>? ? "Yes" : "No" %> <% else -%> <%%= <%= singular_name %>.<%= attribute.column_name %> %> <% end -%> From b5aac18d225973427299ba1ef903249ad2161e42 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Thu, 23 Jan 2025 23:10:29 -0300 Subject: [PATCH 207/274] remove inter font before upgrading using the npx script --- lib/install/upgrade_tailwindcss.rb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index b5389c73..53440aee 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -17,6 +17,18 @@ FileUtils.mv(POSTCSS_CONFIG_PATH, Rails.root, verbose: true) || abort end +if APPLICATION_LAYOUT_PATH.exist? + if File.read(APPLICATION_LAYOUT_PATH).match?(/"inter-font"/) + say "Strip Inter font CSS from application layout" + gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{, "inter-font"}, "" + else + say "Inter font CSS not detected.", :green + end +else + say "Default application.html.erb is missing!", :red + say %( Please check your layouts and remove any "inter-font" stylesheet links.) +end + if system("npx --version") say "Running the upstream Tailwind CSS upgrader" command = Shellwords.join(["npx", "@tailwindcss/upgrade@next", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) @@ -32,17 +44,5 @@ abort end -if APPLICATION_LAYOUT_PATH.exist? - if File.read(APPLICATION_LAYOUT_PATH).match?(/"inter-font"/) - say "Strip Inter font CSS from application layout" - gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{, "inter-font"}, "" - else - say "Inter font CSS not detected.", :green - end -else - say "Default application.html.erb is missing!", :red - say %( Please check your layouts and remove any "inter-font" stylesheet links.) -end - say "Compile initial Tailwind build" run "rails tailwindcss:build" From a9f3a0f90513b6927706be19afa4669d945e1fbf Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 24 Jan 2025 10:00:33 -0500 Subject: [PATCH 208/274] test: restore the ability to inject tailwindcss-ruby bundler opts so we can integration test from tailwindcss-ruby's downstream CI pipeline --- test/integration/user_install_test.sh | 3 ++- test/integration/user_upgrade_test.sh | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index dd36af25..07ac8182 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -27,8 +27,9 @@ bundle add rails --skip-install ${RAILSOPTS:-} # use the tailwindcss-rails under test bundle add tailwindcss-rails --skip-install --path="../.." +bundle add tailwindcss-ruby --skip-install ${TAILWINDCSSOPTS:-} bundle install --prefer-local -bundle show --paths +bundle show --paths | fgrep tailwind bundle binstubs --all # install tailwindcss diff --git a/test/integration/user_upgrade_test.sh b/test/integration/user_upgrade_test.sh index e4912818..28621f8d 100755 --- a/test/integration/user_upgrade_test.sh +++ b/test/integration/user_upgrade_test.sh @@ -29,7 +29,7 @@ bundle add rails --skip-install ${RAILSOPTS:-} bundle add tailwindcss-rails --skip-install --version 3.3.0 bundle add tailwindcss-ruby --skip-install --version 3.4.17 bundle install --prefer-local -bundle show --paths +bundle show --paths | fgrep tailwind bundle binstubs --all # install tailwindcss @@ -51,10 +51,10 @@ bundle remove tailwindcss-rails --skip-install bundle remove tailwindcss-ruby --skip-install bundle add tailwindcss-rails --skip-install --path="../.." -bundle add tailwindcss-ruby --skip-install --version 4.0.0 +bundle add tailwindcss-ruby --skip-install ${TAILWINDCSSOPTS:---version 4.0.0} bundle install --prefer-local -bundle show --paths +bundle show --paths | fgrep tailwind bundle binstubs --all # create a postcss file From 7ae7a06ad89a6137e6d4a22d5cdfb55f4bc35d44 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 24 Jan 2025 12:20:49 -0500 Subject: [PATCH 209/274] fix: unnecessary stylesheet_link_tag for tailwind In Rails 8, propshaft detects `:app` and loads all the css files under app/assets/stylesheets, so we may not need this explicit tag for tailwind. On installation, omit the tailwind stylesheet link tag if `:app` is already being passed to stylesheet_link_tag in the layout. On upgrade, remove the tailwind stylesheet link tag if `:app` is already being passed to stylesheet_link_tag in the layout. --- lib/install/install_tailwindcss.rb | 11 +++++++---- lib/install/upgrade_tailwindcss.rb | 6 ++++++ test/integration/user_install_test.sh | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/install/install_tailwindcss.rb b/lib/install/install_tailwindcss.rb index 61fe3fac..8957bc0e 100644 --- a/lib/install/install_tailwindcss.rb +++ b/lib/install/install_tailwindcss.rb @@ -2,11 +2,14 @@ CENTERING_CONTAINER_INSERTION_POINT = /^\s*<%= yield %>/.freeze if APPLICATION_LAYOUT_PATH.exist? - say "Add Tailwindcss include tags and container element in application layout" - insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(4), before: /^\s*<%= stylesheet_link_tag/ - <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> - ERB + unless File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag :app/) + say "Add Tailwindcss include tags in application layout" + insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(4), before: /^\s*<%= stylesheet_link_tag/ + <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> + ERB + end + say "Add Tailwindcss container element in application layout" if File.open(APPLICATION_LAYOUT_PATH).read =~ /\n\s*<%= yield %>\n\s*<\/body>/ insert_into_file APPLICATION_LAYOUT_PATH.to_s, %(
\n ), before: CENTERING_CONTAINER_INSERTION_POINT insert_into_file APPLICATION_LAYOUT_PATH.to_s, %(\n
), after: CENTERING_CONTAINER_INSERTION_POINT diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index 53440aee..631e05bc 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -18,6 +18,12 @@ end if APPLICATION_LAYOUT_PATH.exist? + if File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag :app/) && + File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag "tailwind"/) + say "Remove unnecessary stylesheet_link_tag from application layout" + gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{^\s*<%= stylesheet_link_tag "tailwind".*%>$}, "" + end + if File.read(APPLICATION_LAYOUT_PATH).match?(/"inter-font"/) say "Strip Inter font CSS from application layout" gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{, "inter-font"}, "" diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index 07ac8182..d670a106 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -36,7 +36,8 @@ bundle binstubs --all bin/rails tailwindcss:install # TEST: tailwind was installed correctly -grep -q tailwind app/views/layouts/application.html.erb +grep -q "
<> Rakefile From 11438d61a5a204fd5422c20aaf9b3182151667a8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 24 Jan 2025 10:11:17 -0500 Subject: [PATCH 210/274] doc: fixup blank lines in README [skip ci] --- README.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/README.md b/README.md index 303c7e21..5542c70a 100644 --- a/README.md +++ b/README.md @@ -115,32 +115,19 @@ $ bin/rails tailwindcss:upgrade Running the upstream Tailwind CSS upgrader run npx @tailwindcss/upgrade@next --force --config /home/user/myapp/config/tailwind.config.js from "." ≈ tailwindcss v4.0.0 - │ Searching for CSS files in the current directory and its subdirectories… - │ ↳ Linked `./config/tailwind.config.js` to `./app/assets/stylesheets/application.tailwind.css` - │ Migrating JavaScript configuration files… - │ ↳ The configuration file at `./config/tailwind.config.js` could not be automatically migrated to the new CSS │ configuration format, so your CSS has been updated to load your existing configuration file. - │ Migrating templates… - │ ↳ Migrated templates for configuration file: `./config/tailwind.config.js` - │ Migrating stylesheets… - │ ↳ Migrated stylesheet: `./app/assets/stylesheets/application.tailwind.css` - │ ↳ No PostCSS config found, skipping migration. - │ Updating dependencies… - │ Could not detect a package manager. Please manually update `tailwindcss` to v4. - │ Verify the changes and commit them to your repository. - Strip Inter font CSS from application layout gsub app/views/layouts/application.html.erb Compile initial Tailwind build From 31621ead59f92464c3b097c06011795f767a7ec8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 24 Jan 2025 13:12:26 -0500 Subject: [PATCH 211/274] Move application.tailwind.css to a dir ignored by propshaft This file should not be included in the stylesheet link tags served to user agents. Fixes #470 --- README.md | 40 +++++++++++++-------------- lib/install/install_tailwindcss.rb | 7 +++-- lib/install/upgrade_tailwindcss.rb | 23 ++++++++++----- lib/tailwindcss/commands.rb | 2 +- lib/tailwindcss/engine.rb | 6 ++++ test/integration/user_install_test.sh | 4 +-- test/integration/user_upgrade_test.sh | 10 ++++--- 7 files changed, 54 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 5542c70a..17315ebe 100644 --- a/README.md +++ b/README.md @@ -101,9 +101,11 @@ Then, run the `tailwindcss:upgrade` task. Among other things, this will try to r Here's what the upgrade task does: - Cleans up some things in the generated `config/tailwind.config.js`. -- Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). -- Removes references to the Inter font from the application layout. - If present, moves `config/postcss.config.js` to the root directory. +- If present, moves `app/assets/stylesheets/application.tailwind.css` to `app/assets/tailwind`. +- Removes unnecessary `stylesheet_link_tag "tailwindcss"` tags from the application layout. +- Removes references to the Inter font from the application layout. +- Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). Here's what that upgrade looks like on a vanilla Rails app: @@ -112,29 +114,34 @@ $ bin/rails tailwindcss:upgrade apply /path/to/tailwindcss-rails/lib/install/upgrade_tailwindcss.rb Removing references to 'defaultTheme' from /home/user/myapp/config/tailwind.config.js gsub config/tailwind.config.js + Strip Inter font CSS from application layout + gsub app/views/layouts/application.html.erb + Remove unnecessary stylesheet_link_tag from application layout + gsub app/views/layouts/application.html.erb + Moving application.tailwind.css to /home/user/myapp/app/assets/tailwind + create app/assets/tailwind/application.tailwind.css + remove app/assets/stylesheets/application.tailwind.css +10.9.0 Running the upstream Tailwind CSS upgrader run npx @tailwindcss/upgrade@next --force --config /home/user/myapp/config/tailwind.config.js from "." ≈ tailwindcss v4.0.0 │ Searching for CSS files in the current directory and its subdirectories… -│ ↳ Linked `./config/tailwind.config.js` to `./app/assets/stylesheets/application.tailwind.css` +│ ↳ Linked `./config/tailwind.config.js` to `./app/assets/tailwind/application.tailwind.css` │ Migrating JavaScript configuration files… │ ↳ The configuration file at `./config/tailwind.config.js` could not be automatically migrated to the new CSS │ configuration format, so your CSS has been updated to load your existing configuration file. │ Migrating templates… │ ↳ Migrated templates for configuration file: `./config/tailwind.config.js` │ Migrating stylesheets… -│ ↳ Migrated stylesheet: `./app/assets/stylesheets/application.tailwind.css` +│ ↳ Migrated stylesheet: `./app/assets/tailwind/application.tailwind.css` │ ↳ No PostCSS config found, skipping migration. │ Updating dependencies… │ Could not detect a package manager. Please manually update `tailwindcss` to v4. │ Verify the changes and commit them to your repository. - Strip Inter font CSS from application layout - gsub app/views/layouts/application.html.erb Compile initial Tailwind build run rails tailwindcss:build from "." ≈ tailwindcss v4.0.0 - -Done in 52ms +Done in 56ms run bundle install --quiet ``` @@ -157,9 +164,11 @@ We'll try to improve the upgrade process over time, but for now you may need to ### Configuration and commands -#### Input file: `app/assets/stylesheets/application.tailwind.css` +#### Input file: `app/assets/tailwind/application.tailwind.css` + +The `tailwindcss:install` task will generate a Tailwind input file in `app/assets/tailwind/application.tailwind.css`. This is where you import the plugins you want to use and where you can setup your custom `@apply` rules. -The installer will generate a Tailwind input file in `app/assets/stylesheets/application.tailwind.css`. This is where you import the plugins you want to use and where you can setup your custom `@apply` rules. +⚠ The location of this file changed in v4, from `app/assets/stylesheets` to `app/assets/tailwind`. The `tailwindcss:upgrade` task will move it for you. #### Output file: `app/assets/builds/tailwind.css` @@ -335,17 +344,6 @@ The inline version also works:
Has the image as it's background
``` -### Conflict with pre-existing asset pipeline stylesheets - -If you get a warning `Unrecognized at-rule or error parsing at-rule ‘@tailwind’.` in the browser console after installation, you are incorrectly double-processing `application.tailwind.css`. This is a misconfiguration, even though the styles will be fully effective in many cases. - -The file `application.tailwind.css` is installed when running `rails tailwindcss:install` and is placed alongside the common `application.css` in `app/assets/stylesheets`. Because the `application.css` in a newly generated Rails app includes a `require_tree .` directive, the asset pipeline incorrectly processes `application.tailwind.css`, where it should be taken care of by `tailwindcss`. The asset pipeline ignores TailwindCSS's at-directives, and the browser can't process them. - -To fix the warning, you can either remove the `application.css`, if you don't plan to use the asset pipeline for stylesheets, and instead rely on TailwindCSS completely for styles. This is what this installer assumes. - -Or, if you do want to keep using the asset pipeline in parallel, make sure to remove the `require_tree .` line from the `application.css`. - - ## License Tailwind for Rails is released under the [MIT License](https://opensource.org/licenses/MIT). diff --git a/lib/install/install_tailwindcss.rb b/lib/install/install_tailwindcss.rb index 8957bc0e..e210d60b 100644 --- a/lib/install/install_tailwindcss.rb +++ b/lib/install/install_tailwindcss.rb @@ -1,5 +1,6 @@ APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb") CENTERING_CONTAINER_INSERTION_POINT = /^\s*<%= yield %>/.freeze +TAILWIND_ASSET_PATH = Rails.root.join("app/assets/tailwind") if APPLICATION_LAYOUT_PATH.exist? unless File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag :app/) @@ -31,9 +32,9 @@ append_to_file(".gitignore", %(\n/app/assets/builds/*\n!/app/assets/builds/.keep\n)) end -unless Rails.root.join("app/assets/stylesheets/application.tailwind.css").exist? - say "Add default app/assets/stylesheets/application.tailwind.css" - copy_file "#{__dir__}/application.tailwind.css", "app/assets/stylesheets/application.tailwind.css" +unless TAILWIND_ASSET_PATH.join("application.tailwind.css").exist? + say "Add default #{TAILWIND_ASSET_PATH}/application.tailwind.css" + copy_file "#{__dir__}/application.tailwind.css", TAILWIND_ASSET_PATH.join("application.tailwind.css") end if Rails.root.join("Procfile.dev").exist? diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index 631e05bc..84a1aa8c 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -1,6 +1,8 @@ TAILWIND_CONFIG_PATH = Rails.root.join("config/tailwind.config.js") APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb") POSTCSS_CONFIG_PATH = Rails.root.join("config/postcss.config.js") +OLD_TAILWIND_ASSET_PATH = Rails.root.join("app/assets/stylesheets") +TAILWIND_ASSET_PATH = Rails.root.join("app/assets/tailwind") unless TAILWIND_CONFIG_PATH.exist? say "Default tailwind.config.js is missing!", :red @@ -14,27 +16,34 @@ if POSTCSS_CONFIG_PATH.exist? say "Moving PostCSS configuration to application root directory" - FileUtils.mv(POSTCSS_CONFIG_PATH, Rails.root, verbose: true) || abort + copy_file POSTCSS_CONFIG_PATH, Rails.root.join("postcss.config.js") + remove_file POSTCSS_CONFIG_PATH end if APPLICATION_LAYOUT_PATH.exist? - if File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag :app/) && - File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag "tailwind"/) - say "Remove unnecessary stylesheet_link_tag from application layout" - gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{^\s*<%= stylesheet_link_tag "tailwind".*%>$}, "" - end - if File.read(APPLICATION_LAYOUT_PATH).match?(/"inter-font"/) say "Strip Inter font CSS from application layout" gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{, "inter-font"}, "" else say "Inter font CSS not detected.", :green end + + if File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag :app/) && + File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag "tailwind"/) + say "Remove unnecessary stylesheet_link_tag from application layout" + gsub_file APPLICATION_LAYOUT_PATH.to_s, %r{^\s*<%= stylesheet_link_tag "tailwind".*%>$}, "" + end else say "Default application.html.erb is missing!", :red say %( Please check your layouts and remove any "inter-font" stylesheet links.) end +if OLD_TAILWIND_ASSET_PATH.join("application.tailwind.css").exist? + say "Moving application.tailwind.css to #{TAILWIND_ASSET_PATH}" + copy_file OLD_TAILWIND_ASSET_PATH.join("application.tailwind.css"), TAILWIND_ASSET_PATH.join("application.tailwind.css") + remove_file OLD_TAILWIND_ASSET_PATH.join("application.tailwind.css") +end + if system("npx --version") say "Running the upstream Tailwind CSS upgrader" command = Shellwords.join(["npx", "@tailwindcss/upgrade@next", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index ce08bb38..11105dbc 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -8,7 +8,7 @@ def compile_command(debug: false, **kwargs) command = [ Tailwindcss::Ruby.executable(**kwargs), - "-i", rails_root.join("app/assets/stylesheets/application.tailwind.css").to_s, + "-i", rails_root.join("app/assets/tailwind/application.tailwind.css").to_s, "-o", rails_root.join("app/assets/builds/tailwind.css").to_s, ] diff --git a/lib/tailwindcss/engine.rb b/lib/tailwindcss/engine.rb index 080416c4..0c020bbc 100644 --- a/lib/tailwindcss/engine.rb +++ b/lib/tailwindcss/engine.rb @@ -6,6 +6,12 @@ class Engine < ::Rails::Engine Rails.application.config.generators.stylesheets = false end + initializer "tailwindcss.exclude_asset_path", after: "propshaft.append_assets_path" do + if Rails.application.config.assets.excluded_paths # the app may not be using Propshaft + Rails.application.config.assets.excluded_paths << Rails.root.join("app/assets/tailwind") + end + end + config.app_generators do |g| g.template_engine :tailwindcss end diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index d670a106..aaf00a67 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -37,7 +37,7 @@ bin/rails tailwindcss:install # TEST: tailwind was installed correctly grep -q "
<> Rakefile @@ -46,7 +46,7 @@ task :still_here do end EOF -cat >> app/assets/stylesheets/application.tailwind.css <> app/assets/tailwind/application.tailwind.css < Date: Sun, 26 Jan 2025 11:46:24 -0300 Subject: [PATCH 212/274] update README for postcss configuration and dependencies --- README.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5542c70a..92fa3893 100644 --- a/README.md +++ b/README.md @@ -251,13 +251,10 @@ For example, to enable nesting: ```js // postcss.config.js -module.exports = { +export default { plugins: { - 'postcss-import': {}, - 'tailwindcss/nesting': {}, - tailwindcss: {}, - autoprefixer: {}, - }, + "@tailwindcss/postcss": {}, + } } ``` @@ -269,10 +266,9 @@ module.exports = { "name": "my app", "private": true, "dependencies": { - "postcss-advanced-variables": "^4.0.0", - "postcss-import": "^16.0.1", - "postcss-mixins": "^9.0.4", - "tailwindcss": "^3.4.1" + "@tailwindcss/postcss": "^4.0.0", + "tailwindcss": "^4.0.0", + "postcss": "^8.5.1" } } ``` From ac3224f148007911cc1f6c381cee91588efc03e6 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 26 Jan 2025 14:40:56 -0500 Subject: [PATCH 213/274] doc: update README with some plugin info around the v4 upgrade [skip ci] --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d1d9f3fc..99607137 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ - [Upgrading your application from Tailwind v3 to v4](#upgrading-your-application-from-tailwind-v3-to-v4) * [You don't _have_ to upgrade](#you-dont-_have_-to-upgrade) * [Upgrade steps](#upgrade-steps) + * [Plugins](#plugins) * [Troubleshooting](#troubleshooting) - [Developing with Tailwindcss](#developing-with-tailwindcss) * [Configuration and commands](#configuration-and-commands) @@ -28,7 +29,6 @@ * [Class names must be spelled out](#class-names-must-be-spelled-out) * [`ERROR: Cannot find the tailwindcss executable` for supported platform](#error-cannot-find-the-tailwindcss-executable-for-supported-platform) * [Using asset-pipeline assets](#using-asset-pipeline-assets) - * [Conflict with pre-existing asset pipeline stylesheets](#conflict-with-pre-existing-asset-pipeline-stylesheets) - [License](#license) @@ -67,6 +67,7 @@ A full explanation of a Tailwind v4 upgrade is out of scope for this README, so This gem will help with some of the mechanics of the upgrade, however. + ### You don't _have_ to upgrade Keep in mind that you don't _need_ to upgrade. You can stay on Tailwind v3 for the foreseeable future if you prefer not to migrate now, or if your migration runs into problems. @@ -107,7 +108,8 @@ Here's what the upgrade task does: - Removes references to the Inter font from the application layout. - Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). -Here's what that upgrade looks like on a vanilla Rails app: +
+Here's what that upgrade looks like on a vanilla Rails app. ``` sh $ bin/rails tailwindcss:upgrade @@ -145,9 +147,18 @@ Done in 56ms run bundle install --quiet ``` +
+ If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide)! +### Plugins + +In Tailwind CLI v3, some Tailwind plugins were included by default in the CLI tool. However, in v4 these default plugins have been removed. + +In order to use any plugins with v4, either by declaring them in your (optional) config file or using the [`@plugin` directive](https://tailwindcss.com/docs/functions-and-directives#plugin-directive), it's necessary to install them using a local javascript package manager. + + ### Troubleshooting You may want to check out [TailwindCSS v4 - upgrade experience report · rails/tailwindcss-rails · Discussion #450](https://github.com/rails/tailwindcss-rails/discussions/450) if you're having trouble upgrading. From 780846c6d3cf5b9ad30db7a49fc1cef3add47cd4 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 26 Jan 2025 14:42:21 -0500 Subject: [PATCH 214/274] version bump to v4.0.0.rc2 --- CHANGELOG.md | 18 ++++++++++++++++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f978347c..06cfedf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ ## next / unreleased +## v4.0.0.rc2 / 2025-01-26 + +Everything in v4.0.0.rc1, plus ... + +General changes: + +- The location of `application.tailwind.css` has moved from `app/assets/stylesheets` to `app/assets/tailwind`. If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. + +Changes to the `tailwindcss:install` task: + +- The "tailwind" stylesheet link tag will only be added to the application layout if Propshaft isn't in use and already handling `app/assets/build/tailwind.css`. Previously it was always injected, resulting in the tag being rendered twice if Propshaft was in use. + +Changes to the `tailwindcss:upgrade` task: + +- The "tailwind" stylesheet link tag will be removed if Propshaft is in use and already handling `app/assets/build/tailwind.css`. +- The file `application.tailwind.css` will be moved from `app/assets/stylesheets` to `app/assets/tailwind`. + + ## v4.0.0.rc1 / 2025-01-23 ### Upgrade to Tailwind CSS v4 diff --git a/Gemfile.lock b/Gemfile.lock index c671e3a8..91f050ca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (3.3.0) + tailwindcss-rails (4.0.0.rc2) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 18243054..98efde4f 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.0.0.rc1" + VERSION = "4.0.0.rc2" end From 25e3a3b499010255f7fc23601cd49a68036d29c7 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 26 Jan 2025 17:21:46 -0500 Subject: [PATCH 215/274] doc: remove plugins note from README See thread at https://github.com/rails/tailwindcss-rails/discussions/450#discussioncomment-11938025, the default plugins are still present. [skip ci] --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 99607137..623f3f30 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ - [Upgrading your application from Tailwind v3 to v4](#upgrading-your-application-from-tailwind-v3-to-v4) * [You don't _have_ to upgrade](#you-dont-_have_-to-upgrade) * [Upgrade steps](#upgrade-steps) - * [Plugins](#plugins) * [Troubleshooting](#troubleshooting) - [Developing with Tailwindcss](#developing-with-tailwindcss) * [Configuration and commands](#configuration-and-commands) @@ -152,13 +151,6 @@ Done in 56ms If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide)! -### Plugins - -In Tailwind CLI v3, some Tailwind plugins were included by default in the CLI tool. However, in v4 these default plugins have been removed. - -In order to use any plugins with v4, either by declaring them in your (optional) config file or using the [`@plugin` directive](https://tailwindcss.com/docs/functions-and-directives#plugin-directive), it's necessary to install them using a local javascript package manager. - - ### Troubleshooting You may want to check out [TailwindCSS v4 - upgrade experience report · rails/tailwindcss-rails · Discussion #450](https://github.com/rails/tailwindcss-rails/discussions/450) if you're having trouble upgrading. From f15ad412a754f77ef6b8f56cacd2c4973334076f Mon Sep 17 00:00:00 2001 From: Eric Gusmao Date: Mon, 27 Jan 2025 08:00:13 -0300 Subject: [PATCH 216/274] Remove assets/fonts --- .../fonts/Inter-italic.alternates.var.woff2 | Bin 33192 -> 0 bytes .../fonts/Inter-italic.cyrillic.var.woff2 | Bin 37348 -> 0 bytes app/assets/fonts/Inter-italic.extra.var.woff2 | Bin 33192 -> 0 bytes app/assets/fonts/Inter-italic.greek.var.woff2 | Bin 31332 -> 0 bytes .../fonts/Inter-italic.latin-ext.var.woff2 | Bin 66708 -> 0 bytes app/assets/fonts/Inter-italic.latin.var.woff2 | Bin 56108 -> 0 bytes app/assets/fonts/Inter-italic.symbols.var.woff2 | Bin 20652 -> 0 bytes .../fonts/Inter-italic.vietnamese.var.woff2 | Bin 9780 -> 0 bytes .../fonts/Inter-roman.alternates.var.woff2 | Bin 30660 -> 0 bytes app/assets/fonts/Inter-roman.cyrillic.var.woff2 | Bin 35208 -> 0 bytes app/assets/fonts/Inter-roman.extra.var.woff2 | Bin 30660 -> 0 bytes app/assets/fonts/Inter-roman.greek.var.woff2 | Bin 29580 -> 0 bytes .../fonts/Inter-roman.latin-ext.var.woff2 | Bin 62604 -> 0 bytes app/assets/fonts/Inter-roman.latin.var.woff2 | Bin 51896 -> 0 bytes app/assets/fonts/Inter-roman.symbols.var.woff2 | Bin 18340 -> 0 bytes .../fonts/Inter-roman.vietnamese.var.woff2 | Bin 9416 -> 0 bytes 16 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/assets/fonts/Inter-italic.alternates.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.cyrillic.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.extra.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.greek.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.latin-ext.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.latin.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.symbols.var.woff2 delete mode 100644 app/assets/fonts/Inter-italic.vietnamese.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.alternates.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.cyrillic.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.extra.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.greek.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.latin-ext.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.latin.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.symbols.var.woff2 delete mode 100644 app/assets/fonts/Inter-roman.vietnamese.var.woff2 diff --git a/app/assets/fonts/Inter-italic.alternates.var.woff2 b/app/assets/fonts/Inter-italic.alternates.var.woff2 deleted file mode 100644 index cbeb7846c3ecdfa4fb7b6c6fe0aa39f484ab8779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33192 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 diff --git a/app/assets/fonts/Inter-italic.cyrillic.var.woff2 b/app/assets/fonts/Inter-italic.cyrillic.var.woff2 deleted file mode 100644 index 90930a091a6f97cca5ba9b32f9c04c79dee5a6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37348 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 diff --git a/app/assets/fonts/Inter-italic.extra.var.woff2 b/app/assets/fonts/Inter-italic.extra.var.woff2 deleted file mode 100644 index cbeb7846c3ecdfa4fb7b6c6fe0aa39f484ab8779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33192 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 diff --git a/app/assets/fonts/Inter-italic.greek.var.woff2 b/app/assets/fonts/Inter-italic.greek.var.woff2 deleted file mode 100644 index c0684d11dbb11a173d6e87f4c180d7633888f981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31332 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

rb2k<9Dke!%sFiPAi^fB-fhiI8IEjcPKMc< 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 diff --git a/app/assets/fonts/Inter-italic.latin-ext.var.woff2 b/app/assets/fonts/Inter-italic.latin-ext.var.woff2 deleted file mode 100644 index be543c4215fb3a36b02b252a51ad8095e8f4dee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66708 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

<> Rakefile @@ -46,7 +46,7 @@ task :still_here do end EOF -cat >> app/assets/tailwind/application.tailwind.css <> app/assets/tailwind/application.css < Date: Mon, 27 Jan 2025 10:30:38 -0300 Subject: [PATCH 220/274] doc: update README with v4 class name upgrade instructions Co-authored-by: Mike Dalessio --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f9e51fdd..6634b074 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,9 @@ - [Upgrading your application from Tailwind v3 to v4](#upgrading-your-application-from-tailwind-v3-to-v4) * [You don't _have_ to upgrade](#you-dont-_have_-to-upgrade) * [Upgrade steps](#upgrade-steps) + * [Post Upgrade](#post-upgrade) * [Troubleshooting](#troubleshooting) + * [Updating CSS class names for v4](#updating-css-class-names-for-v4) - [Developing with Tailwindcss](#developing-with-tailwindcss) * [Configuration and commands](#configuration-and-commands) * [Building for production](#building-for-production) @@ -91,12 +93,41 @@ gem "tailwindcss-ruby", "~> 3.4" First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you're transitively depending on `tailwindcss-ruby` v4. -``` html + +```html # Gemfile gem "tailwindcss-rails", "~> 4.0" # which transitively pins tailwindcss-ruby to v4 ``` -Then, run the `tailwindcss:upgrade` task. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. +If you want to migrate class names for v4 (optional), apply this [step](#upgrading-class-names-for-v4) and continue this guide. + +Add the following line to the `.gitignore` file: + +```gitignore +/node_modules +``` +(So the Tailwind update tool won’t dig through your node_modules files and infer incorrect migrations, because it complies with ``.gitignore`` constraints) + +Then create a ``package.json`` in the root of the project: + +```jsonc +{ + "name": "app_name", + "version": "1.0.0", + "dependencies": { + "tailwindcss": "^3.4.17", // Mandatory!! + // Install all plugins and modules that are referenced in tailwind.config.js + "@tailwindcss/aspect-ratio": "^0.4.2", + "@tailwindcss/container-queries": "^0.1.1", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/typography": "^0.5.16" + // And so on... + } +} +``` +**Run** ``npm install`` (or ``yarn install`` if using ``yarn``) + +Then, **run** the `tailwindcss:upgrade` task. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. Here's what the upgrade task does: @@ -145,9 +176,13 @@ $ bin/rails tailwindcss:upgrade Done in 56ms run bundle install --quiet ``` - + +### Post Upgrade + + + If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide)! @@ -157,12 +192,36 @@ You may want to check out [TailwindCSS v4 - upgrade experience report · rails/t We know there are some cases we haven't addressed with the upgrade task: -- If the user isn’t using PostCSS, some migrations (e.g., updating class names in the view files) may fail - In setups without JavaScript tooling, the update process may fail to fully migrate `tailwind.config.js` because the tool assumes that the imported packages (e.g., tailwind plugins) are installed via a package manager, allowing them to be called. We'll try to improve the upgrade process over time, but for now you may need to do some manual work to upgrade. +### Updating CSS class names for v4 + +Before running the upgrade task, go to ``config/tailwind.config.js`` update the ``content`` part to: + +```js + content: [ + '../public/*.html', + '../app/helpers/**/*.rb', + '../app/javascript/**/*.js', + '../app/views/**/*.{erb,haml,html,slim}' + ], +``` +(Just add an additional ``.`` to all the paths referenced) + +Run the upstream upgrader as instructed above. + +Then, once you've run that successfully: + +- **Delete** ``package.json``, ``node_modules/`` and ``package-lock.json`` (or ``yarn.lock``), plus remove ``/node_modules`` from ``.gitignore``. +- **Go** to your CSS file and remove the following line (if present): + ```css + @plugin '@tailwindcss/container-queries'; + ``` + + ## Developing with Tailwindcss ### Configuration and commands From 63b3788ef834d950678966f85d21a19845ec8c3f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 27 Jan 2025 16:33:49 -0500 Subject: [PATCH 221/274] version bump to v4.0.0.rc4 --- CHANGELOG.md | 8 ++++---- Gemfile.lock | 5 ++--- README.md | 5 ----- lib/tailwindcss/version.rb | 2 +- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56fc71bb..7feef6d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,10 @@ -## next / unreleased +# `tailwindcss-rails` Changelog -## next rc / unreleased +## v4.0.0.rc4 / 2025-01-27 - The input file `app/assets/tailwind/application.tailwind.css` has been renamed to `app/assets/tailwind/application.css`. +- Updated README docs on using the upgrade tool to update class names. @EricGusmao -Thanks to @brunoprietog for feedback and advice. ## v4.0.0.rc3 / 2025-01-27 @@ -33,7 +33,7 @@ New task `tailwindcss:upgrade` upgrades many apps cleanly: - The "tailwind" stylesheet link tag will be removed if Propshaft is in use and already handling `app/assets/build/tailwind.css`. - The input file `application.tailwind.css` will be moved from `app/assets/stylesheets` to `app/assets/tailwind`. -Thanks to @EricGusmao, @patriciomacadden, and @excid3 for their feedback, contributions, and advice on the v4 release. +Thanks to @EricGusmao, @patriciomacadden, @excid3, and @brunoprietog for their feedback, contributions, and advice on v4 support. ## v3.3.1 / 2025-01-23 diff --git a/Gemfile.lock b/Gemfile.lock index 91f050ca..9c67e7d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (4.0.0.rc2) + tailwindcss-rails (4.0.0.rc4) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) @@ -65,7 +65,7 @@ GEM i18n (1.14.7) concurrent-ruby (~> 1.0) io-console (0.8.0) - irb (1.15.0) + irb (1.15.1) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) @@ -89,7 +89,6 @@ GEM net-protocol (0.2.2) timeout net-smtp (0.5.0) - net-protocol nokogiri (1.18.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) diff --git a/README.md b/README.md index 6634b074..37a42c8b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ - [Upgrading your application from Tailwind v3 to v4](#upgrading-your-application-from-tailwind-v3-to-v4) * [You don't _have_ to upgrade](#you-dont-_have_-to-upgrade) * [Upgrade steps](#upgrade-steps) - * [Post Upgrade](#post-upgrade) * [Troubleshooting](#troubleshooting) * [Updating CSS class names for v4](#updating-css-class-names-for-v4) - [Developing with Tailwindcss](#developing-with-tailwindcss) @@ -179,10 +178,6 @@ Done in 56ms -### Post Upgrade - - - If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide)! diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index d706a5b0..2e2dda5d 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.0.0.rc3" + VERSION = "4.0.0.rc4" end From 51efc7fda245ad973788c66f7c7473c940ca1a7f Mon Sep 17 00:00:00 2001 From: Eric Gusmao Date: Tue, 28 Jan 2025 06:12:56 -0300 Subject: [PATCH 222/274] fix: update postcss config path to root directory --- lib/tailwindcss/commands.rb | 2 +- test/lib/tailwindcss/commands_test.rb | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 4c90849e..fb90f4f6 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -14,7 +14,7 @@ def compile_command(debug: false, **kwargs) command << "--minify" unless (debug || rails_css_compressor?) - postcss_path = rails_root.join("config/postcss.config.js") + postcss_path = rails_root.join("postcss.config.js") command += ["--postcss", postcss_path.to_s] if File.exist?(postcss_path) command diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 60c073ed..3c7e5302 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -57,8 +57,7 @@ def setup assert_equal(executable, actual.first) refute_includes(actual, "--postcss") - config_file = Rails.root.join("config/postcss.config.js") - FileUtils.mkdir_p(Rails.root.join("config")) + config_file = Rails.root.join("postcss.config.js") FileUtils.touch(config_file) actual = Tailwindcss::Commands.compile_command assert_kind_of(Array, actual) From 43eeffd9171e9b271605803c7cb613a3e6b5aee4 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Tue, 28 Jan 2025 22:55:31 -0300 Subject: [PATCH 223/274] Hide tailwindcss:authentication from rails g --- .../tailwindcss/authentication/authentication_generator.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/generators/tailwindcss/authentication/authentication_generator.rb b/lib/generators/tailwindcss/authentication/authentication_generator.rb index aa6fc23b..756f1d7b 100644 --- a/lib/generators/tailwindcss/authentication/authentication_generator.rb +++ b/lib/generators/tailwindcss/authentication/authentication_generator.rb @@ -3,6 +3,8 @@ module Tailwindcss module Generators class AuthenticationGenerator < Erb::Generators::AuthenticationGenerator + hide! + source_root File.expand_path("templates", __dir__) end end From 738ba683a602eb2cb545ffd3b3a3dc70957354dc Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 29 Jan 2025 15:53:33 -0500 Subject: [PATCH 224/274] version bump to v4.0.0.rc5 --- CHANGELOG.md | 13 ++++++++----- Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7feef6d0..15e86e1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,14 @@ # `tailwindcss-rails` Changelog -## v4.0.0.rc4 / 2025-01-27 +## v4.0.0.rc5 / 2025-01-29 + +General changes since rc4: -- The input file `app/assets/tailwind/application.tailwind.css` has been renamed to `app/assets/tailwind/application.css`. -- Updated README docs on using the upgrade tool to update class names. @EricGusmao +- Update the rake tasks to detect an (optional) postcss file in the root directory, after moving the file in #466. #482 @EricGusmao +- Hide the gem's Rails generators in the `rails g --help` output. #483 @patriciomacadden -## v4.0.0.rc3 / 2025-01-27 +## v4.0.0.rc4 / 2025-01-27 ### Upgrade to Tailwind CSS v4 @@ -14,8 +16,9 @@ General changes: - Dependency on `tailwindcss-ruby` set to `~> 4.0`. - The location of (optional) `postcss.config.js` has moved from the `config/` directory to the app root. -- The location of `application.tailwind.css` has moved from `app/assets/stylesheets` to `app/assets/tailwind`. If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. +- The input file `app/assets/tailwind/application.tailwind.css` has been renamed to `app/assets/tailwind/application.css`. If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. - The Inter font is no longer packaged with the gem. +- Updated README to contain verbose instructions on upgrading. Changes to the `tailwindcss:install` task: diff --git a/Gemfile.lock b/Gemfile.lock index 9c67e7d9..f12b59ae 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (4.0.0.rc4) + tailwindcss-rails (4.0.0.rc5) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 2e2dda5d..acb989e3 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.0.0.rc4" + VERSION = "4.0.0.rc5" end From e37ed78f5aced5f8aac1a5176659c6e66734672b Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 31 Jan 2025 10:47:10 -0500 Subject: [PATCH 225/274] doc: update README upgrade guide for css class names I think 787bf269 left these instructions split across sections, I've tried to clean that up. --- README.md | 76 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 37a42c8b..01e27675 100644 --- a/README.md +++ b/README.md @@ -72,11 +72,11 @@ This gem will help with some of the mechanics of the upgrade, however. Keep in mind that you don't _need_ to upgrade. You can stay on Tailwind v3 for the foreseeable future if you prefer not to migrate now, or if your migration runs into problems. -Just make sure you're either pinned to v3.3.1 of this gem: +Just make sure you're pinned to v3.3.1 of this gem: ``` ruby # Gemfile -gem "tailwindcss-rails", "3.3.1" # which transitively pins tailwindcss-ruby to v3 +gem "tailwindcss-rails", "~> 3.3.1" # which transitively pins tailwindcss-ruby to v3 ``` or if you're on an earlier version of this gem, make sure you're pinning the version of **both** `tailwindcss-rails` and `tailwindcss-ruby`: @@ -84,7 +84,7 @@ or if you're on an earlier version of this gem, make sure you're pinning the ver ``` ruby # Gemfile gem "tailwindcss-rails", "~> 3.3" -gem "tailwindcss-ruby", "~> 3.4" +gem "tailwindcss-ruby", "~> 3.4" # only necessary with tailwindcss-rails < 3.3.1 ``` @@ -98,33 +98,7 @@ First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you gem "tailwindcss-rails", "~> 4.0" # which transitively pins tailwindcss-ruby to v4 ``` -If you want to migrate class names for v4 (optional), apply this [step](#upgrading-class-names-for-v4) and continue this guide. - -Add the following line to the `.gitignore` file: - -```gitignore -/node_modules -``` -(So the Tailwind update tool won’t dig through your node_modules files and infer incorrect migrations, because it complies with ``.gitignore`` constraints) - -Then create a ``package.json`` in the root of the project: - -```jsonc -{ - "name": "app_name", - "version": "1.0.0", - "dependencies": { - "tailwindcss": "^3.4.17", // Mandatory!! - // Install all plugins and modules that are referenced in tailwind.config.js - "@tailwindcss/aspect-ratio": "^0.4.2", - "@tailwindcss/container-queries": "^0.1.1", - "@tailwindcss/forms": "^0.5.10", - "@tailwindcss/typography": "^0.5.16" - // And so on... - } -} -``` -**Run** ``npm install`` (or ``yarn install`` if using ``yarn``) +If you want to migrate CSS class names for v4 (this is an optional step!), jump to [Updating CSS class names for v4](#updating-css-class-names-for-v4) before continuing. Then, **run** the `tailwindcss:upgrade` task. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. @@ -187,14 +161,42 @@ You may want to check out [TailwindCSS v4 - upgrade experience report · rails/t We know there are some cases we haven't addressed with the upgrade task: -- In setups without JavaScript tooling, the update process may fail to fully migrate `tailwind.config.js` because the tool assumes that the imported packages (e.g., tailwind plugins) are installed via a package manager, allowing them to be called. +- In setups without JavaScript tooling, the update process may fail to fully migrate `tailwind.config.js` because the tool assumes that the imported packages (e.g., tailwind plugins) are installed via a package manager, allowing them to be called. In this case, you should try following the instructions in [Updating CSS class names for v4](#updating-css-class-names-for-v4) which will install the needed javascript packages for the updater. We'll try to improve the upgrade process over time, but for now you may need to do some manual work to upgrade. ### Updating CSS class names for v4 -Before running the upgrade task, go to ``config/tailwind.config.js`` update the ``content`` part to: +With some additional manual work the upstream upgrade tool will update your application's CSS class names to v4 conventions. **This is an optional step that requires a Javascript toolchain!** + +**Add** the following line to the `.gitignore` file, to prevent the upstream upgrade tool from accessing node_modules files. + +```gitignore +/node_modules +``` + +**Create** a `package.json` in the root of the project: + +```jsonc +{ + "name": "app_name", + "version": "1.0.0", + "dependencies": { + "tailwindcss": "^3.4.17", // Mandatory!! + // Install all plugins and modules that are referenced in tailwind.config.js + "@tailwindcss/aspect-ratio": "^0.4.2", + "@tailwindcss/container-queries": "^0.1.1", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/typography": "^0.5.16" + // And so on... + } +} +``` + +**Run** `npm install` (or `yarn install` if using `yarn`) + +**Update** `config/tailwind.config.js` and temporarily change the `content` part to have an additional `.` on all paths so they are relative to the config file: ```js content: [ @@ -204,17 +206,19 @@ Before running the upgrade task, go to ``config/tailwind.config.js`` update the '../app/views/**/*.{erb,haml,html,slim}' ], ``` -(Just add an additional ``.`` to all the paths referenced) -Run the upstream upgrader as instructed above. +(Just add an additional `.` to all the paths referenced) + +**Run** the upstream upgrader as instructed above. -Then, once you've run that successfully: +Then, once you've run that successfully, clean up: -- **Delete** ``package.json``, ``node_modules/`` and ``package-lock.json`` (or ``yarn.lock``), plus remove ``/node_modules`` from ``.gitignore``. +- **Delete** `package.json`, `node_modules/` and `package-lock.json` (or `yarn.lock`), plus remove `/node_modules` from `.gitignore`. - **Go** to your CSS file and remove the following line (if present): ```css @plugin '@tailwindcss/container-queries'; ``` +- **Revert** the changes to `config/tailwind.config.js` so that paths are once again relative to the application root. ## Developing with Tailwindcss From 976ddab873cc58abd65f3a442f7b3aafd8ce7f21 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 31 Jan 2025 10:53:42 -0500 Subject: [PATCH 226/274] doc: emit a post-install message with a pointer to upgrade docs --- tailwindcss-rails.gemspec | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tailwindcss-rails.gemspec b/tailwindcss-rails.gemspec index 0b31c4a8..45c19c28 100644 --- a/tailwindcss-rails.gemspec +++ b/tailwindcss-rails.gemspec @@ -20,4 +20,18 @@ Gem::Specification.new do |spec| spec.add_dependency "railties", ">= 7.0.0" spec.add_dependency "tailwindcss-ruby", "~> 4.0" + + # TODO: remove this after a suitable period of time after the v4.0.0 release. + spec.post_install_message = <<~TEXT + == Upgrading to Tailwind CSS v4 == + + If you are upgrading to tailwindcss-rails 4.x, please read the upgrade guide at: + + https://github.com/rails/tailwindcss-rails/blob/main/README.md#upgrading-your-application-from-tailwind-v3-to-v4 + + If you're not ready to upgrade yet, please pin to version 3 in your Gemfile: + + gem "tailwindcss-rails", "~> 3.3.1" + + TEXT end From 0cc3f19b2b262e4cea2a35b83af6a0e0bf71d1eb Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 31 Jan 2025 12:45:58 -0500 Subject: [PATCH 227/274] doc: further improvements to the README Co-authored-by: Eric Gusmao --- README.md | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 01e27675..c8e67e3b 100644 --- a/README.md +++ b/README.md @@ -35,17 +35,17 @@ ## Installation -With Rails 7 you can generate a new application preconfigured with Tailwind by using `--css tailwind`. If you're adding Tailwind later, you need to: +With Rails 7 you can generate a new application preconfigured with Tailwind CSS by using `--css tailwind`. If you're adding Tailwind later, you need to: 1. Run `./bin/bundle add tailwindcss-rails` 2. Run `./bin/rails tailwindcss:install` -This gem depends on the `tailwindcss-ruby` gem to install a working tailwind executable. +This gem depends on the `tailwindcss-ruby` gem to install a working Tailwind CLI executable. ### Choosing a specific version of `tailwindcss` -The `tailwindcss-ruby` gem is declared as a floating dependency of this gem, so by default you will get the most recent stable version. However, you can select a specific version of tailwind by pinning that gem to the analogous version in your application's `Gemfile`. For example, +The `tailwindcss-ruby` gem is declared as a floating dependency of this gem, so by default you will get the most recent stable version. However, you can select a specific version of Tailwind CSS by pinning that gem to the analogous version in your application's `Gemfile`. For example, ``` ruby gem "tailwindcss-rails" @@ -63,35 +63,41 @@ You can also use a local (npm-based) installation if you prefer, please go to ht v4.x of this gem has been updated to work with Tailwind v4, including providing some help with upgrading your application. -A full explanation of a Tailwind v4 upgrade is out of scope for this README, so we strongly urge you to read the [official Tailwind v4 upgrade guide](https://tailwindcss.com/docs/upgrade-guide) before embarking on an upgrade to an existing large app. +A full explanation of a Tailwind CSS v4 upgrade is out of scope for this README, so we **strongly urge** you to read the [official Tailwind CSS v4 upgrade guide](https://tailwindcss.com/docs/upgrade-guide) before embarking on an upgrade to an existing large app. -This gem will help with some of the mechanics of the upgrade, however. +This gem will help with some of the mechanics of the upgrade: + +- update some generated files to handle breaking changes in v4 of this gem, +- update some local project files to meet some Tailwind CSS v4 conventions, +- attempt to run the [upstream v4 upgrade tool](https://tailwindcss.com/docs/upgrade-guide#using-the-upgrade-tool). ### You don't _have_ to upgrade -Keep in mind that you don't _need_ to upgrade. You can stay on Tailwind v3 for the foreseeable future if you prefer not to migrate now, or if your migration runs into problems. +Keep in mind that you don't _need_ to upgrade. You can stay on Tailwind CSS v3 for the foreseeable future if you prefer not to migrate now, or if your migration runs into problems. -Just make sure you're pinned to v3.3.1 of this gem: +If you don't want to upgrade, then pin your application to v3.3.1 of this gem: ``` ruby # Gemfile gem "tailwindcss-rails", "~> 3.3.1" # which transitively pins tailwindcss-ruby to v3 ``` -or if you're on an earlier version of this gem, make sure you're pinning the version of **both** `tailwindcss-rails` and `tailwindcss-ruby`: +If you're on an earlier version of this gem, `<= 3.3.0`, then make sure you're pinning the version of **both** `tailwindcss-rails` and `tailwindcss-ruby`: ``` ruby # Gemfile gem "tailwindcss-rails", "~> 3.3" -gem "tailwindcss-ruby", "~> 3.4" # only necessary with tailwindcss-rails < 3.3.1 +gem "tailwindcss-ruby", "~> 3.4" # only necessary with tailwindcss-rails <= 3.3.0 ``` ### Upgrade steps -First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you're transitively depending on `tailwindcss-ruby` v4. +> [!WARNING] +> In applications using Tailwind plugins without JavaScript tooling, these upgrade steps may fail to fully migrate `tailwind.config.js` because the upstream upgrade tool needs the Tailwind plugins to be installed and available through a JavaScript package manager. If you see errors from the upstream upgrade tool, you should try following the additional steps in [Updating CSS class names for v4](#updating-css-class-names-for-v4) which will help you install (temporarily!) the necessary packages and clean up afterwards. +First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you're transitively depending on `tailwindcss-ruby` v4. ```html # Gemfile @@ -100,9 +106,10 @@ gem "tailwindcss-rails", "~> 4.0" # which transitively pins tailwindcss-ruby to If you want to migrate CSS class names for v4 (this is an optional step!), jump to [Updating CSS class names for v4](#updating-css-class-names-for-v4) before continuing. -Then, **run** the `tailwindcss:upgrade` task. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. +Then, run `bin/rails tailwindcss:upgrade`. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. -Here's what the upgrade task does: +
+Here's a detailed list of what the upgrade task does. - Cleans up some things in the generated `config/tailwind.config.js`. - If present, moves `config/postcss.config.js` to the root directory. @@ -111,6 +118,8 @@ Here's what the upgrade task does: - Removes references to the Inter font from the application layout. - Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). +
+
Here's what that upgrade looks like on a vanilla Rails app. @@ -152,7 +161,7 @@ Done in 56ms
-If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide)! +If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide) and try following the additional steps in [Updating CSS class names for v4](#updating-css-class-names-for-v4). ### Troubleshooting @@ -161,14 +170,17 @@ You may want to check out [TailwindCSS v4 - upgrade experience report · rails/t We know there are some cases we haven't addressed with the upgrade task: -- In setups without JavaScript tooling, the update process may fail to fully migrate `tailwind.config.js` because the tool assumes that the imported packages (e.g., tailwind plugins) are installed via a package manager, allowing them to be called. In this case, you should try following the instructions in [Updating CSS class names for v4](#updating-css-class-names-for-v4) which will install the needed javascript packages for the updater. +- In applications using Tailwind plugins without JavaScript tooling, these upgrade steps may fail to fully migrate `tailwind.config.js` because the upstream upgrade tool needs the Tailwind plugins to be installed and available through a JavaScript package manager. If you see errors from the upstream upgrade tool, you should try following the additional steps in [Updating CSS class names for v4](#updating-css-class-names-for-v4) which will help you install (temporarily!) the necessary packages and clean up afterwards. We'll try to improve the upgrade process over time, but for now you may need to do some manual work to upgrade. ### Updating CSS class names for v4 -With some additional manual work the upstream upgrade tool will update your application's CSS class names to v4 conventions. **This is an optional step that requires a Javascript toolchain!** +> [!NOTE] +> If you'd like to help automate these steps, please drop a note to the maintainers in [this discussion thread](https://github.com/rails/tailwindcss-rails/discussions/450). + +With some additional manual work the upstream upgrade tool will update your application's CSS class names to v4 conventions. **This is an optional step that requires a JavaScript toolchain.** **Add** the following line to the `.gitignore` file, to prevent the upstream upgrade tool from accessing node_modules files. @@ -315,7 +327,7 @@ Running `bin/dev` invokes Foreman to start both the Tailwind watch process and t ### Using with PostCSS -If you want to use PostCSS as a preprocessor, create a custom `postcss.config.js` in your project root directory, and that file will be loaded by tailwind automatically. +If you want to use PostCSS as a preprocessor, create a custom `postcss.config.js` in your project root directory, and that file will be loaded by Tailwind automatically. For example, to enable nesting: @@ -328,7 +340,7 @@ export default { } ``` -⚠ Note that PostCSS is a javascript tool with its own prerequisites! By default `tailwindcss-rails` does not require any javascript tooling, so in order to use PostCSS, a `package.json` with dependencies for your plugins and a package manager like `yarn` or `npm` is required, for example: +⚠ Note that PostCSS is a JavaScript tool with its own prerequisites! By default `tailwindcss-rails` does not require any JavaScript tooling, so in order to use PostCSS, a `package.json` with dependencies for your plugins and a package manager like `yarn` or `npm` is required, for example: ```json // package.json From 3d8710440e7c0cff25c0273fed3744bf9b4b8842 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 1 Feb 2025 12:06:26 -0500 Subject: [PATCH 228/274] version bump to v4.0.0 --- CHANGELOG.md | 28 +++++++++++----------------- lib/tailwindcss/version.rb | 2 +- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15e86e1b..686bfe5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,40 +1,34 @@ # `tailwindcss-rails` Changelog -## v4.0.0.rc5 / 2025-01-29 - -General changes since rc4: - -- Update the rake tasks to detect an (optional) postcss file in the root directory, after moving the file in #466. #482 @EricGusmao -- Hide the gem's Rails generators in the `rails g --help` output. #483 @patriciomacadden - - -## v4.0.0.rc4 / 2025-01-27 +## v4.0.0 / 2025-02-01 ### Upgrade to Tailwind CSS v4 General changes: -- Dependency on `tailwindcss-ruby` set to `~> 4.0`. +- The dependency on `tailwindcss-ruby` is set to `~> 4.0`. - The location of (optional) `postcss.config.js` has moved from the `config/` directory to the app root. -- The input file `app/assets/tailwind/application.tailwind.css` has been renamed to `app/assets/tailwind/application.css`. If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. +- The input file `app/assets/tailwind/application.tailwind.css` has been renamed to `app/assets/tailwind/application.css`. +- If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. - The Inter font is no longer packaged with the gem. -- Updated README to contain verbose instructions on upgrading. +- Some Tailwind class names in the generated ERB templates are updated for v4. +- The README is updated to contain verbose instructions on upgrading. +- The gem's Rails generators are now hidden in the `rails g --help` output. #483 @patriciomacadden Changes to the `tailwindcss:install` task: -- The `tailwindcss:install` task no longer installs `config/tailwind.config.js`. +- The `tailwindcss:install` task no longer installs `config/tailwind.config.js`, as v4 recommends placing Tailwind configuration in the CSS file. - The Inter font is no longer configured in the application layout. -- Some Tailwind class names in the ERB templates are updated for v4. -- The "tailwind" stylesheet link tag will only be added to the application layout if Propshaft isn't in use and already handling `app/assets/build/tailwind.css`. Previously it was always injected, resulting in the tag being rendered twice if Propshaft was in use. +- The "tailwind" stylesheet link tag will only be added to the application layout if Propshaft isn't in use and therefore already handling `app/assets/build/tailwind.css`. Previously it was always injected, resulting in the tag being rendered twice if Propshaft was in use. New task `tailwindcss:upgrade` upgrades many apps cleanly: -- Cleans up some things in the generated `config/tailwind.config.js`. +- Cleans up `config/tailwind.config.js` and references it from the CSS file as recommended for v4 upgrades. - Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). - Removes configuration for the Inter font from the application layout. - If present, moves `config/postcss.config.js` to the root directory. - The "tailwind" stylesheet link tag will be removed if Propshaft is in use and already handling `app/assets/build/tailwind.css`. -- The input file `application.tailwind.css` will be moved from `app/assets/stylesheets` to `app/assets/tailwind`. +- The input file `app/assets/tailwind/application.tailwind.css` will be moved to `app/assets/tailwind/application.css`. Thanks to @EricGusmao, @patriciomacadden, @excid3, and @brunoprietog for their feedback, contributions, and advice on v4 support. diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index acb989e3..144cea79 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.0.0.rc5" + VERSION = "4.0.0" end From 5a9dd5eb4a269261eef0f0f1f1b2ea47cd2dea71 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 1 Feb 2025 12:12:55 -0500 Subject: [PATCH 229/274] Small change to CHANGELOG and bump Gemfile.lock --- CHANGELOG.md | 4 +++- Gemfile.lock | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 686bfe5d..4ad84a2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,6 @@ General changes: - The Inter font is no longer packaged with the gem. - Some Tailwind class names in the generated ERB templates are updated for v4. - The README is updated to contain verbose instructions on upgrading. -- The gem's Rails generators are now hidden in the `rails g --help` output. #483 @patriciomacadden Changes to the `tailwindcss:install` task: @@ -32,6 +31,9 @@ New task `tailwindcss:upgrade` upgrades many apps cleanly: Thanks to @EricGusmao, @patriciomacadden, @excid3, and @brunoprietog for their feedback, contributions, and advice on v4 support. +### Other changes + +- The gem's Rails generators are now hidden in the `rails g --help` output. #483 @patriciomacadden ## v3.3.1 / 2025-01-23 diff --git a/Gemfile.lock b/Gemfile.lock index f12b59ae..6a2c9e0e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (4.0.0.rc5) + tailwindcss-rails (4.0.0) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) From 161febcd7975b999747d785db40785d60797fb76 Mon Sep 17 00:00:00 2001 From: Syed Fazil Basheer <27231393+frayzil@users.noreply.github.com> Date: Sun, 2 Feb 2025 11:14:14 +0530 Subject: [PATCH 230/274] doc: Add to v3-v4 upgrade guide about custom css files --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index c8e67e3b..afaa2fff 100644 --- a/README.md +++ b/README.md @@ -221,6 +221,17 @@ With some additional manual work the upstream upgrade tool will update your appl (Just add an additional `.` to all the paths referenced) +**Update** references to any existing css files imported in the `app/assets/stylesheets/application.tailwind.css` +```diff + @import "tailwindcss/components"; + @import "tailwindcss/utilities"; + +-@import "pagy.css"; +-@import "new_case.css"; ++@import "../stylesheets/pagy.css"; ++@import "../stylesheets/new_case.css"; +``` + **Run** the upstream upgrader as instructed above. Then, once you've run that successfully, clean up: From 716406fad1985314f4aa3bfa94077a7497eb0ee6 Mon Sep 17 00:00:00 2001 From: Syed Fazil Basheer <27231393+frayzil@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:27:20 +0530 Subject: [PATCH 231/274] doc: Concise docs for v3-v4 upgrade guide --- README.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index afaa2fff..61b4e02a 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,12 @@ First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you gem "tailwindcss-rails", "~> 4.0" # which transitively pins tailwindcss-ruby to v4 ``` +**Update** references to any existing css files imported in `application.tailwind.css` +```diff +-@import "pagy.css"; ++@import "../stylesheets/pagy.css"; +``` + If you want to migrate CSS class names for v4 (this is an optional step!), jump to [Updating CSS class names for v4](#updating-css-class-names-for-v4) before continuing. Then, run `bin/rails tailwindcss:upgrade`. Among other things, this will try to run the official Tailwind upgrade utility. It requires `npx` in order to run, but it's a one-time operation and is *highly recommended* for a successful upgrade. @@ -221,17 +227,6 @@ With some additional manual work the upstream upgrade tool will update your appl (Just add an additional `.` to all the paths referenced) -**Update** references to any existing css files imported in the `app/assets/stylesheets/application.tailwind.css` -```diff - @import "tailwindcss/components"; - @import "tailwindcss/utilities"; - --@import "pagy.css"; --@import "new_case.css"; -+@import "../stylesheets/pagy.css"; -+@import "../stylesheets/new_case.css"; -``` - **Run** the upstream upgrader as instructed above. Then, once you've run that successfully, clean up: @@ -243,7 +238,6 @@ Then, once you've run that successfully, clean up: ``` - **Revert** the changes to `config/tailwind.config.js` so that paths are once again relative to the application root. - ## Developing with Tailwindcss ### Configuration and commands From 6df40af0f17f49818020e255c18d5326d5588ea8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 3 Feb 2025 08:34:28 -0500 Subject: [PATCH 232/274] doc: tweak README [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 61b4e02a..6a9f0d2c 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,8 @@ First, update to `tailwindcss-rails` v4.0.0 or higher. This will also ensure you gem "tailwindcss-rails", "~> 4.0" # which transitively pins tailwindcss-ruby to v4 ``` -**Update** references to any existing css files imported in `application.tailwind.css` +**Update** path references to any existing css files imported in `app/assets/stylesheets/application.tailwind.css` so that they will resolve when the file is moved to `app/assets/tailwind/application.css`. + ```diff -@import "pagy.css"; +@import "../stylesheets/pagy.css"; From 024438bfa64f4b659db7df4cd89b6e173421062b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:30:51 +0000 Subject: [PATCH 233/274] build(deps): bump tailwindcss-ruby from 4.0.0 to 4.0.3 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.0 to 4.0.3. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/v4.x/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.0...v4.0.3) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6a2c9e0e..4439ff52 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,11 +139,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.2) - tailwindcss-ruby (4.0.0) - tailwindcss-ruby (4.0.0-aarch64-linux-gnu) - tailwindcss-ruby (4.0.0-arm64-darwin) - tailwindcss-ruby (4.0.0-x86_64-darwin) - tailwindcss-ruby (4.0.0-x86_64-linux-gnu) + tailwindcss-ruby (4.0.3) + tailwindcss-ruby (4.0.3-aarch64-linux-gnu) + tailwindcss-ruby (4.0.3-arm64-darwin) + tailwindcss-ruby (4.0.3-x86_64-darwin) + tailwindcss-ruby (4.0.3-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From a2eb839750ef90af8355072ac15768a738553c6c Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 4 Feb 2025 09:41:10 -0500 Subject: [PATCH 234/274] show focus outlines Fixes #489 --- .../templates/app/views/passwords/edit.html.erb | 4 ++-- .../templates/app/views/passwords/new.html.erb | 2 +- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb index 5c989810..1296be6f 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb @@ -7,11 +7,11 @@ <%%= form_with url: password_path(params[:token]), method: :put, class: "contents" do |form| %>
- <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 outline-hidden focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 focus:outline-solid focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
- <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 outline-hidden focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72, class: "block shadow-sm rounded-md border border-gray-400 focus:outline-solid focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb index e5862200..c37333e6 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb @@ -7,7 +7,7 @@ <%%= form_with url: passwords_path, class: "contents" do |form| %>
- <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow-sm rounded-md border border-gray-400 outline-hidden focus:outline-blue-600 px-3 py-2 mt-2 w-full" %> + <%%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "username", placeholder: "Enter your email address", value: params[:email_address], class: "block shadow-sm rounded-md border border-gray-400 focus:outline-solid focus:outline-blue-600 px-3 py-2 mt-2 w-full" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 9e392609..f9515541 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -15,23 +15,23 @@
<% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.password_field :password, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %>
<%%= form.label :password_confirmation %> - <%%= form.password_field :password_confirmation, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> + <%%= form.password_field :password_confirmation, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border focus:outline-solid mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% else -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border outline-hidden px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% end -%> <% end -%>
From b1fd8a581111ae061ae06d5180a3237a86281f0f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Feb 2025 13:41:09 -0500 Subject: [PATCH 235/274] Drop `focus:outline-solid` from form field CSS classes because I like the brighter focus highlight, especially if it's used to indicate fields with validation errors. --- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index f9515541..0858f34f 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -15,23 +15,23 @@
<% if attribute.password_digest? -%> <%%= form.label :password %> - <%%= form.password_field :password, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.password_field :password, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %>
<%%= form.label :password_confirmation %> - <%%= form.password_field :password_confirmation, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> + <%%= form.password_field :password_confirmation, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, rows: 4, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% elsif attribute.field_type == :checkbox || attribute.field_type == :check_box -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border focus:outline-solid mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border mt-2 h-5 w-5", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% else -%> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border focus:outline-solid px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% end -%> <% end -%>
From e79c0c2445d31514952fd36b4f7a08eb2ca1d795 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Feb 2025 13:44:08 -0500 Subject: [PATCH 236/274] doc: update CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ad84a2a..d0b1737c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # `tailwindcss-rails` Changelog +## next / unreleased + +Style changes to templates: + +* Field outlines are no longer hidden, and the focus border is brighter. #489 @rubys + + ## v4.0.0 / 2025-02-01 ### Upgrade to Tailwind CSS v4 From 28b246dbeb2ff5bba2b4e9594124c5b2303a3ed1 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Fri, 7 Feb 2025 10:08:52 -0300 Subject: [PATCH 237/274] Remove inter font license from the README as the font is no longer packaged --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6a9f0d2c..649feb2b 100644 --- a/README.md +++ b/README.md @@ -422,4 +422,3 @@ The inline version also works: ## License Tailwind for Rails is released under the [MIT License](https://opensource.org/licenses/MIT). -The Inter font is released under the [SIL Open Font License, Version 1.1](https://github.com/rsms/inter/blob/master/LICENSE.txt). From 37d5093dc818b41839b03b34db9c2fcbd556fe77 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 9 Feb 2025 10:59:32 -0500 Subject: [PATCH 238/274] test: update the integration install test to use static variable In tailwindcss v4.0.5, tailwindlabs/tailwindcss#16211 is smarter about not including unused theme variables, but `static` is the documented way to opt into the older behavior. --- test/integration/user_install_test.sh | 5 +++-- test/integration/user_upgrade_test.sh | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index 09b03b2f..df3aa8f2 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -7,7 +7,8 @@ set -eux # set up dependencies rm -f Gemfile.lock -bundle remove actionmailer +bundle remove actionmailer || true +bundle remove rails || true bundle add rails --skip-install ${RAILSOPTS:-} bundle install --prefer-local @@ -47,7 +48,7 @@ end EOF cat >> app/assets/tailwind/application.css <<49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 14:15:01 +0000 Subject: [PATCH 239/274] build(deps): bump tailwindcss-ruby from 4.0.3 to 4.0.6 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.3 to 4.0.6. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/v4.x/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.3...v4.0.6) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4439ff52..1e88abcd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,11 +139,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.2) - tailwindcss-ruby (4.0.3) - tailwindcss-ruby (4.0.3-aarch64-linux-gnu) - tailwindcss-ruby (4.0.3-arm64-darwin) - tailwindcss-ruby (4.0.3-x86_64-darwin) - tailwindcss-ruby (4.0.3-x86_64-linux-gnu) + tailwindcss-ruby (4.0.6) + tailwindcss-ruby (4.0.6-aarch64-linux-gnu) + tailwindcss-ruby (4.0.6-arm64-darwin) + tailwindcss-ruby (4.0.6-x86_64-darwin) + tailwindcss-ruby (4.0.6-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From cdafb1b5d8eb6c207cd2321be35dab827b1df08c Mon Sep 17 00:00:00 2001 From: hachi8833 Date: Mon, 17 Feb 2025 13:07:16 +0900 Subject: [PATCH 240/274] Update Readme link for fingerprinting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 649feb2b..7fa18145 100644 --- a/README.md +++ b/README.md @@ -397,7 +397,7 @@ See https://github.com/flavorjones/tailwindcss-ruby for help. ### Using asset-pipeline assets -In Rails, you want to use [assets from the asset pipeline to get fingerprinting](https://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care-questionmark). However, Tailwind isn't aware of those assets. +In Rails, you want to use [assets from the asset pipeline to get fingerprinting](https://guides.rubyonrails.org/asset_pipeline.html#fingerprinting-versioning-with-digest-based-urls). However, Tailwind isn't aware of those assets. To use assets from the pipeline, use `url(image.svg)`. [Since Sprockets v3.3.0](https://github.com/rails/sprockets-rails/pull/476) `url(image.svg)` is rewritten to `/path/to/assets/image-7801e7538c6f1cc57aa75a5876ab0cac.svg` so output CSS will have the correct path to those assets. From dc8251df17086995686e85fdb9bfa9fde731997a Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Mon, 20 Jan 2025 22:50:44 -0300 Subject: [PATCH 241/274] index: show the actions to the right of the partial and add a division between objects --- .../scaffold/templates/index.html.erb.tt | 16 +++++++++++----- test/integration/user_install_test.sh | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index 3d337f95..71b7ec23 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -10,13 +10,19 @@ <%%= link_to "New <%= human_name.downcase %>", new_<%= singular_route_name %>_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
-
+
<%% if @<%= plural_table_name %>.any? %> <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %> - <%%= render <%= singular_table_name %> %> -

- <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> -

+
+ <%%= render <%= singular_table_name %> %> +
+ <%%= link_to "Show", <%= model_resource_name(singular_table_name) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Edit", edit_<%= singular_route_name %>_path(<%= singular_table_name %>), class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
+ <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium" %> +
+
+
<%% end %> <%% else %>

No <%= human_name.downcase.pluralize %> found.

diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index df3aa8f2..6f4ca301 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -61,7 +61,7 @@ fi # TEST: presence of the generated file bin/rails generate scaffold post title:string body:text published:boolean -grep -q "Show this post" app/views/posts/index.html.erb +grep -q "Show" app/views/posts/index.html.erb # TEST: contents of the css file bin/rails tailwindcss:build[verbose] From ad98417f261dee5a6538489f2e48a083c60fcd7d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Feb 2025 10:41:30 -0500 Subject: [PATCH 242/274] Simplify index page edit button to use edit_helper --- lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index 71b7ec23..7e9b26af 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -17,7 +17,7 @@ <%%= render <%= singular_table_name %> %>
<%%= link_to "Show", <%= model_resource_name(singular_table_name) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> - <%%= link_to "Edit", edit_<%= singular_route_name %>_path(<%= singular_table_name %>), class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Edit", <%= edit_helper(singular_table_name, type: :path) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
<%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium" %>
From db51cda12e187d53c4ade34526b35451591b194a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Feb 2025 11:07:17 -0500 Subject: [PATCH 243/274] doc: update CHANGELOG [skip ci] --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0b1737c..7030e848 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ Style changes to templates: * Field outlines are no longer hidden, and the focus border is brighter. #489 @rubys +* Boolean fields are improved (checkbox labels aligned, "Yes"/"No" instead of "true"/"false"). #454 @patriciomacadden +* Attachment links are consistently spaced and styled. #460 @patriciomacadden +* Index page links to Show, Edit, and Destroy for each resource. #460 @patriciomacadden @flavorjones ## v4.0.0 / 2025-02-01 From bf0b18fd28c07da6391b6b1808ee800371561967 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Wed, 12 Feb 2025 11:25:52 -0300 Subject: [PATCH 244/274] Add turbo confirm prompt --- lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt | 2 +- lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index 7e9b26af..83d2b1ec 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -19,7 +19,7 @@ <%%= link_to "Show", <%= model_resource_name(singular_table_name) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> <%%= link_to "Edit", <%= edit_helper(singular_table_name, type: :path) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
- <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium" %> + <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index 3a49e9a0..b3057f99 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -12,6 +12,6 @@ <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "mt-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
- <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium" %> + <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
From 215b54bf9a6d62634a7523f853639f108b9c6a34 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Feb 2025 12:50:48 -0500 Subject: [PATCH 245/274] version bump to v4.1.0 --- CHANGELOG.md | 5 +++-- lib/tailwindcss/version.rb | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7030e848..e75b884b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,14 @@ # `tailwindcss-rails` Changelog -## next / unreleased +## v4.1.0 / 2025-02-19 -Style changes to templates: +### View template improvements * Field outlines are no longer hidden, and the focus border is brighter. #489 @rubys * Boolean fields are improved (checkbox labels aligned, "Yes"/"No" instead of "true"/"false"). #454 @patriciomacadden * Attachment links are consistently spaced and styled. #460 @patriciomacadden * Index page links to Show, Edit, and Destroy for each resource. #460 @patriciomacadden @flavorjones +* Turbo confirm prompt added to Destroy links. #498 @patriciomacadden ## v4.0.0 / 2025-02-01 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 144cea79..7a096603 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.0.0" + VERSION = "4.1.0" end From 2db5427ac6c086a74ad93752c1ee91990a6f7eda Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Feb 2025 12:52:00 -0500 Subject: [PATCH 246/274] dep: bundle update --- Gemfile.lock | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1e88abcd..730f94fb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (4.0.0) + tailwindcss-rails (4.1.0) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) @@ -69,7 +69,7 @@ GEM pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - logger (1.6.5) + logger (1.6.6) loofah (2.24.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -81,26 +81,27 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) - net-imap (0.5.5) + net-imap (0.5.6) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.5.0) - nokogiri (1.18.2) + net-smtp (0.5.1) + net-protocol + nokogiri (1.18.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.2-aarch64-linux-gnu) + nokogiri (1.18.3-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.2-arm-linux-gnu) + nokogiri (1.18.3-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.2-arm64-darwin) + nokogiri (1.18.3-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.2-x86_64-darwin) + nokogiri (1.18.3-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.2-x86_64-linux-gnu) + nokogiri (1.18.3-x86_64-linux-gnu) racc (~> 1.4) pp (0.6.2) prettyprint @@ -109,7 +110,7 @@ GEM date stringio racc (1.8.1) - rack (3.1.8) + rack (3.1.10) rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) @@ -133,24 +134,24 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.2.1) - rdoc (6.11.0) + rdoc (6.12.0) psych (>= 4.0.0) reline (0.6.0) io-console (~> 0.5) securerandom (0.4.1) - stringio (3.1.2) - tailwindcss-ruby (4.0.6) - tailwindcss-ruby (4.0.6-aarch64-linux-gnu) - tailwindcss-ruby (4.0.6-arm64-darwin) - tailwindcss-ruby (4.0.6-x86_64-darwin) - tailwindcss-ruby (4.0.6-x86_64-linux-gnu) + stringio (3.1.3) + tailwindcss-ruby (4.0.7) + tailwindcss-ruby (4.0.7-aarch64-linux-gnu) + tailwindcss-ruby (4.0.7-arm64-darwin) + tailwindcss-ruby (4.0.7-x86_64-darwin) + tailwindcss-ruby (4.0.7-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uri (1.0.2) useragent (0.16.11) - zeitwerk (2.7.1) + zeitwerk (2.7.2) PLATFORMS aarch64-linux From 51f6aba9f37410e09f2b23b0dead3b61c3dc4278 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Thu, 20 Feb 2025 12:56:16 -0300 Subject: [PATCH 247/274] Improve views for mobile devices --- .../templates/app/views/passwords/edit.html.erb | 2 +- .../templates/app/views/passwords/new.html.erb | 2 +- .../templates/app/views/sessions/new.html.erb | 2 +- .../tailwindcss/scaffold/templates/_form.html.erb.tt | 2 +- .../tailwindcss/scaffold/templates/edit.html.erb.tt | 4 ++-- .../tailwindcss/scaffold/templates/index.html.erb.tt | 12 ++++++------ .../tailwindcss/scaffold/templates/new.html.erb.tt | 2 +- .../scaffold/templates/partial.html.erb.tt | 2 +- .../tailwindcss/scaffold/templates/show.html.erb.tt | 8 ++++---- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb index 1296be6f..7096a5bc 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/edit.html.erb @@ -15,7 +15,7 @@
- <%%= form.submit "Save", class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit "Save", class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
<%% end %>

vy&C08ofAlD-|EH^E;EVm)|uiPID6r+IIhcUr8 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 W8mqJ4=Ig)hcL3V0Pd@*@48kl*_ALtl diff --git a/app/assets/fonts/Inter-italic.latin.var.woff2 b/app/assets/fonts/Inter-italic.latin.var.woff2 deleted file mode 100644 index 5066cfdf367228849468b79a9d0b91121f7215f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56108 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Μ3nT1$N*2S#`6Qu8t9luJz ze%)XQzLw(p^Q)bLruw>;tYc_1zAtJHo zfXtB-XD(d1aYsSr!85YuhmH`0<-=|d)NJl>gjw+EAA=csQ9DoIIF(j*;aIGMxC5O0PZNB1JDQGlX!`Hr z_L$CG(cu!AR;q!_rfQF;4>1`D0bdqmRA$4>-6x-3Kr}%DyonLFb=9D=xH4;#->sFd zs$MsPCu6oG!$DJ}y&@>p+g{b>Ru#>&_aKJ96&w<9AvQRYp3iRh3Ymd5`R8BQcW&h+ z1OTp)NN95CKzeCDZ{fzMV0u#?3?Z9A83 z>4%Fzy9$wT?f=GoNj(7r0Lklq0Hf?+k>UunixQU82e*?H&9n`vAwqf?=75OAm;h~c zGiPXUR1Jq~TW;5E4bYbQB5D`zZJ8ZnFzB~MPf#C#B;ygRb&2{}`G()s_MTqo8?>y* zvA!fP!u$Syb=XD!d>D)szZD{b>;1btUu0nT?>4{*)ECimVH^i}*KbB}W2lQ_A9VOR z3{(a$Wc#^)sH}Ew)4uH&EIz9TFx2MKmLB*;1}4!a1kh%#x>x@(7Y8^ zB-%iIzr548@%{ggWe9#OUj!RlZk_cLJ_3Ll_B&u62m4*~;Tw;H7}Ocqq(3Wt8R@Jk zpY-DQZ5aaaA9%6!gNXF5uADx!=`5H$`plV-;|zR<3bPLbZ8d319ZO205C`+b-C`<72)MjiQ`r62$0L4M*-&V1! zVX~h)l=0AacTU#{`Xcnw@SB0`qlYdZ#hF9r7|br~Jv+DFaSw-bjQLc=6YMwm2d4`AOO#ZWf#@lv8| zLnF@+jy|rDdlZVX3yti(J4))*ua2DIV@WeInk65{D0m2fRcG739RR#3v4I&0&K}8d zo6?e{*oB^R{|_sUA+wrnI>*vI>(uLVco=J8KIn?JUSH{nVmEy%8BAjgu zy;&gEdtUcPzYU)bP?TRlegOK>UXi-UA40@3=*OT*9{_JgKIiiag_YquawlEVm5%T_AAW5(D@j zN(}&DtMmM9-1kqF_4>c-mc#%K_HBUWXA`b_dvqcu4a*%CbuY2ehvu`?iu+vjzHjd9 zA&`S9-xEt<}K;U*AWWLYAE6E}4b3N&#sO@?A#@Po3M`?*lbqru6pO7?ZIc5qnKz6AG3maiFt?lM@>`BTP;UzPVK4MTXn2DTm7>}Dpmt4 z#y-@v(Y&Rlp=G7jbV%<|$f0#y8m>j#UHi>p@56;hz>%{@y6~!a9lR0V4)1|y;bZX` z_#%7*z6XCBKaYQke~bU3Bcn5^^WRbBqvWH%`Ly|OuD6=j()L^Jzx2IyPV@9lqnRd~ zlNZ7g0;pgN8+gN4;0BDOz!d@K58C)k%ZBqKug}$UQHgb^@_j$z*7u@ogm;B*D z9^-jl7bSXWh{{Py8OUC)$}Q=YsP5IKnyxj`M#s9+yMCc<+ON~Pq^h0mX$QMuJ;u4& zNB;96$3EwBe1#%Rk;fn|(ZwUWVj9P1F=z2-%g#BR%Qz=7)-dK8R~tVt{%V3Xg_@?C zJ~V@wg_@0;y)*YWFEbxA|JUM_#d(V=i+M}5Wtiot<$Eg^D}mKbt7WTy&mTP>cs~F9 z;`u+UjjU^}7i~0cF4^?jp0sVS{l!kk?x-EfF4!*FuF|f>uGenFZpLoePHMMh_t|bQ z1xmya@k9fn1(8go5m`hoF@-21mJ%C@UBn^c1aXnLM%*NRApT8~C!t6ww$f@K)aviyge2aXayh`3A!<^(Hlp)3( zNog3d;6f!W^fJN>BTS*_bks*L)vHt2byp8Gt{E-qxoI<-ZL@FwTTv{y*|>SRMYxT* zZMbW?o4AL$-*^9y0;QlRSjrK~DT+D8A=jo+Sd=hI%s)9kQ4dnhse#l=>MiPX>R%pb zJfb{mJ!U;&o(xaEXOm~A=QYn!&uPy^&kvq|(PU^!G*y~5?KtfW?L3V_TcZ8&()2p% zW#yIT)$TR!wdnQTTi#pMo8W!Un@(4wbLdm_4IiwJxsR*QZJ&n>T}CWJ!uZI9Fb^@! zm@do^<`-W@U!1R@ui;$f2vF5GAOc@#KrjH<4blyZb#nLY!r07t!FPb!`q9kNA@^BS z>y~gvsr%R6;ZQ$%K+)FM;Eo+w2!_0#04HI&gUjyM>EH-=EJQ(K2iNG?4@>ZqjodTv zgx>{4Igg>Ot%T5kWT`;vVnMHa`7Oq8%WaLa6h3OwRSUHeD z<0KTK=}H!utxYEH%K}#kEG*UO)6R?g6prL$wIU1c-axe_=)Q(ehKvbHRvbW~$U(h$ z(4dEqK!eULiV))$j8X#YIjT;(-A~IbO}5x_c?p(*?3IiBdO`siH=m%^^$&vgC!MK_ zzQiT6&9Wx$6bYPvjF#TEGDB_jgjjcQ%Fg7DVUy6TNKg~O4VO4kz}UAZy_{&FdT{r0 zc3B;{7keWc&#Pe3*}pPDd6)HO0u06q&}?Qg0SbjiwI}U7Lu-M|g}X?~9!Mr_fuxok z(I7RAvstf)gI&PyMS}H5$xZ}OnRGUyQF%i&W~%e2Lk52x$lI~?=UhDJD%1cRbRuIG z47gbB%f;Nu;>;~hfpNb)mSkVp?-mOy!Bwb!FqXAJXsnULuH@+fAQw+9Z(K-#M;qc@ z2&8PB`gu_cS9W-*ZS07TDT{;it3K*NKeWU7h0oFkem+w-kc6B%(oq{$eAs(WEqB$M zawG3119?2vK^AeCmC@QgOA0Q63q*uQNrR?!P|z$3R}=4ar?BB*cB~@Wr^D&Io@?_l zx3nwN`zUeG*Lobnx`#p+ZE4)*HhfOh1rHLDK6gU)ZQb8Jju2#!naADS>RMC)%uQ}4 z{1Q4PdMezYS^+e4<%hF zL9K~Omalca8T`3Qj(c?33s_wNSTf%;fF@L}m|VaM0ZvYTLw_&p5}kAlmbZ`s*gn4F zztKVYzi*!c!_;5`K}%C}Vc7iLmt-MZY4?t;?{fJchbJ_qu^`^upMi6Gkl{ zMf1xwbT7i!h&2gCNyc_TLHJ{2p2jIY`{uYQV$|s?eID4sw|{SY)aBvH28f$6-xq$BZvo5esU=c#&F5{fBUZs}HJH2n zG_N8JN}N5_AJr7bg5%3M+dJ=d6~siF2V+8+max<5opjU`b6A6($DO_YZJIt)lywz8 zPf6>f6T0Z7>I@4I3?dV^gPxO69Z39TVY-K0=AT@7CF(DwW{qd~Ov z!nU~WDg($FSLKolx3h(8E{Ur_Nk?0-$Tuex5+y$#zSX5*$d0})L9K8DPnk1uxIfWit%i@@0 zw?0)5qT@X}han}$0|F2*RTLs!Wwb5Q${l;k#Di3tL{=ID^H53{_Dx);5KsDcUlmb0mV~hR_{Y=p4SH?E*5Ce-P$u4 z^UG-n4HJug8=Gp7;bm6!Pjd;bH7UTBz?NFEB~S|SmDGjj$L8=`IIIMqwT;9CJO(gg zC5uAo?ewxL7@a}w(V@Q<7RAr9Dt|NNZF<1WDfsj2 zA*tj>2Kpvk4G{B+1*&9@N7 zNlY*vOMu+WN={VM)Sbk7s%emDEV4DL@GGhFcp)UJ5LvV_HzU=*$46HR_5ZNjIF$L0 znz(1CHy+0mC%dTAfAtWG5U0><*5pAox}xxv!{KuTLcYU_1ue6-P+6`JSz99~LfW58 zgoLIM-yc-L!41a~jmXy*Ilt&ix4cE`rgXwsWhEtNVwi+5KYVDG! zOypST2kn)YTp?48SB?FuO7YzCj8Xs<-6ro0Erjoq~^{z ztLjgM*f|km(44rG{=~&gQrq6?`_tNLWT!FSeFzvP6_6@Yy0)1$-kS?qON{PeM-rI9 z24!9{LHWh;1qE?ncS^4#$J%iyoNt%Hd&u4UEtG!6gp5{2E6r9?L>1hIx9eYEhZL1O*6f=(c_1-jC?>Tl9d3 zhKmf14i!aQfXu{5B&{03gnu)MN>Zy?+{J}7zP<11C{_8J2SIsJ)gEQq_gW$MI&;~~ zwEF6~S-|N9r@tERFiZ;B%}Xy>Yi+e>7xou`MxSfKlp?fTAyjOB!9%{&*?577a%AW+ z!R>*YIxroZ%HX)Z;}U;wuPAbM&2t80zZ!OOvcBT!nw-w3Hng(cobm;q|9*0IPm9Ft zIR#B?(6-R;oAm_3QfWSj(YoOznQ1A-=TbO4a*6(~EW z3Fo0^QlcGu#Puq*my%@ul8x`DeE^LBcyq^ieNHWTt-=Yf!35KFZ?Dg>rjg}l z`+Irv1#2N9Pu)Hj&w%FFpR;Z1-({H1JG?i@pok_h1(DE+0=KvDQ;$vKHa)tK4H>OX z{K;?3x~EtU>B}jUyzw^l1a>AgpNQn&->EZLP#~N!2sF-SxH%ua#E5&xuyJ~2!cxf=uJh?CE%(Q2GyMnZ$lm#SSRrfpBMv&2Eq_gw%fDK%`Mj0S#;0*%+~a-GM6_WeoR<}xF}Go4B}4B z@9Z7Ppg>rZ%rgnlP@O&*iov%y*-ngQ+C9dVYpaAhycKz@7CQ^qu3VaT>=vN>n3>a8 z@q|7!8J`^JY}e$lLKvrDOO;%$&~SsfO*)}brK%GeB&Ftv_!cUGH>R;AHS*r|kgR#_ zLFQO`<*ngr5@j893t5D=+V0lV3 zbb&^n9p2UX>5-|~lZm-=i2^$Vy|Q5SB&hF)jAPXcAQ=me2%5K@5hNZi0Hq?;r>&AS zJu*wAPgD^Mcw|sGKjA7r$UOq*=C_KXaTKx~Vg2_Q_;f@>a6VRG4(sc zSJ$KS>!iNF-+R5Dtd>x?5}UP8zLP3R!2K~$iZ9pDaaITM@u7IJ&3r(m9#p}==;^3W z+KK=EH#q^kT-KFI#lDjX>crmFs};-p-!k8SJ!I~t(9v!1dB|T9+gW|ebK#+}1au`v znz`#hXJq#1D|q9uf*4{NTC$!I8fVKo_{w)RT&O#{PvY%X%_Om^bWQr5eH9&MJj&I4 z<%yQm%NOQ-fKSd{zI~)}Bj1^1iC%;x-t_=7>PG zZeQzeJhhyDG6O!6X-*gf3HoE~`0`w0_ePKgZ$&&6Q9A|F=veVjEPogcb+>Ye&J z5?6>PZ--2TJfc=WDZZ$>2hzVXv$)GrRq`uiJKOFG@MW*T+)&9}rA7~TvkaSXMHc^S z)8_{LBjer5Hk>i?oW?3VN?RB&c8yay!tqMddAPgNM=5g#XB zD;8cE0EuTndZ`!;lAos?5z$>Jv%j0qJIzp8U|0g37xrLp21pUQx`rqf_(s$V zr!;UHu-})h9q=0WtEhD_^mC3hpdn_Gs$J;eqdIsk#V=QeZU;r3LVvwsw>Pl|>BcGL z{c7pm>EMt%qvMZwst%;$1F95vVrI6LdM&MWxem+GYmai?lg?Yw&84!R-j?pCsBtZm zz=B)gHqwiijkY9i2O>pzENdRNwq=IkFobmE2r!7h^bng8+w1{)g(|IVn#|%U1C;jR zBGWSuqmb8VBgY^=fTaR?1q;bAW-3NwD(g|pP-Au@lK$$Jvd())oYB$ryYHms=#1fE z!&c@HX@8P0FQmRjG{P=*&!eVW&|6)sIr79wWGJUG_OUM=T37;N@fB<8{H0Edaa)gr zd!y|?(J!Yt5JZ17)<-?YTg1q%*B2Q;A6bF**r?~P8t+X)O$8~uvTbsDUamd&t;!*J zU8>!UVPZcmt)-J_m|vDr*dqMZ6K15g!}&Q#br{+V+@6M4s$smUhte^wbohwEz{^TK z#En;>8A)FRzzGLK-ZE_2<8mGJ@mI!bbXiw1;|_vQgoQwqj}DYnt-D+e2x9y3pUo~~ z@`p3ux#5($Mt+^QHQprH?w+-B2|)KC+yejF)t4t_)6w;$3N|F`C-bu1Y|uIsywpf9 zoEh^5FxAl^dHRa)?UzVShDiLgk!}G`z1}cFx?*CG?Hu;^{j* z3+=?HG6v5eeKoEX%21lNQQU{`tT~-syF#8Ur40SGy5HlVk=#zu>h%&`m9+D(7qUMU z5lIVAfEU9&y1)D?+l zTH6*$cltlkTe7~$AaV}GytZ550OMVG7ax=fF{Eg7n<)21?7c6?4oEi6d8ZcynOpvflB9o^XOD~u#3XsNvVGFdCnq%f|)Ymbc7tl4E zs`#OH#aWZ5#zh+%8KCAI+{O;TLq0wuurH}#RtuVmv)Cm1-_sC_tDJbP1tT?rirya} zx9RTNoFFRu-Yfe)EG^vE3mDuDqlpTMN`4Yly%g}+^SoZtwt<>ZI(`E{5Q!caaGYTA zP(e(bxX(9wx9~m%1&@FhNPPJ>LOoV0-qD2%^aAQ$3Svs<8C=L$ zUjcAPOE@}W;4`Di0}~R(fU=RvbA_WyDK!4KOs4_I*46cwB#-$8Q1)s9ER2bEb0GZ> zlgYE9gn3fn#D%MP;OCx!51mA}^Z+TtPX8gTO2wldd$-+CZNkAd5m3+zQ^JIe277yc zyh7QxViC%x31W1AJQ?m)6kU{rb}O;4Wr*@j9kg&$40sLcJ*iPEcP9P=IwYKUl=um2 zms5nWE|E;9LKV9)|Dz{@Byp2@U#50PA?KRhNQT}*RM3}=wHfajaOb|XlhTKu!j$-c zf{>~-3~$pCC{2V9<#fvQj!YNF*T$E%sdN|X3UVQ&oRWReRQoaWrud3sODDO5!-%dy zFxy-X#{+04{v53{PI18iuiGT5%kA{}tOnqQZHTns8lm{&lq^^8ntzlZ0u4GTW`NHk z0_kpDPRR82A9MYyQdIFB)MU`|z@!S>P~af|-DrxVj(Xi4%;@V^wQC8y#@tm&Jl&sK zR%4S^!H|tU24VUHvQRBkb1S<4q9k@%aZ@MZu?u~g-K51f?IedEO(f@k#PREav2_=3 ztp5sr-33BXn6{7r436bwe@N;l+|xbTiG+<_3Ge!fle5!4%lBT~V;CtlwrOp9#`c#m z#)!e07c4`V@irvlvME%NsEFaj_qmX*dOBNy18W{!8E*LpLq?PwbKSJu*GyelNcAK} zE-Xsa8*<3>=k!S@)=Y*mmWVc#L(DH{0I?KRl<*2CkHwMqeD=V3Azkqf*0~HuV{)0i z#TaZU#bK)`K5xn)ku@|~TH5R4NvRBAXGdlY?)_tIDL?dJwfp?NV&m?O>hw)r2et@> z)|7dH)r!y6e3M9B8sn$pw%cIJeI@@xN65-d1b0~$Rjgp;oVj{~QtOo0QZ&&FO(ap& zOA}<8q>(e^FX$K)oMtj|dT1X~wmGW+hxQ{wzHMf3i_54eljsYMW70z95}Q6>S#5Sh zRR}hE(R|#-VS38(j8=sp-wD=#<@rzWJI_hbD?m zF)q(NUY9CEm&=2{`h)!FII?wQ{F8g|P;JHS3qow8W|c^9RDJy&Fa?+>o22%YT~YZX z@=Q3k9DQD9Kb{Y1g`%!qkj*yE*Ee$If;Zku(LR*3sVzXRz#d zX7S>wqHS~!jnWxyHr=gasQ`Whe{N;8ZO3{abTc(4_e0KC)F<$!kI|=CKsi}<3*&GJw%_=GIw=oc|1Ce?){r z+jP$JJZWb5waEJT#%Z!E8F5IT zeP!JCd*(OxSys{-=ryu@kYJPb#=X4GPQVu6D<(}&9EXLr<6nUpwP2t`k%H1k)rVv&gpNq7dk60kHe0O@LjA4L zL?Rol8VOr^a~h&sRO>r(Y6*)LE|G3+QIa1cTZCwv2$;X5?RlH zzlE`am=X8K<32F;Nx&c`A?tSjjbOwCk%~?eFbd|b%;KuV@l3Cg4c`UzHmFI81EaWI zXs1QE95Z)go{n}KF039#Q!}{5L(bEDbrUJT9Fyj=U18~vcUQ}Ui97hhr-$8sR<_-q zzS%(@eQ4%<40iFLsR)z{x&DZ{A)GpGoLxdd8oL;?~s z3AyKrdDmEO^=e^hpae0J85=Z{0*>O5Qb`K^7xm;sv~ILdn)-lK0>wl6hwybAy3`wU zFdsIX`APgGbki_>8;=*<<>HaLU&S`)ZaWf+e#pY%9?QUFOTZRU7)Wjg1XySq2O)L! z3?Pt82m~?Vh-H|N$8`)Im+3Ynin|ElZl|_B2e)^f!<=|fioAm#(fi~>(q0fEHZl%8 z0tq9;k)GPq}dTdZUJx*%dSZ*1pxx2_ic4L+;L=4dz< z=9QH~l!Q4$i^}?>UAYpVtC&!a)R_w!ZZI$gUB660EaVy?p8=U?V z=)xr0(&DS}xi^ryreJ3eOve0pxo+T+y4TP~aT7CwY0M_DD33wq*fc}zNc5T-Zfh+~ zQTpX7F5|sEMq-9_e=*DF2`2nV%CmO20=%dJvne5HIv0lC2%+crRbjKM@_vZh< zJAqem^5#zVj|AR{wYBzK-QSmlpdn@f>*@l3FKC=|J-Hfh;C2Mz_o5Ex*c_)2*=;{* zxO3p%>2!Q20V*2fUW@(SuGV;$ca#>34Dl|^*yMy5z|56F!Y&g>6>HySm5lnnx%Gx_ zu|?N-`JuIVDknL-XG5B5LB;^3gX9-eJ4mm=jzlgU(&i1^L5M6|*pCdeK~3qsztD$! z7EQpay-usn_9vHroj`%;whL{W|8EvfjZJWQJcdld1 zxs=FiI-=jO9$wgeclu`!lIm`FI8(9kJ~Ohg_>+fcelT-93#5valwwYbwiZIL&+oZ!(ZhY$g|H@BYK6R7IYH<3LszXaY1T8u z>XS!*?5^<)1HM0F2ownYJo^`$;iNGTg)$*KZztm#dR^Q%c5!HmaV65+(RY%-3f7lw zo)$YNcQ44f88SRl!gNw#Qc60GNS2~8iqN#5%rkJI56_$J9J?9cWWS{X9x_i;-7_9` zUV)w0ztPo@d7GQcgcQ0^$2M~|tpSM8B)c)pvbkRAV+=h++!?k=5MkS6(ZDwPVE8$p zm@A<3&JW1PvMsGfsVnD00vZ+Eb9wGLCKP3>#3%*+-)waYrJg@^GPB{VVb0#)3lf8~ z(!32<2ne57zc89yBAqFZS>r<%#bF4^fDh4)+l+nyf6mJ&M8Bl(0WtBc z&EIr5>bY{OI29uZk{>AEx`j!B*Yl9TzX^&{Ty@sDWk7J4;nLLh6s`t%M~A1#WS4DB zG0;+a@U>#14Z17B+@g_8Le1CAomS3R;mvqWjM|w4blavi;)BCSbtzX+3xFnIR7rgM zZ_gvQpjV-K@6r++Gj*I;--q4L!J-!i&WBO^MU*w5gSM3>vcY-yIw-#R=yu1~`6@Sw z&8#JoXwpGkaQZ!Oj!!(7h2?o5OGiF$K}{Pr%Lh~?Z#pAXlWT1^NV1^_Fu~oQ>{U(* zu4r>40W9BSj)SNLWy@g<7DyhNsf3g%{ABRY0*vyrX7*7b)&9@~fRrrWq5;ecqaJk!Cwg-Ip8V~J^>1|c_f`J?CT#u*}DP)x&fyHfnI?pm<1vtnEG%ZKi{U@%sSTnBW{{$ z$>&`@P7=c}DI9eiF6S7Jh280tgrDTP70L?b-}-fSrAaoK4_-zm*#rJnt7#uC2EXl) z>vl9O@Q-f~nr0hU9tj5Pf*dpEuASbf+%BQ?KUxR%bLl+R@K(t8c3;}SQUyJ!3?22N zlCj-1&2*y*l8t60Q)PxN_n1yAa268NY2)x;8VPpvoX?taps3={SJl>whRt~eIs7yx zS+D2q)j&}ZZd!~hr(u?k_SE&(k16pqIqJG8WNhJK9Q66Ay*1-3(%983QuSfXd|U0o zn$_Lgw!n>ply6lJsotQrCNRK)h$My!_x*?7l;{v7Nc47x5KPF;E}mF%Ak$r*MJCVV zhEWHMs~>uzD-Hj?Z@m%+6e`?BUoYEXioILifISD)3>UBczC4vX&^Z6-yt){A=Ir7w ztRxp}PW}DRYi0gjTz>1nshy>+dRkDM+F@{1WfU$6qi6If%>{|S*9l4 zY8{Tz_O{B&q;)dOjB}FM=#&}P@qhI(mFQa4iP%3PmOEuo~2*+ufXXi6t(ym{E&0s|w*q0MK*e1vkb?#kL`*xyNS` zjtrB>2OJs$vWRcB{@ZJ^t-TjMgwtoRP-|N>)im~H-b#;nhLcvc<)hASd{TJL%vs%9 z{Uv>t)rMYyq4w*;BuQLeYhjBjs-8jP?9s)-hlcPTk?5JI^#H4g@RnrBpid6NXZ+hV z`Rrv&E`?V;qy|`t*KXoS$kN2WzDtu($VXrB7)ID-hrsp+?=87B=D3F&BB5o`zu)Uh z?~O<|41lVUJoORU{#!K<6RiDM(#^++NMbb9R-zfjWB5xjuJUqEpHtZiARzE0go}+9 z2*K0rIs#xh4rm5E+-^EbZQNqEtijEjxsE{P=wMIsk*%r&BcsklJO!r<`ZL*d1BiV! zXN2zyW2AxcRReW&y0>?%rDN0IdR=kqResQx}ifYw0kOepY z>N`1)6NT19PQucWFQ&U&Mdzvxj}A4BC;6NqZ}`#^DepV^4N3Neci^GbKYixDQBfEM zviEoSYQke)UG}(*q)Aa4H+_KI@B3AEd@Q@yd@G5ESx01lKB#f>Ffv32O-}6Q^GQ@Z zB1i~vESOsH!BR)-C=B)D2|m8zD^W6A4IMTT`LGrN4mh0niB(wa(lqVN3xcBn;wH0p z_)Bkl*cJu$>J2`(wRLtoreax`q(bi5cMG!sBKz{`F)FmPoqY)_z8!XN>q*hHMI||_ zJGl17B1=1EN$8r*&F^kGipg`4I(h!mdcT(T7|9i-M(PoT~@s#!%Z8h%2d=2)8xfc<%;D z!l6!kz@AGa=U?UQNpQbQ*%6?ogHx+E@7iWk2PnFZ;{0%Taza{3-Z!a|R`>}qjM=cK3VJs*TG;LES!UttI}PNB|5u>;=5qA^$$gyae`DwtU& z@$(<&`;~e&EA$J#*gxFArrQwn@|L3G98 zOKMT7es+=UgEcdRfznl?@ULhOV)XqX1?k5$PGe!V{+f;gbEC5By~8v_-E;y;v}@BL zk;Jz@nE*pg`GgE@m&XuNhbCh!a!uPcVa7I^D}D6Ub#_Vvrv}wG_Kuk9y%x47wU|T~ z3_J-bEt2Zu9Q7zgFTSmS+uYlLJ60?086VOb@4dy@T#}p17pB^9(6v0myinhY$0&Ou z9VZoh6uVbp>7a_!(u6MDldd}UF&2GN4qV_TPWqYHV3K!q0RI^cp@dL^#;K16w^6I~ z0NL#(Lf90~v>t}d?R6B0<$S-0q8kP@3`EePbrT)3uA!6l5<^*}Bl0^sH*zu2<`(Ew6_Eny zc)bOh+hdCRjw3p6ou)I^p#v8q=vnJgI<`p)dr(=P^5@znL5KfwA&|SZt%F#cX>Bmz zA`BqpHg3n?32TU2tmfAKyKSslPs~^+*3G@!;>6{5tLNl{pU)Q7SGrce*>dc90ER*% z&w$zJ;EPulDmU8=^STjx7*uXPotD~rdT=j?rVG6JfLN!3rCe5rF;~3q1xOCeG#G9Y# z4C^YuNgY@g4ExLoZAFPjEd3y4PQNxf;Ajtdrn*$^l}fR8OU+*SB|T`u2vGa~a|F>=YP9yrckh(A}5AdWxW^C!3jmP3LFn;&<>| zb*CC{Z2qTqM;vF;?VJRLRm3MS*#EfBx}`z}&-FNC$yMU;*qS78tgJ7iQPMei?9o*Z|W9Aa5ge9FE2{-zuwb{Qi;L z1%tZeCXvB{=RK{QD)>s;<4)!|RvD*sV553{2E~{^p3H3b9V~+{9<{8A6LP<7bD9DD zi^fcgPN;Ev>5{7I+!xJ^zH4>gv`K|E2=^-|2I2 zO%z>U^oq*!B6Huo(c5#CfgU8*&;1fI(xga}gZ?L!&uej16zr0QpV)h#V1V&K>ItQ4 z0=&eLY=udY z;CXfeBQDMUj#cJht}Mv(3PYB9gd7C3Rnr$x52j$jPAv3r1MeB4O)O;gnrAvI^{BKa zzcLec*xVA$9@P5c%kKM~+05OMxh!6-$p@-SVz5zPkC5;bji_f9H54?w{94EGcV17vu1r`fyKq(E!FRyhOAW(BgW_t_yd zu%goR0}|+YGSW^mkp=sF*!ExpY9=?;VNpBs%oYAdTA<|uTDB5K!0p}9#qb6tY;P1& zF;8e;m(R)rCokdPypeV%pu)KJTRbway3A+PaaM)9lv{b(E1R^5g|1c97l%umS~s%? z&JH2{fY^;OvRn6+Z&JNOgVyNl6!Lc^tXkLotjY*GV&Bsm|*&63%!+V-p{b_zQQ1u{UKW1L=jF1T|$NH zh$Nzd`LoCD46q;VvW)cssafH4N2wBbeM^%--+(}_P0w1#%M$16mFZIBqxw2Au^%_? z(T78^k4tw0hh6sHLS0K9Gd>~hZEqFB+L|B>`TUPlsjdr|yTfx=@Wz^Mm3&aj##Kp` zv1)fila0bdhf=`3rVaCHhu=5Yj?0abdxsyMkS}$};hxPV!i<5K7+LfmVBLjmRbP_U z_HZhf&kcP+_yES6d`i2AW7U_XTPw~E!GieFo{^LL?Kh>ysF%;B_RtY3qvFLLUHiWh z6N3C#|18H>!b~3;oC~$FIsPW`G^|}>4-TNe%s01@6PC1kcz~fR28#wLgbs}BJGO^N zFOGjBM}IW`i`c`&tFC?4xRE~m{C&^7OhhAks$KYmuM_WRl9jjD$8!}0rZ=62ab5HD{ zIH{Wy8V(bK@smlC>>N-z8i6P^`OI}Xg&2QdmpeU@s%PAX8Qy6S3-09wys^IJ1k^=B zLI}Jw+lc&Tagpr+Mh7RFAcSfv=`cctYyd5818;PYVA=3E*^ZiLeR4WxW-Ewa_E21q zG?Ok71dlSjaDUo!seuM2SVZ;dTI;yBm6x}Xa{;Y@eu7Ijz2sIWM0H9}f?Ov>vak{? zHgG!te6|K7(O(~%W2|6A-4|L|Aw|mO`MIqwI7## zg4e!CJP=7LQdw#o@dJYJ%e8&mFGR>ZCDAV}xE%!*#Kb&x(l(-qrkG%XgshAhX1bQ$ zN{j{Z-(47*QQ@0odp=!_z2@d|zb6ZCv<%G?3X64%VIBYe7+{s^5(6r1bHKC%>3P6%Uanfsfcpv%c zjEd~0gB1cHk~yCqH?Gs7be<%1ebysjzQyQ+7NqULWY2Ae@yl8v zb<nFTKT=x}^BQoIKw76PWd5oQNd@AIqs zM279k77Gl_O_1a>4EOU>?oH=Z^-YcO&(rFU_?#U$BFnMa`|^IOUl4y$$6{mSNC$=d zLF&tc!nwL^FO_xQ39^U+vuZShM?YZ&T3`6t8-<$G_CD85?E~t6EC#-?sHzn{|9GPK zGSiL)6CYb>O(<({thSC)+CJk?Nhr0vmoa1F`scU{}4f z<;Bdgs2HSocyjj(9Di^Emv|*uwq-Q&TuL$@xpEk8Lw1 zUb~5AhEN&djXy_SVtn6ZV)=7^oc=>O5Lx(|Bp&e{ZH%$TDWaJ6i)AqtTD;;`(Zw|Z z??}^h_K;2=J;}C+9nipKpUNG|=;Hl{Lro$!NlE#_2S&fkgx~3NOYGu}h)Lu>H9vE0 z!x^yTV^tAi%Di!5KPl0q(j{QiZ~wgT^8FXHj$3e##%IP{o&IX$^#hHmrVPnmi=QY!m?^gU9P0q2d-=KG28E{qbiMe4h1x{z^Z{Bu-B zd&<@J8dx^KXnFNytQA1%4cnga zo^1up$70d)^DS5v6vzA-nN6>kmks+}`kLeq4qY7W>lJ$M8oijm_NoTLBIwU3;^x!W ziiMYEv)S|Krk#r~-CTNg@dg8vp&|npx1#_N_Wcs?j8cv~FtqA=%&c{gm7wugi9{kN z0|TS|hY8OM+lKeU_~(Uj#>6TDwAyc7`;ri7mX?cFp3&89!E9VrJI@mCiw~0e0GB&( zkHEcae1@cNv68d37XfBpc%Xu4Ls&2X0gZ+U!ypMXVuHjjEeb8+_Y;7{i3bq>7%gGFi?ScJv4SHNRrpDdzdO~HPBGH z_4Hb7q@xwmx>Q&_aV=nW{Y$lAvF$Mx8F#0uoNr3|HsP_qyM1y<-Q<_q zk7nmF0@>-HEW*>%Y_>N_0lJHy!L!Fe)EAdf0D!_H7TwWJlIiZLuQ)77Z1<}DCkMV_ z!?-F;rY#`)Qxrv2XYU$yrZ`pZ_q}_2r_$UwK(L;4%Jkhu3*Q7=W+tEChqL18I>`U- zg;c2_k(>|FQIkxj%9Yu?1-ka#{Lp3N$h?pW+1cI~oz!+jjHZcZ$3T9k2rAZ)5&9|a zIvWF7kQ*l_CNnt&Gjc%#UEuKxoD~V}gfySsJNhaxsJ}#UOE@2;Hd|)3fXFPFp9Vbb zhg19#5Nd+xQ>pRy6v9tTmDmAIw*m3*_bz5CV^HJw(pevF@NAMm$BzHDb9P^a)h1 zM}S;Hh@mHTAJ8GNvsJ_&_YOO5s$(>b0xa0;ATrnzDH!oNg$%NGX2QfbF$cZ|B(P-< z9URj^D}oqpD?iIDCZm8^+nZpVcSKb2D2Ybv162<(W|eU+^{2Z*jTplXI7oBT#fu6!*v5Dj3^)P7^J#3fg{6r)CHzQf%( ztM1YWkF9WuXr?iVcw{1QdXP|45&iEU6gAeddIrH!oU3{U3i+v2w9O#o4r*cyfpoGa z{!vR>x@ae$anSu390y4|SV0abQ4f(P4rxz9xvI_13Q1MnUrMJT1A(6ZKr`_M>Tvru z^PXg2A`gStD~ef$@`HBrT|@7C!yxK^3tt4bQ~SDneItXVI-L_WcEvy~ie1+WP`ad9 zPH;K8D|+XxqbNB~RluNr9TE$K1mG&Fh7o*>#z_GZ1rP9sf1KU==6Y(5XI2!`zz-gCmv>YF`X!#PZR-6JFdGi$y#^a(^0>Yxbhn4+L`gmC(&z8NGMLR+7a*X zuJE}Sm}v)ZThpVg8#EpI)o4H3@ONBZPN9-$VFF6};eU@&Z-%$NEMN;0Oz{3FYO{TO zrvOdv4*BRfW$Cz6jY@BvGy8njE$r}yx99i_V?T>srM}>_wYSSk&5|hamAylPQyKk$ z^<@TrVkGs)9(j4wm`2$RrW9kgh(nAklDbmEyOx!jIE zws?>jSpl#OcV)jLHRuWY47VvJOE>Bpb~R+^{*yN}n<5;{qyRArHzu7jkQKvte@QwtsWU~} zxuy!pXW0tSD06#z^A^gm^AYE|f&`ci#d9`OGEB0L3ka96kRn2-N8Y^&YxM3_?prgt zsf*zxfL_kvE%6YN7@8`JL6zmA53}+mYL4`X_ef3Hha^i_S^hD#bZ>3FqC{HWSkekk zzprn@9g6XpXkN(-`dCQW1s02tk_aTI4tD>@lBO-1Tvxi#?;WB@6wZ}FcWl9haHq#@ z{fBObq7(E69t{IbD!dZ6AW!?Gk2?oi1bh52GR3<<7Dp~kFr{&w6<`I>-4nG98q4BLLeWK~ z%{O2MR=DTI%xXr`h<5QJy5jCQ7Eace4%(vU^UJ7&5?Z9Ftl};{EfPE!mv<&^n&1_@ z=zBmO(X0d&i{}mYXsSS1Ax)wqQN$9p~1&Qw;4f@UZ@H!M1q`{NOkPDY7ZImTw1=)<^HX!HxPI z@|7&-m!YWDmP@F<*5|LsX zXUMhmLExgQvlrLG@=2^_?T6X@SPd z*i57uQPW8PKxzuZZ9OZ3p(T{gYd{VaK0>RjUsmo?1AQ1a3b(Vj%xhSBcmi@9uDdyQ z)kOJ|oBr~*N$Zux$Jr6Th5P(2EXrmTQE`b!pX%0L`$}G2mX|qulr0^D2Yb78@X{?! zKrpWSrlseohBy}Ts)h7b&5)vnBLO18Fvs2dPpSYn9PBT(P17n8>Vs7vTiV*av$^^Q zT;8skonEk6?fV5foU?$Txz+L)7ssRva*30x%r z{6v}*K#2$b61=nrqvq3aIfh&uSp_OG0uu(wi?8&W>=vlLm6oyzaP|k30%Zlcn+Va~ z0?=0wyM+}tCv!2GebxCtZjVz!%nx7b0_~eMl_c1f!X^@_@DbVgC$IlrJ%B^u*|m2Z zEbT{n68XkVw27hfnfk@*&TC3zqMf#MAARdPVMkAUha7YoTY*FF=P}RxD;sm$A|d7u z4|qR>hj}rbVsaw)(N{Jh6NF=K889Dl@NmYAT6FK-3)Oh=nRmb4VYbAanXyATPrcQl zJTR2!NYdVIV^;hG%i5oEL~F_(vn)*;u`lGMx_ZfVoNV)F&YGCV?8&TSzA$N}^>OlR8>)0}y|t8Y{4mkoX^&h$r2w(Ln; z=kpxLHnq5AUD}$=3VF>A4891G<0-T%KShh8p?(ZnwRv#Bu<(RuNh*m6tE)R&g!SLR z`(0Y!ML<;~z(y+yqplQuMa*VP6-ii=3rGmFyIT74Ij0qrXMJ((>voO|X(Gz@5S;ToyjgTom1&YjW?zA;$_& z{U=ttwhgeZ3QkU_@C2vnRO3_I7w~&*Z_Z_(5^9e#0{{;Li*cx~*uiz-`jXyyTaiR* z_@fb3-4htmuF$dW(`;&t4$3+3}#s4=rS{r5RzNgOxQ@Ic? zb@gg(oRq=1=C8tWsZ6H^>g!t5MGu$N#aG<#;{#eg#z2BZBXB+ zP<2YnG36x z9&_^`kvKR9bx}Y0Qxwe?_Wjp>tJO{3(YlE7Og6En+{dhqEo^RQpl7D8R)Zt&nR(d8 z^itA~F-LZ6v1o97LfQFUatVo+cHLWs`0!Tg0nnHPjS)dOQhZ~?+^>YLLni`fxbHeH zl3Icl+x~N4Mk^|ftszf< zU!3;c33>P}gJXW->O`DzYFMYCbf69%=L7_CK580y<=DATZWxi55PXRHGH&#m?aaA-(NWZ5)^g@p}j_|OdjixDBRjh9|n#@Cu zQmoUgWoz;g!nDktylH21QrOE2y4uYU=dbI^d4P(4NLHc~lTks4OU1$|SIlE9z5yBo z9PVwPX#zOD>J%!!bNe-!$bnQ&lJqI!Rd4NJ+`c|AfZwoTe`jmQrDm=K72R% zwtfWu{JcoI=klvt<>}G$02lvIxeDKNru4}C^4I5B-f!9pUr_dIg z_Pt{_)lDxiF@TffhE)C`b$ql76nQ+7_2(+CLwNs&avkg&DzHnFm`2GGxyU^^)7NS^ zp3|cU)IAu&>+8^Jtw>W$xTal^C0x(NtoUGR@wM!DY3`+ot9*f)EYwXmxN`KgtX8Qukh9GZk2~Iie8kh5`Ve-Ghoe5DOH0if6KRsT)36m$R(~qTFKMyhrVfrJm}%?e z9aS^D#DJd;y>eDSzJ|=n(I$}R@yudv2BlVI9g>Hzhz7)GnR9~SSJ#G~iwRBF_Xb2r z>AF8lG+x39T^cET$IdXMJs}YKq{vgmwP#%IrA|(L9x)VL-Y$j}ju$0SFU(;M)i~>!6K3HHG_;CEY}Z$K z)3jsA+YCXYl6f`{SBB@9L+E)^K_${|&PKUO@2{Oz2c3u{^5Su6?S@7P~c zs_C$%s{56$c1792Y}JY*S3P~7w$t6jHMxBLV*cvo+`$Kj;k`YAVQPi;4lYIbSF}`m z-(vf&=>3<03CO>@@~rqhty8%Wz`r@Qo9@ryi38Jftb5G~6hZ=;<>fAo%iU*GrQ>4j zUxHvr$b&*ASYn@C(fbzwRs2Ko#DZY{bDyeE=SZ@IMT+~~t_w1Y^Wh<1_mbjwzbCWP z6NE3ac_oaeGN@$E!32iZ5^LYLWZ&QcyC(E?D9f;|L`8CtwcCCzo>W4LaB(-dlGSub zsY+P5hEAZ1vi_09BT5J$>!SwL=OzF)5zW|ncmvhsAD4E4$1D&LHT#phdnn5_pqU+k zp#=Mybpk8!I6W`lWdnh7lRH|XrBm@>{Bd3DmSwF?kz0AOg_FZ6euQ9kYYU@S6seNX zH;4mQH3j$*C^S&vqnAmghW+bas&_c;w&?Ye6&%u}K-my~%E?{3?q0f5aPEa-Ud22D zaf>J}#ParBDS7EJADK0B1CEOc36vNJk5;<@g%6xQZ}xE`+}XU(Bw<-ZiiQE?k7_I5MYO;gBc9((X~LZ{K)!qRLPDD-%y6vLqQHkXycu!Y*^GXiwc zEz9!A4Vf5qMdpu@2o;jVSpTp+czD1V7_yzo!5&qWmA0eV6^^A2gZOv%fa=w?;{X{x zx~#C)8~6t^Cd^VApDrw2F;zph%w#6d3>d~_E|+z4*T$vl52=TF6;mBx9urnxsME{R zJ6k%q$){+J=CkGfdw84P)2tz|CWdZVkCWPFBhQ)6)^+a@2S1l3bvn1b9i*6I@UrIG z;468wpXTAtr{m+p>r zFYEOdEg=-aA+1P{XX@RyJ2_(ATV56e*L4NN5-3<|52@6XfQtgK^w_oKO(}HB$<1h5 zPmd8m*P`45nLI`$_@t=KG@?-i`^5k>4<+aoZPBJZ;LZ-68g<3GPA1)Iv(z>)54ZH; zvAsuAD~&=61gWtoy9LWVXa~N^S*~XSP;T*B7(qBDBxP??o<*Hng%*UpTOKGJO|ONR zm*LWr_RSd`dV0W_PsgoOw~E&1T}a~M&1ifPqkPK&xN z(F~huLhUQBrx-Jj{EER>f(-q5R9v>f?^p3y<0)^J z#5*MC-74Rgn%bxb?VFv}8jEX}UO%r7ru9Yl24XqPfl^-)O3b50zxZ3l9ZqKID(Z7o zc;*Nb)^<>Ib1S=LGkvk}(X5aUh-MUnhU*rSqTP9zDP)*a&IU$k5{`{yR8v??M^~mn znFqtyKS?E*6+Fa`ssQkQf7k~>v-3fzh8|0i#lTnMh_dT^EAkXJ@R_)<0gm-g?hhu& zaaA%EOcFani9~gnR7$FhAPc>n^6^%Ft>ak4WyKt>W!mQHxUgPRc%+wKw~DSXq;H>M z?^;)Rq!m~wYj8Ycq?=^A<5l_QY9YE%RJ2~;^upLuSb!ReOBH}2}+c~pP%Mf4d;jmzTq83ZFC-XvpreFq-xDeHxah&;I*BI~64Mm&AnwczuDsJbygX zCF@+sK$iQ`4}=Wo9Tf>gF|bT>+bgSJlHXJo!z%GuLNAQmYJCu2qfzpuc&_p&VRD?&w%?_#krSr#jEGWsh7p+Bb6o92Tj&#~w| zwr!6xsS5_C+v33Jk&+?SAVqMutYewYFsnZALInr=201f8MwaLT9nfJqLLTe4O5xb? z<;<4 zXFfH7#8kdOZ3Ec|%SioOB)I%E1@Ldy-W(PyKBD{A$ql}+EI~iIYut7?yAGpTT)Nw~ z&y8o)?l^PPD!*23gRx-e2y8O4LXlEdE!}bM+wz>ZR`Ux(!0n~k3Itd8?Aw@{& zka<(0J}zO|AcCkLrsSjvs1W---tFQ|Hb;|W2{2?n^kt-IHJbg)k^%_t#Q@4x;P3?| zh34K~SnD3wQC(jH(z73RO^EF2_FCt&NFf;QNZfddY=N?<&sW1m;;9z>$U#+Um*rT0 z0{G&~Z^v1dY7Tow!gQ^EBjycy3LmJAdCgBeF36?w4hFx$vb9U+SnUNI1g0k5yvF=i zmz~bJ$?TPdE3P}MV@!Ox3JqfWieg)#^KR8_5?O6-;su6e6$5oOewMGvxc)mmRWNp%6yL+3GkA-Fv&(UX|ZRK0qn%HDyh9#EHdEz z+5Ez*V}jL3x5*@R@j;0%utjEjF#+DHs)tq{a@U+izN`K=QfGp4<@g{)R! z)OR*cE8^PC>WFi?1&lDpvUtW8v8jp5LW5`~)Nr9N=Je{#IgA{CEG_^nFqkrqisBX< z9E`(Q#rL6HCnU6vAevTc9U@lzw+)DS!~^?v-A+S3$7tGJlMlAKeweTL{i$5s)M46P zUktbJQ`)9ME}>YC>M?_@Q6l!Ll`5IGK|?KUZ(#mq6H9XCWoYVU{;4Ai7jkIMrSV7F zs1<0hrjSB}o1J6X$?jiJi;Hge&V=bqW;~mn8tvk=^Ayz=HPD&Y6aeuX?-#X&L8|xH zM&ho#dwm#~_~J6htyM$Zjv_r(y}A@Wz6r6Di8$1~TN1e%FU`m{ysZ%9bU^;;bJ}gp z<~TycoGoNoLK{b6s8lkPpX{Olp>ydMT3pSSXfoQjzz}_Uq<*uEk>+)DwS%Y@+L+m6MX1nH=ZFF@m*g2wG zb$8RW>15HKhzi>VGx&-i8$kld#HUg zD8s7Ohw##7R?sxl2$DVKr{@<->hQE}o9y z5P=Aqq}|yg+Bx`aM_Z#-yRp6Fm;11Td6A0Y$JZmsx(*V7!>AAfiIpV*KYeQQ9e-#( zF7lzkuL}$p7W7Ayk3{9->@Y7a_0;5rtyK>maEYPGhCr{@Lz{(E449&jLP!?rXk${) ze|w+t6r?1%z`3p|&@=HD_bn%fCYHf{(6*?yF(ioqmVZ%V@K9fPQr`Jk^7z6{FQG?% zlA}KK(EminGvTw&4s0q3nDWsNs3I!)llxk&|(l#exWr(7!L=HrWOYsLX zkryi%W!{^7Kn$z|DACHu=I~VQ-ZY4slC6wVij`rCJMak<`wl3=%Fij$${5wQ;-YE? z63C;KNe>V99A;&l(ya_q^1TT|0p=|fA^^4bOz@{mIg}Yn3 zIt(-IgGvJaB3CzlU5EV&!avk*>KQk`aI~TyUyeLPmKVeYmDDnsv)!!jx-cgrE5|c4 zXD}?DT0-i2nJgDkeb*{+4#UW(WVWOca8#r9@IuuXi|ITo;ZT|j!B8}z^rmq_uru)m zeX3qF34ItYyh78P3F+A#yKZMqzHjPNa4u!B3(eIL2dpB&@zhpxOvvRFs8P1w=O^XP zyHj#VRmCkiN!~XGhi8?wGCwyW!7Jh>6HjAZfXGe+fOJ!Bi>(#;5eK2m7)$j3R=N^q zC70vi51sJmJcd4!afu%9KE9lNhupcYP=MvL+T~sK#mRPSC$|BJzualt_6gTLeApOp zbAT>>`|TJ)_Y||oa|%b&tV;H{<}Deav}#|Vs$XcSlCjmpmTCAo4iz}|M7D=ievX6L z#2Q-!C80mA-;~rh*%jEWV+Ap1EX{snK#@R^*SxXSDYhBE&X5uoDeiS-C|HqFc!8oX zEsNA8$wjIN@PTKkDiJfKgo2<<<0l;=)%F)p5**qT&GNrliq43Vy7I&QC(@1 ziPdL8D83vUUb+SLs$ei{4VW=+!0qmE;+<|nUra8SKaHywPH@LF>F9bk5427K|8{NNvdNoms*&r7Gx#i?Jo|oh@4@9W$g1M`}^P;9C zX<=dI7oBGff;5|y;zKQwrx-)s&6x-D^`e2?>U7cRg^vAp=8C0{%v{Rl&i1hQvQqEf z5`S>cO1=Qz7VlX&r(k-!4?gF8_*@HSpVOU^HCYlB2+}qOxIg zstTBNYH@w0+1IJ6Cf5$@4N`k~&fg-@YYv~8?BYRYD-eG4;+XCjNW}-rgl>|lRV{7H z`wS9ZMU=W4uCJR} zNS1)9!&!QoY`o*(OS!3TJ&oq@v9TVeRuY9t1&S|3d49EeRO(8b<1GYwLr^MmI40gx zQ`l9!>4FUodrJ+DEWd712GW|WB9}@g^w9-2gHh)?iNB#20y0RxLpdmI3+BCg8V%J# zUx@72`djR~jU_aYu2G3pI0uWMz1HJtZ2cWgTlb?~*7Iq%^?2H2J(Fe*JSf?Ln*rTC z)yk8YuAUc^cCgJx#%8&Q61^#QuSN+?Fc93^SE-`Y0;D?B1FDdTCTcX2tXa;8Wi-guOPML6Gq99P zYD%@HlLaV1h8o7miy4ypp|WdC34c2-sNoC31{l=A?i!mcoA~WCadcc;VU97l#BEn; zkI4cu1{?f4DPsQ`X%2UgRm{QquMr6XkFFaAO;tt&bQGnj)`~4#4H(v-_cMj%OrppD zj?ZMXQ*#T&aK$`0E`oF+uea?a0ySnsR&39n7D<@D@MN6J+3y z$Kf~*tqxACd_);Z;agx(HntMkIkSdOxp z^a&wVNuO~k9g42^yLnX;8kL1p>Ct?eXt~Iaon4cf;ePMFuqpY4y)AYDdSZD)vgw)z zs(mTi$JUWO`;XMaka5Je4;ktrXsTfGKKPVKj+Y@Vf3xb_cw>>4XH}Wq4-z^$2gL8d zcKRyUU_1CIZx%;p5&lDL-r{#y^5>KOF@}rnxc8<)WGu#w(V5Lx7zL1F)H zizZ>T20B5u#r7(?Zp1SZS{G2FQ;B&k0^y&~-^2ppXJ;03rleYep*GC-7ZfC=CQQ)n zwwy^IjX_#G8O%=XCqk9F?Be+QQguV**Yap3(W6Af@5l@?-a)FdyvB|ly)Q1@NP@H? zOKBMw#>s^j2iwh97t&2EJ3jZfx3$sR2NWcf`;%9$zB-6`Ng1#E4L?L^UdxB*g`9p# z!!~>`YEnS!d}=J6)<+f<6y2{{qN@>{^iYM|FjCWZI~tvC%#B_q({wKsBKED?g^fY+ zO!`f=z}+AGI@a;g_3_N2;iAtV-4xO^BX)ekY$etcboqDn-s+CbL}C(8C~Iz< zw$Al;{(=tDEuTothdWu;u-!pfr&4Tg_u43CP@tT976=3}Ph100qW&2ZG9|z{pPDeu zfw3h8R~UvJ(X+2rad)&doVui5*%>~Z$?AaJZn>ECQE05&9*AJYQ$c-%i)am%;{`Sm z8TK$FB)5_ll0n~OK6Bb-y0r|_z?5>e{E1y~o}tV=B?LuB>>4E$5OYBH20U?Wr_ra9 zyJC|qO%HoYvBF9IICq9TW1I)~A*P%?yO4vdInQ9zUNlrk)wrZxwCx|yFwm!^aeKtr z{ZZeAp8YvsMlA*pedcMI^cLDvN&a*<{)H#Ho!6$4GbVq7j&Um0Fn1d0m@_=o;K*H$ zlT}m=*X-QA*z5zqhEm!(6TfZPpoQJp9`$Zp{XAg)6RbbS>?YL{uVTElB-P6Q4;7W0yWz^3!Wrl6xAP>%74)d2=g{l-2xo zxJUGFg+Y=jW3rRcXk~?Mf8hD$Em%Wy`ZF}+CXYXrKc(It0BpSNVfpEJUZMDj22WgY z^LYf#F|QB+-%OIo`Ao$9iHi?8Tp!DOW@2GAT#+L$V%<`qn)-R@`RHtrp*rRn{>hXM;_~quopmae9MP*yK?XFx^n^jwmFT!yoMul z$Q(L=EjIQWs)2LPs;2e8QybACvriQJ?qo~AkKl+lX?{mH9@~`4091y+;3fJ|=fZ1A zu>Qk)Sknd;oS?V8C@;)&*iB2Or<$tqPD4P z<=1ae75SDda_mZ$FQR<%t)rlKpu}Y8`C-qbhAQ*$goh=tb*i%^HoP|3Y3yE*Zy9?*2!caC1=ujzPkK zX=JgOzjS>7aU=>Oi^VHJlIYnzWgCXQl*Aepi4oMh049Nri_p@_7r7=sozcT{iljz` zWMEcFj*|gcpkE_BO>ZNUluKPHSkP|49E|Y%pL~k3=hcmhE-R;SZWTP9znT2nfx8h5 zyKo56(MzcA|15Nx`b*f^iJ>R;8)n|>o42EYm%ixaRB^43xebueEne(5m@11w-rVj2fbC$ly9?pCn=V)jhdobrwWU|p| zat0H07=>5j36A`fSJRU?!5Q5?MIY_yE_Xjjr=4#oWck0J_l`RP4?*Wexh1{`Z7qob^KXf{aQBw{tRE>NhvwmD+e*)I8LvoSe+#x< z5po<)@-kiT@oq30k4xW5Wm&=7?J+nV-jdq~ivQy&KX8RdfsoSxaM!6bk2@j+=QvJZ zU@DZb4Cq{E^?ipj-hI+pB5ZxR-dQm~ULE+EV{W*BARPem7Wv8JDPL7@%T^dPOLQ2c z0YVMgIrDDWU;Wb-(8^CyZ33_b)!B&4POkR+9ca)-_<^J3JEpR?4eWr25ji*o z)g{|Y&v6*WpE`)uL;L>SJq=B&v5D#|>4yMeEK1UVML=F@L?UuMUP)xv_9X=|O<#O@7U=L&k z6ZREF&#vF=j9UvbKEl9;2zP z0-hd=u0TV@<|@dF60A$Od411d=*^mlug(fWr~WYpQQ7zAl$_O)mg<5t{rZ zmG6bUm4#F9&|O^aN2Ru4$caHEGi)9yy4v)Yp@Kuk7}Nr5^_ih~+6S6blQg(d(EEt& zV_?up(OSlpzx!%hstos>OyzG!|K{oViL#7y?0!@sZcGFIcY2z=_{o82cC)M*MeW6k zo#VbSSC0>*6BX}pD5$ecEve9KkXL6{DvHo;ggcs*IiUu5=;N7JT0|LjOf~PnC`+RY z^ZDRz1&aIb#iy>xwNaL>^;7AEV;X?#9)WtsgVOS2UlT&DYzbZV-h5@-k?3UR(cf@vC{#cH*%QiF4vY^->I_eZupUETkVyVsjd1^Rg008(=6LH z@)gDOf}~*&`>yZ#QM!aX^>~Wk>5c7PMR=ei&VjB;6NUld*MQOO-mceh(*! zc@=RO+m8OIpEEa=DIfl9?w2X=cO+)f{(p<186reM^i9-H4J{6r>#1C z<9paQ?)y91r-w8@MTe-axuo6c zbNSNLzqD!XIjxWC^L>ZT*W-@lx6PGubIjx~=Ez~|iqOGk8%A>7Z;8*_R)&{;G$O3f zl&d#+MkV&U@4&{*+ucH0!qKyiv07C zuSlV~kb11Jx?5K#&VDt&!(8%6jrrMxvR5hkxp|%$G-gjcdz2ndQt?3*G$_$}FeyUc zIP^^Qmn}tTxJ;~Sx9GaQyG4krYNFi?uoLH$0^cL;me5=RLuj_wV34t>NH_;r>|n&i z78x)X4?4qsCp8$FQ-bmP^xq@Q1-2nZDJo~|kXppZH$c{0< z&MXyE+Ff$N8z@gaQ2P69OQ9fy0mfw+fp`)rQUwyKSu?L}V1lllKbJ^dJavH10;hAP z)*zS(@@-ON)?=*2kU8)dL96IIFa~~c5`@nTpFOm{hk5%Fx*5arTo~h|CUEsVpvnWM znx^1iReLgCDcf0=M5f?cT<1PF|9nF!OptcOw6VHudm;Lju{oK(n~PY~Pf>xc)Nv*c1+2pn8wtH^rE7F!qxVG zK9)qrJJ7#sILqNtEAb2DJ@Lt%0&V!mODP_fz0It|k22{BE38;QunhrXfP&d15U^LO zsL?)bBODa1&~APmE}r4^NN+QAOT9!Hfz+yR;PI=i2X^b*qUwBNdogaCLk?GB5U}C5 zMz#{mOxR80^bmXc>hLx8V&a9)1+4LNbTWwmapxDt@PL{PbeyK>7xV=@(CHTl)&tQ+ z^az#FBzgn&P#;8XOBO1Ttx&TG+X!7E*k7AWPBxAg8TUr9kPOGP;5$+5;B&vaIW@bq z9Lrd)_19hR@9#P8CY%{al&4TVx<4C-*yNwQi85hMMk!xgy zB0?SDiO4M6K2DIRy;$XCCOwWkkC&StB+`9WdH>z#_^smKz?;04?z0|H??TuToH1$= z0^uNy#-;1)*INxV5?fI)N;B*;v<{z>Mrnw=IM?j%n8Y2<|I!aRa?%+n^PoEPnm}}S zd=uXCv?UCSK`5ar!)~=`6|litDGWs=E`IpP3(oGLvbv}oL#a3kV}Ag=!lE#S8|{x( zG=CE?Zp-O%VgPE&;GK&1A{@Y6JHY25D(DXbfxR1l8Z~c1_cI(v{mW8__?B6X)d;!^ zN@&CMjP0B?q8~IBVM(FMLLv}%^LTWeip})iVf!xYVW2q%EJ5UWH}GZq*p6bTl&EsP zv2FXNYUFF3mJ8mbGL&taPJC!(+n|1JM`4t&J>en4WuJTd_5Pqo-KVZ=`z;$ep$GJ} zAr?0K_N3{*NUJ?+yg;In@k>KIGZ)HO>{N8e_L$>+$YGcq>jcb0(9;d=8L>x@%NWtt9+Su(A|T%PipS#bPDD0Nj4J*)O~= z;{L};btD`P0w90|1OOzk|Kpmx?r%I`R&PByod<1>UxkRKMuf6^AAkMCTyq<2G|p@s zuzKAt56*n-2Gw_AT8h{zf&sID)jdVx;C!gL0raZ!2*ukNnCfR{y?Haj+7NPZ4(y{& zMsR7CZ{q%wGHKSn~nNDjjFStw3>sN*$#a8ss-MU znBYwHLHiCmgh9rIRl)t#iT?Z ztb=Qj$jE4z>W>?79ta{_%ujZs=w^I`0ZsS@bqElOAz;8|Pp`q`xh#S;>F~B*Tx(1+u&{MrlG1((4}z{uG$KufORZO_v3X-&^ro90ugZVz$6)c z=_H6*-t>+_HB-K^keY+F&281xUuj|?5l1y2F7p&x!^6xY%s#;P422j9@vL9r=7omQ zZ${N8_cE`^q$FZ6V&q8|K^aqBK$)v2jE)#!Vc+wqq+P)cL8>)8N4f?&N{$)m`#9tY ztZCa*0A@($x2sJX2pPE0?3hNOQwrmE4m3|tEYH)Zy$WDwr3ht9FC+^(h8yL19QL+C zrmGA8mIu%>!k`Qu-6K>e8OKP2r~Nn`t(*X9%z`!&z&FD1a7@Ab!;Jcv0U2etB{bS% z02QDug_Ri%t)qMlkM~(m51yYJp-TG3sVKNB$JVEYhrgX!?b^=h(B@qOEE{g=%efSU zn`z)&Yk5b-fx*+>KWG$I<0z^`OrZJr@Y>8oM>>7EZFs(NVm&!#*Rvy$PL1&TBL8*$ zHb05~!T()Pp)85}z+1(T9zf0_j5?^&nfp$mw=9nnIS`FJ3r|BYt78?hztV&Q6={%H zY32Wzl3#&;=#SOn?>7V!i5d8Zlj1B$_81`IMNGN3ObH#`igHozE)_<&2`k%kXl=tedl;)F%)FafQT6X5qEI*tLD zGilv4?Axvk?;WK~RREu;0?1Qo)60Aa4ON8c8J~z;fFJKx;Q`pT6Hvi2A`m{GUDA!7j#5GSsqBZ5f}=P9>P(r>gNgj1 z*oK~$|82@mFIU@eb_{2`oBpk`YYKMJ5JQAKeG}X*>{>)RGeU17#GagUVho{taw|;H zj?5NfrYdJ{1Qj3Cv2Y`IgYLFnmh7fhE zp@ir=l%CfxqLmC`yD{VP@$#-l&6swG=6P&mn`=R;(J_}^qo=QDje)gs z>U{6KNDDo5za4D20S8)PK*Y>p&^S!@S<11; ZYwYcc)W039n|{Yv8U>t<`s{<)uqeJmJRBdmO-1>WHFzlVZjH-x4^HVd-vQ zR^1h~%Y`_uAc1=B-z6IBaDeot%p#^AO7KY}QF$kacSm<-TQ#3PaAFgvc z^ji$DinyV1%hLTHJ@r5B+xv%Sd4wdhtxwOtQ#<#)C+Q&xA%u`+S%?P~vMgkfv5YZR z@YO?rLS&G!;>b3^pD0*K6{6S#6PMWf;MUEuiSwD3O^M62uE*Q)c3hXux~`jQ66&Q{ zCd;PYl)7w6QtHizx{5;_f@Qs*=ikjb@8uB#M$FLYq?TbAComb8b{WQTm@eDBFF^(! z>M$L*%Q{XcW9i?itV4I$S=W8Zix@Ft#E2=T80ixuM2r|?pb?)CF>0hK28=Yt$V8fA ziV-5b#+blYt@>qF_1ycpPa$!*ZyZVxzJ^{7iIEtA6@(}H@$l%+KF`(DGYsr*h?lxB z+2aN3!dP+9=#KmYNM*PJz$#n;@QA2>KXUfSo;@W{{$mgdK|zR&i?DHsMx=a%jLqxG z)Y-8IY}0AB*(S|uYEqvof)aE_G4@u1FiLR9w`+X9efBx_yno-_!}D|NQMslDjK9Az zPmDsai2)N@Dh7-UX@Re!6qRT}nN;hDJH&H15InJw`a~(-$q82C_dn;?+6TcUu;wLG z&Qd>8X67#1g3wDS$w(}n)BoM?cc|OPJroU<(C!42W>Hr%v`9!|b8OpF!~*~%w2k&s zv-b_r9Y(^_=fBsP+jpOg=R=w_oCG;5k*aj#l(i2(rPR$f=l>^t>%adcBMCI4;_{Kr zj1VplfyW@@8H8~I?6le>d^nK|lOrKln9ew@wpIFSvZ{+!FUw`AyJWq}W|tHHa}Bfo z&7`oZKoa9hLhh_^Z>HmGBw(6Jfm6oavLlGB1ED%Kg1{ji2y?<8@n1t{Z<7G;hEEd? z%OFt-CsV6KIF0cgDm(obMt!h$rcFMJjo0Y0z*rm0BnLF6w}c{5;@*$X{_OXw_u#9Y z%^6)s2?-Gp5XsQGg z0033NYE8%zWB_0$CYKt1*G|4Y^X_6TFl5ejjwxZ|eZzgNfe^A|2mAYw4GsXLH2YLw z9*ZB1Bl}yAAL)bG5Cn|83UX9p9R&R5O30ukU?h(L3Wi`z9m{e++d$M*3o{8tA%ZtN z#}`FtQD|*!8$VRZ|KRX$;8EV=@;{+*$3UuU{4anbIEsEei_>^1!5}Q8^EeB>G>dyJ zS(V(_Qn3z?fecNW0e0JhkEeZPDNfrb$4lVi7!(Tn%dnjn58?_4UgPjRiy-RjU>v7H zJbWq;Xj6&UK7T}4k3Y$vPUCpSN1%$y6BEFkcjL6j_`FBQfL&qK*9;4wgbHdDLW3e` z71Jr9f5O37KmPutxwV?o)B-o^ zzN3^#?7t#w7Hljguekk;R3AO+!Zt?<+3xr``S18zvitgR`=rsEOcp4k0`iRt0m7m5 z5TMcMC8HuQIceRBB5peq{^(uct+c5GP_eh#yU?a#CRK5h)S7^18pT#9Tqu5<@p6cC zsHK$|!N;(80bk*1*+RB#$(_ZZk;!iVp~kmH|6r>>de7fe`m=4`G{o(yVb^%1q%jdf z7{Y?UWIKxV&(U)0Re0dfU$x0^RqNBw<&w(=#XYfzlkg0&*za<>V*?efAXCkn1lGWpED#A~7siL-vS3Z%J zoor5sop{a(krUr@BFBm4Mf#fUe0KV4YQ5zX;S%a;I#%`CDK+4MAOXXyS8Fbl*Gcu^ zxy($!p|%!WZpQJ@YF1frg?Ryi!b+78Ip2Il29+SSimVC(&fnPWO@LnS$wr?#IR@;u zLQ~s8kX-1jZJ}H|mpRJlz&KEBfFXb-DmNqZd=Qu&w z=qc)NumT2>cS#4n;(Ki`M*`sDOMrbDI9~|Pe;Qk5( zz60Lxr$hfRZ8kL_gc=OLl6gd^bc;p@aJ7WISv57Lu?Z5opH zj3(FeFm9N4i{y{rb>ajH0HDtX2^pyejutM27|tV5g0MQOOwg zYJO3j@%KQ{t_SVd1=WTBmzJ{rJgWgbCHz7c`4IqobTa?~HOQe0&?``@Cv)s@w4W^R z_0(86)Dvy8#oKnm0Dx!_0hoqjOf~38Q9}vQH|R;cp_HjHj~ECx%!Dlh}q zfe|;D zT|gg-nwM}Oj88VayUvpS((xsBzXbsR^R4r%`bGG3K4v~{K4t#aJb%7&zGCj&+}XJ> zfH~hesX5WvEnwCS{TF>a^Awavbf$iWH`6wgGLt-We1<%uGW}@UZrXYpnpT@W48V(& z7rrkLtt3i0rHaz)jBpr$8=b6X+Igerjdb=PbqsTuupaM2(-Qp8?RH}F;NeI#7QfKi zqHR8SNdJyyIJMWBsoP)oS$BV;FDyNO`t12}c>vhRWifHvm>L%I0apvk4>(a!L4aLB zg#pZhiY6Q`P%(_bN{JHoN>wUT@7C!R3!%rj=jjk7Ut zL4{Q>m07dq-0nXJ;1(7ehd95ZOy6890AQ1TYLiOqutWTeC{a5{NUEMNZ zK!DqB3n3s7WYC~6LsvtFuZG=oPrMN$5<7 zk2C!FOWpAxAfgzA0KZ}=pMgI(agxA~pEQUZ{XY4`z-OPC_~MJ89scECn*H0q`FH<; zAXwFlAla+0-)<1}SM@D}v6>e=*FU;#yJzrD|L9)p`@;<| zy8(cku;uCxfY)qagU)&t8lWHTSK(n$AOpmVL^qqIqjuGRx3 zAwb=sNTrV#7tU?^0N51Kxg16cjy}bFiuknCFf8XF?GX`(K31l%X=BKex=FFj`5XJj-Sj@Y|p(PUZr+^elyV;Bl7z5H`?cI_)G6ot2%w5J-pqzq$&48 zqC^9LE0?{5n1!12J{fAYZJsn*cPoryCn@cjg%GJd9|Br>yYIcaq(_ER*mD1pMZ)H@ zw}$s1mrJ>b7y|}ESuq^sNoRE&)y#;kgBPcU^N?A@W2Imw;o7`WIG_i9Y}it3vQVs(wV35xMGdl-`cga5nGNg8&xkTR3mI5VMyaSw&*Jn^ zuPvB{VhBEJU>F*}A8t?AVU>r5@=s`5xb3x15;4n2(cPX6hEU6M7sI!Uq3e`f>LZFh zNlKjJg%w6p!b~;Cd@(mcCz7bwh78hDDaL#-#N!1JLZp8@c~-E3WG1v#-eIpJWUt(M z3cN(mWG{D6qcAfRBxHoZdDtJN%7$VSm$HG5t8U6`G|F?_DPh6b5uGmimwGVeO(R=S zxu;Sx;OJ5cGJ?fz6d9tN^X8jYXuKOYED>zWa3hDKmI&|nq$P~G6-sZ>Z9jnR89ZJz z^>1b=^V(LkQ1z__X}%M7MTxVdO}O{-3l21B{$vt&epRm03oOMH(d zR<(3#)|f-sWCaL4)5DWKhN9qdXk`7<<6@caPaceCcG`6z5=)a)@9fRGglJ`EKEoB>Ky|OuY?ZEqh}NX zTZpJ~Q0=wL){j1Z%c(GD_aF;BB~hc_;HgNYHV%J{bDSsT75S zPCYz=C9nYXlO?>ByD;TElZb?|VR(D?EsP}atJAsrEU2Vce%~Xk{cNWe72pOVq(oUx zb7-5n@o017(MCWpfd}!9n1{^VLkEzOmF*47&4MWoyg@^Dp-^;(<-W6 zNQ$~JcNQ3&rRhRTc+`OhIg^S|>nM-!B88+Z&6C$*XVZ0BZrB1O;tYoZrRNy_0#)SZ z?Qxa&G^VJEtHBEP`?BAI?HVoaAovljM5fikXpbRhrpP2^ZNknRmhRZORYb-Z!_9fu zf$uu_xPdU@Z5raC0g*vfiR-3j50R--j*gxoGbxSqPRcp`RqmIDL@AZ{D`qL~S`o)| zKPgCpR`GrEO%wU6Y3HPGp6-gEx<9^C=YH-Fv)V^zSmw1S*v{3z(=0(L+$odET5Ow@74depMDm_6JOQ&&&Px5cU8R)^LSsT#^fW<>r{?& zMLZg5hIKQ>3V78}qj>*PygZLOx)|avW7X|3aV85ubrgtSG9AEf7ps!Ms0v6VvB31i zuR_nyswG;(YlB(ves_uHzqv1{URSN?`DBv!egs|rus)!ig$cCm>I%vF3Qvwj37xss zm{8@c%7L+QkSc-1#X@YZXGOH@asIX!ygRLWX@8VS%u7ho1p8d+OHb za2**bBP3k%)&GE7#>*k0Du1 zc0`*;%uP~yfBPuQz=Z3ekx{@q6agX&CQ)_COwge}{HVu1E{`xLz=8$xZ7l9Z~ z(Oi^+JZgN)ZemlZ)t9c(qro3ySa-hNgwfY^XmpB@kVHs1Ea;7B=q5&KMc17oi zjlB@NprdE8gR4LA1y!#5k&E0_wyb`;hq17&ZjzmFBc(O|YMc9(y%`=fE>{vO&nI!q zfv3r4{d7xz&b0IS3XG4u-I3D~mg#%EM)b^yeJ88a9EO$i$n{flzE{_0w_m#W3)2WP zr;(*2tmMm^9@iRhkvM<%^mdy-jSaIE=K7Y_h(_y6V1Ie&p6ccE-*MLgA)5xH-T=pB z20@DEl(In7DEO)IqCE3t?&D=O?7raxoj3QWjn_s>@Q0Fzq14dm8z?u#< zJ*&YR@-pGG^MtOIuEnQ`z^{voO5Z$Q=vnAleR>i2v-haC(e$YF;gAlu}!Joh! zF6-|8Ru(CudX*4;`o(*x$G6CDPWUh1TmQ{P%gTFCy#7_%$0@JPD(UR9Yefq#9us0y zf7k136O2|RKXA`(z(uJPRr8y}9$6OT2=wKgjlcZ`W(ox}ooOzslPReiu!Zc3kb z_f(}##T7mzaY>nW&-;=xJRco4+p$8%8*grdQI}SCd9!`@41x!wZ`L1#hAG0ueb!xI z52B8MckIr2gVfy`JLH?%->7RBwzhoF$$2kQ9Tm@Q=hwaElo)1iwfw$0PH-%+TY>-o zhoJkEzb5vvx`lJd%Gs+ZDU*<7albhs*{9d4IE&M&=tYRLc+j2-UbB=Up3s8PQvi%L zixCyDL4LOFN{$S z6_!~>B?(+puH!%?B2a|X$~HFqd9ncrwclYA7p9+k*5@$3KhD>clC zuJ6vVAlDuiUpU{8es#Lex5v?@==n+ietQZCjqFI_9MAk18=21b#(BoCgSf16tWKJ# z;6NPZaYDZXH`dy-31n~O=0M-e-K=;7bt-Bhq~gL^cb>)lT?dbF0}lf*WCIe zjo9sCDiPLN?3ZZ$=nswC@^v)HIMLicAl|Waj}-s8v!)|;(TR!oqq6Uj(n)8{hU+5} znS$4f5&}7CtfhaDh&gBv^*gD)cMcRW z6WL>DyBoYYp{La!Ggp%nbm&8buO%X9qg>d~cIi}|aaw_D+)uc9^qqQoP1paqfge;W zapB%KigVff*}AFm7B!>E$b7`uYCzbU@Dx2QRG=U zz&$2cI~(OQw!|y5>3ZphL}qoi@Z`HsKy;`|*B^IhY&|%b4@g&olTSEdPql4y2P3%( z^|ECpw!-v5KnJm_g!V1m=E$%iu*JxQg zX~PIlmW6withF>V%1g3Nc+mC$-8DnbF!J;}m{+udl^iqN3v4$+rr1ZM@BD$yJ>e2x zpJu#Ht|d1Yz8On8?G$+r&B{P}(I#3^~Z9 z+R1Q#06H23K+aBRbF*z>Ra>|tsz_Ryp6^G_+;l}B8tDzzq9JEzw@@FR-4b0b-=Ma` zr>-8kCr&(|NNxT32LxAmAk|Jjph^fp;d|@j!~?nYdPeUb9&9wj(Bol`^agg1!PzIq zcMJ3^m)A9<=O z9{Sk*o^nlor#VK9lo-gJ+nz($%$x>8j^LhOsYUE-H0VQ$>|5vs(l^5LnR3hYEk$k5 z`klf_hAkwWt%$1k_8S$rr2c~j(QSYjYq{&kJ^2+1NlGlgPShBkD!(?aB&AjWEipVD zjaUT9XhPY2LJ~2_X@sAU8~~#MeTp|J9nD@+&gISLy&?hUt!nYRY7s+YB)#mQ(d+P+ z;4lZ@tH`HzX!I)O)h&eGxHkVnByS!i;222M|Vq!IbZ-Kpwi5Nk~H7}5Riia`Hd#z zP!Iw#mq79`C@}%>+)``84C;Df+DP3t`i5D_2FugS@Sct2fo&2SXP?yCl#kE)5wt&* zONR=*R;l6g77A8wp;p%Ep>kGo7OvsCjvu*=Du896HO;C0 z0CCc2Gw{rE+9{~Kc6!dY_8sJxM!jXMq}f4NYCB^_qWT4=X&)8NirN{}u?cZP)amOw z)vvI7t<@l1YPoB>S~I!Ddi%fP8enis|ECvc{Sbg{ zU|~uydVK#0#Y{@I@=k4)3&7jaDwP60cT1U@9+9`G?dmK0^vQM7H*N%okdU=mQ(I{L!=pd2X<0IEsBk|OW!et&>SQO-(ybE@NLFKJ8(&JuPqwn%Zx@sl&ArMkNV2lqZyT8G zpFlRsGP#_5(rC=UKGxgbdrJE0F|*?*hjz>z^>Z**{9SEeKD=}GC}(Whu_tA!Y2LSU zNZda~$}%cckYa7S?^Iw?EVnY*txxSEDMbBCBQq}r>^Y}+V3|r5CRV^aGMp&AlE~Ag z(qy;|=uBY1YQ{2V{94RClfKEmQ40*p2lzVR#N-_t;(5!~0iw2mkA?9aUwoY=IO8`5 z_W9It+`Z`(E7%HcIc(&x@F8CJCgaN{$N3C!5At8oJ+~MDPVP+XinAZW#}g8Yho|Ba zUmF&@PPlQ}VaQb^qhx66bVA}Wg-@WrEMyaZLQlNt>t;=!PJD$vuM)cA9ft|=cY|~( zNPDlEzJ}yALVW4)g5U=RXO6iBb-ZpnZjf@wIZ)0-!O=C3K>PZW{!-D)Bg=b~s^=Ua zXWE?g?8H0CHBi>XxaF~zeJ+93qW<$|q)*I10sA|B4g0*-r=rlXpb$XftfI0b!UNk6 z$6qbmSqU_yXfPT8Pn5SHKKEO0MOcTaOEDof_SP7=Qd-~sraQUJJl)VSTF#7+ za>oj1FXtGcc*aT2FvrXnJR1bwg3-TSw15r}wby9*^wKp#14s$vTQt&WF!HDr6uc=Ea3EVq447+!)#}L&>4@~rDx`q@QZx>W`oC=0@$En+CpgMX^o!8G{1d5s)}@UWc)Fu?TR?~3HDy!^}ik8?vLB>WRy2Z!_O4N*Qc_NK_kMGDtT?)E(9?m zyX5`qHtceFVJGyn;sDTxt2P*eVBBMs0$(vHuJu9PHFRc!(Y{QPYJqg54G>}%h`hfB) zz_(+crMM_Gl5+@ff8p-+PL(cI_)khdpPIqQu}E*-F&`vNx}=MHRiN5bxSPHSAK3h~|;@StU<*!7)P`iG2C~4|)iWu94N-7Z0Cn69qffb}89^dczCb zGu5D^rqR9-MekDE$^LsJILI|4&8|=f@q}3@jR7V->7C_XGhl|?0n4MK!$T6%YFwr&WtinL^;=r3U(NI z_7yCUyHLpu*i=GM%`IXflR*uez#_IEwYAAsOoh5C#gbZ#`nu9qswEnxD6T5++l*S_ z>I!J8YjI62L36d(%9ONOgkbr^pit#lQDsXXrDs3zEbF@ zjaa>qqI2fshFXNRb1rU~thNR%aBJn;8nIs6&{GMo2XJTEgk5D9?k*G_-WQd5BQYo8 z;}N*xB{>7nqFsUu6%8)g0@*^;W_*WXs&aCuTYbTd<3 zAb*>m0nU)qhk{v{?ecn=0jnhM%IoBMte(~LySX}o6Hjd6M@T8DtmDX?7zMTNR#52N z$79AVfj142LK8B45dPOSncLnYD0R;as*w^9zk!vr}Wv{(ZJ1yupZJv@u!Bi`~0k;Qdk2{TP!>!_F@VoI2_+)$|ew?652qNSX+6Z&R-9&_Vo>)k{N^Br@68|L5 z64!{E#BU@~k^)JIL?P*uTu8yBWKu4viZnn%N#B*!luQKIE8{EuP_|aCQSMN_qr9xb zQn{;&RZU1h{^N2}bw*7?4Ix*Nd&#J}vwFIEqlTo0g9cAyS`)8nrRk$tt@%jv7iABH zL#d!VqLB$I6{WtWeu70|EUW=Q9OG~Yl)>^B_`jB;t^&M-yRV95<`a|gj>Ay?gmj1VNPWq|zZUI}M zttzW>RBfs9RsF8&jj9i-8mjgbyi)L^f{O*eD)`TW8wDQ~+%C9R$QPE{Ds8nkkL^L* z>$W#-b+-SrH5LA#@Lb_93g0UHufo~FzZKpol&UX3S-sA-Zqqut?zijS$N)kWsId;P z0RbJd#qbV*n8ZvVfFu_B7@z^pQ)J@e(+z)JJWZ>LaMreBurLTDqLhy{y5qG`9kdK? z7Vut4^mj4n#?XsVca=XkdZE{L{+81J31Jxjo<3!s=UwQO*CXMC_fGdj@@nwp?4M9AU_`Mg8G{XXmY9^}ntL1MvF?lQcC8MgNJeq4Haxz+{CcaLJgwhnA9X&zEXhQ3eQ_ffVdG5a7 z@ALYRpxjT@cUV424#vd$Xj)I)b=+maEN8JG=bphXQxH{t)d zTtaMN9m}XUmc6o6eq~2=yS7_l#hcUdKt)l_w)Q{yb#4CKkrwLl-_z)E~zAO_SQ!G=7AIwPMW7byp`GeLDyh4 zsz_npGs87|7cbUcjh%t`p29BKXl&oNVKSoI5SD+$fzs0tNZ5!xcUFqWeXl5hx|r;Y zzH%Oc+)IYVPN5)FIX>S+%gY3=oy4HzAd{XAWv<4SNO-)aKnz1< z3~4J%jiK1CgyPya17VUBhS~ zAeD-7`>&+X?Q-ZM;_Cp}q7=n3u#jUTLA04`)U>cOBnk)o$S$E@bG?*Yz zsoTmZ1zSdR^^;NW7%;|;tC!3)gB0PSCC1MMDLqp6&hR>->KsbX)1!XdelMmIzSDesPoZ=NQ>Nm^v zEF#zDFhx;K|MF|LE*ES;fUG|BMT<(SZQAePY@?CMjCzk)4(bbfuqT~e;&9dPj5acz zJ(cb1Y6i`e9_F4H(N%Q^y=X)&kNZuzx%^pUC7CAnP*S zuH@`B<95A5oNeH>E*?knxx@1CQTX0aGpw}o2OV3g5Gs2T&aAmV$>Vdo^a$1xJ9AME z+y0Y!X<~ze6rqW;+l>@XN1zG2sM$p|YPI`ZF<)pL3$?7|ZU+7KBe*_7vCUc65^7|k z!=L5czo}Ubgvr+k=?S@fb3Q#V+xi>HW!3a$NxM*YNW}`w>0$8hwhdhP{C_4(?PG|F0LR{i$a2Nl-f552LfHN`e10u}TskrG$zg1>hxy{;4l&U-URgB}fZ>D@c z_Q2NtHv52f20~e$VDRA%*ALYM$0^j>G)X5HcZE%zI4OpcH0D!UMs==>@nKkW*fV$g z3?mMo93hi>rv8ZQvYZJ*In=$@z{NIm$K_;EkBGxebPcK#`pYC(1!ag2joyTNXLon} zVEu|xmm1W$vn<*M78f4(t@wTpEuM77UFXdjWHJxhJW)0NsZ;M(GGcWEv z;hRp1Cn*}+H8;j*xHgWAP2r1fS`MZ!hM?V18kx6y#O>1D^hoEy7M&t2uQBJ#Ud@nP zO0k($1)fw1oO)h}ae2KniTO|Z;13Q|6FKSE4Q7}pZ5c90VIm|SpospC-Aa%aab>^O z*SiStjZYjV41SRV6xD%XN#H-t3-#Di2{G!a1jC>ewMY^aU4$7o90}0?1lB5h4$R4KlSuLzJw&Tw6xvu2zM0gE(ojNxWgEW&LAE z4^f{d@BO=>+y_cqe$Y+M#>T8k5P=n zTtjguB@ZPtIR|gi*o{a^IsH&1wAmDW<2}1i&WBOlo6cChFW76=7shTXq~PYUIxh}@ zIaP#Qfp7k!mgN#4kYo6)w8QGBi!fHg)Q-v5p+R+>M!(n#?|1x}J$@M6h;mX5FNPN| z$+tbDNqEzu#h-I4q#@Q>VM)I9 zBF%%n6lI3@5or_6C(mc~fH#@)OIVC3-IvEF&M^j!HoJd{*KeLc9r0;1LMIL#anqfQ z>X#o526uZTn0ddoX0rwszh}2ty3Tuoq*OsohBy=@#ZNGSrGmXv`)cN69h3?gYJO3r z-R^4ih!S+nnV^~&&;R_aLBDS}S#`J>EsTRw%(mdla65X88If7{qf~?zdjaNn8`Nh4 zC0OGdCOY-yvT)J99%_vY74B<{5t5GpAS@A z*HXyjo&7$^0?4MT#|-;!39DmXw6n~owU(LO79U!$T>2c0Xw-*2JUp&DUc%U(NuIDP z9&g1_H-xJ`K1YtaHwGCdm1`X_H&t$<`OZUF1~+l_;ZnUxUr{lXd-~o-F9_>O{t|D_#XS^BlCRgNAMIu~bKFkh%bR^3 z$6iv3_{1&$#&6M>z5qsIIQAIS<(-%em@4fZMw@#&#VNlTbuyHkF4JaBf2s#`NiC5| zKNf~M+HN*N#T76``Nq$oL_*#6TXHYEHx!d_Ly1#|g^m2!hu7(i+4nt7Bo*9MvCWTf zv8?O!CpLOq#GtSE>$%gT(nojTuBfQ5Oj!sJ6(RVCm~Rc+zaHGlk9ydze&CO`;*<%= z04c!Vbyw9VdYMW2zqy0 z^W_E6W-s>hgfLX@MJ~i+?%Z(~f(x!IcYwKZ5G{M~Z6$#V+v=0Uj0!#hb+NDtmnewf zT!Gi|A9)==PL<58)RlVPysL?pI zoJPFRV`iVP;=cVrxisObx6v&AXSKc!8K>|sN#@45_2GXnM?l!?$5(E<$202aP2XI6 zG&mm!1iNR0oXfJ+yX(r9f*wYvRUhv6f4$6R)8`&c&h9D6;^e%rKU%NG7$yk=S1j~= zT842p?dxa5t=Ept`C9VqwqH~q?xDu7T&U*rIZMNU7wt?PqsQ9tnR~v>AJv!ZMSE+k zZpIf-5CI|hGwlUCZ?LTIro-A{9dNNfC!O;1$AWq5DAD?7vu z4O`qBU1k-=%93D6_4)*Ol1X+NRLwp~0zUk7yRwqe>yXm6=M%=;-E!o(84%-AsD&wh zGxg_2FJj7b=94SiJDx)SOBVJM$p(^MY0GG)-RUmqMVKYSA0^!7xd>v z8}1r(nnRK5tnjqf;M|x9R!ArcNePyW2?{tp_xkc|KOmaK;_()ke7<*Na(+?4 zu8x)X+BH?h8VGpopG^soJ0<0`vGCIES-cd)I2BC)gFQm#7Q@Bkau{<^3?nvV|H;WON)l#g zqhU^!8QmY|NxQ=VN2Z#0d%@M?1H&7OCszmD{6Q1iSlp&Kh`zI0Ww#5;c+h>>?Ri+~ z1vAJ}6o1&jWmnq0Qb6JE!G8aoyEoR~QzyZ%+E~ldGSAc;Q*3QK=EZDuCyV{{QgXAE zYww&tz3#%I*wuGO_%eQ~mL@X8a}5zcD0jj@L_|nrq>^kVYZcNd&k)=1bSV++;TdUCGWNUp(pUgM3NP=i&=+ni;|VtJ3WXl2Ne+g$ zm$D3aE>^aEg^pc!>VC19MhRf%nyms zqe^0@QiXjnuP%@o?9N?>1KTT}p1#vn(C2MonP4p^0e1MtHMf)RkBB&FQmih{uITCy z!017g5)sKJz~@3@o&`tLgy;GnvJ`D?gNDtRl(=tQvA>}rl9@E@UAID=bKmb;k5Yj? z$C@B%wN9o}_lg9c1n&g=p|tA@HIpYn1=eR5U**rRIV*{r#>CmnTsHV5>KmR-Prv zl!w%O-TWc{#BNNtIsAACHS--~wR>Z+3EZK9u4>t9)?yg9Asqv>V>vIOZ` z5s{PyGVnYZk85xx-43tpnxi_+wl}KV_kp+~ZxBh;Py?H|YeqofnwFCUPbE=YCs${G zjV`+l8Zm58ucijd1hoxIQ%CacMuEc4B_35+uaE#1Q5JbxIZiE=!UZ-l*D{jC6mU5+ z8C=27(0K676$OU60+ z)injumC-^rt?@obVJt^-4{oL|K4Y7*m2BNTwA5|1ca0Vq#-o3lj8)_GR(R2!Mjw}K zsHF?0m5Y>@|J#}4SjBJM8yar-i?0PIVU~?U9fHMi_7#d7HjzfS3D^=m?WS-OX9%I^ zg`^s_$+XM=v@h7k1iF#Jp*i3W^Xng^?pgOyITb<>taMRtERtFsa0>i+;uiu(DJ-+o zsrcGbtWWR?wh=|)Okq6F?xH~om6;qCph&(Iw0aS#))!xlzpkl zuyRm?Nou_kTjkG_Gd?TA8pl1~8Ta8R53JRcpp(-AJY?_R42MiYepi7qhsn9V4c49m zB|;h_<>_=Ak?wMzggY?Lmz%jGUD>tB5dj2VOjYke)BdIcgIQnhwA7l5oI@&+jD>?ui15*WE|D>^Y4!4D zV1cA#QbakxZU7oye)upk$w@`kNcVT$7&MT$h zJ9e!iZ9mERP8w3Rg14r_BMAPo1g5U5ydFmR6#o9sajMv{<=Nje z8CT0YBF7e}qWw0?Cke)EGNllulc{w)dEcs|$@x{3yu#KrPR^3()L-~OT`RZ*977Db*;HPESA5d2$Ii>PW zoKNvie5~H`Jo!V&R#S*<0rcOHKkR2A_dE<#9#`Y8+A(cl^vIx z+x16$OG`J&ym)WV%k{O*9UUnq216&KXR9^xOZzoQ>He|t)O0k@N!$Ico}$&7b!b0< zBjlKFP@Rgi+fsJp!bqnAMo6dpw(QH`i2HnJdpis0Q;_>E+OXrrqM4q2S|Dfd1h3c! z0wWjpDL9yD`2N^Nro%vkEgOv6ea_U;(YQ*^-Mh&W+3MC};Xk_GJI9-1u>D+Nr5<LNbfuY6Fsz-371{G^yM^Iu1zO|vSfW}o)%D<&u3wj)|eY6%S_3onfzFj z4O&tykLm0dm^$QM29vE(hSb<5gP@j+d!uUUVa7CZ$@Va0yMROGcH((9IHiA{#wyX_e2(Uw326SbzSlFX429_t^>{H9=TOP6PHbFx`D-xO zHJ~Q@e8}utsT<=dG*{C8k^VB+H0E|U!yFcAhkl*GKHmBjH2JAJQEDxIzUFgV7jrA7 z@7leuZrxQ|^)4<8g@n|ErHK<2TtO<;FpzQOLFKr!xA44_fUyoOUpFE9k>tT^iUn zpA1vO5T!^bM4PBn1Cg?m6c(F6Nt9JHgk!u?RE{ky(>9}{<`(u5r-X;J_Qy;9WrsuB zq!6PbadjtoXz92i_4hB|49K48X<0K&Q0>%ZTJ=XH;r`DkmY8SO8v)R=_f#z9)jd8O z(`nd<(E)xCf$zz|n1}?aavbnDFL9??%;o zOxf_+#LH3&*w1@NYh-Js^(FM-+u&zqU76ct)R-?kWodNfefx*`Z3&sEXoN!G2)9Ru zKt`5AD$M9g5}_apOU8j~4jGqS5YiCFJK`GtMvuW#Ok0kdc+#r42ce{4_5?vWqoVW9 zD<#fdbHhekS<4qu4y2BkLy$B}X=_irACS&I8Bpd+R>UN?064mmU& zzXA%1yx-09qC_Mz));j4XafN{>a~us6d23N-99PcKbN(G6^*N&icyL7Y|b{9Nat!$ zoO?GgH3U|pnX4b)Jz)UxZ>TSod7?uEO{=*+=eH(%MP(TI_l-`}W!Rw1IxAd?3*8OV z9&Cy}NMf>RYY#%z3SwaIRUKjf!#vmy1Ls#<(W7H?c9Tg0$|g&sQhL?QefbSZEf+ck!iF zi(>uah0sFudkCE7M2SMjUG~y#^xL(=I@H*>>kx;Z8=9DQTBZ-S0Ih4#;(E$sbQF;rVl!HwtXk(< z%yjCpZtZ0gy%*BzkfgN6zMq8Yar+5@V0p7>&u?ybT@&GbsXNxBUrx=5t_JKSl+^U> zj?WKnkVoMFSxzu7em~MucYZ~j;$Xjz!3M0K;r9ejFv=Jc_)y@A*tSc`@X-4<0HaxY z?MLBwvu=&M5Lnbt3}vs)VycI#tqtwanfBV%q5;C8WpIR5o|kY+ju+Q znWvb{G@vt-qzN@LA))5XI<)S>#`m#$qGa;#0t!lnOslPFK%{X+V>3;JeAFxQp>#VH zVPsHOFEjBkCR~&JRb(M@2!N$6uomKa6Jr6epT+a>ABW)D43cEU-cqJc{m> z%;I!j%1Y$7tMWbh;dBgv@JeTr9c(aNog#A%*64yh!Bo8j`&0vLxYc{Zv|}@u3g*&Epgwtf#NnBxn{JT zzL79w^f!qV*OJv`ZU5ne_`L-8FfdZme(O<6&M{w2Id8TD7aX0%bbCp;Uiow`zCf(1 zyvAhVi(kz=OcWX_Ha67z-@4dy$v5)NN;g;9ese%Cm%~L{nLvryUKsYY$xXr_Qx79{ z^$dAI*>{t6fw^o#tC&!xOR8y+Z4}YJ~~y=`f-#E@3(_un{l`+w65c(Y$)?wPCh6?Q*}FhY*XH% zGj~j6TDl0U$`g%wXLqijc&ApD@W*`_Q{k*g8*hydoOkry`i6UJbab%W+;P%5Hoc%( zZ4g=|o;n&>l!xOo)ml%qo3td8)N1Ib4s~7VJ!`5^4)DxAx1<8*@6W z(+edwM~!vG`s4P`M#J#jjaTa~sDCX_j0WnyFnz|SFx%c^?FP+y8G7iX9R;^pdL3OQ zUMa*j3qgl`ZfEe~YEPhdpph5c+U#!sY$`hIcOQK%A$!||Iwu_7;VIHFEmh+5FgS-w zn3GswV_EJjTJPx`SmS5rJCEAjcT#Qj<2&wiJuA}-q8*-}w0a&MYy|pO7&E~46Xyqv zG`y4K?%Nb&J)`mpy!^It`f3m#1jo~b)&z}EhH|06kV~$7MKvLg=xG#F4(g?N<~WOl zyouzx*GFkYI7#I6XClQ(#9qBy7Bj@&9KKwWOY=UvJnbERzt3LiZ(6^*JMvVEkw5OP z4%P}%LAS@fIo!RcB`eq*J`g>$FW^aBzGnNHh6~%C8&Ag*Wbd=&-sJN+j+?qW6^YEm zmLyxF&Gj(#{D?av!5fn~cDotl?-&BvRpPeNhB_mD{SF$hQBSIiulM&@d+g(Zo{`IK zsi@)7oq6zo8Px#x;~c(^iI)1><+y!vVHIto^PCf-0Q!bN(A8QwIOJy?!k{9;RVgqp>TtdDfIKt z0HK6lu87-BPWvanu-M(gp$~yZB8=-|M{3eh`7tr_O@CwdxDO|}A@gL7+hO(<9? zx8OtjGMHX2^OZQ$p{vtNd;^(>>(h;S?fJPo>MPWw;!}V#LRnfpyD#=XSo`!zKT!Ev zHn_8-I5)j8ttnIz=CRPlvV`F>6PW2Ya)!)FxA494=5M$qKT44?p-aV1$LMio0fOBlhhpLgaaO{tcYUQFO zGKT{)X}s6O&advfe0_GdEtP6|f%+sQH5=g+j3t7&`{?mqv;0^Yo#LvrD;W}(f&A1m zew!YXV=1jwSJ!~-s$tlmiV4eJg&OH-I~K6}>9+_DV$$7GarZi+)81gQYYv1-dZc{0 zc~kZizo3LnTW_2>^SiM6Y&0E{K<8 zN_ZZd%$%+Z?^n1zOiY;83j7Kltxu@fuWMm$V{^5J>CWqtEb);H5fz?Qjo5JDJx3{dlPB| zZb3Ae$6*h4Gy>t3Y;^ttjVB_|3v6LD@>Z;2?8qlPxjE{?6jbTC&XS-sw!F1P)M{Vm zKtS^<-mr*T!=Z_Ez0+AVE*D))=gE;-?nV%2H6nt2kjOGSab@~LB(~_smf1vQ5=E2f z9imXxnY{(XnH`}98;i7t1J{yD24_HeNr|n3*OWm~s5T|#+8cgRJ|&`PjjZNwT^_gB zqEg*~j6zaMLJ*sL7ArxfLxR(R&jKZtI#ulzShJp8DGKRqa`w`C3E~T&>62khfg9!mJ ze&)U17D|>CX|s3gWdmrg_wZfXEX1n^HliV$Fs~tP_S)xwT@#s!CXu>^V}hWW)0UIU zm<0L9uF9XW{tR20CKon!U}w2C-u2lui5|USa8pom2+PWX%BuvLJTrspz~V22q2-F% zS43kIZIsTXlu5~BOY1>Rhp#t!qDy)crm47pwtX>LbdD)nY*xw7x=LPBU@l)gObry8 z(tA5{bF*=T!(VTR0R^RFX0BI1ytrykVrGLEH^jfP00)_fU>`=nXSgIBmr@s&QT4u4 zr>#9U+u3uyj=ugr$NAp&@;-O=%;{5|>|^r-yTaW&>xF^-<7+*|0qZNde7pM#5Y*N09xaV1I8IKh)a|4bKGEh=1ehnH=e$$)FOT$e?r7h+|EM3Q4VyF{AS{s) z;KN3!^u=;sQnKTRCn$aN?R|yL(QeKax0=QW&3wU z*4ViwpH)n!a3s@;{xCpw>G9&H)y=S^C-D#8zhvXpnnGyCV3LxHk@9^^^-w6_Khc6- zw{Vid5oJOchSM~C({lXH=~bKe(?~%!D4ptliWJt>ku?l4WKe{NXLEp%j&v%cI=Ruh zgez~AT(XWV%Vtr%>;#qX#yLjXDC@=CjUok9D;qSdAnT?JvTLY8)<^H`#!;Z6Y=YWk z{bO_Rr1P@H=wch?u;LruM93B#4Io>q95u{p$hO!kIv zHtK86Obh5O+I-KD+UHa=Hj|3G(PInRF55w^qjmwUvpJi^OK?>t!GDeJxRy2fTf)G9kl1vy_`f_&ESRHt%TZp0M?g;4+`--W3? zgq(}wTpHv^#P$-3a(Ry}yx3vC>jAeN)DiBgm_yaFI5k|&g8;S4GKL9c`)TfHTm&?@ zyG4w<+$(<70FO3msdjs6N%bpWMzv-PZbaV zEc?gv(bcE_G+6ePV2ug@;LlHf{FO!(*S_{8hs*{cz(5WL0IT=^8WJpP5o!MGN8o(| zoytnb53;~5e+?D7+6SQr$qcS(`7vPvc5nmH(1Dnn8nT6+S#k~@`XUo0D< zm6m+*C4uNtL`r!Xe!q;9TqSgoTR?ie1WB$u1Zxp%pUsYFfz3<6tAQk93)>eA3jnk5 z!?2iw?PRo5Z&K$lr#u1;l(A~msUmZe7EjLxh%K`4+RS_kuK6V;IkgBN5lCUlq(sCa zQbOR6M^@L8b-?qLa#~;y5|~57l2n$^fHe@|kpUv`5KjmXGc5cS;De~6gkniU9RmD) zipJF~P{9v4oQ8t5j6r!5@h0Mfh7S%fh#;#aXbFm0+=&WoSb$s$ON~T%2~aDwxI9V^ zHY8mq{tw{qfz$E)7jE(J4A|;3n8rZ~vi(~jyVBl@=8-Mt_9**D!`3MAXnBd-jjYng@ z@2cOs!J<7114t=elOrA?#4jtKCW9P6vG?&nxB>tnfDr^rgaiXMdIXCaPj2NXg$(sZ zx5$aJNDM)5dB?lz<@;9^TgPPtp%J}h9`s=(`Yk(UP@5gz_tcwg#_JGMrDeV_>VLDk;{a&{~=0 Xc4x0QeNg;29w05e@%2Q&d4zff@jeEH7*duLP+rFvkD^HUcCA zgm4RjIsgP91%(I)ARB5dV^ArXb}Q3Sc-XcxNg2V6Y(oqqB$3G}ZY_N^Y93T9-G~ulEf_IEfLIGgh&5_}Sn?o3NT83F{p$6k+xv--jEF++9@#}9 zzmOz3%^pE0gvKZw#$)jzPZKQf1B*SNE>EU7mw}CJAKp2IRou^~1fM0_0+5fGz6a9bo5V1rfM16hO zIWyRFP>21AdJ;0Ck=F^uWY@tV5IMV~!XVw$_MrjrutP|s!FeUs0XXr0HebJ;J9kDI zL2|S!vyyY9oG3`G2^0YAl3p6^3cRxhWI1G@@dlpd5XvFO_rmyI0BZpHMNL#xB^6!& zL1d>N;AxVb&kaE%*6_cF0~7{@7a>*(Ax#D$%PPVeI|xCAgkn1hr5Xv%`U!)E2qUHl zv*rnl4ik<#i*TMx2oWL(0vHsK3N{l2N|izf1TMY*c{Xh+odrQ4S{=+_^F141Nk7g%^mG!b6%2 z39_t`Y>ge#1Qpt-*iJzaBII(Qqi_;SP=G;DAc+VCEI^XEvC(}akNB2zviK>)Li4Q! z?@NRvTWqz>b~^;+%9F1^p=xyojhi)Rp6R4hoaPLQIiu!{5{~}*yu>oaF~u__FeNf2 zF(oslFr_nPFx470VN~R_8na9cM!{rej$k;6EyMxh3keE|g`^CUAqCPQ!x8p3Ldj(; zAU|3S1~)_N?{j?7Q32d_C&BOv2N^Z7VacJ1~_GEZ-vx#YO&lySb?Zo0mK^| zlhsq{wyA7^%O%LzRASpU%X{!7>;nn&Qg|FMy^hJa&e>k!7;<*iHa21>_F#DQB1N1m zTEP}c;{nSZ1vv=Gp_8kSLjzqP#T_)dbmvB|eyIoc-m|=pzhNhf7Wr6mn9@cK+~`9K z%2+4qGTN1+MbyFCyPs-Qs2rt)F5<{(pv|?noApu|ee7&Ew2jmwM#q5@7j8Uw@nMMR z$c25(%z;3VrQ8T{%E%^Sdz1AhI~sNNvLUIm;(}V*9ZGrFU`1~>f>;cT z1}clA0&Qvy8(zX1$M)gozC^`(hO9eUrCEzsZQ6C{^c(azeV%Ys1vvPmy(TeQuwl`0 z(mbUlM|)8S3vpOw@K=|Fv6dZjps05RI5791j)0pG)N4!tfKsJmO7`5p4xbk(!3iip zUf3tV69!@Qbe_R8O}a~x-y@4qrdmm_jqbaGjy_QVo{MzTOxZhO6(R$6&~#mRLmUhY~+R4Yv5i88t>%KrFsx-D8GW0c8X>LR12I5cjWPaNtL z6y(HnOSk4u*2-($Mq9&$WjkpZU1&Vi#Go&qcGt>o+f3Vf_Vi565@`D~9e}RvNb*xK z(czi#(dn^H1OOe4wFlm_7hwN}mjTfXnjt#w{nF`6(Owm?vZqcJc#!t(QjZnv>usIU zOU)fEo;$TMCbXv$<+3Ubz~Totpa1~ctEq$2Liiut_Wxf46{`OZM1I)LAbA?R_4 z=crmbb#QuSpX39vGHsTpymf)6DSHTj7=(cs!+XYxlW|gSynHr65lvJAlQgrItQFVl z(15kjr54TKRl|vbdRk}<7ic%2RB%(tLlrOOVvTH5 z7-O6X!b~y+wMj3tfD|Ydfv_}!Lvb0HOP6HGG8I{>y_y_dt|8BqZz&K8ZAFd}SE;AW zU#Dgw0L#x1(?!%CNF*9c69bVX27}2)q$Qg$o6I1T%;IQr8`dPZV=;LY!K9i2F9{Gx zi1kDWCdNh*gpy(@8N$i2k^+&GSWSg!YOJL}EG?GPA)X$y8IZ_``AkS=#zGdPvSKkC z(%CVW12Q>cGbdzo##S!K<%;dxkk1`Ed7zLdcJo3pZ|voRQoh*F59R!EkTeCTCB#W0 z)Dz=02^vXpkqph`xJ-do>bOb+ZE4~<9XsYFHGc(zkD#6FaGnxRQ}B4QvUlH`gZ=xT6Xkx4B@>JjdpJN#CYM>_U`Z=#FDLk ziG#}|-Y>tA1fhC`B>L4$B+0M&-DJTyz)gLSf=q;#BCOX5+ihL7w`d1XMF&Y}Q_A6? z(uvE^WJ*d!ll361K_p3sI2p^zctZ(|wxkY|AsdX2AhL+{=@HbztXAQy8rE0t(iG#$N$Av=@U8?6D?bk2S~&F z>Gvu;aiXJb-US;H(my#Ec9qma*~jcUqy%a-Elb!YpC_LS+72`=u69y%-qt+liUnL- zhT8Hy#FZgp#Tdj5yD@DqJN%~(T1J8Qcq0oSr^-88%D-*y(iAS|y`smq&dD2{jBVl$ z*fOl2us@Wq$mhPS;r&b~^UvJuBYA!*OfMk^Mg~o%K=RWGLS;;|JI>1&dc78fc~v^= zcrDXsRr|OuNK@*RRWbxa8fN+-ODf1LI=XW{5AWN)S?EkSac6-Kd6G`S1M&ocZs;KH zo>QmJG}7dT#d);o(eYGsSjRU>&0;1a(=3N7XGPwq=}V-K*Gn31Gqt>zQ|fd$0n@4( z$j$`Hg4U3=KB}|{J3ie795>+Ot$d@uSst|2&44lpWa;`%w}r9VZq9Pe2&D7%37~p& z;g4?7R<_^6X2%HFD zRQR3^0J>#XdtSVB2~j%gE>nKS?dQsU$o1GL9{EX#VENw5Tk%+Y>?cWczLdGGqe5D& zVCd+j@QIJGqk8u{1Sr*;6He-`)+%UW*U3r6&0odt4Rj5B*Wd?O%={vh2tNLS71R)p zbo*AntN*;iu!Z*GUh&bRs>S^;aIK*3J>CnnkgsA~K3`m1st;2rM^=;s?u+&{fHW2g zjGTQ0$X(Ot5W;}(+5g#rp=IM*O5$0=7K5UqeFFNb3tO$G;IuBuxea01n6q!-(8H#! z;iBNsosYYJEQ0-xSq!kkzDHe9DM}?QMQR_cE@ar2c56BA zyy;*Lr^2z&LYN@&GB@mUCF>v$Ukl9QdjpxTR%_xuvq}**&l9ce{rC z0MBwQ1OUr5;A|uI5a|_(z)nT+^O6j{S*;d_A9z&sE&u8Bc+hVMic5#jDjBxlnJU;B zYJ=YxWV3B2jo5io)3EE#Pyse{&J5OO=T0&aybxgAgfDx0;^NqC6TU<(&}ZYibuVoM zb3DLC{ijx&xm8b3BUoHHHf_0-pg?o3E6LbMwrmrP)@f&I$JWzA!~mDgKhVqh#TN=M z^W8V)K`nvWux{OIiZ0ZAps7g-PtZ?7bXaMAIsTD*Uz&x_NWGyWBh1<@nMNx{@1>Vi^2nVYe;JG%ysKtF!j!+T5800HpKZo z^9X*UtFterInz`-s;fKB8H0N6gK~5Z#DIFWV2&lBu;juyxw%1UPWugyhv0Ix{`-A= zPHE0e#2S}cS-0-9fCs|PgZ2ISug$-{53#zA9x@#YSJ-1#&4`&BiY_|G->V&~LHggQ zqk;CCT553m^_=6}_od(_2I~QhkoHpMW>2I7)!rf8BRqb(YDilp)8RFD%+?`%H^{3f zMh`*gAt1XRAOI-QDXj#+7Taz6jKv&wjI7mSdu3Txez9(-vdG2Wk$m(bu}=^(w=RG! zuuCnWu-G1{C%~LeIQ&~u4TZM}Zs*vV)+8}MzCRi;uw?}@V7n^FMbtzNq8+5o&J4}G z07+heN>&iW%L{n9(~kC?Mn(fkHBDdSOb(0h&VvAR&ZM)M!IEY(gTVYf+ppb0S@po(~x^&1NOL& zsA7;m;uc{#T^DZr5w(yl@Z@52ca4E9g(|)fF)lt<{MdDX-V zTb$PUl;ii3fsE^H=kT#8=AL%_26If?(Sdq!m*s(1_%a;l%lMUwcB0Q| z14j5V9B0ddQt)LZ$0Q}tk9-*h*)saH^fIOdbl|G7`xCDC6^;MR&j zgB6ES(D5oQZ6l~!gLKbpv7gn_n{I7({3vd~dSjQ7SbwaJ;RG!1$nBt1YkQVe1B7a; zZ5Cg58w_G0YoH%^0}itWy5kLVj*8<;{deGrLn+w#<1VY43yXEI1IP-gZKYGs5G&0Z zb(gtKiug8bQeUD@o>jE*CS_x~pQ21h+wq*wlEEd+_Dntw1hDIO`Zi5azyga`KEL#B z&f`D#E8Ygz(oeIg+$ccxiz+c_pal>RGY#l&u`EP+hYBXd29i><<`>nMA_EV&4ssZP zDH8P109(3k-9Z2$F%uA}hR|3n0}F-iQ1YW6gudb9z6-_DwVHz8(#8!n9q&;WGi zs89+*r;x^kJ%go-Xc)QT_2u29Z02#EcNB#9$|*op357 z8&Z~j>VJYJY3L+oU=ya8$em4EtQ01pn~)4ZFixc^k);I<0w5%2()3PoNJ<|K5PnZc zrl6x%zH0d-dN>VahrRQ4kU` zDO%jE8=e`=>8q$O5`&*!N1D0m-(Kwi1eIwsX1CK^!RGr=Y7K)=iT6C$vkofSxWwm zw2(1!k`MfR{!IQ~`H%Ar{8jum{$Bne{-^w}s5<~#>4oSAT!P+ z^2+iS=lyHmb9pc4+48#cJb7m&5($?4kEBm>MDn@hUjEn-ZbZh@4jM?V!=dSHdE)lo4ESmqFJZwIALok=Ap|Ab01a6JdCgpO58Am7>k0ZLK1-583eP!fmmwDfxJiEQ=xdgfiV`DWQ;yA1xbbJTM zcw@b>(QeliBequn0SHE!%?lAP7Dhf)Xfej=PR$WVMhT+R`HXIa0h&=Crv~;#L`pzO zomcB4eQtR%O|Y9zlYjxjlJMMO6gW!K#KW1a2Rfzs^D4BSj@}2>3PQpZ0pH=!pU-Z& zO_LvgvfIJnZMPu!5`@DBc%&^YyaWe|{5UOgDVfr&O9BJ))Hw|Xw`4J^im*bH4QG=` z!Bl2_*>KK`St1e5UO3mD)0gyN{vlUDQyjkniOOLiPLibge1P#db`qQgCEqupOa>Cj z>Vw47H^^qQ>3WiZ$FoTpt|v{-{|td+f@%Tcs-2>9LzfpNPnE6A&^jRf`sO)i-1Cni z*7|(@@xW50&F&CzqXRy)5hvKGl4g<*$*+^m|-|r>%m+k{}sU!tXSjLH;2YvcTj-;_~m!%Z)364;cRZ>-!a}YYrNS^*aLK`obIbJ1{Mqp2&=Jedf^gG7TKZ zS=h(&v;1y{#{1yq1BUT1NG~sC{oRKfa>DDiYfw=yn{EF!n0>o(+%qJR7?z0G1ZDZ-Yk<)a?I+JHiY~KQ56NoX-U*sNWf%Lk9t7AGfOZ}m+R}i}V z4^kY`DJ;X(-r4g;9MUCNqA?Xxc3GjTBaCRahsQ|OGXj|Q^P$jp7ypnv{KQhd-qG21 zFf@_T=3!{H&ub<|oK`j@U}c zNi8xIy#=Fgp-ZJS!!We8)PnSH=pZbzOIKar&=(47s7byDy0WSB9k#)!uB4Y3+ zX!JUv=jGH0#Z?JiF)dZRT9fvX*Z zQQfEYLLADRfMXOX7pt?KTj)ByF$zK|=&4EgcPSnT0H;%Y#We1*F(GyZDpl)<6;YKT5-EsO z7_c~2G&Oay1KQul0wOsC31rn^!STjxMKE|EXTG49^z<8c><(y!(g{-fiFC;ZN2=snH zRJY-km)EbYt9c00pE2kbxm<@14<3GRcSpBfhlfM1vdDDCwFev_9EWT|%7AQ>4hCEJ z2rvESu@>N3P3PV{oojU`~R6UC)4_ z9_>eo1BMOTYsv1JCc8tvwW@b!7z|#GxO+SVJj6*Y;YesM5dxV{1`sx zI0iw3*v>me61$!^OFlz_J0hmu!6tdxy|g_r%{ zbBjFV|}l-ed1XS`bW^-l9wG&Q*A=aT=ef(v4h6v+?;!yT|w4D-+Hq*C6@ zlS<-oE6K8nB%_5WQF?6=jNBH-Y5W*c5`y__H$aiIONw`&?(4IzcQT_f~+H=8bys9rYz=F!d#gVbcS?^>PI;6>N$~ z!1M-);A$gs{tLUm;kUp~(aF!Zbbdf2r>wQT>W9a^DU1Lx_1P@=NbE*{GNM=y?sn05BtMrwjK(j@+YwK;OT3Sa7#g6 zA)UQPlH^Zc|5j==1_F0hm1vUkBJ@7IpVtOCzP+#ghaH{?fsJ8rpZg;4W#pc0`Sv%q zVKApAf5?n+`_6OhGgaW105Omt%lBowy5Pbgr?x>pVUH~Zol_*4$S!KS#Agt-@fb4>do<{Z)#Mf1wifz=8i}J z=|K@loyNgH<~ws=B$^>^_C=y;{%G+KB$%DY7H$$%7-axL^PH}70VMa1kFnDUVQ)i& zgPM{gJFd4kdl`(Q!K-i`qEK-uXvCBZeIsCcAPje)SO50-wVM8IX8Nq+VmUK;Vd&$- zhd&t^yFBITXHDgB=hw+Lja;1G6NZpm@@P7fyhW1a-3(JCsmVp#Ml!0c3%`b$a7T3s zr=`9AzErg>RIH3Q-Yc@pLeH>^9MzRO(JM zpJb$kB2o*ZamD5|GyOx07Um{;=S{9$18*`K;br<7VLs)M!ZW-6DT=XW@m7U*Wr$r6R~QNwey{tm;rJU<*Ba5$XK1H<#5ZB3a25L)*j7$Y&n z^PIr=t#P0!lw4#qOLF4mtwz%xq2$+%W_N@RV#HWAQRx7L92e^nbk~}v!37k$bPBt} zO1$&t-RROK*l+XA(E}T3EC>r>$#c(^7<+q-S9Nt&^^=Rs%hYx=mOYOoWQ!KTxPxsa zlF4h$gkW;if`*)xsAJ7%wayhqLYiR^BT6Kbe~gWPef-$qU{y&062aHF>97Sq1IF)A zdX|vOiDqI7m$889HoVPvSN<~^e{^6bVH`|8KRgRB{3#2;9alT~eYFP%_Z$eQ^e&hF zFc=;;Xcx>=mf1A2aIOzx((-b^p|(ZIBvtm*lM@s1L^l6AUOEP3M=huZF%Tij9hIP^ zC^oJc4soJ%CUb8he)05|et%UNF{lVG;^7^u`~$F@7LiPr9`Sf0k!#FsXLrNAxWseG z%_Nej|mjg6ivktk~UQh0zb-V6=C{>GNW<781yfGGASiuZpM zzIk0yhI82&^vu`hAPF*icL3aOK?I}A!59+d;kCH`VEiAVO^ig-Hc^BAUZ{j4uO9F8 z;wH>!+@UKXEz+S`@MXufy9J4+Y2hp({$bB^K8vPadY!0U`H-#DW(?e*YkGUkPJf;0 zK$j+y4uS|L1Rj;A!WxZX$S3(X0DNCWnt@?A|9oJwJ-@L!PQr$!{F<}ElL5@FK-~;B z1tL}+n@qBKy^zcFK5a4@O?t9`A+|W)jwflc@G=TT#sUFBCuq<;Ji(mu7inhRR^izEH9K9A?RD!h1E&BI@5rIo=*GE*>ncA<$Upq6?JPsWdEZb>XT7rPngI3=4jV#ctfAohxkyFc1DxS@>w7!!&z-Tcm-#bhgRK zKQ8?LM;;mtkClUc9P!v`GUwMS=89U)4kDbTZEIjgg8IkunpG< zDOHA00&}03!2OkgVbAwlDtU3W19xG}O>$h!zvsusPgA#h$2lv1`CKSmyHy9hgt*BS z&gyl*q+RTGU(C#^ks-4(7u_20FwCz(P}hQwA&zsJGlZGo1c%GU#}{e;ZILy9e0=1q zE1;;*C4Rq2h_i$hTn{#!?alUOJ^K&mSk|8n<~GiQu7mG(L&fQQj7h{xrJ_-V9E&R{ zEp016O@MK%z@6l>N~D1g{1FyXZaax`mS4QVBk$O%aXdRSE6?uECUV&7?^{ZdoV(e} z*%R4gIjME0GdpO;>$Mb+RSdpCL&i27>ry;Dz`hw7H@!IWVNcV+BzApA_ zAQ1SqqlnCAF#ylPQ@^j3K|O)&NX~gSpPg6g+_ke3jN(5IFMWM`on6kp-tHd@rRm#Q(Ud%iwX${+#M!yg-Sv3c!ZJexh8<@bQh{JN_}!&g zqU^OT+ZyWu(|wJ?fk2>#l*ihgQ!-gB_Dke)ILt7@)V)l`GOWR8-vk+FEPE+Oc(`x= zd)U##A9gK~i38?tE1KN5)*YR1@7mdXV&p(;$D2Al$&#=oEzD*sZr#dTh*;jOTN9Hb zCVGa?-Yh!MGZAAYcP56b#k0SobJx4p%FK*&9_tmo_={2b1M2GfH>3?O);Fv-s@0WG z8A!-kX5Is3D#d+(E3pT8WfZY1774}0cuJ;_5o9K25y|D8F=Lj}u4_=jgEfWH7c^AP zZ)nJ-<8L!hKAUTdC>qy!Hw3Vh)B$EI+x*2Rzmu*rJJ2b?yqpZ8IYYiR( zWzFkHYj(}QEhm%h%QXtKj!TZ;0X)_h5GuJGgSpD(Do&x`tood|G2>v6ZfsOwHa-2t z;zmVLwK}O*M<@7|UMB@vwPU?6P*Vxj0FqrN@2f;1ja2`MpuzyPVlW zEKF+`aU@wmk{ruU-Yin$we^Zw(-iY(%(PCWOQZ6pvWg}}CinN(U0N!CV#}88Tblsm z@uDG?b+GJED&;$N-1B#rD;WH4Gu|{42RJ zzr8Jx5JK>FHts0Qlkb)pazr?{+BDgmg0SzkwnIfP%l>?=a&OBW~V44KEIT z3|D{GHVNt0n7g)T#9_H4Kh0FytijI@zlGOn()^0SbqiNldI&eZHhj_s{ z%5$$)kkdKhwS_oa`F=j2m-uG1flQ*e2sdf~xOWEN?x`En19xYD{joj#B!vA)1&WSN zvis#g0N}z&A&m$C!SKNNKmkAjXW;=Ng#b_uAPEE_s7?^TKy88t^H^VzBqsP!PIm<= zxipjy44hdyVxfpJ5(S_jnJ5HKr0#u+5)x9FCZ&lfAeSYHA}EqIiK$R5O^<{FPI^F% z3d>A~?J;ZGjD7s>&mtj#o_?JNO!lm^#2AzI6t~)A*_=8PyvfV#x6h1aRNPB1)XBMz zSukrNwc8@ysud~SaFKjda!m-xc`4*^&ZJ<^SQ&d4zff@jbXfJFEftDEl4={o5L;*Ge zBm<2^3x;F>1Rw>38V4X7Q051io4Qf-yKMkL^*y;hFI2&9fp@nch@*lT83;BGAY|rK zvj6|Hk`56UT9*LOciVSW2b7$ML=?Je;Z>fQ-X&yibRsef$`gux?O4`v-S8VdaACXA zrWL5SHj0Q?0|vW6qZS+z$!i5X>~r*U_(3(=_<`fFpYQnxl%*xjk5yV3eNE#eSkRjz za@P5x4Gyn9-2|~fQ(HENzlgc}5P#GE$iibB!gYtKAvwJ{uFHskMhRFTVuVnlMu@zi1p@@A zP^C}Ht{ZuE%(s{0=TWCU$v;MbL(E9xCe9{Zla38^ESfHEckF@3jZLp(k)E$ddR*fs zw2+hwK5&Ra3@Ao`Y-A9Qu!T{KFv1qLu!RKQ)4lJUxn+0XPidGZ7@>$ZOGgNKl<=1h8LaaUq;4P%AJxA4gEahC*LmP873Mg*=h9tmGf?T)5B}&Jn2GR z_wk%YMYfVI(s|8Vwsf7Vrt!{sP9M)umywa-H9YUO|KmzhQY(Ab_N8gAuZ9byK!w~4 zK@k+VilPXL3qf%}SU49s7AlS$>C46jN9ju|+r0Lh`Tn!<1vcZ_>VEz{`Fu%BH*U?gG$AQ~4@?Q{K{{cFyA zZacGXn=iq`-51v~xpV1Iof|NCpuz*oA;roWhpN2+5D(?r|JU8gOK8L@6pB!y z1eBSbC#>7895u}?N_QN6FKiqW5XBg44{x-NC$mOom@cA;q>|kKKZoZQ9$#D4m+W#? z4;&%7d*F~#!k2GYTK66!2MI@nV}Xc=&=_|23(F$lXwI5xd8R2G3jNN9OLWBD-7!h) zk~{g}Nf9d)vTz6U3cYVF>b(O`fLUT~qQiUUmZo5Qxi!?D3 zP?EndRqOg+15Gz5*#?}dC$}a-B_AkxX7>sT8&bUay1Bc5ljuN*2;`^%5S}J%j=M>R z4}i3rfHXr8loq0Bugu9&+MGT>a|fiPou(jfK@Le9QqZQDPJ4>!w5RLd_PBevq;Neg zK{}cJbKj)KAd&SB2&Qcn#t{q)YF^@)knqpdgVWm?a(rv;xa3_Ay(YuWq`( z=D|XAKx+Yb=}{Vpy4kNR!CI0|yBnnD32NL4AVb>9WHCvx-s^$;zOB?>0y7(l^;D{~ z9s>ddx8Bx!S+i#nihGF1^I5i^rTHO_!x&>oBgL#`&+`~l^B_sbq`#(JmKsDviUUM~ z)bM{R1WnMY{&5s>LL1z@oeqS~#uFxG2#bKY1H`Mq_z)Oh0^<*fK@pQjB#W1pR=h+; z^AZ`$OG%oS$U<$-zLkk@X}}2K8Sym43O_6-<$l$$z6Jb z43qJ2*MG_>7-fmAk;6YyctUyfXMvvuf8{8;i~e5)erGN@O0J3}|7H*F2?#;?Epy4v z+3j%!dJuS>(*nQ)0tNtaM&5B!ei7~;!u>~h-wW?&;eRjupGEUC(fn#In7Y97Ie@(b zpylixl-d<`obwM4JV8QuICKC!Ft7l9vX>bcb>t)dI!1v4fMY;m0>9@+k5xUG?_J$m z$G9O-3`on^#t5Ps1T?|Z^aQT#0S5_?ZHe*N-TUd_h5!a0_$dd$n$;Qp8vxRjh#;XI z;r$#5K9uf5ct8(&4iP|e*(b1qVdnzSAq-!wG@~&|0RU1|iwaTvl@u7W3M(ax_(B{= zhsP0SdMf$Y&o_CF?2dSD(ueWb2~5JyU+!0;0kUF8cDkLC-aH+1fag5#1uuHZ z%U6+ZLr9QMl`LCZ1`NBshQ-*xz{|A+zeevz~OUh&5kXOe2s^B&h~MWh+;0K=Kj7o8 zOJKz~tcKu#sX6QG97%E5DFek0z2z6JB&AZEJExG?O^%GdBe26L&Hf3F2ly8`ezFp$ zD_%F%A!i6ZZ)@ZP@k&g?(PbIN?9EOQ@5`G_w<|xAN zcEE+}P&sX;C87u>D6XbxmhU!SYg;w>qFpliuQ;pAS6$WX>+U$_oANo#y`CV#{XR^1 zMFy|>r1EP%XMxwJC|DR=tmZOy=h`W!dhMEO5$e1JtPDCaG@W74V@=IKQ_9P1z;6zm%!QA6h?~!$X_hKtJ2>DS1%x*P__>A!?qIpQ z@Nf_FuOn6N=ZJ=^mM>tu+qT&M^0T=cRS2pRQJMp)&NlycaBu%nzHwBcJX#_X3 z`nm-L$V<^=-=V#Ho_bdZes1$ZA885C_e-tf145OLuwI5MVC_}%9p)YBdxR%lXT1mX z)nnnni3>L#y!h}72nq>{h>D3z$dWDRd2jqwPVcRD`KePzaC5UKq`ALyD-ZH`!Vquc z8s9<|0N2HgVX4CnnGQvKGe%^|>?$!?bLT<9?$T2er1_s&sxR$N!U>b5_oXiq^?NDL z%Gi5$<;NaF7?Q)dCj5=E^#ArpDe_cH7rp$z=Kk{ju`*fvV28V5ha?LMvsMoa_&FQ7*l14I>Wh#7JR@wfue zIU&6Dg?xTWP*PLZk95yyx5J{l29$I0rsfv(iQ3-Xm00I`e}}%PeQ}_=(8>_)#kG4p z`GJ=86tyJ`G0bi)S_eHgKgH=QFh!IT@JtgUj=+rE0TB|BkfBInG0-5Of%4Fb;bkHe zOAC%GlovK5JubXrEtpW8w)Yt;vQ_J~*Hv$0&9zoiN`_Hlq-BhB3}r4SCWr17ra3oj~ip6XT4LZ#fvt)(C<t35Je;>JQi~- zmUfmCoJ18D7IQ6e%sF_HEQ^4hrG}knnmO{~#$ujjMqD6N5W>`R%GBj(-DMZRDcc&0(tKH0*nB?AL5R(zPDb~7^GcnbTDa17E z?B`5Ox0^FD!`>8PruB9VoHLH|8FN?+oWa0JaU2oaLCY9)kq`_n2q|IJwj;i7(8jIU z865}TuS5Yf!Z^DkkDrz<$Pwm>3X5g(lVufE4NWZ{+{;*y8^{S~d8ZUka+tK@$n6HR zybWz-I7b1Md!GfoAp@-u2JthjC_H5AtJOG)l$l^St3;E0z;Y*fW>5+aJKDLMT;pOn3IMQkRF%H>e~7%i^54Vsiq^F)Yu>OVv^x{f{mk{zC0)z>ZVxr03{7JL8T998Xt26Ega=yc;e33!G7PwxJ${bMXB+fl67Zh(#Xx! zx@0}(PzG>eRMoNGOj|Zmgps8^%!k7Efm=M7GF$E7;3spssoDnE5NO;U$NXpNfC zZmo03o$a;G6}<)w8j^O*u#pL!(WlCVF;XwwG?xw9cKR$7G$V{M21AH2ABc}DI6q*Tlm+3^$XRP4@t!H>l}b81ZDGfCKF8aiVo4!B>+MgotT3PX)HAJg zN>kZTfyoIf2zA&WGTGvSuLohsyL^ zaH8#N(C5QzzgXWud|~G|JAXO&$=Npg3+Lat#@FAtUz7dJ^Jm^?yYP4T=MR5>^Uuv9 zT~F8B4Rs^k=tm+SvvV%a%^@EPe<>0^dAqhjPHcq`mA4a34kA50Ld$WxdQkrAbS;Lt^xcyNZkVITaf)pqx7An^cTk09_gppOIk1d9I_VBP@v6G(pn;y0Kn3)tZ*|KR?QBAv?3d!W+ONYzb< zb%tc!qrOrP*_tJ-Yv=1ptg43%_hNCdBmkeb2z42fp?uZ6{EVH`^N?|XCmoDwHwB&~ z%8bcfDE`X>ODaZ#-yF_69g>pai-a$T6bBM=prA;oIHSRgC+OT;Gmiv~tuwT{B@*q} znuk3ieL#ZFuwo81^Ve>qQUYYP#$8NR#oABbS=H-AOWMZXBIuH^po9058 z}gcS6MYR)lpv~O(p>1*KpKUKu=pi999Uz3RAWs4q8#?tyn;a2PXYV z(c~3}LK!@;%uJ0FhSY!AB_$b{8S!mJV1cBP+U}Ci_{6k5$Gl^fxL)>)6q&2|Tlm%E z@iaK*@&oux!K*pt6Dxa$t6W~;NixV#Kqt@uNZyi_01%b88~hSg!iu9{mNl0)GVf>k zoJJuzN-X!yZUV(B|0WX=~l$&07vO?A(O3PC=`i)Oaf>l?`ksCm-6adf`88%BIxRb4ZEQ%r8Uu z=C5#J7yafpd;IQqtNh^)>-_0YtNrCK>;3I-7yRQN2mI?_$Nc9%hy3q4f8+#)5EutP~D%}`1y6O>lkEM=6jOIc-YRZcAx)izKggA7$~4TI!rEf}6MwSF(j z&ieafOWva7pOSosm3Rl}*mzHYAL0|gPicX5>FrcLz z^vb0XJrv1#`*X27=Wdy|cB=hw6smCbrY8#Dw7BpPNagBSmk;altR7%uFA}RjX*$QX zg490xpnSHK!n6=}P>ZTy#jJrEtd}P4AlZ+yE`u!gGsG+}IC$7t<14S7Y(De{kK!yPlgRCk%IH*YGh&e&Prn;Mc@a1ySrC5mAnQ_~0Ja;hd z{$SWJUr}$$?R<(q|IvPKT86y0NGXrEJ;j0Cf+BKAVjQT&d)scv`=H>PF_eb&a&7VJ zFWTo&zvp~r?=!c26ZgSr6F)I6MN)|{LWSS8Zjn)ja;`;k91o}>0fj~FWk-A_9mqvD zB7q%AMGK5yNwMMHCG04w#Y-GUsi?D$X2fK)VvJj{-I^R@bH9X5H0Sk(lzy?c77)_#+GYF+l z?5t*iJok$97OYPB8eJA{&x$#Mpx zHjOSu^P{L$udaN62?b72jaM0D>m?3=vav;E#csKp*-^XgM5K^gth5Ngxn@BaI0!!a zKo#0~&UMORRxj+AZ|bwvB4SWaS0gWjeCnQxFz-1(?Ppu;laTLywf^E3SMr(i`%bV*BOt`WQ^%gJr z8r~zZzbUe#%K4X4^voP09F7?e(1&alq01NC5&?CJ3A6DzgOVv!X&Zq=3T3m|aB8(E zH>HRi8nGXyqfE_y?*VZb52?WvJNow)JIWpR>{c(p5~j-q@z7NtV_mknfwfQAqTF8t z1H8mAf$;CZ>srRHThDnEKupj19COISF^U)0!$nGtpngwe@kb1XFs45wHWO~b1l zB~>-j1?0i)BF`!o?Q(`H>T;Y244EoTD9yrI?R{!{zKHaZY$2DTrIy-=B_jEJ5c`AX zadCf#!9xw6r22gHzPXj>#BiIt8$wZsTE`%2%$kko*_wsb>y|Ulu!;>1pazmm{$dvC z=*<5KDjIia|E0MiCA`79VPm{4Nc5+_Rhiv}N8RuZ5(`SSn<$kEiLk4HT z5!3?c?er8i^{?H~*q?2;&t;n`P>|pRB)bi6Ks$g9Kjk~XhP!W5Wh*2 zUA){lk~1icv3F;v+_XkAu>u+6jrsLTOgQB+P$=$w<>0+eggwRw(zuQFbxk*OMtvO* zD>!H}jA-%%M9x#jIY#aH(WX}Ygk+anW?}^#>X7Mbh)83GFy2F6{O*QrBhHP0xfOS2 zQ0_dvEjO-c`%a6VIm&phCMy0=&mH;oRrK}U?Dk?h8R?1@cF>K!|G&N6`HTAf{XhTV z_xgJ4&Ew_eC-=}V-P_OmTJGRbDf_8@MJ zCjBAH#KE+U?93Co=aXx)U%o{;fxc2!OA`7cB9RzFQ_yM9pkEW+F7!X6#10QmBbYq;J6NNmtB*x6B4wF}B$eBoD z*&g%SXrkqjVtr^p$sNW$wUp7otT~;=)q2;$avxh?n1DimhXw7KNR3a`ToaAOv39xj z&|W@e&RTLO8wFfUd2Va{ol(=QBwb3#DC=KI&D_KqQza|Ezy=+6I12Aq1nTDj`Vn^$ zI{jk&q2vY8JLXwE!5ae&IFt)`B#Wqj*4&sIp&3!m6d=YCv$FthJ?>Rqe9TZTP0JT9 z?OCY7r`a(#2G$NS(PdiaVR%OFk`V=Hf>xz@DcH1N6b=m1nq!f{h!}_elZ}&iE3TNe zHw3$SZ)>DyH{8kZwJlNE+eJ{i*W&aym9ZaBF8vS)t<(1I zfnHBEf68tI`+t(wt<1dQCphPFX)4XcqZR-EF(i{nJ@z4QBWKW0G_7Kn;-H z%vcy*@UF;y+AGFMzq%e7C3v+aa_c-H+hBb)|2k&}CehZHPV|_|>AV7_u<2HGM~%0i zufAIVfPoEI0JvwYuOGVEpZMuR|1kR-H=D;2;tE63D?0b;e2+H5b)3iXCX+% z$;ueGNY7BeR0mUI(1&d?7&}L5cqw{)jg9i?NGzxi!k~G4r9UBMxYHu^>TpBX#oria z2=(BM3OKT0qVHRFi?;O_Ho<{Dqv;o71gb0!q&f=~uv#Rpl5qj?H zXS>5)GsfZ)dsCLcn`q1$=3O~-z6B1`Dln{lNWy$&fSGe2VkGwL(;@5c6MMOEb8)C* z8W>HN^q&x+a_gtE-6uW|?|C%BMJmGLk+DZZA$~QxS_};ql%Kr%S3+miYup9a@>1jR z{Q7=T3Nc<(lTwo%-@=Rb;}FPxsWHuGt7MIB*MM8b`kLOprH*mxDS}jiFii=#Au=ZgE!rr3S9ia1R?cl@ts5@&y;MbLOEYFS`mfv=I>zlG9fo za)CFfH;(>i@J)QU`r)ySmpnvEgyUOrNqaT<^7Ht{nt!f-_?)M2sNJ}LZ+PJT$D{cb z{xR(9H!@bI``+Zrl-EOtnS4&iWRxIx3}T)Uu1)uw?{Ar!-qF&b*ZCsx;oPS2{Ng){ z^EwbCd*?h9(;w{JReOS{`bI=<$zp7FA3swt`Y66#rBmgfr>1oAQ(~0^QJJY1!-chm zN$W=4AAKmPn7nG<`o=$-&P{*ZUD4vkfhRD{;55v;1@!eT`QU0BQHhQv9u}8%27QAp zV05hn1OPno-icimLm%yJnx|Zu?kLg<=k7$I{_GA*7twEZZy`cAJ)YL#ll}* z@lU>NcUJ8=uN^z$J^{Qldkgix#4bNA%-w5|q`G0ft?A4tymbG^c;}}gWtty)|83C$ zgcjbE)8b41+zFep@gs9rhkTEmzw=YkLSfGR6U7-TT1ipyqD*uTJd~exe?bN;KNMtX zVXcb<;5Vf4PSB3`-tny;*9ZMTmaLm@6l{mrPdxK~4uiI?zvETYXRWHb|7H*99sB== z67clxlZ{**utEQXzEAzqvx-}^v_6mqvW1hklTOH&l5!?NHb~?5Ez)3`rSxHHdf1r11{7tLIqx)y@lY*((>a%;qI-Rf$QI&R+|H#Vm+UdmD+Q?e{So@ z?}B7yo{&0WJ2n=6S?zP=!t(Pi1v&Sm(q{QZMN2aA{d{rO-R_&5&>-jHWLKk4qU|sj5+i#r2$2;xpntHTo2KEYBZ{zXH zjWU86*%FvkXDs|`JVd>>ihCyvD>^>zJ>Kw6PM~^m#jgE&61adccUE`6zye&yZ~7dV zXGuYyk8C|vQ7`mw$B$jWQwm&D0UoX{e@6Nw-8=W4J7&Lq=8SLa^{YSYUyatKyKFxG zb?OTX33%jpg%2W+Pe%aY&e4|?xuM?9MJ&zUzQ@nA;6Wr9W-R1Wh$f_kg^xjDX&|oM z31ER>uU9VpVtY@YtADIkB4TZnO=?cx?Yc9XThxzOv8c@y-F;X<|QmUiD6y;L#Py{9!cDd$TmqII!%#8Ev<|s?%Bw~dI)Cbq<0o` z-s-2<=FC)rX+*XV!i%ZcE`EAIPa=u<6OdWLl6!AmybUZvuyPrW4rPhaF}W9tcxx&( z|J_AN4n>T@GZCok+~0p}K&*1XMn%&4vIqpH<4dXj_F& zeP!52HW(Iw zl~LF}S`CBl_;L(A9_+h^U3!v}2zG?PHU>P_e1Xk>Ssj`v*Zz3B!VtV&d<_)YJ}lQU@L!a08T^rr)B0JK;0jT za`}Pv>&tg#FIPMsjrjNd?nANd&h&KB-POMYL|dMO@uRrrx#&Y5UhXfMX9`p)k^U7GO=&EHH?YJBaA6lQ^7uwmx}9kDK3hhbBESOBE;+_zh*et+0A?dzXMy*!@!+ z*i=$f+saXm>;1dXFzZp#uX}@2R+fN1x_;vM*xVjH?y5eqB%Lp8uHXwgO0xol?#M-( zAPJZVcVfc?m3|cQwIsn*Zoc@+LmsdTuCu58tEx$_yR{}eeF+leTukJTW#s2xS>;s>3RRy1xD+nyf8>(>{I562`MqC^>OC^|vWfDMWl`#&J$5Q><5n zKLDHM2Q4&Sz0*b=8h}{*?5ndW?5_PYGworfmGX2%SiYdSQa&eyId?^a|MCD2a7;|Q zr5!UX7$9vONoEnL0yI94L8s>>kQS6bU%hzor>j-LK9Zu7$x+XyV76*tQ*!;wrH!k& z5;~hLW#WRXs972Db(hHE={F-K47r4728-QRTh5Nlti2Tp zVl^t$N40Nbc<&5X)GW=0K@iYlfK^HUB{Hu`FMdfsBA-F$oXllFW!W5Liu)6dy`P^} zZE5dkh(6^55sIXo^k6lSwesNzSGtbubfIXJj9na!?D3=2M$ zobne{93K!MW>D!uMnHft9(>PGj_)0z;+foSKRx#Jp*9i23@+LG*WGJfkUUc;B_eik zD%y+1N~p-%mz~f_6g7@a>_E37MaCl&^8|-nNS1ba%9zX7Wi<$l-*1795!7=0MB0lzydA(B1?>PWO)4xgHb2hOok?c)@qXcsrHLU+1x%gNOmF-OLTFa^y% z2GTU^&6d18PB+l??{A(6FuTFMq*A%<0`38xFUo7Hx(%A!sg(Ey1Nv`3=V3eDzO&8T zIE2Ntwc!nQ;5VPm4A(B)&}Ix0Eb!(yp=d!e!~zp{67z-?jY{&1Bv7*~28_$p4Cd{C zPqYM$x$zQ$Uf#f<(JGo)#r9xmm458kUH=_E?&UQw^xya{6-}(>e}@w6A38g+v*j>$ zG)6r>t_G$nw@-ZqfW}(atbe<74<`N5le@OMOd=Ptx+HP1}}4!G{qk0C8&dWzowXjYdWKc1Ba<_*{D2c4mY5 z%NOSQ;78^QXy{wD`nc#}&y|Z$h{x!tI1Y!tC==+H4aS%1$LzCr%=?~hntkgwpNcQQ zhQa_MzN(Ww8@PVu`G8D^j)u70Xoz}GWW$lwaYAYC1b39nF)Tu|hb?R8pcwA4?!GPo zSb&nc1Bg*!Bzz3|SS_c@`4MTewv+9oinZShy29A`H)-893zkS7E3(-B4iyoL$CGwV z#o&D&M|%#>7wIq}BLcx5zudypji&XR``v1ikD4cJt&%}NFkJCy-N1YI@!GhhJv`tZ zJ}lvFn13<-vSHoNjHu6(jR@8*ZmISpV>vUE$DyYau`u8%!TbJu!}LC>8|aqG5*#4O zPeBOW-lS0n#}KqFZx5-s9C8fYb04$Ee)ju9exSld-}C`z1mMR}6BNuKv+Rd9i7VNr zmZ}1912LCz9`rq0quhJ4`JUr(W8U@`J6R^%Na=DhfEBY^Lr*P1wO1O-ISRW**Ku*w zZZF@!eUI#d)AE45FT=*wGTBwJoO13EQGxU)(!%g0S^%0zi6G#qa$gK71|LR@K?iO` zVA8|qv7FTT{`r{y9gILC%=b%+o2hZ(0Euc-$(QDT6>H6cCBZi?i3Ql=xjyba@ugPV zsl)7Z$6tqEW?U^LUJE!fmfBL)-!6prFx9l`tT$zjXc#6H)BfO{?~pDB78^X`w-b`; z+_XXm7qi`9{ilddu6xO@JVjV+b_{oaJ`hKA$!A_pRTXAMy<)ltg^wjf5M2=De*UB= zE#lK8Qo`_cK>?Phv`eE)rZ#BzO@c4_Kx{4^UWo$io+6T6_d2=aEH&98`3PFVOyR~{uUg4Up#gMd@R8W z(-S{JgQ^+x6jEzhBn3ye3v$QXA-y7EQB%eoLc1b{;$A&x0%2|!N!!`qL|~SyS4LOB z+OTbRsliU{-Rs+A&At!5eIJx5gpG``vfsz{U^j_ZUt{68BavJnCvd7{9H>FY;WiXO z)mL13{6mrz9r%>`Y7gE?4+SUQ{U&m&iR)v;4Rz+AYc)Ng99HROflv!Y%m(sd~2 zX4!VhdhdOihUI)+H?O70hAnI4c!%$s_uuDosZ&Bd%Qa+wphM7pr?C^cGlVBklKn)1 zt%roTM1a|ZJp{#8B*@rEVSCk84@Dw>`7CJYLM@kUQwI**)5UEfxtU;HVvH$Vr#MJh-eRn3OMoHA*51{ijaAkzx{6^heGru<3 zc|?maM`ytv<&IiTpEKvIaMqoEXTn+OY^*KsQNsY@17xf0ukeklrLZW(_2JZ_wVa2t zEndg91AxY2a@LyzpUbKZIvM$K7DDVo_}dwp2>-WAqv5A4nhE_+I>ekap9#P;t9`d~ z-=yD?LT2Rq&p?PQ7X0uT1m6aGKyuuOG%3M{-_mf(P_27W;6}ac_gKE!96TcBqK`wu zy67lm?EMu~{|dM=PHX_JxcZJDfhV6j$$I4hh+foMpC0+#qFPP>z>-uPnshbeO9Iv=34VD3XD$w>Ks14{;ErMn#`09*->mbnDc`~^C2}M>_pwu<8iIS4y)1fI2~v1t4c_qS&0iXW_;aQpEPT>3}#^F_gsFy zFZ0*;3-!qz`=PBN+ug_K8n@R)zWd5+XSpmAi+2Y%VZ(!G}JQQQ%{r z_|#|he(QW6_|Qi(3ViGnpPrxnW(kkC@5cqp|DBk?Pw054y>`ZgE$uBGkv-8WUQF=>w1i zOnZicBuSDaNs=T<`HL{%scY%^D=8kW#nGhSOP(qs)2!EdIS6It(SI74awGs`>Dm_S zjW!n?-%3MBz?MxgGvKIzDMU~vSyBvrW=64q^WShwH)W7U?4~W+SoI-I4`>Q?9mzFH*4pLb!$CavrN`n8FC32cScW*zBb^0pKf0 ze=r~xqaYLkmLK*wp#gv^7w8zHu*lO!oIg?HO}3D6a|Q1Yz)K@s0Y-#ab+&7k{Uy76 zzUsanjQL&Q0r;sTQ7{%4K8Cq2%_LlD3Irwm09OnyQ^6(%mh%&@j)+VorPxY2KjM6g zu|6QV-3_dZr3P&8E&(K_j+)Kbv#JWPMz#q7k6oafGHfPFXBUT1oLk^yCYsZkPLQ2) z0gm(uAq6vlQ-1>_?|l5rnn2tBbIYtCzi z(s@@?P_Pm&0Q4jrkrKR05{id>fB-+PiJ0vW0CPT=ynr&2IlPI%kgDOkxxk0UvD7>? z$N?VREXM&pfOdS?#(3!q5M5(p995jup3A@O0YOs)*tyn;1kJRF$;Jp!Dkaip2^yVwA^>kBJ}LApRbp+y6Kf02 z7zK%B@i_v3aVJd@oJh#hD%3_&2-Hc?M22CfK$zi;#4%xLRIxP06AFo7EY8Y&k*l=V z#j5B+X{tk3;UcY1JNn;JLd7Qq{SWjSCC)%&EYJbuYC@reR{o<_ndAy!5b5Pmi_^X81}!d)#}f4vR{m)nPfbKujc%0AOabCt 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 ve~Q)?zx4~9 diff --git a/app/assets/fonts/Inter-roman.cyrillic.var.woff2 b/app/assets/fonts/Inter-roman.cyrillic.var.woff2 deleted file mode 100644 index a9378e78a00d90f3160a57d5d643dcb611750700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35208 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 diff --git a/app/assets/fonts/Inter-roman.extra.var.woff2 b/app/assets/fonts/Inter-roman.extra.var.woff2 deleted file mode 100644 index f2ee9eeb144798031841f7197f340642cd1b253c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30660 zcmV)3K+C^(Pew8T0RR910C&Uy5&!@I0QUF*0C!XX0|VCp00000000000000000000 z0000QgC!fDHXM^WKS)+VQi@YQO;$ltPzGQ>Q&d4zff@jbXfJFEftDEl4={o5L;*Ge zBm<2^3x;F>1Rw>38V4X7Q051io4Qf-yKMkL^*y;hFI2&9fp@nch@*lT83;BGAY|rK zvj6|Hk`56UT9*LOciVSW2b7$ML=?Je;Z>fQ-X&yibRsef$`gux?O4`v-S8VdaACXA zrWL5SHj0Q?0|vW6qZS+z$!i5X>~r*U_(3(=_<`fFpYQnxl%*xjk5yV3eNE#eSkRjz za@P5x4Gyn9-2|~fQ(HENzlgc}5P#GE$iibB!gYtKAvwJ{uFHskMhRFTVuVnlMu@zi1p@@A zP^C}Ht{ZuE%(s{0=TWCU$v;MbL(E9xCe9{Zla38^ESfHEckF@3jZLp(k)E$ddR*fs zw2+hwK5&Ra3@Ao`Y-A9Qu!T{KFv1qLu!RKQ)4lJUxn+0XPidGZ7@>$ZOGgNKl<=1h8LaaUq;4P%AJxA4gEahC*LmP873Mg*=h9tmGf?T)5B}&Jn2GR z_wk%YMYfVI(s|8Vwsf7Vrt!{sP9M)umywa-H9YUO|KmzhQY(Ab_N8gAuZ9byK!w~4 zK@k+VilPXL3qf%}SU49s7AlS$>C46jN9ju|+r0Lh`Tn!<1vcZ_>VEz{`Fu%BH*U?gG$AQ~4@?Q{K{{cFyA zZacGXn=iq`-51v~xpV1Iof|NCpuz*oA;roWhpN2+5D(?r|JU8gOK8L@6pB!y z1eBSbC#>7895u}?N_QN6FKiqW5XBg44{x-NC$mOom@cA;q>|kKKZoZQ9$#D4m+W#? z4;&%7d*F~#!k2GYTK66!2MI@nV}Xc=&=_|23(F$lXwI5xd8R2G3jNN9OLWBD-7!h) zk~{g}Nf9d)vTz6U3cYVF>b(O`fLUT~qQiUUmZo5Qxi!?D3 zP?EndRqOg+15Gz5*#?}dC$}a-B_AkxX7>sT8&bUay1Bc5ljuN*2;`^%5S}J%j=M>R z4}i3rfHXr8loq0Bugu9&+MGT>a|fiPou(jfK@Le9QqZQDPJ4>!w5RLd_PBevq;Neg zK{}cJbKj)KAd&SB2&Qcn#t{q)YF^@)knqpdgVWm?a(rv;xa3_Ay(YuWq`( z=D|XAKx+Yb=}{Vpy4kNR!CI0|yBnnD32NL4AVb>9WHCvx-s^$;zOB?>0y7(l^;D{~ z9s>ddx8Bx!S+i#nihGF1^I5i^rTHO_!x&>oBgL#`&+`~l^B_sbq`#(JmKsDviUUM~ z)bM{R1WnMY{&5s>LL1z@oeqS~#uFxG2#bKY1H`Mq_z)Oh0^<*fK@pQjB#W1pR=h+; z^AZ`$OG%oS$U<$-zLkk@X}}2K8Sym43O_6-<$l$$z6Jb z43qJ2*MG_>7-fmAk;6YyctUyfXMvvuf8{8;i~e5)erGN@O0J3}|7H*F2?#;?Epy4v z+3j%!dJuS>(*nQ)0tNtaM&5B!ei7~;!u>~h-wW?&;eRjupGEUC(fn#In7Y97Ie@(b zpylixl-d<`obwM4JV8QuICKC!Ft7l9vX>bcb>t)dI!1v4fMY;m0>9@+k5xUG?_J$m z$G9O-3`on^#t5Ps1T?|Z^aQT#0S5_?ZHe*N-TUd_h5!a0_$dd$n$;Qp8vxRjh#;XI z;r$#5K9uf5ct8(&4iP|e*(b1qVdnzSAq-!wG@~&|0RU1|iwaTvl@u7W3M(ax_(B{= zhsP0SdMf$Y&o_CF?2dSD(ueWb2~5JyU+!0;0kUF8cDkLC-aH+1fag5#1uuHZ z%U6+ZLr9QMl`LCZ1`NBshQ-*xz{|A+zeevz~OUh&5kXOe2s^B&h~MWh+;0K=Kj7o8 zOJKz~tcKu#sX6QG97%E5DFek0z2z6JB&AZEJExG?O^%GdBe26L&Hf3F2ly8`ezFp$ zD_%F%A!i6ZZ)@ZP@k&g?(PbIN?9EOQ@5`G_w<|xAN zcEE+}P&sX;C87u>D6XbxmhU!SYg;w>qFpliuQ;pAS6$WX>+U$_oANo#y`CV#{XR^1 zMFy|>r1EP%XMxwJC|DR=tmZOy=h`W!dhMEO5$e1JtPDCaG@W74V@=IKQ_9P1z;6zm%!QA6h?~!$X_hKtJ2>DS1%x*P__>A!?qIpQ z@Nf_FuOn6N=ZJ=^mM>tu+qT&M^0T=cRS2pRQJMp)&NlycaBu%nzHwBcJX#_X3 z`nm-L$V<^=-=V#Ho_bdZes1$ZA885C_e-tf145OLuwI5MVC_}%9p)YBdxR%lXT1mX z)nnnni3>L#y!h}72nq>{h>D3z$dWDRd2jqwPVcRD`KePzaC5UKq`ALyD-ZH`!Vquc z8s9<|0N2HgVX4CnnGQvKGe%^|>?$!?bLT<9?$T2er1_s&sxR$N!U>b5_oXiq^?NDL z%Gi5$<;NaF7?Q)dCj5=E^#ArpDe_cH7rp$z=Kk{ju`*fvV28V5ha?LMvsMoa_&FQ7*l14I>Wh#7JR@wfue zIU&6Dg?xTWP*PLZk95yyx5J{l29$I0rsfv(iQ3-Xm00I`e}}%PeQ}_=(8>_)#kG4p z`GJ=86tyJ`G0bi)S_eHgKgH=QFh!IT@JtgUj=+rE0TB|BkfBInG0-5Of%4Fb;bkHe zOAC%GlovK5JubXrEtpW8w)Yt;vQ_J~*Hv$0&9zoiN`_Hlq-BhB3}r4SCWr17ra3oj~ip6XT4LZ#fvt)(C<t35Je;>JQi~- zmUfmCoJ18D7IQ6e%sF_HEQ^4hrG}knnmO{~#$ujjMqD6N5W>`R%GBj(-DMZRDcc&0(tKH0*nB?AL5R(zPDb~7^GcnbTDa17E z?B`5Ox0^FD!`>8PruB9VoHLH|8FN?+oWa0JaU2oaLCY9)kq`_n2q|IJwj;i7(8jIU z865}TuS5Yf!Z^DkkDrz<$Pwm>3X5g(lVufE4NWZ{+{;*y8^{S~d8ZUka+tK@$n6HR zybWz-I7b1Md!GfoAp@-u2JthjC_H5AtJOG)l$l^St3;E0z;Y*fW>5+aJKDLMT;pOn3IMQkRF%H>e~7%i^54Vsiq^F)Yu>OVv^x{f{mk{zC0)z>ZVxr03{7JL8T998Xt26Ega=yc;e33!G7PwxJ${bMXB+fl67Zh(#Xx! zx@0}(PzG>eRMoNGOj|Zmgps8^%!k7Efm=M7GF$E7;3spssoDnE5NO;U$NXpNfC zZmo03o$a;G6}<)w8j^O*u#pL!(WlCVF;XwwG?xw9cKR$7G$V{M21AH2ABc}DI6q*Tlm+3^$XRP4@t!H>l}b81ZDGfCKF8aiVo4!B>+MgotT3PX)HAJg zN>kZTfyoIf2zA&WGTGvSuLohsyL^ zaH8#N(C5QzzgXWud|~G|JAXO&$=Npg3+Lat#@FAtUz7dJ^Jm^?yYP4T=MR5>^Uuv9 zT~F8B4Rs^k=tm+SvvV%a%^@EPe<>0^dAqhjPHcq`mA4a34kA50Ld$WxdQkrAbS;Lt^xcyNZkVITaf)pqx7An^cTk09_gppOIk1d9I_VBP@v6G(pn;y0Kn3)tZ*|KR?QBAv?3d!W+ONYzb< zb%tc!qrOrP*_tJ-Yv=1ptg43%_hNCdBmkeb2z42fp?uZ6{EVH`^N?|XCmoDwHwB&~ z%8bcfDE`X>ODaZ#-yF_69g>pai-a$T6bBM=prA;oIHSRgC+OT;Gmiv~tuwT{B@*q} znuk3ieL#ZFuwo81^Ve>qQUYYP#$8NR#oABbS=H-AOWMZXBIuH^po9058 z}gcS6MYR)lpv~O(p>1*KpKUKu=pi999Uz3RAWs4q8#?tyn;a2PXYV z(c~3}LK!@;%uJ0FhSY!AB_$b{8S!mJV1cBP+U}Ci_{6k5$Gl^fxL)>)6q&2|Tlm%E z@iaK*@&oux!K*pt6Dxa$t6W~;NixV#Kqt@uNZyi_01%b88~hSg!iu9{mNl0)GVf>k zoJJuzN-X!yZUV(B|0WX=~l$&07vO?A(O3PC=`i)Oaf>l?`ksCm-6adf`88%BIxRb4ZEQ%r8Uu z=C5#J7yafpd;IQqtNh^)>-_0YtNrCK>;3I-7yRQN2mI?_$Nc9%hy3q4f8+#)5EutP~D%}`1y6O>lkEM=6jOIc-YRZcAx)izKggA7$~4TI!rEf}6MwSF(j z&ieafOWva7pOSosm3Rl}*mzHYAL0|gPicX5>FrcLz z^vb0XJrv1#`*X27=Wdy|cB=hw6smCbrY8#Dw7BpPNagBSmk;altR7%uFA}RjX*$QX zg490xpnSHK!n6=}P>ZTy#jJrEtd}P4AlZ+yE`u!gGsG+}IC$7t<14S7Y(De{kK!yPlgRCk%IH*YGh&e&Prn;Mc@a1ySrC5mAnQ_~0Ja;hd z{$SWJUr}$$?R<(q|IvPKT86y0NGXrEJ;j0Cf+BKAVjQT&d)scv`=H>PF_eb&a&7VJ zFWTo&zvp~r?=!c26ZgSr6F)I6MN)|{LWSS8Zjn)ja;`;k91o}>0fj~FWk-A_9mqvD zB7q%AMGK5yNwMMHCG04w#Y-GUsi?D$X2fK)VvJj{-I^R@bH9X5H0Sk(lzy?c77)_#+GYF+l z?5t*iJok$97OYPB8eJA{&x$#Mpx zHjOSu^P{L$udaN62?b72jaM0D>m?3=vav;E#csKp*-^XgM5K^gth5Ngxn@BaI0!!a zKo#0~&UMORRxj+AZ|bwvB4SWaS0gWjeCnQxFz-1(?Ppu;laTLywf^E3SMr(i`%bV*BOt`WQ^%gJr z8r~zZzbUe#%K4X4^voP09F7?e(1&alq01NC5&?CJ3A6DzgOVv!X&Zq=3T3m|aB8(E zH>HRi8nGXyqfE_y?*VZb52?WvJNow)JIWpR>{c(p5~j-q@z7NtV_mknfwfQAqTF8t z1H8mAf$;CZ>srRHThDnEKupj19COISF^U)0!$nGtpngwe@kb1XFs45wHWO~b1l zB~>-j1?0i)BF`!o?Q(`H>T;Y244EoTD9yrI?R{!{zKHaZY$2DTrIy-=B_jEJ5c`AX zadCf#!9xw6r22gHzPXj>#BiIt8$wZsTE`%2%$kko*_wsb>y|Ulu!;>1pazmm{$dvC z=*<5KDjIia|E0MiCA`79VPm{4Nc5+_Rhiv}N8RuZ5(`SSn<$kEiLk4HT z5!3?c?er8i^{?H~*q?2;&t;n`P>|pRB)bi6Ks$g9Kjk~XhP!W5Wh*2 zUA){lk~1icv3F;v+_XkAu>u+6jrsLTOgQB+P$=$w<>0+eggwRw(zuQFbxk*OMtvO* zD>!H}jA-%%M9x#jIY#aH(WX}Ygk+anW?}^#>X7Mbh)83GFy2F6{O*QrBhHP0xfOS2 zQ0_dvEjO-c`%a6VIm&phCMy0=&mH;oRrK}U?Dk?h8R?1@cF>K!|G&N6`HTAf{XhTV z_xgJ4&Ew_eC-=}V-P_OmTJGRbDf_8@MJ zCjBAH#KE+U?93Co=aXx)U%o{;fxc2!OA`7cB9RzFQ_yM9pkEW+F7!X6#10QmBbYq;J6NNmtB*x6B4wF}B$eBoD z*&g%SXrkqjVtr^p$sNW$wUp7otT~;=)q2;$avxh?n1DimhXw7KNR3a`ToaAOv39xj z&|W@e&RTLO8wFfUd2Va{ol(=QBwb3#DC=KI&D_KqQza|Ezy=+6I12Aq1nTDj`Vn^$ zI{jk&q2vY8JLXwE!5ae&IFt)`B#Wqj*4&sIp&3!m6d=YCv$FthJ?>Rqe9TZTP0JT9 z?OCY7r`a(#2G$NS(PdiaVR%OFk`V=Hf>xz@DcH1N6b=m1nq!f{h!}_elZ}&iE3TNe zHw3$SZ)>DyH{8kZwJlNE+eJ{i*W&aym9ZaBF8vS)t<(1I zfnHBEf68tI`+t(wt<1dQCphPFX)4XcqZR-EF(i{nJ@z4QBWKW0G_7Kn;-H z%vcy*@UF;y+AGFMzq%e7C3v+aa_c-H+hBb)|2k&}CehZHPV|_|>AV7_u<2HGM~%0i zufAIVfPoEI0JvwYuOGVEpZMuR|1kR-H=D;2;tE63D?0b;e2+H5b)3iXCX+% z$;ueGNY7BeR0mUI(1&d?7&}L5cqw{)jg9i?NGzxi!k~G4r9UBMxYHu^>TpBX#oria z2=(BM3OKT0qVHRFi?;O_Ho<{Dqv;o71gb0!q&f=~uv#Rpl5qj?H zXS>5)GsfZ)dsCLcn`q1$=3O~-z6B1`Dln{lNWy$&fSGe2VkGwL(;@5c6MMOEb8)C* z8W>HN^q&x+a_gtE-6uW|?|C%BMJmGLk+DZZA$~QxS_};ql%Kr%S3+miYup9a@>1jR z{Q7=T3Nc<(lTwo%-@=Rb;}FPxsWHuGt7MIB*MM8b`kLOprH*mxDS}jiFii=#Au=ZgE!rr3S9ia1R?cl@ts5@&y;MbLOEYFS`mfv=I>zlG9fo za)CFfH;(>i@J)QU`r)ySmpnvEgyUOrNqaT<^7Ht{nt!f-_?)M2sNJ}LZ+PJT$D{cb z{xR(9H!@bI``+Zrl-EOtnS4&iWRxIx3}T)Uu1)uw?{Ar!-qF&b*ZCsx;oPS2{Ng){ z^EwbCd*?h9(;w{JReOS{`bI=<$zp7FA3swt`Y66#rBmgfr>1oAQ(~0^QJJY1!-chm zN$W=4AAKmPn7nG<`o=$-&P{*ZUD4vkfhRD{;55v;1@!eT`QU0BQHhQv9u}8%27QAp zV05hn1OPno-icimLm%yJnx|Zu?kLg<=k7$I{_GA*7twEZZy`cAJ)YL#ll}* z@lU>NcUJ8=uN^z$J^{Qldkgix#4bNA%-w5|q`G0ft?A4tymbG^c;}}gWtty)|83C$ zgcjbE)8b41+zFep@gs9rhkTEmzw=YkLSfGR6U7-TT1ipyqD*uTJd~exe?bN;KNMtX zVXcb<;5Vf4PSB3`-tny;*9ZMTmaLm@6l{mrPdxK~4uiI?zvETYXRWHb|7H*99sB== z67clxlZ{**utEQXzEAzqvx-}^v_6mqvW1hklTOH&l5!?NHb~?5Ez)3`rSxHHdf1r11{7tLIqx)y@lY*((>a%;qI-Rf$QI&R+|H#Vm+UdmD+Q?e{So@ z?}B7yo{&0WJ2n=6S?zP=!t(Pi1v&Sm(q{QZMN2aA{d{rO-R_&5&>-jHWLKk4qU|sj5+i#r2$2;xpntHTo2KEYBZ{zXH zjWU86*%FvkXDs|`JVd>>ihCyvD>^>zJ>Kw6PM~^m#jgE&61adccUE`6zye&yZ~7dV zXGuYyk8C|vQ7`mw$B$jWQwm&D0UoX{e@6Nw-8=W4J7&Lq=8SLa^{YSYUyatKyKFxG zb?OTX33%jpg%2W+Pe%aY&e4|?xuM?9MJ&zUzQ@nA;6Wr9W-R1Wh$f_kg^xjDX&|oM z31ER>uU9VpVtY@YtADIkB4TZnO=?cx?Yc9XThxzOv8c@y-F;X<|QmUiD6y;L#Py{9!cDd$TmqII!%#8Ev<|s?%Bw~dI)Cbq<0o` z-s-2<=FC)rX+*XV!i%ZcE`EAIPa=u<6OdWLl6!AmybUZvuyPrW4rPhaF}W9tcxx&( z|J_AN4n>T@GZCok+~0p}K&*1XMn%&4vIqpH<4dXj_F& zeP!52HW(Iw zl~LF}S`CBl_;L(A9_+h^U3!v}2zG?PHU>P_e1Xk>Ssj`v*Zz3B!VtV&d<_)YJ}lQU@L!a08T^rr)B0JK;0jT za`}Pv>&tg#FIPMsjrjNd?nANd&h&KB-POMYL|dMO@uRrrx#&Y5UhXfMX9`p)k^U7GO=&EHH?YJBaA6lQ^7uwmx}9kDK3hhbBESOBE;+_zh*et+0A?dzXMy*!@!+ z*i=$f+saXm>;1dXFzZp#uX}@2R+fN1x_;vM*xVjH?y5eqB%Lp8uHXwgO0xol?#M-( zAPJZVcVfc?m3|cQwIsn*Zoc@+LmsdTuCu58tEx$_yR{}eeF+leTukJTW#s2xS>;s>3RRy1xD+nyf8>(>{I562`MqC^>OC^|vWfDMWl`#&J$5Q><5n zKLDHM2Q4&Sz0*b=8h}{*?5ndW?5_PYGworfmGX2%SiYdSQa&eyId?^a|MCD2a7;|Q zr5!UX7$9vONoEnL0yI94L8s>>kQS6bU%hzor>j-LK9Zu7$x+XyV76*tQ*!;wrH!k& z5;~hLW#WRXs972Db(hHE={F-K47r4728-QRTh5Nlti2Tp zVl^t$N40Nbc<&5X)GW=0K@iYlfK^HUB{Hu`FMdfsBA-F$oXllFW!W5Liu)6dy`P^} zZE5dkh(6^55sIXo^k6lSwesNzSGtbubfIXJj9na!?D3=2M$ zobne{93K!MW>D!uMnHft9(>PGj_)0z;+foSKRx#Jp*9i23@+LG*WGJfkUUc;B_eik zD%y+1N~p-%mz~f_6g7@a>_E37MaCl&^8|-nNS1ba%9zX7Wi<$l-*1795!7=0MB0lzydA(B1?>PWO)4xgHb2hOok?c)@qXcsrHLU+1x%gNOmF-OLTFa^y% z2GTU^&6d18PB+l??{A(6FuTFMq*A%<0`38xFUo7Hx(%A!sg(Ey1Nv`3=V3eDzO&8T zIE2Ntwc!nQ;5VPm4A(B)&}Ix0Eb!(yp=d!e!~zp{67z-?jY{&1Bv7*~28_$p4Cd{C zPqYM$x$zQ$Uf#f<(JGo)#r9xmm458kUH=_E?&UQw^xya{6-}(>e}@w6A38g+v*j>$ zG)6r>t_G$nw@-ZqfW}(atbe<74<`N5le@OMOd=Ptx+HP1}}4!G{qk0C8&dWzowXjYdWKc1Ba<_*{D2c4mY5 z%NOSQ;78^QXy{wD`nc#}&y|Z$h{x!tI1Y!tC==+H4aS%1$LzCr%=?~hntkgwpNcQQ zhQa_MzN(Ww8@PVu`G8D^j)u70Xoz}GWW$lwaYAYC1b39nF)Tu|hb?R8pcwA4?!GPo zSb&nc1Bg*!Bzz3|SS_c@`4MTewv+9oinZShy29A`H)-893zkS7E3(-B4iyoL$CGwV z#o&D&M|%#>7wIq}BLcx5zudypji&XR``v1ikD4cJt&%}NFkJCy-N1YI@!GhhJv`tZ zJ}lvFn13<-vSHoNjHu6(jR@8*ZmISpV>vUE$DyYau`u8%!TbJu!}LC>8|aqG5*#4O zPeBOW-lS0n#}KqFZx5-s9C8fYb04$Ee)ju9exSld-}C`z1mMR}6BNuKv+Rd9i7VNr zmZ}1912LCz9`rq0quhJ4`JUr(W8U@`J6R^%Na=DhfEBY^Lr*P1wO1O-ISRW**Ku*w zZZF@!eUI#d)AE45FT=*wGTBwJoO13EQGxU)(!%g0S^%0zi6G#qa$gK71|LR@K?iO` zVA8|qv7FTT{`r{y9gILC%=b%+o2hZ(0Euc-$(QDT6>H6cCBZi?i3Ql=xjyba@ugPV zsl)7Z$6tqEW?U^LUJE!fmfBL)-!6prFx9l`tT$zjXc#6H)BfO{?~pDB78^X`w-b`; z+_XXm7qi`9{ilddu6xO@JVjV+b_{oaJ`hKA$!A_pRTXAMy<)ltg^wjf5M2=De*UB= zE#lK8Qo`_cK>?Phv`eE)rZ#BzO@c4_Kx{4^UWo$io+6T6_d2=aEH&98`3PFVOyR~{uUg4Up#gMd@R8W z(-S{JgQ^+x6jEzhBn3ye3v$QXA-y7EQB%eoLc1b{;$A&x0%2|!N!!`qL|~SyS4LOB z+OTbRsliU{-Rs+A&At!5eIJx5gpG``vfsz{U^j_ZUt{68BavJnCvd7{9H>FY;WiXO z)mL13{6mrz9r%>`Y7gE?4+SUQ{U&m&iR)v;4Rz+AYc)Ng99HROflv!Y%m(sd~2 zX4!VhdhdOihUI)+H?O70hAnI4c!%$s_uuDosZ&Bd%Qa+wphM7pr?C^cGlVBklKn)1 zt%roTM1a|ZJp{#8B*@rEVSCk84@Dw>`7CJYLM@kUQwI**)5UEfxtU;HVvH$Vr#MJh-eRn3OMoHA*51{ijaAkzx{6^heGru<3 zc|?maM`ytv<&IiTpEKvIaMqoEXTn+OY^*KsQNsY@17xf0ukeklrLZW(_2JZ_wVa2t zEndg91AxY2a@LyzpUbKZIvM$K7DDVo_}dwp2>-WAqv5A4nhE_+I>ekap9#P;t9`d~ z-=yD?LT2Rq&p?PQ7X0uT1m6aGKyuuOG%3M{-_mf(P_27W;6}ac_gKE!96TcBqK`wu zy67lm?EMu~{|dM=PHX_JxcZJDfhV6j$$I4hh+foMpC0+#qFPP>z>-uPnshbeO9Iv=34VD3XD$w>Ks14{;ErMn#`09*->mbnDc`~^C2}M>_pwu<8iIS4y)1fI2~v1t4c_qS&0iXW_;aQpEPT>3}#^F_gsFy zFZ0*;3-!qz`=PBN+ug_K8n@R)zWd5+XSpmAi+2Y%VZ(!G}JQQQ%{r z_|#|he(QW6_|Qi(3ViGnpPrxnW(kkC@5cqp|DBk?Pw054y>`ZgE$uBGkv-8WUQF=>w1i zOnZicBuSDaNs=T<`HL{%scY%^D=8kW#nGhSOP(qs)2!EdIS6It(SI74awGs`>Dm_S zjW!n?-%3MBz?MxgGvKIzDMU~vSyBvrW=64q^WShwH)W7U?4~W+SoI-I4`>Q?9mzFH*4pLb!$CavrN`n8FC32cScW*zBb^0pKf0 ze=r~xqaYLkmLK*wp#gv^7w8zHu*lO!oIg?HO}3D6a|Q1Yz)K@s0Y-#ab+&7k{Uy76 zzUsanjQL&Q0r;sTQ7{%4K8Cq2%_LlD3Irwm09OnyQ^6(%mh%&@j)+VorPxY2KjM6g zu|6QV-3_dZr3P&8E&(K_j+)Kbv#JWPMz#q7k6oafGHfPFXBUT1oLk^yCYsZkPLQ2) z0gm(uAq6vlQ-1>_?|l5rnn2tBbIYtCzi z(s@@?P_Pm&0Q4jrkrKR05{id>fB-+PiJ0vW0CPT=ynr&2IlPI%kgDOkxxk0UvD7>? z$N?VREXM&pfOdS?#(3!q5M5(p995jup3A@O0YOs)*tyn;1kJRF$;Jp!Dkaip2^yVwA^>kBJ}LApRbp+y6Kf02 z7zK%B@i_v3aVJd@oJh#hD%3_&2-Hc?M22CfK$zi;#4%xLRIxP06AFo7EY8Y&k*l=V z#j5B+X{tk3;UcY1JNn;JLd7Qq{SWjSCC)%&EYJbuYC@reR{o<_ndAy!5b5Pmi_^X81}!d)#}f4vR{m)nPfbKujc%0AOabCt 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 ve~Q)?zx4~9 diff --git a/app/assets/fonts/Inter-roman.greek.var.woff2 b/app/assets/fonts/Inter-roman.greek.var.woff2 deleted file mode 100644 index 8604c8a00017c69ba40cff1c9df08d3182642596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29580 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 V-l{^!gvQ#9HVFlf_v*i2oB>zyL6!gj diff --git a/app/assets/fonts/Inter-roman.latin.var.woff2 b/app/assets/fonts/Inter-roman.latin.var.woff2 deleted file mode 100644 index 9503ba17ff10471687d7af1b015737d90b0d94d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51896 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 From 0bb4443c9fce6dc6ad6c536e67f3980d38c10152 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 27 Jan 2025 08:08:44 -0500 Subject: [PATCH 217/274] Properly invoke the initializer to have Propshaft ignore tailwind Fixes #477, originally #470 was incompletely fixed. --- lib/tailwindcss/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tailwindcss/engine.rb b/lib/tailwindcss/engine.rb index 0c020bbc..7b88c5f1 100644 --- a/lib/tailwindcss/engine.rb +++ b/lib/tailwindcss/engine.rb @@ -6,7 +6,7 @@ class Engine < ::Rails::Engine Rails.application.config.generators.stylesheets = false end - initializer "tailwindcss.exclude_asset_path", after: "propshaft.append_assets_path" do + initializer "tailwindcss.exclude_asset_path", before: "propshaft.append_assets_path" do if Rails.application.config.assets.excluded_paths # the app may not be using Propshaft Rails.application.config.assets.excluded_paths << Rails.root.join("app/assets/tailwind") end From 894f6136cf57106ed4d9797cebed8e7c1c2255c3 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 27 Jan 2025 08:18:45 -0500 Subject: [PATCH 218/274] version bump to v4.0.0.rc3 --- CHANGELOG.md | 10 ++++++++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06cfedf3..2df7c487 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ ## next / unreleased +## v4.0.0.rc3 / 2025-01-27 + +Everything in v4.0.0.rc2, plus ... + +General changes: + +- Remove the Inter font assets from the gem. @EricGusmao +- If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. (This was incompletely fixed in RC2.) + + ## v4.0.0.rc2 / 2025-01-26 Everything in v4.0.0.rc1, plus ... diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 98efde4f..d706a5b0 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.0.0.rc2" + VERSION = "4.0.0.rc3" end From c126c6bacb22c706e32347f2d4d221eb4f4e468d Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Mon, 27 Jan 2025 12:46:19 -0500 Subject: [PATCH 219/274] Rename application.tailwind.css to application.css Its location is app/assets/tailwind so we don't need to say "tailwind" again. Also update tests, simplify some code, update the README, consolidate the CHANGELOG. --- CHANGELOG.md | 43 ++++++------------- README.md | 16 +++---- ...plication.tailwind.css => application.css} | 0 lib/install/install_tailwindcss.rb | 8 ++-- lib/install/upgrade_tailwindcss.rb | 12 +++--- lib/tailwindcss/commands.rb | 2 +- test/integration/user_install_test.sh | 6 +-- test/integration/user_upgrade_test.sh | 2 +- 8 files changed, 36 insertions(+), 53 deletions(-) rename lib/install/{application.tailwind.css => application.css} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2df7c487..56fc71bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,34 +1,12 @@ ## next / unreleased -## v4.0.0.rc3 / 2025-01-27 - -Everything in v4.0.0.rc2, plus ... - -General changes: - -- Remove the Inter font assets from the gem. @EricGusmao -- If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. (This was incompletely fixed in RC2.) - - -## v4.0.0.rc2 / 2025-01-26 - -Everything in v4.0.0.rc1, plus ... - -General changes: - -- The location of `application.tailwind.css` has moved from `app/assets/stylesheets` to `app/assets/tailwind`. If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. +## next rc / unreleased -Changes to the `tailwindcss:install` task: - -- The "tailwind" stylesheet link tag will only be added to the application layout if Propshaft isn't in use and already handling `app/assets/build/tailwind.css`. Previously it was always injected, resulting in the tag being rendered twice if Propshaft was in use. - -Changes to the `tailwindcss:upgrade` task: - -- The "tailwind" stylesheet link tag will be removed if Propshaft is in use and already handling `app/assets/build/tailwind.css`. -- The file `application.tailwind.css` will be moved from `app/assets/stylesheets` to `app/assets/tailwind`. +- The input file `app/assets/tailwind/application.tailwind.css` has been renamed to `app/assets/tailwind/application.css`. +Thanks to @brunoprietog for feedback and advice. -## v4.0.0.rc1 / 2025-01-23 +## v4.0.0.rc3 / 2025-01-27 ### Upgrade to Tailwind CSS v4 @@ -36,21 +14,26 @@ General changes: - Dependency on `tailwindcss-ruby` set to `~> 4.0`. - The location of (optional) `postcss.config.js` has moved from the `config/` directory to the app root. +- The location of `application.tailwind.css` has moved from `app/assets/stylesheets` to `app/assets/tailwind`. If Propshaft is being used, `app/assets/tailwind` will be excluded from its asset handling. +- The Inter font is no longer packaged with the gem. Changes to the `tailwindcss:install` task: - The `tailwindcss:install` task no longer installs `config/tailwind.config.js`. -- The Inter font is no longer packaged with the gem. -- Some Tailwind class names are updated for v4. +- The Inter font is no longer configured in the application layout. +- Some Tailwind class names in the ERB templates are updated for v4. +- The "tailwind" stylesheet link tag will only be added to the application layout if Propshaft isn't in use and already handling `app/assets/build/tailwind.css`. Previously it was always injected, resulting in the tag being rendered twice if Propshaft was in use. New task `tailwindcss:upgrade` upgrades many apps cleanly: - Cleans up some things in the generated `config/tailwind.config.js`. - Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). -- Removes references to the Inter font from the application layout. +- Removes configuration for the Inter font from the application layout. - If present, moves `config/postcss.config.js` to the root directory. +- The "tailwind" stylesheet link tag will be removed if Propshaft is in use and already handling `app/assets/build/tailwind.css`. +- The input file `application.tailwind.css` will be moved from `app/assets/stylesheets` to `app/assets/tailwind`. -Thanks to @EricGusmao and @excid3 for their help and advice on this work. +Thanks to @EricGusmao, @patriciomacadden, and @excid3 for their feedback, contributions, and advice on the v4 release. ## v3.3.1 / 2025-01-23 diff --git a/README.md b/README.md index 623f3f30..f9e51fdd 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Here's what the upgrade task does: - Cleans up some things in the generated `config/tailwind.config.js`. - If present, moves `config/postcss.config.js` to the root directory. -- If present, moves `app/assets/stylesheets/application.tailwind.css` to `app/assets/tailwind`. +- If present, moves `app/assets/stylesheets/application.tailwind.css` to `app/assets/tailwind/application.css`. - Removes unnecessary `stylesheet_link_tag "tailwindcss"` tags from the application layout. - Removes references to the Inter font from the application layout. - Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). @@ -119,22 +119,22 @@ $ bin/rails tailwindcss:upgrade gsub app/views/layouts/application.html.erb Remove unnecessary stylesheet_link_tag from application layout gsub app/views/layouts/application.html.erb - Moving application.tailwind.css to /home/user/myapp/app/assets/tailwind - create app/assets/tailwind/application.tailwind.css + Moving /home/user/myapp/app/assets/stylesheets/application.tailwind.css to /home/user/myapp/app/assets/tailwind/application.css + create app/assets/tailwind/application.css remove app/assets/stylesheets/application.tailwind.css 10.9.0 Running the upstream Tailwind CSS upgrader run npx @tailwindcss/upgrade@next --force --config /home/user/myapp/config/tailwind.config.js from "." ≈ tailwindcss v4.0.0 │ Searching for CSS files in the current directory and its subdirectories… -│ ↳ Linked `./config/tailwind.config.js` to `./app/assets/tailwind/application.tailwind.css` +│ ↳ Linked `./config/tailwind.config.js` to `./app/assets/tailwind/application.css` │ Migrating JavaScript configuration files… │ ↳ The configuration file at `./config/tailwind.config.js` could not be automatically migrated to the new CSS │ configuration format, so your CSS has been updated to load your existing configuration file. │ Migrating templates… │ ↳ Migrated templates for configuration file: `./config/tailwind.config.js` │ Migrating stylesheets… -│ ↳ Migrated stylesheet: `./app/assets/tailwind/application.tailwind.css` +│ ↳ Migrated stylesheet: `./app/assets/tailwind/application.css` │ ↳ No PostCSS config found, skipping migration. │ Updating dependencies… │ Could not detect a package manager. Please manually update `tailwindcss` to v4. @@ -167,11 +167,11 @@ We'll try to improve the upgrade process over time, but for now you may need to ### Configuration and commands -#### Input file: `app/assets/tailwind/application.tailwind.css` +#### Input file: `app/assets/tailwind/application.css` -The `tailwindcss:install` task will generate a Tailwind input file in `app/assets/tailwind/application.tailwind.css`. This is where you import the plugins you want to use and where you can setup your custom `@apply` rules. +The `tailwindcss:install` task will generate a Tailwind input file in `app/assets/tailwind/application.css`. This is where you import the plugins you want to use and where you can setup your custom `@apply` rules. -⚠ The location of this file changed in v4, from `app/assets/stylesheets` to `app/assets/tailwind`. The `tailwindcss:upgrade` task will move it for you. +⚠ The location of this file changed in v4, from `app/assets/stylesheets/application.tailwind.css` to `app/assets/tailwind/application.css`. The `tailwindcss:upgrade` task will move it for you. #### Output file: `app/assets/builds/tailwind.css` diff --git a/lib/install/application.tailwind.css b/lib/install/application.css similarity index 100% rename from lib/install/application.tailwind.css rename to lib/install/application.css diff --git a/lib/install/install_tailwindcss.rb b/lib/install/install_tailwindcss.rb index e210d60b..3d471d07 100644 --- a/lib/install/install_tailwindcss.rb +++ b/lib/install/install_tailwindcss.rb @@ -1,6 +1,6 @@ APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb") CENTERING_CONTAINER_INSERTION_POINT = /^\s*<%= yield %>/.freeze -TAILWIND_ASSET_PATH = Rails.root.join("app/assets/tailwind") +TAILWIND_ASSET_PATH = Rails.root.join("app/assets/tailwind/application.css") if APPLICATION_LAYOUT_PATH.exist? unless File.read(APPLICATION_LAYOUT_PATH).match?(/stylesheet_link_tag :app/) @@ -32,9 +32,9 @@ append_to_file(".gitignore", %(\n/app/assets/builds/*\n!/app/assets/builds/.keep\n)) end -unless TAILWIND_ASSET_PATH.join("application.tailwind.css").exist? - say "Add default #{TAILWIND_ASSET_PATH}/application.tailwind.css" - copy_file "#{__dir__}/application.tailwind.css", TAILWIND_ASSET_PATH.join("application.tailwind.css") +unless TAILWIND_ASSET_PATH.exist? + say "Add default #{TAILWIND_ASSET_PATH}" + copy_file "#{__dir__}/application.css", TAILWIND_ASSET_PATH end if Rails.root.join("Procfile.dev").exist? diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index 84a1aa8c..6266583a 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -1,8 +1,8 @@ TAILWIND_CONFIG_PATH = Rails.root.join("config/tailwind.config.js") APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb") POSTCSS_CONFIG_PATH = Rails.root.join("config/postcss.config.js") -OLD_TAILWIND_ASSET_PATH = Rails.root.join("app/assets/stylesheets") -TAILWIND_ASSET_PATH = Rails.root.join("app/assets/tailwind") +OLD_TAILWIND_ASSET_PATH = Rails.root.join("app/assets/stylesheets/application.tailwind.css") +TAILWIND_ASSET_PATH = Rails.root.join("app/assets/tailwind/application.css") unless TAILWIND_CONFIG_PATH.exist? say "Default tailwind.config.js is missing!", :red @@ -38,10 +38,10 @@ say %( Please check your layouts and remove any "inter-font" stylesheet links.) end -if OLD_TAILWIND_ASSET_PATH.join("application.tailwind.css").exist? - say "Moving application.tailwind.css to #{TAILWIND_ASSET_PATH}" - copy_file OLD_TAILWIND_ASSET_PATH.join("application.tailwind.css"), TAILWIND_ASSET_PATH.join("application.tailwind.css") - remove_file OLD_TAILWIND_ASSET_PATH.join("application.tailwind.css") +if OLD_TAILWIND_ASSET_PATH.exist? + say "Moving #{OLD_TAILWIND_ASSET_PATH} to #{TAILWIND_ASSET_PATH}" + copy_file OLD_TAILWIND_ASSET_PATH, TAILWIND_ASSET_PATH + remove_file OLD_TAILWIND_ASSET_PATH end if system("npx --version") diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index 11105dbc..4c90849e 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -8,7 +8,7 @@ def compile_command(debug: false, **kwargs) command = [ Tailwindcss::Ruby.executable(**kwargs), - "-i", rails_root.join("app/assets/tailwind/application.tailwind.css").to_s, + "-i", rails_root.join("app/assets/tailwind/application.css").to_s, "-o", rails_root.join("app/assets/builds/tailwind.css").to_s, ] diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index aaf00a67..09b03b2f 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -37,7 +37,7 @@ bin/rails tailwindcss:install # TEST: tailwind was installed correctly grep -q "

diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb index c37333e6..36dff837 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/passwords/new.html.erb @@ -11,7 +11,7 @@
- <%%= form.submit "Email reset instructions", class: "rounded-lg px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit "Email reset instructions", class: "w-full sm:w-auto text-center rounded-lg px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
<%% end %>
diff --git a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb index 64c145c0..30fb0d91 100644 --- a/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb +++ b/lib/generators/tailwindcss/authentication/templates/app/views/sessions/new.html.erb @@ -20,7 +20,7 @@
- <%%= form.submit "Sign in", class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit "Sign in", class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index 0ddb9735..e50790ce 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -38,6 +38,6 @@ <% end -%>
- <%%= form.submit class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %> + <%%= form.submit class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
<%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt index 74edd3de..08d92d3a 100644 --- a/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt @@ -5,6 +5,6 @@ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index 83d2b1ec..848c97fb 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -13,13 +13,13 @@
<%% if @<%= plural_table_name %>.any? %> <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %> -
+
<%%= render <%= singular_table_name %> %> -
- <%%= link_to "Show", <%= model_resource_name(singular_table_name) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> - <%%= link_to "Edit", <%= edit_helper(singular_table_name, type: :path) %>, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> -
- <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> +
+ <%%= link_to "Show", <%= model_resource_name(singular_table_name) %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Edit", <%= edit_helper(singular_table_name, type: :path) %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
+ <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt index 0a10d967..32ad9b83 100644 --- a/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt @@ -5,5 +5,5 @@ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
diff --git a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt index 68a73fcd..433b7a33 100644 --- a/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt @@ -1,4 +1,4 @@ -
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
<%= attribute.human_name %>: diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index b3057f99..b6f153c2 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -9,9 +9,9 @@ <%%= render @<%= singular_table_name %> %> - <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "mt-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> - <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> -
- <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "mt-2 rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> + <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
+ <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "w-full rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
From 3dab6d3a64c9ee8f86f7d3e49fdee14f2c2dcd2f Mon Sep 17 00:00:00 2001 From: Bogdan Gusiev Date: Sat, 22 Feb 2025 10:37:57 +0100 Subject: [PATCH 248/274] Explain plugins in readme --- README.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7fa18145..113c5130 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ With some additional manual work the upstream upgrade tool will update your appl /node_modules ``` -**Create** a `package.json` in the root of the project: +**Create** or **update** a `package.json` in the root of the project: ```jsonc { @@ -232,7 +232,9 @@ With some additional manual work the upstream upgrade tool will update your appl Then, once you've run that successfully, clean up: -- **Delete** `package.json`, `node_modules/` and `package-lock.json` (or `yarn.lock`), plus remove `/node_modules` from `.gitignore`. +- **Review** `package.json` to remove unnecessary modules. + - This includes modules added for the period of upgrade. + - If you don't need any modules besides `tailwindcss` itself, **delete** `package.json`, `node_modules/` and `package-lock.json` (or `yarn.lock`), plus remove `/node_modules` from `.gitignore`. - **Go** to your CSS file and remove the following line (if present): ```css @plugin '@tailwindcss/container-queries'; @@ -273,6 +275,30 @@ This gem also makes available a Puma plugin to manage a live rebuild process whe This gem also generates a `Procfile.dev` file which will run both the rails server and a live rebuild process (see "Live Rebuild" section below). +#### Install plugins + +Tailwind plugins can be installed using `package.json`. + +Using Yarn: + +``` sh +[ ! -f package.json ] && yarn init +yarn add daisyui # example +``` + +Using npm: + +``` sh +npm init +npm add daisyui # example +``` + +Than use `@plugin` annotation in `app/assets/tailwind/application.css`: + +``` css +@import "tailwindcss"; +@plugin "daisyui"; +``` ### Building for production From c1e52588114619180790869c571c38f1822bcbe2 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 23 Feb 2025 17:03:02 -0500 Subject: [PATCH 249/274] Bump the "tailwind plugins" section up to H3 and move it to after the basic build/rebuild commands unrelated, rename the upgrade-troubleshooting section to disambiguate from the generate-troubleshooting section. --- README.md | 58 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 113c5130..10c08036 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ - [Upgrading your application from Tailwind v3 to v4](#upgrading-your-application-from-tailwind-v3-to-v4) * [You don't _have_ to upgrade](#you-dont-_have_-to-upgrade) * [Upgrade steps](#upgrade-steps) - * [Troubleshooting](#troubleshooting) + * [Troubleshooting a v4 upgrade](#troubleshooting-a-v4-upgrade) * [Updating CSS class names for v4](#updating-css-class-names-for-v4) - [Developing with Tailwindcss](#developing-with-tailwindcss) * [Configuration and commands](#configuration-and-commands) @@ -20,9 +20,10 @@ * [Building for testing](#building-for-testing) * [Building unminified assets](#building-unminified-assets) * [Live rebuild](#live-rebuild) + * [Using Tailwind plugins](#using-tailwind-plugins) * [Using with PostCSS](#using-with-postcss) * [Custom inputs or outputs](#custom-inputs-or-outputs) -- [Troubleshooting](#troubleshooting-1) +- [Troubleshooting](#troubleshooting) * [Lost keystrokes or hanging when using terminal-based debugging tools (e.g. IRB, Pry, `ruby/debug`...etc.) with the Puma plugin](#lost-keystrokes-or-hanging-when-using-terminal-based-debugging-tools-eg-irb-pry-rubydebugetc-with-the-puma-plugin) * [Running in a docker container exits prematurely](#running-in-a-docker-container-exits-prematurely) * [Conflict with sassc-rails](#conflict-with-sassc-rails) @@ -171,7 +172,7 @@ Done in 56ms If this doesn't succeed, it's likely that you've customized your Tailwind configuration and you'll need to do some work to make sure your application upgrades. Please read the [official upgrade guide](https://tailwindcss.com/docs/upgrade-guide) and try following the additional steps in [Updating CSS class names for v4](#updating-css-class-names-for-v4). -### Troubleshooting +### Troubleshooting a v4 upgrade You may want to check out [TailwindCSS v4 - upgrade experience report · rails/tailwindcss-rails · Discussion #450](https://github.com/rails/tailwindcss-rails/discussions/450) if you're having trouble upgrading. @@ -275,31 +276,6 @@ This gem also makes available a Puma plugin to manage a live rebuild process whe This gem also generates a `Procfile.dev` file which will run both the rails server and a live rebuild process (see "Live Rebuild" section below). -#### Install plugins - -Tailwind plugins can be installed using `package.json`. - -Using Yarn: - -``` sh -[ ! -f package.json ] && yarn init -yarn add daisyui # example -``` - -Using npm: - -``` sh -npm init -npm add daisyui # example -``` - -Than use `@plugin` annotation in `app/assets/tailwind/application.css`: - -``` css -@import "tailwindcss"; -@plugin "daisyui"; -``` - ### Building for production The `tailwindcss:build` is automatically attached to `assets:precompile`, so before the asset pipeline digests the files, the Tailwind output will be generated. @@ -357,6 +333,32 @@ If you are running `rails tailwindcss:watch` in a docker container without a tty Running `bin/dev` invokes Foreman to start both the Tailwind watch process and the rails server in development mode based on your `Procfile.dev` file. +### Using Tailwind plugins + +If you want to use Tailwind plugins, they can be installed using `package.json`. + +Using Yarn: + +``` sh +[ ! -f package.json ] && yarn init +yarn add daisyui # example +``` + +Using npm: + +``` sh +npm init +npm add daisyui # example +``` + +Than use `@plugin` annotation in `app/assets/tailwind/application.css`: + +``` css +@import "tailwindcss"; +@plugin "daisyui"; +``` + + ### Using with PostCSS If you want to use PostCSS as a preprocessor, create a custom `postcss.config.js` in your project root directory, and that file will be loaded by Tailwind automatically. From 5ecd3a0ce0f0d109cdb22699096bc87ea811277d Mon Sep 17 00:00:00 2001 From: Roberto Date: Tue, 25 Feb 2025 14:28:10 -0300 Subject: [PATCH 250/274] Tailwindcss debug environment variable (#504) * Add TAILWINDCSS_DEBUG environment variable * Update README * ENV var should take precedence over command argument * prefer Hash.key? to !Hash[].nil? --------- Co-authored-by: Mike Dalessio --- README.md | 6 +++++- lib/tailwindcss/commands.rb | 1 + test/lib/tailwindcss/commands_test.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10c08036..f7afe7a8 100644 --- a/README.md +++ b/README.md @@ -288,8 +288,12 @@ The `tailwindcss:build` task is automatically attached to the `test:prepare` Rak ### Building unminified assets -If you want unminified assets, you can pass a `debug` argument to the rake task, i.e. `rails tailwindcss:build[debug]` or `rails tailwindcss:watch[debug]`. +If you want unminified assets, you can: +- pass a `debug` argument to the rake task, i.e. `rails tailwindcss:build[debug]` or `rails tailwindcss:watch[debug]`. +- set an environment variable named `TAILWINDCSS_DEBUG` with a non-blank value + +If both values are set, the environment variable will take precedence over the rake task argument. ### Live rebuild diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index fb90f4f6..bef42fd2 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -4,6 +4,7 @@ module Tailwindcss module Commands class << self def compile_command(debug: false, **kwargs) + debug = ENV["TAILWINDCSS_DEBUG"].present? if ENV.key?("TAILWINDCSS_DEBUG") rails_root = defined?(Rails) ? Rails.root : Pathname.new(Dir.pwd) command = [ diff --git a/test/lib/tailwindcss/commands_test.rb b/test/lib/tailwindcss/commands_test.rb index 3c7e5302..d09481a4 100644 --- a/test/lib/tailwindcss/commands_test.rb +++ b/test/lib/tailwindcss/commands_test.rb @@ -33,6 +33,32 @@ def setup end end + test ".compile_command debug environment variable" do + begin + Rails.stub(:root, File) do # Rails.root won't work in this test suite + ENV["TAILWINDCSS_DEBUG"] = "" + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + assert_includes(actual, "--minify") + + actual = Tailwindcss::Commands.compile_command(debug: true) + assert_kind_of(Array, actual) + assert_includes(actual, "--minify") + + ENV["TAILWINDCSS_DEBUG"] = "any non-blank value" + actual = Tailwindcss::Commands.compile_command + assert_kind_of(Array, actual) + refute_includes(actual, "--minify") + + actual = Tailwindcss::Commands.compile_command(debug: true) + assert_kind_of(Array, actual) + refute_includes(actual, "--minify") + end + ensure + ENV.delete('TAILWINDCSS_DEBUG') + end + end + test ".compile_command when Rails compression is on" do Rails.stub(:root, File) do # Rails.root won't work in this test suite Tailwindcss::Commands.stub(:rails_css_compressor?, true) do From 08486ae14237e7381f3f874e606df1ba432947dc Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 25 Feb 2025 12:28:28 -0500 Subject: [PATCH 251/274] doc: update CHANGELOG for #504 [skip ci] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e75b884b..3d67e9b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # `tailwindcss-rails` Changelog +## next / unreleased + +### Features + +* Support for environment variable `TAILWINDCSS_DEBUG` to turn off CSS minification. #504 @r-sierra + + ## v4.1.0 / 2025-02-19 ### View template improvements From 0144d00624e2fd3b3058c90877c805b576b4a27a Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sun, 2 Mar 2025 16:47:41 -0500 Subject: [PATCH 252/274] version bump to v4.2.0 --- CHANGELOG.md | 3 ++- lib/tailwindcss/version.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d67e9b9..9ad013b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # `tailwindcss-rails` Changelog -## next / unreleased +## v4.2.0 / 2025-03-02 ### Features +* Improve the view templates to display better on mobile devices. #503 @patriciomacadden * Support for environment variable `TAILWINDCSS_DEBUG` to turn off CSS minification. #504 @r-sierra diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 7a096603..a172caa0 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.1.0" + VERSION = "4.2.0" end From e670d358212f73340c33b8e3c228394f7a4212e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 14:44:50 +0000 Subject: [PATCH 253/274] build(deps): bump tailwindcss-ruby from 4.0.7 to 4.0.9 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.7 to 4.0.9. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/v4.x/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.7...v4.0.9) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 730f94fb..054f9e8e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.3) - tailwindcss-ruby (4.0.7) - tailwindcss-ruby (4.0.7-aarch64-linux-gnu) - tailwindcss-ruby (4.0.7-arm64-darwin) - tailwindcss-ruby (4.0.7-x86_64-darwin) - tailwindcss-ruby (4.0.7-x86_64-linux-gnu) + tailwindcss-ruby (4.0.9) + tailwindcss-ruby (4.0.9-aarch64-linux-gnu) + tailwindcss-ruby (4.0.9-arm64-darwin) + tailwindcss-ruby (4.0.9-x86_64-darwin) + tailwindcss-ruby (4.0.9-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From 3fc4b2e26b52325c7bd3437eaf1d1c696fe73f94 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 5 Mar 2025 10:10:09 -0500 Subject: [PATCH 254/274] dep: bundle update --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 054f9e8e..34457850 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (4.1.0) + tailwindcss-rails (4.2.0) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) @@ -110,7 +110,7 @@ GEM date stringio racc (1.8.1) - rack (3.1.10) + rack (3.1.11) rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) @@ -139,7 +139,7 @@ GEM reline (0.6.0) io-console (~> 0.5) securerandom (0.4.1) - stringio (3.1.3) + stringio (3.1.5) tailwindcss-ruby (4.0.9) tailwindcss-ruby (4.0.9-aarch64-linux-gnu) tailwindcss-ruby (4.0.9-arm64-darwin) @@ -149,7 +149,7 @@ GEM timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - uri (1.0.2) + uri (1.0.3) useragent (0.16.11) zeitwerk (2.7.2) From 14830b75a25271111e61b5d75d71e504527f5f83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:14:17 +0000 Subject: [PATCH 255/274] build(deps): bump tailwindcss-ruby from 4.0.9 to 4.0.12 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.9 to 4.0.12. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/v4.x/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.9...v4.0.12) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 34457850..1aa66c0f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.0.9) - tailwindcss-ruby (4.0.9-aarch64-linux-gnu) - tailwindcss-ruby (4.0.9-arm64-darwin) - tailwindcss-ruby (4.0.9-x86_64-darwin) - tailwindcss-ruby (4.0.9-x86_64-linux-gnu) + tailwindcss-ruby (4.0.12) + tailwindcss-ruby (4.0.12-aarch64-linux-gnu) + tailwindcss-ruby (4.0.12-arm64-darwin) + tailwindcss-ruby (4.0.12-x86_64-darwin) + tailwindcss-ruby (4.0.12-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From 91a67e904d8b405305c5b59750e8ba0f3b9d39d5 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Mon, 17 Mar 2025 09:37:50 -0300 Subject: [PATCH 256/274] Fix hardcoded attribute in form --- lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt index e50790ce..1821201c 100644 --- a/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt @@ -23,7 +23,7 @@ <%%= form.password_field :password_confirmation, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password_confirmation].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password_confirmation].any?}] %> <% elsif attribute.attachments? -%> <%%= form.label :<%= attribute.column_name %> %> - <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:password].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:password].any?}] %> + <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].none?, "border-red-400 focus:outline-red-600": <%= model_resource_name %>.errors[:<%= attribute.column_name %>].any?}] %> <% else -%> <%%= form.label :<%= attribute.column_name %> %> <% if attribute.field_type == :textarea || attribute.field_type == :text_area -%> From 5034ada51e6e31736571e46399d85c97106a0e41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:19:05 +0000 Subject: [PATCH 257/274] build(deps): bump tailwindcss-ruby from 4.0.12 to 4.0.14 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.12 to 4.0.14. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/v4.x/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.12...v4.0.14) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1aa66c0f..7480d3ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.0.12) - tailwindcss-ruby (4.0.12-aarch64-linux-gnu) - tailwindcss-ruby (4.0.12-arm64-darwin) - tailwindcss-ruby (4.0.12-x86_64-darwin) - tailwindcss-ruby (4.0.12-x86_64-linux-gnu) + tailwindcss-ruby (4.0.14) + tailwindcss-ruby (4.0.14-aarch64-linux-gnu) + tailwindcss-ruby (4.0.14-arm64-darwin) + tailwindcss-ruby (4.0.14-x86_64-darwin) + tailwindcss-ruby (4.0.14-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From b70e705e07740be700d7465a3ce684b5188b7748 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:19:14 +0000 Subject: [PATCH 258/274] build(deps): bump railties from 8.0.1 to 8.0.2 Bumps [railties](https://github.com/rails/rails) from 8.0.1 to 8.0.2. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v8.0.2/railties/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v8.0.1...v8.0.2) --- updated-dependencies: - dependency-name: railties dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1aa66c0f..3c305111 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,16 +8,16 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (8.0.1) - actionpack (= 8.0.1) - actionview (= 8.0.1) - activejob (= 8.0.1) - activesupport (= 8.0.1) + actionmailer (8.0.2) + actionpack (= 8.0.2) + actionview (= 8.0.2) + activejob (= 8.0.2) + activesupport (= 8.0.2) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.1) - actionview (= 8.0.1) - activesupport (= 8.0.1) + actionpack (8.0.2) + actionview (= 8.0.2) + activesupport (= 8.0.2) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -25,16 +25,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actionview (8.0.1) - activesupport (= 8.0.1) + actionview (8.0.2) + activesupport (= 8.0.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.1) - activesupport (= 8.0.1) + activejob (8.0.2) + activesupport (= 8.0.2) globalid (>= 0.3.6) - activesupport (8.0.1) + activesupport (8.0.2) base64 benchmark (>= 0.3) bigdecimal @@ -80,7 +80,7 @@ GEM net-smtp mini_mime (1.1.5) mini_portile2 (2.8.8) - minitest (5.25.4) + minitest (5.25.5) net-imap (0.5.6) date net-protocol @@ -90,18 +90,18 @@ GEM timeout net-smtp (0.5.1) net-protocol - nokogiri (1.18.3) + nokogiri (1.18.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.3-aarch64-linux-gnu) + nokogiri (1.18.4-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.3-arm-linux-gnu) + nokogiri (1.18.4-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.3-arm64-darwin) + nokogiri (1.18.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.3-x86_64-darwin) + nokogiri (1.18.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.3-x86_64-linux-gnu) + nokogiri (1.18.4-x86_64-linux-gnu) racc (~> 1.4) pp (0.6.2) prettyprint @@ -110,7 +110,7 @@ GEM date stringio racc (1.8.1) - rack (3.1.11) + rack (3.1.12) rack-session (2.1.0) base64 (>= 0.1.0) rack (>= 3.0.0) @@ -125,9 +125,9 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.1) - actionpack (= 8.0.1) - activesupport (= 8.0.1) + railties (8.0.2) + actionpack (= 8.0.2) + activesupport (= 8.0.2) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From bd57aab639c8ee5202ef7bf5b0fd437f3b05f2f7 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Mar 2025 14:56:10 -0400 Subject: [PATCH 259/274] doc: update CHANGELOG [skip ci] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ad013b2..719bc894 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # `tailwindcss-rails` Changelog +## next / unreleased + +### Fixed + +* Fix styles for form errors in some scaffold fields. #513 @patriciomacadden + + ## v4.2.0 / 2025-03-02 ### Features From 84a0d6bf869ade33e450c4b070e5fa7b5d3d7e8a Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Wed, 19 Mar 2025 11:09:43 -0300 Subject: [PATCH 260/274] add accept_confirm if turbo is available so system tests don't fail. fixes #519 --- .../scaffold/scaffold_generator.rb | 1 + .../test_unit/scaffold/scaffold_generator.rb | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 lib/generators/test_unit/scaffold/scaffold_generator.rb diff --git a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb index 39c2da1f..8748210d 100644 --- a/lib/generators/tailwindcss/scaffold/scaffold_generator.rb +++ b/lib/generators/tailwindcss/scaffold/scaffold_generator.rb @@ -1,5 +1,6 @@ require "rails/generators/erb/scaffold/scaffold_generator" require "rails/generators/resource_helpers" +require File.expand_path("../../test_unit/scaffold/scaffold_generator.rb", __dir__) module Tailwindcss module Generators diff --git a/lib/generators/test_unit/scaffold/scaffold_generator.rb b/lib/generators/test_unit/scaffold/scaffold_generator.rb new file mode 100644 index 00000000..b97d74e4 --- /dev/null +++ b/lib/generators/test_unit/scaffold/scaffold_generator.rb @@ -0,0 +1,19 @@ +require "rails/generators/test_unit/scaffold/scaffold_generator" + +module TestUnit # :nodoc: + module Generators # :nodoc: + class ScaffoldGenerator < Base # :nodoc: + def fix_system_test + if turbo_defined? + gsub_file File.join("test/system", class_path, "#{file_name.pluralize}_test.rb"), "click_on \"Destroy this #{human_name.downcase}\", match: :first", "accept_confirm { click_on \"Destroy this #{human_name.downcase}\", match: :first }" + end + end + + private + + def turbo_defined? + defined?(Turbo) + end + end + end +end From 0653d82770e5c3b5196b882117447213bddd1a03 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Mar 2025 15:05:49 -0400 Subject: [PATCH 261/274] Make the system test gsub less finicky --- lib/generators/test_unit/scaffold/scaffold_generator.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/generators/test_unit/scaffold/scaffold_generator.rb b/lib/generators/test_unit/scaffold/scaffold_generator.rb index b97d74e4..ff809b32 100644 --- a/lib/generators/test_unit/scaffold/scaffold_generator.rb +++ b/lib/generators/test_unit/scaffold/scaffold_generator.rb @@ -5,7 +5,9 @@ module Generators # :nodoc: class ScaffoldGenerator < Base # :nodoc: def fix_system_test if turbo_defined? - gsub_file File.join("test/system", class_path, "#{file_name.pluralize}_test.rb"), "click_on \"Destroy this #{human_name.downcase}\", match: :first", "accept_confirm { click_on \"Destroy this #{human_name.downcase}\", match: :first }" + gsub_file File.join("test/system", class_path, "#{file_name.pluralize}_test.rb"), + /(click_on.*Destroy this.*)$/, + "accept_confirm { \\1 }" end end From 37c98c3e95d08c2ddb7f0766222b0840869ef820 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Mar 2025 15:12:46 -0400 Subject: [PATCH 262/274] Add a simple integration test for the scaffolded system test --- test/integration/user_install_test.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/integration/user_install_test.sh b/test/integration/user_install_test.sh index 6f4ca301..bfd7a87c 100755 --- a/test/integration/user_install_test.sh +++ b/test/integration/user_install_test.sh @@ -63,6 +63,9 @@ fi bin/rails generate scaffold post title:string body:text published:boolean grep -q "Show" app/views/posts/index.html.erb +# TEST: the "accept_confirm" system test change was applied cleanly +grep -q "accept_confirm { click_on \"Destroy this post\"" test/system/posts_test.rb + # TEST: contents of the css file bin/rails tailwindcss:build[verbose] grep -q "py-2" app/assets/builds/tailwind.css From d08ca11298678a4b5128683ab9a3df19d23136d8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 19 Mar 2025 15:20:33 -0400 Subject: [PATCH 263/274] version bump to v4.2.1 --- CHANGELOG.md | 3 ++- lib/tailwindcss/version.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 719bc894..47d080f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,11 @@ # `tailwindcss-rails` Changelog -## next / unreleased +## v4.2.1 / 2025-03-19 ### Fixed * Fix styles for form errors in some scaffold fields. #513 @patriciomacadden +* Update scaffold system tests to handle the "Destroy" confirmation prompt when Turbo is enabled. Fixes #519. #520 @patriciomacadden @flavorjones ## v4.2.0 / 2025-03-02 diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index a172caa0..86e02ae2 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.2.0" + VERSION = "4.2.1" end From 11e7c3d21739ce1188c080138375a4927d3fe5e6 Mon Sep 17 00:00:00 2001 From: Patricio Mac Adden Date: Fri, 28 Mar 2025 09:58:15 -0300 Subject: [PATCH 264/274] Simplify markup --- .../tailwindcss/scaffold/templates/index.html.erb.tt | 4 +--- .../tailwindcss/scaffold/templates/show.html.erb.tt | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt index 848c97fb..12a0db16 100644 --- a/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt @@ -18,9 +18,7 @@
<%%= link_to "Show", <%= model_resource_name(singular_table_name) %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> <%%= link_to "Edit", <%= edit_helper(singular_table_name, type: :path) %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> -
- <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> -
+ <%%= button_to "Destroy", <%= model_resource_name %>, method: :delete, class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
<%% end %> diff --git a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt index b6f153c2..2b6687d2 100644 --- a/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt +++ b/lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt @@ -11,7 +11,5 @@ <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper %>_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> -
- <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, class: "w-full rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> -
+ <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete, form_class: "sm:inline-block mt-2 sm:mt-0 sm:ml-2", class: "w-full rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
From f099ee65f73fefc070a4fa126bfdeb8c6fdcea08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 15:02:14 +0000 Subject: [PATCH 265/274] build(deps): bump tailwindcss-ruby from 4.0.14 to 4.0.17 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.14 to 4.0.17. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.14...v4.0.17) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 459f089e..59dfd05d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.0.14) - tailwindcss-ruby (4.0.14-aarch64-linux-gnu) - tailwindcss-ruby (4.0.14-arm64-darwin) - tailwindcss-ruby (4.0.14-x86_64-darwin) - tailwindcss-ruby (4.0.14-x86_64-linux-gnu) + tailwindcss-ruby (4.0.17) + tailwindcss-ruby (4.0.17-aarch64-linux-gnu) + tailwindcss-ruby (4.0.17-arm64-darwin) + tailwindcss-ruby (4.0.17-x86_64-darwin) + tailwindcss-ruby (4.0.17-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From b0d41eb5bbcee6c072457f2f06a0720b628ea5ed Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 5 Apr 2025 11:11:08 -0400 Subject: [PATCH 266/274] ci: use the latest @tailwindcss/upgrade package --- README.md | 2 +- lib/install/upgrade_tailwindcss.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f7afe7a8..c9982de6 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ $ bin/rails tailwindcss:upgrade remove app/assets/stylesheets/application.tailwind.css 10.9.0 Running the upstream Tailwind CSS upgrader - run npx @tailwindcss/upgrade@next --force --config /home/user/myapp/config/tailwind.config.js from "." + run npx @tailwindcss/upgrade --force --config /home/user/myapp/config/tailwind.config.js from "." ≈ tailwindcss v4.0.0 │ Searching for CSS files in the current directory and its subdirectories… │ ↳ Linked `./config/tailwind.config.js` to `./app/assets/tailwind/application.css` diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index 6266583a..004d9a82 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -46,7 +46,7 @@ if system("npx --version") say "Running the upstream Tailwind CSS upgrader" - command = Shellwords.join(["npx", "@tailwindcss/upgrade@next", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) + command = Shellwords.join(["npx", "@tailwindcss/upgrade", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) success = run(command, abort_on_failure: false) unless success say "The upgrade tool failed!", :red From fd2505954c9a077ae17cee3e55dadd0434272776 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 5 Apr 2025 09:39:13 -0400 Subject: [PATCH 267/274] Improve the state of debugging when things go wrong - The "verbose" flag turns on additional debugging output from tailwindcss - Document the "watchman" problem - Document how to use the "verbose" flag when troubleshooting --- README.md | 35 ++++++++++++++++++++++++++++++++++- lib/tailwindcss/commands.rb | 6 ++++++ lib/tasks/build.rake | 16 ++++++++++++---- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c9982de6..7188adff 100644 --- a/README.md +++ b/README.md @@ -403,30 +403,63 @@ If you need to use a custom input or output file, you can run `bundle exec tailw ## Troubleshooting -Some common problems experienced by users ... +When having trouble with `tailwindcss:build` or `tailwindcss:watch`, the first thing you should do is collect some diagnostic information by setting the "verbose" flag, which will emit: + +1. the command being run (so you can try running `tailwindcss` yourself without the gem's help) +2. additional debugging output from `tailwindcss` by setting the env var `DEBUG=1` + +Here's what that looks like: + +``` sh +$ bin/rails tailwindcss:build[verbose] + +Running: /path/to/tailwindcss-ruby-4.0.17-x86_64-linux-gnu/exe/x86_64-linux-gnu/tailwindcss -i /home/flavorjones/code/oss/tailwindcss-rails/My Workspace/test-install/app/assets/tailwind/application.css -o /home/flavorjones/code/oss/tailwindcss-rails/My Workspace/test-install/app/assets/builds/tailwind.css --minify +≈ tailwindcss v4.0.17 + +Done in 37ms + +[38.22ms] [@tailwindcss/cli] (initial build) +[11.90ms] ↳ Setup compiler +[ 6.52ms] ↳ Scan for candidates +[10.39ms] ↳ Build CSS +[ 1.69ms] ↳ Optimize CSS +[ 5.80ms] ↳ Write output +``` + +### The `watch` command is hanging + +There is a [known issue](https://github.com/tailwindlabs/tailwindcss/issues/17246#issuecomment-2753067488) running `tailwindcss -w` (that's the CLI in watch mode) when the utility `watchman` is also installed. + +Please try uninstalling `watchman` and try running the watch task again. + ### Lost keystrokes or hanging when using terminal-based debugging tools (e.g. IRB, Pry, `ruby/debug`...etc.) with the Puma plugin We've addressed the issue and you can avoid the problem by upgrading `tailwindcss-rails` to [v2.4.1](https://github.com/rails/tailwindcss-rails/releases/tag/v2.4.1) or later versions. + ### Running in a docker container exits prematurely If you are running `rails tailwindcss:watch` as a process in a Docker container, set `tty: true` in `docker-compose.yml` for the appropriate container to keep the watch process running. If you are running `rails tailwindcss:watch` in a docker container without a tty, pass the `always` argument to the task to instruct tailwindcss to keep the watcher alive even when `stdin` is closed: `rails tailwindcss:watch[always]`. If you use `bin/dev` then you should modify your `Procfile.dev`. + ### Conflict with sassc-rails Tailwind uses modern CSS features that are not recognized by the `sassc-rails` extension that was included by default in the Gemfile for Rails 6. In order to avoid any errors like `SassC::SyntaxError`, you must remove that gem from your Gemfile. + ### Class names must be spelled out For Tailwind to work, your class names need to be spelled out. If you need to make sure Tailwind generates class names that don't exist in your content files or that are programmatically composed, use the [safelist option](https://tailwindcss.com/docs/content-configuration#safelisting-classes). + ### `ERROR: Cannot find the tailwindcss executable` for supported platform See https://github.com/flavorjones/tailwindcss-ruby for help. + ### Using asset-pipeline assets In Rails, you want to use [assets from the asset pipeline to get fingerprinting](https://guides.rubyonrails.org/asset_pipeline.html#fingerprinting-versioning-with-digest-based-urls). However, Tailwind isn't aware of those assets. diff --git a/lib/tailwindcss/commands.rb b/lib/tailwindcss/commands.rb index bef42fd2..99ad30e0 100644 --- a/lib/tailwindcss/commands.rb +++ b/lib/tailwindcss/commands.rb @@ -29,6 +29,12 @@ def watch_command(always: false, poll: false, **kwargs) end end + def command_env(verbose:) + {}.tap do |env| + env["DEBUG"] = "1" if verbose + end + end + def rails_css_compressor? defined?(Rails) && Rails&.application&.config&.assets&.css_compressor.present? end diff --git a/lib/tasks/build.rake b/lib/tasks/build.rake index 3044ff05..603c8059 100644 --- a/lib/tasks/build.rake +++ b/lib/tasks/build.rake @@ -2,9 +2,13 @@ namespace :tailwindcss do desc "Build your Tailwind CSS" task build: :environment do |_, args| debug = args.extras.include?("debug") + verbose = args.extras.include?("verbose") + command = Tailwindcss::Commands.compile_command(debug: debug) - puts command.inspect if args.extras.include?("verbose") - system(*command, exception: true) + env = Tailwindcss::Commands.command_env(verbose: verbose) + puts "Running: #{Shellwords.join(command)}" if verbose + + system(env, *command, exception: true) end desc "Watch and build your Tailwind CSS on file changes" @@ -12,9 +16,13 @@ namespace :tailwindcss do debug = args.extras.include?("debug") poll = args.extras.include?("poll") always = args.extras.include?("always") + verbose = args.extras.include?("verbose") + command = Tailwindcss::Commands.watch_command(always: always, debug: debug, poll: poll) - puts command.inspect if args.extras.include?("verbose") - system(*command) + env = Tailwindcss::Commands.command_env(verbose: verbose) + puts "Running: #{Shellwords.join(command)}" if verbose + + system(env, *command) rescue Interrupt puts "Received interrupt, exiting tailwindcss:watch" if args.extras.include?("verbose") end From f722f192de0f4d66d137196fc34e3052e9a3ed6f Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 5 Apr 2025 12:00:19 -0400 Subject: [PATCH 268/274] version bump to v4.2.2 --- CHANGELOG.md | 9 +++++++++ Gemfile.lock | 2 +- lib/tailwindcss/version.rb | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47d080f9..e0f90dac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # `tailwindcss-rails` Changelog +## v4.2.2 / 2025-04-05 + +### Improved + +* The "tailwindcss:upgrade" task now uses the latest version of the `@tailwindcss/upgrade` tool. #529 @flavorjones +* The "verbose" flag on Rails tasks now emits additional tailwind CLI debugging info (e.g., `bin/rails tailwindcss:build[verbose]`). #530 @flavorjones +* Simplified the scaffold templates, removing unnecessary `div` tags. @523 @patriciomacadden + + ## v4.2.1 / 2025-03-19 ### Fixed diff --git a/Gemfile.lock b/Gemfile.lock index 59dfd05d..08ddee5a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - tailwindcss-rails (4.2.0) + tailwindcss-rails (4.2.2) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 86e02ae2..8a0f50d8 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.2.1" + VERSION = "4.2.2" end From fa9e2caafb7d1258aef576889568600a06e53299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 15:30:10 +0000 Subject: [PATCH 269/274] build(deps): bump tailwindcss-ruby from 4.0.17 to 4.1.4 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.0.17 to 4.1.4. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.0.17...v4.1.4) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-version: 4.1.4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 08ddee5a..ec551873 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.0.17) - tailwindcss-ruby (4.0.17-aarch64-linux-gnu) - tailwindcss-ruby (4.0.17-arm64-darwin) - tailwindcss-ruby (4.0.17-x86_64-darwin) - tailwindcss-ruby (4.0.17-x86_64-linux-gnu) + tailwindcss-ruby (4.1.4) + tailwindcss-ruby (4.1.4-aarch64-linux-gnu) + tailwindcss-ruby (4.1.4-arm64-darwin) + tailwindcss-ruby (4.1.4-x86_64-darwin) + tailwindcss-ruby (4.1.4-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From 9c7179008b9c2db11a7908036b06f63dceeeb6db Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 2 May 2025 16:21:52 -0400 Subject: [PATCH 270/274] Pin the npm upgrade task to @tailwindcss/upgrade@4.1.4 because the 4.1.5 upgrade tool introduced a dependency on tailwind that I can't figure out how to resolve. Gah, this entire experience has been entirely frustrating as a downstream maintainer, FML --- README.md | 4 ++-- lib/install/upgrade_tailwindcss.rb | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7188adff..158b1750 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ Then, run `bin/rails tailwindcss:upgrade`. Among other things, this will try to - If present, moves `app/assets/stylesheets/application.tailwind.css` to `app/assets/tailwind/application.css`. - Removes unnecessary `stylesheet_link_tag "tailwindcss"` tags from the application layout. - Removes references to the Inter font from the application layout. -- Runs the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). +- Runs v4.1.4 of the upstream upgrader (note: requires `npx` to run the one-time upgrade, but highly recommended). @@ -145,7 +145,7 @@ $ bin/rails tailwindcss:upgrade remove app/assets/stylesheets/application.tailwind.css 10.9.0 Running the upstream Tailwind CSS upgrader - run npx @tailwindcss/upgrade --force --config /home/user/myapp/config/tailwind.config.js from "." + run npx @tailwindcss/upgrade@4.1.4 --force --config /home/user/myapp/config/tailwind.config.js from "." ≈ tailwindcss v4.0.0 │ Searching for CSS files in the current directory and its subdirectories… │ ↳ Linked `./config/tailwind.config.js` to `./app/assets/tailwind/application.css` diff --git a/lib/install/upgrade_tailwindcss.rb b/lib/install/upgrade_tailwindcss.rb index 004d9a82..d6ecadab 100644 --- a/lib/install/upgrade_tailwindcss.rb +++ b/lib/install/upgrade_tailwindcss.rb @@ -45,8 +45,14 @@ end if system("npx --version") + # We're pinning to v4.1.4 because v4.1.5 of the upgrade tool introduces a dependency version check + # on tailwind and I haven't been able to figure out how to get that to work reliably and I am + # extremely frustrated with the whole thing. See #544 + # + # At some point we will probably need to unpin this at which point I am sincerely hoping that + # someone else will do it. say "Running the upstream Tailwind CSS upgrader" - command = Shellwords.join(["npx", "@tailwindcss/upgrade", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) + command = Shellwords.join(["npx", "@tailwindcss/upgrade@4.1.4", "--force", "--config", TAILWIND_CONFIG_PATH.to_s]) success = run(command, abort_on_failure: false) unless success say "The upgrade tool failed!", :red From 114fca5b4e235dd9cb14f54161f75032fd247681 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 2 May 2025 16:45:32 -0400 Subject: [PATCH 271/274] version bump to v4.2.3 --- CHANGELOG.md | 7 +++++++ lib/tailwindcss/version.rb | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0f90dac..d662d7a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # `tailwindcss-rails` Changelog +## v4.2.3 / 2025-05-02 + +### Improved + +* The "tailwindcss:upgrade" task now pins to v4.1.4 of the `@tailwindcss/upgrade` tool. #544 @flavorjones + + ## v4.2.2 / 2025-04-05 ### Improved diff --git a/lib/tailwindcss/version.rb b/lib/tailwindcss/version.rb index 8a0f50d8..7ab2db8d 100644 --- a/lib/tailwindcss/version.rb +++ b/lib/tailwindcss/version.rb @@ -1,3 +1,3 @@ module Tailwindcss - VERSION = "4.2.2" + VERSION = "4.2.3" end From 3f6d06d0981435c5cdd37951925e31fe70c6870e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 15:12:32 +0000 Subject: [PATCH 272/274] build(deps): bump tailwindcss-ruby from 4.1.4 to 4.1.5 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.1.4 to 4.1.5. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.1.4...v4.1.5) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-version: 4.1.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ec551873..bb16d405 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.1.4) - tailwindcss-ruby (4.1.4-aarch64-linux-gnu) - tailwindcss-ruby (4.1.4-arm64-darwin) - tailwindcss-ruby (4.1.4-x86_64-darwin) - tailwindcss-ruby (4.1.4-x86_64-linux-gnu) + tailwindcss-ruby (4.1.5) + tailwindcss-ruby (4.1.5-aarch64-linux-gnu) + tailwindcss-ruby (4.1.5-arm64-darwin) + tailwindcss-ruby (4.1.5-x86_64-darwin) + tailwindcss-ruby (4.1.5-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From 9d0a9f5e81aac890cbc6476f49515d9d45dc8abe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 14:17:03 +0000 Subject: [PATCH 273/274] build(deps): bump tailwindcss-ruby from 4.1.5 to 4.1.6 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.1.5 to 4.1.6. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.1.5...v4.1.6) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-version: 4.1.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index bb16d405..f84bada9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.1.5) - tailwindcss-ruby (4.1.5-aarch64-linux-gnu) - tailwindcss-ruby (4.1.5-arm64-darwin) - tailwindcss-ruby (4.1.5-x86_64-darwin) - tailwindcss-ruby (4.1.5-x86_64-linux-gnu) + tailwindcss-ruby (4.1.6) + tailwindcss-ruby (4.1.6-aarch64-linux-gnu) + tailwindcss-ruby (4.1.6-arm64-darwin) + tailwindcss-ruby (4.1.6-x86_64-darwin) + tailwindcss-ruby (4.1.6-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6) From 401b00b61c78c7dd7dfe33142d9a6660b8f4546c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 14:16:45 +0000 Subject: [PATCH 274/274] build(deps): bump tailwindcss-ruby from 4.1.6 to 4.1.7 Bumps [tailwindcss-ruby](https://github.com/flavorjones/tailwindcss-ruby) from 4.1.6 to 4.1.7. - [Release notes](https://github.com/flavorjones/tailwindcss-ruby/releases) - [Changelog](https://github.com/flavorjones/tailwindcss-ruby/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/tailwindcss-ruby/compare/v4.1.6...v4.1.7) --- updated-dependencies: - dependency-name: tailwindcss-ruby dependency-version: 4.1.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f84bada9..9b0500db 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,11 +140,11 @@ GEM io-console (~> 0.5) securerandom (0.4.1) stringio (3.1.5) - tailwindcss-ruby (4.1.6) - tailwindcss-ruby (4.1.6-aarch64-linux-gnu) - tailwindcss-ruby (4.1.6-arm64-darwin) - tailwindcss-ruby (4.1.6-x86_64-darwin) - tailwindcss-ruby (4.1.6-x86_64-linux-gnu) + tailwindcss-ruby (4.1.7) + tailwindcss-ruby (4.1.7-aarch64-linux-gnu) + tailwindcss-ruby (4.1.7-arm64-darwin) + tailwindcss-ruby (4.1.7-x86_64-darwin) + tailwindcss-ruby (4.1.7-x86_64-linux-gnu) thor (1.3.2) timeout (0.4.3) tzinfo (2.0.6)