Button
Pill button. Primary has the gradient ring that spins on hover; ghost is the quiet secondary beside it. One primary per view.
src/components/ds/Button.astro ·
See it: Home · Hero
danitesler.com
Principles, tokens, live components and six patterns — the core of danitesler.com.
01
Seven decisions every page follows. When in doubt, come back here.
The chrome is black, white and greys. Colour arrives only with what is being shown — a case study’s theme, a service or a platform — through --spot, --acc and --cs-accent.
Dark is the default and light is one click away. Every colour is a token, or a token mixed with transparent, so nothing needs a second rule to flip.
Copy, links, metrics and case studies sit in data/site.ts and data/work/. Components render data; they don’t own strings or hex values.
Product ideas are shown with coded mini-UIs — covers, service previews, case-study visuals — instead of flat images with baked-in text. They scale, theme and stay readable to crawlers.
Transform and opacity only, ease-out-expo by default, played on reveal or hover rather than looping. Everything collapses under prefers-reduced-motion.
A visible focus ring on every control, 44px touch targets, decorative layers hidden from assistive tech and real text behind every animated heading.
Astro and plain CSS partials, no UI framework. Scripts bind once and survive ClientRouter page swaps.
02
The tokens in use. Pick from these before inventing a new value.
A neutral frame; colour arrives only with what is shown.
--color-bg #000000 #ffffff Page background --color-text #ffffff #0a0a0a Primary text; the base for every line, border and hover mix --color-muted #939393 #6b6b6b Secondary text: descriptions, captions, labels --color-border #3b3b3b #dadada Card and control borders at rest --color-surface #1a1a1a #ffffff Floating panels --accent-research What I do · Research & validation --accent-product What I do · Product design --accent-ai What I do · AI & agents --accent-system What I do · Design systems --accent-brand What I do · Brand & identity --accent-marketing What I do · Marketing automation --accent-dribbble Designs · More on Dribbble --accent-figma Builds · Figma --accent-playnite Builds · Playnite Extensions --accent-github Builds · GitHub --accent-ayywi Builds · Ayywi design system --accent-github-ink
Lines, borders and hovers mix --color-text with transparent (4% wash, 10%
hairline, 23% hovered border). Raw accents are for fills and glows; text and icons use
the -text variant.
Unbounded for headings and numbers, Sora for everything read, Caveat for the handwritten touch.
--font-heading --font-body --signature-font Product
Designs
Oktopost
200k
Flows, interfaces and clickable or coded prototypes.
KEEP EXPLORING
A 4/8 scale for layout. Round, never bubbly: 16px cards, fully round controls.
4 Icon to label inside tags 8 Inline groups, chip gaps 12 Button rows, footer lists 16 Card grid gaps, gaps inside cards 24 Page gutter, card padding on phones 32 Card padding, stacked blocks 40 Section header to content 48 Footer and About gaps 64 Between case-study blocks 96 Section divider margins 128 Section padding 4px Focus rings on text links --radius-button Small thumbnails, skip link 12px Menu rows, chat bubbles --radius-card Cards, covers, frames, media --cs-radius-lg Large case-study panels 999px Buttons, pills, chips, breadcrumb 50% Icon buttons, avatars, dots
Transform and opacity only, --ease-out-expo by default. One container,
a few reading widths.
--ease-spring Small tactile moves that overshoot: button lift, logo --ease-out-expo Default for movement: lifts, reveals, zooms --ease-menu Menus and carets 0.3s · --transition Colour, border, background 0.3s · --ease-menu Menus open, carets turn 0.4s · --ease-spring Buttons and icon buttons lift 2px 0.45s · --ease-out-expo Cards lift, spotlight fades in 0.6s · --ease-out-expo Images zoom inside media 1s · --ease-out-expo Entrances: reveal-on-scroll, hero 1400px --container-max: header, hero, project grid 1100px Builds, Keep exploring 1040px /work/ list 960px What I do grid 880px About copy 740px Reading measure for case-study prose Breakpoints: max-width: 1024px (Tablet) · max-width: 899–960px (Narrow) · max-width: 767px (Phone) · max-width: 359px (Small phone) · hover: hover / none (Input). Gutters are 24px, 16px from 1024px down.
03
Primitives take no site data; cards render data from site.ts and
data/work/. Every preview is the real component.
Pill button. Primary has the gradient ring that spins on hover; ghost is the quiet secondary beside it. One primary per view.
src/components/ds/Button.astro ·
See it: Home · Hero
The site’s one CTA: a primary Button that opens LinkedIn in a new tab.
src/components/ConnectButton.astro ·
See it: Home · Hero
Round, bordered icon control. The label is its accessible name; the icon stays decorative.
src/components/ds/IconButton.astro ·
See it: Footer social links (every page)
UI arrows and brand marks drawn in currentColor, defined once in ds/icons.ts. Case-study content icons live in work/CaseStudyIcon.astro.
src/components/ds/Icon.astro ·
See it: Footer social links
Small rounded label for a status or a short fact. The dot pulses; --pill-dot changes its colour.
src/components/ds/Pill.astro ·
See it: Home · Hero status
Small uppercase label that introduces a heading or a group. Two or three words.
Keep exploring
A label names the thing below it
src/components/ds/Eyebrow.astro ·
See it: Keep exploring
Opens a homepage section: a TextReveal title with a muted description that fades in just behind it. Centred; left-aligned on phones.
Six ways I help teams ship. Pick one or bundle them.
src/components/ds/SectionHeader.astro ·
See it: Designs
One recipe: 1px border, 16px radius, Lift on hover and a Spotlight in the accent of what the card shows.
Portfolio card: branded cover (or a screenshot), AI tag, title and description. Lifts and lights up in the case study’s accent.
src/components/ProjectCard.astro ·
See it: Home · Designs
Closes the case-study grid with a door to Dribbble: ProjectCard’s shell with a dashed edge, a lit Dribbble tile and a call to action instead of results.
src/components/MoreWorkCard.astro ·
See it: Home · Designs
Dark app-icon tile with a platform mark (Dribbble, Figma, Playnite, GitHub, Ayywi), lit from below by the --spot of the card around it.
src/components/PlatformIcon.astro ·
See it: Home · Builds
A public profile with its app icon and lead metric, lit by the platform accent. Opens in a new tab.
src/components/ProfileCard.astro ·
See it: Home · Builds
A service with its outlined number and coded preview, tinted by the service accent. The preview replays on hover. Sits inside a .svc-f list.
Interviews, usability tests and data that show what people need, then prove a design works before it ships.
Flows, interfaces and clickable or coded prototypes, from a 0→1 idea to B2B SaaS screens engineers can ship.
src/components/ServiceCard.astro ·
See it: Home · What I do
Case-study row: cover, eyebrow, title, intro and Role / Years / Platform facts. The title link covers the card.
B2B social media management
Oktopost helps B2B teams publish social content and run employee advocacy programs. I realigned the Lobster design system, redesigned the Advocacy Board with points gamification and custom branding, and rebuilt the post editor and AI Assistant.
src/components/WorkCard.astro ·
See it: Case studies
Blurred pill trail. The last item is the current page; every other item needs an href.
src/components/Breadcrumb.astro ·
See it: Case studies
Branded case-study thumbnail built from the case-study data: theme glow, wordmark, hero screen in a browser window and one signature chip. Sized in container units.
src/components/ProjectCover.astro ·
See it: Designs
Coded app icon for a project in the ProfileCard style: a dark tile lit from below by the product accent, with its glyph in that accent. Crisp at any size.
src/components/ProjectIcon.astro ·
See it: Builds
Marks work with AI features. Grey at rest; hovering the tag plays a purple glow and shows why.
src/components/AiTag.astro ·
See it: Designs
Whole sections, composed from the pieces above. Follow the link to see each in place.
src/components/Header.astro src/components/HeroSection.astro src/components/ProjectGrid.astro src/components/ProjectLinks.astro src/components/AboutSection.astro src/components/ServicesSection.astro src/components/ConnectSection.astro src/components/SectionDivider.astro src/components/Footer.astro src/pages/work/[slug].astro
Case studies are data: typed blocks (data/work/types.ts) rendered by
components/work/CaseStudyBlock.astro. 26 types in use —
the most common:
group 64 in 5 studies brief 25 in 5 studies custom 16 in 5 studies cards 15 in 5 studies callout 15 in 4 studies prose 10 in 5 studies gallery 8 in 4 studies media 8 in 3 studies 04
The six recipes that repeat. Reuse them instead of re-inventing the effect.
A cursor-lit wash and border in the card’s accent, pointer devices only. One delegated listener (scripts/spotlight.ts) feeds every card.
Used by ProjectCard, ProfileCard, ServiceCard, WorkCard, header menu
Hovered cards rise 4–6px and pick up the Lift shadow over 0.45s ease-out-expo. The border stays neutral; accent comes from the spotlight.
Used by Every card
Sections fade up 24px once as they enter the viewport. Stagger siblings with --reveal-delay in 80–90ms steps.
Used by Sections, cards, case-study blocks
Lines, borders and hovers mix --color-text with transparent, so they flip with the theme. Glows use --color-glow and shadows --color-shadow.
Used by Everywhere
Raw accents are for fills, tints and glows. Text, icons and strokes use the -text variant, darkened in the light theme so bright shades stay readable.
Used by Case studies (--cs-accent), What I do (--acc)
Screens sit in a window with a three-dot bar, so product shots read as product, not as decoration.
Used by ProjectCover, case-study media
05
The same rules are written for coding agents in the files below, so people and agents build the same way.
src/danitesler/src/components/ds/AGENTS.md How to use and extend the system .claude/rules/design-system.md Short rules for editing src/danitesler/src/data/ds.ts Registry behind this page