System is the framework and API layer for creating Whimsy.Space apps.
appBase
awsfsDexieIndexedDBPackageExplore a package as a filesystemMountA meta-file system where that mounts other systems as paths.S3AWS S3
pkgUtilities for loading, building, running packages.- ui
applyStyle(styleSource, name)TODO: this should be automatic in most casesBindableTODO: Not quite the right place?ContextMenuJadeletMenuBarModalObservableProgressWindow
utilPostmaster
The filesystem has common operations for listing, reading, writing, and deleting
files. Both local and cloud backends are implemented. Different systems can be
mounted at paths and have events translated cleanly. That's some of the magic
that powers My Briefcase.
Build and run applications with packaging.
Deprecated parseDependencyPath(string, registry) parses a path to resolve a package
shorthand to an https url. These paths are used in declaring dependencies in
package configs like:
dependencies:
postmaster: "distri/postmaster:master"We should just switch to using https urls. If a specific build tool wants to handle short names or a registry then that is up to the tool.
htmlBlob(pkg, opts) Create a blob object containing html of the package with a
self executing wrapper. This blob can then be published as a standalone webpage
or launched inside an iframe.
Artisanal User Interface
- Context Menu
- Menu Bar
- Nested submenus
Simple DSL for creating menus and binding to handlers.
{ContextMenu} = require "ui"
contextMenu = ContextMenu()
document.body.appendChild contextMenu.element
- Alert
- Confirm
- Prompt
Promise returning prompts, confirms, etc.
Hotkeys, help text, icons, enabled/disabled states.
Is there a sane way to do z-indexes? Right now I'm just listing them.
Modal: 1000 Context Menu: 2000
system provides many namespaces such as system.fs, system.ui, etc.
Namespaces are lower case.
Those namespaces provide constructors and methods. Methods are lower initial camel-case:
system.util.style(...)
Constructors are upper initial camel-case and should not be called with new.
system.ui.Window(...)
Experimenting with delegating more App plumbing to system through app.Base.
Currently implemented as something like this in ZineOS:
self.executePackageInIFrame
distribution:
main:
content: """
global.app = system.app.Base({
pkg: PACKAGE
});
require("./app");
app.trigger("boot");
"""
app:
content: source
dependencies:
"!system": PACKAGE.dependencies["!system"]
It makes a shim package, passing ZineOS's !system dependency through, then
initializing a global app using the runtime's system.app.Base to wire up all the
biz, then requires the single app file. Finally it triggers the boot event
for the app.
This kind of pattern may make its way into a util in system one day. Still
experimenting with the details.
system.client is a deprecated namespace from when system was synonymous with
system.host and all the other namespaces lived under system.client.