I worked a lot less than usual due to a nasty cold last week but still managed to make pretty good progress on a couple of things for Tailwind 1.0.
In Tailwind 1.0, core plugins will be disabled by setting them to false
in the corePlugins
section of your config file:
module.exports = {
// ...
corePlugins: {
float: false,
}
}
When I came up with that solution it also occurred to me that it could make sense (at least conceptually) for this corePlugins
section to also be where end-users could completely override the configuration for a core plugin if they needed to:
module.exports = {
// ...
corePlugins: {
opacity: {
variants: ['responsive', 'hover'],
values: {
'0': '0',
'20': '0.2',
'40': '0.4',
'60': '0.6',
'80': '0.8',
'100': '1',
}
},
}
}
There's really no reason at all for someone to actually make use of this right now (all of that configuration is better exposed through the theme
and variants
sections) but I liked that this config file design supported it in theory, in case it's ever useful in the future.
I submitted and merged a pull request (#644) for this early in the week.
A few weeks back I wrote about how I was really excited to take advantage of some changes in postcss-selector-parser
that would make escaping class names in Tailwind a lot simpler.
Unfortunately I wasn't able to do that because of a bug in css-loader
that, when combined with the cssesc
library support really old versions of IE, resulted in the :
character being improperly escaped when Tailwind was processed in a webpack context.
Last week I was able to get two PRs (#19, #169) merged that dropped support for IE < 8 in both cssesc
and postcss-selector-parser
which means I should be able to simplify some things around class name escaping once a new postcss-selector-parser
release is tagged.
I added a feature (#649) to Tailwind's plugin system that lets third-party plugins register base styles using a new addBase
helper:
module.exports = {
// ...
plugins: [
function({ addBase }) {
addBase({
'img': {
maxWidth: '100%',
},
'button': {
fontFamily: 'inherit',
},
})
}
],
}
This makes it possible for people to author plugins that provide different reset styles than our existing preflight
styles, or add other useful base styles like default typography styles for example.
Part of adding this feature included defining a new @tailwind base
directive where any plugin-defined base styles get rendered.
preflight
into a core pluginOnce I made it possible for plugins to register base styles, I worked on converting our preflight
styles into a core plugin (#650).
This meant I could remove the @tailwind preflight
directive and make @tailwind base
the one-true way to render any base styles in your CSS.
One of the things I've always hated about the 0.x Tailwind config file is the colors
variable we define at the top purely to make it possible to reuse those values for textColors
, backgroundColors
, and borderColors
.
For Tailwind 1.0 I wanted the colors
key in the theme
section of the config file to be automatically respected by the other color-dependent plugins instead of having to use a variable to avoid the duplication.
I had a few false starts on this (#639 and #643) but eventually decided to solve it by making it possible to define theme values as closures so they were lazily evaluated (#645):
module.exports = {
// ...
theme: {
colors: {
'transparent': 'transparent',
// ...
'pink-lightest': '#ffebef',
},
backgroundColors: theme => theme.colors,
textColors: theme => theme.colors,
borderColors: theme => {
return global.Object.assign({ default: theme.colors['grey-light'] }, theme.colors)
}
}
}
There's potential for circular references and infinite recursion here but not terribly worried about that and comfortable making that the end user's responsibility to avoid.
Last year I had an idea for an app to help me manage sponsorships for my podcast, and decided to try and build an MVP in a single day (ended up taking two), live streaming the whole thing on YouTube.
I didn't take it any further than what I'd done on the live streams, and never really thought about it much after that for a few different reasons:
As I've mentioned in other updates, one of the things I struggle with a lot is figuring out ways to keep my application development skills sharp, because most of my time is spent doing educational stuff, or working on Tailwind which is just a library.
I've been trying to find a good side-project to work on that I could use to keep improving as an actual software product developer as well as dogfood Tailwind, but most of the ideas I've come up with have had annoying flaws with them.
BarelyAccounting, the simple bookkeeping software I wish I had for running my own business, is a pretty good idea as far as the feature set is concerned, but I really want to build something I can actually throw on the internet and have real people use, and I'm not sure I'm comfortable having a bunch of people's important financial data in my database, both from a compliance perspective and a general terrifying responsibility perspective. These days my books are handled by Bench (disclaimer: that's my referral link) anyways, so this isn't really even a huge problem for me anymore.
DevJournal, the online community I wanted to build for other developers to journal about their work like I do here, would still be a useful thing to build and I'd like it to exist, but I don't think there is a lot of interesting stuff involved in building it. It's a really simple CRUD app for people to basically publish blog posts. I'd still like to build it one day, but as my main side-project I'm not convinced it's the best opportunity.
SponsorShip on the other hand is more interesting than I remembered. I know quite a few people in my own network who could actually benefit from it, and although the original MVP was this super simple single-screen app, I realized after looking at it again that that wasn't because that was the best way to build the product, it was really just because I wanted to build it in a single day.
There are a lot of interesting features I could build and I think it has just the right amount of real-world potential that I'm excited to dive back in to it. I've already scheduled a call with one potential customer to talk through the idea a bit and do some planning, so hopefully I can spend a full day or two digging back in to the app next week.
One thing that is important for me to remember is that even though I'd like whatever side-project I end up pursuing to be a very real-world SaaS app, I'm building it primarily for the benefit of my developer audience, even if the actual customers of the app are an entirely different group (like people with podcasts/newsletters/etc in the case of SponsorShip).
Put another way, the real reason I'm building an app isn't for the app to be successful and make money (although I think it's important that I pick an idea that has that potential, because it makes the project more realistic) — it's so I can continue to discover new ideas that I can teach to other developers, to give me something interesting to live stream for my audience to learn from, and to have a really polished codebase I can open source for others to study.
preflight
to use normalize.css
as a proper npm dependency, instead of manually maintaining a copy-and-pasted version like we do nowtextSizes
would become fontSize
) and if I should standardize on singularizing everything (backgroundColors
would become backgroundColor
)