<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andy Peters</title>
    <description>The latest articles on DEV Community by Andy Peters (@andypeters).</description>
    <link>https://dev.to/andypeters</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F77130%2F0b118baf-d64a-4b97-ab61-b28ead55a430.png</url>
      <title>DEV Community: Andy Peters</title>
      <link>https://dev.to/andypeters</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andypeters"/>
    <language>en</language>
    <item>
      <title>Up and running on Render.com with a Ruby on Rails app and a static site </title>
      <dc:creator>Andy Peters</dc:creator>
      <pubDate>Fri, 02 Apr 2021 13:05:50 +0000</pubDate>
      <link>https://dev.to/andypeters/up-and-running-on-render-com-with-my-rails-app-and-a-static-site-9jj</link>
      <guid>https://dev.to/andypeters/up-and-running-on-render-com-with-my-rails-app-and-a-static-site-9jj</guid>
      <description>&lt;p&gt;I have a Ruby on Rails app and static site to support my SaaS app both now hosted on &lt;a href="https://render.com"&gt;Render.com&lt;/a&gt;.  Good things have been said about Render and now seemed like a good time to compare the cost and health of my app to running on Heroku.  &lt;/p&gt;

&lt;p&gt;As I dove into hosting there here are some things I noticed right away when coming from Heroku:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No "App" and no "Dynos".  There are "shared environments" and, everything is a "service".&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;heroku run rails c&lt;/code&gt; from my terminal.&lt;/li&gt;
&lt;li&gt;Sometimes you use &lt;code&gt;render.yaml&lt;/code&gt; I guess.&lt;/li&gt;
&lt;li&gt;Dashboard is barebones, but who cares I am barely using it after setup.&lt;/li&gt;
&lt;li&gt;Daily cost breakdown was neat.&lt;/li&gt;
&lt;li&gt;Slack notifications were handy.&lt;/li&gt;
&lt;li&gt;Scale services up, not down.&lt;/li&gt;
&lt;li&gt;Basic metrics per service is good enough for now.&lt;/li&gt;
&lt;li&gt;Use the LogDNA add-on.&lt;/li&gt;
&lt;li&gt;yay http/2 support!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I spent about an hour getting everything running 💯; including external DNS configurations. For the most part I followed &lt;a href="https://render.com/docs"&gt;Render's docs&lt;/a&gt; and went the manual setup direction.  I went the manual route so I could see everything stand up on its own. &lt;/p&gt;

&lt;p&gt;If I remembered everything, this is how I got it up and running...&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Static site
&lt;/h1&gt;

&lt;p&gt;Cost:  $0/month up until 100GB, then $0.10/GB.  &lt;/p&gt;

&lt;p&gt;Easy to setup.  Here's my setup: I have a separate rails repo for the static site and use &lt;a href="https://www.bridgetownrb.com"&gt;Bridgetown&lt;/a&gt; to generate it.  Setup is easy and &lt;a href="https://render.com/docs/deploy-jekyll"&gt;I followed step one and two of the Jekyll setup docs&lt;/a&gt;.  I'm sure you can figure it out for whatever static site generator you are using; they also have docs for a few others.  Here's the steps I did to get it running:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Link to its GitHub repository.&lt;/li&gt;
&lt;li&gt;Build command is &lt;code&gt;yarn deploy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Publish directory was &lt;code&gt;./output&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Point my DNS to it.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Speed?  Here's my unscientific thoughts on speed: &lt;a href="https://twitter.com/andypeters/status/1375158822218645514"&gt;It's now quite a bit faster than my free Netlify site was.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neat to have them all on platform too.&lt;/p&gt;

&lt;h1&gt;
  
  
  2.  health-check gem
&lt;/h1&gt;

&lt;p&gt;I used the &lt;a href="https://github.com/ianheggie/health_check"&gt;health-check&lt;/a&gt; rubygem to ensure the Rails app and its services were up and running correctly.  It was handy to me and will be a good uptime / health check later in the future.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;This ruby gem is not a requirement by any means&lt;/em&gt;. Maybe you already know about it or have something setup.  Another bonus, the Rails app service on Render can have a "Health Check" endpoint.  Neat.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Redis
&lt;/h1&gt;

