Files
blog/posts/blog-visual-upgrade.md
T

91 lines
5.1 KiB
Markdown
Raw Normal View History

---
title: "How We Restyled Our Blog with Two Template Files and Zero Dependencies"
slug: blog-visual-upgrade
date: "2026-06-03"
description: "Gradient titles, dark code panels, amber callouts — we gave the Tinqs blog a visual refresh borrowing our internal team guide aesthetic. Two template files, one Node script, no framework."
og_description: "Blog restyle: gradient titles, dark code panels, amber callouts — two template files, zero deps."
og_image: "https://www.tinqs.com/img/og-cover.jpg"
excerpt: "We gave the Tinqs blog a visual refresh — gradient titles, dark code panels, date pills, amber accent bars. Two template files, one build step, zero external dependencies."
author: "Ozan Bozkurt"
author_initials: "OB"
author_role: "CTO & Developer, Tinqs"
---
Our blog looked fine. Readable, semantic, proper typography. But it didn't have much personality. Code blocks were unstyled. Headings sat flat. The design said "competent" more than "intentional."
Then we looked at our internal team guide — a self-contained HTML doc with gradient titles that clip to transparent, dark code panels, and callout boxes with coloured borders. It radiated a "well-maintained developer doc" energy. We wanted the blog to feel like it came from the same shop.
Two template files, one build step, zero external dependencies. Here's what we changed.
## The build system (why it mattered)
The blog is generated by `build.js` — a zero-dependency Node script that converts markdown to HTML:
```
posts/*.md + _template.html / _index_template.html → *.html
```
This means we never touch a generated `.html` file by hand. Every visual change flows through the templates. The site-wide CSS — nav, footer, base typography, brand accent — lives in `../style.css`, served by Git Studio from outside the repo. We didn't touch it.
Instead, we injected a self-contained `<style>` block at the end of `<head>` in both templates, after the `../style.css` link. Cascade order handles the overrides. No `!important`. No external font loads. No CDN dependencies.
## The palette
Four accent colours, borrowed from our team guide:
| Role | Colour | Where |
|------|--------|-------|
| Brand amber | `#c9935a` | Gradient start, h2 left bar, card hover |
| Warm gold | `#f59e0b` | Gradient midpoint, bold text |
| Blue | `#38bdf8` | Gradient endpoint, links, date pills |
| Purple | `#a855f7` | h3 colour, link hover |
Tasteful. Not a rainbow.
## What we styled
**Gradient titles.** Post `h1` gets `linear-gradient(90deg, #c9935a, #f59e0b 40%, #38bdf8)` via `background-clip: text; color: transparent`. Underlying text preserved for screen readers and SEO.
**Date pills.** Monospace chip — blue text, `999px` border-radius, uppercase, tight letter-spacing. Sits before the title like a kicker.
**Code blocks.** The site CSS only styled inline `<code>`. Fenced blocks got a dark panel (`#0a0e14`, `#2a3340` border, `10px` radius, monospace, `overflow-x: auto`). A reset rule on `pre code` prevents inline-code styles from doubling up inside the panel.
**Section cues.** h2 gets a 4px amber left border as visual anchor. h3 gets a purple tint — enough to signal a section break without pulling focus.
**Links.** Blue `#38bdf8`, purple `#a855f7` on hover. Bold text picks up amber.
**Blockquote callouts.** Amber-tinted background, 4px amber left border, rounded right corners. The CSS is written and waiting — `build.js` doesn't emit `<blockquote>` yet, but the rules activate the moment we add `>` syntax support.
**Index page.** Same gradient on the listing title. Date pills on cards. Amber border on card hover. Blue/purple read links.
## The rebuild
```bash
node build.js
```
```
Building blog...
11 posts built + index.html
Done.
```
Zero errors. Every regenerated HTML file now carries the inline `<style>`. Confirmed with `grep -l "background-clip" *.html` — all pages ship the gradient.
## What we didn't touch
Navigation, footer, site chrome, responsive behaviour — all unchanged. This was a CSS-only change. No markup altered beyond the `<style>` injection.
## What we learned
**Inline styles beat separate CSS files when you don't control the server.** The blog repo is standalone — it can't modify `../style.css`. Inline `<style>` blocks ship inside the generated HTML, so the blog is fully self-contained. One `git push` and it's live.
**Cascade order is the cleanest specificity hack.** Putting the `<style>` block after the external stylesheet link means same-selector rules win by position. No `!important`, no selector wars, no unexpected regressions.
**Build systems make CSS changes safe.** Because we never hand-edit `.html`, every style change is tested by regenerating all pages and grepping for the new selectors. If a rule doesn't ship, you know immediately.
Two gaps we'll fill later: blockquote support in `build.js` (the callout CSS is waiting) and ordered lists (same story). In the meantime, the blog already looks intentional — and it took two template files, one build step, and zero dependencies.
---
*The blog is generated by [build.js](https://tinqs.com/tinqs/blog) and served by [Tinqs Studio](https://tinqs.com). All styling is self-contained in the templates.*