28 lines
1.8 KiB
Markdown
28 lines
1.8 KiB
Markdown
# Portal Interface Pattern Migration
|
|
|
|
Portal is a public-service-style directory for authenticated institutional
|
|
users. Services owns definitions, Policy/provider capabilities own availability,
|
|
and Cases, Forms Runtime, or Workflow Engine owns the launch effect. Portal
|
|
does not import those modules or infer their state.
|
|
|
|
| Surface | Task and archetype | Consequence and state contract |
|
|
| --- | --- | --- |
|
|
| `/portal` toolbar | Find and filter services | Search and the unavailable-service toggle affect only the directory result. Counts are announced as the result changes. |
|
|
| Service directory | Public service/entry catalogue | Loading, empty, failed, available, unavailable, and capability-unknown states remain distinct. Only discoverable service metadata is rendered. |
|
|
| Availability blocker | Explained disabled action | Open remains in its stable action position. The blocker states why launch is unavailable, what must happen, the responsible actor, and the destination. |
|
|
| Open service | Consequential handoff | Portal re-evaluates the exact service revision with a replay-safe request, then hands off to the provider-owned route. It never reports success without a destination. |
|
|
|
|
The directory uses Core buttons, toggle, status, loading, alerts, scrolling,
|
|
blocker explanation, guarded navigation, and documentation help. Availability
|
|
is expressed in text as well as color. The responsive toolbar stacks before the
|
|
service list and every action remains keyboard-operable. Optional owner modules
|
|
remain capability-based and an unavailable provider does not become a broken
|
|
link.
|
|
|
|
Verification:
|
|
|
|
- `npm run test:interface-pattern`
|
|
- Portal service-directory and manifest tests
|
|
- the Core TypeScript graph, structural localization audit, theme check, module
|
|
permutations, and full-product bundle budget
|