@wenathlan/saddle 2.0.151 → 2.0.152
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/biome.jsonc +12 -5
- package/dist/App.d.ts +3 -0
- package/dist/App.js +50 -0
- package/dist/Sol/Sol.d.ts +3 -0
- package/dist/Sol/Sol.js +46 -0
- package/dist/Sol/agentbrowser/agentbrowser.d.ts +9 -0
- package/dist/Sol/agentbrowser/agentbrowser.js +121 -0
- package/dist/Sol/architecture/architecture.d.ts +9 -0
- package/dist/Sol/architecture/architecture.js +93 -0
- package/dist/Sol/compute/compute.d.ts +9 -0
- package/dist/Sol/compute/compute.js +22 -0
- package/dist/Sol/console/console.d.ts +15 -0
- package/dist/Sol/console/console.js +292 -0
- package/dist/Sol/dashboard/dashboard.d.ts +10 -0
- package/dist/Sol/dashboard/dashboard.js +181 -0
- package/dist/Sol/docs/docs.d.ts +9 -0
- package/dist/Sol/docs/docs.js +28 -0
- package/dist/Sol/home/home.d.ts +35 -0
- package/dist/Sol/home/home.js +239 -0
- package/dist/Sol/integrations/integrations.d.ts +9 -0
- package/dist/Sol/integrations/integrations.js +83 -0
- package/dist/Sol/intro/intro.d.ts +7 -0
- package/dist/Sol/intro/intro.js +102 -0
- package/dist/Sol/login/login.d.ts +16 -0
- package/dist/Sol/login/login.js +49 -0
- package/dist/Sol/notfound/notfound.d.ts +9 -0
- package/dist/Sol/notfound/notfound.js +15 -0
- package/dist/Sol/onboarding/onboarding.d.ts +25 -0
- package/dist/Sol/onboarding/onboarding.js +60 -0
- package/dist/Sol/playground/playground.d.ts +9 -0
- package/dist/Sol/playground/playground.js +127 -0
- package/dist/Sol/register/register.d.ts +16 -0
- package/dist/Sol/register/register.js +193 -0
- package/dist/Sol/shell/Shell.d.ts +124 -0
- package/dist/Sol/shell/Shell.js +335 -0
- package/dist/Sol/wingets/ComputeBootladder.d.ts +6 -0
- package/dist/Sol/wingets/ComputeBootladder.js +71 -0
- package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +7 -0
- package/dist/Sol/wingets/ComputeModalitycatalog.js +71 -0
- package/dist/Sol/wingets/ConsoleApibadge.d.ts +7 -0
- package/dist/Sol/wingets/ConsoleApibadge.js +5 -0
- package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +6 -0
- package/dist/Sol/wingets/ConsoleEdgelaw.js +36 -0
- package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +19 -0
- package/dist/Sol/wingets/ConsoleEventstimeline.js +12 -0
- package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +8 -0
- package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +8 -0
- package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +21 -0
- package/dist/Sol/wingets/ConsoleSpecpanel.js +75 -0
- package/dist/Sol/wingets/ConsoleTerminal.d.ts +22 -0
- package/dist/Sol/wingets/ConsoleTerminal.js +77 -0
- package/dist/Sol/wingets/DashboardAccountpanel.d.ts +18 -0
- package/dist/Sol/wingets/DashboardAccountpanel.js +65 -0
- package/dist/Sol/wingets/DashboardAdminpanel.d.ts +6 -0
- package/dist/Sol/wingets/DashboardAdminpanel.js +90 -0
- package/dist/Sol/wingets/DashboardAuditlog.d.ts +8 -0
- package/dist/Sol/wingets/DashboardAuditlog.js +50 -0
- package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +10 -0
- package/dist/Sol/wingets/DashboardCreatesandboxform.js +71 -0
- package/dist/Sol/wingets/DashboardEventstimeline.d.ts +8 -0
- package/dist/Sol/wingets/DashboardEventstimeline.js +83 -0
- package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +8 -0
- package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +57 -0
- package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +8 -0
- package/dist/Sol/wingets/DashboardMeshnodestable.js +103 -0
- package/dist/Sol/wingets/DashboardSandboxlist.d.ts +10 -0
- package/dist/Sol/wingets/DashboardSandboxlist.js +163 -0
- package/dist/Sol/wingets/DashboardUserstable.d.ts +8 -0
- package/dist/Sol/wingets/DashboardUserstable.js +78 -0
- package/dist/Sol/wingets/HomeEntrygate.d.ts +23 -0
- package/dist/Sol/wingets/HomeEntrygate.js +73 -0
- package/dist/Sol/wingets/HomeMetricstrip.d.ts +9 -0
- package/dist/Sol/wingets/HomeMetricstrip.js +4 -0
- package/dist/Sol/wingets/HomeRuntimediagram.d.ts +1 -0
- package/dist/Sol/wingets/HomeRuntimediagram.js +22 -0
- package/dist/Sol/wingets/LoginForm.d.ts +19 -0
- package/dist/Sol/wingets/LoginForm.js +141 -0
- package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +13 -0
- package/dist/Sol/wingets/RegisterPasswordconfirm.js +16 -0
- package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +19 -0
- package/dist/Sol/wingets/RegisterPasswordmeter.js +65 -0
- package/dist/Sol/wingets/RegisterUsernamerules.d.ts +11 -0
- package/dist/Sol/wingets/RegisterUsernamerules.js +16 -0
- package/dist/Sol/wingets/index.d.ts +39 -0
- package/dist/Sol/wingets/index.js +39 -0
- package/dist/alternatives.d.ts +508 -0
- package/dist/alternatives.js +950 -0
- package/dist/api.d.ts +154 -0
- package/dist/api.js +174 -0
- package/dist/auth.d.ts +268 -0
- package/dist/auth.js +476 -0
- package/dist/automation.d.ts +425 -0
- package/dist/automation.js +566 -0
- package/dist/browser.d.ts +561 -0
- package/dist/browser.js +1058 -0
- package/dist/capacitor.config.d.ts +45 -0
- package/dist/capacitor.config.js +48 -0
- package/dist/catalog.d.ts +43 -0
- package/dist/catalog.js +44 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.js +168 -0
- package/dist/communication.d.ts +181 -0
- package/dist/communication.js +376 -0
- package/dist/compute.d.ts +1160 -0
- package/dist/compute.js +2272 -0
- package/dist/dashboardlib.d.ts +58 -0
- package/dist/dashboardlib.js +161 -0
- package/dist/db.d.ts +569 -0
- package/dist/db.js +1080 -0
- package/dist/distribution.d.ts +528 -0
- package/dist/distribution.js +810 -0
- package/dist/drizzle.config.d.ts +20 -0
- package/dist/drizzle.config.js +18 -0
- package/dist/edgelandes.d.ts +70 -0
- package/dist/edgelandes.host.d.ts +26 -0
- package/dist/edgelandes.host.js +1089 -0
- package/dist/edgelandes.inproc.d.ts +27 -0
- package/dist/edgelandes.inproc.js +952 -0
- package/dist/edgelandes.js +1133 -0
- package/dist/edgelandes.ninety.d.ts +31 -0
- package/dist/edgelandes.ninety.js +174 -0
- package/dist/edgelandes.virtual.d.ts +25 -0
- package/dist/edgelandes.virtual.js +629 -0
- package/dist/edgeplane.d.ts +114 -0
- package/dist/edgeplane.js +305 -0
- package/dist/examplelocaljob.d.ts +1 -0
- package/{docs/example-localjob.ts → dist/examplelocaljob.js} +0 -1
- package/dist/execution.d.ts +529 -0
- package/dist/execution.js +760 -0
- package/dist/family.d.ts +16 -0
- package/dist/family.js +42 -0
- package/dist/familyurl.d.ts +21 -0
- package/dist/familyurl.js +24 -0
- package/dist/format.d.ts +18 -0
- package/dist/format.js +59 -0
- package/dist/foundation.d.ts +172 -0
- package/dist/foundation.js +312 -0
- package/dist/index.d.ts +735 -0
- package/dist/index.js +1020 -0
- package/dist/integration.d.ts +235 -0
- package/dist/integration.js +228 -0
- package/dist/intelligence.d.ts +93 -0
- package/dist/intelligence.js +144 -0
- package/dist/isolation.d.ts +128 -0
- package/dist/isolation.js +95 -0
- package/dist/labels.d.ts +665 -0
- package/dist/labels.js +751 -0
- package/dist/localauth.d.ts +127 -0
- package/dist/localauth.js +413 -0
- package/dist/media.d.ts +343 -0
- package/dist/media.js +985 -0
- package/dist/mesh.d.ts +177 -0
- package/dist/mesh.js +468 -0
- package/dist/modalityregistry.d.ts +109 -0
- package/dist/modalityregistry.js +1386 -0
- package/dist/modes.d.ts +358 -0
- package/dist/modes.js +133 -0
- package/dist/onboardingstate.d.ts +79 -0
- package/dist/onboardingstate.js +282 -0
- package/dist/orchestrator.d.ts +1338 -0
- package/dist/orchestrator.js +4310 -0
- package/dist/packager/targetcli.js +4 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +14 -0
- package/dist/performance.d.ts +415 -0
- package/dist/performance.js +826 -0
- package/dist/quantum.d.ts +809 -0
- package/dist/quantum.js +2072 -0
- package/dist/render.d.ts +380 -0
- package/dist/render.js +1072 -0
- package/dist/runall.d.ts +2 -0
- package/dist/runall.js +39 -0
- package/dist/runtimeprobe.d.ts +4 -0
- package/dist/runtimeprobe.js +8 -0
- package/dist/sandbox.d.ts +355 -0
- package/dist/sandbox.js +1721 -0
- package/dist/sandboxenvprofile.d.ts +29 -0
- package/dist/sandboxenvprofile.js +89 -0
- package/dist/sandboxprofile.d.ts +137 -0
- package/dist/sandboxprofile.js +241 -0
- package/dist/sandboxqueue.d.ts +108 -0
- package/dist/sandboxqueue.js +201 -0
- package/dist/sandboxquota.d.ts +121 -0
- package/dist/sandboxquota.js +236 -0
- package/dist/scheduler.d.ts +595 -0
- package/dist/scheduler.js +1258 -0
- package/dist/scriptlanes.d.ts +182 -0
- package/dist/scriptlanes.js +660 -0
- package/dist/scripts.buildengine.d.ts +1 -0
- package/dist/scripts.buildengine.js +39 -0
- package/dist/scripts.securitygate.d.ts +1 -0
- package/dist/scripts.securitygate.js +68 -0
- package/dist/scripts.validateflatnative.d.ts +1 -0
- package/dist/scripts.validateflatnative.js +72 -0
- package/dist/security.d.ts +500 -0
- package/dist/security.js +1169 -0
- package/dist/seedcatalog.d.ts +13 -0
- package/dist/seedcatalog.js +46 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.js +53 -0
- package/dist/speccatalog.d.ts +31 -0
- package/dist/speccatalog.js +163 -0
- package/dist/tiers.d.ts +1001 -0
- package/dist/tiers.js +2169 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +5 -0
- package/dist/vaulthandoff.d.ts +141 -0
- package/dist/vaulthandoff.js +444 -0
- package/dist/virtual.d.ts +640 -0
- package/dist/virtual.js +1284 -0
- package/dist/virtualcpu.d.ts +315 -0
- package/dist/virtualcpu.js +1180 -0
- package/dist/virtualgpu.d.ts +344 -0
- package/dist/virtualgpu.js +1000 -0
- package/dist/virtualization.d.ts +606 -0
- package/dist/virtualization.js +1186 -0
- package/dist/virtualmemory.d.ts +817 -0
- package/dist/virtualmemory.js +1795 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.config.js +43 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +25 -0
- package/dist/webserver.d.ts +166 -0
- package/dist/webserver.js +2226 -0
- package/dist/workloadlaw.d.ts +133 -0
- package/dist/workloadlaw.js +193 -0
- package/docs/artifactavailability.md +2 -2
- package/docs/{containerplatforms-2.1.0.md → containerplatforms.2.1.0.md} +1 -1
- package/docs/{documentmap-1.8.12.md → documentmap.1.8.12.md} +1 -1
- package/docs/ninety.modalities.md +108 -0
- package/docs/planning.ninety.md +391 -0
- package/docs/{releasenotes-1.8.13.md → releasenotes.1.8.13.md} +2 -2
- package/docs/{releasenotes-1.8.14.md → releasenotes.1.8.14.md} +1 -1
- package/docs/{repo-synthesis-1.8.16.md → repo.synthesis.1.8.16.md} +1 -1
- package/docs/{todo-1.8.15.md → todo.1.8.15.md} +1 -1
- package/docs/{todo-1.8.16.md → todo.1.8.16.md} +5 -5
- package/docs/todo.md +2 -2
- package/docs/workloadlaw.md +104 -0
- package/index.ts +1 -1
- package/manifest.json +1 -1
- package/modalityregistry.ts +1371 -34
- package/orchestrator.ts +1 -1
- package/package.json +73 -33
- package/docs/CONVERSA.txt +0 -1523
- package/docs/architecture-1.8.19.png +0 -0
- package/docs/assets/architecture.svg +0 -45
- package/docs/assets/saddle-browser-trace.webp +0 -0
- package/docs/assets/saddle-hero-bridge.webp +0 -0
- package/docs/assets/saddle-mark.webp +0 -0
- package/docs/assets/saddle-runtime-map.webp +0 -0
- package/docs/assets/saddlemark.svg +0 -13
- package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
- /package/docs/{architecture-1.8.19.md → architecture.1.8.19.md} +0 -0
- /package/docs/{architecture-1.8.19.mmd → architecture.1.8.19.mmd} +0 -0
- /package/docs/{artifactresearch-1.8.9.md → artifactresearch.1.8.9.md} +0 -0
- /package/docs/{batches-1816-1820.md → batches.1816.to.1820.md} +0 -0
- /package/docs/{brancharchive-2026-08-18.md → brancharchive.2026.08.18.md} +0 -0
- /package/docs/{containerplatforms-1.8.17.md → containerplatforms.1.8.17.md} +0 -0
- /package/docs/{e2ugh-engine.md → e2ugh.engine.md} +0 -0
- /package/docs/{flatbuildresearch-1.8.11.md → flatbuildresearch.1.8.11.md} +0 -0
- /package/docs/{licenseaudit-1.8.12.md → licenseaudit.1.8.12.md} +0 -0
- /package/docs/{mobileconversionresearch-1.8.10.md → mobileconversionresearch.1.8.10.md} +0 -0
- /package/docs/{native-wrappers.md → native.wrappers.md} +0 -0
- /package/docs/{nativeidentityresearch-1.8.11.md → nativeidentityresearch.1.8.11.md} +0 -0
- /package/docs/{releasenotes-1.8.12.md → releasenotes.1.8.12.md} +0 -0
- /package/docs/{releasenotes-1.8.15.md → releasenotes.1.8.15.md} +0 -0
- /package/docs/{releasenotes-1.8.16.md → releasenotes.1.8.16.md} +0 -0
- /package/docs/{releasenotes-1.8.17.md → releasenotes.1.8.17.md} +0 -0
- /package/docs/{releasenotes-1.8.18.md → releasenotes.1.8.18.md} +0 -0
- /package/docs/{releasenotes-1.8.19.md → releasenotes.1.8.19.md} +0 -0
- /package/docs/{reorganization-1.8.8.md → reorganization.1.8.8.md} +0 -0
- /package/docs/{reorganization-1.8.9.md → reorganization.1.8.9.md} +0 -0
- /package/docs/{repo-analysis-1.8.21.json → repo.analysis.1.8.21.json} +0 -0
- /package/docs/{repo-candidates-1.8.21.jsonl → repo.candidates.1.8.21.jsonl} +0 -0
- /package/docs/{repo-research-1.8.16.md → repo.research.1.8.16.md} +0 -0
- /package/docs/{repo-research-1.8.21.md → repo.research.1.8.21.md} +0 -0
- /package/docs/{repo-selected-1.8.21.json → repo.selected.1.8.21.json} +0 -0
- /package/docs/{repo-synthesis-1.8.21.md → repo.synthesis.1.8.21.md} +0 -0
- /package/docs/{research-1.8.18-isolation.md → research.1.8.18.isolation.md} +0 -0
- /package/docs/{research-1.8.19-virtual-browser.md → research.1.8.19.virtual.browser.md} +0 -0
- /package/docs/{scanningresearch-1.8.11.md → scanningresearch.1.8.11.md} +0 -0
- /package/docs/{securityaudit-1.8.7.md → securityaudit.1.8.7.md} +0 -0
- /package/docs/{securityreferences-1.8.11.md → securityreferences.1.8.11.md} +0 -0
- /package/docs/{securityresearch-1.8.11.md → securityresearch.1.8.11.md} +0 -0
- /package/docs/{signingresearch-1.8.12.md → signingresearch.1.8.12.md} +0 -0
- /package/docs/{tauri-glib-risk-1.8.11.md → tauri.glib.risk.1.8.11.md} +0 -0
- /package/docs/{todo-1.8.18.md → todo.1.8.18.md} +0 -0
- /package/docs/{todo-1.8.19.md → todo.1.8.19.md} +0 -0
- /package/docs/{toolchainresearch-1.8.9.md → toolchainresearch.1.8.9.md} +0 -0
- /package/docs/{web-duplicatecleanup.md → web.duplicatecleanup.md} +0 -0
- /package/docs/{web-ideas.md → web.ideas.md} +0 -0
- /package/docs/{workflowimprovements-2026-08-19.md → workflowimprovements.2026.08.19.md} +0 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// the saddle shell of the theme.
|
|
3
|
+
// Shell — the app surface of the saddle, answering the FAMILY STANDALONE
|
|
4
|
+
// LAW: an app accessed by its own url (wenathlan.github.io/devthink/
|
|
5
|
+
// saddle/) is the normal application, one hundred percent — it renders
|
|
6
|
+
// FULL-BLEED, the routed stage owning the whole viewport with the page
|
|
7
|
+
// rail of SECTIONS as the app's own navigation (no window chrome of its
|
|
8
|
+
// own: no title bar, no caption buttons, no resize handles, no inactive
|
|
9
|
+
// grayscale, no entry scale). The WINDOW (the draggable frame with the
|
|
10
|
+
// captions and the eight handles) exists ONLY when the app is embedded
|
|
11
|
+
// inside the DevThink OS power clip — the framed contract below renders
|
|
12
|
+
// the SAME surface tree under the shell--embedded seat: the sectioned
|
|
13
|
+
// rail and the routed stage answer in both seats so the design is
|
|
14
|
+
// IDENTICAL at the direct url and inside the os window (the window-era
|
|
15
|
+
// law), and the OS draws the window chrome around it. The file also
|
|
16
|
+
// exports every shared primitive the page
|
|
17
|
+
// folders import from "./shell/Shell" (or "@/shell/Shell"): PageShell,
|
|
18
|
+
// SaddleMark, SectionRail, ThemeProvider, useTheme, ErrorBoundary, Button,
|
|
19
|
+
// buttonVariants, the Card family, the Tooltip family and the Toaster.
|
|
20
|
+
// Nothing shared lives loose at the theme root; page-specific components
|
|
21
|
+
// live in the page folder that owns them.
|
|
22
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
23
|
+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
24
|
+
import { cva } from 'class-variance-authority';
|
|
25
|
+
import { WarningRegular as AlertTriangle, WindowAppsRegular as AppWindow, BookOpenRegular as BookOpen, BoxMultipleRegular as Boxes, BrainCircuitRegular as Cpu, BeakerRegular as FlaskConical, GaugeRegular as Gauge, TableRegular as LayoutDashboard, ArrowEnterLeftRegular as LogIn, WeatherMoonRegular as Moon, PlugConnectedRegular as PlugZap, ArrowCounterclockwiseRegular as RotateCcw, WeatherSunnyRegular as Sun, WindowConsoleRegular as TerminalSquare, PersonAddRegular as UserPlus, } from '@fluentui/react-icons';
|
|
26
|
+
import { useTheme as useNextTheme } from 'next-themes';
|
|
27
|
+
import { Component, createContext, useContext, useEffect, useState, } from 'react';
|
|
28
|
+
import { Toaster as Sonner } from 'sonner';
|
|
29
|
+
import { Link, useLocation } from 'wouter';
|
|
30
|
+
import { familyrow } from '../../family.ts';
|
|
31
|
+
import { familyurl } from '../../familyurl.ts';
|
|
32
|
+
import { label } from '../../labels.ts';
|
|
33
|
+
import { cn } from '../../utils.ts';
|
|
34
|
+
const ThemeContext = createContext(undefined);
|
|
35
|
+
export function ThemeProvider({ children, defaultTheme = 'light', switchable = false, }) {
|
|
36
|
+
const [theme, setTheme] = useState(() => {
|
|
37
|
+
if (switchable) {
|
|
38
|
+
const stored = localStorage.getItem('theme');
|
|
39
|
+
return stored || defaultTheme;
|
|
40
|
+
}
|
|
41
|
+
return defaultTheme;
|
|
42
|
+
});
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const root = document.documentElement;
|
|
45
|
+
if (theme === 'dark') {
|
|
46
|
+
root.classList.add('dark');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
root.classList.remove('dark');
|
|
50
|
+
}
|
|
51
|
+
if (switchable) {
|
|
52
|
+
localStorage.setItem('theme', theme);
|
|
53
|
+
}
|
|
54
|
+
}, [theme, switchable]);
|
|
55
|
+
const toggleTheme = switchable
|
|
56
|
+
? () => {
|
|
57
|
+
setTheme((prev) => (prev === 'light' ? 'dark' : 'light'));
|
|
58
|
+
}
|
|
59
|
+
: undefined;
|
|
60
|
+
return (_jsx(ThemeContext.Provider, { value: { theme, toggleTheme, switchable }, children: children }));
|
|
61
|
+
}
|
|
62
|
+
export function useTheme() {
|
|
63
|
+
const context = useContext(ThemeContext);
|
|
64
|
+
if (!context) {
|
|
65
|
+
throw new Error('useTheme must be used within ThemeProvider');
|
|
66
|
+
}
|
|
67
|
+
return context;
|
|
68
|
+
}
|
|
69
|
+
export class ErrorBoundary extends Component {
|
|
70
|
+
constructor(props) {
|
|
71
|
+
super(props);
|
|
72
|
+
this.state = { hasError: false, error: null };
|
|
73
|
+
}
|
|
74
|
+
static getDerivedStateFromError(error) {
|
|
75
|
+
return { hasError: true, error };
|
|
76
|
+
}
|
|
77
|
+
render() {
|
|
78
|
+
if (this.state.hasError) {
|
|
79
|
+
return (_jsx("div", { className: "flex items-center justify-center min-h-screen p-8 bg-background", children: _jsxs("div", { className: "flex flex-col items-center w-full max-w-2xl p-8", children: [_jsx(AlertTriangle, { fontSize: 48, className: "text-destructive mb-6 flex-shrink-0" }), _jsx("h2", { className: "text-xl mb-4", children: "An unexpected error occurred." }), _jsx("div", { className: "p-4 w-full rounded bg-muted overflow-auto mb-6", children: _jsx("pre", { className: "text-sm text-muted-foreground whitespace-break-spaces", children: this.state.error?.stack }) }), _jsxs("button", { type: "button", onClick: () => window.location.reload(), className: cn('flex items-center gap-2 px-4 py-2 rounded-lg', 'bg-primary text-primary-foreground', 'hover:opacity-90 cursor-pointer'), children: [_jsx(RotateCcw, { fontSize: 16 }), "Reload Page"] })] }) }));
|
|
80
|
+
}
|
|
81
|
+
return this.props.children;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/* =============================== brand mark ============================ */
|
|
85
|
+
/**
|
|
86
|
+
* SaddleMark — the premium drawn icon of the theme, rebuilt in the house
|
|
87
|
+
* icon spirit (the devthink Sol/shell/app.icons.tsx standard): a gradient
|
|
88
|
+
* squircle face over the saddle tan-leather story, a soft top gloss, a mid
|
|
89
|
+
* layer of story orbs over a pedestal band, two blurred inner contours, a
|
|
90
|
+
* contact ellipse, a discrete film grain and the glyph in thick ivory
|
|
91
|
+
* strokes over a translucent backing. The finishing (glow breathing,
|
|
92
|
+
* perspective tilt, glyph lift, one sheen sweep on hover) is animated by
|
|
93
|
+
* Sol/sol.css — plain transform/opacity/filter transitions, guarded for
|
|
94
|
+
* reduced motion and coarse pointers. Sized by the caller class or by the
|
|
95
|
+
* chrome CSS (.dt-nav__start .sol-mark, .dt-start__foot .sol-mark).
|
|
96
|
+
*/
|
|
97
|
+
/** the tan-leather story of saddle: face gradient top, glow and orb */
|
|
98
|
+
const MARK_STORY = '#d6b483';
|
|
99
|
+
/** the deep shade the face gradient settles into */
|
|
100
|
+
const MARK_DEEP = '#8f6b3c';
|
|
101
|
+
/** the warm subtone of the mid layer, contours and contact ellipse */
|
|
102
|
+
const MARK_SOFT = '#f2e3c8';
|
|
103
|
+
/** the warm ivory of the glyph strokes */
|
|
104
|
+
const MARK_IVORY = '#fbf5ea';
|
|
105
|
+
/** the translucent backing of the outlined glyph shapes */
|
|
106
|
+
const MARK_BACKING = 'rgba(255,255,255,.14)';
|
|
107
|
+
/** the asymmetric squircle of the face: tighter shoulders, heavier base */
|
|
108
|
+
const MARK_SQUIRCLE = 'M22 0 L74 0 Q96 0 96 22 L96 66 Q96 96 66 96 L30 96 Q0 96 0 66 L0 22 Q0 0 22 0 Z';
|
|
109
|
+
/** The sandbox engine glyph: the crate drawn in light isometric. */
|
|
110
|
+
function MarkGlyph() {
|
|
111
|
+
return (_jsxs(_Fragment, { children: [_jsx("path", { d: "M31 42.5 L40 33 H65 L56 42.5 Z", fill: MARK_BACKING }), _jsx("path", { d: "M56 42.5 L65 33 V56 L56 65.5 Z", fill: "rgba(255,255,255,.09)" }), _jsx("rect", { x: "31", y: "42.5", width: "25", height: "23", rx: "2.5", fill: MARK_BACKING })] }));
|
|
112
|
+
}
|
|
113
|
+
export function SaddleMark({ className, label = 'Saddle', size, hidden, flow }) {
|
|
114
|
+
const a11y = label && !hidden
|
|
115
|
+
? { role: 'img', 'aria-label': label }
|
|
116
|
+
: { 'aria-hidden': true };
|
|
117
|
+
const sized = size ? { width: size, height: size } : undefined;
|
|
118
|
+
return (_jsxs("span", { className: cn('sol-mark', flow && 'sol-mark--flow', className), style: sized, ...a11y, children: [_jsx("span", { className: "sol-mark__glow" }), _jsxs("svg", { className: "sol-mark__svg", viewBox: "0 0 96 96", "aria-hidden": "true", focusable: "false", children: [_jsxs("defs", { children: [_jsxs("linearGradient", { id: "sdlm-bg", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: MARK_STORY }), _jsx("stop", { offset: ".6", stopColor: MARK_STORY }), _jsx("stop", { offset: "1", stopColor: MARK_DEEP })] }), _jsxs("linearGradient", { id: "sdlm-gloss", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: "#ffffff", stopOpacity: ".32" }), _jsx("stop", { offset: "1", stopColor: "#ffffff", stopOpacity: "0" })] }), _jsxs("radialGradient", { id: "sdlm-orb", cx: ".5", cy: ".5", r: ".5", children: [_jsx("stop", { offset: "0", stopColor: MARK_SOFT, stopOpacity: ".9" }), _jsx("stop", { offset: ".35", stopColor: MARK_SOFT, stopOpacity: ".5" }), _jsx("stop", { offset: "1", stopColor: MARK_SOFT, stopOpacity: "0" })] }), _jsxs("linearGradient", { id: "sdlm-edge-l", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: MARK_SOFT, stopOpacity: "0" }), _jsx("stop", { offset: ".45", stopColor: MARK_SOFT, stopOpacity: ".3" }), _jsx("stop", { offset: "1", stopColor: MARK_SOFT, stopOpacity: ".7" })] }), _jsxs("linearGradient", { id: "sdlm-edge-d", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: MARK_SOFT, stopOpacity: "0" }), _jsx("stop", { offset: ".5", stopColor: MARK_SOFT, stopOpacity: ".22" }), _jsx("stop", { offset: "1", stopColor: MARK_SOFT, stopOpacity: ".55" })] }), _jsxs("linearGradient", { id: "sdlm-sheen", x1: "0", y1: "0", x2: "1", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: "#ffffff", stopOpacity: "0" }), _jsx("stop", { offset: ".45", stopColor: "#ffffff", stopOpacity: ".5" }), _jsx("stop", { offset: ".55", stopColor: "#ffffff", stopOpacity: ".5" }), _jsx("stop", { offset: "1", stopColor: "#ffffff", stopOpacity: "0" })] }), _jsxs("linearGradient", { id: "sdlm-flow-band", x1: "0", y1: "0", x2: "1", y2: "0", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: MARK_SOFT, stopOpacity: "0" }), _jsx("stop", { offset: ".5", stopColor: MARK_SOFT, stopOpacity: ".95" }), _jsx("stop", { offset: "1", stopColor: MARK_SOFT, stopOpacity: "0" })] }), _jsx("filter", { id: "sdlm-soft", x: "-40%", y: "-40%", width: "180%", height: "180%", children: _jsx("feGaussianBlur", { stdDeviation: "3" }) }), _jsx("filter", { id: "sdlm-wide", x: "-60%", y: "-60%", width: "220%", height: "220%", children: _jsx("feGaussianBlur", { stdDeviation: "8" }) }), _jsx("filter", { id: "sdlm-lift", x: "-40%", y: "-40%", width: "180%", height: "180%", children: _jsx("feDropShadow", { dx: "0", dy: "2", stdDeviation: "2", floodColor: MARK_DEEP, floodOpacity: ".38" }) }), _jsxs("filter", { id: "sdlm-grain", x: "0%", y: "0%", width: "100%", height: "100%", children: [_jsx("feTurbulence", { type: "fractalNoise", baseFrequency: "0.9", numOctaves: "2", stitchTiles: "stitch", result: "n" }), _jsx("feColorMatrix", { in: "n", type: "saturate", values: "0" }), _jsx("feComposite", { operator: "in", in2: "SourceGraphic" })] }), _jsx("clipPath", { id: "sdlm-clip", children: _jsx("path", { d: MARK_SQUIRCLE }) })] }), _jsx("path", { d: MARK_SQUIRCLE, fill: "url(#sdlm-bg)" }), _jsx("path", { d: MARK_SQUIRCLE, fill: "url(#sdlm-gloss)", opacity: ".5" }), _jsxs("g", { clipPath: "url(#sdlm-clip)", children: [_jsxs("g", { className: "sol-mark__mid", children: [_jsx("circle", { cx: "48", cy: "40", r: "25", fill: "url(#sdlm-orb)", filter: "url(#sdlm-wide)", opacity: ".85" }), _jsx("rect", { x: "-12", y: "56", width: "120", height: "44", fill: MARK_SOFT, opacity: ".3", filter: "url(#sdlm-soft)" })] }), _jsx("path", { d: MARK_SQUIRCLE, fill: "none", stroke: "url(#sdlm-edge-d)", strokeWidth: "6", filter: "url(#sdlm-wide)", opacity: ".55", transform: "translate(1.4 1.9) scale(0.97)" }), _jsx("path", { d: MARK_SQUIRCLE, fill: "none", stroke: "url(#sdlm-edge-l)", strokeWidth: "2.5", filter: "url(#sdlm-soft)", opacity: ".5" }), _jsx("ellipse", { cx: "48", cy: "94", rx: "30", ry: "7", fill: "url(#sdlm-orb)", filter: "url(#sdlm-soft)", opacity: ".55" }), _jsx("g", { className: "sol-mark__sheen", children: _jsx("rect", { x: "-11", y: "-24", width: "26", height: "144", fill: "url(#sdlm-sheen)", transform: "skewX(-16)" }) }), _jsx("path", { d: MARK_SQUIRCLE, fill: "#ffffff", filter: "url(#sdlm-grain)", opacity: ".08" })] }), _jsx("g", { filter: "url(#sdlm-lift)", children: _jsx("g", { className: "sol-mark__glyph", fill: "none", stroke: MARK_IVORY, strokeWidth: "5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx(MarkGlyph, {}) }) }), flow ? (_jsx("g", { className: "sol-mark__flow", fill: "none", stroke: "url(#sdlm-flow-band)", strokeWidth: "3.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx(MarkGlyph, {}) })) : null] })] }));
|
|
119
|
+
}
|
|
120
|
+
export function SectionRail({ number, label }) {
|
|
121
|
+
return (_jsxs("div", { className: "section-rail", role: "group", "aria-label": `${number} ${label}`, children: [_jsx("span", { className: "rail-number", children: number }), _jsx("span", { className: "rail-line" }), _jsx("span", { className: "rail-label", children: label })] }));
|
|
122
|
+
}
|
|
123
|
+
/** the rail of the app, SECTIONED: workspace, platform, library and
|
|
124
|
+
* account — one entry per page route, the apex home first. exported for
|
|
125
|
+
* the onboarding copy beside this folder. */
|
|
126
|
+
export const NAV_SECTIONS = [
|
|
127
|
+
{
|
|
128
|
+
id: 'workspace',
|
|
129
|
+
label: 'workspace',
|
|
130
|
+
apps: [
|
|
131
|
+
{ href: '/', label: 'home', detail: 'the thesis and the machine', icon: LayoutDashboard },
|
|
132
|
+
{
|
|
133
|
+
href: '/dashboard',
|
|
134
|
+
label: 'dashboard',
|
|
135
|
+
detail: 'sessions, users and the admin panel',
|
|
136
|
+
icon: Gauge,
|
|
137
|
+
},
|
|
138
|
+
{ href: '/console', label: 'console', detail: 'operations and events', icon: TerminalSquare },
|
|
139
|
+
{
|
|
140
|
+
href: '/playground',
|
|
141
|
+
label: 'playground',
|
|
142
|
+
detail: 'map requests, never run them',
|
|
143
|
+
icon: FlaskConical,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'platform',
|
|
149
|
+
label: 'platform',
|
|
150
|
+
apps: [
|
|
151
|
+
{ href: '/compute', label: 'compute', detail: 'execution layers and tiers', icon: Cpu },
|
|
152
|
+
{
|
|
153
|
+
href: '/integrations',
|
|
154
|
+
label: 'integrations',
|
|
155
|
+
detail: 'surfaces and bridges',
|
|
156
|
+
icon: PlugZap,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
href: '/agent-browser',
|
|
160
|
+
label: 'agentbrowser',
|
|
161
|
+
detail: "the agent's own browser",
|
|
162
|
+
icon: AppWindow,
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: 'library',
|
|
168
|
+
label: 'library',
|
|
169
|
+
apps: [
|
|
170
|
+
{ href: '/docs', label: 'docs', detail: 'the working notes', icon: BookOpen },
|
|
171
|
+
{
|
|
172
|
+
href: '/architecture',
|
|
173
|
+
label: 'architecture',
|
|
174
|
+
detail: 'repo, CI, pages, buckets',
|
|
175
|
+
icon: Boxes,
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'account',
|
|
181
|
+
label: 'account',
|
|
182
|
+
apps: [
|
|
183
|
+
{ href: '/login', label: 'login', detail: 'sign in to the node', icon: LogIn },
|
|
184
|
+
{ href: '/register', label: 'register', detail: 'create the local account', icon: UserPlus },
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
/** the pages the window hosts, flattened (the onboarding facts read this). */
|
|
189
|
+
export const START_APPS = NAV_SECTIONS.flatMap((section) => section.apps);
|
|
190
|
+
/** one accent-dotted family link of the rail foot (spec §12): the sibling
|
|
191
|
+
* deploy units beside saddle, each linked by the familyurl contract with the
|
|
192
|
+
* accent dot riding the shared family.ts table — the same row the node:test
|
|
193
|
+
* suite pins, so the rail foot can never drift from the landing footer. */
|
|
194
|
+
function FamilyRail() {
|
|
195
|
+
return (_jsx("div", { className: "winapp__family", children: familyrow().map((member) => (_jsxs("a", { className: "winapp__famlink", href: familyurl(member.slug), target: "_blank", rel: "noreferrer", title: `${member.slug} — opens in a new tab`, "aria-label": `open ${member.slug} in a new tab`, style: { '--fam-dot': member.accent }, children: [_jsx("span", { className: "winapp__famdot", "aria-hidden": "true" }), _jsx("span", { className: "winapp__famlabel", children: member.slug })] }, member.slug))) }));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* the theme flip of the rail foot: flips the document theme class,
|
|
199
|
+
* stores nothing (the in-memory doctrine of the app surface).
|
|
200
|
+
*
|
|
201
|
+
* @returns the toggle element.
|
|
202
|
+
*/
|
|
203
|
+
function ThemeToggle() {
|
|
204
|
+
const [theme, setTheme] = useState(() => typeof document === 'undefined' || document.documentElement.classList.contains('dark')
|
|
205
|
+
? 'dark'
|
|
206
|
+
: 'light');
|
|
207
|
+
/** flips the dark class on the root and mirrors it into the label. */
|
|
208
|
+
function toggle() {
|
|
209
|
+
const next = theme === 'dark' ? 'light' : 'dark';
|
|
210
|
+
document.documentElement.classList.toggle('dark', next === 'dark');
|
|
211
|
+
setTheme(next);
|
|
212
|
+
}
|
|
213
|
+
return (_jsxs("button", { type: "button", className: "winapp__theme", "aria-label": "toggle theme", onClick: toggle, children: [theme === 'dark' ? (_jsx(Sun, { fontSize: 14, "aria-hidden": "true" })) : (_jsx(Moon, { fontSize: 14, "aria-hidden": "true" })), theme] }));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* the app surface: the SECTIONED page rail and the routed stage beside it,
|
|
217
|
+
* owning the whole viewport.
|
|
218
|
+
*
|
|
219
|
+
* @param children the routed page.
|
|
220
|
+
* @returns the app surface element.
|
|
221
|
+
*/
|
|
222
|
+
export function Shell({ children, themeButton = true }) {
|
|
223
|
+
// the embedded contract: inside the os power clip the app rides the host
|
|
224
|
+
// window chrome — the seat class answers the mount, the surface tree
|
|
225
|
+
// never changes between the two doors (the window-era law: one design)
|
|
226
|
+
const framed = (() => {
|
|
227
|
+
try {
|
|
228
|
+
return window.self !== window.top;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
})();
|
|
234
|
+
const [location] = useLocation();
|
|
235
|
+
// the active rail entry: the bare path owns home, every other page owns its route
|
|
236
|
+
const isActive = (href) => href === '/' ? location === '/' : location === href || location.startsWith(`${href}/`);
|
|
237
|
+
// the embedded seat: inside the os power clip the app rides the host
|
|
238
|
+
// window chrome, but the SURFACE stays the same — the seat class
|
|
239
|
+
// answers the mount so differential styles (if any) can find it, the
|
|
240
|
+
// tree never changes between the two doors (the window-era law: one
|
|
241
|
+
// design)
|
|
242
|
+
const seat = framed ? 'shell--embedded' : 'shell--standalone';
|
|
243
|
+
// the surface pass: the direct url answers full-bleed — the window
|
|
244
|
+
// chrome exists only inside the os power clip, so the app owns the whole
|
|
245
|
+
// viewport; the SECTIONED page rail stays as the app's own navigation
|
|
246
|
+
// and the routed stage fills the rest of the screen
|
|
247
|
+
return (_jsx("div", { className: `shell ${seat}`, children: _jsxs("div", { className: "winapp__body", children: [_jsxs("nav", { className: "winapp__rail", "aria-label": "Pages", children: [NAV_SECTIONS.map((section) => (_jsxs("div", { className: "winapp__section", children: [_jsx("p", { className: "winapp__sectionlabel", "aria-hidden": "true", children: section.label }), section.apps.map((app) => {
|
|
248
|
+
const Icon = app.icon;
|
|
249
|
+
return (_jsxs(Link, { href: app.href, className: "winapp__raillink", title: app.detail, "aria-label": app.label, "aria-current": isActive(app.href) ? 'page' : undefined, children: [_jsx(Icon, { fontSize: 16, strokeWidth: 1.7, "aria-hidden": "true" }), _jsx("span", { className: "winapp__raillabel", children: app.label })] }, app.href));
|
|
250
|
+
})] }, section.id))), _jsxs("div", { className: "winapp__railfoot", children: [_jsx("p", { className: "winapp__familyhead", "aria-hidden": "true", children: "family" }), _jsx(FamilyRail, {}), themeButton ? _jsx(ThemeToggle, {}) : null] })] }), _jsx("div", { className: "winapp__stage", children: _jsx("main", { className: "shell", children: children }) })] }) }));
|
|
251
|
+
}
|
|
252
|
+
export default Shell;
|
|
253
|
+
// the prop keeps its public name `label` for every caller; the local
|
|
254
|
+
// binding answers `pagelabel` so the label store accessor the footer
|
|
255
|
+
// reads stays in scope (the copy law — no shadow, no hardcoded string).
|
|
256
|
+
export function PageShell({ section, label: pagelabel, title, intro, children, media }) {
|
|
257
|
+
return (_jsxs("div", { className: "site-frame", children: [_jsxs("main", { children: [_jsxs("section", { className: "page-intro halftone container", children: [_jsx(SectionRail, { number: section, label: pagelabel }), _jsxs("div", { className: "page-intro-copy", children: [_jsxs("p", { className: "eyebrow", children: ["saddle \u00B7 ", pagelabel] }), _jsx("h1", { className: "page-title", children: title }), _jsx("p", { className: "page-intro-text", children: intro })] }), media && (_jsx("figure", { className: "page-intro-art media-area", style: { aspectRatio: media.ratio }, "aria-label": "media area", children: _jsxs("figcaption", { children: [_jsx("span", { children: media.label }), _jsx("span", { children: media.caption })] }) }))] }), _jsx("div", { className: "page-content container", children: children })] }), _jsxs("footer", { className: "site-footer container", children: [_jsx("span", { children: label('home.footer.copyright') }), _jsx("span", { className: "mono-label", children: label('home.footer.mono') })] })] }));
|
|
258
|
+
}
|
|
259
|
+
/* ================================== button ============================= */
|
|
260
|
+
const buttonVariants = cva(
|
|
261
|
+
// biome-ignore lint/security/noSecrets: the cva base string is a tailwind utility list, not a credential
|
|
262
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
|
|
263
|
+
variants: {
|
|
264
|
+
variant: {
|
|
265
|
+
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
266
|
+
destructive: 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
|
|
267
|
+
outline: 'border bg-transparent shadow-xs hover:bg-accent dark:bg-transparent dark:border-input dark:hover:bg-input/50',
|
|
268
|
+
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
|
|
269
|
+
ghost: 'hover:bg-accent dark:hover:bg-accent/50',
|
|
270
|
+
link: 'text-primary underline-offset-4 hover:underline',
|
|
271
|
+
},
|
|
272
|
+
size: {
|
|
273
|
+
default: 'h-9 px-4 py-2 has-[>svg]:px-3',
|
|
274
|
+
sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',
|
|
275
|
+
lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
|
|
276
|
+
icon: 'size-9',
|
|
277
|
+
'icon-sm': 'size-8',
|
|
278
|
+
'icon-lg': 'size-10',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
defaultVariants: {
|
|
282
|
+
variant: 'default',
|
|
283
|
+
size: 'default',
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
function Button({ className, variant, size, asChild = false, ...props }) {
|
|
287
|
+
const Comp = asChild ? Slot : 'button';
|
|
288
|
+
return (_jsx(Comp, { "data-slot": "button", className: cn(buttonVariants({ variant, size, className })), ...props }));
|
|
289
|
+
}
|
|
290
|
+
/* =================================== card ============================== */
|
|
291
|
+
function Card({ className, ...props }) {
|
|
292
|
+
return (_jsx("div", { "data-slot": "card", className: cn('bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm', className), ...props }));
|
|
293
|
+
}
|
|
294
|
+
function CardHeader({ className, ...props }) {
|
|
295
|
+
return (_jsx("div", { "data-slot": "card-header", className: cn('@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6', className), ...props }));
|
|
296
|
+
}
|
|
297
|
+
function CardTitle({ className, ...props }) {
|
|
298
|
+
return (_jsx("div", { "data-slot": "card-title", className: cn('leading-none font-semibold', className), ...props }));
|
|
299
|
+
}
|
|
300
|
+
function CardDescription({ className, ...props }) {
|
|
301
|
+
return (_jsx("div", { "data-slot": "card-description", className: cn('text-muted-foreground text-sm', className), ...props }));
|
|
302
|
+
}
|
|
303
|
+
function CardAction({ className, ...props }) {
|
|
304
|
+
return (_jsx("div", { "data-slot": "card-action", className: cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className), ...props }));
|
|
305
|
+
}
|
|
306
|
+
function CardContent({ className, ...props }) {
|
|
307
|
+
return _jsx("div", { "data-slot": "card-content", className: cn('px-6', className), ...props });
|
|
308
|
+
}
|
|
309
|
+
function CardFooter({ className, ...props }) {
|
|
310
|
+
return (_jsx("div", { "data-slot": "card-footer", className: cn('flex items-center px-6 [.border-t]:pt-6', className), ...props }));
|
|
311
|
+
}
|
|
312
|
+
/* ================================= tooltip ============================= */
|
|
313
|
+
function TooltipProvider({ delayDuration = 0, ...props }) {
|
|
314
|
+
return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
|
|
315
|
+
}
|
|
316
|
+
function Tooltip({ ...props }) {
|
|
317
|
+
return (_jsx(TooltipProvider, { children: _jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) }));
|
|
318
|
+
}
|
|
319
|
+
function TooltipTrigger({ ...props }) {
|
|
320
|
+
return _jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
|
|
321
|
+
}
|
|
322
|
+
function TooltipContent({ className, sideOffset = 0, children, ...props }) {
|
|
323
|
+
return (_jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { "data-slot": "tooltip-content", sideOffset: sideOffset, className: cn('bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance', className), ...props, children: [children, _jsx(TooltipPrimitive.Arrow, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })] }) }));
|
|
324
|
+
}
|
|
325
|
+
/* ================================== sonner ============================= */
|
|
326
|
+
const Toaster = ({ ...props }) => {
|
|
327
|
+
const { theme = 'system' } = useNextTheme();
|
|
328
|
+
return (_jsx(Sonner, { theme: theme, className: "toaster group", style: {
|
|
329
|
+
'--normal-bg': 'var(--popover)',
|
|
330
|
+
'--normal-text': 'var(--popover-foreground)',
|
|
331
|
+
'--normal-border': 'var(--border)',
|
|
332
|
+
}, ...props }));
|
|
333
|
+
};
|
|
334
|
+
/* ================================ exports ============================== */
|
|
335
|
+
export { Button, buttonVariants, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the boot ladder strip: one tile per boot class with the ceiling the
|
|
3
|
+
* records state — while the plan loads the tiles skeleton, when the engine
|
|
4
|
+
* does not answer the tiles say unreached instead of inventing numbers.
|
|
5
|
+
*/
|
|
6
|
+
export default function ComputeBootladder(): import("react").JSX.Element;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Signal & Ledger: the boot ladder — the three boot classes with the
|
|
3
|
+
// ceilings the records themselves state. The winget fetches the plan on
|
|
4
|
+
// mount and computes the hot / warm / cold floors and ceilings from the
|
|
5
|
+
// fetched records; no number in this file is fixed.
|
|
6
|
+
import { TimerRegular as Ladder } from "@fluentui/react-icons";
|
|
7
|
+
import { useEffect, useState } from "react";
|
|
8
|
+
import { fetchmodalities } from "../../api.ts";
|
|
9
|
+
/** the three boot classes of the plan: the class names are the ladder
|
|
10
|
+
* shape (ui scaffolding), every number comes from the fetched records. */
|
|
11
|
+
const classes = ["hot", "warm", "cold"];
|
|
12
|
+
/** computes the rungs from the fetched records: min / max bootms per class,
|
|
13
|
+
* empty classes stay out of the ladder. */
|
|
14
|
+
function rungsof(plan) {
|
|
15
|
+
return classes
|
|
16
|
+
.map((boot) => {
|
|
17
|
+
const times = plan.records.filter((record) => record.boot === boot).map((record) => record.bootms);
|
|
18
|
+
return {
|
|
19
|
+
boot,
|
|
20
|
+
count: times.length,
|
|
21
|
+
floor: times.length > 0 ? Math.min(...times) : 0,
|
|
22
|
+
ceiling: times.length > 0 ? Math.max(...times) : 0,
|
|
23
|
+
};
|
|
24
|
+
})
|
|
25
|
+
.filter((rung) => rung.count > 0);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* the boot ladder strip: one tile per boot class with the ceiling the
|
|
29
|
+
* records state — while the plan loads the tiles skeleton, when the engine
|
|
30
|
+
* does not answer the tiles say unreached instead of inventing numbers.
|
|
31
|
+
*/
|
|
32
|
+
export default function ComputeBootladder() {
|
|
33
|
+
const [plan, setplan] = useState(null);
|
|
34
|
+
const [failed, setfailed] = useState(false);
|
|
35
|
+
/** the ladder mount: read the plan once; null means the engine slept. */
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
let cancelled = false;
|
|
38
|
+
fetchmodalities()
|
|
39
|
+
.then((result) => {
|
|
40
|
+
if (cancelled)
|
|
41
|
+
return;
|
|
42
|
+
if (result === null) {
|
|
43
|
+
setfailed(true);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
setfailed(false);
|
|
47
|
+
setplan(result);
|
|
48
|
+
})
|
|
49
|
+
.catch(() => {
|
|
50
|
+
if (!cancelled)
|
|
51
|
+
setfailed(true);
|
|
52
|
+
});
|
|
53
|
+
return () => {
|
|
54
|
+
cancelled = true;
|
|
55
|
+
};
|
|
56
|
+
}, []);
|
|
57
|
+
const rungs = plan === null ? [] : rungsof(plan);
|
|
58
|
+
const loading = plan === null && !failed;
|
|
59
|
+
return (_jsxs("section", { className: "content-section", "aria-label": "the boot ladder of the engine plan", children: [_jsxs("div", { className: "content-section-heading", children: [_jsx("p", { className: "eyebrow", children: "BOOT LADDER / CLASSES" }), _jsxs("span", { className: "mono-label", children: [_jsx(Ladder, { fontSize: 12, "aria-hidden": "true" }), " ", failed ? "engine unreachable" : "ceilings from the records"] })] }), _jsx("div", { className: "metric-strip", children: classes.map((boot) => {
|
|
60
|
+
const rung = rungs.find((entry) => entry.boot === boot);
|
|
61
|
+
return (_jsxs("div", { className: "metric", children: [_jsx("span", { className: "metric-value", children: loading ? _jsx("span", { className: "dash-skeleton" }) : rung === undefined ? "—" : `${rung.ceiling} ms` }), _jsx("span", { className: "metric-label", children: failed
|
|
62
|
+
? `${boot} · unreached`
|
|
63
|
+
: rung === undefined
|
|
64
|
+
? `${boot} · empty class`
|
|
65
|
+
: `${boot} · boot ceiling` }), _jsx("span", { className: "metric-detail", children: failed
|
|
66
|
+
? "the engine did not answer"
|
|
67
|
+
: rung === undefined
|
|
68
|
+
? "the plan carries no member"
|
|
69
|
+
: `floor ${rung.floor} ms · ${rung.count} modalities` })] }, boot));
|
|
70
|
+
}) })] }));
|
|
71
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the modality catalog surface: the plan counts strip, then one row per
|
|
3
|
+
* record the engine serves — loading renders skeleton rows, an unreachable
|
|
4
|
+
* engine renders the honest single line, an empty plan renders the empty
|
|
5
|
+
* caption.
|
|
6
|
+
*/
|
|
7
|
+
export default function ComputeModalitycatalog(): import("react").JSX.Element;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Signal & Ledger: the compute face — the modality catalog the engine
|
|
3
|
+
// states about itself. The winget carries zero fixed records: the plan
|
|
4
|
+
// counts and every table row arrive from /api/v1/modalities on mount (the
|
|
5
|
+
// wingets consume the db through the api, never a shipped array), and
|
|
6
|
+
// when the engine does not answer the surface says so in one line
|
|
7
|
+
// instead of painting rows it does not have.
|
|
8
|
+
import { TableSimpleRegular as Catalog } from "@fluentui/react-icons";
|
|
9
|
+
import { useEffect, useState } from "react";
|
|
10
|
+
import { fetchmodalities } from "../../api.ts";
|
|
11
|
+
/** the plan-state tones ride the house chip system: live keeps the success
|
|
12
|
+
* ink, host the neutral chip, planned the muted one — no new colors. */
|
|
13
|
+
const statetone = {
|
|
14
|
+
live: "dash-chip online",
|
|
15
|
+
host: "dash-chip",
|
|
16
|
+
planned: "dash-chip off",
|
|
17
|
+
};
|
|
18
|
+
/** the static legend: ui copy, not data — what each plan state means. */
|
|
19
|
+
const legend = "live runs on the edge engine today · host answers when the guest host provides the lane · planned seats wait in the roadmap";
|
|
20
|
+
/** the honest error line: the engine is the only source of rows. */
|
|
21
|
+
const unreachable = "the engine is unreachable — the catalog rides the saddle api";
|
|
22
|
+
/** the skeleton row widths while the plan loads (a descending ladder so
|
|
23
|
+
* the shimmer reads as rows, not bars). */
|
|
24
|
+
const skeletonwidths = [94, 88, 82, 76, 70, 64];
|
|
25
|
+
/** the lane flags of one record as one mono cell (gpu / network). */
|
|
26
|
+
function laneflags(record) {
|
|
27
|
+
const flags = [record.gpu ? "gpu" : "", record.network ? "net" : ""].filter(Boolean);
|
|
28
|
+
return flags.length > 0 ? flags.join(" · ") : "—";
|
|
29
|
+
}
|
|
30
|
+
/** one honest tile of the plan counts strip. */
|
|
31
|
+
function Count({ value, label, detail }) {
|
|
32
|
+
return (_jsxs("div", { className: "metric", children: [_jsx("span", { className: "metric-value", children: value === "load" ? _jsx("span", { className: "dash-skeleton" }) : value }), _jsx("span", { className: "metric-label", children: label }), _jsx("span", { className: "metric-detail", children: detail })] }));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* the modality catalog surface: the plan counts strip, then one row per
|
|
36
|
+
* record the engine serves — loading renders skeleton rows, an unreachable
|
|
37
|
+
* engine renders the honest single line, an empty plan renders the empty
|
|
38
|
+
* caption.
|
|
39
|
+
*/
|
|
40
|
+
export default function ComputeModalitycatalog() {
|
|
41
|
+
const [plan, setplan] = useState(null);
|
|
42
|
+
const [failed, setfailed] = useState(false);
|
|
43
|
+
/** the catalog mount: read the plan once; null means the engine slept. */
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
let cancelled = false;
|
|
46
|
+
fetchmodalities()
|
|
47
|
+
.then((result) => {
|
|
48
|
+
if (cancelled)
|
|
49
|
+
return;
|
|
50
|
+
if (result === null) {
|
|
51
|
+
setfailed(true);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
setfailed(false);
|
|
55
|
+
setplan(result);
|
|
56
|
+
})
|
|
57
|
+
.catch(() => {
|
|
58
|
+
if (!cancelled)
|
|
59
|
+
setfailed(true);
|
|
60
|
+
});
|
|
61
|
+
return () => {
|
|
62
|
+
cancelled = true;
|
|
63
|
+
};
|
|
64
|
+
}, []);
|
|
65
|
+
const records = plan === null ? [] : plan.records;
|
|
66
|
+
const loading = plan === null && !failed;
|
|
67
|
+
return (_jsxs("section", { className: "content-section", "aria-label": "the modality catalog served by the saddle api", children: [_jsxs("div", { className: "content-section-heading", children: [_jsx("p", { className: "eyebrow", children: "MODALITY CATALOG / THE PLAN" }), _jsxs("span", { className: "mono-label", children: [_jsx(Catalog, { fontSize: 12, "aria-hidden": "true" }), " served by the engine api"] })] }), failed ? (_jsx("p", { className: "dash-panelerror", children: unreachable })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "metric-strip", children: [_jsx(Count, { value: loading ? "load" : (plan?.plancount ?? 0), label: "modalities", detail: "the plan total" }), _jsx(Count, { value: loading ? "load" : (plan?.live ?? 0), label: "live", detail: "running on the edge engine" }), _jsx(Count, { value: loading ? "load" : (plan?.host ?? 0), label: "host", detail: "host-gated lanes" }), _jsx(Count, { value: loading ? "load" : (plan?.planned ?? 0), label: "planned", detail: "roadmap seats" })] }), _jsx("section", { className: "dash-tablescroll",
|
|
68
|
+
// biome-ignore lint/a11y/noNoninteractiveTabindex: deliberate wcag scrollable-region pattern: the tabIndex keeps the overflowing catalog keyboard-scrollable; the table itself only presents rows
|
|
69
|
+
tabIndex: 0, "aria-label": "the modality catalog table", children: _jsxs("table", { children: [loading && _jsx("caption", { className: "dash-empty", children: "reading the plan from the engine\u2026" }), !loading && records.length === 0 && (_jsx("caption", { className: "dash-empty", children: "the engine carries no records yet" })), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "id" }), _jsx("th", { scope: "col", children: "label" }), _jsx("th", { scope: "col", children: "family" }), _jsx("th", { scope: "col", children: "state" }), _jsx("th", { scope: "col", children: "boot" }), _jsx("th", { scope: "col", children: "lanes" })] }) }), _jsxs("tbody", { children: [loading &&
|
|
70
|
+
skeletonwidths.map((width) => (_jsx("tr", { children: _jsx("td", { colSpan: 6, children: _jsx("span", { className: "dash-skeleton", style: { width: `${width}%` } }) }) }, `skeleton-${width}`))), records.map((record) => (_jsxs("tr", { children: [_jsx("td", { className: "wrapcell", children: record.id }), _jsx("td", { children: record.label }), _jsx("td", { children: record.family }), _jsx("td", { children: _jsx("span", { className: statetone[record.state], children: record.state }) }), _jsxs("td", { children: [record.boot, " \u00B7 ", record.bootms, " ms"] }), _jsx("td", { children: laneflags(record) })] }, record.id)))] })] }) }), _jsx("p", { className: "dash-statusnote", children: legend })] }))] }));
|
|
71
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/** the engine-mode badge ("api connected (v..., uptime ...s)" or local). */
|
|
3
|
+
export default function ApiBadge({ apion, label }) {
|
|
4
|
+
return (_jsx("span", { className: apion ? 'api-badge apion' : 'api-badge', "aria-live": "polite", children: label }));
|
|
5
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the edge-law band: a single slim line above the console content — the
|
|
3
|
+
* shield, the law sentence and, once the engine answers, the live / host /
|
|
4
|
+
* planned micro-counts of the modality plan.
|
|
5
|
+
*/
|
|
6
|
+
export default function ConsoleEdgelaw(): import("react").JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// The Law Banner: the console states the execution law — every pass runs
|
|
3
|
+
// on the saddle edge engine over the internet, never on the visitor
|
|
4
|
+
// machine (no visitor browser, gpu or cpu). The micro-counts (live / host
|
|
5
|
+
// / planned) arrive from /api/v1/modalities on mount; while they load the
|
|
6
|
+
// sentence stands alone.
|
|
7
|
+
import { ShieldTaskRegular as Shield } from "@fluentui/react-icons";
|
|
8
|
+
import { useEffect, useState } from "react";
|
|
9
|
+
import { fetchmodalities } from "../../api.ts";
|
|
10
|
+
/** the law the console carries: one sentence, lowercase english. */
|
|
11
|
+
const lawsentence = "the saddle edge engine executes every pass — nothing runs on the visitor machine";
|
|
12
|
+
/**
|
|
13
|
+
* the edge-law band: a single slim line above the console content — the
|
|
14
|
+
* shield, the law sentence and, once the engine answers, the live / host /
|
|
15
|
+
* planned micro-counts of the modality plan.
|
|
16
|
+
*/
|
|
17
|
+
export default function ConsoleEdgelaw() {
|
|
18
|
+
const [plan, setplan] = useState(null);
|
|
19
|
+
/** the banner mount: read the plan once; silence keeps the sentence alone. */
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
let cancelled = false;
|
|
22
|
+
fetchmodalities()
|
|
23
|
+
.then((result) => {
|
|
24
|
+
if (!cancelled && result !== null) {
|
|
25
|
+
setplan(result);
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
.catch(() => {
|
|
29
|
+
/* the sentence alone is the honest floor when the engine sleeps */
|
|
30
|
+
});
|
|
31
|
+
return () => {
|
|
32
|
+
cancelled = true;
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
return (_jsxs("p", { className: "r3-declared-ribbon", role: "note", children: [_jsx(Shield, { fontSize: 13, "aria-hidden": "true" }), " ", lawsentence, plan !== null && ` · live ${plan.live} · host ${plan.host} · planned ${plan.planned}`] }));
|
|
36
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** timeline entry kinds tinting the left border. */
|
|
2
|
+
export type SandboxEventKind = 'lifecycle' | 'exec' | 'snapshot';
|
|
3
|
+
/** one bus event row: stamp, sequence, topic and detail. */
|
|
4
|
+
export type SandboxEvent = {
|
|
5
|
+
id: number;
|
|
6
|
+
time: string;
|
|
7
|
+
topic: string;
|
|
8
|
+
detail: string;
|
|
9
|
+
kind: SandboxEventKind;
|
|
10
|
+
};
|
|
11
|
+
type EventsTimelineProps = {
|
|
12
|
+
events: SandboxEvent[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* the bus event timeline (role=log, polite aria-live); the empty state
|
|
16
|
+
* matches the static page ("no events yet; start the sandbox.").
|
|
17
|
+
*/
|
|
18
|
+
export default function EventsTimeline({ events }: EventsTimelineProps): import("react").JSX.Element;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Events timeline: faithful absorption of the console.html bus events aside —
|
|
3
|
+
// the newest event on top, kind-tinted left borders and a 50 entry cap
|
|
4
|
+
// maintained by the console page.
|
|
5
|
+
import { label } from '../../labels.ts';
|
|
6
|
+
/**
|
|
7
|
+
* the bus event timeline (role=log, polite aria-live); the empty state
|
|
8
|
+
* matches the static page ("no events yet; start the sandbox.").
|
|
9
|
+
*/
|
|
10
|
+
export default function EventsTimeline({ events }) {
|
|
11
|
+
return (_jsxs("aside", { className: "events-panel", "aria-labelledby": "eventstitle", children: [_jsx("h2", { className: "sandbox-panel-title", id: "eventstitle", children: label('console.events.title') }), _jsx("ol", { className: "events-list", role: "log", "aria-live": "polite", "aria-label": label('console.events.aria'), children: events.length === 0 ? (_jsx("li", { className: "events-empty", children: label('console.events.empty') })) : (events.map((event) => (_jsxs("li", { className: event.kind, children: [_jsx("span", { className: "event-time", children: `${event.time} #${event.id} ` }), _jsx("span", { className: "event-topic", children: event.topic }), _jsx("span", { className: "event-detail", children: event.detail })] }, event.id)))) })] }));
|
|
12
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type SnapshotControlsProps = {
|
|
2
|
+
running: boolean;
|
|
3
|
+
onsnapshot: () => void;
|
|
4
|
+
onstop: () => void;
|
|
5
|
+
};
|
|
6
|
+
/** the snapshot and teardown buttons of the running sandbox. */
|
|
7
|
+
export default function SnapshotControls({ running, onsnapshot, onstop }: SnapshotControlsProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Snapshot controls: faithful absorption of the console.html snapshot/stop
|
|
3
|
+
// buttons — both stay disabled until a sandbox is running.
|
|
4
|
+
import { label } from '../../labels.ts';
|
|
5
|
+
/** the snapshot and teardown buttons of the running sandbox. */
|
|
6
|
+
export default function SnapshotControls({ running, onsnapshot, onstop }) {
|
|
7
|
+
return (_jsxs(_Fragment, { children: [_jsx("button", { className: "button", type: "button", disabled: !running, onClick: onsnapshot, "aria-label": label('console.snapshotAria'), children: label('console.snapshot') }), _jsx("button", { className: "button", type: "button", disabled: !running, onClick: onstop, "aria-label": label('console.stopAria'), children: label('console.stop') })] }));
|
|
8
|
+
}
|