╔══════════════════════════════════════════════════╗ ║ luna.sys // design system · phosphor v4.0.1 ║ ╚══════════════════════════════════════════════════╝
design system.
a small, opinionated set of tokens and primitives powering imlunahey.com. mono-first, black-first, phosphor accent. every component is plain html + css. no framework required.
typography
two faces. jetbrains mono does everything structural — body, ui, numbers, labels. doto is reserved for display: hero numerals, section titles, moments of character. nothing else. ever.
faces
2 families--font-display · --font-monofont-familyscale
10 steps--fs-{micro,xs,sm,md,lg,xl,2xl,3xl,4xl,5xl}scalecolor.
a near-monochrome palette. blacks and greys do 98% of the work. one phosphor-green accent provides life; one magenta-red alert hue handles errors. never introduce a third accent.
surfaces
4 stepsforeground
4 stepsaccents
phosphor + alertspacing.
a 4-px base grid. all gaps, padding, and margins align to this scale. most ui lives between sp-2 and sp-6. use larger steps only for page-level rhythm.
--sp-{1,2,3,4,5,6,8,10,12}scaleborders + radii.
corners are sharp. radii exist only for the tiniest accents (kbd chips). everything else is 0px. shadows are reserved for the phosphor glow — never soft drop shadows.
1px solid --borderborder.default1px solid --accentborder.focus1px dashed --border-brightborder.dividerradius: 2pxradius.kbd0 0 16px accent-glowshadow.glow┌──────┐ │ │ │ ▣ │ │ │ └──────┘
ascii::frameborder.asciimotion.
motion is subtle and deterministic. four easings, short durations (120–400ms). the phosphor-blink and eq bars are the only perpetual animations allowed.
iconography.
no illustrated icons. we use box-drawing + geometric unicode. they render in the mono face, scale with type, and disappear into the text when you want them to.
buttons.
three variants. the primary button is reserved for the single most important action on a screen. everything else is default. ghost for dense toolbars.
.btn · .btn.primary · .btn.ghostvariants:hover · :active · :focusstatesinputs.
no labels floating inside. always a small label above. the focus ring is a single-px accent border — no haloes.
.inputdefault.input:focusfocus.input.errorerror.input[disabled]disabledlinks.
two styles. inline links get a dashed underline that turns solid on hover. glow-links get the phosphor treatment for emphasis.
i wrote a small article about building a dns server from scratch, and it became more popular than i expected.
come say hi on bluesky, read the blog, or check out recent projects.
a · a.glow-linkvariantstables.
flat. rows are separated by a single border line. headers lowercase and muted. the row-hover is the only interactive affordance.
| repo | lang | ★ | updated |
|---|---|---|---|
| akari | ● typescript | 412 | 2d ago |
| dns-server | ● rust | 89 | 5d ago |
| ip2country | ● typescript | 154 | 1w ago |
| xirelta | ● typescript | 67 | 2w ago |
.tblelementlists.
bullets are replaced with mono glyphs: · for unordered, right-aligned digits for ordered, ✓ for checklists.
ul.listol.list.orderedul.check.list.checkprogress.
two flavours. the bar for ui; the ascii-bar for logs and terminal copy. never percentages without context.
.barui.bar-asciiterminalcards + panels.
everything lives in a .panel. optional .ticks modifier adds corner accents for emphasis. panels never nest.
.paneldefault.panel.ticksfeaturedloading states.
three modes. the spinner is forbidden. use a shimmer skeleton when structure is known; a boot log when it isn't.
.skelskeletonboot.logterminal.loadingblockcode blocks.
syntax-highlighted source via sugar-high. token colours map to phosphor palette via .sh__token--* css vars; theme lives in src/components/CodeBlock.tsx.
with filename + copy
1import { SITE } from '../data';
// greet the visitor — defaults to the site handle
export function Greeting({ name = SITE.name }: { name?: string }) {
return (
<p className="t-accent">
hi, i'm {name}. welcome to the design system.
</p>
);
}
bare (no chrome)
1const greet = (name: string) => `hello, ${name}!`;
console.log(greet('world'));tokens
8--sh-keyword--sh-string--sh-class--sh-entity--sh-property--sh-identifier--sh-comment--sh-signvoice + tone.
three rules. be precise. be lowercase. be slightly dry. no exclamation marks unless someone is actually on fire.
"social media is doomed (and that's fine)"
"last commit · 37 minutes ago"
"coffee low"
"i write a blog, ship open source, and stream code when the lighting's kind."
"Welcome to My Personal Blog!!! 🚀"
"Leveraging synergies across the stack"
"Click here to learn more →"
"💻 Software Engineer | 🌍 London | ☕ Coffee Lover"