UIDraw · Experiment · In ontwikkeling

Teken een app, krijg echte componenten

Een canvas dat je schets invult met de echte onderdelen van acht design systems, en er werkende code van maakt.

Het canvas van UIDraw in een browservenster: een navigatiebalk, een zijmenu, drie statistiektegels en een tabel als echte shadcn/ui-componenten, elk met een label als navbar of table, en daaronder twee met de hand getekende rechthoeken en een zigzaglijn met de suggesties panel? en text?.

Door Alexander Kaan, product designer · bijgewerkt september 2026

Product
UIDraw
Onderwerp
Gereedschap voor makersDesign systems
Platform
Web
Jaar
2026

Je tekent een scherm met de muis, rechtsklikt op een vak en kiest wat het moet worden. UIDraw vult het met het echte component uit de kit die je koos, met de echte classes en de echte stylesheet. Wat je exporteert is werkende code in die stack.

Gebouwd met
  • Vanilla ES-modules
  • SVG en iframes
  • Motor uit UIcockpit
  • Echte kit-CSS
  • node:test
  • Headless Chrome-checks

In het kort

design systems op hetzelfde canvas
8
onderdelen onder de rechtermuisknop
32
poorten die elke build moet halen
3
tests op de tekenlaag en de motor
183
commits op 24 en 25 augustus
36

Wat er lag

Een schets op papier is snel, maar daarna begint iemand alles opnieuw in code. Een prototype in een ontwerptool lijkt op een product, maar de onderdelen bestaan nergens echt. De vraag: kan een tekening meteen uit de onderdelen van een bestaand design system bestaan? Zodat wisselen van kit alleen de aankleding verandert, en de export gewoon draait.

Drie details die het verschil maken

Hoe het is gemaakt

Van krabbel naar component

Je tekent zoals op een whiteboard. Een gesloten haal wordt een rechthoek, een zigzag of golf wordt tekst, een rondje een avatar. Vier losse lijnen of twee L's die samen een vak vormen, leest UIDraw ook als één rechthoek. Hoe het vak heet, raadt hij uit plek en maat: smal en hoog aan de zijkant is een zijmenu, breed en laag bovenin een navigatiebalk, onderin een footer, klein en breed een knop, en de rest een paneel. Dat voorstel staat als label met een vraagteken op de vorm.

Met een rechtsklik kies je het echte onderdeel, of je neemt het voorstel over. Ligt een vak voor het grootste deel in een ander vak, dan wordt het daar een kind van, zoals een knop in een paneel. Dat staat nergens opgeslagen: UIDraw leidt het elke keer opnieuw af uit de tekening, dus als je een vak verschuift, verhuist het kind vanzelf mee of los. Tekst wordt ingevuld uit een paar zinnen over het tekenen zelf, zodat er nergens nep-Latijn als opvulling staat.

Het App shell-scherm in UIDraw na het vullen: onder de tabel twee panelen, links met de zin A paragraph starts where the pencil started, rechts met een zwarte knop Save changes, elk met een donker label als panel, text en button.
Dezelfde schets na drie keer vullen: de zigzag is een alinea en het kleine vak een knop in het paneel eromheen, allemaal echte shadcn/ui.

Acht kits, één tekening

Er zijn acht kits: shadcn/ui, Tailwind, daisyUI, Bootstrap, Radix Themes, Mantine, Material Web en Ant Design. Wissel je van kit, dan blijft je tekening staan en kleedt UIDraw hetzelfde scherm opnieuw aan, met de iconen die bij die kit horen: Heroicons bij Tailwind, Material Symbols bij Material, lucide bij shadcn.

Elk onderdeel draait in een eigen iframe met de echte stylesheet van de kit erin. Ant Design gaat nog een stap verder: dat is React, dus draait in het frame hun eigen React. Wie wil zien wat een kit echt anders doet, tekent één keer en klikt door de lijst.

Hetzelfde App shell-scherm in UIDraw, nu in Material Web: een lila navigatiebalk met een paarse knop New project, het zijmenu met een rood telbolletje bij Projects, drie tegels met Open requests 128 en de tabel eronder.
Hetzelfde scherm na een wissel naar Material Web. De tekening is niet aangeraakt, alleen de kit is anders.

Niets verzinnen

De motor komt uit UIcockpit, ons open-source gereedschap dat negen design systems naast elkaar zet (zie de case op /projecten/ui-cockpit/). UIDraw draagt daar een vaste kopie van: de lijst met onderdelen, de vertaling per kit naar echte markup, en het bouwen van de echte stylesheet. Alleen de tekenlaag is nieuw.

De regel is dat er niets verzonnen wordt. Elke class, elk icoon en elk component komt uit het gepubliceerde pakket van de kit, en waar een kit iets niet heeft, zegt UIDraw dat hardop in plaats van het na te bouwen. Material Web heeft bijvoorbeeld geen navigatiebalk, geen tabel en geen footer, en shadcn/ui geen grafiek, want die zit daar in React en niet in een class.

