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-*
Typography
ZX Spectrum Expanded. 8×8 pixel glyphs. Three CSS font-family variants.
Spacing & Grid
8px atomic grid. Borders: 2px or 4px solid black only.
Motion
steps(N, end) only. No cubic-bezier. --dur-blink: 0.5s --dur-load: 2.4s
Iconography
Pixelart PNGs for identity, Icons8 SVGs for utility, Unicode for keyboard hints.
Page Title Bar
Inverted black bar + white text + color bar PNG. Positioned at the bottom of the 4:3 viewport.
| 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.
Desarrollo de una plataforma web que ofrece soluciones para la coordinación de actividades empresariales, homologación de proveedores, mantenimientos preventivos, etc.
Desarrollo de las webs de FOX y National Geographic de más de 30 países.
Desarrollo de una plataforma web que ofrece soluciones para la coordinación de actividades empresariales, homologación de proveedores, mantenimientos preventivos, etc.
Desarrollo de las webs de FOX y National Geographic de más de 30 países.
Desarrollo de red social para compartir vídeos e imágenes con retos, competiciones, rankings, etc.
| 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).
| 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.
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.
| 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. |
Home Link
Clickable logo that returns to the home page. Cyan border frame on hover/focus.
| Prop | Type | Default | Description |
|---|---|---|---|
src required | string | — | Logo image URL. |
alt | string | "Volver al inicio" | Accessible label. |
href | string | "/" | Home URL. |
Button
4 states: default, inverse, selected, disabled. Cyan focus ring (3px). No rounded corners.
| 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).
| 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).
Color Bar
Authentic 380×72 PNG. Stepped diagonal. Rendered image-rendering: pixelated. Sized by height.
| 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.
| 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.
| 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.
| 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.
| 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. |
Carousel
Generic wrapper for carousel content. Keyboard, touch, drag, and arrow navigation. Children become slides.
Desarrollo de una plataforma web que ofrece soluciones para la coordinación de actividades empresariales, homologación de proveedores, mantenimientos preventivos, etc.
Desarrollo de las webs de FOX y National Geographic de más de 30 países.
Desarrollo de red social para compartir vídeos e imágenes con retos, competiciones, rankings, etc.
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | "carousel" | Unique identifier used to wire arrows and events. |
itemCount | number | 0 | Optional explicit slide count; otherwise children are counted. |
autofocus | boolean | false | Focus the carousel on mount so keyboard navigation works immediately. |