&lt;p&gt;Cost:  $7/month Starter Plan 512MB with a shared CPU.  &lt;/p&gt;

&lt;p&gt;I used the “Deploy to Render” option here; pretty straight forward.  &lt;/p&gt;

&lt;p&gt;Cool that redis isolated to your environment and not publicly available.  The redis service has basic metrics on RAM, CPU usage in the dashboard.  Hopefully this is enough redis for my needs.  I know I can always run another server as well. &lt;/p&gt;

&lt;p&gt;Keep the redis URL handy for your Rails app.  It'll be something like:  redis://redis-whateverthenameis:10000 &lt;/p&gt;

&lt;p&gt;&lt;em&gt;FYI: They have plans on the roadmap for a &lt;a href="https://feedback.render.com/features/p/managed-redis"&gt;managed Redis&lt;/a&gt; more like Heroku I guess.&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Create Database
&lt;/h1&gt;

&lt;p&gt;Cost:  Standard $20/month (1GB RAM, 1 CPU, 16GB SSD)&lt;/p&gt;

&lt;p&gt;I went with the next up database plan for my app. There is a perfectly fine $7/month plan that I could have used and upgraded from, but I wanted to start here.&lt;/p&gt;

&lt;p&gt;PostgreSQL was also “Click to Deploy”.  Just pick the size of server.  Remember you can size up, but no downsizing on Render. The basic db needs are covered:  Nightly backups and basic metrics.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What you name the Database Service is what the database will be created under and the prefix of the username will be.&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;They are Postgresql version 11 and I noticed their &lt;a href="https://feedback.render.com/features/p/postgres-12"&gt;roadmap indicates version 12&lt;/a&gt; coming soon&lt;/em&gt;. This isn't a problem for me.&lt;/p&gt;

&lt;p&gt;NOTE: The &lt;code&gt;DATABASE_URL&lt;/code&gt; was automagically setup when I created the rails app in step 6.  I did move that to a shared environment so the worker could access it; which I setup next.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Create your Environment Group
&lt;/h1&gt;

&lt;p&gt;Perhaps doing this before my Redis step is smart.  However, I didn't do this until after the database setup and I'm just walking through the steps I did best I can remember.&lt;/p&gt;

&lt;p&gt;A environment group allows you to share environment variables and &lt;em&gt;secret files&lt;/em&gt; across your Rails app and its workers.  I have &lt;code&gt;DATABASE_URL&lt;/code&gt;, &lt;code&gt;RAILS_MASTER_KEY&lt;/code&gt;, &lt;code&gt;SECRET_KEY_BASE&lt;/code&gt;, &lt;code&gt;REDIS_URL&lt;/code&gt; etc in there.  I only have one shared environment and its called “production”.  &lt;/p&gt;

&lt;p&gt;You don't &lt;em&gt;need&lt;/em&gt; an Environment Group.  It is handy to share the environment variables between the worker and web service though.  &lt;/p&gt;

&lt;h1&gt;
  
  
  6. Rails Application
&lt;/h1&gt;

&lt;p&gt;Plan:  Starter+ $15/month &lt;/p&gt;

&lt;p&gt;The Deploy Rails documentation was full of stuff for creating an app.  Skip past all that to the &lt;a href="https://render.com/docs/deploy-rails#go-production-ready"&gt;"Go Production Ready"&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;I did all the app changes from the doc.  I now have a &lt;code&gt;render.yml&lt;/code&gt; and a &lt;code&gt;bin/build-render.sh&lt;/code&gt; and the changes to &lt;code&gt;puma.rb&lt;/code&gt; in my project and all of that was from the docs.  &lt;/p&gt;

&lt;p&gt;The deployment failed a few times until I had all my environment  variables setup. I forgot a few, oops.&lt;/p&gt;

&lt;p&gt;Be sure to linked to your configured Shared Environment if you have it.&lt;/p&gt;

