Hotwire Native CSS and TailwindCSS variants (conditionals)
When building Hotwire Native apps, often you will want to have different CSS for native and desktop apps.
We can achieve it by addin custom variants like non-turbo-native:
& turbo-native:
.
<div class="non-turbo-native:hidden">
Visible only on Native
</div>
<div class="turbo-native:hidden">
Visible only on Desktop
</div>
CSS #
/* application.css */
body.turbo-native .turbo-native:hidden {
display: none;
}
<body class="<%%= "turbo-native" if turbo_native_app? %>">
<h1 class="turbo-native:hidden">Hello, world!</h1>
Source: masilotti.com
Tailwind #
To enable this, update your tailwind config file:
# config/tailwind.config.js
const defaultTheme = require('tailwindcss/defaultTheme')
+const plugin = require('tailwindcss/plugin')
module.exports = {
plugins: [
require('@tailwindcss/forms'),
require('@tailwindcss/aspect-ratio'),
require('@tailwindcss/typography'),
require('@tailwindcss/container-queries'),
+ plugin(function({ addVariant }) {
+ addVariant("turbo-native", "html[data-turbo-native] &"),
+ addVariant("non-turbo-native", "html:not([data-turbo-native]) &")
+ })
],
}
And conditionally add data-turbo-native
to your <html>
tag:
# app/helpers/application_helper.rb
module ApplicationHelper
def platform_identifier
'data-turbo-native' if turbo_native_app?
end
end
# app/views/application.html.erb
-<html>
+<html <%= platform_identifier %>>
That’s it! Now you can apply the CSS variant:
<div class="non-turbo-native:hidden">
Visible only on Native
</div>
<div class="turbo-native:hidden">
Visible only on Desktop
</div>
<div class="turbo-native:bg-black turbo-native:text-white">
Turbo Native
</div>
<div class="non-turbo-native:bg-black non-turbo-native:text-white">
Non Turbo Native
</div>
Enable for a block #
// config/tailwind.config.js
addVariant('mobile', '&[data-turbo-native="true"]'),
addVariant('non-mobile', '&[data-turbo-native="false"]'),
<div data-turbo-native="true" class="mobile:bg-black non-mobile:bg-red-400">
This is mobile
</div>
<div data-turbo-native="false" class="mobile:bg-black non-mobile:bg-red-400">
This is non-mobile
</div>
Subscribe to SupeRails.com for more Hotwire Native content!
That’s it for now!
Did you like this article? Did it save you some time?