Skip to main content

Vzorci

Most med deklarativnimi programi in UI komponentami


Pregled

Sistem vzorcev povezuje deklarativne programe z dejanskimi UI komponentami. Ko ucinek render-ui lastnosti doloci tip vzorca, sistem uporablja tri kljucne mehanizme za:

  1. Preverjanje lastnosti vzorca glede na program
  2. Preslikavo vzorca na konkretno komponento
  3. Uveljavljanje pogodbe dogodkov za skladnost z zaprtim krogom
Program (render-ui)  →  Register vzorcev  →  Preslikava komponent  →  Komponenta lupine

Pogodba dogodkov

Preverjanje zaprtega kroga

Register vzorcev

Register vzorcev je vir resnice za vse razpolozljive vzorce. Vsak vzorec definira:

{
"entity-table": {
"type": "entity-table",
"category": "display",
"description": "Data table with columns and sorting",
"suggestedFor": ["data-dense views", "comparisons", "admin panels"],
"typicalSize": "medium",
"componentHints": ["row-action:*", "table-cell", "sort-header"],
"implements": "EntityBoundPatternProps",
"propsSchema": {
"columns": {
"required": true,
"types": ["array"],
"description": "Columns can be Column objects or simple string field names"
},
"entity": {
"types": ["string", "array"],
"description": "Entity name for auto-fetch OR data array"
},
"itemActions": {
"types": ["array"],
"description": "Item actions from generated code - maps to rowActions"
}
},
"componentMapping": {
"component": "DataTable",
"eventContract": { }
}
}
}

Lastnosti vzorca

LastnostOpis
typeEdinstven identifikator vzorca (uporabljen v render-ui)
categorySkupina: display, form, header, filter, navigation, layout, game, state
descriptionCloveku berljiv opis
suggestedForNamigi za primere uporabe za generiranje z LLM
typicalSizeVelikost UI: tiny, small, medium, large
componentHintsVzorci pod-komponent, ki jih ta vzorec lahko uporablja
implementsVmesnik, ki ga komponenta implementira (npr. EntityBoundPatternProps)
propsSchemaDefinicije lastnosti s tipi in zahtevami
componentMappingPreslikava na komponento lupine in pogodbo dogodkov

Kategorije vzorcev

KategorijaPrimeriNamen
displayentity-table, entity-list, entity-cards, statsPredstavitev podatkov
formform, form-section, form-fieldsVnos podatkov
headerpage-header, title-onlyNaslovi strani in akcije
filtersearch-bar, filter-group, search-inputFiltriranje podatkov
navigationtabs, breadcrumb, wizard-progress, paginationNavigacijski kontrolniki
layoutmodal, drawer, master-detail, dashboard-gridStruktura strani
gamegame-canvas, game-hud, game-controlsElementi igralnega UI
stateempty-state, loading-state, error-statePovratne informacije o stanju

Preslikava komponent

Preslikava komponent povezuje tipe vzorcev s komponentami lupine:

{
"mappings": {
"entity-table": {
"component": "DataTable",
"category": "display"
},
"form": {
"component": "Form",
"category": "form"
},
"page-header": {
"component": "PageHeader",
"category": "header"
}
}
}

Lastnosti preslikave

LastnostOpis
componentIme komponente v lupini
categoryEnako kot kategorija vzorca
clientNeobvezno - specificna komponenta za odjemalca
deprecatedNeobvezno - oznaci vzorec kot zastarel
replacedByNeobvezno - nadomestni vzorec za zastarele

Pogodbe dogodkov

Pogodbe dogodkov definirajo, katere dogodke komponenta oddaja in zahteva. To je kljucno za preverjanje zaprtega kroga - zagotavljanje, da ima vsaka interakcija z UI ustrezen prehod avtomata stanj.