&lt;p&gt;Once it deployed, I set configured the custom domain to it.  When you do that and the DNS is verified it'll create and manage your SSL certificate. &lt;/p&gt;

&lt;h1&gt;
  
  
  7. Background worker service (Sidekiq)
&lt;/h1&gt;

&lt;p&gt;Plan:  Starter+ $15/month&lt;/p&gt;

&lt;p&gt;In Heroku you'd have a "Worker Dyno".  Here you have a Worker Service.  I over simplify a worker service to be a “web service” that is not publicly available. Its linked to the same repo, deploys at the same time but no public address and the start command is different.  I set the start command to &lt;code&gt;bundle exec sidekiq -e production&lt;/code&gt;; from the old &lt;code&gt;Procfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Be sure to linked to your configured Shared Environment if you have it..&lt;/p&gt;

&lt;h1&gt;
  
  
  8. 🤞🏻
&lt;/h1&gt;

&lt;p&gt;Now when I look at the dashboard I have a database, a web service, a static site, a redis service and a worker service.&lt;/p&gt;

&lt;p&gt;Hopefully I didn't forget anything and this was helpful for anyone with a Rails app wanting to get up and running on Render.  &lt;/p&gt;

&lt;p&gt;If you are looking for a Render vs Heroku comparison there are a ton available.  Here is Render's &lt;a href="https://render.com/render-vs-heroku-comparison"&gt;Render vs Heroku comparison&lt;/a&gt;.  However, it was hard for me to not compare the cost savings from Heroku.  Before I was on a pretty typical “SaaS starter package” at $150/monthly.  There are obvious differences with Render, but I'm pretty pumped that I'm now just roughly $57/month.  Where Render lacks in &lt;em&gt;bells and whistles&lt;/em&gt;, it makes up in cost savings, a great platform and the team hustle (all very active on Twitter especially the founder and elsewhere on the internet and in their forums). &lt;/p&gt;

&lt;p&gt;Heroku might be expensive but its very truth worthy.  I'm hoping Render earns the same trust over time.  They sure seem to be earning many others.  While they host host my app and static site, I'm hoping they'll earn mine.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>hosting</category>
      <category>devops</category>
    </item>
    <item>
      <title>Setup Bridgetown to use TailwindCSS</title>
      <dc:creator>Andy Peters</dc:creator>
      <pubDate>Fri, 09 Oct 2020 19:40:02 +0000</pubDate>
      <link>https://dev.to/andypeters/setup-bridgetown-to-use-tailwindcss-7nd</link>
      <guid>https://dev.to/andypeters/setup-bridgetown-to-use-tailwindcss-7nd</guid>
      <description>&lt;p&gt;I've been using the Ruby powered static site generator:  &lt;a href="https://bridgetownrb.com" rel="noopener noreferrer"&gt;Bridgetown&lt;/a&gt; for a lot of things lately.  If you don't already know, here is the Bridgetown tagline:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Webpack-aware, Ruby-powered static site generator &lt;br&gt;
