Files

77 lines
3.0 KiB
Markdown

# BOTSU application shell
Task 3 introduces the first source-built BOTSU portal inside Cinny while preserving all existing Matrix routes.
## Routes
- `/botsu/` — member application catalogue
- `/botsu/services/` — fixed catalogue of authorized BOTSU services
- `/botsu/embed/:appId/` — validated iframe host for catalogue entries
- `/home/` — existing Cinny discussions route, unchanged
A `B` entry in Cinny's global sidebar opens `/botsu/`. The shell is inside the authenticated `ClientRoot`, so it does not bypass Matrix login or initialization.
## Catalogue
The member catalogue exposes:
1. Discussions — native and available
2. Documents — native and planned
3. Tables — iframe and planned
4. Files — native and planned
5. Transfers — external and available
6. Services — native and available
Administration is a separate `admin` entry. Task 3 intentionally passes only the `member` role because a Matrix room power level is not a global BOTSU role. Task 4 will provide the authenticated identity and role mapping. Until then, administration is hidden and marked planned.
Planned applications remain visible as product direction but render a disabled `Bientôt` state. They cannot produce a navigation, iframe, or external launch plan.
## Launch policy
Every app declares one launch mode:
- `native` — an internal absolute path beginning with one `/`;
- `iframe` — an HTTPS URL whose exact origin is in the iframe allowlist;
- `external` — an HTTPS URL whose exact origin is in the external allowlist.
The launcher rejects malformed URLs, HTTP URLs, embedded credentials, unknown origins, protocol-relative native paths, raw or encoded backslashes/control characters, normalized cross-origin paths, and unsupported launch modes.
Iframe plans currently allow only `https://tabs.botsu.net` and apply:
- `sandbox="allow-forms allow-same-origin allow-scripts"`
- `referrerPolicy="no-referrer"`
- no top-navigation or popup permission
External plans always use `_blank` with `rel="noopener noreferrer"`. No Matrix access token, session, user ID, or arbitrary URL is passed to an embedded application.
## Theme controls
The shell consumes `@botsu/ui` and stores only validated visual preferences under `botsu.theme.v1` in browser local storage. Members can change:
- black or white mode;
- Inter, system, or monospace font;
- accent color;
- border width;
- corner radius;
- glass opacity;
- backdrop blur.
Blocked or full local storage does not prevent the in-memory theme from working. Reset returns to the monochrome brutalist default.
Accent colors must retain at least 3:1 contrast against the active canvas; an
inaccessible choice falls back to white on black or black on white. Interactive
text uses a separately derived `on-accent` foreground with the stronger
available contrast.
## Verification
Task 3 gates:
```bash
npm test
npm run typecheck:ui
npm run typecheck:botsu
npm run build:client
```
The inherited full Cinny typecheck/lint debt remains documented separately. ESLint and Prettier are run directly on all new `src/botsu` files.