01 / Facet
Cut planes
Shadowed faces make the mark feel machined and precise.
facet / front + sideheyrian.dev / the foundation
Quiet pages. Clear examples. Room to understand.
The visual language
of heyrian.
Brand / The mark
A layered folded-knot for the header, the tab, and wherever heyrian travels.
Header lockup
BrandMark + wordmarkFavicon at working sizes
The same connected geometry stays recognizable when it has only 16 pixels to work with.
Depth studies
Stack is the active mark; Facet and Fold remain available as explorations.
01 / Facet
Shadowed faces make the mark feel machined and precise.
facet / front + sideOffset layers give the existing geometry a subtle physical lift.
stack / back + face03 / Fold
Overlapping strips suggest a continuous form turning through space.
fold / overlap + shadow01 / Foundations
Neutral by default. Color has a job.
--surface The page beneath everything.
--surface-raised Cards and open disclosures.
--surface-sunken Grouped controls and quiet areas.
--border Structure without visual weight.
--ink Headings and primary content.
--color-primary An accent that follows your choice.
Typography
stack.push(next)System mono · codeSpacing & shape
02 / Components
Native controls with a consistent feel.
The idea stays the same. The code and accent follow the language you choose.
Showing TypeScript in the example below.
Filled for the main action, a soft accent for emphasis, and an outline for quieter choices.
Useful labels
Keep the first explanation focused. An implementation detail or a longer example can sit one step deeper, ready when the reader needs it.
03 / Reading
Think about a history of changes. Add a new change to the top. When you undo, take the most recent change off first.
That order is what makes a stack a stack: last in, first out. The container and method names can change from one language to another.
push adds an item to the top.pop removes and returns the top item.A short layout specimen for the lessons to come.
const history: string[] = [];
history.push('First change');
history.push('Latest change');
// The most recent item comes off first.
const latest = history.pop();
console.log(latest); // Latest change 04 / Workflow surfaces
Composition lives in the rails. Thinking lives in the path.
A sidebar can hold the vocabulary and the selected-node decisions. The canvas should stay wide enough for relationships to be read at a glance.
05 / Visualizations
Data, relationships, and the steps between them.
Inspect a value. Follow a connection. Step through a process. Each view makes a different part of the idea visible.
Select a cell to inspect it. In a linked list, follow the pointer to discover the logical order.
Adjacent values · address = base + index × 4 bytes
index 0 at 0x100 holds 12.
Step through a traversal and watch the visit order change. Both use the same tree.
Compare values on a shared scale. Select a bar to inspect the reported value.
Array-backed stack · push · 1.8 ms
Record the source code and revision, language and runtime version, hardware, input size, warmup, sample count, summary statistic, and spread. Keep the raw measurements alongside the lesson.
Change the input range or isolate a curve. Points use their actual input sizes on a linear axis.
| Series | Input size (n) | Modelled work |
|---|---|---|
| log₂ n | 1 | 0 |
| log₂ n | 2 | 1 |
| log₂ n | 4 | 2 |
| log₂ n | 8 | 3 |
| log₂ n | 16 | 4 |
| log₂ n | 32 | 5 |
| log₂ n | 64 | 6 |
| n | 1 | 1 |
| n | 2 | 2 |
| n | 4 | 4 |
| n | 8 | 8 |
| n | 16 | 16 |
| n | 32 | 32 |
| n | 64 | 64 |
| n log₂ n | 1 | 0 |
| n log₂ n | 2 | 2 |
| n log₂ n | 4 | 8 |
| n log₂ n | 8 | 24 |
| n log₂ n | 16 | 64 |
| n log₂ n | 32 | 160 |
| n log₂ n | 64 | 384 |
Find a concept or select a node to read its relationships. Arrows carry a specific meaning, rather than implying every connection is a prerequisite.
Last in, first out. The behaviour can be implemented with different containers.