{
"contracts": {
"form": {
"emits": [
{
"event": "SAVE",
"trigger": "submit",
"payload": { "type": "FormData" }
},
{
"event": "CANCEL",
"trigger": "click",
"payload": { "type": "void" }
}
],
"requires": ["SAVE", "CANCEL"],
"entityAware": true
},
"entity-table": {
"emits": [
{
"event": "VIEW",
"trigger": "action",
"payload": { "type": "EntityRow" },
"optional": true
},
{
"event": "SELECT",
"trigger": "select",
"payload": { "type": "EntityRow" },
"optional": true
},
{
"event": "EDIT",
"trigger": "action",
"payload": { "type": "EntityRow" },
"optional": true
},
{
"event": "DELETE",
"trigger": "action",
"payload": { "type": "EntityRow" },
"optional": true
}
],
"requires": [],
"entityAware": true,
"configDriven": true
}
}
}

Lastnosti pogodbe

LastnostOpis
emitsDogodki, ki jih komponenta lahko oddaja
requiresDogodki, ki MORAJO imeti prehode (zaprt krog)
entityAwareKomponenta prejme podatke entitete
configDrivenDogodki so doloceni s konfiguracijo (npr. itemActions)

Definicija dogodka

LastnostOpis
eventIme dogodka (npr. SAVE, CANCEL, SELECT)
triggerKaj sprozi dogodek: click, submit, change, action, close
payloadTip obremenitve: void, FormData, EntityRow ali prilagojena oblika
optionalCe je true, prehod ni obvezen

Integracija z zaprtim krogom

Pogodbe dogodkov poganjajo preverjanje zaprtega kroga:

  1. Obvezni dogodki: Ce requires: ["SAVE", "CANCEL"], preverjevalnik zagotovi, da obstajata prehoda za oba dogodka
  2. Prekrivni vzorci: modal in drawer zahtevata prehode CLOSE za preprecevanje obticanja UI stanj
  3. Konfiguracijski pogojeni dogodki: Za entity-table z itemActions: [{ event: "DELETE" }] preverjevalnik preveri obstoj prehoda DELETE

Zahteve za vmesnik komponent

Komponente, preslikane na vzorce, morajo implementirati dolocene vmesnike za sodelovanje v zaprtem krogu.

EntityBoundPatternProps

Za podatkovne vezane komponente (entity-table, entity-list, form itd.):

interface EntityBoundPatternProps {
entity?: string; // Ime tipa entitete
data?: unknown[]; // Polje podatkov
isLoading?: boolean; // Stanje nalaganja
error?: Error | null; // Stanje napake
}

Integracija z vodilom dogodkov

Vse interaktivne komponente morajo oddajati dogodke prek vodila dogodkov, ne notranjih povratnih klicev:

// PRAVILNO - uporablja vodilo dogodkov
const handleRowClick = (row: EntityRow) => {
eventBus.emit('UI:SELECT', { row });
};

// NAPACNO - notranje upravljanje stanja
const handleRowClick = (row: EntityRow) => {
setSelectedRow(row); // Prekine krog!
};

Vzorec lastnosti akcij

Komponente z nastavljivimi akcijami jih prejmejo kot lastnosti:

interface ActionablePatternProps {
actions?: Array<{
label: string;
event: string; // Dogodek za oddajanje
variant?: 'primary' | 'secondary' | 'danger';
icon?: string;
}>;
itemActions?: Array<{ // Za akcije na ravni vrstice
label: string;
event: string;
icon?: string;
}>;
}

Komponenta oddaja UI:{event}, ko se akcija sprozi, s cimer zakljuci krog nazaj do avtomata stanj.


Sistem oblikovanja

Sistem oblikovanja vsebuje dejanske implementacije komponent, na katere se vzorci preslikujejo.

Hierarhija komponent

RavenNamenPrimeri
AtomiNedeljivi UI elementiButton, Input, Badge, Icon, Spinner
MolekulePreproste sestavne komponenteSearchInput, Tabs, Breadcrumb, FilterGroup
OrganizmiKompleksne, samostojne komponenteDataTable, Form, PageHeader, ModalSlot
PredlogePostavitve na ravni straniSpecificne komponente za celotno stran

Uporaba vzorcev v programih

Ucinek render-ui

Vzorci se uporabljajo prek ucinka render-ui v prehodih lastnosti:

