Popoln upravljalnik nalog v eni sami datoteki .orb.
aplikacija std-todo "1.0.0"
"Todo list with Add (modal) and Remove (confirmation) flows, closed-circuit fetch + persist"
orbitala TodoOrbital {
uporablja Confirmation iz "std/behaviors/std-confirmation"
uporablja Modal iz "std/behaviors/std-modal"
tip TodoLoaded = Dogodek { data : [Todo] } "Fired when the Todo collection finishes loading"
tip TodoLoadFailed = Dogodek { error : niz, code : niz } "Fired when the Todo collection fails to load"
entiteta Todo [trajno: todos] {
id : niz!
name : niz!
description : niz
status : "active" | "inactive" | "pending" = active
createdAt : niz
pendingId : niz = ""
}
znacilnost TodoBrowse -> Todo [interakcija, zbirka] {
zacetno: loading
stanje loading {
ZACETEK -> loading
(pridobi Todo {
emit: { failure: TodoLoadFailed, success: TodoLoaded }
})
(izrisi-vmesnik main {
align: center
children: [{ type: spinner }, {
color: muted
content: "Loading todos…"
type: typography
variant: caption
}]
className: py-12
direction: vertical
gap: md
type: stack
})
TodoLoaded -> browsing
(izrisi-vmesnik main {
children: [{
children: [{
children: [{ name: list-checks, type: icon }, {
content: Todos
type: typography
variant: h2
}]
direction: horizontal
gap: md
type: stack
}, {
action: ADD_TODO
icon: plus
label: "Add Todo"
type: button
variant: primary
}]
direction: horizontal
gap: md
justify: between
type: stack
}, { type: divider }, {
entity: ?data
fields: [{
icon: check-square
label: Name
name: name
variant: h4
}, {
label: Description
name: description
variant: caption
}, {
label: Status
name: status
variant: badge
}]
itemActions: [{
event: REMOVE_TODO
label: Remove
variant: danger
}]
type: data-grid
}]
className: "max-w-5xl mx-auto w-full"
direction: vertical
gap: lg
type: stack
})
TodoLoadFailed -> error
(izrisi-vmesnik main {
align: center
children: [{
color: destructive
name: alert-triangle
type: icon
}, {
content: "Failed to load todos"
type: typography
variant: h3
}, {
color: muted
content: ?error
type: typography
variant: body
}, {
action: INIT
icon: rotate-ccw
label: Retry
type: button
variant: primary
}]
className: py-12
direction: vertical
gap: md
type: stack
})
}
stanje browsing {
ZACETEK -> loading
(pridobi Todo {
emit: { failure: TodoLoadFailed, success: TodoLoaded }
})
(izrisi-vmesnik main { type: spinner })
}
stanje error {
ZACETEK -> loading
(pridobi Todo {
emit: { failure: TodoLoadFailed, success: TodoLoaded }
})
(izrisi-vmesnik main { type: spinner })
}
oddaja {
TodoLoaded
TodoLoadFailed
ADD_TODO -> external {
id : niz
row : Todo
}
REMOVE_TODO -> external {
id : niz!
name : niz
}
}
poslusa {
TodoLoadFailed {
error : niz
code : niz
}
TodoPersistor.TODO_ADDED -> ZACETEK
TodoPersistor.TODO_REMOVED -> ZACETEK
}
}
;; Add: configured via `config`, no effects overrides.
znacilnost TodoAdd = Modal.traits.ModalRecordModal -> Todo {
dogodki {
OPEN: ADD_TODO
SAVE: TODO_ADDED
}
konfiguracija {
icon: plus-circle
title: "Add Todo"
fields: (name description status)
mode: create
}
poslusa {
TodoBrowse.ADD_TODO -> ADD_TODO
}
}
;; Remove: confirmation dialog.
znacilnost TodoRemove = Confirmation.traits.ConfirmActionConfirmation -> Todo {
dogodki {
REQUEST: REMOVE_TODO
CONFIRM: TODO_REMOVED
}
konfiguracija {
icon: alert-triangle
title: "Remove Todo"
alertMessage: "Are you sure you want to remove this todo? This cannot be undone."
confirmLabel: Remove
}
poslusa {
TodoBrowse.REMOVE_TODO -> REMOVE_TODO
}
}
;; Coordinator: side-effects for Add / Remove. Listens to the bound atoms'
;; emits and runs the actual persist calls.
znacilnost TodoPersistor -> Todo [zivljenjskiCikel, primerek] {
zacetno: idle
stanje idle {
ZACETEK -> idle
DO_ADD -> idle
(shrani create Todo ?data)
(oddaj TODO_ADDED { id: ?data.id })
DO_REMOVE -> idle
(shrani delete Todo ?id)
(oddaj TODO_REMOVED { id: ?id })
}
oddaja {
TODO_ADDED -> external {
id : niz!
}
TODO_REMOVED -> external {
id : niz!
}
}
poslusa {
DO_ADD {
data : Todo
}
DO_REMOVE {
id : niz!
}
TodoAdd.TODO_ADDED -> DO_ADD
TodoRemove.TODO_REMOVED -> DO_REMOVE
}
}
stran "/todos" kot TodoPage -> TodoBrowse, TodoAdd, TodoRemove, TodoPersistor
}Prevajalnik preveri vsak možen zaslon vaše aplikacije. Če se prevede, uporabniki nikoli ne naletijo na pokvarjeno ali manjkajočo stran.
En model .orb se prevede v spletno, mobilno, namizno ali katero koli prihodnjo platformo.
Strukturiran, formalen in kompakten. Modeli umetne inteligence generirajo veljavne programe .orb bolj zanesljivo kot poljubno kodo.