@wenathlan/saddle 2.0.154 → 2.0.155
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/Dockerfile +112 -41
- package/README.md +58 -59
- package/browser.ts +482 -0
- package/cli.ts +274 -0
- package/distribution.ts +731 -0
- package/docker.config +29 -8
- package/docs/artifactavailability.md +2 -2
- package/docs/browser.md +18 -1
- package/docs/{containerplatforms.2.1.0.md → containerplatforms210.md} +1 -1
- package/docs/{documentmap.1.8.12.md → documentmap1812.md} +1 -1
- package/docs/extension.md +13 -2
- package/docs/libraryapi.md +1 -1
- package/docs/{ninety.modalities.md → ninetymodalities.md} +87 -4
- package/docs/{planning.ninety.md → planningninety.md} +6 -6
- package/docs/{releasenotes.1.8.13.md → releasenotes1813.md} +2 -2
- package/docs/{releasenotes.1.8.14.md → releasenotes1814.md} +1 -1
- package/docs/{repo.synthesis.1.8.16.md → reposynthesis1816.md} +1 -1
- package/docs/todo.md +2 -2
- package/docs/{todo.1.8.15.md → todo1815.md} +1 -1
- package/docs/{todo.1.8.16.md → todo1816.md} +5 -5
- package/execution.ts +677 -0
- package/foundation.ts +314 -0
- package/index.ts +35 -27
- package/isolation.ts +84 -0
- package/modes.ts +170 -0
- package/mttg.config +1 -1
- package/orchestrator.ts +49 -15
- package/package.json +90 -75
- package/qemu.config +2 -2
- package/sandbox.ts +2094 -0
- package/scheduler.ts +1 -1
- package/server.ts +52 -0
- package/tsconfig.json +11 -12
- package/virtual.ts +1105 -0
- package/virtualgpu.ts +1 -1
- package/virtualization.ts +1 -1
- package/workloadlaw.ts +293 -0
- package/dist/App.d.ts +0 -5
- package/dist/App.js +0 -52
- package/dist/Sol/Sol.d.ts +0 -3
- package/dist/Sol/Sol.js +0 -46
- package/dist/Sol/agentbrowser/agentbrowser.d.ts +0 -9
- package/dist/Sol/agentbrowser/agentbrowser.js +0 -121
- package/dist/Sol/architecture/architecture.d.ts +0 -9
- package/dist/Sol/architecture/architecture.js +0 -93
- package/dist/Sol/compute/compute.d.ts +0 -9
- package/dist/Sol/compute/compute.js +0 -22
- package/dist/Sol/console/console.d.ts +0 -15
- package/dist/Sol/console/console.js +0 -292
- package/dist/Sol/dashboard/dashboard.d.ts +0 -10
- package/dist/Sol/dashboard/dashboard.js +0 -181
- package/dist/Sol/docs/docs.d.ts +0 -9
- package/dist/Sol/docs/docs.js +0 -28
- package/dist/Sol/home/home.d.ts +0 -35
- package/dist/Sol/home/home.js +0 -239
- package/dist/Sol/integrations/integrations.d.ts +0 -9
- package/dist/Sol/integrations/integrations.js +0 -83
- package/dist/Sol/intro/intro.d.ts +0 -7
- package/dist/Sol/intro/intro.js +0 -102
- package/dist/Sol/login/login.d.ts +0 -16
- package/dist/Sol/login/login.js +0 -49
- package/dist/Sol/notfound/notfound.d.ts +0 -9
- package/dist/Sol/notfound/notfound.js +0 -15
- package/dist/Sol/onboarding/onboarding.d.ts +0 -25
- package/dist/Sol/onboarding/onboarding.js +0 -60
- package/dist/Sol/playground/playground.d.ts +0 -9
- package/dist/Sol/playground/playground.js +0 -127
- package/dist/Sol/register/register.d.ts +0 -16
- package/dist/Sol/register/register.js +0 -193
- package/dist/Sol/shell/Shell.d.ts +0 -124
- package/dist/Sol/shell/Shell.js +0 -335
- package/dist/Sol/wingets/ComputeBootladder.d.ts +0 -6
- package/dist/Sol/wingets/ComputeBootladder.js +0 -71
- package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +0 -7
- package/dist/Sol/wingets/ComputeModalitycatalog.js +0 -71
- package/dist/Sol/wingets/ConsoleApibadge.d.ts +0 -7
- package/dist/Sol/wingets/ConsoleApibadge.js +0 -5
- package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +0 -6
- package/dist/Sol/wingets/ConsoleEdgelaw.js +0 -36
- package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +0 -19
- package/dist/Sol/wingets/ConsoleEventstimeline.js +0 -12
- package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +0 -8
- package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +0 -8
- package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +0 -21
- package/dist/Sol/wingets/ConsoleSpecpanel.js +0 -75
- package/dist/Sol/wingets/ConsoleTerminal.d.ts +0 -22
- package/dist/Sol/wingets/ConsoleTerminal.js +0 -77
- package/dist/Sol/wingets/DashboardAccountpanel.d.ts +0 -18
- package/dist/Sol/wingets/DashboardAccountpanel.js +0 -65
- package/dist/Sol/wingets/DashboardAdminpanel.d.ts +0 -6
- package/dist/Sol/wingets/DashboardAdminpanel.js +0 -90
- package/dist/Sol/wingets/DashboardAuditlog.d.ts +0 -8
- package/dist/Sol/wingets/DashboardAuditlog.js +0 -50
- package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +0 -10
- package/dist/Sol/wingets/DashboardCreatesandboxform.js +0 -71
- package/dist/Sol/wingets/DashboardEventstimeline.d.ts +0 -8
- package/dist/Sol/wingets/DashboardEventstimeline.js +0 -83
- package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +0 -8
- package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +0 -57
- package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +0 -8
- package/dist/Sol/wingets/DashboardMeshnodestable.js +0 -103
- package/dist/Sol/wingets/DashboardSandboxlist.d.ts +0 -10
- package/dist/Sol/wingets/DashboardSandboxlist.js +0 -163
- package/dist/Sol/wingets/DashboardUserstable.d.ts +0 -8
- package/dist/Sol/wingets/DashboardUserstable.js +0 -78
- package/dist/Sol/wingets/HomeEntrygate.d.ts +0 -23
- package/dist/Sol/wingets/HomeEntrygate.js +0 -73
- package/dist/Sol/wingets/HomeMetricstrip.d.ts +0 -9
- package/dist/Sol/wingets/HomeMetricstrip.js +0 -4
- package/dist/Sol/wingets/HomeRuntimediagram.d.ts +0 -1
- package/dist/Sol/wingets/HomeRuntimediagram.js +0 -22
- package/dist/Sol/wingets/LoginForm.d.ts +0 -19
- package/dist/Sol/wingets/LoginForm.js +0 -141
- package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +0 -13
- package/dist/Sol/wingets/RegisterPasswordconfirm.js +0 -16
- package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +0 -19
- package/dist/Sol/wingets/RegisterPasswordmeter.js +0 -65
- package/dist/Sol/wingets/RegisterUsernamerules.d.ts +0 -11
- package/dist/Sol/wingets/RegisterUsernamerules.js +0 -16
- package/dist/Sol/wingets/index.d.ts +0 -39
- package/dist/Sol/wingets/index.js +0 -39
- package/dist/alternatives.d.ts +0 -508
- package/dist/alternatives.js +0 -950
- package/dist/api.d.ts +0 -154
- package/dist/api.js +0 -174
- package/dist/auth.d.ts +0 -268
- package/dist/auth.js +0 -476
- package/dist/automation.d.ts +0 -425
- package/dist/automation.js +0 -566
- package/dist/browser.d.ts +0 -561
- package/dist/browser.js +0 -1058
- package/dist/capacitor.config.d.ts +0 -45
- package/dist/capacitor.config.js +0 -48
- package/dist/catalog.d.ts +0 -43
- package/dist/catalog.js +0 -44
- package/dist/cli.d.ts +0 -16
- package/dist/cli.js +0 -168
- package/dist/communication.d.ts +0 -181
- package/dist/communication.js +0 -376
- package/dist/compute.d.ts +0 -1160
- package/dist/compute.js +0 -2272
- package/dist/dashboardlib.d.ts +0 -58
- package/dist/dashboardlib.js +0 -161
- package/dist/db.d.ts +0 -569
- package/dist/db.js +0 -1080
- package/dist/distribution.d.ts +0 -528
- package/dist/distribution.js +0 -810
- package/dist/drizzle.config.d.ts +0 -20
- package/dist/drizzle.config.js +0 -18
- package/dist/edgelandes.d.ts +0 -70
- package/dist/edgelandes.host.d.ts +0 -26
- package/dist/edgelandes.host.js +0 -1089
- package/dist/edgelandes.inproc.d.ts +0 -27
- package/dist/edgelandes.inproc.js +0 -952
- package/dist/edgelandes.js +0 -1133
- package/dist/edgelandes.ninety.d.ts +0 -31
- package/dist/edgelandes.ninety.js +0 -174
- package/dist/edgelandes.virtual.d.ts +0 -25
- package/dist/edgelandes.virtual.js +0 -629
- package/dist/edgeplane.d.ts +0 -121
- package/dist/edgeplane.js +0 -341
- package/dist/examplelocaljob.d.ts +0 -1
- package/dist/examplelocaljob.js +0 -14
- package/dist/execution.d.ts +0 -529
- package/dist/execution.js +0 -760
- package/dist/family.d.ts +0 -16
- package/dist/family.js +0 -42
- package/dist/familyurl.d.ts +0 -21
- package/dist/familyurl.js +0 -24
- package/dist/format.d.ts +0 -18
- package/dist/format.js +0 -59
- package/dist/foundation.d.ts +0 -172
- package/dist/foundation.js +0 -312
- package/dist/index.d.ts +0 -735
- package/dist/index.js +0 -1020
- package/dist/integration.d.ts +0 -235
- package/dist/integration.js +0 -228
- package/dist/intelligence.d.ts +0 -93
- package/dist/intelligence.js +0 -144
- package/dist/isolation.d.ts +0 -128
- package/dist/isolation.js +0 -95
- package/dist/labels.d.ts +0 -665
- package/dist/labels.js +0 -707
- package/dist/localauth.d.ts +0 -127
- package/dist/localauth.js +0 -413
- package/dist/media.d.ts +0 -343
- package/dist/media.js +0 -985
- package/dist/mesh.d.ts +0 -177
- package/dist/mesh.js +0 -468
- package/dist/modalityregistry.d.ts +0 -109
- package/dist/modalityregistry.js +0 -1386
- package/dist/modes.d.ts +0 -358
- package/dist/modes.js +0 -133
- package/dist/onboardingstate.d.ts +0 -79
- package/dist/onboardingstate.js +0 -282
- package/dist/orchestrator.d.ts +0 -1338
- package/dist/orchestrator.js +0 -4310
- package/dist/packager/targetcli.js +0 -4
- package/dist/paths.d.ts +0 -2
- package/dist/paths.js +0 -14
- package/dist/performance.d.ts +0 -415
- package/dist/performance.js +0 -826
- package/dist/quantum.d.ts +0 -809
- package/dist/quantum.js +0 -2072
- package/dist/render.d.ts +0 -380
- package/dist/render.js +0 -1072
- package/dist/runall.d.ts +0 -2
- package/dist/runall.js +0 -39
- package/dist/runtimeprobe.d.ts +0 -4
- package/dist/runtimeprobe.js +0 -8
- package/dist/sandbox.d.ts +0 -355
- package/dist/sandbox.js +0 -1721
- package/dist/sandboxenvprofile.d.ts +0 -29
- package/dist/sandboxenvprofile.js +0 -89
- package/dist/sandboxprofile.d.ts +0 -137
- package/dist/sandboxprofile.js +0 -241
- package/dist/sandboxqueue.d.ts +0 -108
- package/dist/sandboxqueue.js +0 -201
- package/dist/sandboxquota.d.ts +0 -121
- package/dist/sandboxquota.js +0 -236
- package/dist/scheduler.d.ts +0 -595
- package/dist/scheduler.js +0 -1258
- package/dist/scriptlanes.d.ts +0 -182
- package/dist/scriptlanes.js +0 -660
- package/dist/scripts.buildengine.d.ts +0 -1
- package/dist/scripts.buildengine.js +0 -39
- package/dist/scripts.securitygate.d.ts +0 -1
- package/dist/scripts.securitygate.js +0 -68
- package/dist/scripts.validateflatnative.d.ts +0 -1
- package/dist/scripts.validateflatnative.js +0 -72
- package/dist/security.d.ts +0 -500
- package/dist/security.js +0 -1169
- package/dist/seedcatalog.d.ts +0 -13
- package/dist/seedcatalog.js +0 -46
- package/dist/server.d.ts +0 -20
- package/dist/server.js +0 -53
- package/dist/speccatalog.d.ts +0 -31
- package/dist/speccatalog.js +0 -163
- package/dist/tiers.d.ts +0 -1001
- package/dist/tiers.js +0 -2169
- package/dist/utils.d.ts +0 -2
- package/dist/utils.js +0 -5
- package/dist/vaulthandoff.d.ts +0 -141
- package/dist/vaulthandoff.js +0 -444
- package/dist/virtual.d.ts +0 -640
- package/dist/virtual.js +0 -1284
- package/dist/virtualcpu.d.ts +0 -315
- package/dist/virtualcpu.js +0 -1180
- package/dist/virtualgpu.d.ts +0 -344
- package/dist/virtualgpu.js +0 -1000
- package/dist/virtualization.d.ts +0 -606
- package/dist/virtualization.js +0 -1186
- package/dist/virtualmemory.d.ts +0 -817
- package/dist/virtualmemory.js +0 -1795
- package/dist/vite.config.d.ts +0 -3
- package/dist/vite.config.js +0 -48
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -25
- package/dist/webserver.d.ts +0 -166
- package/dist/webserver.js +0 -2226
- package/dist/workloadlaw.d.ts +0 -133
- package/dist/workloadlaw.js +0 -193
- package/manifest.json +0 -20
- package/media.ts +0 -1337
- /package/docs/{architecture.1.8.19.md → architecture1819.md} +0 -0
- /package/docs/{architecture.1.8.19.mmd → architecture1819.mmd} +0 -0
- /package/docs/{artifactresearch.1.8.9.md → artifactresearch189.md} +0 -0
- /package/docs/{batches.1816.to.1820.md → batches1816to1820.md} +0 -0
- /package/docs/{brancharchive.2026.08.18.md → brancharchive20260818.md} +0 -0
- /package/docs/{containerplatforms.1.8.17.md → containerplatforms1817.md} +0 -0
- /package/docs/{e2ugh.engine.md → e2ughengine.md} +0 -0
- /package/docs/{flatbuildresearch.1.8.11.md → flatbuildresearch1811.md} +0 -0
- /package/docs/{licenseaudit.1.8.12.md → licenseaudit1812.md} +0 -0
- /package/docs/{mobileconversionresearch.1.8.10.md → mobileconversionresearch1810.md} +0 -0
- /package/docs/{nativeidentityresearch.1.8.11.md → nativeidentityresearch1811.md} +0 -0
- /package/docs/{native.wrappers.md → nativewrappers.md} +0 -0
- /package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
- /package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
- /package/docs/{planning.engine.md → planningengine.md} +0 -0
- /package/docs/{releasenotes.1.8.12.md → releasenotes1812.md} +0 -0
- /package/docs/{releasenotes.1.8.15.md → releasenotes1815.md} +0 -0
- /package/docs/{releasenotes.1.8.16.md → releasenotes1816.md} +0 -0
- /package/docs/{releasenotes.1.8.17.md → releasenotes1817.md} +0 -0
- /package/docs/{releasenotes.1.8.18.md → releasenotes1818.md} +0 -0
- /package/docs/{releasenotes.1.8.19.md → releasenotes1819.md} +0 -0
- /package/docs/{reorganization.1.8.8.md → reorganization188.md} +0 -0
- /package/docs/{reorganization.1.8.9.md → reorganization189.md} +0 -0
- /package/docs/{repo.analysis.1.8.21.json → repoanalysis1821.json} +0 -0
- /package/docs/{repo.candidates.1.8.21.jsonl → repocandidates1821.jsonl} +0 -0
- /package/docs/{repo.research.1.8.16.md → reporesearch1816.md} +0 -0
- /package/docs/{repo.research.1.8.21.md → reporesearch1821.md} +0 -0
- /package/docs/{repo.selected.1.8.21.json → reposelected1821.json} +0 -0
- /package/docs/{repo.synthesis.1.8.21.md → reposynthesis1821.md} +0 -0
- /package/docs/{research.1.8.18.isolation.md → research1818isolation.md} +0 -0
- /package/docs/{research.1.8.19.virtual.browser.md → research1819virtualbrowser.md} +0 -0
- /package/docs/{scanningresearch.1.8.11.md → scanningresearch1811.md} +0 -0
- /package/docs/{securityaudit.1.8.7.md → securityaudit187.md} +0 -0
- /package/docs/{securityreferences.1.8.11.md → securityreferences1811.md} +0 -0
- /package/docs/{securityresearch.1.8.11.md → securityresearch1811.md} +0 -0
- /package/docs/{signingresearch.1.8.12.md → signingresearch1812.md} +0 -0
- /package/docs/{tauri.glib.risk.1.8.11.md → tauriglibrisk1811.md} +0 -0
- /package/docs/{todo.1.8.18.md → todo1818.md} +0 -0
- /package/docs/{todo.1.8.19.md → todo1819.md} +0 -0
- /package/docs/{toolchainresearch.1.8.9.md → toolchainresearch189.md} +0 -0
- /package/docs/{web.duplicatecleanup.md → webduplicatecleanup.md} +0 -0
- /package/docs/{web.ideas.md → webideas.md} +0 -0
- /package/docs/{workflowimprovements.2026.08.19.md → workflowimprovements20260819.md} +0 -0
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* onboarding.tsx — the first-run steps of the APPLICATION (the family
|
|
3
|
-
* window recipe): three short frames presented like a Windows 11 first-run
|
|
4
|
-
* dialog over the canvas backdrop — what the app IS (the honest role: the
|
|
5
|
-
* sandbox engine of the family, not an operating system), what it DOES
|
|
6
|
-
* (the surfaces the window hosts — console, playground, compute and the
|
|
7
|
-
* agent browser over the storage == compute engine — read straight from
|
|
8
|
-
* the rail map) and the ENTER frame with the hand-over button. The finish
|
|
9
|
-
* AND the skip mark onboarding seen through the one accessor
|
|
10
|
-
* (onboardingstate.ts — seen = may skip; the flow is never forced again)
|
|
11
|
-
* and navigate to "/" so the window takes over. Frames remount on step
|
|
12
|
-
* change so the 250ms entry plays each time; reduced motion rides the
|
|
13
|
-
* stylesheet hard stop. No opt-in switches here: the app holds no account
|
|
14
|
-
* write and no visitor storage beyond the shared onboarding state. Every
|
|
15
|
-
* word of the dialog rides the label store (labels.ts — the copy law):
|
|
16
|
-
* the three frame names arrive as the onboarding.steps row the page
|
|
17
|
-
* splits, so no fixed step array lives in the component.
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* The onboarding page: a three-step first-run dialog that hands the
|
|
21
|
-
* surface to the home of the window.
|
|
22
|
-
*
|
|
23
|
-
* @returns the onboarding element.
|
|
24
|
-
*/
|
|
25
|
-
export default function Onboarding(): import("react").JSX.Element;
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// the saddle onboarding of the theme.
|
|
3
|
-
/**
|
|
4
|
-
* onboarding.tsx — the first-run steps of the APPLICATION (the family
|
|
5
|
-
* window recipe): three short frames presented like a Windows 11 first-run
|
|
6
|
-
* dialog over the canvas backdrop — what the app IS (the honest role: the
|
|
7
|
-
* sandbox engine of the family, not an operating system), what it DOES
|
|
8
|
-
* (the surfaces the window hosts — console, playground, compute and the
|
|
9
|
-
* agent browser over the storage == compute engine — read straight from
|
|
10
|
-
* the rail map) and the ENTER frame with the hand-over button. The finish
|
|
11
|
-
* AND the skip mark onboarding seen through the one accessor
|
|
12
|
-
* (onboardingstate.ts — seen = may skip; the flow is never forced again)
|
|
13
|
-
* and navigate to "/" so the window takes over. Frames remount on step
|
|
14
|
-
* change so the 250ms entry plays each time; reduced motion rides the
|
|
15
|
-
* stylesheet hard stop. No opt-in switches here: the app holds no account
|
|
16
|
-
* write and no visitor storage beyond the shared onboarding state. Every
|
|
17
|
-
* word of the dialog rides the label store (labels.ts — the copy law):
|
|
18
|
-
* the three frame names arrive as the onboarding.steps row the page
|
|
19
|
-
* splits, so no fixed step array lives in the component.
|
|
20
|
-
*/
|
|
21
|
-
import { ArrowLeftRegular as ArrowLeft, ArrowRightRegular as ArrowRight, TableRegular as LayoutDashboard, } from '@fluentui/react-icons';
|
|
22
|
-
import { useCallback, useState } from 'react';
|
|
23
|
-
import { useLocation } from 'wouter';
|
|
24
|
-
import { markOnboardingSeen } from '../../onboardingstate.ts';
|
|
25
|
-
import { label, labelfill } from '../../labels.ts';
|
|
26
|
-
import { SaddleMark, START_APPS } from '../shell/Shell.tsx';
|
|
27
|
-
/** the three frames of the first run, in order — one config row of the
|
|
28
|
-
* label store the page splits (the onboarding.steps precedent of the
|
|
29
|
-
* provider chain row of the architecture page). */
|
|
30
|
-
const steps = label('onboarding.steps').split(' · ');
|
|
31
|
-
/**
|
|
32
|
-
* The onboarding page: a three-step first-run dialog that hands the
|
|
33
|
-
* surface to the home of the window.
|
|
34
|
-
*
|
|
35
|
-
* @returns the onboarding element.
|
|
36
|
-
*/
|
|
37
|
-
export default function Onboarding() {
|
|
38
|
-
const [, navigate] = useLocation();
|
|
39
|
-
const [step, setStep] = useState(0);
|
|
40
|
-
const last = step === steps.length - 1;
|
|
41
|
-
/** the hand-over: the onboarding counts as seen (finish and skip alike —
|
|
42
|
-
* seen = may skip; never forced again) and the window opens on the home. */
|
|
43
|
-
const enterHome = useCallback(() => {
|
|
44
|
-
markOnboardingSeen();
|
|
45
|
-
navigate('/');
|
|
46
|
-
}, [navigate]);
|
|
47
|
-
return (_jsx("div", { className: "winonboard", children: _jsxs("section", { className: "winonboard__card", "aria-label": label('onboarding.cardAria'), children: [_jsxs("header", { className: "winonboard__head", children: [_jsx(SaddleMark, { size: 18, hidden: true }), _jsx("span", { className: "winonboard__title", children: label('onboarding.title') }), _jsx("button", { type: "button", className: "winonboard__skip", onClick: enterHome, children: label('onboarding.skip') })] }), _jsxs("div", { className: "winonboard__body", children: [step === 0 && (_jsxs("article", { className: "winonboard__step", children: [_jsx("p", { className: "winonboard__eyebrow", children: labelfill('onboarding.eyebrow', {
|
|
48
|
-
index: String(step + 1),
|
|
49
|
-
step: steps[step],
|
|
50
|
-
}) }), _jsx("h2", { className: "winonboard__lead", children: label('onboarding.what.title') }), _jsx("p", { className: "winonboard__lede", children: label('onboarding.what.body') })] }, "what")), step === 1 && (_jsxs("article", { className: "winonboard__step", children: [_jsx("p", { className: "winonboard__eyebrow", children: labelfill('onboarding.eyebrow', {
|
|
51
|
-
index: String(step + 1),
|
|
52
|
-
step: steps[step],
|
|
53
|
-
}) }), _jsx("h2", { className: "winonboard__lead", children: label('onboarding.does.title') }), _jsx("ul", { className: "winonboard__facts", children: START_APPS.map((app) => {
|
|
54
|
-
const Icon = app.icon ?? LayoutDashboard;
|
|
55
|
-
return (_jsxs("li", { className: "winonboard__fact", children: [_jsx(Icon, { fontSize: 16, strokeWidth: 1.7, "aria-hidden": "true" }), _jsxs("span", { children: [_jsx("strong", { children: app.label }), " \u2014 ", app.detail] })] }, app.href));
|
|
56
|
-
}) })] }, "does")), step === 2 && (_jsxs("article", { className: "winonboard__step", children: [_jsx("p", { className: "winonboard__eyebrow", children: labelfill('onboarding.eyebrow', {
|
|
57
|
-
index: String(step + 1),
|
|
58
|
-
step: steps[step],
|
|
59
|
-
}) }), _jsx("h2", { className: "winonboard__lead", children: label('onboarding.enter.title') }), _jsx("p", { className: "winonboard__lede", children: label('onboarding.enter.body') })] }, "enter"))] }), _jsxs("footer", { className: "winonboard__foot", children: [_jsx("div", { className: "winonboard__ladder", "aria-hidden": "true", children: steps.map((stepname, index) => (_jsx("span", { className: "winonboard__segrun", "data-active": index === step ? 'true' : undefined }, stepname))) }), _jsxs("div", { className: "winonboard__actions", children: [step > 0 && (_jsxs("button", { type: "button", className: "winonboard__act", onClick: () => setStep((value) => value - 1), children: [_jsx(ArrowLeft, { fontSize: 14, "aria-hidden": "true" }), label('onboarding.back')] })), last ? (_jsxs("button", { type: "button", className: "winonboard__act winonboard__act--primary", onClick: enterHome, children: [label('onboarding.enterCta'), _jsx(ArrowRight, { fontSize: 14, "aria-hidden": "true" })] })) : (_jsxs("button", { type: "button", className: "winonboard__act winonboard__act--primary", onClick: () => setStep((value) => value + 1), children: [label('onboarding.continue'), _jsx(ArrowRight, { fontSize: 14, "aria-hidden": "true" })] }))] })] })] }) }));
|
|
60
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* playground page anchor — layer 3 of the anchor architecture.
|
|
3
|
-
* The file carrying the folder's own name is the path manager of the page:
|
|
4
|
-
* it imports the loose components beside it, mounts the page and re-exports
|
|
5
|
-
* the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
|
|
6
|
-
* this file. This anchor carries the former main component of the folder,
|
|
7
|
-
* which now lives here as the page mount itself.
|
|
8
|
-
*/
|
|
9
|
-
export default function Playground(): import("react").JSX.Element;
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* playground page anchor — layer 3 of the anchor architecture.
|
|
4
|
-
* The file carrying the folder's own name is the path manager of the page:
|
|
5
|
-
* it imports the loose components beside it, mounts the page and re-exports
|
|
6
|
-
* the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
|
|
7
|
-
* this file. This anchor carries the former main component of the folder,
|
|
8
|
-
* which now lives here as the page mount itself.
|
|
9
|
-
*/
|
|
10
|
-
import { internalapi } from '@saddle/isolation';
|
|
11
|
-
// Signal & Ledger: playground as the ledger of internal plans, never a console that executes bytes.
|
|
12
|
-
// Every word of the page rides the label store (labels.ts — the copy law);
|
|
13
|
-
// the fixture and the stage states stay the honest data of the projection.
|
|
14
|
-
import { PulseRegular as Activity, ProhibitedRegular as Ban, CubeRegular as Blocks, BracesRegular as Braces, DatabaseRegular as Database, DocumentErrorRegular as FileWarning, CommunicationRegular as Network, ShieldTaskRegular as ShieldCheck, } from '@fluentui/react-icons';
|
|
15
|
-
import { useMemo, useState } from 'react';
|
|
16
|
-
import { PageShell } from '../shell/Shell.tsx';
|
|
17
|
-
import { label, labelfill } from '../../labels.ts';
|
|
18
|
-
const fixture = Object.freeze({
|
|
19
|
-
id: 'fixture.binary.001',
|
|
20
|
-
effect: 'binary-execution',
|
|
21
|
-
target: 'remote',
|
|
22
|
-
// biome-ignore lint/security/noSecrets: a deterministic demo payload digest for the sandbox spec fixture, not a credential
|
|
23
|
-
source: '8c3d2e7b6a5f4c1d0e9b8a7f6c5d4e3b2a1908172635445566778899aabbccdd',
|
|
24
|
-
budget: { maxbytes: 65536, maxmilliseconds: 250 },
|
|
25
|
-
});
|
|
26
|
-
/** the six boundaries of the projection: the glyph and the two-digit index
|
|
27
|
-
* are presentation code, the words ride the store (playground.boundary.*). */
|
|
28
|
-
const boundaries = [
|
|
29
|
-
{
|
|
30
|
-
index: '01',
|
|
31
|
-
namekey: 'playground.boundary.gateway.name',
|
|
32
|
-
detailkey: 'playground.boundary.gateway.detail',
|
|
33
|
-
icon: Braces,
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
index: '02',
|
|
37
|
-
namekey: 'playground.boundary.plan.name',
|
|
38
|
-
detailkey: 'playground.boundary.plan.detail',
|
|
39
|
-
icon: Blocks,
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
index: '03',
|
|
43
|
-
namekey: 'playground.boundary.policy.name',
|
|
44
|
-
detailkey: 'playground.boundary.policy.detail',
|
|
45
|
-
icon: ShieldCheck,
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
index: '04',
|
|
49
|
-
namekey: 'playground.boundary.materialize.name',
|
|
50
|
-
detailkey: 'playground.boundary.materialize.detail',
|
|
51
|
-
icon: Database,
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
index: '05',
|
|
55
|
-
namekey: 'playground.boundary.execute.name',
|
|
56
|
-
detailkey: 'playground.boundary.execute.detail',
|
|
57
|
-
icon: Activity,
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
index: '06',
|
|
61
|
-
namekey: 'playground.boundary.evidence.name',
|
|
62
|
-
detailkey: 'playground.boundary.evidence.detail',
|
|
63
|
-
icon: FileWarning,
|
|
64
|
-
},
|
|
65
|
-
];
|
|
66
|
-
/** the two policy modalities of the projection: each is one card, and each
|
|
67
|
-
* card walks the six boundaries as its own stage ladder (the windows
|
|
68
|
-
* stepper — the ::after indicator: 0 closed, 6px #858585 done, 12px accent
|
|
69
|
-
* active). the card words ride the store (playground.card.*). */
|
|
70
|
-
const modalitycards = [
|
|
71
|
-
{
|
|
72
|
-
id: 'default',
|
|
73
|
-
index: '01',
|
|
74
|
-
namekey: 'playground.card.default.name',
|
|
75
|
-
codekey: 'playground.card.default.code',
|
|
76
|
-
verdictkey: 'playground.card.default.verdict',
|
|
77
|
-
tipkey: 'playground.card.default.tip',
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
id: 'delegated',
|
|
81
|
-
index: '02',
|
|
82
|
-
namekey: 'playground.card.delegated.name',
|
|
83
|
-
codekey: 'playground.card.delegated.code',
|
|
84
|
-
verdictkey: 'playground.card.delegated.verdict',
|
|
85
|
-
tipkey: 'playground.card.delegated.tip',
|
|
86
|
-
},
|
|
87
|
-
];
|
|
88
|
-
/** the stage states per modality, boundary order: done (6px gray), active
|
|
89
|
-
* (12px accent), denied (12px gray), armed (6px gray) and closed (0). */
|
|
90
|
-
const stageladder = {
|
|
91
|
-
default: ['done', 'done', 'done', 'done', 'denied', 'closed'],
|
|
92
|
-
delegated: ['done', 'done', 'done', 'done', 'active', 'armed'],
|
|
93
|
-
};
|
|
94
|
-
/** walks the six boundaries of one modality into the stage rows. */
|
|
95
|
-
function walkstages(modality) {
|
|
96
|
-
return boundaries.map((boundary, index) => ({
|
|
97
|
-
index: boundary.index,
|
|
98
|
-
namekey: boundary.namekey,
|
|
99
|
-
state: stageladder[modality][index],
|
|
100
|
-
}));
|
|
101
|
-
}
|
|
102
|
-
function fixtureenvelope(boundary, configuration = {}) {
|
|
103
|
-
if (boundary === 'planning')
|
|
104
|
-
return { boundary, requestid: 'web.fixture.plan', payload: fixture };
|
|
105
|
-
if (boundary === 'policy' || boundary === 'execution')
|
|
106
|
-
return {
|
|
107
|
-
boundary,
|
|
108
|
-
requestid: `web.fixture.${boundary}`,
|
|
109
|
-
payload: { request: fixture, configuration },
|
|
110
|
-
};
|
|
111
|
-
return { boundary, requestid: `web.fixture.${boundary}`, payload: {} };
|
|
112
|
-
}
|
|
113
|
-
export default function Playground() {
|
|
114
|
-
const [mode, setMode] = useState('default');
|
|
115
|
-
const configuration = useMemo(() => mode === 'delegated'
|
|
116
|
-
? {
|
|
117
|
-
policy: { alloweffects: ['binary-execution'], allowtargets: ['remote'] },
|
|
118
|
-
approval: { effects: ['binary-execution'], targets: ['remote'] },
|
|
119
|
-
adapter: { owner: 'operator', capabilities: ['binary-execution'] },
|
|
120
|
-
}
|
|
121
|
-
: {}, [mode]);
|
|
122
|
-
const projection = useMemo(() => internalapi().handle(fixtureenvelope('execution', configuration)), [configuration]);
|
|
123
|
-
const handoff = projection.data.handoff;
|
|
124
|
-
return (_jsxs(PageShell, { section: label('playground.shell.section'), label: label('playground.shell.label'), title: label('playground.shell.title'), intro: label('playground.shell.intro'), children: [_jsxs("section", { className: "content-section split-content", children: [_jsxs("div", { children: [_jsx("p", { className: "eyebrow", children: label('playground.split.eyebrow') }), _jsxs("h2", { className: "section-title", children: [label('playground.split.title1'), _jsx("br", {}), _jsx("span", { children: label('playground.split.title2') })] })] }), _jsxs("div", { className: "prose-copy", children: [_jsx("p", { children: label('playground.split.body1') }), _jsx("p", { children: label('playground.split.body2') })] })] }), _jsxs("section", { className: "content-section", children: [_jsxs("div", { className: "content-section-heading", children: [_jsx("p", { className: "eyebrow", children: label('playground.boundaries.eyebrow') }), _jsx("span", { className: "mono-label", children: label('playground.boundaries.mono') })] }), _jsx("div", { className: "playground-boundaries", children: boundaries.map(({ index, namekey, detailkey, icon: Icon }, cardindex) => (_jsxs("article", { className: "playground-boundary", style: { '--stagger-i': cardindex }, children: [_jsx("span", { children: index }), _jsx(Icon, { fontSize: 18 }), _jsx("strong", { children: label(namekey) }), _jsx("small", { children: label(detailkey) })] }, namekey))) })] }), _jsxs("section", { className: "content-section", "aria-label": label('playground.modalities.aria'), children: [_jsxs("div", { className: "content-section-heading", children: [_jsx("p", { className: "eyebrow", children: label('playground.modalities.eyebrow') }), _jsx("span", { className: "mono-label", children: label('playground.modalities.mono') })] }), _jsx("div", { className: "r3-modality", children: modalitycards.map((card, cardindex) => (_jsxs("article", { className: mode === card.id ? 'r3-modality-card is-on' : 'r3-modality-card', style: { '--stagger-i': cardindex }, children: [_jsxs("button", { type: "button", className: "r3-modality-key", "aria-pressed": mode === card.id, "data-tip": label(card.tipkey), onClick: () => setMode(card.id), children: [_jsx("span", { className: "r3-modality-index", children: card.index }), _jsx("span", { className: "r3-modality-name", children: label(card.namekey) }), _jsx("span", { className: "r3-modality-code", children: label(card.codekey) })] }), _jsx("p", { className: "r3-modality-verdict", children: label(card.verdictkey) }), _jsx("ol", { className: "r3-walk", "aria-label": labelfill('playground.walkAria', { name: label(card.namekey) }), children: walkstages(card.id).map((stage) => (_jsxs("li", { className: "r3-walkstage", "data-state": stage.state, children: [_jsx("span", { className: "r3-walkstage-index", children: stage.index }), _jsx("span", { className: "r3-walkstage-name", children: label(stage.namekey) }), _jsx("span", { className: "r3-walkstage-state", children: stage.state })] }, stage.namekey))) })] }, card.id))) })] }), _jsxs("section", { className: "content-section playground-layout", children: [_jsxs("div", { className: "playground-console", children: [_jsxs("div", { className: "console-head", children: [_jsxs("span", { children: [_jsx(Activity, { fontSize: 14 }), " ", label('playground.projection.title')] }), _jsxs("span", { className: handoff.state === 'execution-disabled' ? 'console-denied' : 'console-pass', children: [handoff.state === 'execution-disabled' ? (_jsx(Ban, { fontSize: 13 })) : (_jsx(ShieldCheck, { fontSize: 13 })), ' ', handoff.code] })] }), _jsxs("div", { className: "playground-console-body", children: [_jsxs("div", { className: "playground-row", children: [_jsx("span", { children: label('playground.row.request') }), _jsx("b", { children: fixture.id })] }), _jsxs("div", { className: "playground-row", children: [_jsx("span", { children: label('playground.row.effect') }), _jsx("b", { children: fixture.effect })] }), _jsxs("div", { className: "playground-row", children: [_jsx("span", { children: label('playground.row.target') }), _jsx("b", { children: fixture.target })] }), _jsxs("div", { className: "playground-row", children: [_jsx("span", { children: label('playground.row.outcome') }), _jsx("b", { children: handoff.state })] }), _jsxs("div", { className: "playground-row", children: [_jsx("span", { children: label('playground.row.effects') }), _jsx("b", { children: JSON.stringify(projection.effects) })] }), _jsx("pre", { children: JSON.stringify(handoff, null, 2) })] }), _jsxs("div", { className: "console-footer", children: [_jsx("span", { children: label('playground.footer.fixture') }), _jsx("span", { children: label('playground.footer.adapter') })] })] }), _jsxs("aside", { className: "playground-controls", children: [_jsx("p", { className: "eyebrow", children: label('playground.controls.eyebrow') }), _jsx("h3", { children: label('playground.controls.title') }), _jsx("p", { children: label('playground.controls.body') }), _jsx("p", { className: "r3-modality-note", role: "status", children: label(mode === 'delegated'
|
|
125
|
-
? 'playground.controls.projectingDelegated'
|
|
126
|
-
: 'playground.controls.projectingDefault') })] })] }), _jsxs("section", { className: "content-section note-band", children: [_jsx(Network, { fontSize: 21 }), _jsxs("div", { children: [_jsx("p", { className: "eyebrow", children: label('playground.note.eyebrow') }), _jsx("p", { children: label('playground.note.body') })] })] })] }));
|
|
127
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* register page anchor — layer 3 of the anchor architecture.
|
|
3
|
-
* The file carrying the folder's own name is the path manager of the page:
|
|
4
|
-
* it imports the loose components beside it, mounts the page and re-exports
|
|
5
|
-
* the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
|
|
6
|
-
* this file. This anchor carries the former main component of the folder,
|
|
7
|
-
* which now lives here as the page mount itself.
|
|
8
|
-
*/
|
|
9
|
-
export * from '../wingets';
|
|
10
|
-
/** meta description carried by the absorbed static page. */
|
|
11
|
-
export declare const registerpagedescription = "saddle account creation: username and password only, no e-mail by project policy";
|
|
12
|
-
/**
|
|
13
|
-
* the create-account page: brand lockup, the instrument card (form beside
|
|
14
|
-
* the live trust rail) and the policy footer.
|
|
15
|
-
*/
|
|
16
|
-
export default function Register(): import("react").JSX.Element;
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* register page anchor — layer 3 of the anchor architecture.
|
|
4
|
-
* The file carrying the folder's own name is the path manager of the page:
|
|
5
|
-
* it imports the loose components beside it, mounts the page and re-exports
|
|
6
|
-
* the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
|
|
7
|
-
* this file. This anchor carries the former main component of the folder,
|
|
8
|
-
* which now lives here as the page mount itself.
|
|
9
|
-
*/
|
|
10
|
-
// Account creation page: faithful absorption of register.html + register.js —
|
|
11
|
-
// username charset validation (3-32 of [a-z0-9.-], lowercased as the visitor
|
|
12
|
-
// types), password strength meter, confirmation match, then POST
|
|
13
|
-
// /api/v1/auth/register with the localauth fallback for the static edge.
|
|
14
|
-
// R3-saddle: one instrument card with an asymmetric interior — the form
|
|
15
|
-
// (1.2fr) beside the trust rail (1fr) that carries the live rules checklist,
|
|
16
|
-
// the strength meter and the real policy facts; 44px inputs, sand focus ring.
|
|
17
|
-
import { useEffect, useRef, useState } from 'react';
|
|
18
|
-
import { Link, useLocation } from 'wouter';
|
|
19
|
-
import { apibase, apierrormessage, apifetch, apistatustext } from '../../api';
|
|
20
|
-
import { label } from '../../labels.ts';
|
|
21
|
-
import { PasswordConfirm as PasswordConfirm } from '../wingets';
|
|
22
|
-
import { PasswordMeter as PasswordMeter } from '../wingets';
|
|
23
|
-
import { UsernameRules as UsernameRules, usernamere } from '../wingets';
|
|
24
|
-
export * from '../wingets';
|
|
25
|
-
/** meta description carried by the absorbed static page. */
|
|
26
|
-
export const registerpagedescription = 'saddle account creation: username and password only, no e-mail by project policy';
|
|
27
|
-
/** the real policy facts of the trust rail: the labels ride the store. */
|
|
28
|
-
function trustfacts() {
|
|
29
|
-
return [
|
|
30
|
-
{
|
|
31
|
-
label: label('register.trust.identityLabel'),
|
|
32
|
-
body: label('register.trust.identityBody'),
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
label: label('register.trust.hashingLabel'),
|
|
36
|
-
body: label('register.trust.hashingBody'),
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
label: label('register.trust.charsetLabel'),
|
|
40
|
-
body: label('register.trust.charsetBody'),
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
label: label('register.trust.sessionLabel'),
|
|
44
|
-
body: label('register.trust.sessionBody'),
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* the create-account page: brand lockup, the instrument card (form beside
|
|
50
|
-
* the live trust rail) and the policy footer.
|
|
51
|
-
*/
|
|
52
|
-
export default function Register() {
|
|
53
|
-
const [, navigate] = useLocation();
|
|
54
|
-
const usernameref = useRef(null);
|
|
55
|
-
const [username, setUsername] = useState('');
|
|
56
|
-
const [password, setPassword] = useState('');
|
|
57
|
-
const [confirmation, setConfirmation] = useState('');
|
|
58
|
-
const [usernameinvalid, setUsernameinvalid] = useState(false);
|
|
59
|
-
const [passwordinvalid, setPasswordinvalid] = useState(false);
|
|
60
|
-
const [confirminvalid, setConfirminvalid] = useState(false);
|
|
61
|
-
const [error, setError] = useState('');
|
|
62
|
-
const [pending, setPending] = useState(false);
|
|
63
|
-
const [succeeded, setSucceeded] = useState(false);
|
|
64
|
-
const [apimode, setApimode] = useState('probing');
|
|
65
|
-
const [statusline, setStatusline] = useState(apistatustext());
|
|
66
|
-
/** static edge detection: probe the api once; no answer -> local mode. */
|
|
67
|
-
useEffect(() => {
|
|
68
|
-
let cancelled = false;
|
|
69
|
-
const detect = async () => {
|
|
70
|
-
const base = apibase();
|
|
71
|
-
const localauth = await import('../../localauth.ts');
|
|
72
|
-
const apianswers = await localauth.probe(base);
|
|
73
|
-
if (cancelled)
|
|
74
|
-
return;
|
|
75
|
-
if (!apianswers) {
|
|
76
|
-
setApimode('local');
|
|
77
|
-
setStatusline(label('register.status.local'));
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
setApimode('remote');
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
detect().catch(() => {
|
|
84
|
-
if (!cancelled)
|
|
85
|
-
setApimode('local');
|
|
86
|
-
});
|
|
87
|
-
return () => {
|
|
88
|
-
cancelled = true;
|
|
89
|
-
};
|
|
90
|
-
}, []);
|
|
91
|
-
/** username field focus, like the static page controller. */
|
|
92
|
-
useEffect(() => {
|
|
93
|
-
usernameref.current?.focus();
|
|
94
|
-
}, []);
|
|
95
|
-
/** auto-lowercase the username while typing (selection restored). */
|
|
96
|
-
const onusernamechange = (event) => {
|
|
97
|
-
const input = event.target;
|
|
98
|
-
const lowered = input.value.toLowerCase();
|
|
99
|
-
if (lowered !== input.value) {
|
|
100
|
-
const start = input.selectionStart ?? input.value.length;
|
|
101
|
-
const position = start - (input.value.length - lowered.length);
|
|
102
|
-
input.value = lowered;
|
|
103
|
-
try {
|
|
104
|
-
input.setSelectionRange(position, position);
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
/* selection restore is cosmetic */
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
setUsername(input.value);
|
|
111
|
-
};
|
|
112
|
-
const onsubmit = async (event) => {
|
|
113
|
-
event.preventDefault();
|
|
114
|
-
setError('');
|
|
115
|
-
let valid = true;
|
|
116
|
-
if (!usernamere.test(username)) {
|
|
117
|
-
setUsernameinvalid(true);
|
|
118
|
-
valid = false;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
setUsernameinvalid(false);
|
|
122
|
-
}
|
|
123
|
-
if (password.length < 8) {
|
|
124
|
-
setPasswordinvalid(true);
|
|
125
|
-
valid = false;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
setPasswordinvalid(false);
|
|
129
|
-
}
|
|
130
|
-
if (password !== confirmation) {
|
|
131
|
-
setConfirminvalid(true);
|
|
132
|
-
valid = false;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
setConfirminvalid(false);
|
|
136
|
-
}
|
|
137
|
-
if (!valid) {
|
|
138
|
-
setError(label('register.error.fixFields'));
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
setPending(true);
|
|
142
|
-
/* static edge: no api at this base -> browser-local account */
|
|
143
|
-
if (apimode === 'local') {
|
|
144
|
-
try {
|
|
145
|
-
const localauth = await import('../../localauth.ts');
|
|
146
|
-
await localauth.register(username, password);
|
|
147
|
-
setSucceeded(true);
|
|
148
|
-
navigate('/dashboard');
|
|
149
|
-
}
|
|
150
|
-
catch (registererror) {
|
|
151
|
-
const message = registererror instanceof Error ? registererror.message : label('register.error.localFailed');
|
|
152
|
-
setError(message);
|
|
153
|
-
setPending(false);
|
|
154
|
-
}
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
const response = await apifetch('/api/v1/auth/register', {
|
|
159
|
-
method: 'POST',
|
|
160
|
-
body: JSON.stringify({ username, password }),
|
|
161
|
-
});
|
|
162
|
-
if (response.ok) {
|
|
163
|
-
/* the backend sets the saddlesession cookie: straight to the dashboard */
|
|
164
|
-
setSucceeded(true);
|
|
165
|
-
navigate('/dashboard');
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
if (response.status === 404) {
|
|
169
|
-
setError(label('register.error.noRegister'));
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
let message = label('register.error.generic');
|
|
173
|
-
if (response.status === 400 || response.status === 409 || response.status === 429) {
|
|
174
|
-
const payloadmessage = await apierrormessage(response);
|
|
175
|
-
if (payloadmessage !== null) {
|
|
176
|
-
message = payloadmessage;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
setError(message);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
setError(label('register.error.unreachable'));
|
|
184
|
-
}
|
|
185
|
-
setPending(false);
|
|
186
|
-
};
|
|
187
|
-
const hintstate = username.length > 0 && !usernamere.test(username)
|
|
188
|
-
? 'auth-hint bad'
|
|
189
|
-
: usernamere.test(username)
|
|
190
|
-
? 'auth-hint ok'
|
|
191
|
-
: 'auth-hint';
|
|
192
|
-
return (_jsx("div", { className: "auth-frame", children: _jsxs("div", { className: "r3-authcard r3-authcard-wide", children: [_jsxs("header", { className: "auth-head", children: [_jsx(Link, { href: "/", className: "brand-lockup", children: _jsx("span", { className: "brand-wordmark", children: label('register.brand') }) }), _jsx("span", { className: "auth-tagline", children: label('register.tagline') })] }), _jsxs("main", { className: "r3-authgrid", children: [_jsxs("section", { className: "auth-panel", "aria-labelledby": "formtitle", children: [_jsx("h2", { className: "auth-panel-title", id: "formtitle", children: label('register.panel.title') }), succeeded ? (_jsxs("div", { className: "auth-success", children: [_jsx("p", { className: "auth-success-title", role: "status", "aria-live": "polite", children: label('register.success.title') }), _jsxs("p", { className: "auth-statusline", children: [label('register.success.continue'), ' ', _jsx(Link, { href: "/dashboard", children: label('register.success.dashboardLink') }), _jsx("span", { "aria-hidden": "true", children: " \u00B7 " }), _jsx(Link, { href: "/login", children: label('register.success.signinLink') })] })] })) : (_jsxs("form", { className: "auth-form", noValidate: true, onSubmit: onsubmit, children: [_jsxs("div", { className: "auth-field", children: [_jsx("label", { htmlFor: "username", children: label('register.field.username') }), _jsx("input", { ref: usernameref, className: "auth-input", id: "username", name: "username", type: "text", autoComplete: "username", spellCheck: false, autoCapitalize: "none", required: true, minLength: 3, maxLength: 32, pattern: "[a-z0-9.-]{3,32}", "aria-invalid": usernameinvalid ? 'true' : undefined, "aria-describedby": "usernamehint", value: username, onChange: onusernamechange }), _jsx("p", { className: hintstate, id: "usernamehint", children: label('register.hint.username') })] }), _jsxs("div", { className: "auth-field", children: [_jsx("label", { htmlFor: "password", children: label('register.field.password') }), _jsx("input", { className: "auth-input", id: "password", name: "password", type: "password", autoComplete: "new-password", required: true, minLength: 8, "aria-invalid": passwordinvalid ? 'true' : undefined, "aria-describedby": "passwordhint", value: password, onChange: (event) => setPassword(event.target.value) })] }), _jsx(PasswordConfirm, { password: password, value: confirmation, invalid: confirminvalid, onChange: setConfirmation }), error !== '' && (_jsx("p", { className: "auth-formerror", role: "alert", "aria-live": "polite", children: error })), _jsx("button", { className: "button button-primary auth-submit", type: "submit", disabled: pending, children: pending ? label('register.submitPending') : label('register.submit') })] }))] }), _jsxs("aside", { className: "r3-authtrust", "aria-label": label('register.trust.aria'), children: [_jsx("p", { className: "eyebrow", children: label('register.trust.eyebrow') }), _jsx(UsernameRules, { value: username }), _jsx("div", { className: "r3-trustmeter", children: _jsx(PasswordMeter, { password: password }) }), _jsx("ul", { className: "r3-trustlist", children: trustfacts().map((fact) => (_jsxs("li", { className: "r3-trustfact", children: [_jsx("span", { className: "r3-trustlabel", children: fact.label }), _jsx("span", { className: "r3-trustbody", children: fact.body })] }, fact.label))) })] })] }), _jsx("p", { className: "auth-statusline", children: statusline }), _jsxs("p", { className: "auth-statusline", children: [label('register.already'), " ", _jsx(Link, { href: "/login", children: label('register.signinLink') }), _jsx("span", { "aria-hidden": "true", children: " \u00B7 " }), _jsx(Link, { href: "/console", children: label('register.backConsole') })] }), _jsxs("footer", { className: "auth-foot", children: [_jsx("span", { children: label('register.footer.policy') }), _jsx("span", { className: "auth-foot-right", children: label('register.footer.hashing') })] })] }) }));
|
|
193
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
2
|
-
import { type VariantProps } from 'class-variance-authority';
|
|
3
|
-
import { TableRegular as LayoutDashboard } from '@fluentui/react-icons';
|
|
4
|
-
import type * as React from 'react';
|
|
5
|
-
import { Component, type ReactNode } from 'react';
|
|
6
|
-
import { type ToasterProps } from 'sonner';
|
|
7
|
-
import type { MediaSlot } from '../../catalog.ts';
|
|
8
|
-
type Theme = 'light' | 'dark';
|
|
9
|
-
interface ThemeContextType {
|
|
10
|
-
theme: Theme;
|
|
11
|
-
toggleTheme?: () => void;
|
|
12
|
-
switchable: boolean;
|
|
13
|
-
}
|
|
14
|
-
interface ThemeProviderProps {
|
|
15
|
-
children: React.ReactNode;
|
|
16
|
-
defaultTheme?: Theme;
|
|
17
|
-
switchable?: boolean;
|
|
18
|
-
}
|
|
19
|
-
export declare function ThemeProvider({ children, defaultTheme, switchable, }: ThemeProviderProps): React.JSX.Element;
|
|
20
|
-
export declare function useTheme(): ThemeContextType;
|
|
21
|
-
interface ErrorBoundaryProps {
|
|
22
|
-
children: ReactNode;
|
|
23
|
-
}
|
|
24
|
-
interface ErrorBoundaryState {
|
|
25
|
-
hasError: boolean;
|
|
26
|
-
error: Error | null;
|
|
27
|
-
}
|
|
28
|
-
export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
29
|
-
constructor(props: ErrorBoundaryProps);
|
|
30
|
-
static getDerivedStateFromError(error: Error): ErrorBoundaryState;
|
|
31
|
-
render(): string | number | bigint | boolean | React.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | Iterable<ReactNode> | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | React.ReactPortal>;
|
|
32
|
-
}
|
|
33
|
-
type SaddleMarkProps = {
|
|
34
|
-
className?: string;
|
|
35
|
-
label?: string;
|
|
36
|
-
/** rendered square size in px; omitted, the mark is sized by the class */
|
|
37
|
-
size?: number;
|
|
38
|
-
/** hides the mark from the accessibility tree (decorative placements) */
|
|
39
|
-
hidden?: boolean;
|
|
40
|
-
/** the hero flow: the light band riding INSIDE the glyph strokes (spec §9);
|
|
41
|
-
* only the landing hero consumes it — the chrome and intro sizes stay still */
|
|
42
|
-
flow?: boolean;
|
|
43
|
-
};
|
|
44
|
-
export declare function SaddleMark({ className, label, size, hidden, flow }: SaddleMarkProps): React.JSX.Element;
|
|
45
|
-
type SectionRailProps = {
|
|
46
|
-
number: string;
|
|
47
|
-
label: string;
|
|
48
|
-
};
|
|
49
|
-
export declare function SectionRail({ number, label }: SectionRailProps): React.JSX.Element;
|
|
50
|
-
/** one legacy nav entry (the prop shape the page anchors type against) */
|
|
51
|
-
export type NavLink = {
|
|
52
|
-
label: string;
|
|
53
|
-
href: string;
|
|
54
|
-
};
|
|
55
|
-
/** one entry of the window rail: a page surface of the app with its glyph. */
|
|
56
|
-
export type StartApp = {
|
|
57
|
-
href: string;
|
|
58
|
-
label: string;
|
|
59
|
-
detail: string;
|
|
60
|
-
icon: typeof LayoutDashboard;
|
|
61
|
-
};
|
|
62
|
-
/** one rail SECTION: a mono-labelled group of page entries. */
|
|
63
|
-
export type RailSection = {
|
|
64
|
-
id: string;
|
|
65
|
-
label: string;
|
|
66
|
-
apps: readonly StartApp[];
|
|
67
|
-
};
|
|
68
|
-
/** the rail of the app, SECTIONED: workspace, platform, library and
|
|
69
|
-
* account — one entry per page route, the apex home first. exported for
|
|
70
|
-
* the onboarding copy beside this folder. */
|
|
71
|
-
export declare const NAV_SECTIONS: readonly RailSection[];
|
|
72
|
-
/** the pages the window hosts, flattened (the onboarding facts read this). */
|
|
73
|
-
export declare const START_APPS: readonly StartApp[];
|
|
74
|
-
/** the app surface props: the routed page plus the legacy page props the
|
|
75
|
-
* anchors still pass (name, nav, cta, footer links, container width) — the
|
|
76
|
-
* app grammar names itself, so only the theme toggle switch is consumed. */
|
|
77
|
-
type ShellProps = {
|
|
78
|
-
children: ReactNode;
|
|
79
|
-
name?: string;
|
|
80
|
-
nav?: readonly NavLink[];
|
|
81
|
-
cta?: NavLink;
|
|
82
|
-
contained?: boolean;
|
|
83
|
-
footerLinks?: readonly NavLink[];
|
|
84
|
-
themeButton?: boolean;
|
|
85
|
-
domain?: string;
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* the app surface: the SECTIONED page rail and the routed stage beside it,
|
|
89
|
-
* owning the whole viewport.
|
|
90
|
-
*
|
|
91
|
-
* @param children the routed page.
|
|
92
|
-
* @returns the app surface element.
|
|
93
|
-
*/
|
|
94
|
-
export declare function Shell({ children, themeButton }: ShellProps): React.JSX.Element;
|
|
95
|
-
export default Shell;
|
|
96
|
-
type PageShellProps = {
|
|
97
|
-
section: string;
|
|
98
|
-
label: string;
|
|
99
|
-
title: string;
|
|
100
|
-
intro: string;
|
|
101
|
-
children: ReactNode;
|
|
102
|
-
media?: MediaSlot;
|
|
103
|
-
};
|
|
104
|
-
export declare function PageShell({ section, label: pagelabel, title, intro, children, media }: PageShellProps): React.JSX.Element;
|
|
105
|
-
declare const buttonVariants: (props?: {
|
|
106
|
-
variant?: "default" | "destructive" | "ghost" | "link" | "outline" | "secondary";
|
|
107
|
-
size?: "default" | "icon" | "icon-lg" | "icon-sm" | "lg" | "sm";
|
|
108
|
-
} & import("class-variance-authority/types").ClassProp) => string;
|
|
109
|
-
declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
|
|
110
|
-
asChild?: boolean;
|
|
111
|
-
}): React.JSX.Element;
|
|
112
|
-
declare function Card({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
113
|
-
declare function CardHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
114
|
-
declare function CardTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
115
|
-
declare function CardDescription({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
116
|
-
declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
117
|
-
declare function CardContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
118
|
-
declare function CardFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
119
|
-
declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): React.JSX.Element;
|
|
120
|
-
declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): React.JSX.Element;
|
|
121
|
-
declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): React.JSX.Element;
|
|
122
|
-
declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
|
|
123
|
-
declare const Toaster: ({ ...props }: ToasterProps) => React.JSX.Element;
|
|
124
|
-
export { Button, buttonVariants, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, };
|