Drie poorten bewaken dat bij elke build. De eerste kijkt of elke class echt in de stylesheet van de kit staat, en breekt de build af als er één is bedacht. De tweede opent de app in een echte headless Chrome en kijkt of elke class op de plek waar hij staat ook iets raakt. De derde pakt de export uit, bouwt hem met het eigen gereedschap van de kit (de Tailwind-CLI, Sass of esbuild) en kijkt of er daarna nog steeds niets verzonnen is.

UIDraw in Material Web met het rechtsklikmenu open over een geschetst paneel. Bij navbar, sidenav, breadcrumb, mediacard, footer, alert, table, chart, avatar en empty staat het label gap.
Het rechtsklikmenu in Material Web. Wat de kit niet heeft, staat er met gap bij, en blijft leeg in plaats van nagebouwd.

Pagina's, en wat eruit komt

Een app is meer dan één scherm, dus werk je in pagina's met tabs erboven. Het overzicht (toets G) zet ze als potloodschetsjes naast elkaar, en de volgorde waarin je ze sleept is de volgorde in de export. Vier voorbeelden staan klaar: App shell, Login, Site page en Settings. Je tekening blijft in je browser staan, je bewaart hem als bestand, of je deelt hem als link waarin de hele tekening ingepakt zit. Er is geen account en geen server.

Export geeft een zip met werkende code in de kit die je koos: de eerste pagina als index.html, de rest ernaast, het bestand om hem te bouwen, en een handvol papieren met de ontwerpkeuzes, de tokens en uitleg voor wie er met een AI-assistent verder aan werkt. Vakken die je nooit vulde gaan niet mee; die staan alleen als telling in een regel commentaar. Bij Ant Design komen er nog geen pagina's uit, en dat staat in de README van de zip.

Het overzicht van UIDraw met drie pagina's als schetsjes naast elkaar: App shell met 10 shapes, Login en Site page, elk met de knoppen Rename, Duplicate en Delete, en een vak New page.
Het overzicht met drie voorbeeldpagina's. Slepen zet de volgorde, en die volgorde is de volgorde in de export.

Wat we eruit hebben geleerd

  1. 01

    Een klik bedoelt bijna altijd de kleinste vorm eronder, niet de bovenste. Bij de eerste echte schets ging een vulling naar het buitenste vak terwijl het binnenste bedoeld was. Sindsdien leidt UIDraw steeds uit de tekening zelf af wat waarin ligt, en wie een beetje over de lijntjes kleurt, zit er toch in.

  2. 02

    Gaaf is geen reden. Om tussen pagina's te wisselen bouwden we een waaier van kaartjes die als een halve maan onderin opkwam. Tien minuten later ging hij er weer uit: het overzicht deed hetzelfde werk, alleen handiger.

  3. 03

    Streng mag, blind niet. De poort die kijkt of elke class iets doet, sloeg bij shadcn/ui aan op classes die pas iets doen in een bepaalde stand, zoals een uitgeschakelde knop. Die staan nu per patroon vrijgesteld, met de reden erbij, en elke run zegt hoeveel classes daaronder vallen.

Letters en kleuren

Letters
Interface
Systeemletterui-sans-serif en system-ui op 15 pixels: UIDraw laadt zelf geen letter; wat er op het canvas staat, draagt de letters van de kit.
Labels en sneltoetsen
Systeem-monospaceui-monospace, SF Mono of Menlo voor de labels op de vormen, de letters in de gereedschapsbalk en de JSON-editor.
Kleuren
  • Inkt
    #1A1A1C
    tekst
  • Potlood
    #26262A
    de schetslijn, het actieve gereedschap en een gevuld label
  • Grijs
    #75757C
    uitleg en tweede tekst
  • Lijn
    #E3E3E6
    randen en scheidingen
  • Papier
    #FBFBFA
    het canvas, met een stippenraster om de 22 pixels
  • Bureau
    #F0F0EE
    de ondergrond rond het venster
  • Indigo
    #4F46E5
    selectie en het label suggested
  • Rood
    #B42318
    verwijderen
  • Bewust kaal: de kits zijn de kleur op dit scherm. UIDraw zelf is grijs, met indigo voor wat je geselecteerd hebt en rood voor weggooien.
  • Het woordmerk en het beeldmerk staan als svg in de repo en nemen de kleur van de tekst over.
  • Uitgelezen uit de code op 30 september 2026.

