← Back to work

AI-native product & system

Closing the Loop: Design to Working Code

I set myself a test: design and build real apps, entirely on my own. I built Time Tracker and Scheduler, then created Elegante DS from scratch with AI, and applied it back to both, closing the loop from design to code.

Role
Designer and builder, concept through code
Timeframe
2026, ongoing
Tools
Figma, AI coding assistants, Next.js, React, Vite
Surfaces
Time Tracker, Scheduler, Elegante DS
Time Tracker and Scheduler shown as layered browser windows, side by side.

Proving I could close the loop

I set myself a test. Could I take a project from design to working code entirely on my own?

I picked two real problems to test it on:

After building both apps I pushed further and built Elegante DS, a design system from scratch, with AI's help but under my direction, and applied it back to both apps. Design, system, code, and back again, closing the loop.

What it actually took to build them

Both apps started with real requirements, not a blank canvas. I mapped out the use cases for each and worked through them until I was confident they actually held up. From there, AI helped me pick the right stack for each app and scaffold the foundation, while I directed the overall concept and the details of specific features and interactions. Once that foundation existed, we iterated feature by feature.

The biggest lesson was about context, not code. Early on, giving AI too little context meant it built features I didn't need, or built the right feature the wrong way. The more specific I was upfront, the better the output.

For styling, I could have kept using shadcn's default components and moved faster. I didn't, on purpose. I wanted proof I could build a design system myself, and I wanted these apps to look like mine, not like every other app built on the same starter kit.

A living design system, exportable as code

Time Tracker and Scheduler were both built first on shadcn's generic defaults. Once the two apps were working, the second challenge was different: design a living design system, one that could be exported as code so other apps could consume it too, not styles hard-coded into a single project.

Working screens made this easier than starting from a blank token sheet. I could see which spacing, radii, and color roles kept repeating across both apps and use that as the starting point for Elegante's core tokens. Some of the job was also just deciding what Elegante should feel like: how much room to give things, what its visual language was, how the light and dark themes should carry that same personality.

Typography took the most iteration, both the pairing and the sizing. Headings run in DM Serif Display, everything else in Plus Jakarta Sans. Getting the pairing right was only half of it. I also had to define how each size should compress across devices, so a heading that works on desktop doesn't overwhelm a phone screen while body and label text keep the same reading rhythm.

AI tools were used throughout, starting with the token architecture itself: structuring the token collections so the system could scale and support multiple themes down the line. From there it extended to generating and iterating component code, accelerating token extraction from working screens, and drafting documentation as the system took shape.

Primitives Color
mint
lavender
neutral
violet
success
warning
error
Type
Aa DM Serif Display · headings
Aa Plus Jakarta Sans · body
Heading scale compresses
on smaller screens
Space & radius
sm
md
lg
xl
full
Semantic roles, light & dark Light
background
text
border
primary
secondary
badge
Dark
background
text
border
primary
secondary
badge
Components
Button Badge Card Input Switch Checkbox Avatar Toast Date Picker Segmented Control

Same screen, before and after. The layout and logic didn't change, only the system underneath it.

Time Tracker's new invoice form using shadcn's default components, before Elegante DS was applied.
Before: shadcn defaults
The same new invoice form restyled with Elegante DS components.
After: Elegante DS applied

Designed once, shipped once

Elegante isn't a code library with a matching Figma file that happens to look similar. Take the Date Picker as one example from the library: in Figma it's built by composing a Popover, a Calendar, and a Day Cell exactly the way the code does. Drag one instance into a mockup and you get the real thing, not an approximation of it.

Both paths lead to the same output. A designer working in Figma reaches for the same tokens a developer reaches for in code, so a color or radius change moves both sides together instead of drifting apart. That's what makes this a living system rather than documentation someone has to remember to update.

Date Picker component in Figma, composed from Popover, Calendar, and Day Cell instances bound to Elegante's design tokens.
Designed in Figma: one component, built from the same primitives as the code.

Same tokens, not just the same look

--color-primary-default --eleg-primary
--color-calendar-in-range-bg --eleg-calendar-in-range-bg
--radius-full --eleg-radius-full

Figma token → code token. Same value, both places.

import { Popover } from "./Popover";
import { IconButton } from "./IconButton";

export function DatePicker({ trigger, align, ...props }: DatePickerProps) {
  return (
    <Popover trigger={trigger} align={align}>
      {({ close }) => (
        <div className="eg-date-picker">
          <IconButton icon={<ChevronLeft />} onClick={() => goToMonth(-1)} />
          <span className="eg-date-picker__month-label">{monthFormatter.format(viewDate)}</span>
          <IconButton icon={<ChevronRight />} onClick={() => goToMonth(1)} />
          {/* weekday row + day grid follow the same pattern */}
        </div>
      )}
    </Popover>
  );
}
Abridged from DatePicker.tsx. In code, Popover and Icon Button are the same reused components Figma describes above. The calendar grid itself isn't its own component in code the way it is in Figma, it's inline markup here, since nothing else in the app needed it standalone.

Elegante DS's actual tokens, running on this page

This isn't a screenshot. Play with the elements, toggle to dark mode, it's live code, not a picture.

Elegante DS, live preview
JD
Jordan Diaz
Consulting client
Billable

Log time

Core input + button pairing from the system.

Time Tracker and Scheduler

Working software, not comps. Time Tracker runs my own day-to-day hour tracking and invoicing. Scheduler runs a membership team's daily scheduling, from setup to everyday use.

Time Tracker: my own timer and invoicing flow, in use.
Scheduler: a membership team's day-to-day scheduling, in use.

What this proves

What I'd carry forward