for the modern Jamstack era.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm a Ruby on Rails fan and, &lt;a href="https://tailwindcss.com" rel="noopener noreferrer"&gt;TailwindCSS&lt;/a&gt; believer and I'm all in on &lt;a href="https://tailwindui.com" rel="noopener noreferrer"&gt;TailwindUI&lt;/a&gt;.  So naturally, I wanted to use this stack to build my site.  &lt;a href="https://dev.to/andrewmcodes"&gt;Andrew Mason&lt;/a&gt; had a great writeup to setup Bridgetown with TailwindCSS, but for the life of me I couldn't get TailwindCSS to build with those instructions.  After getting things to work on my end, I think the difference was in the PostCSS and/or the &lt;code&gt;index.scss&lt;/code&gt; file but I'm still not 100%.  🤷🏻‍♂️ Here is his detailed write up:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/andrewmcodes" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F131437%2F1e22c4f2-df3d-41e6-8970-c4d9a63f15c2.png" alt="andrewmcodes"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/andrewmcodes/build-and-deploy-a-static-site-with-ruby-bridgetown-tailwindcss-and-netlify-3934" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Build and deploy a static site with Ruby, Bridgetown, TailwindCSS, and Netlify&lt;/h2&gt;
      &lt;h3&gt;Andrew Mason ・ May 7 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ruby&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bridgetown&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Since everything is working just fine today, I thought I'd write up  my steps.  This is assuming you have a Bridgetown site created and ready to go:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note this is with &lt;a href="https://github.com/bridgetownrb/bridgetown/releases/tag/v0.17.1" rel="noopener noreferrer"&gt;Bridgetown 0.17.1&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. yarn add ...:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yarn add -D postcss autoprefixer postcss-import postcss-loader tailwindcss&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It's my understanding that &lt;code&gt;postcss&lt;/code&gt; is a dependency of &lt;code&gt;postcss-import&lt;/code&gt; and &lt;code&gt;postcss-loader&lt;/code&gt;. So I didn't need to call it out here, but I did anyway for verbosity when I was trying to get things working. &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create &lt;code&gt;tailwind.config.js&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Easiest way to do this:  &lt;code&gt;npx tailwindcss init&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;future&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// removeDeprecatedGapUtilities: true,&lt;/span&gt;
    &lt;span class="c1"&gt;// purgeLayersByDefault: true,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;purge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Create &lt;code&gt;postcss.config.js&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Here is a copy of my &lt;code&gt;postcss.config.js&lt;/code&gt; file.  It was actually taken from an old Jekyll site doing the same thing.  Seems to work.  🤷🏻‍♂️&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;purgecss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@fullhuman/postcss-purgecss&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)({&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/**/*.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/**/*.md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/**/*.liquid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./frontend/**/*.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/_data/**/*.yml&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="na"&gt;defaultExtractor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[\w&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;.:&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;!:&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;postcss-import&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;frontend/styles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tailwindcss&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;autoprefixer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;purgecss&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4. Update &lt;code&gt;webpack.config.js&lt;/code&gt; to use postcss.
&lt;/h3&gt;

&lt;p&gt;There is only one change I did and that was to add &lt;code&gt;"postcss-loader"&lt;/code&gt; on line 56.  Here is a full copy of the file for reference:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MiniCssExtractPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mini-css-extract-plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ManifestPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webpack-manifest-plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./frontend/javascript/index.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;devtool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;source-map&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// Set some or all of these to true if you want more verbose logging:&lt;/span&gt;
  &lt;span class="na"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;builtAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_bridgetown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;static&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;all.[contenthash].js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.jsx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MiniCssExtractPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../css/all.[contenthash].css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManifestPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.bridgetown-webpack&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;manifest.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;js|jsx&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;babel-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@babel/preset-env&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@babel/plugin-proposal-decorators&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;legacy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@babel/plugin-proposal-class-properties&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
              &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@babel/plugin-transform-runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="na"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
              &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;s&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;ac&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|c&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;ss$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="nx"&gt;MiniCssExtractPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;css-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;postcss-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sass-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;sassOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;includePaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                  &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/_components&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
              &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;woff2&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;$|&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;ttf$|&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;eot$|&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;svg$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../fonts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../fonts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Update the main stylesheet
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;frontend/styles/index.scss&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tailwindcss/base"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tailwindcss/components"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tailwindcss/utilities"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;. I also had used the &lt;code&gt;@tailwind&lt;/code&gt; in the config and it worked fine.  I switched to the &lt;code&gt;@import&lt;/code&gt; as I think that is the correct way when working with &lt;code&gt;postcss-import&lt;/code&gt; (as detailed on the Tailwind site).  &lt;/p&gt;

&lt;p&gt;More &lt;a href="https://tailwindcss.com/docs/installation#add-tailwind-to-your-css" rel="noopener noreferrer"&gt;details here&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Start the server
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yarn start&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;🚀&lt;/p&gt;
&lt;h3&gt;
  
  
  6.5:  If you are using TailwindUI, then simply follow the instructions on the site documentation.  You'll just be adding the &lt;code&gt;tailwindui&lt;/code&gt; plugin as the instructions indicate.
