You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2026/09/02 07:24:23 UTC
(causeway) 03/03: docs(openspec): archive action result presentation styles
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch htmx
in repository https://gitbox.apache.org/repos/asf/causeway.git
commit 3082ef79b3e2ea2838e9ae59d58ede5eaa58a27d
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Sep 2 09:23:04 2026 +0200
docs(openspec): archive action result presentation styles
---
.../.openspec.yaml | 0
.../design.md | 0
.../proposal.md | 0
.../specs/domain-web-components/spec.md | 0
.../generic-htmx-web-component-viewer/spec.md | 0
.../tasks.md | 0
openspec/specs/domain-web-components/spec.md | 54 ++++++++++++++++++----
.../generic-htmx-web-component-viewer/spec.md | 54 ++++++++++++++++++----
8 files changed, 91 insertions(+), 17 deletions(-)
diff --git a/openspec/changes/add-action-result-presentation-styles/.openspec.yaml b/openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/.openspec.yaml
similarity index 100%
rename from openspec/changes/add-action-result-presentation-styles/.openspec.yaml
rename to openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/.openspec.yaml
diff --git a/openspec/changes/add-action-result-presentation-styles/design.md b/openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/design.md
similarity index 100%
rename from openspec/changes/add-action-result-presentation-styles/design.md
rename to openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/design.md
diff --git a/openspec/changes/add-action-result-presentation-styles/proposal.md b/openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/proposal.md
similarity index 100%
rename from openspec/changes/add-action-result-presentation-styles/proposal.md
rename to openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/proposal.md
diff --git a/openspec/changes/add-action-result-presentation-styles/specs/domain-web-components/spec.md b/openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/specs/domain-web-components/spec.md
similarity index 100%
rename from openspec/changes/add-action-result-presentation-styles/specs/domain-web-components/spec.md
rename to openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/specs/domain-web-components/spec.md
diff --git a/openspec/changes/add-action-result-presentation-styles/specs/generic-htmx-web-component-viewer/spec.md b/openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/specs/generic-htmx-web-component-viewer/spec.md
similarity index 100%
rename from openspec/changes/add-action-result-presentation-styles/specs/generic-htmx-web-component-viewer/spec.md
rename to openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/specs/generic-htmx-web-component-viewer/spec.md
diff --git a/openspec/changes/add-action-result-presentation-styles/tasks.md b/openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/tasks.md
similarity index 100%
rename from openspec/changes/add-action-result-presentation-styles/tasks.md
rename to openspec/changes/archive/2026-09-02-add-action-result-presentation-styles/tasks.md
diff --git a/openspec/specs/domain-web-components/spec.md b/openspec/specs/domain-web-components/spec.md
index a31597cce8f..36e13faa051 100644
--- a/openspec/specs/domain-web-components/spec.md
+++ b/openspec/specs/domain-web-components/spec.md
@@ -2573,26 +2573,64 @@ Canonical schema, authorization, action validation, and returned GraphQL values
- **AND** later fragment or declaration changes cannot reinterpret that completed result generation
### Requirement: Generic action-result outlet
-The component library SHALL provide `<cw-action-results>` as a passive accessible outlet for host-owned action-result presentation.
+The component library SHALL provide `<cw-action-results>` as a passive accessible outlet for host-owned action-result presentation with declarative `INLINE`, `DIALOG`, and `SIDEBAR` surfaces.
The outlet MUST NOT globally subscribe to action results, invoke actions, choose application policy, navigate, resolve fragments, or independently construct domain presentation.
#### Scenario: Outlet is empty
- **WHEN** no current host-owned result presentation is mounted
-- **THEN** `<cw-action-results>` contributes no misleading result content, focus target, or occupied layout space
+- **THEN** `<cw-action-results>` contributes no misleading result content, focus target, occupied layout space, dialog, or sidebar
- **AND** it remains available as a semantic placement boundary
-#### Scenario: Host mounts a result
-- **WHEN** the owning viewer places a current scalar, void-status, or standalone collection presentation into the outlet
-- **THEN** the outlet exposes an accessible result-region relationship for that content
-- **AND** optional host controls remain compactly aligned with the result presentation rather than stretching across its width
+#### Scenario: Presentation style is absent or invalid
+- **WHEN** `presentation-style` is absent, blank, or unsupported
+- **THEN** the outlet normalizes to `INLINE`
+- **AND** existing direct-child layout, replacement, clear, and accessibility behavior remains compatible
+
+#### Scenario: Host mounts an inline result
+- **WHEN** the owning viewer places a current scalar, void-status, or standalone collection presentation into an `INLINE` outlet
+- **THEN** the outlet exposes an accessible in-page result-region relationship for that content
+- **AND** the Dismiss control is placed below the result content without reducing its available inline size
+- **AND** long result content scrolls within a bounded content area while Dismiss remains visible and operable below it
- **AND** result rendering, announcements, links, values, and lifecycle remain owned by their established host and semantic components
+#### Scenario: Host mounts a dialog result
+- **WHEN** the owning viewer places a current presentation into a `DIALOG` outlet
+- **THEN** the outlet opens one bounded labelled modal surface with a backdrop
+- **AND** long result content scrolls independently above a visible Dismiss control placed below that content
+- **AND** presentation nodes remain identity-stable light-DOM descendants of the route-owned outlet
+
+#### Scenario: Keyboard user operates a dialog result
+- **WHEN** a dialog result is open
+- **THEN** initial focus enters the modal surface, Tab and Shift+Tab remain contained, and Escape requests dismissal
+- **AND** dismissal restores focus to the connected eligible originating control supplied by the host
+
+#### Scenario: Host mounts a sidebar result
+- **WHEN** the owning viewer places a current presentation into a `SIDEBAR` outlet
+- **THEN** the outlet opens one labelled non-modal panel at the viewport inline end without making the underlying page inert
+- **AND** the panel is reachable through ordinary keyboard navigation and its bounded content scrolls above a visible Dismiss control without horizontal document overflow
+
+#### Scenario: Keyboard user operates a sidebar result
+- **WHEN** focus is within an open sidebar result
+- **THEN** Escape requests dismissal without trapping ordinary Tab navigation
+- **AND** explicit dismissal restores focus to the connected eligible originating control supplied by the host
+
+#### Scenario: Narrow viewport or reduced motion applies
+- **WHEN** a dialog or sidebar result is presented on a narrow viewport or under reduced-motion preference
+- **THEN** content, heading, and dismissal remain visible and operable within the visual viewport
+- **AND** the surface introduces neither horizontal document overflow nor required animation
+
#### Scenario: Result is replaced
- **WHEN** the host accepts a newer successful result generation
-- **THEN** prior result nodes and transient toolkit state are retired before the newer presentation becomes current
+- **THEN** prior result nodes, surface structure, focus containment, and transient toolkit state are retired before the newer presentation becomes current
- **AND** stale nodes cannot remain interactive or overwrite the replacement
+#### Scenario: Result is cleared
+- **WHEN** the host clears or dismisses the current result
+- **THEN** any open dialog or sidebar closes and the outlet returns to hidden-empty state
+- **AND** focus restoration occurs only for a connected eligible origin and never targets stale route content
+
#### Scenario: Outlet disconnects
- **WHEN** route replacement or page lifecycle disconnects the outlet
-- **THEN** its mounted presentation cannot receive later asynchronous state
+- **THEN** its mounted presentation and styled surface cannot receive later asynchronous state
+- **AND** modal state, backdrop, focus containment, and document-overflow effects are fully retired
- **AND** the viewer remains free to use its current deterministic fallback destination
diff --git a/openspec/specs/generic-htmx-web-component-viewer/spec.md b/openspec/specs/generic-htmx-web-component-viewer/spec.md
index 1f70ba8b9a6..638a47c611e 100644
--- a/openspec/specs/generic-htmx-web-component-viewer/spec.md
+++ b/openspec/specs/generic-htmx-web-component-viewer/spec.md
@@ -1149,7 +1149,7 @@ A default resource MUST be resolved inertly before invocation and MUST NOT execu
### Requirement: HTMX action-result outlet resolution
The generic HTMX viewer SHALL prefer one unique `<cw-action-results>` in the active route page for successful non-navigating action-result presentation and SHALL retain its stable shell result region as fallback.
-Result routing MUST remain host-owned and generation-safe.
+Result routing MUST remain host-owned and generation-safe, while the resolved outlet's normalized presentation style controls only the visual surface.
#### Scenario: Active page has one outlet
- **WHEN** an action interaction begins while exactly one connected action-result outlet belongs to the active route page
@@ -1157,36 +1157,72 @@ Result routing MUST remain host-owned and generation-safe.
- **AND** a later successful scalar, void-status, or collection presentation is mounted there only while the destination remains current
#### Scenario: Inline result is outside the viewport
-- **WHEN** the current host mounts a successful non-navigating result outside the visible viewport
+- **WHEN** the current host mounts a successful non-navigating result outside the visible viewport into an `INLINE` outlet
- **THEN** the viewer scrolls the result outlet into view without moving keyboard focus
- **AND** reduced-motion preference disables animated scrolling
+#### Scenario: Dialog or sidebar result is mounted
+- **WHEN** the resolved outlet normalizes to `DIALOG` or `SIDEBAR`
+- **THEN** the viewer supplies the originating action focus target and mounts the unchanged host-owned result presentation into that outlet
+- **AND** opening the styled surface does not scroll the underlying route or alter result data
+
+#### Scenario: Styled result is dismissed
+- **WHEN** a dialog or sidebar dismiss control or supported Escape lifecycle requests dismissal
+- **THEN** the viewer clears the current result through the established destination lifecycle
+- **AND** focus returns to the eligible originating object-action or service-action control when it remains connected
+
#### Scenario: Active page has no outlet
- **WHEN** no applicable page outlet exists
-- **THEN** successful non-navigating results use the stable shell result region
+- **THEN** successful non-navigating results use the stable shell result region and its normalized presentation style
- **AND** existing applications require no markup migration
#### Scenario: Active page has duplicate outlets
- **WHEN** more than one equally applicable outlet exists in the active route page
- **THEN** the viewer exposes a bounded ambiguity diagnostic and uses the stable shell fallback
-- **AND** DOM order is not used to choose an arbitrary owner
+- **AND** DOM order is not used to choose an arbitrary owner or presentation style
#### Scenario: Captured outlet disconnects
- **WHEN** route replacement disconnects the captured outlet before an asynchronous result completes
-- **THEN** stale work cannot mount into that outlet or a different page's outlet
-- **AND** the still-current host policy may use the stable shell fallback without transferring stale node state
+- **THEN** stale work cannot mount into that outlet, reopen its styled surface, or use a different page's outlet
+- **AND** the still-current host policy may use the stable shell fallback without transferring stale node or focus state
#### Scenario: Application claims the result
- **WHEN** configured `causewayHtmxPolicy.handleResult` claims a result
-- **THEN** neither page outlet nor shell fallback is modified by default policy
+- **THEN** neither page outlet nor shell fallback is modified or opened by default policy
- **AND** the application receives the authoritative semantic result detail and additive resolved-presentation snapshot
#### Scenario: Object result is returned
- **WHEN** a successful result advertises one navigable object identity
- **THEN** established canonical object navigation remains authoritative
-- **AND** the object is not mounted into an action-result outlet
+- **AND** no inline, dialog, or sidebar result surface is mounted
#### Scenario: Void refresh preserves status
- **WHEN** void-result policy refreshes the active route while preserving current result status
- **THEN** the still-current status is rehomed to the unique equivalent outlet in the refreshed page or stable shell fallback
-- **AND** obsolete outlet or route generations cannot reclaim it
+- **AND** obsolete outlet, route, surface, or focus generations cannot reclaim it
+
+### Requirement: Action-result presentation style qualification
+The Petclinic browser acceptance application SHALL exercise `INLINE`, `DIALOG`, and `SIDEBAR` action-result outlets under default Vaadin and explicit native component-toolkit policies.
+Unexpected invocation, routing, focus, Escape, backdrop, overflow, responsive, replacement, dismissal, announcement, console, page, or external-request failures MUST fail qualification.
+
+#### Scenario: Inline result is qualified
+- **WHEN** a deterministic Petclinic action returns a non-navigating result to an `INLINE` outlet
+- **THEN** sticky-header-aware reveal, links, values, announcements, replacement, and dismissal remain operable
+- **AND** long result content scrolls within a bounded area above a visible Dismiss control
+- **AND** the result surface introduces no modal or sidebar behavior
+
+#### Scenario: Dialog result is qualified
+- **WHEN** a deterministic Petclinic action returns a result to a `DIALOG` outlet
+- **THEN** labelled modal semantics, backdrop, initial focus, Tab containment, Escape, explicit dismissal, replacement, and origin focus restoration are verified
+- **AND** bounded result scrolling keeps the Dismiss control visible below the content
+- **AND** route content cannot remain interactively exposed through stale modal state
+
+#### Scenario: Sidebar result is qualified
+- **WHEN** a deterministic Petclinic action returns a result to a `SIDEBAR` outlet
+- **THEN** right-side placement, non-modal page access, ordinary Tab order, Escape while focused within, explicit dismissal, replacement, and origin focus restoration are verified
+- **AND** wide and narrow viewports retain bounded internal result scrolling above a visible Dismiss control with no horizontal document overflow
+
+#### Scenario: Styled result respects established ownership
+- **WHEN** duplicate, disconnected, superseded, application-claimed, object-valued, or void-refresh result paths are exercised
+- **THEN** established outlet fallback, canonical navigation, application ownership, preservation, and stale-generation behavior remain authoritative
+- **AND** presentation style cannot select a destination or reinterpret the result