Fast path for building and testing custom .giraffe.js components inside PaperScape.
/OpenForum/Giraffe/giraffe.js is up to date; PaperScape relies on Canvas, Composite, Picture, Text, etc./OpenForum/AddOn/PaperScape for runtime testing and /OpenForum/AddOn/PaperScape/Developer for scripts.paperScape.json in case you need to restore the default scene.var MyWidget = function(x,y,canvas,htmlCanvas,controller) { ... };var container = new Composite(x,y);) and attach shapes, text, or child composites.self.getName = function() { return "My Widget"; }; and self.getContainer = function() { return container; };.self.toJson(), self.fromJson(json), self.getForm() (return HTML fragment string), and self.getConfig() ({ layer: "view" | "control" | "overlay" }).target = MyWidget; so PaperScape knows which constructor to instantiate./OpenForum/AddOn/PaperScape/Apps/ or an accessible page path..giraffe.js file onto the PaperScape canvas or call paperScape.load("/path/to/MyWidget.giraffe.js") from the console./OpenForum/AddOn/PaperScape/paperscape-queue.js (add a <script> tag or run OpenForum.loadScript from the console).var psq = new PaperScapeQueue();—it binds to the shared PaperScape queue and targets the live canvas.psq.sendUrl("/OpenForum/AddOn/PaperScape/Apps/whiteboard.giraffe.js") or psq.sendFile(fileInput.files0) simulates drag/drop without leaving your editor tab.psq.sendCode(editor.getValue(), {name:"My Widget", replace:true}) instantly replaces a running app; omit replace (or set false) to spawn a parallel copy.psq.sendMessage({action:"load-file", name:"scene.giraffe.json", data: jsonString, pointer:{x:250,y:250}}) hands you full control over the queue payload.load-url, load-file/load-data, and load-code/replace-app.pointer accepts either "center" (default) or absolute coordinates to steer the drop location.Apps/my-widget.html.fragment).toJson()/fromJson() so users can save/load scenes..omv.json so downloads and drag/drop imports remain compatible..giraffe.json) for common arrangements to accelerate reuse.canvas.log("message") or console.log (browser dev tools) to inspect state.paperScape.setAllowDrag(false) when you need precise pointer interactions.paperScape.addFileProcessor() to handle custom imports during development.try/catch during exploratory work.