Tailwind CSS for Symfony!
This bundle makes it easy to use Tailwind CSS with Symfony's AssetMapper Component (no Node.js required!).
- Automatically downloads the correct standalone Tailwind CSS binary;
- Adds a
tailwind:build
command to build & watch for changes; - Transparently swaps in the compiled CSS.
Note
Want to use Tailwind CSS with WebpackEncore instead? Check out the Tailwind + Symfony Docs.
Installation
Install the bundle & initialize your app with two commands:
1 2
$ composer require symfonycasts/tailwind-bundle
$ php bin/console tailwind:init
Done! This will create a tailwind.config.js
file and make sure your
assets/styles/app.css
contains the Tailwind directives.
Usage
To use the Tailwind CSS file, start by including the input file
(assets/styles/app.css
by default) in base.html.twig
. It's quite likely
you already have this:
1 2 3 4 5
{# templates/base.html.twig #}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('styles/app.css') }}">
{% endblock %}
The bundle works by automatically swapping out the contents of styles/app.css
with the compiled CSS. For this to work, you need to run the tailwind:build
command:
1
$ php bin/console tailwind:build --watch
That's it! This will watch for changes to your assets/styles/app.css
file
and automatically recompile it when needed. If you refresh the page, the
final app.css
file will already contain the compiled CSS.
Watch mode in Docker with Windows host
If you work on Windows and your app is running in a Docker container, and you
are having trouble with the --watch
option, you can try running the tailwind:build
command with --poll
option.
1
$ php bin/console tailwind:build --watch --poll
Symfony CLI
If using the Symfony CLI, you can add build
command as a worker
to be started whenever you run symfony server:start
:
1 2 3 4 5 6
# .symfony.local.yaml
workers:
# ...
tailwind:
cmd: ['symfony', 'console', 'tailwind:build', '--watch']
Tip
If running symfony server:start
as a daemon, you can run
symfony server:log
to tail the output of the worker.
How Does It Work?
The first time you run one of the Tailwind commands, the bundle will
download the correct Tailwind binary for your system into a var/tailwind/
directory.
When you run tailwind:build
, that binary is used to compile
each CSS file into a var/tailwind/<filename>.built.css
file.
Finally, when the contents of the CSS file is requested, the bundle swaps the
contents of that file with the contents of var/tailwind/<filename>.built.css
.
E.g.: A request for assets/styles/app.css
will be replaced by var/tailwind/app.built.css
.
Nice!
Deploying
When you deploy, run the tailwind:build
command before the asset-map:compile
command so the built file is available:
1 2
$ php bin/console tailwind:build --minify
$ php bin/console asset-map:compile
Form Theming
To make your Symfony forms look nice with Tailwind, you'll need a dedicated form theme. Check out https://github.com/tales-from-a-dev/flowbite-bundle for a helpful bundle that provides that!
Tailwind Plugins
The Tailwind binary that the bundle downloads already contains the "Official Plugins" - e.g. typography.
This means you can use those simply by adding the line to the plugins
key in
tailwind.config.js
- e.g. require('@tailwindcss/typography')
.
For other plugins - like Flowbite Datepicker,
you will need to follow that package's documentation to require the package
with npm
:
1
$ npm install flowbite
Then add it to tailwind.config.js
:
1 2 3 4 5
module.exports = {
plugins: [
require('flowbite/plugin')
]
}
Configuration
To see the full config from this bundle, run:
1
$ php bin/console config:dump symfonycasts_tailwind
The main option is input_css
option, which defaults to assets/styles/app.css
.
This represents the "source" Tailwind files (the one that contains the @tailwind
directives):
1 2 3
# config/packages/symfonycasts_tailwind.yaml
symfonycasts_tailwind:
input_css: 'assets/styles/other.css'
It's possible to use multiple input files by providing an array:
1 2 3 4 5
# config/packages/symfonycasts_tailwind.yaml
symfonycasts_tailwind:
input_css:
- 'assets/styles/other.css'
- 'assets/styles/another.css'
Another option is the config_file
option, which defaults to tailwind.config.js
.
This represents the Tailwind configuration file:
1 2 3
# config/packages/symfonycasts_tailwind.yaml
symfonycasts_tailwind:
config_file: 'tailwind.config.js'
If you include any other files containing CSS classes that are located outside of
the default directories, for example, in the vendor/
directory like the
Tailwind CSS form theme
from the symfony/twig-bridge
package, then after changing your Twig configuration:
1 2 3 4
# config/packages/twig.yaml
twig:
form_themes:
- 'tailwind_2_layout.html.twig'
You will have to add them to your tailwind.config.js
file:
1 2 3 4 5 6 7 8
# tailwind.config.js
module.exports = {
content: [
"./assets/**/*.js",
"./templates/**/*.html.twig",
+ "./vendor/symfony/twig-bridge/Resources/views/Form/*.html.twig",
],
}
Using a Different Binary
The standalone Tailwind binary comes with first-party plugins. However, if you want to add extra plugins, you may choose to install Tailwind via npm instead:
1
$ npm add tailwindcss
To instruct the bundle to use that binary instead, set the binary
option:
1 2 3
# config/packages/symfonycasts_tailwind.yaml
symfonycasts_tailwind:
binary: 'node_modules/.bin/tailwindcss'
Using a Different Binary Version
By default, the latest standalone Tailwind binary gets downloaded. However,
if you want to use a different version, you can specify the version to use,
set binary_version
option:
1 2 3
# config/packages/symfonycasts_tailwind.yaml
symfonycasts_tailwind:
binary_version: 'v3.3.0'