chore: P0 skeleton

Bootstrap the Dashward repo per arch/UBUNTU-DASHBOARD-SPACE.md:

- pnpm-workspaces monorepo (sdk, extension, container, widgets-builtin/*)
- GNOME extension stub (metadata.json, src/*.ts placeholders for warden,
  guard, supervisor, entry UX, DBus service)
- WebKit container stub (GJS main + page-side runtime + dashboard.html)
- TypeScript widget SDK (defineWidget + types)
- Builtin clock widget as the first SDK consumer example
- DBus interface XML (proto/shell.iface.xml) and shared types
- esbuild configs for extension and container; tsc for SDK
- Design doc copied in at repo root for discoverability

No functional logic yet -- all components are placeholders that compose
in extension.ts so the build chain can be exercised. P1 (workspace
warden) starts next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
h z
2026-05-22 23:00:02 +01:00
commit 3bf3aa1989
41 changed files with 1361 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<title>Dashward</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<main id="grid"></main>
<script type="module" src="runtime.js"></script>
</body>
</html>

View File

@@ -0,0 +1,15 @@
// Stub: page-side runtime (design §11).
// Loads layout.json, instantiates widgets in iframes on the 12-column grid,
// handles edit mode, persists changes via the shell bridge.
declare global {
interface Window {
__dashShell__?: {
call(method: string, args?: unknown): Promise<unknown>;
};
}
}
console.info('[dashward-runtime] P0 stub loaded');
export {};

View File

@@ -0,0 +1,22 @@
:root {
--bg: #f5f5f7;
--fg: #1c1c1e;
--grid-gap: 16px;
}
[data-theme="dark"] {
--bg: #0f0f12;
--fg: #f0f0f5;
}
html, body { margin: 0; padding: 0; height: 100%; background: var(--bg); color: var(--fg); }
body { font-family: ui-sans-serif, system-ui, -apple-system, sans-serif; }
#grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: var(--grid-gap);
padding: var(--grid-gap);
min-height: 100%;
box-sizing: border-box;
}