workspace Todo id "workspace:todo" revision "workspace:todo@capabilities-v1" commit "0000000000000000000000000000000000000001" { atom Project id "atom:project" doc "A named collection of tasks."; atom Task id "atom:task" doc "A unit of work."; atom ProjectReactComponent id "atom:project-react-component" doc "A persisted Web Studio presentation of a Project."; atom TaskReactComponent id "atom:task-react-component" doc "A persisted Web Studio presentation of a Task."; atom WebStudioCanvas id "atom:org.quixos.web-studio:canvas" doc "A spatial Web Studio surface."; atom WebStudioCanvasPlacement id "atom:org.quixos.web-studio:canvas-placement" doc "One presentation of an object on a Web Studio canvas."; interface Named id "interface:named" revision "interface:named@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-named.git"; commit "1688a4a5fb9c1a268363fdec354068e8b0943fab"; } { value name id "member:named:name" : string { get id "operation:named:name:get"; set id "operation:named:name:set"; } } interface TaskData id "interface:task-data" revision "interface:task-data@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-task-data.git"; commit "11764ce87ca7bc2ebe2a76650073565998a0e3fa"; } { value title id "member:task-data:title" : string { get id "operation:task-data:title:get"; set id "operation:task-data:title:set"; } value status id "member:task-data:status" : string { get id "operation:task-data:status:get"; set id "operation:task-data:status:set"; } value priority id "member:task-data:priority" : string { get id "operation:task-data:priority:get"; set id "operation:task-data:priority:set"; } value notes id "member:task-data:notes" : string { get id "operation:task-data:notes:get"; set id "operation:task-data:notes:set"; } value dueDate id "member:task-data:due-date" : string { get id "operation:task-data:due-date:get"; set id "operation:task-data:due-date:set"; } value energy id "member:task-data:energy" : string { get id "operation:task-data:energy:get"; set id "operation:task-data:energy:set"; } } interface ProjectTasks id "interface:project-tasks" revision "interface:project-tasks@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-project-tasks.git"; commit "d5b417244ff86eedaf04ea7b0467c193d2a5d0aa"; } { relation tasks id "member:project-tasks:tasks" : many-unique atom Task ordered { resolve id "operation:project-tasks:tasks:resolve"; connect id "operation:project-tasks:tasks:connect"; disconnect id "operation:project-tasks:tasks:disconnect"; } } interface ProjectActions id "interface:project-actions" revision "interface:project-actions@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-project-actions.git"; commit "3b37ec2f4a1f8fcc69db775214054248982f4212"; } { operation addTask id "member:project-actions:add-task" : string -> atom-ref { call id "operation:project-actions:add-task"; } } interface TaskActions id "interface:task-actions" revision "interface:task-actions@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-task-actions.git"; commit "5dc8ae3e88845c3d7ff2fc02cd317b33c25c7152"; } { operation complete id "member:task-actions:complete" : unit -> string { call id "operation:task-actions:complete"; } operation reopen id "member:task-actions:reopen" : unit -> string { call id "operation:task-actions:reopen"; } operation archive id "member:task-actions:archive" : unit -> string { call id "operation:task-actions:archive"; } } interface DisplayLabel id "interface:display-label" revision "interface:display-label@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-display-label.git"; commit "bafeb09a3343ff59768b679f46bd7d1f4d6a23d2"; } { value label id "member:display-label:label" : string { get id "operation:display-label:label:get"; watch start id "operation:display-label:label:watch-start" stop id "operation:display-label:label:watch-stop"; } } interface TaskCount id "interface:task-count" revision "interface:task-count@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-task-count.git"; commit "b3e159867dfd5da52c19cf1a2e8a27b6ea094080"; } { value count id "member:task-count:count" : uint32 { get id "operation:task-count:count:get"; watch start id "operation:task-count:count:watch-start" stop id "operation:task-count:count:watch-stop"; } } interface WebStudioCreateable id "interface:org.quixos.web-studio.createable" revision "interface:org.quixos.web-studio.createable@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-createable.git"; commit "9fc54455ee2effa03b276f103741c0639bf60179"; } {} interface WebStudioReactComponent id "interface:org.quixos.web-studio.react-component" revision "interface:org.quixos.web-studio.react-component@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-react-component.git"; commit "a94e1751e134563850860af61d9fe0bf5e4eea45"; } { value source id "member:org.quixos.web-studio.react-component:source" : string { get id "operation:org.quixos.web-studio.react-component:source:get"; } value props id "member:org.quixos.web-studio.react-component:props" : message "org.quixos.web-studio.ReactProps" { get id "operation:org.quixos.web-studio.react-component:props:get"; watch start id "operation:org.quixos.web-studio.react-component:props:watch-start" stop id "operation:org.quixos.web-studio.react-component:props:watch-stop"; } } interface WebStudioHasReactComponent id "interface:org.quixos.web-studio.has-react-component" revision "interface:org.quixos.web-studio.has-react-component@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-has-react-component.git"; commit "ce198952f8907431208aff3b470b6168fe42e6a6"; } { relation component id "member:org.quixos.web-studio.has-react-component:component" : optional-one interface WebStudioReactComponent { resolve id "operation:org.quixos.web-studio.has-react-component:component:resolve"; } } interface WebStudioCanvas id "interface:org.quixos.web-studio.canvas" revision "interface:org.quixos.web-studio.canvas@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-canvas.git"; commit "4fe8520662f12a19bacc0b003d8446a086718a16"; } { value name id "member:org.quixos.web-studio.canvas:name" : string { get id "operation:org.quixos.web-studio.canvas:name:get"; set id "operation:org.quixos.web-studio.canvas:name:set"; } relation placements id "member:org.quixos.web-studio.canvas:placements" : many-unique interface WebStudioCanvasPlacement ordered { resolve id "operation:org.quixos.web-studio.canvas:placements:resolve"; } } interface WebStudioCanvasPlacement id "interface:org.quixos.web-studio.canvas-placement" revision "interface:org.quixos.web-studio.canvas-placement@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-canvas-placement.git"; commit "ee3333a4b88cd604fb92f5cdbcbdf73a4be5d435"; } { value x id "member:org.quixos.web-studio.canvas-placement:x" : double { get id "operation:org.quixos.web-studio.canvas-placement:x:get"; set id "operation:org.quixos.web-studio.canvas-placement:x:set"; } value y id "member:org.quixos.web-studio.canvas-placement:y" : double { get id "operation:org.quixos.web-studio.canvas-placement:y:get"; set id "operation:org.quixos.web-studio.canvas-placement:y:set"; } value width id "member:org.quixos.web-studio.canvas-placement:width" : double { get id "operation:org.quixos.web-studio.canvas-placement:width:get"; set id "operation:org.quixos.web-studio.canvas-placement:width:set"; } value height id "member:org.quixos.web-studio.canvas-placement:height" : double { get id "operation:org.quixos.web-studio.canvas-placement:height:get"; set id "operation:org.quixos.web-studio.canvas-placement:height:set"; } value z id "member:org.quixos.web-studio.canvas-placement:z" : int32 { get id "operation:org.quixos.web-studio.canvas-placement:z:get"; set id "operation:org.quixos.web-studio.canvas-placement:z:set"; } relation subject id "member:org.quixos.web-studio.canvas-placement:subject" : exactly-one interface WebStudioPlaceable { resolve id "operation:org.quixos.web-studio.canvas-placement:subject:resolve"; connect id "operation:org.quixos.web-studio.canvas-placement:subject:connect"; disconnect id "operation:org.quixos.web-studio.canvas-placement:subject:disconnect"; } relation canvas id "member:org.quixos.web-studio.canvas-placement:canvas" : exactly-one interface WebStudioCanvas { resolve id "operation:org.quixos.web-studio.canvas-placement:canvas:resolve"; connect id "operation:org.quixos.web-studio.canvas-placement:canvas:connect"; disconnect id "operation:org.quixos.web-studio.canvas-placement:canvas:disconnect"; } } interface WebStudioPlaceable id "interface:org.quixos.web-studio.placeable" revision "interface:org.quixos.web-studio.placeable@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-placeable.git"; commit "4c58a7ed46efcde24b822a40257fa503794301c9"; } { relation placements id "member:org.quixos.web-studio.placeable:placements" : many-unique interface WebStudioCanvasPlacement ordered { resolve id "operation:org.quixos.web-studio.placeable:placements:resolve"; } } interface WebStudioSearchable id "interface:org.quixos.web-studio.searchable" revision "interface:org.quixos.web-studio.searchable@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-searchable.git"; commit "c9b0542006d14544208dac4377736d082862fc7a"; } { value document id "member:org.quixos.web-studio.searchable:document" : message "org.quixos.web-studio.SearchDocument" { get id "operation:org.quixos.web-studio.searchable:document:get"; watch start id "operation:org.quixos.web-studio.searchable:document:watch-start" stop id "operation:org.quixos.web-studio.searchable:document:watch-stop"; } } package TodoRuntime id "package:todo-runtime" revision "package:todo-runtime@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-todo-runtime.git"; commit "7949045ec2af6fbacaa1e40cc0739e6599dc9d64"; } { operation complete id "export:todo-runtime:complete" : unit -> string mode call receiver atom Task requires { state status id "port:todo-actions:status" : string [read, write]; }; operation reopen id "export:todo-runtime:reopen" : unit -> string mode call receiver atom Task requires { state status id "port:todo-actions:status" : string [read, write]; }; operation archive id "export:todo-runtime:archive" : unit -> string mode call receiver atom Task requires { state status id "port:todo-actions:status" : string [read, write]; }; operation displayLabelGet id "export:todo-runtime:display-label-get" : unit -> string mode call receiver atom Task requires { state title id "port:todo-label:title" : string [read]; state status id "port:todo-label:status" : string [read]; state priority id "port:todo-label:priority" : string [read]; }; operation displayLabelWatch id "export:todo-runtime:display-label-watch" : unit -> watch-handle mode watch-start emits string receiver atom Task requires { state title id "port:todo-label:title" : string [read]; state status id "port:todo-label:status" : string [read]; state priority id "port:todo-label:priority" : string [read]; }; operation displayLabelWatchStop id "export:todo-runtime:display-label-watch-stop" : watch-handle -> unit mode watch-stop receiver atom Task; operation searchDocumentGet id "export:todo-runtime:search-document-get" : unit -> message "org.quixos.web-studio.SearchDocument" mode call receiver atom Task requires { state title id "port:todo-search:title" : string [read]; state status id "port:todo-search:status" : string [read]; state priority id "port:todo-search:priority" : string [read]; state dueDate id "port:todo-search:due-date" : string [read]; }; operation searchDocumentWatch id "export:todo-runtime:search-document-watch" : unit -> watch-handle mode watch-start emits message "org.quixos.web-studio.SearchDocument" receiver atom Task requires { state title id "port:todo-search:title" : string [read]; state status id "port:todo-search:status" : string [read]; state priority id "port:todo-search:priority" : string [read]; state dueDate id "port:todo-search:due-date" : string [read]; }; operation searchDocumentWatchStop id "export:todo-runtime:search-document-watch-stop" : watch-handle -> unit mode watch-stop receiver atom Task; constructor createTask id "export:todo-runtime:create-task" constructs Task : string requires { state title id "port:todo-constructor:title" : string [write]; }; } package ProjectRuntime id "package:project-runtime" revision "package:project-runtime@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-project-runtime.git"; commit "1b13c6d19e0e3590a6ff10d530a6e170c70a3d17"; } { constructor createProject id "export:project-runtime:create-project" constructs Project : unit; operation addTask id "export:project-runtime:add-task" : string -> atom-ref mode call receiver atom Project requires { edge tasks id "port:project-actions:tasks" : many-unique atom Task [connect]; constructor task id "port:project-actions:task-constructor" : Task; }; operation taskCountGet id "export:project-runtime:task-count-get" : unit -> uint32 mode call receiver atom Project requires { edge tasks id "port:project-count:tasks" : many-unique atom Task [resolve]; }; operation taskCountWatch id "export:project-runtime:task-count-watch" : unit -> watch-handle mode watch-start emits uint32 receiver atom Project requires { edge tasks id "port:project-count:tasks" : many-unique atom Task [resolve]; }; operation taskCountWatchStop id "export:project-runtime:task-count-watch-stop" : watch-handle -> unit mode watch-stop receiver atom Project; operation searchDocumentGet id "export:project-runtime:search-document-get" : unit -> message "org.quixos.web-studio.SearchDocument" mode call receiver atom Project requires { state name id "port:project-search:name" : string [read]; edge tasks id "port:project-search:tasks" : many-unique atom Task [resolve]; }; operation searchDocumentWatch id "export:project-runtime:search-document-watch" : unit -> watch-handle mode watch-start emits message "org.quixos.web-studio.SearchDocument" receiver atom Project requires { state name id "port:project-search:name" : string [read]; edge tasks id "port:project-search:tasks" : many-unique atom Task [resolve]; }; operation searchDocumentWatchStop id "export:project-runtime:search-document-watch-stop" : watch-handle -> unit mode watch-stop receiver atom Project; } package ProjectReactRuntime id "package:project-react-runtime" revision "package:project-react-runtime@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-project-react-runtime.git"; commit "8ceff8bb3a18da8bb66d87626374440005714ef7"; } { constructor createComponent id "export:project-react-runtime:create-component" constructs ProjectReactComponent : atom-ref; operation sourceGet id "export:project-react-runtime:source-get" : unit -> string mode call receiver atom ProjectReactComponent; operation propsGet id "export:project-react-runtime:props-get" : unit -> message "org.quixos.web-studio.ReactProps" mode call receiver atom ProjectReactComponent requires { edge subject id "port:project-react:subject" : exactly-one atom Project [resolve]; state name id "port:project-react:name" : string [read]; edge tasks id "port:project-react:tasks" : many-unique atom Task [resolve]; }; operation propsWatch id "export:project-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits message "org.quixos.web-studio.ReactProps" receiver atom ProjectReactComponent requires { edge subject id "port:project-react:subject" : exactly-one atom Project [resolve]; state name id "port:project-react:name" : string [read]; edge tasks id "port:project-react:tasks" : many-unique atom Task [resolve]; }; operation propsWatchStop id "export:project-react-runtime:props-watch-stop" : watch-handle -> unit mode watch-stop receiver atom ProjectReactComponent; } package TodoReactRuntime id "package:todo-react-runtime" revision "package:todo-react-runtime@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-todo-react-runtime.git"; commit "e7ee3468062da87f03bb3dc1aed439c9be8c313f"; } { constructor createComponent id "export:todo-react-runtime:create-component" constructs TaskReactComponent : atom-ref; operation sourceGet id "export:todo-react-runtime:source-get" : unit -> string mode call receiver atom TaskReactComponent; operation propsGet id "export:todo-react-runtime:props-get" : unit -> message "org.quixos.web-studio.ReactProps" mode call receiver atom TaskReactComponent requires { edge subject id "port:todo-react:subject" : exactly-one atom Task [resolve]; state title id "port:todo-react:title" : string [read]; state status id "port:todo-react:status" : string [read]; state priority id "port:todo-react:priority" : string [read]; state notes id "port:todo-react:notes" : string [read]; state dueDate id "port:todo-react:due-date" : string [read]; state energy id "port:todo-react:energy" : string [read]; }; operation propsWatch id "export:todo-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits message "org.quixos.web-studio.ReactProps" receiver atom TaskReactComponent requires { edge subject id "port:todo-react:subject" : exactly-one atom Task [resolve]; state title id "port:todo-react:title" : string [read]; state status id "port:todo-react:status" : string [read]; state priority id "port:todo-react:priority" : string [read]; state notes id "port:todo-react:notes" : string [read]; state dueDate id "port:todo-react:due-date" : string [read]; state energy id "port:todo-react:energy" : string [read]; }; operation propsWatchStop id "export:todo-react-runtime:props-watch-stop" : watch-handle -> unit mode watch-stop receiver atom TaskReactComponent; } package WebStudioCanvasRuntime id "package:org.quixos.web-studio:canvas-runtime" revision "package:org.quixos.web-studio:canvas-runtime@1" source { repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-canvas-runtime.git"; commit "7ce8058f40dd8a2971bc4f0883e50f655738095a"; } { constructor createCanvas id "export:org.quixos.web-studio.canvas-runtime:create-canvas" constructs WebStudioCanvas : unit; constructor createPlacement id "export:org.quixos.web-studio.canvas-runtime:create-placement" constructs WebStudioCanvasPlacement : message "org.quixos.web-studio.CreateCanvasPlacement" requires { state x id "port:web-studio-placement-constructor:x" : double [write]; state y id "port:web-studio-placement-constructor:y" : double [write]; state width id "port:web-studio-placement-constructor:width" : double [write]; state height id "port:web-studio-placement-constructor:height" : double [write]; state z id "port:web-studio-placement-constructor:z" : int32 [write]; edge canvas id "port:web-studio-placement-constructor:canvas" : exactly-one interface WebStudioCanvas [connect]; edge subject id "port:web-studio-placement-constructor:subject" : exactly-one interface WebStudioPlaceable [connect]; }; } shared state ProjectName id "slot:project:name" on Project : string policy optimistic-register default "Untitled project"; shared state TaskTitle id "slot:task:title" on Task : string policy optimistic-register default "Untitled task"; shared state TaskStatus id "slot:task:status" on Task : string policy optimistic-register default "OPEN"; shared state TaskPriority id "slot:task:priority" on Task : string policy optimistic-register default "NORMAL"; shared state TaskNotes id "slot:task:notes" on Task : string policy crdt(string) default ""; shared state TaskDueDate id "slot:task:due-date" on Task : string policy optimistic-register default ""; shared state TaskEnergy id "slot:task:energy" on Task : string policy optimistic-register default "MEDIUM"; shared state WebStudioCanvasName id "slot:org.quixos.web-studio.canvas:name" on WebStudioCanvas : string policy optimistic-register default "Hearth"; shared state WebStudioPlacementX id "slot:org.quixos.web-studio.canvas-placement:x" on WebStudioCanvasPlacement : double policy optimistic-register default 0; shared state WebStudioPlacementY id "slot:org.quixos.web-studio.canvas-placement:y" on WebStudioCanvasPlacement : double policy optimistic-register default 0; shared state WebStudioPlacementWidth id "slot:org.quixos.web-studio.canvas-placement:width" on WebStudioCanvasPlacement : double policy optimistic-register default 420; shared state WebStudioPlacementHeight id "slot:org.quixos.web-studio.canvas-placement:height" on WebStudioCanvasPlacement : double policy optimistic-register default 320; shared state WebStudioPlacementZ id "slot:org.quixos.web-studio.canvas-placement:z" on WebStudioCanvasPlacement : int32 policy optimistic-register default 0; shared edge ProjectTaskEdge id "edge:project:tasks" { atom Project projection tasks id "projection:project:tasks" many-unique ordered; atom Task projection project id "projection:task:project" optional-one; } shared edge ProjectComponentEdge id "edge:project:web-studio-component" { atom ProjectReactComponent projection subject id "projection:project-component:subject" exactly-one; atom Project projection component id "projection:project:component" optional-one; } shared edge TaskComponentEdge id "edge:task:web-studio-component" { atom TaskReactComponent projection subject id "projection:task-component:subject" exactly-one; atom Task projection component id "projection:task:component" optional-one; } shared edge WebStudioCanvasPlacementEdge id "edge:org.quixos.web-studio:canvas-placements" { atom WebStudioCanvasPlacement projection canvas id "projection:org.quixos.web-studio.canvas-placement:canvas" exactly-one; interface WebStudioCanvas projection placements id "projection:org.quixos.web-studio.canvas:placements" many-unique ordered; } shared edge WebStudioPlacementSubjectEdge id "edge:org.quixos.web-studio:placement-subject" { atom WebStudioCanvasPlacement projection subject id "projection:org.quixos.web-studio.canvas-placement:subject" exactly-one; interface WebStudioPlaceable projection placements id "projection:org.quixos.web-studio.placeable:placements" many-unique ordered; } conform WebStudioCanvas as WebStudioCanvas { bind name.get to state WebStudioCanvasName.read; bind name.set to state WebStudioCanvasName.write; bind placements.resolve to edge WebStudioCanvasPlacementEdge.placements.resolve; } conform WebStudioCanvasPlacement as WebStudioCanvasPlacement { bind x.get to state WebStudioPlacementX.read; bind x.set to state WebStudioPlacementX.write; bind y.get to state WebStudioPlacementY.read; bind y.set to state WebStudioPlacementY.write; bind width.get to state WebStudioPlacementWidth.read; bind width.set to state WebStudioPlacementWidth.write; bind height.get to state WebStudioPlacementHeight.read; bind height.set to state WebStudioPlacementHeight.write; bind z.get to state WebStudioPlacementZ.read; bind z.set to state WebStudioPlacementZ.write; bind subject.resolve to edge WebStudioPlacementSubjectEdge.subject.resolve; bind subject.connect to edge WebStudioPlacementSubjectEdge.subject.connect; bind subject.disconnect to edge WebStudioPlacementSubjectEdge.subject.disconnect; bind canvas.resolve to edge WebStudioCanvasPlacementEdge.canvas.resolve; bind canvas.connect to edge WebStudioCanvasPlacementEdge.canvas.connect; bind canvas.disconnect to edge WebStudioCanvasPlacementEdge.canvas.disconnect; } conform Project as WebStudioCreateable {} conform Project as WebStudioPlaceable { bind placements.resolve to edge WebStudioPlacementSubjectEdge.placements.resolve; } conform Project as WebStudioSearchable { bind document.get to package ProjectRuntime.searchDocumentGet with { name to state ProjectName; tasks to edge ProjectTaskEdge.tasks; }; bind document.watch-start to package ProjectRuntime.searchDocumentWatch with { name to state ProjectName; tasks to edge ProjectTaskEdge.tasks; }; bind document.watch-stop to package ProjectRuntime.searchDocumentWatchStop; } conform Project as WebStudioHasReactComponent { bind component.resolve to edge ProjectComponentEdge.component.resolve; materialize component if absent using constructor ProjectReactComponent via edge ProjectComponentEdge.subject; } conform Project as Named { bind name.get to state ProjectName.read; bind name.set to state ProjectName.write; } conform Project as ProjectTasks { bind tasks.resolve to edge ProjectTaskEdge.tasks.resolve; bind tasks.connect to edge ProjectTaskEdge.tasks.connect; bind tasks.disconnect to edge ProjectTaskEdge.tasks.disconnect; } conform Project as ProjectActions { bind addTask.call to package ProjectRuntime.addTask with { tasks to edge ProjectTaskEdge.tasks; task to constructor Task; }; } conform Project as TaskCount { bind count.get to package ProjectRuntime.taskCountGet with { tasks to edge ProjectTaskEdge.tasks; }; bind count.watch-start to package ProjectRuntime.taskCountWatch with { tasks to edge ProjectTaskEdge.tasks; }; bind count.watch-stop to package ProjectRuntime.taskCountWatchStop; } conform ProjectReactComponent as WebStudioReactComponent { bind source.get to package ProjectReactRuntime.sourceGet; bind props.get to package ProjectReactRuntime.propsGet with { subject to edge ProjectComponentEdge.subject; name to state ProjectName via edge ProjectComponentEdge.subject; tasks to edge ProjectTaskEdge.tasks via edge ProjectComponentEdge.subject; }; bind props.watch-start to package ProjectReactRuntime.propsWatch with { subject to edge ProjectComponentEdge.subject; name to state ProjectName via edge ProjectComponentEdge.subject; tasks to edge ProjectTaskEdge.tasks via edge ProjectComponentEdge.subject; }; bind props.watch-stop to package ProjectReactRuntime.propsWatchStop; } conform Task as WebStudioHasReactComponent { bind component.resolve to edge TaskComponentEdge.component.resolve; materialize component if absent using constructor TaskReactComponent via edge TaskComponentEdge.subject; } conform Task as WebStudioPlaceable { bind placements.resolve to edge WebStudioPlacementSubjectEdge.placements.resolve; } conform Task as WebStudioSearchable { bind document.get to package TodoRuntime.searchDocumentGet with { title to state TaskTitle; status to state TaskStatus; priority to state TaskPriority; dueDate to state TaskDueDate; }; bind document.watch-start to package TodoRuntime.searchDocumentWatch with { title to state TaskTitle; status to state TaskStatus; priority to state TaskPriority; dueDate to state TaskDueDate; }; bind document.watch-stop to package TodoRuntime.searchDocumentWatchStop; } conform Task as TaskData { bind title.get to state TaskTitle.read; bind title.set to state TaskTitle.write; bind status.get to state TaskStatus.read; bind status.set to state TaskStatus.write; bind priority.get to state TaskPriority.read; bind priority.set to state TaskPriority.write; bind notes.get to state TaskNotes.read; bind notes.set to state TaskNotes.write; bind dueDate.get to state TaskDueDate.read; bind dueDate.set to state TaskDueDate.write; bind energy.get to state TaskEnergy.read; bind energy.set to state TaskEnergy.write; } conform Task as TaskActions { bind complete.call to package TodoRuntime.complete with { status to state TaskStatus; }; bind reopen.call to package TodoRuntime.reopen with { status to state TaskStatus; }; bind archive.call to package TodoRuntime.archive with { status to state TaskStatus; }; } conform Task as DisplayLabel { bind label.get to package TodoRuntime.displayLabelGet with { title to state TaskTitle; status to state TaskStatus; priority to state TaskPriority; }; bind label.watch-start to package TodoRuntime.displayLabelWatch with { title to state TaskTitle; status to state TaskStatus; priority to state TaskPriority; }; bind label.watch-stop to package TodoRuntime.displayLabelWatchStop; } conform TaskReactComponent as WebStudioReactComponent { bind source.get to package TodoReactRuntime.sourceGet; bind props.get to package TodoReactRuntime.propsGet with { subject to edge TaskComponentEdge.subject; title to state TaskTitle via edge TaskComponentEdge.subject; status to state TaskStatus via edge TaskComponentEdge.subject; priority to state TaskPriority via edge TaskComponentEdge.subject; notes to state TaskNotes via edge TaskComponentEdge.subject; dueDate to state TaskDueDate via edge TaskComponentEdge.subject; energy to state TaskEnergy via edge TaskComponentEdge.subject; }; bind props.watch-start to package TodoReactRuntime.propsWatch with { subject to edge TaskComponentEdge.subject; title to state TaskTitle via edge TaskComponentEdge.subject; status to state TaskStatus via edge TaskComponentEdge.subject; priority to state TaskPriority via edge TaskComponentEdge.subject; notes to state TaskNotes via edge TaskComponentEdge.subject; dueDate to state TaskDueDate via edge TaskComponentEdge.subject; energy to state TaskEnergy via edge TaskComponentEdge.subject; }; bind props.watch-stop to package TodoReactRuntime.propsWatchStop; } constructor Project to ProjectRuntime.createProject; constructor Task to TodoRuntime.createTask with { title to state TaskTitle; }; constructor ProjectReactComponent to ProjectReactRuntime.createComponent; constructor TaskReactComponent to TodoReactRuntime.createComponent; constructor WebStudioCanvas to WebStudioCanvasRuntime.createCanvas; constructor WebStudioCanvasPlacement to WebStudioCanvasRuntime.createPlacement with { x to state WebStudioPlacementX; y to state WebStudioPlacementY; width to state WebStudioPlacementWidth; height to state WebStudioPlacementHeight; z to state WebStudioPlacementZ; canvas to edge WebStudioCanvasPlacementEdge.canvas; subject to edge WebStudioPlacementSubjectEdge.subject; }; }