osukaru.es Design System

Sistema de diseño para la web personal de Óscar López Carazo (Osukaru), una recreación fiel de la interfaz del Sinclair ZX Spectrum 128K +2A.

Los componentes de esta guía están escritos en Astro y son los mismos que se sirven en producción. No se usa React en la web final: todo el comportamiento interactivo se implementa con JavaScript vanilla.

Principios: 8×8 píxeles por glifo, paleta BRIGHT del Spectrum, relación de aspecto 4:3, bordes negros de 2–4 px, esquinas cuadradas, animaciones con steps() y una única unidad proporcional --u.

Colors

Spectrum BRIGHT palette. 8 canonical hues. No tints, no opacity mid-tones. --spectrum-*

BRIGHT set — primary palette
Astro
#000000
black
#0000FF
blue
#FF0000
red
#FF00FF
magenta
#00FF00
green
#00FFFF
cyan
#FFFF00
yellow
#FFFFFF
white
DIM set — secondary (#CD variants)
Astro
#0000CD
blue-dim
#CD0000
red-dim
#CD00CD
magenta-dim
#00CD00
green-dim
#00CDCD
cyan-dim
#CDCD00
yellow-dim
#CDCDCD
white-dim
Chassis neutrals
Astro
#C0C0C0
chassis-silver
#1A1A1A
chassis-bezel
#4A4A4A
chassis-key

Typography

ZX Spectrum Expanded. 8×8 pixel glyphs. Three CSS font-family variants.

Type scale — 8px multiples
Astro
48px XL
32px LG · menu option
24px MD · body
20px SM
16px XS · footer
--fs-xl: 48px --fs-lg: 32px /* menu option */ --fs-md: 24px /* body */ --fs-sm: 20px --fs-xs: 16px /* footer / copyright */

Spacing & Grid

8px atomic grid. Borders: 2px or 4px solid black only.

Spacing scale
Astro
96px
64px
48px
32px
24px
16px
8px

Motion

steps(N, end) only. No cubic-bezier. --dur-blink: 0.5s --dur-load: 2.4s

Blink cursor
Astro
CARGANDO_

Iconography

Pixelart PNGs for identity, Icons8 SVGs for utility, Unicode for keyboard hints.

Pixelart PNGs
Astro
star-pixelart.png
favicon.png
Icons8 SVGs
Astro
github.svg
gmail.svg
linkedin.svg
web.svg
x.svg
Unicode keyboard glyphs
Astro
↑ ↓ ← → ©

Page Title Bar

Inverted black bar + white text + color bar PNG. Positioned at the bottom of the 4:3 viewport.

PageTitleBar — Experiencia
Astro
Experiencia
<PageTitleBar>Experiencia</PageTitleBar>
PageTitleBar — Conocimientos
Astro
Conocimientos
Prop Type Default Description
children required any Page title text.

Experience Card Carousel

Two-column card with company logo. Grid: 0.9fr | 2.1fr. Fixed height for carousel uniformity.

ExperienceCarouselCard — Dokify
Astro
Dokify
2014 — Act.
PHP Backend Developer

Desarrollo de una plataforma web que ofrece soluciones para la coordinación de actividades empresariales, homologación de proveedores, mantenimientos preventivos, etc.

<ExperienceCarouselCard company="Dokify" position="PHP Backend Developer" startDate="2014" endDate="Act." description="..." />
ExperienceCarouselCard — Acilia
Astro
Acilia
2012 — 2014
PHP Backend Developer

Desarrollo de las webs de FOX y National Geographic de más de 30 países.

Interactive carousel — keyboard & arrows
Astro
/* Focus the carousel and use ← →, or click the triangle arrows. */
Prop Type Default Description
company required string Company name.
logo required string Logo image URL.
position required string Job position.
startDate required string Start year.
endDate required string End year or "Act.".
description required string Role description.

Knowledge Card Carousel

Centered card: category name, technologies, pixelart star rating (1-10).

KnowledgeCarouselCard — BACKEND
Astro
BACKEND
PHP, Symfony, TypeScript
<KnowledgeCarouselCard category="BACKEND" technologies={['PHP','Symfony','Typescript']} rating={10} />
KnowledgeCarouselCard — FRONTEND
Astro
FRONTEND
Astro, React, CSS
Prop Type Default Description
category required string Skill category, e.g. "BACKEND".
technologies required string[] List of technologies.
rating required number Star rating out of 10.

Project Card Carousel

Two-column card with logo + link buttons (WEB, GITHUB, STORYBOOK). Blue bordered buttons. No rounded corners.

ProjectCarouselCard — con enlaces
Astro
Osukaru.es

Mi web personal con diseño retro inspirado en el Sinclair Spectrum ZX 128K +2A. Desarrollada con Astro, TypeScript y CSS personalizado.

<ProjectCarouselCard name="Osukaru.es" url="https://www.osukaru.es" githubUrl="https://github.com/Osukaru/osukaru.es" storybookUrl="https://www.osukaru.es/storybook" />
ProjectCarouselCard — sin enlaces
Astro
Osukaru.es

Mi web personal con diseño retro inspirado en el Sinclair Spectrum ZX 128K +2A.

Prop Type Default Description
name required string Project name.
logo required string Project logo URL.
description required string Project description.
url string Live site URL.
githubUrl string Repository URL.
storybookUrl string Storybook URL.

Contact

Grid rows: icon | label | value. Cyan hover. Used in contact page alongside avatar + QR.

Prop Type Default Description
items required { icon, label, value, href }[] Contact rows.

Viewport (4:3)

All content lives inside a 4:3 viewport with black letterbox. 3-row CSS grid; content in middle row. --u unit for proportional scaling.

Viewport — loading default
Astro
CARGANDO _
<Viewport loading variant="default" />
Prop Type Default Description
loading boolean false Show the loading screen overlay.
label string "CARGANDO" Loading label text.
variant "default" | "alt" "default" Stripe color variant.

Button

4 states: default, inverse, selected, disabled. Cyan focus ring (3px). No rounded corners.

Button states
Astro
<Button inverse selected disabled/>
Prop Type Default Description
type "button" | "submit" "button" Button type attribute.
inverse boolean false Black background, white text.
selected boolean false Cyan background.
disabled boolean false Reduced opacity, not interactive.

Star Rating

Pixelart star PNGs. 1-10 scale. Dim stars: filter: brightness(.25) saturate(0).

StarRating — values 3 · 6 · 10
Astro
3/10
6/10
10/10
<StarRating value={8} max={10} />
Prop Type Default Description
value required number Number of active stars.
max number 10 Total number of stars.

Chips

Technology labels. .zx-chip: default. .zx-chip.k: keyword (black bg, yellow text).

Default chips
Astro
ReactAstroDocker
Keyword chips .k
Astro
PHPSymfonyTypeScript

Color Bar

Authentic 380×72 PNG. Stepped diagonal. Rendered image-rendering: pixelated. Sized by height.

ColorBar — default height
Astro
<ColorBar height="36px" />
ColorBar — small and large
Astro
Prop Type Default Description
height string Optional inline height override. Default fills wrapper via CSS.
src string "/assets/color-bar.png" Path to the color bar PNG.

Loading Screens

Two variants with oscillating linear stripe animation + "CARGANDO_" blink cursor. Audio synced.

LoadingScreen — red/cyan
Astro
CARGANDO_
<LoadingScreen label="CARGANDO" />
LoadingScreenAlt — blue/yellow
Astro
CARGANDO_
<LoadingScreenAlt />
Prop Type Default Description
label string "CARGANDO" Loading label text.
audioSrc string "/assets/spectrum-loading.mp3" Audio file path.
variant "default" | "alt" "default" Stripe color variant.

Keyboard Hints

Inline keyboard instruction row.

KeyboardHints
Astro
desplazar ENTER seleccionar
<KeyboardHints hints={hints} />
Prop Type Default Description
hints required { keys: string[]; label: string }[] Keyboard hint groups.

Skill Row

Category + technology chips + star rating. Used in compact knowledge lists.

SkillRow
Astro
FRONTEND
AstroReactTypeScript
8/10
BACKEND
PHPSymfony
9/10
<SkillRow category="FRONTEND" technologies={['Astro','React']} rating={8} />
Prop Type Default Description
category required string Category label.
technologies required string[] Technology chips.
rating required number Rating out of 10.

Carousel Arrows

Triangle arrows for carousels. Disabled state dims the arrow.

CarouselArrows
Astro
<CarouselArrows canPrev canNext />
Prop Type Default Description
canPrev boolean true Enable previous arrow.
canNext boolean true Enable next arrow.
target string CSS selector of carousel to dispatch events to.