Preskoči na sadržaj
Jedna tirkizna linija na tamnoj mreži dolazi slijeva do svijetle tačke, pa se iz nje grana u tri linije koje vode u tri okvira poredana jedan ispod drugog; srednji okvir je ispunjen, gornji i donji su prazni.

„Konvencije nisu dokumentovane. One su provođene.“

Pet problema na koje smo stalno nalijetali, i sistem koji ih rješava

Jedanaest projekata naučilo nas je istih pet propusta. CDS je ono što smo napravili da ih prestanemo plaćati.

Kontaktirajte nas
Vlastiti proizvod, bez klijenta · 6 mjeseci, u toku · u upotrebi u našoj finansijskoj platformi i na ovom sajtu
74
komponente, tri platforme
430
testova u 55 fajlova
~2.450
linija koje obaraju build
Ukratko

Kroz jedanaest projekata nalijetali smo na istih pet propusta. Web i mobilni krenu identično, a dvije godine kasnije dijele samo ime. Figma je jedan izvor istine, kod drugi, i nikome nije jasno koji je tačan. Konvencije žive u README-u i poštuju se dok neko nema vremena. Svaki novi proizvod počinje svoj sloj komponenti od nule. A proizvod koji se prodaje pod tuđim brendom ima ili tokene ili trideset kopija koje nikad neće biti održavane.

CDS odgovara na svih pet. Dizajn tokeni dolaze iz Figme automatski, preko MCP servera — tokeni, ne komponente. Token teme razrješava se po platformi — CSS varijabla na webu, sentinel koji native resolver zamijeni — pa split živi jedan sloj ispod mjesta poziva, umjesto da se u njega prelije. A konvencije nisu dokumentovane nego provođene: ~2.450 linija provjera koje obaraju build.

74 komponente, 430 testova, katalog od 81 stranice generisan iz koda.

Problem

Uobičajeni alati čine razilaženje besplatnim. Platform.select stavlja granu gdje god je zgodno, uslovni importi puštaju svaki fajl da se razdvoji. Ništa ne ostavlja trag i ništa ne pukne kad se namnože.

Ograničenje

Sistem mora ostati ispravan i kad prestanemo pratiti ga. Konvencija bez vlasnika je preporuka — traje dok neko ima vremena za pažljiv pregled, a prestaje prve sedmice kad nema. Zato invarijante moraju imati vlasnika koji obara build.

Šta smo uradili

  1. Split platforme spušten jedan sloj ispod poziva

    createTheme() pretvara token u string koji se razrješava po platformi, pa se ${theme.color.fg.default} ponaša isto svuda. Dijeljeni recepti stoje iznad toga i razlikuju se samo po okidaču — :hover prema pressed. Postoji jedna definicija boje, pa se boje ne mogu razići.

    Poziv za prijavu identičan na tri mete
  2. Tokeni iz Figme dolaze automatski

    Preko MCP servera, sa ručnim putem kao rezervom. Token sloj je paket — tokens hrani core, core hrani ui — pa izmjena ima jednu ulaznu tačku umjesto pretrage i zamjene kroz cijeli kod. To pokriva tokene, ne komponente: palete, skale i vrijednosti teme dolaze iz Figme, komponente se pišu u kodu.

    Tokeni, ne komponente
  3. Invarijante dobile vlasnika koji obara build

    verify-tokens (902 linije), verify-conventions (1.056) i verify-katalog (485), plus ESLint plugin sa četiri pravila. Jedno pravilo nosi arhitekturu: pattern ne smije imati .native varijantu. CI poziva taj lanac i tri prava builda — Next, Vite i Metro — jer je next build jedino mjesto gdje se pravilo o 'use client' stvarno provjerava.

    ~2.450 linija provjera
  4. Isporučeno kao paket koji je već u upotrebi

    U našoj finansijskoj platformi — i na ovom sajtu. Pokrivenost je pun set, ne starter: primitivi, forme, overlayi, navigacija i podaci. Mjereno: sideEffects: false spustio je ulaz koji uvozi samo Box sa 253.075 B na 241.309 B. Zamka stoji zapisana pored: @cds/tokens se ne smije tako označiti, jer se tad reset.css izbaci i raspored se sruši bez ijedne greške.

    253.075 B → 241.309 B
  5. Nijedna komponenta ne zna svoju boju

    Samo ime tokena. Novi brend je novi set vrijednosti, ne novi kod. To je dokazano na ranijem proizvodu sa preko trideset bijelih labela; ovdje je arhitektura od prvog commita, a ne spašavanje.

    30+ labela, bez novog koda
DOKAZ — ISTI POZIV NA TRI PLATFORME
b768aa14a346
apps/web — Next.js 16, RSC
b768aa14a346
apps/spa — Vite SPA
b768aa14a346
apps/mobile — React Native 0.87
135
linija u jednom fajlu, bez native blizanca
Cijeli ekran za prijavu sastavljen je od Box, Button, Card, Input i Text — split se dogodio u primitivima. Identičan je poziv; omotač ostaje platformski.
GDJE ŽIVE BLIZANCI — 38 OD 74
primitives 27 blizanaca

Listovi koji prevode jedan element platforme i ništa više. Ovdje split pripada: mehanički je, ograničen i nevidljiv za sve iznad.

33 od 38 blizanaca ne uvozi nijednu drugu komponentu. To su listovi koji prevode jedan element platforme — div u View, input u TextInput — i ništa više.

Rezultat

74 komponente i 430 testova, katalog od 81 stranice sa tabelama propsa generisanim iz koda, i nijedan pattern bez dijeljene implementacije. Sistem je u upotrebi u našoj finansijskoj platformi i na ovom sajtu — ako želite znati radi li, gledate ga.

Šta bismo uradili drugačije

Pregledali smo svih 74 komponente i našli 188 nalaza koji se svode na tri korijenska uzroka — a sva tri prolaze cijeli lanac alata. Taj pregled je trebao biti na 30 komponenti, ne na 74: isti uzroci su već bili prisutni i bili bi red veličine jeftiniji za ispravku. Sve 188 je ispravljeno; pokrivenost za aria-label i tabindex je još otvorena.

Metoda i tri uzroka opisani su u zasebnom tekstu na blogu.

Srodno
Svih 18 projekata
  • TypeScript
  • Next.js 16
  • React Native 0.87
  • Vite
  • styled-components
  • pnpm workspaces
  • Figma MCP
  • custom ESLint plugin

Web i mobilni vam se već razilaze?

Kontaktirajte nas

Sistemi koji ne smiju stati — od arhitekture do produkcije.

© 2026 Micro Tech, Sarajevo