{"schema":"xtend.docs.parsedown-rmt-page-payload.v1","ok":true,"slug":"xtend-classic","requestedSlug":"xtend-classic","canonicalSlug":"xtend-classic","aliased":false,"locale":"en","requestedLocale":"en","resolvedLocale":"en","fallbackLocale":"de","translationAvailable":true,"html":"<h1 id=\"xtend-classic\">XTend Classic</h1>\n<p>XTend Classic is the productive HTML- and JavaScript-first delivery path for XTend Web Components. A host keeps its authored HTML, loads the local <code>components/manifest.json</code> through <code>xtend-loader.js</code>, and lets the browser register components without an XTend application build.</p>\n<p>“No application build required” means that XTend does not require Maraca, the compiler, or the CLI to deliver the page. A host may still use its own bundler, TypeScript, local server, or optional XTend tooling. Classic is not a legacy mode: only <code>xtend-dev.js</code> and the <code>./legacy-loader</code> export are legacy compatibility surfaces.</p>\n<p>The package root now belongs to the <a href=\"./esm-registry.md\">ESM Registry</a>. It does not start Classic. Package-based Classic hosts must use <code>@ccslabs/xtend/loader</code>; script-based hosts continue to include <code>xtend-loader.js</code> explicitly.</p>\n<pre><code class=\"language-js\">import &#039;@ccslabs/xtend/loader&#039;;</code></pre>\n<h2 id=\"choose-classic-or-maraca\">Choose Classic or Maraca</h2>\n<table><thead><tr><th>XTend Classic</th><th>XTend Maraca</th></tr></thead><tbody><tr><td>HTML- and JavaScript-first</td><td>RMT- and build-first</td></tr><tr><td>Runtime manifest with <code>xtend-loader.js</code></td><td>Static inline registry in a generated ESM bundle</td></tr><tr><td>No XTend application build required</td><td>Plan, build, tune, and evidence pipeline</td></tr><tr><td>Dynamic catalogs and progressive enhancement</td><td>Optimized app graphs, SSR/hydration, PWA, and production reports</td></tr></tbody></table>\n<p>Both paths use the same public Web Component contracts. Choose Classic for directly authored sites, documentation, progressive enhancement, dynamic component catalogs, or hosts that deliberately own their runtime composition. Choose <a href=\"./xtend-maraca.md\">XTend Maraca</a> when an RMT document should become a compiler-selected application bundle with build evidence.</p>\n<h2 id=\"minimal-classic-host\">Minimal Classic host</h2>\n<p>Preload only the components required in the first viewport. The loader discovers deeper manifest-backed elements and loads them as they approach the viewport.</p>\n<pre><code class=\"language-html\">&lt;meta name=&quot;xtend-preload&quot; content=&quot;xtend-state,x-theme,x-header,x-hero&quot;&gt;\n&lt;script type=&quot;module&quot;\n  src=&quot;/xtend-loader.js&quot;\n  data-manifest=&quot;/components/manifest.json&quot;&gt;&lt;/script&gt;\n\n&lt;x-hero&gt;\n  &lt;h1&gt;Hello XTend Classic&lt;/h1&gt;\n&lt;/x-hero&gt;\n&lt;x-section label=&quot;Loaded near the viewport&quot;&gt;&lt;/x-section&gt;</code></pre>\n<p>The manifest remains the host-controlled allowlist. Unknown tags stay undefined, while refused protocols, origins, paths, or extensions produce explicit loader diagnostics instead of a remote fallback.</p>\n<h2 id=\"javascript-and-dynamic-content\">JavaScript and dynamic content</h2>\n<p><code>window.__XTendLoaderBootPromise</code> exposes initial boot completion. Use the public loader API when JavaScript adds a known component after boot:</p>\n<pre><code class=\"language-js\">await window.__XTendLoaderBootPromise;\n\nconst region = document.querySelector(&#039;[data-dynamic-region]&#039;);\nconst button = document.createElement(&#039;x-button&#039;);\nbutton.setAttribute(&#039;label&#039;, &#039;Continue&#039;);\nregion.append(button);\nawait window.XTendLoader.hydrateTree(region);\nawait customElements.whenDefined(&#039;x-button&#039;);</code></pre>\n<p>Prefer structured DOM operations for untrusted or variable content. Free HTML strings still require the documented Trusted DOM and sanitizing boundaries; Classic does not weaken security policy.</p>\n<h2 id=\"optional-dev-api\">Optional DEV API</h2>\n<p>Development hosts can ask the same loader to install the read-only Classic diagnostics adapter:</p>\n<pre><code class=\"language-html\">&lt;script type=&quot;module&quot;\n  src=&quot;/xtend-loader.js&quot;\n  data-manifest=&quot;/components/manifest.json&quot;\n  data-dev-api=&quot;true&quot;&gt;&lt;/script&gt;</code></pre>\n<p>This exposes <code>window.__XTEND_DEV_API__</code> without another script tag or monkeypatching. Loader and browser performance measurements are real; Fabric, RMT Kernel, and SSR hydration report <code>supported: false</code> when those runtimes are not active.</p>\n<h2 id=\"production-checklist\">Production checklist</h2>\n<ul>\n<li>Keep the loader, manifest, component modules, styles, and image assets same-origin or explicitly host-approved.</li>\n<li>Preload the complete first-viewport component set and leave below-the-fold components lazy.</li>\n<li>Wait for public readiness promises before calling component methods.</li>\n<li>Test keyboard behavior, reduced motion, layout stability, import refusal, and missing optional capabilities.</li>\n<li>Enable the DEV API only for hosts that should expose local diagnostics.</li>\n<li>Use documented attributes, events, slots, CSS parts, types, and globals; private shadow DOM remains internal.</li>\n</ul>\n<h2 id=\"technical-references\">Technical references</h2>\n<ul>\n<li><a href=\"./manifest.md\">Manifest</a></li>\n<li><a href=\"./esm-registry.md\">ESM Registry</a></li>\n<li><a href=\"./api.md\">API</a></li>\n<li><a href=\"./xtend-loader-types.md\">XTend Loader Types</a></li>\n<li><a href=\"./xtend-dev-api.md\">XTend DEV API</a></li>\n<li><a href=\"./design-tokens.md\">Design Tokens</a></li>\n</ul>","meta":{"schema":"xtend.docs.parsedown-rmt-page.v1","source":"docs/en/xtend-classic.md","slug":"xtend-classic","locale":"en","requestedLocale":"en","resolvedLocale":"en","fallbackLocale":"de","translationAvailable":true,"routeId":"docs.xtend.classic","path":"/en/xtend-classic","router":"xtend.xrouter","title":"XTend Classic","documentTitle":"XTend Classic | XTend Documentation","titleTemplate":"{{title}} | XTend Documentation","metaDescription":"XTend Classic is the productive HTML- and JavaScript-first delivery path for XTend Web Components. A host keeps its authored HTML, loads the local componen","metaKeywords":["xtend","documentation","xtend classic"],"template":"docs.xtend-classic.markdown","shellFirst":true,"shellTemplate":"docs.app.shell","searchTemplate":"docs.header.search","contentSlot":"content","contentKind":"parsedownHtml","adapter":"docs.parsedown","component":"docs.page","markupClass":"parsedownHtml","trustBoundary":"xtend.security.sanitizing-boundary.v1","lazyPayload":true,"skeletonLoader":"xtend.loader.skeleton-loader.v1","schedules":{"shell":"docs.shell.render","parse":"docs.markdown.parse","route":"docs.route.render","hydrate":"docs.page.hydrate","search":"docs.search.index","rich":"docs.rich-content.prepare","media":"docs.media.lazy","diagnostics":"docs.diagnostics.snapshot"},"endpoints":{"shell":"xtendrmt.shell.render","parse":"xtendrmt.docs.parsedown.parse","route":"xtendrmt.route.render","hydrate":"xtendrmt.component.hydrate","search":"xtendrmt.docs.search.index","rich":"xtendrmt.docs.rich-content.prepare","media":"xtendrmt.docs.media.lazy","diagnostics":"xtendrmt.diagnostics.snapshot"},"extensionSlots":["docs.slot.content","docs.slot.sidebar","docs.slot.related","docs.slot.component-demo","docs.slot.rich-content","docs.slot.media","docs.slot.diagnostics"],"route":{"id":"docs.xtend.classic","path":"/en/xtend-classic","router":"xtend.xrouter","component":"docs.page","title":"XTend Classic","documentTitle":"XTend Classic | XTend Documentation","titleTemplate":"{{title}} | XTend Documentation","metaDescription":"XTend Classic is the productive HTML- and JavaScript-first delivery path for XTend Web Components. A host keeps its authored HTML, loads the local componen","metaKeywords":["xtend","documentation","xtend classic"],"template":"docs.xtend-classic.markdown","shell":"docs.app.shell","schedule":"docs.route.render","skeleton":"article","skeletonProfile":"docs-article","skeletonLines":10,"skeletonMinHeight":"26rem","hydration":{"schedule":"docs.page.hydrate","policy":"visible"},"metadata":{"source":"docs/en/xtend-classic.md","slug":"xtend-classic","locale":"en","requestedLocale":"en","resolvedLocale":"en","fallbackLocale":"de","translationAvailable":true,"shellTemplate":"docs.app.shell","searchTemplate":"docs.header.search","contentKind":"parsedownHtml","lazyPayload":true,"skeletonLoader":"xtend.loader.skeleton-loader.v1","seo":{"title":"XTend Classic","documentTitle":"XTend Classic | XTend Documentation","titleTemplate":"{{title}} | XTend Documentation","description":"XTend Classic is the productive HTML- and JavaScript-first delivery path for XTend Web Components. A host keeps its authored HTML, loads the local componen","keywords":["xtend","documentation","xtend classic"]}}}},"source":"docs/en/xtend-classic.md","schedule":"docs.markdown.parse","endpoint":"xtendrmt.docs.parsedown.parse","skeletonLoader":"xtend.loader.skeleton-loader.v1"}