tailwindcss-rails 0.3.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ require "rails/generators/erb/controller/controller_generator"
2
+
3
+ module Tailwindcss
4
+ module Generators
5
+ class ControllerGenerator < Erb::Generators::ControllerGenerator
6
+ source_root File.expand_path("../templates", __FILE__)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ <div>
2
+ <h1 class="text-lg font-bold text-4xl"><%= class_name %>#<%= @action %></h1>
3
+ <p>Find me in <%= @path %></p>
4
+ </div>
@@ -0,0 +1,9 @@
1
+ require "rails/generators/erb/mailer/mailer_generator"
2
+
3
+ module Tailwindcss
4
+ module Generators
5
+ class MailerGenerator < Erb::Generators::MailerGenerator
6
+ source_root File.expand_path("../templates", __FILE__)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ <h1><%= class_name %>#<%= @action %></h1>
2
+
3
+ <p>
4
+ <%%= @greeting %>, find me in <%= @path %>
5
+ </p>
@@ -0,0 +1,3 @@
1
+ <%= class_name %>#<%= @action %>
2
+
3
+ <%%= @greeting %>, find me in <%= @path %>
@@ -0,0 +1,34 @@
1
+ require 'rails/generators/erb/scaffold/scaffold_generator'
2
+ require "rails/generators/resource_helpers"
3
+
4
+ module Tailwindcss
5
+ module Generators
6
+ class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator
7
+ include Rails::Generators::ResourceHelpers
8
+
9
+ source_root File.expand_path("../templates", __FILE__)
10
+
11
+ argument :attributes, type: :array, default: [], banner: "field:type field:type"
12
+
13
+ def create_root_folder
14
+ empty_directory File.join("app/views", controller_file_path)
15
+ end
16
+
17
+ def copy_view_files
18
+ available_views.each do |view|
19
+ formats.each do |format|
20
+ filename = filename_with_extensions(view, format)
21
+ template filename, File.join("app/views", controller_file_path, filename)
22
+ end
23
+ end
24
+
25
+ template "partial.html.erb", File.join("app/views", controller_file_path, "_#{singular_table_name}.html.erb")
26
+ end
27
+
28
+ private
29
+ def available_views
30
+ %w(index edit show new _form)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,43 @@
1
+ <%%= form_with(model: <%= model_resource_name %>, class: "contents") do |form| %>
2
+ <%% if <%= singular_table_name %>.errors.any? %>
3
+ <div id="error_explanation" class="bg-red-50 text-red-500 px-3 py-2 font-medium rounded-lg mt-3">
4
+ <h2><%%= pluralize(<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
5
+
6
+ <ul>
7
+ <%% <%= singular_table_name %>.errors.each do |error| %>
8
+ <li><%%= error.full_message %></li>
9
+ <%% end %>
10
+ </ul>
11
+ </div>
12
+ <%% end %>
13
+
14
+ <% attributes.each do |attribute| -%>
15
+ <div class="my-5">
16
+ <% if attribute.password_digest? -%>
17
+ <%%= form.label :password %>
18
+ <%%= form.password_field :password %>
19
+ </div>
20
+
21
+ <div class="my-5">
22
+ <%%= form.label :password_confirmation %>
23
+ <%%= form.password_field :password_confirmation, class: "block shadow rounded-md border border-gray-200 outline-none px-3 py-2 mt-2 w-full" %>
24
+ <% elsif attribute.attachments? -%>
25
+ <%%= form.label :<%= attribute.column_name %> %>
26
+ <%%= 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" %>
27
+ <% else -%>
28
+ <%%= form.label :<%= attribute.column_name %> %>
29
+ <% if attribute.field_type == :text_area -%>
30
+ <%%= 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" %>
31
+ <% elsif attribute.field_type == :check_box -%>
32
+ <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "block mt-2 h-5 w-5" %>
33
+ <% else -%>
34
+ <%%= 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" %>
35
+ <% end -%>
36
+ <% end -%>
37
+ </div>
38
+
39
+ <% end -%>
40
+ <div class="inline">
41
+ <%%= form.submit class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %>
42
+ </div>
43
+ <%% end %>
@@ -0,0 +1,8 @@
1
+ <div class="mx-auto md:w-2/3 w-full">
2
+ <h1 class="font-bold text-4xl">Editing <%= human_name.downcase %></h1>
3
+
4
+ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
5
+
6
+ <%%= 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" %>
7
+ <%%= 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" %>
8
+ </div>
@@ -0,0 +1,14 @@
1
+ <div class="w-full">
2
+ <%% if notice.present? %>
3
+ <p class="py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-lg inline-block" id="notice"><%%= notice %></p>
4
+ <%% end %>
5
+
6
+ <div class="flex justify-between items-center">
7
+ <h1 class="text-lg font-bold text-4xl"><%= human_name.pluralize %></h1>
8
+ <%%= 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" %>
9
+ </div>
10
+
11
+ <div id="<%= plural_table_name %>" class="min-w-full">
12
+ <%%= render @<%= plural_table_name %> %>
13
+ </div>
14
+ </div>
@@ -0,0 +1,7 @@
1
+ <div class="mx-auto md:w-2/3 w-full">
2
+ <h1 class="text-lg font-bold text-4xl">New <%= human_name.downcase %></h1>
3
+
4
+ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
5
+
6
+ <%%= 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" %>
7
+ </div>
@@ -0,0 +1,22 @@
1
+ <div id="<%%= dom_id <%= singular_table_name %> %>">
2
+ <% attributes.reject(&:password_digest?).each do |attribute| -%>
3
+ <p class="my-5">
4
+ <strong class="block font-medium mb-1"><%= attribute.human_name %>:</strong>
5
+ <% if attribute.attachment? -%>
6
+ <%%= link_to <%= singular_table_name %>.<%= attribute.column_name %>.filename, <%= singular_table_name %>.<%= attribute.column_name %> if <%= singular_table_name %>.<%= attribute.column_name %>.attached? %>
7
+ <% elsif attribute.attachments? -%>
8
+ <%% <%= singular_table_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
9
+ <div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
10
+ <%% end %>
11
+ <% else -%>
12
+ <%%= <%= singular_table_name %>.<%= attribute.column_name %> %>
13
+ <% end -%>
14
+ </p>
15
+
16
+ <% end -%>
17
+ <%% if action_name != "show" %>
18
+ <%%= link_to "Show this <%= human_name.downcase %>", <%= singular_table_name %>, class: "rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
19
+ <%%= link_to 'Edit this <%= human_name.downcase %>', edit_<%= singular_table_name %>_path(<%= singular_table_name %>), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %>
20
+ <hr class="mt-6">
21
+ <%% end %>
22
+ </div>
@@ -0,0 +1,15 @@
1
+ <div class="mx-auto md:w-2/3 w-full flex">
2
+ <div class="mx-auto">
3
+ <%% if notice.present? %>
4
+ <p class="py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-lg inline-block" id="notice"><%%= notice %></p>
5
+ <%% end %>
6
+
7
+ <%%= render @<%= singular_table_name %> %>
8
+
9
+ <%%= 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" %>
10
+ <div class="inline-block ml-2">
11
+ <%%= button_to 'Destroy this <%= singular_table_name %>', <%= singular_table_name %>_path(@<%= singular_table_name %>), method: :delete, data: { confirm: "Are you sure you want to delete this <%= singular_table_name %>?" }, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>
12
+ </div>
13
+ <%%= 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" %>
14
+ </div>
15
+ </div>
@@ -0,0 +1,22 @@
1
+ APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb")
2
+
3
+ if APPLICATION_LAYOUT_PATH.exist?
4
+ say "Add Tailwindcss include tags and container element in application layout"
5
+ insert_into_file APPLICATION_LAYOUT_PATH.to_s, <<~ERB.indent(4), before: /^\s*<%= stylesheet_link_tag/
6
+ <%= stylesheet_link_tag "inter-font", "data-turbo-track": "reload" %>
7
+ <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %>
8
+ ERB
9
+ insert_into_file APPLICATION_LAYOUT_PATH.to_s, %( <main class="container mx-auto mt-28 px-5 flex">\n ), before: /^\s*<%= yield/
10
+ insert_into_file APPLICATION_LAYOUT_PATH.to_s, %(\n </main>), after: /^\s*<%= yield %>/
11
+ else
12
+ say "Default application.html.erb is missing!", :red
13
+ say %( Add <%= stylesheet_link_tag "inter-font", "data-turbo-track": "reload" %> and <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> within the <head> tag in your custom layout.)
14
+ end
15
+
16
+ # No longer included by default in Rails 7, but for earlier versions of Rails
17
+ if (scaffolds_css_path = Rails.root.join("app/assets/stylesheets/scaffolds.scss")).exist?
18
+ remove_file scaffolds_css_path
19
+ end
20
+
21
+ say "Turn on purging of unused css classes in production"
22
+ gsub_file Rails.root.join("config/environments/production.rb"), /^\s+#?\s+config.assets.css_compressor =.*$/, %( config.assets.css_compressor = :purger)
@@ -10,8 +10,8 @@ class Tailwindcss::Compressor
10
10
  end
11
11
 
12
12
  def initialize(options = {})
13
- @options = {
14
- files_with_class_names: Rails.root.glob("app/views/**/*.*") + Rails.root.glob("app/helpers/**/*.rb"),
13
+ @options = {
14
+ files_with_class_names: files_with_class_names,
15
15
  only_purge: %w[ tailwind ]
16
16
  }.merge(options).freeze
17
17
  end
@@ -23,4 +23,11 @@ class Tailwindcss::Compressor
23
23
  input[:data]
24
24
  end
25
25
  end
26
+
27
+ private
28
+ def files_with_class_names
29
+ Rails.root.glob("app/views/**/*.*") +
30
+ Rails.root.glob("app/helpers/**/*.rb") +
31
+ Rails.root.glob("app/javascript/**/*.js")
32
+ end
26
33
  end
@@ -1,3 +1,4 @@
1
+ require "rails"
1
2
  require "tailwindcss/compressor"
2
3
 
3
4
  module Tailwindcss
@@ -19,5 +20,9 @@ module Tailwindcss
19
20
  env.cache = ActiveSupport::Cache.lookup_store(:null_store)
20
21
  end if Rails.env.production?
21
22
  end
23
+
24
+ config.app_generators do |g|
25
+ g.template_engine :tailwindcss
26
+ end
22
27
  end
23
28
  end
@@ -1,8 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Tailwindcss::Purger
2
- CLASS_NAME_PATTERN = /([:A-Za-z0-9_-]+[\.\\\/:A-Za-z0-9_-]*)/
3
- OPENING_SELECTOR_PATTERN = /\..*\{/
4
- CLOSING_SELECTOR_PATTERN = /\s*\}/
5
- NEWLINE = "\n"
4
+ CLASS_NAME_PATTERN = /((?:[:A-Za-z0-9_-]+[\\\/:A-Za-z0-9_-]*[0-3][\\.]*5)|(?:[A-Za-z0-9_-]+[\\\/:A-Za-z0-9_-]*))/
5
+
6
+ CLASS_BREAK = /(?![-_a-z0-9\\])/i # `\b` for class selectors
7
+
8
+ COMMENT = /#{Regexp.escape "/*"}.*?#{Regexp.escape "*/"}/m
9
+ COMMENTS_AND_BLANK_LINES = /\A(?:^#{COMMENT}?[ \t]*(?:\n|\z)|[ \t]*#{COMMENT})+/
10
+
11
+ AT_RULE = /@[^{]+/
12
+ CLASSLESS_SELECTOR_GROUP = /[^.{]+/
13
+ CLASSLESS_BEGINNING_OF_BLOCK = /\A\s*(?:#{AT_RULE}|#{CLASSLESS_SELECTOR_GROUP})\{\n?/
14
+
15
+ SELECTOR_GROUP = /[^{]+/
16
+ BEGINNING_OF_BLOCK = /\A#{SELECTOR_GROUP}\{\n?/
17
+
18
+ PROPERTY_NAME = /[-_a-z0-9]+/i
19
+ PROPERTY_VALUE = /(?:[^;]|;\S)+/
20
+ PROPERTIES = /\A(?:\s*#{PROPERTY_NAME}:#{PROPERTY_VALUE};\n?)+/
21
+
22
+ END_OF_BLOCK = /\A\s*\}\n?/
6
23
 
7
24
  attr_reader :keep_these_class_names
8
25
 
@@ -12,11 +29,15 @@ class Tailwindcss::Purger
12
29
  end
13
30
 
14
31
  def extract_class_names(string)
15
- string.scan(CLASS_NAME_PATTERN).flatten.uniq.sort
32
+ string.scan(CLASS_NAME_PATTERN).flatten.uniq.sort!
16
33
  end
17
34
 
18
35
  def extract_class_names_from(files)
19
- Array(files).flat_map { |file| extract_class_names(file.read) }.uniq.sort
36
+ Array(files).flat_map { |file| extract_class_names(file.read) }.uniq.sort!
37
+ end
38
+
39
+ def escape_class_selector(class_name)
40
+ class_name.gsub(/\A\d|[^-_a-z0-9]/, '\\\\\0')
20
41
  end
21
42
  end
22
43
 
@@ -25,40 +46,79 @@ class Tailwindcss::Purger
25
46
  end
26
47
 
27
48
  def purge(input)
28
- inside_kept_selector = inside_ignored_selector = false
29
- output = []
30
-
31
- input.split(NEWLINE).each do |line|
32
- case
33
- when inside_kept_selector
34
- output << line
35
- inside_kept_selector = false if line =~ CLOSING_SELECTOR_PATTERN
36
- when inside_ignored_selector
37
- inside_ignored_selector = false if line =~ CLOSING_SELECTOR_PATTERN
38
- when line =~ OPENING_SELECTOR_PATTERN
39
- if keep_these_class_names.include? class_name_in(line)
40
- output << line
41
- inside_kept_selector = true
42
- else
43
- inside_ignored_selector = true
44
- end
45
- else
46
- output << line
47
- end
49
+ conveyor = Conveyor.new(input)
50
+
51
+ until conveyor.done?
52
+ conveyor.discard(COMMENTS_AND_BLANK_LINES) \
53
+ or conveyor.conditionally_keep(PROPERTIES) { conveyor.staged_output.last != "" } \
54
+ or conveyor.conditionally_keep(END_OF_BLOCK) { not conveyor.staged_output.pop } \
55
+ or conveyor.stage_output(CLASSLESS_BEGINNING_OF_BLOCK) \
56
+ or conveyor.stage_output(BEGINNING_OF_BLOCK) { |match| purge_beginning_of_block(match.to_s) } \
57
+ or raise "infinite loop"
48
58
  end
49
59
 
50
- separated_without_empty_lines(output)
60
+ conveyor.output
51
61
  end
52
62
 
53
63
  private
54
- def class_name_in(line)
55
- CLASS_NAME_PATTERN.match(line)[1]
56
- .remove("\\")
57
- .remove(/:(focus|hover)(-within)?/)
58
- .remove("::placeholder").remove("::-moz-placeholder").remove(":-ms-input-placeholder")
64
+ def keep_these_selectors_pattern
65
+ @keep_these_selectors_pattern ||= begin
66
+ escaped_classes = @keep_these_class_names.map { |name| Regexp.escape self.class.escape_class_selector(name) }
67
+ /(?:\A|,)[^.,{]*(?:[.](?:#{escaped_classes.join("|")})#{CLASS_BREAK}[^.,{]*)*(?=[,{])/
68
+ end
69
+ end
70
+
71
+ def purge_beginning_of_block(string)
72
+ purged = string.scan(keep_these_selectors_pattern).join
73
+ unless purged.empty?
74
+ purged.sub!(/\A,\s*/, "")
75
+ purged.rstrip!
76
+ purged << " {\n"
77
+ end
78
+ purged
59
79
  end
60
80
 
61
- def separated_without_empty_lines(output)
62
- output.reject { |line| line.strip.empty? }.join(NEWLINE)
81
+ class Conveyor
82
+ attr_reader :output, :staged_output
83
+
84
+ def initialize(input, output = +"")
85
+ @input = input
86
+ @output = output
87
+ @staged_output = []
88
+ end
89
+
90
+ def consume(pattern)
91
+ match = pattern.match(@input)
92
+ @input = match.post_match if match
93
+ match
94
+ end
95
+ alias :discard :consume
96
+
97
+ def stage_output(pattern)
98
+ if match = consume(pattern)
99
+ string = block_given? ? (yield match) : match.to_s
100
+ @staged_output << string
101
+ string
102
+ end
103
+ end
104
+
105
+ def keep(pattern)
106
+ if match = consume(pattern)
107
+ string = block_given? ? (yield match) : match.to_s
108
+ @output << @staged_output.shift until @staged_output.empty?
109
+ @output << string
110
+ string
111
+ end
112
+ end
113
+
114
+ def conditionally_keep(pattern)
115
+ keep(pattern) do |match|
116
+ (yield match) ? match.to_s : (break "")
117
+ end
118
+ end
119
+
120
+ def done?
121
+ @input.empty?
122
+ end
63
123
  end
64
124
  end
@@ -1,3 +1,3 @@
1
1
  module Tailwindcss
2
- VERSION = "0.3.3"
2
+ VERSION = "0.5.4"
3
3
  end
@@ -1,23 +1,7 @@
1
1
  namespace :tailwindcss do
2
2
  desc "Install Tailwind CSS into the app"
3
3
  task :install do
4
- if defined?(Webpacker::Engine)
5
- Rake::Task["tailwindcss:install:webpacker"].invoke
6
- else
7
- Rake::Task["tailwindcss:install:asset_pipeline"].invoke
8
- end
9
- end
10
-
11
- namespace :install do
12
- desc "Install Tailwind CSS with the asset pipeline"
13
- task :asset_pipeline do
14
- run_install_template "tailwindcss_with_asset_pipeline"
15
- end
16
-
17
- desc "Install Tailwind CSS with webpacker"
18
- task :webpacker do
19
- run_install_template "tailwindcss_with_webpacker"
20
- end
4
+ system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/tailwindcss.rb", __dir__)}"
21
5
  end
22
6
 
23
7
  desc "Show the list of class names being kept in Tailwind CSS"
@@ -31,10 +15,6 @@ namespace :tailwindcss do
31
15
  end
32
16
  end
33
17
 
34
- def run_install_template(path)
35
- system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/#{path}.rb", __dir__)}"
36
- end
37
-
38
18
  def default_files_with_class_names
39
19
  Rails.root.glob("app/views/**/*.*") + Rails.root.glob("app/helpers/**/*.rb")
40
20
  end
@@ -42,3 +22,4 @@ end
42
22
  def tailwind_css
43
23
  Pathname.new(__FILE__).join("../../../app/assets/stylesheets/tailwind.css").read
44
24
  end
25
+
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tailwindcss-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-06 00:00:00.000000000 Z
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: railties
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 6.0.0
27
- description:
27
+ description:
28
28
  email: david@loudthinking.com
29
29
  executables: []
30
30
  extensions: []
@@ -51,9 +51,19 @@ files:
51
51
  - app/assets/fonts/Inter-roman.vietnamese.var.woff2
52
52
  - app/assets/stylesheets/inter-font.css.erb
53
53
  - app/assets/stylesheets/tailwind.css
54
- - lib/install/stylesheets/application.scss
55
- - lib/install/tailwindcss_with_asset_pipeline.rb
56
- - lib/install/tailwindcss_with_webpacker.rb
54
+ - lib/generators/tailwindcss/controller/controller_generator.rb
55
+ - lib/generators/tailwindcss/controller/templates/view.html.erb.tt
56
+ - lib/generators/tailwindcss/mailer/mailer_generator.rb
57
+ - lib/generators/tailwindcss/mailer/templates/view.html.erb.tt
58
+ - lib/generators/tailwindcss/mailer/templates/view.text.erb.tt
59
+ - lib/generators/tailwindcss/scaffold/scaffold_generator.rb
60
+ - lib/generators/tailwindcss/scaffold/templates/_form.html.erb.tt
61
+ - lib/generators/tailwindcss/scaffold/templates/edit.html.erb.tt
62
+ - lib/generators/tailwindcss/scaffold/templates/index.html.erb.tt
63
+ - lib/generators/tailwindcss/scaffold/templates/new.html.erb.tt
64
+ - lib/generators/tailwindcss/scaffold/templates/partial.html.erb.tt
65
+ - lib/generators/tailwindcss/scaffold/templates/show.html.erb.tt
66
+ - lib/install/tailwindcss.rb
57
67
  - lib/tailwindcss-rails.rb
58
68
  - lib/tailwindcss/compressor.rb
59
69
  - lib/tailwindcss/engine.rb
@@ -65,7 +75,7 @@ licenses:
65
75
  - MIT
66
76
  metadata:
67
77
  homepage_uri: https://github.com/rails/tailwindcss-rails
68
- post_install_message:
78
+ post_install_message:
69
79
  rdoc_options: []
70
80
  require_paths:
71
81
  - lib
@@ -80,8 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
90
  - !ruby/object:Gem::Version
81
91
  version: '0'
82
92
  requirements: []
83
- rubygems_version: 3.1.2
84
- signing_key:
93
+ rubygems_version: 3.2.32
94
+ signing_key:
85
95
  specification_version: 4
86
96
  summary: Integrate Tailwind CSS with the asset pipeline in Rails.
87
97
  test_files: []
@@ -1,3 +0,0 @@
1
- @import "tailwindcss/base";
2
- @import "tailwindcss/components";
3
- @import "tailwindcss/utilities";
@@ -1,12 +0,0 @@
1
- APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb")
2
-
3
- if APPLICATION_LAYOUT_PATH.exist?
4
- say "Add Tailwindcss include tags in application layout"
5
- insert_into_file Rails.root.join("app/views/layouts/application.html.erb").to_s, %(\n <%= stylesheet_link_tag "inter-font" %>\n <%= stylesheet_link_tag "tailwind" %>), before: /^\s*<%= stylesheet_link_tag/
6
- else
7
- say "Default application.html.erb is missing!", :red
8
- say %( Add <%= stylesheet_link_tag "inter-font" %> and <%= stylesheet_link_tag "tailwind" %> within the <head> tag in your custom layout.)
9
- end
10
-
11
- say "Turn on purging of unused css classes in production"
12
- gsub_file Rails.root.join("config/environments/production.rb"), /^\s+#?\s+config.assets.css_compressor =.*$/, %( config.assets.css_compressor = :purger)
@@ -1,22 +0,0 @@
1
- WEBPACK_STYLESHEETS_PATH = "#{Webpacker.config.source_path}/stylesheets"
2
- APPLICATION_LAYOUT_PATH = Rails.root.join("app/views/layouts/application.html.erb")
3
-
4
- say "Installing Tailwind CSS"
5
- run "yarn add tailwindcss@npm:@tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9"
6
- insert_into_file "#{Webpacker.config.source_entry_path}/application.js", "\nimport \"stylesheets/application\"\n"
7
-
8
- say "Configuring Tailwind CSS"
9
- directory Pathname.new(__dir__).join("stylesheets"), Webpacker.config.source_path.join("stylesheets")
10
- Dir.chdir(WEBPACK_STYLESHEETS_PATH) { run "npx tailwindcss init" }
11
-
12
- insert_into_file "postcss.config.js", "require('tailwindcss')(\"./app/javascript/stylesheets/tailwind.config.js\"),\n ",
13
- before: "require('postcss-import')"
14
-
15
-
16
- if APPLICATION_LAYOUT_PATH.exist?
17
- say "Add Tailwindcss include tags in application layout"
18
- insert_into_file Rails.root.join("app/views/layouts/application.html.erb").to_s, %(\n <%= stylesheet_pack_tag "application", "data-turbo-track": "reload" %>), before: /\s*<\/head>/
19
- else
20
- say "Default application.html.erb is missing!", :red
21
- say %( Add <%= stylesheet_pack_tag "application", "data-turbo-track": "reload" %> within the <head> tag in your custom layout.)
22
- end