Empty State
Shared first-run shell for /dashboard/** — action-framed copy ("do this next", not "why is this empty"), a static isometric figure from EmptyStateArt, and a primary CTA. The figures are the one scoped exception to DESIGN.md's ban on decorative illustrations: empty states of /dashboard/** only, never a screen with data, never an error state. Previews sit on bg-card at 704px, the surface and width the dashboard gives them.
Interview list — /dashboard/interviews
MicArt, the desk microphone: "speak to start". Used here and in the /dashboard first-run block, so the two screens with the same CTA read as one story.
Пройди першу співбесіду
15 хвилин голосом — і вона з'явиться тут із оцінкою та розбором за критеріями.
Почати співбесіду| Prop | Type | Default | Description |
|---|---|---|---|
| visual | React.ReactNode | — | An isometric figure from EmptyStateArt (MicArt / HexArt). Scoped exception to DESIGN.md: empty states of /dashboard/** only. |
| title | string | — | Action-framed: what to do next, not why the screen is empty. |
| body | string | — | One supporting sentence. |
| ctaLabel / ctaHref | string? | — | Optional primary CTA link. |
Skill profile — /dashboard/profile
HexArt, a hexagonal slab with six empty sockets: the six skill axes, nothing measured yet. It replaces the former ghost radar. SkillRadar itself still returns null at zero coverage on purpose (a hexagon of zeros reads as "you scored zero"); a slab with empty sockets does not.
Пройди першу співбесіду
Твій профіль навичок з'явиться тут одразу після першої оціненої співбесіди.
Почати співбесідуIllustrations
MicArt and HexArt, with EmptyStateVisual, the wrapper they sit in. There is deliberately no separate design-system page for them: they are not a reusable pattern but two fixed figures, scoped to empty states. Neutral tones only (slots mixed from --card, --foreground and --background, with a separate .dark block so side faces recede in both themes; local to EmptyStateArt.module.css, not in globals.css), no accent, no text. Light site: current theme on the left, forced .dark on the right. Dark site: one column, since light cannot be forced inside a dark page.
current theme
dark
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string? | — | MicArt / HexArt. Default size is h-28 (7rem) with auto width; override the height here if a context needs it. |
| children | React.ReactNode | — | EmptyStateVisual: the figure. Decorative wrapper (aria-hidden), centred. Add mb-4 via className when stacked above text. |
No CTA
ctaLabel/ctaHref are optional — omit them when the empty state sits next to its own action elsewhere on the page.
Ще немає даних
Тут з'явиться інформація, коли вона буде.

VoiceMock was built by one designer
I'm Sergiy, a product designer. I built this trainer myself — research, design system, code. On LinkedIn I show how products like this come together, and what it changes in a designer's work.
Product Designer · AI Design Engineer · Designer for Startups
See it on LinkedIn