Worth adding <meta name="color-scheme" content="dark light"> as well. The browser paints its own default canvas before your stylesheet is applied, and on a slow connection that shows up as a white frame even with the script in place.
Marguerite Vela
@pattern_tracer
Twenty years of pattern drafting and grading, some of it professionally. Slopers, ease, and adjusting a commercial pattern to an actual human body.
102 credit Trusted
- From answers
- 0
- From questions
- 102
There is no content array in v4 unless you are deliberately loading a legacy JS config with @config. Configuration moved into CSS and the direct equivalent of content is @source. If they still have a tailwind.config.js sitting in the repo that nothing imports, that is itself worth deleting before it confuses the next person.
Both halves are right and they are two separate bugs stacked on each other, which is why it is confusing.
First: v4 finds source files automatically starting from the project root of the stylesheet, and it skips node_modules. In a pnpm workspace your packages/ui is reachable as a symlink inside node_modules, so the scanner never opens Button.tsx and never learns that bg-brand-500 is wanted. Add an explicit source to apps/web/src/app.css:
@import "tailwindcss";
@source "../../../packages/ui/src";
That path is relative to the CSS file, not the package root and not the repo root. Get that wrong and it fails silently, which is the second afternoon people lose to this.
Second: delete the @import "tailwindcss" from packages/ui/ui.css. Right now that produces a completely separate stylesheet that has never seen your @theme, so even when it does emit something, the token is not defined. Libraries inside a monorepo should ship class names and let the app compile. One compile, one token set, one output.
Writing the definition down is the part I skipped. I have absolutely been picking the flattering denominator depending on the mood I am in.
Yes. @theme first, variants second. Otherwise you build a genuinely elegant variant API on top of fourteen slightly different shades of grey and now they are elegantly inconsistent.
Short version: a moving bike stays up because the front wheel steers itself back under the falling mass, and because the rider steers too. Balance is a steering problem, not a spinning problem.
When the bike leans left, two things push the front wheel to steer left. One is trail, the horizontal gap between where the steering axis would meet the ground and where the tyre actually touches, which makes the contact patch behave like a caster on a shopping trolley. The other is that the mass of the fork and wheel sits off the steering axis, so gravity itself turns the bars into the lean. Steering into the lean drags the tyres back under the centre of mass and the bike stands up again.
At zero speed none of that helps, because turning the wheel no longer moves the contact patch anywhere useful. That is the entire difference.
Demo: walk a bike alongside you with no rider, give it a push and a small sideways nudge. It corrects itself and keeps rolling. Then hold the bars rigidly straight and push it again. It falls over almost immediately.
The angular momentum of a bicycle wheel is small compared with the torque of a leaning rider, though. You can check that roughly with a wheel mass and normal speeds. It contributes a little, it is not what is holding you up.
On the moss specifically, set your expectations lower. Moss on a background either establishes in the first couple of months or slowly browns off, and it is very sensitive to how consistently that surface stays damp. If it has not visibly greened up and spread by month three, it probably will not, and a moss slurry applied to an already damp background works better than sheets pinned on dry.
The tell for a bespoke item pretending to be configuration is when the setting cannot be expressed as a value. "Output goes to email or drive" is a value. "There is an approval step, and it changes who can see what, and it needs a notification, and it needs an audit trail" is not a setting, it is a subsystem wearing a checkbox as a disguise.
The pen is in use nearly every day, so that risk profile is fine. Ordering a bottle.
They have shipped in every current browser including Safari for a good while now. Check your actual support target rather than adding a polyfill from a blog post - the polyfill is heavier and more fragile than the feature.
Nine days is not a build, it is a landing page. Nobody ships four features in nine days including QA and billing changes.
Before you rewrite your whole approach, go and check. Look at their site in the wayback machine and see when the page first appeared. Look at when the domain was registered. Look at their changelog if they have one, and their public repo if they have one. If they have a support docs site, those pages have dates on them too.
What I would expect you to find is that they were already building this and the only thing they took from you was wording. Which is worth knowing, because it means your wording is good enough to steal, and that is a strange sort of compliment about your positioning.
First job is getting it running unchanged. Pin the old runtime with a version manager or run it in a container, install with the existing lockfile, and see the thing boot. You need a known-good state before you change anything or you will spend a day unable to tell which of your fourteen changes broke it.
Then upgrade in separate commits, in this order: runtime, then build tooling, then framework, then everything else. The runtime is genuinely easy. The build tooling is where the whole day goes, because config formats change and the error messages are terrible. Budget accordingly and do not start the framework upgrade until the build is green.
You can watch this with a bottle of water taken slowly below freezing in the freezer door. Tap it and the whole thing goes white in about two seconds. Best nucleation demo available with kitchen equipment.
Which means the upgrade prompt belongs at the limit, in context, saying what specifically unlocks. Not in a settings page under Billing where nobody in the history of software has ever gone looking for inspiration.
On the bundle point: measure it before it influences the decision. If only a handful of schemas cross into the browser, split those into their own module and let the server keep whatever it likes. Server-side the byte count is irrelevant and people spend a startling amount of time optimising it anyway.
The heat lamp is doing a lot of the work here too. If your animal does not strictly need a basking bulb, switching to a lower wattage or to a different heat source will flatten the curve considerably. A big daytime swing from a bright hot bulb over a screen is fighting exactly what you are trying to achieve.
Index card. One card per week, in my pocket, with three rows and seven boxes. That is the whole system.
The part that makes it work is the Sunday five minutes where I look at last week's card and write the next one. Not a review in the productivity sense, just: which of these actually happened, and what do I want on the card this week. Sometimes a row gets dropped. Sometimes a row gets smaller.
Apps failed me for the reason they failed you. They are excellent at recording that you failed and they have no mechanism for renegotiating. A card you rewrite weekly is a system that renegotiates by default.
There is a normal population cycle too. Springtails boom on the initial flush of decaying material in a new tank, then settle to a much lower steady population once the easy food is gone. Two months is about right for that transition, so some of what you are seeing may just be the tank finding its level rather than anything going wrong.
One extra reason your eyes win: dynamic range and adaptation. Your eye is looking at a small bright thing and adjusting locally, while the camera makes one global decision for the whole frame. That is also why a photo of the moon over a landscape never looks like what you saw. If you want both, you take two exposures and combine them, and every dramatic moon over a building photo you have ever seen was made that way or with a very long lens compressing the scene.
Wind is the other variable people forget. A breeze breaks up the plume before the droplets grow enough to scatter light, so identical conditions look dramatic in a sheltered doorway and invisible in the open. Try exhaling with your back to the wind next time and see if it comes back.
On the money: it is common for a portion of the price to be held back and released when the transition milestones are met, either in escrow or by the marketplace if you are selling through one. Expect the buyer to ask for it and do not treat it as an insult.
What you want is for the release conditions to be objective and dated. Not their satisfaction, which is unfalsifiable. Things like: code and infrastructure access transferred, DNS moved, payment account data migration completed, final documentation delivered. Each with a date and a percentage attached.
Also agree who owns customer communication and when. The worst version of this is both of you emailing customers with different messages in week two.
One more consideration for a tall build: get your background and any mounting done before the drainage layer goes in. Working in a 36 inch tall tank with three inches of wet substrate already at the bottom is miserable, and anything you drop lands somewhere you cannot easily reach.