diff --git a/module/docs/plugin-manifest-schema.md b/module/docs/plugin-manifest-schema.md index 3b0612581..767b4f60f 100644 --- a/module/docs/plugin-manifest-schema.md +++ b/module/docs/plugin-manifest-schema.md @@ -97,8 +97,11 @@ has three node kinds: one metric. These metric-bound widgets are distinct from `ui.widgets`, which are presentation slots contributed to host surfaces; the two never mix. -On a registered solution's page the host renders every declared dashboard, and -each viewer can arrange it for themselves: reorder its declared widgets, remove +On a registered solution's page the host renders every declared dashboard in a +**Dashboard** tab beside the solution's own **App** tab, never stacked above +the solution; the solution stays mounted while the dashboard is open. A +solution that declares no dashboard gets no tab bar. Each viewer can arrange a +dashboard for themselves: reorder its declared widgets, remove them, and re-add the ones they removed. The declared widgets, in declared order, are where every viewer starts, and a widget declared later reaches viewers who already rearranged. A viewer's arrangement is a preference (ADR 0007): it never diff --git a/module/services/frontend/code/package-lock.json b/module/services/frontend/code/package-lock.json index 44a082097..606968f29 100644 --- a/module/services/frontend/code/package-lock.json +++ b/module/services/frontend/code/package-lock.json @@ -14,8 +14,8 @@ "@base-ui/react": "^1.3.0", "@bufbuild/protobuf": "^2.11.0", "@codefly-dev/saas-sdk": "0.3.15", - "@codefly-dev/saas-ui": "0.11.3", - "@codefly-dev/ui": "0.11.3", + "@codefly-dev/saas-ui": "0.11.4", + "@codefly-dev/ui": "0.11.4", "@codefly/saas-plugin-contract": "2.3.0", "@codefly/saas-plugin-manifest": "0.1.0", "@codefly/saas-plugin-react": "0.4.1", @@ -15266,7 +15266,7 @@ }, "packages/codefly-ui": { "name": "@codefly-dev/ui", - "version": "0.11.3", + "version": "0.11.4", "license": "Apache-2.0", "dependencies": { "@base-ui/react": "^1.3.0", @@ -15418,7 +15418,7 @@ }, "packages/saas-ui": { "name": "@codefly-dev/saas-ui", - "version": "0.11.3", + "version": "0.11.4", "license": "Apache-2.0", "devDependencies": { "@bufbuild/protobuf": "^2.11.0", diff --git a/module/services/frontend/code/package.json b/module/services/frontend/code/package.json index 6b6676246..e64b5826e 100644 --- a/module/services/frontend/code/package.json +++ b/module/services/frontend/code/package.json @@ -37,8 +37,8 @@ "@base-ui/react": "^1.3.0", "@bufbuild/protobuf": "^2.11.0", "@codefly-dev/saas-sdk": "0.3.15", - "@codefly-dev/saas-ui": "0.11.3", - "@codefly-dev/ui": "0.11.3", + "@codefly-dev/saas-ui": "0.11.4", + "@codefly-dev/ui": "0.11.4", "@codefly/saas-plugin-contract": "2.3.0", "@codefly/saas-plugin-manifest": "0.1.0", "@codefly/saas-plugin-react": "0.4.1", diff --git a/module/services/frontend/code/packages/codefly-ui/package.json b/module/services/frontend/code/packages/codefly-ui/package.json index f541dd943..d86b3edfc 100644 --- a/module/services/frontend/code/packages/codefly-ui/package.json +++ b/module/services/frontend/code/packages/codefly-ui/package.json @@ -1,6 +1,6 @@ { "name": "@codefly-dev/ui", - "version": "0.11.3", + "version": "0.11.4", "description": "The shared, versioned Codefly SaaS frontend kit: the plugin host and the tokens-as-data skin mechanism, standalone so the host and Module-Federation remotes import and dedupe one copy.", "repository": { "type": "git", diff --git a/module/services/frontend/code/packages/saas-ui/README.md b/module/services/frontend/code/packages/saas-ui/README.md index 66efcb037..c3a3ec783 100644 --- a/module/services/frontend/code/packages/saas-ui/README.md +++ b/module/services/frontend/code/packages/saas-ui/README.md @@ -292,6 +292,19 @@ role via Accounts' registration/grant service paths. Only `admin@acme.com` and a demo source; other fixture viewers remain ungranted. Reseeding reconverges the declared grants, so test revocation without restarting the fixture runtime. +## Audit + +`` says when someone last signed in the way a +person reads it ("Last login · 12 seconds ago"), and keeps it true as time +passes: it re-says itself every second for the first minute, then every 30 +seconds, then every five minutes. The exact time is on the `