Compile structured data into complete semantic HTML before delivery.
Research synthesis · July 21, 2026
Native HTML component systems
How to produce uniform, data-driven objects for application-like HTML output using semantic markup, modern CSS, native browser behavior, and the smallest credible runtime.
HTML has behavior and structure, but no native loops or arbitrary data binding.
Add JavaScript only for search, persistence, routing, live data, and comparable stateful needs.
01 · Component taxonomy
Different mechanisms solve different problems
“Component” is not one browser feature. Reuse, semantics, visual consistency, encapsulation, and runtime behavior are separate architectural concerns.
Generated components
Build-time renderers
Typed data records are validated and expanded into complete HTML before the artifact reaches the browser.
Semantic components
Native HTML elements
Elements such as <article>, <aside>, <figure>, and <dl> communicate meaning independently of styling.
Visual components
CSS contracts
Classes define anatomy. Data attributes define finite states. Custom properties provide design tokens. Container queries handle recomposition.
Encapsulated components
Declarative Shadow DOM
Provides style isolation and slots for a static instance. It does not supply data binding, loops, imports, or repeated instantiation.
Behavioral components
Custom elements
Use when an object needs lifecycle callbacks, runtime attribute updates, asynchronous work, domain events, or framework-neutral distribution.
Data rendering
Loops, binding, and imports
Interoperable HTML still has no native JSON binding, template loop, conditional expression, reusable partial import, or client-side include primitive.
Reuse
Who creates each instance?
- Build-time generator
- Server-side renderer
- Runtime JavaScript
Rendering
What does the browser receive?
- Complete semantic HTML
- Inert templates awaiting code
- Custom elements awaiting upgrade
Isolation
How are styles contained?
- Scoped naming and cascade layers
@scope- Shadow DOM at distribution boundaries
02 · Architecture
Compile the knowledge model into the presentation model
The generator is a small compiler pipeline. It validates records, escapes content, selects semantic structures, and emits a complete document with optional progressive enhancement.
Knowledge model
Facts remain independent of presentation
interface ResearchFindingV1 {
schemaVersion: 1;
id: string;
claim: string;
explanation: string;
confidence: "high" | "medium" | "low";
classification:
| "fact"
| "analysis"
| "inference"
| "recommendation";
sourceIds: string[];
tags: string[];
}
Presentation model
Instances contain readable content
<article
class="finding"
data-confidence="high"
data-classification="fact">
<p class="finding__type">Finding</p>
<h3>Declarative HTML is viable</h3>
<p>Complete readable content lives here.</p>
</article>
03 · Browser support
Separate required core from progressive and limited features
“Modern browser” is not a sufficient enterprise contract. Each capability should be classified by whether the complete experience depends on it.
| Capability | July 2026 posture | Runtime JS | Recommended use |
|---|---|---|---|
| Semantic HTML objects | Core | No | Default structure and accessibility foundation |
| Shared CSS classes and tokens | Core | No | Default visual component system |
<template> |
Core but inert | Required to instantiate in-browser | Build input, runtime source, or Declarative Shadow DOM wrapper |
| Declarative Shadow DOM | Progressive | No | Selective isolation boundary |
| Autonomous custom elements | Core platform | Usually yes | Runtime component APIs and lifecycle |
| Customized built-in elements | Limited | Yes | Avoid as an enterprise interoperability foundation |
<details> |
Core | No | Disclosure and secondary evidence |
Grouped <details name> |
Progressive | No | No-JS mutually exclusive accordions |
<dialog> |
Core | Not always | Focused modal or non-modal surfaces |
| Popover | Progressive | No | Definitions, previews, small menus, contextual help |
| Invoker commands | Progressive | No | Declarative dialog and command control |
| Size container queries | Core | No | Component-level responsive recomposition |
@scope |
Progressive | No | Selector scoping without Shadow DOM |
| Container style queries | Progressive | No | Token- or state-driven visual adaptation |
| Customizable select | Limited | No where available | Progressive enhancement only |
hidden="until-found" |
Limited | No | Optional searchable disclosure, not core navigation |
| CSS anchor positioning | Limited | No | Enhancement only; do not require for layout |
| Native HTML includes | Unavailable | — | Handle at build, server, edge, or runtime layer |
| Native loops and data binding | Unavailable | — | Handle at build, server, or runtime layer |
The table is horizontally scrollable within its own boundary on narrow screens. It does not force page-level horizontal overflow.
04 · Native demonstrations
Browser-managed behavior can replace substantial routine JavaScript
The examples below are rendered as real native controls. The theme switch is the only enhancement script on this page.
Disclosure and accordion
Grouped <details name> provides mutually exclusive panels.
Build-time rendering
Data is validated and converted into visible semantic HTML before delivery.
Runtime rendering
JavaScript creates or updates instances after the document loads.
Popover
Contextual information appears in the browser top layer.
Declarative dialog control
Recent invoker commands can open and close dialogs without custom event code.
Native metrics
<meter> represents bounded values; <progress> represents task completion.
Declarative Shadow DOM
The parser creates an encapsulated static instance. No custom-element definition is required.
Static isolation works
The instance is isolated, but it was still authored or generated as a complete instance.
Semantic key-value object
A definition list is often a better metadata component than a generic grid of divisions.
- Renderer
- Build-time TypeScript
- Runtime
- Optional enhancement only
- Primary output
- Complete semantic HTML
- Isolation
- Light DOM by default
05 · Support policy
Three tiers prevent accidental dependence on immature features
The full document must remain understandable and usable at the required core tier. Newer capabilities may enrich behavior without becoming a single point of failure.
Required core
- Semantic HTML
- Links, forms, and disclosure
- Grid, Flexbox, custom properties
- Cascade layers and container queries
- Print, SVG, and responsive media
Progressive native enhancement
- Popover
- Grouped
<details> - Declarative Shadow DOM
- Invoker commands
@scopeand style queries
Limited or experimental
- Customizable select internals
hidden="until-found"- Anchor positioning
- Typed
attr() - HTML Modules and template proposals
06 · Red-team findings
The main failures are architectural, not syntactic
Most fragile implementations arise from confusing static presentation with runtime application behavior, or from using CSS and Shadow DOM to solve problems they do not own.
Calling every static artifact a SPA
A long, application-like document is not a conventional SPA unless it performs route, state, and DOM transitions at runtime.
Control: use “single-document application artifact” when runtime behavior is intentionally absent.
Treating Shadow DOM as reuse
Shadow DOM isolates an existing instance. It does not instantiate a shared template or bind arbitrary data.
Control: use light DOM internally and Shadow DOM only at real distribution boundaries.
Encoding meaningful content in attributes
Attributes alone do not create visible, searchable, printable prose. Another renderer is still required.
Control: keep user-facing meaning in semantic descendants.
CSS-only application state machines
Checkbox and fragment hacks create weak focus behavior, brittle history, hidden controls, and difficult recovery.
Control: use native controls first, then small JavaScript when the interaction is genuinely stateful.
Search and disclosure conflict
Hidden panels and isolated trees can reduce find-in-page, fragment navigation, copy, and print reliability.
Control: keep primary content in document flow and disclose only secondary detail.
Template consistency without validation
A template does not prevent missing fields, invalid nesting, unsafe HTML, heading errors, or uncontrolled variants.
Control: validate both the input schema and rendered document.
07 · Implementation contract
Standardize the compiler, not only the card styles
A durable system defines the data contract, semantic output, responsive behavior, validation policy, and capability tier for each component.
Use semantic HTML + CSS when
The object primarily presents known content
Best for findings, recommendations, risks, sources, diagrams, comparison rows, and documentation sections.
Use Declarative Shadow DOM when
The object crosses an isolation boundary
Best for third-party embeds, isolated demonstrations, and components inserted into unknown host applications.
Use a custom element when
The object owns a behavioral API
Appropriate for lifecycle, async work, runtime updates, domain events, or cross-framework packaging.
Use small JavaScript when
The capability cannot be represented declaratively
Examples include fuzzy search, persistence, language switching, routing, drag-and-drop, dynamic charts, and live data.
Every component renderer defines
- Accepted schema and required fields
- Semantic root and heading-level policy
- Permitted children and empty states
- Finite variants and native states
- Escaping and sanitization policy
- Responsive and print behavior
Every artifact validation pass checks
- Keyboard and focus behavior
- Find-in-page and fragment navigation
- Print and offline behavior
- Mobile overflow containment
- Forced colors and reduced motion
- No-script completeness and recovery
08 · Sources and provenance
Primary standards and browser-platform references
Browser status evolves. Revalidate progressive and limited features against the current Baseline dataset before treating them as required capabilities.
web-platform-dx.github.io/web-features-explorer/features/details-name/
web-platform-dx.github.io/web-features-explorer/features/dialog/
web-platform-dx.github.io/web-features-explorer/features/popover/
web-platform-dx.github.io/web-features-explorer/features/invoker-commands/
web-platform-dx.github.io/web-features-explorer/features/declarative-shadow-dom/
@scope
web-platform-dx.github.io/web-features-explorer/features/scope/
web-platform-dx.github.io/web-features-explorer/features/container-style-queries/