markwalet / markwalet/nova-modal-response
v2.0 roadmap: stacked content blocks for ModalResponse
@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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.