Waar het van gemaakt is

  • Tekenen
    • SVG
    • Pure geometrie
    • 64 punten per haal

    De herkenning kent geen browser: een haal wordt 64 punten, en de vorm volgt uit hoe dicht hij bij een rechthoek of een ellips ligt en hoe vaak hij van richting draait.

  • Vullen
    • Iframes
    • Echte kit-CSS
    • postMessage

    Elk gevuld vak is een frame met de echte markup en stylesheet van de kit; een rechtsklik in het frame komt als bericht terug bij het canvas.

  • Motor
    • Uit UIcockpit
    • Vertaling per kit
    • OKLCH-kleuren
    • Iconen per kit

    Een vaste kopie van de motor van UIcockpit: de onderdelen, per kit een tabel naar echte markup, en het bouwen van de stylesheet.

  • Poorten
    • Fidelity
    • Headless Chrome
    • Export bouwen

    Bestaat elke class, doet elke class iets, en bouwt de export met het gereedschap van de kit zelf.

  • Export
    • Zip
    • Tailwind-CLI
    • Sass
    • esbuild

    Per kit het eigen bouwgereedschap, met de pagina's in de volgorde van het overzicht.

  • Bewaren en delen
    • localStorage
    • .uidraw-bestand
    • Link met de tekening erin

    Geen account en geen server: de tekening staat in je browser, in een bestand of ingepakt in de link.

Voor wie verder wil lezen

Onder de motorkap

Een haal wordt eerst herschaald naar 64 punten en een beetje gladgestreken.

Een haal wordt eerst herschaald naar 64 punten en een beetje gladgestreken. Is hij breed en draait hij vaak van richting, dan is het een krabbel, en een krabbel is tekst. Is hij gesloten, dan meet UIDraw twee afwijkingen: hoe ver de punten van een ellips liggen, en hoe ver van de rand van hun eigen kader. De vorm die het best past wint, en een haal die geen van beide is, blijft inkt: UIDraw zegt dan liever niets dan iets verkeerds.

Wat waarin ligt, rekent UIDraw bij elke wijziging opnieuw uit. Een vorm is het kind van de kleinste grotere vorm die minstens 80 procent ervan bedekt, en kinderen staan in leesvolgorde: van boven naar beneden, en dan van links naar rechts. Een klik gaat naar de kleinste vorm onder de muis, met een paar pixels speling.

Ongedaan maken onthoudt 120 stappen, en telt slim: een reeks pijltjes kort achter elkaar is één stap, net als één haal met de gum. Een gedeelde link bevat de hele tekening, ingepakt met de compressie die de browser zelf heeft, en bij het openen controleert UIDraw wat erin zit, zodat een link geen code kan binnensmokkelen.

Waar het nu staat

Af: tekenen, herkennen en vullen in acht kits, pagina's met een overzicht, bewaren en delen, en de export als werkende code voor zeven van de acht kits.

Af: tekenen, herkennen en vullen in acht kits, pagina's met een overzicht, bewaren en delen, en de export als werkende code voor zeven van de acht kits. De drie poorten en 183 tests draaien groen.

Nog niet af: Ant Design levert nog geen pagina's in de export. Claude Code, Figma Make en Google Stitch staan in het menu als roadmap, omdat die tools geen manier hebben om iets binnen te halen; ze komen als uitgeschreven opdracht. Meer vormen tegelijk groter maken kan nog niet, en de inklapbare zijbalk van shadcn/ui komt niet mee. De pagina is ruim 4 MB, omdat alle kits er tegelijk in zitten. UIDraw staat nog niet online.

Kan ik UIDraw al gebruiken?

Nog niet. UIDraw staat nog niet online; tot die tijd draait het bij ons.

Welke design systems zitten erin?

Acht: shadcn/ui, Tailwind, daisyUI, Bootstrap, Radix Themes, Mantine, Material Web en Ant Design.

Wat krijg je bij de export?

Een zip met werkende code in de kit die je koos: de pagina's, het bestand om hem te bouwen, en papieren met de ontwerpkeuzes en de tokens. Bij Ant Design komen er nog geen pagina's uit.

Wat als een kit een onderdeel niet heeft?

Dan zegt UIDraw dat hardop: in het menu staat gap bij het onderdeel, en het wordt niet nagebouwd.

Heb je een account of een server nodig?

Nee. Je tekening blijft in je browser staan, je bewaart hem als bestand, of je deelt hem als link.

Wat we hier deden

Lees ook

De oprichter van een filmstudio voor de ledwand met een zonsondergang, een laptop onder zijn arm.

Een halfuur gratis sparren over jouw digitale idee?

Waar loop jij tegenaan in je bedrijf? Wat kan beter? Wat kan sneller? Wat gaat nog met de hand en moet nodig geautomatiseerd worden?

  • Een halfuur sparren over jouw idee, gratis
  • Je weet direct welke route het is, hoeveel weken, en wat het kost
  • Ruwe inschatting over de prijs en het aantal weken
Wat is jouw idee?

„Een browsertool zoals Figma, maar dan om samen muziek te maken.”

Muzieklabel, Hilversum

Alexander Kaan, zwart-witfoto.

Vertel me je probleem, je geniale idee of stel gewoon wat vragen!

Alexander Kaan, product designer

Mogen we met cookies meten hoe je deze site gebruikt? Meer