{
"from": "viewing",
"to": "viewing",
"event": "INIT",
"effects": [
["render-ui", "main", {
"type": "page-header",
"title": "Tasks",
"actions": [
{ "label": "Create Task", "event": "CREATE", "variant": "primary" }
]
}],
["render-ui", "main", {
"type": "entity-table",
"entity": "Task",
"columns": ["title", "status", "assignee"],
"itemActions": [
{ "label": "Edit", "event": "EDIT" },
{ "label": "Delete", "event": "DELETE", "variant": "danger" }
]
}]
]
}

Preverjanje lastnosti

Prevajalnik preverja lastnosti glede na propsSchema:

  1. Obvezne lastnosti morajo biti prisotne
  2. Tipi lastnosti morajo ustrezati dovoljenim tipom
  3. Neznane lastnosti generirajo opozorila

Povezovanje dogodkov

Za vsak dogodek iz action/itemAction:

  1. Komponenta oddaja UI:{EVENT} prek vodila dogodkov
  2. Kavelj useUIEvents ujame in poslje lastnosti
  3. Avtomat stanj obdela dogodek
  4. Ucinki se izvedejo, potencialno ponovno upodobijo

Razpolozljivi vzorci

Naslednji vzorci so na voljo takoj:

Prikazni vzorci

VzorecOpisPogoste lastnosti
entity-tablePodatkovna tabela s stolpci in razvrscanjementity, columns, itemActions
entity-listSeznamski pogled elementov entiteteentity, itemActions
entity-cardsMrezna postavitev kartic za entiteteentity, columns, itemActions
statsPrikaz statistik s karticamiitems
detail-viewPodrobnostni prikaz posamezne entiteteentity, fields

Obrazcni vzorci

VzorecOpisPogoste lastnosti
formCeloten obrazec s preverjanjementity, fields, layout
form-sectionSkupinska polja obrazcatitle, fields
form-fieldsVgrajena polja obrazcafields

Vzorci glave

VzorecOpisPogoste lastnosti
page-headerNaslov strani z akcijamititle, subtitle, actions
title-onlyPreprost prikaz naslovatitle

Vzorci filtrov

VzorecOpisPogoste lastnosti
search-barGlobalni vnos iskanjaplaceholder, entity
filter-groupFiltrirani gumbi/znackefilters
search-inputSamostojno polje iskanjaplaceholder
VzorecOpisPogoste lastnosti
tabsNavigacija z zavihkiitems, activeTab
breadcrumbSled drobicitems
wizard-progressKazalnik korakov za carovnikesteps, currentStep
paginationNavigacija po stranehpage, totalPages

Postavitveni vzorci

VzorecOpisPogoste lastnosti
modalPrekrivanje modalnega dialogatitle, children
drawerPrekrivanje stranskega panelatitle, position
master-detailDeljena postavitev pogledamaster, detail
dashboard-gridMrezna postavitev za pregledne plosceitems

Vzorci stanj

VzorecOpisPogoste lastnosti
empty-stateOznacitveni prostor za prazne podatketitle, description, action
loading-stateKazalnik nalaganjamessage
error-statePrikaz napakeerror, onRetry

Povzetek

Sistem vzorcev zagotavlja:

  1. Register vzorcev - Definira razpolozljive vzorce z lastnostmi, kategorijami in metapodatki
  2. Preslikava komponent - Povezuje tipe vzorcev s komponentami lupine
  3. Pogodbe dogodkov - Doloca, katere dogodke komponente oddajajo in zahtevajo
  4. Preverjanje zaprtega kroga - Zagotavlja, da imajo vse interakcije UI upravljalce avtomata stanj
  5. Sistem oblikovanja - Vsebuje dejanske implementacije komponent

Ta arhitektura zagotavlja, da programi ostanejo deklarativni, medtem ko prevajalnik obvladuje kompleksnost povezovanja komponent z dogodkovno vodenim sistemom avtomatov stanj.


Za vec podrobnosti o povezanih konceptih glej Lastnosti in Zaprt krog.