commit 6bb69046e5e58cca1b1437c7fef41ed4458d5a6e Author: Quixos Todo bootstrap Date: Sat Sep 5 10:18:09 2026 -0700 Bootstrap Todo workspace source root diff --git a/quixos.lock b/quixos.lock new file mode 100644 index 0000000..76d7a47 --- /dev/null +++ b/quixos.lock @@ -0,0 +1,101 @@ +quixos-lock version 1 { + quixos source { + repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git"; + commit "57383d96ee3f718c6421d567685e89e095129eb2"; + } + + interface Named source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-named.git"; + commit "9de59b5fb722cb8303403f3c6da276767466a4ac"; + } + + interface TaskData source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-task-data.git"; + commit "6aa986421bcbee4c387ab933b17bc60f40e18404"; + } + + interface ProjectTasks source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-project-tasks.git"; + commit "ddbcc2798001f4b03c3eacbcaeee38090b7646d4"; + } + + interface ProjectActions source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-project-actions.git"; + commit "43137cb4755210903052507a819350fdff8a31b1"; + } + + interface TaskActions source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-task-actions.git"; + commit "005bffb2e123b708870249fe03c13ce28e3e5490"; + } + + interface DisplayLabel source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-display-label.git"; + commit "cd9e5a60d52a94c7afe1e5ccdc7c2e0024425ffa"; + } + + interface TaskCount source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-task-count.git"; + commit "b44916bd878ae20f3e583b885bfbbfc03d223ad4"; + } + + interface WebStudioCreateable source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-createable.git"; + commit "2cce19f32746afef951f0a5f5ed3d1f67eb68de1"; + } + + interface WebStudioReactComponent source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-react-component.git"; + commit "64826cf9ac325931ef20d9616fe47e9d85a3ff9f"; + } + + interface WebStudioHasReactComponent source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-has-react-component.git"; + commit "01ac92ccc4b1859910d734b9795abceb73936f9f"; + } + + interface WebStudioCanvas source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-canvas.git"; + commit "a4d82b07fa8634f3df87dfadf20ef51865abb44f"; + } + + interface WebStudioCanvasPlacement source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-canvas-placement.git"; + commit "b8d31b65c86228f4786be9894dd3837f02a5973c"; + } + + interface WebStudioPlaceable source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-placeable.git"; + commit "40fa55b959fa611ecea5030e5a47b262ec734db1"; + } + + interface WebStudioSearchable source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/interface-searchable.git"; + commit "7c198f2177396bface92fdb5d6c86b276c05e704"; + } + + package TodoRuntime source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-todo-runtime.git"; + commit "3519d50650c51177ab62a5a434d65e31d0f132b4"; + } + + package ProjectRuntime source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-project-runtime.git"; + commit "78ce553df08632a2b554a1e40134d1b0bd30b9f2"; + } + + package ProjectReactRuntime source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-project-react-runtime.git"; + commit "9bbed0910e38dfc6ef73675bb84a7c5d168724d9"; + } + + package TodoReactRuntime source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-todo-react-runtime.git"; + commit "31c50e89422b22ceb232882001d6d36170358f1e"; + } + + package WebStudioCanvasRuntime source { + repository "https://repos.quixos.org/qxw-02737044acbb57a5-source/package-canvas-runtime.git"; + commit "9d9e06737ef8aa3c3922d0556902bfab78eeb9bf"; + } +} diff --git a/workspace.qx b/workspace.qx new file mode 100644 index 0000000..6b733b2 --- /dev/null +++ b/workspace.qx @@ -0,0 +1,545 @@ +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 "9de59b5fb722cb8303403f3c6da276767466a4ac"; + } { + 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 "6aa986421bcbee4c387ab933b17bc60f40e18404"; + } { + 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 "ddbcc2798001f4b03c3eacbcaeee38090b7646d4"; + } { + 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 "43137cb4755210903052507a819350fdff8a31b1"; + } { + 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 "005bffb2e123b708870249fe03c13ce28e3e5490"; + } { + 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 "cd9e5a60d52a94c7afe1e5ccdc7c2e0024425ffa"; + } { + 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 "b44916bd878ae20f3e583b885bfbbfc03d223ad4"; + } { + 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 "2cce19f32746afef951f0a5f5ed3d1f67eb68de1"; + } {} + + 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 "64826cf9ac325931ef20d9616fe47e9d85a3ff9f"; + } { + 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 "01ac92ccc4b1859910d734b9795abceb73936f9f"; + } { + 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 "a4d82b07fa8634f3df87dfadf20ef51865abb44f"; + } { + 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 "b8d31b65c86228f4786be9894dd3837f02a5973c"; + } { + 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 "40fa55b959fa611ecea5030e5a47b262ec734db1"; + } { + 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 "7c198f2177396bface92fdb5d6c86b276c05e704"; + } { + 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 "3519d50650c51177ab62a5a434d65e31d0f132b4"; + } { + 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 "78ce553df08632a2b554a1e40134d1b0bd30b9f2"; + } { + 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 "9bbed0910e38dfc6ef73675bb84a7c5d168724d9"; + } { + 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 "31c50e89422b22ceb232882001d6d36170358f1e"; + } { + 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 "9d9e06737ef8aa3c3922d0556902bfab78eeb9bf"; + } { + 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; + }; +}