&lt;/h3&gt;

&lt;p&gt;That's it.  Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Oh, just incase here is Bridgetown on Github:&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bridgetownrb" rel="noopener noreferrer"&gt;
        bridgetownrb
      &lt;/a&gt; / &lt;a href="https://github.com/bridgetownrb/bridgetown" rel="noopener noreferrer"&gt;
        bridgetown
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A next-generation progressive site generator &amp;amp; fullstack framework, powered by Ruby
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://www.bridgetownrb.com" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/529b0a0ca5d7b82defd82bdf68b3a8301484ffec95b68e96bdf8701dbc080670/68747470733a2f2f7777772e627269646765746f776e72622e636f6d2f696d616765732f627269646765746f776e2d6c6f676f2d747769747465722d636172642e6a70673f763d31" alt="Bridgetown" width="750"&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  &lt;a href="https://www.bridgetownrb.com" rel="nofollow noopener noreferrer"&gt;Bridgetown&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Bridgetown is a next-generation, progressive site generator &amp;amp; fullstack framework, powered by Ruby. Bridgetown takes your local content and external data loaded from APIs; renders templates in Markdown, ERB, and many other formats; automatically compiles frontend assets via esbuild; and exports a complete website ready to be served by fast CDNs like Render or traditional web servers. Bridgetown also integrates closely with Roda for fullstack, dynamic web application functionality—but only when and where you need it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bridgetownrb/bridgetown/actions?query=workflow%3Abuild+branch%3Amain" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/bridgetownrb/bridgetown/workflows/build/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://rubygems.org/gems/bridgetown" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b8bc9b17bbaccda4dca28c42929e7641834f5a9f14b4dd294042ddf8aa71b998/68747470733a2f2f696d672e736869656c64732e696f2f67656d2f762f627269646765746f776e2e737667" alt="Gem Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bridgetownrb/bridgetownLICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/55aeb2e7c49b990815aa8944009554a98cba61e4347f7d41a02440cc200ec965/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d79656c6c6f77677265656e2e737667" alt="Licensed MIT"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/4E6hktQGz4" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4d38a402765380778f95f0bcd976a1ec20b1fe9e1ce708781cc663ca8cfe746c/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3731313233363530333439333134383733333f636f6c6f723d666f72657374677265656e266c6f676f3d646973636f7264" alt="Join the Discord Chat"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bridgetownrb/bridgetown/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/11951903d3f6c4432a5b891d70f22b7065d9d4fefcc19e9af42542a04cb6217e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d626c75652e737667" alt="PRs welcome!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Special Thanks to Our GitHub Sponsors! 🙏 🎉&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Say howdy 👋 to our blossoming list of current and past sponsors of Bridgetown on GitHub
&lt;a href="https://github.com/sponsors/jaredcwhite" rel="noopener noreferrer"&gt;You too can join this list and sponsor open source "alt" Ruby development.&lt;/a&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/svoop?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fsvoop%3Fs%3D256" alt="svoop" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/rahoulb?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Frahoulb%3Fs%3D256" alt="rahoulb" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/joshuap?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fjoshuap%3Fs%3D256" alt="joshuap" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/skvk?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fskvk%3Fs%3D256" alt="skvk" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/monfresh?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fmonfresh%3Fs%3D256" alt="monfresh" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/svoop" rel="noopener noreferrer"&gt;@svoop&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/rahoulb" rel="noopener noreferrer"&gt;@rahoulb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joshuap" rel="noopener noreferrer"&gt;@joshuap&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/skvk" rel="noopener noreferrer"&gt;@skvk&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/monfresh" rel="noopener noreferrer"&gt;@monfresh&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://bitcetera.com/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://theartandscienceofruby.com/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://joshuawood.net/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a href="https://www.moncefbelyamani.com/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/renuo?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Frenuo%3Fs%3D256" alt="renuo" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/subsevenx?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fsubsevenx%3Fs%3D256" alt="subsevenx" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/collindonnell?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fcollindonnell%3Fs%3D256" alt="collindonnell" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/nbkkb7x?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fnbkkb7x%3Fs%3D256" alt="nbkkb7x" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/bpo?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fbpo%3Fs%3D256" alt="bpo" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/renuo" rel="noopener noreferrer"&gt;@renuo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/subsevenx" rel="noopener noreferrer"&gt;@subsevenx&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/collindonnell" rel="noopener noreferrer"&gt;@collindonnell&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/nbkkb7x" rel="noopener noreferrer"&gt;@nbkkb7x&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/bpo" rel="noopener noreferrer"&gt;@bpo&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.renuo.ch/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a href="http://collindonnell.com/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://somethingkiller.com" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://brian.orourke.io" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/DRBragg?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2FDRBragg%3Fs%3D256" alt="DRBragg" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/andrewmcodes?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fandrewmcodes%3Fs%3D256" alt="andrewmcodes" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/karloscarweber?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fkarloscarweber%3Fs%3D256" alt="karloscarweber" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/swilgosz?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fswilgosz%3Fs%3D256" alt="swilgosz" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/ttilberg?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fttilberg%3Fs%3D256" alt="ttilberg" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/DRBragg" rel="noopener noreferrer"&gt;@DRBragg&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/andrewmcodes" rel="noopener noreferrer"&gt;@andrewmcodes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/karloscarweber" rel="noopener noreferrer"&gt;@karloscarweber&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/swilgosz" rel="noopener noreferrer"&gt;@swilgosz&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ttilberg" rel="noopener noreferrer"&gt;@ttilberg&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.drbragg.dev" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://andrewm.codes" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://kow.fm/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hanamimastery.com/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.timtilberg.com" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/Brem-LLC?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2FBrem-LLC%3Fs%3D256" alt="Brem-LLC" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/posiczko?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fposiczko%3Fs%3D256" alt="posiczko" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/fuzzygroup?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Ffuzzygroup%3Fs%3D256" alt="fuzzygroup" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/maxveldink?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fmaxveldink%3Fs%3D256" alt="maxveldink" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/oleingemann?s=256"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Foleingemann%3Fs%3D256" alt="oleingemann" width="128"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/Brem-LLC" rel="noopener noreferrer"&gt;@Brem-LLC&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/posiczko" rel="noopener noreferrer"&gt;@posiczko&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/fuzzygroup" rel="noopener noreferrer"&gt;@fuzzygroup&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/maxveldink" rel="noopener noreferrer"&gt;@maxveldink&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/oleingemann" rel="noopener noreferrer"&gt;@oleingemann&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://brem.io" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tetrapyloctomy.org" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://fuzzyblog.io/blog/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bridgetownrb/bridgetown" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>bridgetown</category>
      <category>jamstack</category>
      <category>tailwindcss</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Creating a modal dialog in Tailwind CSS and Alpine.js</title>
      <dc:creator>Andy Peters</dc:creator>
      <pubDate>Tue, 17 Mar 2020 00:15:10 +0000</pubDate>
      <link>https://dev.to/andypeters/creating-a-modal-dialog-in-tailwindcss-and-alpinejs-bc5</link>
      <guid>https://dev.to/andypeters/creating-a-modal-dialog-in-tailwindcss-and-alpinejs-bc5</guid>
      <description>&lt;p&gt;Recently I converted an application I'm working on from a Bootstrap 4 theme to &lt;a href="https://tailwindcss.com"&gt;Tailwind CSS&lt;/a&gt; and &lt;a href="https://github.com/alpinejs/alpine/"&gt;Alpine.js&lt;/a&gt;.  During that process, it was not immediately obvious (to me) on how to open a full screen modal window dialog clicking of a button; and close it again.  At the time I didn't get far searching Google, Dev.to or GitHub.  After figuring it out, I thought it warranted a short write up.  I'm assuming you are all setup with TailwindCSS or AlpineJS; here we go...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Versions:  At the time of this article, this was all done using &lt;a href="https://github.com/tailwindcss/tailwindcss/releases/tag/v1.2.0"&gt;Tailwind CSS 1.2&lt;/a&gt; and &lt;a href="https://github.com/alpinejs/alpine/releases/tag/v2.2.0"&gt;Alpine.js 2.2.0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reminder, it is not TailwindCSS's responsibility to provide a way to create a modal window.  Tailwind is the CSS framework.  &lt;a href="https://github.com/alpinejs/alpinejs"&gt;Alpine.js&lt;/a&gt; is just commonly referenced in the Tailwind community in creating a modal, dropdowns, as well as other interactions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/alpinejs/alpinejs"&gt;Alpine.js&lt;/a&gt; didn't give me much to start with in the &lt;code&gt;README.md&lt;/code&gt;.  For example currently it only shows a dropdown: &lt;a href="https://github.com/alpinejs/alpine#use"&gt;AlpineJS Use dropdown/modal&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  I needed these things to get everything work:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt; Enclosing &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with &lt;code&gt;x-data="{ open: false }"&lt;/code&gt; tag.  This &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; will enclose the next few tags.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; with the &lt;code&gt;x-show="open"&lt;/code&gt; tag.  The button can be styled however you want of course.
