Milestone 2. Server scans modules/*/module.json, serves module assets at /modules/<id>/, mounts optional server routes (exact + trailing-/* prefix patterns) under /api/modules/<id>/ with per-module config from config/modules.json, and lists enabled manifests at GET /api/modules. Shell dynamically imports each module's client.js and hands it the moduleApi (config, instanceSettings, scoped fetch, auto-reconnecting sse, setStatus). Clock module proves the contract end to end; password-typed config fields never leave the server. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RNYUv9EyrGSFmCnmH7WYKH
26 lines
541 B
CSS
26 lines
541 B
CSS
/* Clock module — scoped under its tile via [data-module="clock"], styled
|
|
with the shell's CSS variables only. */
|
|
|
|
[data-module="clock"] .clock-wrap {
|
|
position: absolute;
|
|
inset: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 2%;
|
|
}
|
|
|
|
[data-module="clock"] .clock-time {
|
|
font-weight: 700;
|
|
font-variant-numeric: tabular-nums;
|
|
letter-spacing: 0.02em;
|
|
color: var(--text);
|
|
line-height: 1;
|
|
}
|
|
|
|
[data-module="clock"] .clock-date {
|
|
color: var(--muted);
|
|
font-weight: 600;
|
|
}
|