markwalet / markwalet/nova-modal-response

v2.0 roadmap: stacked content blocks for ModalResponse

Open
#21 0 comments 0 reactions 1 assignee View on GitHub

@markwalet is already working on this.

Since May 26, 2026.

Dominant language
PHP
Stars
17
Forks
9
PR merge metrics
No merged PRs in 30d

Description

# v2.0 roadmap

The umbrella tracking issue for the v2.0 release. This is a high-level overview — progress is tracked automatically via the linked **sub-issues**, not in this description. Each topic below lists its related tickets for reference only.

## Why v2

In v1 the `ModalResponse::text/code/json/html` factories are mutually exclusive — each produces a one-shape modal, and the Vue side enforces a hard precedence where `code` silently shadows `html`/`body`. The only escape hatch is hand-rolled `html()`, which throws away syntax highlighting and any styling the package ships.

v2 reshapes the modal body into an ordered **stack** of typed **blocks** (`ModalResponse::stack([...])`), with a single Vue render path that dispatches each block through a `type → component` map. The legacy PHP factories survive as one-liner sugar, so PHP upgrades cleanly — but the wire format breaks hard for anyone calling `Action::modal('modal-response', [...])` directly. See **ADR-0001**.

v2 also introduces **inline grouping** — a constrained way to lay atoms out horizontally (label + badge, a row of badges, an icon next to text) without turning the package into a layout engine. See **ADR-0002**.

## Foundation — the stack

The core block model: an ordered stack of typed blocks rendered through a single Vue dispatch path, with the legacy `text/code/json/html` factories preserved as one-line sugar and bare strings coerced to text blocks. Covers the built-in block types (text, heading, code, json, html, badge, divider, list) and the `withoutSyntaxHighlighting()` bulk helper.

Tickets: #22, #23, #24, #25, #26, #27, #28, #29, #30, #56

## Inline layout

Constrained horizontal grouping of inline **atoms** — one bounded level of nesting, no layout-engine knobs. Includes the inline atoms (link, icon), icons embedded inside link/badge host chrome, an alignment knob in place of the original `spread` boolean, and a testbench showcase. See **ADR-0002**.

Tickets: #47, #48, #49, #55, #61, #50

## New block types

Additional body blocks beyond the foundation. Markdown and view both compile/render to HTML server-side and serialize as an `html` block (no new wire type, no Vue component); collapsible is a distinct wire type with its own Vue component, pairing a header with a nested block stack.

Tickets: #58, #59, #60

## Hardening & release

Docs rewrite, 2.0.0 changelog and dist rebuild, the Vue-side warning for legacy payload keys, removal of the raw `Action::modal('modal-response', ...)` pattern from docs, and a Boost upgrade guideline for v1 → v2.

Tickets: #41, #42, #31, #53

## References

- **ADR-0001** — `docs/adr/0001-single-render-path-with-stacked-blocks.md` (single render path, stacked blocks)
- **ADR-0002** — `docs/adr/0002-constrained-inline-grouping.md` (constrained inline grouping)
- **Glossary** — `CONTEXT.md` (canonical vocabulary: stack, block, inline group, inline atom, variant, …)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.