&lt;/li&gt;
&lt;li&gt; Dialog &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with &lt;code&gt;x-show="open"&lt;/code&gt; tag.  I also styled this &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; for the darker background when the modal was displayed:  &lt;code&gt;style="background-color: rgba(0,0,0,.5);"&lt;/code&gt;.  I couldn't get another class or another &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; inside to do this.  🤷

&lt;ul&gt;
&lt;li&gt; &lt;em&gt;Maybe you want this?&lt;/em&gt;:  On your dialog &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; add &lt;code&gt;@click.away="open = false"&lt;/code&gt; so when your user clicks off screen it'll go away.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; Enclosed in the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; dialog, you'll need a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; tag with &lt;code&gt;@click="open = false"&lt;/code&gt;, to ensure it'll close the modal when clicked.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;BONUS&lt;/strong&gt;:  &lt;a href="https://github.com/alpinejs/alpine#x-transition"&gt;Animations&lt;/a&gt;.  Some excellent animations to really make the opening and closing of your modal &lt;em&gt;pop&lt;/em&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gelA_vPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pkfcdpl6157u4zkglb83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gelA_vPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pkfcdpl6157u4zkglb83.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Copy / paste-able example:
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;I have all of this inside the main container of the app layout.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="c"&gt;&amp;lt;!-- modal div --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-6"&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"{ open: false }"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="c"&gt;&amp;lt;!-- Button (blue), duh! --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"px-4 py-2 text-white bg-blue-500 rounded select-none no-outline focus:shadow-outline"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"open = true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Open Modal&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

      &lt;span class="c"&gt;&amp;lt;!-- Dialog (full screen) --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"absolute top-0 left-0 flex items-center justify-center w-full h-full"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background-color: rgba(0,0,0,.5);"&lt;/span&gt; &lt;span class="na"&gt;x-show=&lt;/span&gt;&lt;span class="s"&gt;"open"&lt;/span&gt;  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="c"&gt;&amp;lt;!-- A basic modal dialog with title, body and one button to close --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"h-auto p-4 mx-2 text-left bg-white rounded shadow-xl md:max-w-xl md:p-6 lg:p-8 md:mx-0"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click.away=&lt;/span&gt;&lt;span class="s"&gt;"open = false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg font-medium leading-6 text-gray-900"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              Modal Title
            &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-sm leading-5 text-gray-500"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Adipisci quasi doloribus. Veniam veritatis dignissimos. Quis maiores ea. Et nulla sunt.
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

          &lt;span class="c"&gt;&amp;lt;!-- One big close button.  ---&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-5 sm:mt-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex w-full rounded-md shadow-sm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"open = false"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"inline-flex justify-center w-full px-4 py-2 text-white bg-blue-500 rounded hover:bg-blue-700"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Close this modal!
              &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tailwindcss</category>
      <category>alpinejs</category>
    </item>
  </channel>
</rss>
