This is a submission for Frontend Challenge - Comfort Food Edition, CSS Art.
Inspiration
Tonkotsu ramen. It's the bowl I want when nothing else will do â slow-simmered pork-bone broth turned milky and opaque, a jammy marinated egg, soft rolled chashu, scallions, menma, a clean nori sheet, and that iconic pink narutomaki spiral. The whole thing is comfort in liquid form: rich, warm, and steaming.
I wanted to see if that feeling â not just the look of food, but the mood of a quiet late-night ramen-ya â could come through with CSS as the main ingredient. So this isn't just a bowl on a page; it's a composed table scene: warm wooden grain under an overhead light, a bamboo trivet, chopsticks resting on a ceramic hashioki, a small dish of pickled ginger, and a stamped order ticket.
Demo
I built it as a single self-contained HTML file (HTML + CSS + a light sprinkle of JavaScript). It's live here:
Try it: hover the ajitama egg, and move your cursor around â the steam and the overhead light shift with a gentle parallax. (Everything still works and stays still if you prefer reduced motion.)
Journey
The star of the show is CSS, as the prompt asks. JavaScript is deliberately light â only two small, purposeful things: nudging the steam's rhythm so it never loops like a metronome, and a soft pointer-parallax for depth. Here's what the CSS is doing:
-
Broth â layered
radial-gradients for the milky tonkotsu surface, with floating chili-oil droplets and sesame specks stacked via tinyradial-gradients inmix-blend-mode: screen. -
Narutomaki swirl â the pink spiral is a
conic-gradientcut into rings with aradial-gradientmask, so you get the real "pinwheel" cross-section instead of a flat disc. -
Chashu â rolled pork viewed from above: a
repeating-radial-gradientrenders the concentric spiral of the meat roll, with faint fat layers and a glaze highlight. -
Noodles â
repeating-radial-gradienttangles peeking out from under the toppings. -
Ceramic bowl â the depth is all
box-shadow: inset lights on the rim, inset darkness inside, and a cast shadow below, plus a curved specular highlight on the flank. -
Steam â blurred, semi-transparent puffs rising on
@keyframeswith randomized durations and three drift variants (rise,riseL,riseR) so the plume feels organic rather than mechanical. -
Typography & mood â a Noto Serif JP + Cormorant Garamond title block (
ă©ăŒăĄăł / Tonkotsu Ramen), a torn-edge order ticket with a red ćł hanko stamp, and a warm color grade to push the "I want to eat this" psychology.
A real bug worth calling out: at one point the wood-grain background was rendering on top of the bowl, burning dark stripes across the broth, chopsticks, and ticket. The culprit was a mix-blend-mode: multiply ::after layer painting above the scene. The fix was giving the scene z-index + isolation: isolate so all the internal blend modes stay contained â a good reminder that stacking context, not just z-index, decides what wins.
What I'm proud of: the narutomaki mask trick and the steam randomization â both are small but they sell the "alive" feeling.
What's next: a pour-and-stir animation on click, and a dark/light "shop sign" toggle.
This work is licensed under the MIT License.
Top comments (3)
The narutomaki approach is the detail that separates this from a typical CSS-art submission, most attempts at concentric spirals settle for a flat conic-gradient disc, but cutting rings via a radial-gradient mask to actually get the pinwheel cross-section is the difference between "looks like the idea of naruto" and looking like the real thing sliced open.
The stacking-context bug is the most useful part of the writeup for anyone else attempting layered CSS scenes like this, "z-index isn't what decides who wins, isolation is" is a lesson that usually only gets learned the hard way, exactly like you described (dark stripes burning through a bowl you didn't expect blend modes to reach). Worth remembering that isolation: isolate is the actual containment tool, not a bigger z-index number.
Keeping JS deliberately minimal (steam timing + parallax only) while doing the heavy lifting in CSS is the right call given the challenge's own judging criteria, and the reduced-motion fallback being a real consideration rather than an afterthought is a nice touch that a lot of animated CSS art skips entirely.
Narutomaki mask-temppu sai minut aidosti pysÀhtymÀÀn, leikkaamalla kartiogradientin sÀteittÀisellÀ maskilla saadaksesi oikean pyörÀn poikkileikkauksen sen sijaan, ettÀ teeskentelisit sen litteÀllÀ levyllÀ, on niin ÀlykÀs ongelmanratkaisu. Ja ettÀ pinoaminen yhteydessÀ bug writeup on kultaa, eristÀminen vs. z-indeksi trips ylös niin monia ihmisiÀ, minÀ mukana jossain vaiheessa, joten kutsumalla ettÀ avoimesti tulee sÀÀstÀÀ joku todellinen virheenkorjaus aikaa linjan. Koko kohtauksen koostumus itse kulhon lisÀksi, triviaali, hashioki, lippuleima, todella myy sitÀ myöhÀisillan ramen-ya-tunnelmaa, jota tavoittelit. Lumi Kasino kuulostaa kevyeltÀ ja helposti lÀhestyttÀvÀltÀ, joten myös navigoinnin pitÀisi tuntua vaivattomalta. SelkeÀt peliesittelyt ja ymmÀrrettÀvÀt ehdot tekevÀt ensimmÀisestÀ lumikasino.org/ vierailusta huomattavasti miellyttÀvÀmmÀn.
Gorgeous!