A card component, fully assembled
Media, meta, title with the underline-grow hover, excerpt and a footer row.
Every token below was distilled from the existing resume design (Inter typography,
ink-black 2px borders, the periwinkle accent) and is now expressed as CSS custom
properties in design-system.css.
The resume and the blog are both built from these parts.
Core neutrals carry the layout; the two accents are used sparingly: lines, links, hovers. Semantic colors exist only for callouts and feedback.
Inter everywhere, weights 200–900. The scale maps one-to-one onto the sizes already used across the resume (14, 16, 18, 20, 24, 30, 34, 46, 64).
A 4px-base spacing scale. Borders are the signature: 2px solid ink. Radii come in exactly three sizes, lifted from the original cards (5), chips (10) and buttons (12).
The accent line and kicker reproduce the rotated section labels of the slideshow; the notched label chip comes from the “Hello” tab on the about page.
The solid button wipes to grey with a pop, like the original btn-black; the periwinkle accent is the primary/brand button, hovering to charcoal to match highlight-button-magenta; the ghost outline skew-fills ink, mirroring salv-down-cv-btn.
Every listing page opens the same way: kicker, an oversized black title, a light lead and the mono .ds-statline counters whose pulsing dot marks the live count. Pages compose the pieces per surface — a breadcrumb above, chips or search below — so the hero is a pattern, not a partial.
Notes on cloud & data architecture, .NET engineering and the practice of shipping software, written from the field, with the code to back it up.
The trail under a page hero (.ds-breadcrumb): periwinkle separators, hover-accent links and an aria-current ending that never links to itself.
The status vocabulary in one place: notched sheet labels, the “coming soon” pills, the draft-preview chip, date pills, the colour-coded role pills from the project cards and the tech chips. Grey consistently means “not yet”; periwinkle means live, featured or in focus.
The quiet placeholder (_EmptyState) when a topic or a filtered archive has nothing to show: accent line, a muted message, an optional hint and an optional onward link.
Try a different search or filter.
Clear search and filtersThe blog index's tier-one navigation (_TopicCard): a bold tile per topic with its article and series tally, plus the dimmed “coming soon” state for a topic whose posts are all still drafts.
Rendered by the same shared partials the blog composes its pages from (_PostFeature, _PostCard, _PostRow, _PostCardSoon) over sample data supplied by the showcase controller — what you see is the live component, not a copy of its markup.
How one CSS file and a handful of Razor partials keep the resume and the blog looking like the same site.
Media, meta, title with the underline-grow hover, excerpt and a footer row.
Draft posts render as dimmed, unlinked roadmap cards until their day arrives.
The stacked-sheet series card, its “coming soon” sibling, the “+N more” browse-all closer and the ordered roadmap rows (_SeriesCard, _SeriesCardSoon, _SeriesCardMore, _SeriesItems), rendered from mocked series data. The soon variants gain a Preview chip and click-through when the draft preview switch is on.
Turning one site's visual language into components both the resume and the blog compose from.
A drafts-only series: the card is inert until part 1 publishes.
Why partials plus mocked view models beat copy-pasted demo markup for a one-person design system.
A controller-supplied sample model keeps a showcase honest: the demo renders the exact partial production uses.
Breaking a monolithic showcase view into per-section partials that a catalog drives.
Wiring the catalog, the demo model and the section partials together, and what the page costs to render.
The in-post “you are here” panel (_SeriesMap): a native <details> whose summary is the progress strip and whose body lists the full arc — published parts link, drafts wait as “coming soon”, and exactly one row is current. Post pages render it closed; JS opens it into the left rail on wide viewports.
The reader's own completion layer over the series roadmap: the seriesProgress module injects a “Mark as read” toggle on every published row, checks the part number off, and keeps the hero fraction and hairline fill bar at done/total. State is per reader in localStorage (kc:series:<slug>:done), so the demo below is live — mark a row to see the done state; draft rows never get a toggle.
Why partials plus mocked view models beat copy-pasted demo markup for a one-person design system.
A controller-supplied sample model keeps a showcase honest: the demo renders the exact partial production uses.
Breaking a monolithic showcase view into per-section partials that a catalog drives.
Wiring the catalog, the demo model and the section partials together, and what the page costs to render.
The blog index's memory: while a post is read, the continueReading module records kc:reading:last (title, series part, scroll percent), and the index turns it into this shelf — title link, percent hairline and a dismiss that forgets the post. A read finished past 90%, or checked off in the lesson progress set, clears itself. The demo mount seeds its entry inline so the filled state always shows.
The blog index's forward ladder (_UpcomingStrip): the next three scheduled posts as “coming soon” cards under the “On the press” kicker, soonest date first. Rendered entirely server-side from the upcoming index; when nothing is scheduled the section does not render at all. Preview behaviour is inherited from _PostCardSoon — titles click through when the draft preview switch is on, sit inert otherwise.
Already on the schedule — the next articles off the publish ladder, nearest date first.
The nearest-dated scheduled post leads the roadmap strip.
A weekly cadence means the strip usually spans a fortnight.
The strip caps at three; the rest of the ladder stays backstage.
The sign-off on every post (_AuthorCard): the periwinkle KC monogram beside a short bio. Static by design — one author, no model.
The paging furniture of every listing: the Cards/List switch (_ViewToggle) at the end of a chip row, and the centred load-more button that dims to its is-loading state while a page fetches.
One shelf of the series index (_CategoryShelf): a topic kicker over its rail of stacked-sheet series cards, repeated per topic down the page.
Turning one site's visual language into components both the resume and the blog compose from.
A compact case study (.ds-project): a scannable face — role pill, name, outcome headline, key stack — over a structured <details> deep-dive. Role is colour-coded so the filter row doubles as a legend: Architect ink, Lead accent, Developer accent outline, R&D violet. R&D cards can carry a “read the series” link to the matching blog tag.
Built a centralised document-generation platform on Azure, validating policy data with InRule across products.
The panel openers of the homepage deck: the accent-block heading, the 4px ink bar quote and the periwinkle-tinted lead paragraph that introduces a panel.
The 4px ink bar quote, used to set the tone of a slide.
The lead paragraph: periwinkle-tinted supporting copy that introduces a panel.
.ds-feature: a black circle scales from the corner to fill the card on hover, flipping the content white (origin: service-card-wrap). .ds-stat-row numbers count up when scrolled into view via data-count.
My compass for navigating the complexities of technology.
Blending aesthetics and functionality into digital masterpieces.
.ds-edu draws its border in from the centre on hover, the title underline growing with it (origin: eduction-card). .ds-timeline is the employment rail.
MSc Advanced Computer Science
2022 – 2023
B.Tech, Computer Science
2012 – 2016
Microservice architecture and cloud deployment.
Built and shipped web applications on the cloud.
The about-panel pair: a .ds-info-list definition table and the violet .ds-notecard with its “Hello” tab.
A Cloud & Data Architect & Microsoft platform engineer. The notecard carries the biographical blurb on the about panel.
.ds-cert: badge, title, date and an expandable <details> body. Used inside the certifications carousel.
Azure Solutions Architect Expert
July 2021Expertise crafting cloud and hybrid solutions across Compute, Network, Storage, Monitoring and Security.
The homepage deck's identity pieces: the floating panel card, the rotated title rail, the “01 / 03” slide number and the pulsing indication arrow. The chrome only engages under ds-deck-on, so this demo is a static miniature rebuilt from the same tokens.
Everything below renders from Markdown on blog posts. Blockquotes take the 4px ink bar from the original single-post page; callouts are authored as :::note / :::tip / :::warning containers.
Body copy with a hyperlink, some bold emphasis, inline var x = 42; code, a Ctrl + K shortcut and a highlight.
The details are not the details. They make the design.
Charles Eames
Notes carry supporting context the reader can safely skip.
Tips are shortcuts: the thing you wish you had known first.
Warnings flag the failure modes that only show up in production.
| Token | Value | Source |
|---|---|---|
| --ds-accent | #7371FC | .text-magenta |
| --ds-border | 2px solid ink | .salv-blog-wrap |
| --ds-radius-md | 10px | .nav-tag-item |
Fenced code gets a framed block on the #141414 canvas: language label, one-click copy, and a brand-tuned syntax theme (Prism). C#, PowerShell, YAML, Bash, SQL, JSON, TypeScript and Razor ship by default.
public sealed record DesignToken(string Name, string Value)
{
// Tokens are immutable; the system changes by versioning, not mutation.
public static DesignToken Accent { get; } = new("--ds-accent", "#7371FC");
public override string ToString() => $"{Name}: {Value};";
}
$tokens = Get-Content './design-system.css' |
Select-String -Pattern '--ds-[\w-]+(?=:)' -AllMatches |
ForEach-Object { $_.Matches.Value } |
Sort-Object -Unique
Write-Output "The design system defines $($tokens.Count) tokens."
A fenced ```mermaid block in Markdown renders to an SVG diagram on a
framed, centered panel, themed to the brand palette (periwinkle accents,
charcoal ink, the system sans). The library loads lazily and only on pages that
contain a diagram; if it ever fails to load, the raw source stays readable.
Flowcharts, sequence, pie, xychart, block and radar diagrams are supported.
flowchart LR
A[Write Markdown] --> B{mermaid fence?}
B -- yes --> C[Render SVG]
B -- no --> D[Framed code block]
C --> E[Themed diagram]
pie showData title Discipline weights
"Specification" : 35
"Context" : 25
"Harness" : 20
"Verification" : 20
The full Markdig pipeline is wired up. GitHub-style alerts (> [!NOTE]),
LaTeX math ($x$ inline, $$…$$ block, rendered with KaTeX),
footnotes, definition lists, strike/insert/sub/sup, abbreviations and citations all
render to the system style. Emoji shortcodes (:rocket: → 🚀) and
smart typography (straight quotes become curly, -- an en dash) are on too.
Note
GitHub alert syntax maps to the same look as the :::note callouts.
Important
The important variant uses the periwinkle accent.
Caution
Caution maps to the danger token.
Inline math like \(E = mc^2\) sits in the text, while block math is centered on its own line:
A footnote reference1
links down to the list at the foot of the article. Inline runs support
struck text, inserted text, H2O, x2,
an HTML abbreviation and a
cited source.
Footnotes render smaller, with a top rule and a back-link. ↩
Figures take an uppercase caption with the small accent line. Plain YouTube or MP4 links in Markdown become responsive 16:9 embeds automatically. Image pairs can opt into a two-column gallery.
The original slideshow ideas live on here, rebuilt natively: no jQuery, no owl-carousel, no AOS. Every effect is progressive enhancement and switches off under prefers-reduced-motion. The homepage is a six-panel deck; this guide and the blog are ordinary scrolling documents.
Cascades in as the row enters the viewport.
A beat later than its neighbour.
And later still, a gentle stagger.
Swipe, drag, or use the controls below.
Snaps cleanly to each item.
Counter tracks position.
Buttons disable at the ends.
| Effect | Hook | Origin |
|---|---|---|
| Transform-paged deck (vertical panels) | .ds-deck > .ds-deck__track > .ds-panel | cd-slideshow |
| Horizontal sub-slides | .ds-substrip > .ds-sub | cd-marginal-nav |
| Floating content card | .ds-panel__card | .content |
| Rotated vertical title rail | .ds-panel__title | .slide-title |
| Slide number | .ds-slidenum | .slide-number |
| Pulsing direction arrows | .ds-indicator | .cd-single-step |
| Letter-by-letter title | .ds-letters | anime.js ml3 |
| Page loader (once per session) | .ds-loader | banter-loader |
| Two-ball cursor | auto (fine pointer) | .cursor__ball |
| Dark header on scroll | .ds-header.is-scrolled | .salva-header.sticky |
Add design-system.css and the ds-page body class, then compose. Posts are plain Markdown files in /Posts with a small front-matter block. Drop a file in, and it’s published.
<link rel="stylesheet" href="/css/design-system.css">
<body class="ds-page">
<article class="ds-card">...</article>
</body>
---
title: My next post
summary: One sentence that earns the click.
date: 2026-06-12
category: Azure & DevOps
tags: azure, dotnet
hero: /images/blog/hero-azure-deploy.svg
---