@ccslabs/xtend 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (664) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +201 -0
  3. package/README.md +184 -0
  4. package/a11y/motion-contrast-policy.d.ts +32 -0
  5. package/a11y/motion-contrast-policy.js +261 -0
  6. package/a11y/runtime-a11y-contract.d.ts +44 -0
  7. package/a11y/runtime-a11y-contract.js +385 -0
  8. package/a11y/screenreader-signals.d.ts +32 -0
  9. package/a11y/screenreader-signals.js +372 -0
  10. package/api.d.ts +168 -0
  11. package/api.js +864 -0
  12. package/catalog/catalog-public-types.d.ts +66 -0
  13. package/catalog/component-catalog-coverage.d.ts +20 -0
  14. package/catalog/component-catalog-coverage.js +377 -0
  15. package/catalog/component-long-tail-migration.d.ts +18 -0
  16. package/catalog/component-long-tail-migration.js +305 -0
  17. package/catalog/component-regression-priority.d.ts +20 -0
  18. package/catalog/component-regression-priority.js +305 -0
  19. package/catalog/enterprise-component-flex-release-handoff.d.ts +32 -0
  20. package/catalog/enterprise-component-flex-release-handoff.js +437 -0
  21. package/catalog/enterprise-component-style-audit.d.ts +22 -0
  22. package/catalog/enterprise-component-style-audit.js +353 -0
  23. package/catalog/enterprise-form-control-theme-a11y.d.ts +19 -0
  24. package/catalog/enterprise-form-control-theme-a11y.js +220 -0
  25. package/catalog/enterprise-icon-control-audit.d.ts +21 -0
  26. package/catalog/enterprise-icon-control-audit.js +258 -0
  27. package/catalog/enterprise-layout-display-media-tokenization.d.ts +20 -0
  28. package/catalog/enterprise-layout-display-media-tokenization.js +237 -0
  29. package/catalog/enterprise-navigation-routing-state-hardening.d.ts +20 -0
  30. package/catalog/enterprise-navigation-routing-state-hardening.js +255 -0
  31. package/catalog/enterprise-overlay-mode-token-parity.d.ts +15 -0
  32. package/catalog/enterprise-overlay-mode-token-parity.js +178 -0
  33. package/catalog/enterprise-third-party-authoring-guide.d.ts +23 -0
  34. package/catalog/enterprise-third-party-authoring-guide.js +310 -0
  35. package/catalog/enterprise-visual-dom-snapshot-matrix.d.ts +31 -0
  36. package/catalog/enterprise-visual-dom-snapshot-matrix.js +357 -0
  37. package/catalog/epic10-existing-component-metadata.d.ts +25 -0
  38. package/catalog/epic10-existing-component-metadata.js +534 -0
  39. package/catalog/epic10-p0-component-wave.d.ts +28 -0
  40. package/catalog/epic10-p0-component-wave.js +688 -0
  41. package/catalog/epic10-platform-gates.d.ts +31 -0
  42. package/catalog/epic10-platform-gates.js +425 -0
  43. package/catalog/epic10-release-handoff.d.ts +30 -0
  44. package/catalog/epic10-release-handoff.js +195 -0
  45. package/catalog/epic11-enterprise-ux-handoff.d.ts +29 -0
  46. package/catalog/epic11-enterprise-ux-handoff.js +403 -0
  47. package/catalog/epic12-docs-adoption.d.ts +29 -0
  48. package/catalog/epic12-docs-adoption.js +183 -0
  49. package/catalog/epic12-rc0-gate-matrix.d.ts +36 -0
  50. package/catalog/epic12-rc0-gate-matrix.js +439 -0
  51. package/catalog/epic12-rc0-handoff.d.ts +30 -0
  52. package/catalog/epic12-rc0-handoff.js +385 -0
  53. package/catalog/epic13-conditional-network-evidence-ci.d.ts +35 -0
  54. package/catalog/epic13-conditional-network-evidence-ci.js +278 -0
  55. package/catalog/epic13-conditional-network-evidence.d.ts +34 -0
  56. package/catalog/epic13-conditional-network-evidence.js +280 -0
  57. package/catalog/epic13-docs-rmt-production-hardening.d.ts +39 -0
  58. package/catalog/epic13-docs-rmt-production-hardening.js +286 -0
  59. package/catalog/epic13-hydration-performance-closure.d.ts +33 -0
  60. package/catalog/epic13-hydration-performance-closure.js +234 -0
  61. package/catalog/epic13-known-residual-triage.d.ts +32 -0
  62. package/catalog/epic13-known-residual-triage.js +339 -0
  63. package/catalog/epic13-package-export-lock.d.ts +41 -0
  64. package/catalog/epic13-package-export-lock.js +604 -0
  65. package/catalog/epic13-prod-browser-csp-smoke.d.ts +35 -0
  66. package/catalog/epic13-prod-browser-csp-smoke.js +218 -0
  67. package/catalog/epic13-rc1-gate-matrix-ci-handoff.d.ts +36 -0
  68. package/catalog/epic13-rc1-gate-matrix-ci-handoff.js +418 -0
  69. package/catalog/epic13-rc1-migration-notes.d.ts +36 -0
  70. package/catalog/epic13-rc1-migration-notes.js +271 -0
  71. package/catalog/epic13-rc1-readiness.d.ts +33 -0
  72. package/catalog/epic13-rc1-readiness.js +487 -0
  73. package/catalog/epic13-release-owner-acceptance.d.ts +33 -0
  74. package/catalog/epic13-release-owner-acceptance.js +354 -0
  75. package/catalog/epic13-release-report-pack-dry-run-evidence.d.ts +36 -0
  76. package/catalog/epic13-release-report-pack-dry-run-evidence.js +253 -0
  77. package/catalog/epic13-rmt-production-readiness.d.ts +35 -0
  78. package/catalog/epic13-rmt-production-readiness.js +314 -0
  79. package/catalog/epic13-trusted-dom-boundary.d.ts +36 -0
  80. package/catalog/epic13-trusted-dom-boundary.js +230 -0
  81. package/catalog/epic13-visual-owner-artifact.d.ts +35 -0
  82. package/catalog/epic13-visual-owner-artifact.js +233 -0
  83. package/catalog/epic14-lsp-handoff.d.ts +28 -0
  84. package/catalog/epic14-lsp-handoff.js +312 -0
  85. package/catalog/epic14-rmt-tooling.d.ts +33 -0
  86. package/catalog/epic14-rmt-tooling.js +282 -0
  87. package/catalog/surface-manager-adapter-runtime.d.ts +37 -0
  88. package/catalog/surface-manager-adapter-runtime.js +203 -0
  89. package/catalog/surface-manager-browser-lab.d.ts +39 -0
  90. package/catalog/surface-manager-browser-lab.js +225 -0
  91. package/catalog/surface-manager-controller.d.ts +43 -0
  92. package/catalog/surface-manager-controller.js +290 -0
  93. package/catalog/surface-manager-layout-engines.d.ts +32 -0
  94. package/catalog/surface-manager-layout-engines.js +161 -0
  95. package/catalog/surface-manager-lazy-loading.d.ts +35 -0
  96. package/catalog/surface-manager-lazy-loading.js +173 -0
  97. package/catalog/surface-manager-materialization.d.ts +37 -0
  98. package/catalog/surface-manager-materialization.js +202 -0
  99. package/catalog/surface-manager-native-rmt-surfaces.d.ts +48 -0
  100. package/catalog/surface-manager-native-rmt-surfaces.js +325 -0
  101. package/catalog/surface-manager-overlay-bridge.d.ts +42 -0
  102. package/catalog/surface-manager-overlay-bridge.js +247 -0
  103. package/catalog/surface-manager-persistence.d.ts +37 -0
  104. package/catalog/surface-manager-persistence.js +178 -0
  105. package/catalog/surface-manager-quality-gates.d.ts +48 -0
  106. package/catalog/surface-manager-quality-gates.js +324 -0
  107. package/catalog/surface-manager-release-handoff.d.ts +47 -0
  108. package/catalog/surface-manager-release-handoff.js +274 -0
  109. package/catalog/surface-manager-remote-policy.d.ts +34 -0
  110. package/catalog/surface-manager-remote-policy.js +199 -0
  111. package/catalog/surface-manager-rmt-authoring.d.ts +44 -0
  112. package/catalog/surface-manager-rmt-authoring.js +368 -0
  113. package/catalog/surface-manager-route-lifecycle.d.ts +32 -0
  114. package/catalog/surface-manager-route-lifecycle.js +162 -0
  115. package/catalog/surface-manager-runtime-release-handoff.d.ts +36 -0
  116. package/catalog/surface-manager-runtime-release-handoff.js +245 -0
  117. package/catalog/surface-manager-side-panel-runtime.d.ts +46 -0
  118. package/catalog/surface-manager-side-panel-runtime.js +307 -0
  119. package/catalog/surface-manager-stack-policy.d.ts +32 -0
  120. package/catalog/surface-manager-stack-policy.js +169 -0
  121. package/catalog/surface-manager-window-runtime.d.ts +45 -0
  122. package/catalog/surface-manager-window-runtime.js +285 -0
  123. package/catalog/surface-manager-workbench-fixture.d.ts +50 -0
  124. package/catalog/surface-manager-workbench-fixture.js +315 -0
  125. package/catalog/type-exports-api.js +236 -0
  126. package/catalog/type-exports-builder.js +405 -0
  127. package/catalog/type-exports-catalog.js +394 -0
  128. package/catalog/type-exports-loader.js +266 -0
  129. package/catalog/type-exports-policy.js +461 -0
  130. package/catalog/type-exports-rmt.js +407 -0
  131. package/catalog/type-exports-vendor.js +365 -0
  132. package/catalog/type-exports.js +574 -0
  133. package/components/icon-packs/core.js +154 -0
  134. package/components/icon-packs/lucide.js +136 -0
  135. package/components/manifest.json +44 -0
  136. package/components/prism.d.ts +73 -0
  137. package/components/prism.js +300 -0
  138. package/components/turndown.d.ts +34 -0
  139. package/components/turndown.js +107 -0
  140. package/components/x-rmt-lifecycle-demo-build.d.ts +78 -0
  141. package/components/x-rmt-lifecycle-demo-build.js +1175 -0
  142. package/components/x-rmt-lifecycle-demo.d.ts +83 -0
  143. package/components/x-rmt-lifecycle-demo.js +1175 -0
  144. package/components/xalert.d.ts +42 -0
  145. package/components/xalert.js +538 -0
  146. package/components/xbutton.d.ts +127 -0
  147. package/components/xbutton.js +612 -0
  148. package/components/xcalendar.d.ts +39 -0
  149. package/components/xcalendar.js +338 -0
  150. package/components/xcards.d.ts +34 -0
  151. package/components/xcards.js +253 -0
  152. package/components/xcheckbox.d.ts +48 -0
  153. package/components/xcheckbox.js +448 -0
  154. package/components/xcode.d.ts +35 -0
  155. package/components/xcode.js +370 -0
  156. package/components/xdialog.d.ts +48 -0
  157. package/components/xdialog.js +763 -0
  158. package/components/xdrawer.d.ts +61 -0
  159. package/components/xdrawer.js +654 -0
  160. package/components/xfooter.d.ts +41 -0
  161. package/components/xfooter.js +351 -0
  162. package/components/xform.d.ts +43 -0
  163. package/components/xform.js +456 -0
  164. package/components/xheader.d.ts +68 -0
  165. package/components/xheader.js +1253 -0
  166. package/components/xhero.d.ts +42 -0
  167. package/components/xhero.js +475 -0
  168. package/components/xicon.d.ts +146 -0
  169. package/components/xicon.js +688 -0
  170. package/components/xinput.d.ts +37 -0
  171. package/components/xinput.js +444 -0
  172. package/components/xlightbox.d.ts +48 -0
  173. package/components/xlightbox.js +571 -0
  174. package/components/xlink.d.ts +63 -0
  175. package/components/xlink.js +565 -0
  176. package/components/xmasonry.d.ts +35 -0
  177. package/components/xmasonry.js +666 -0
  178. package/components/xmenu.d.ts +118 -0
  179. package/components/xmenu.js +1005 -0
  180. package/components/xmodal.d.ts +64 -0
  181. package/components/xmodal.js +831 -0
  182. package/components/xplayer.d.ts +57 -0
  183. package/components/xplayer.js +1748 -0
  184. package/components/xpopover.d.ts +54 -0
  185. package/components/xpopover.js +466 -0
  186. package/components/xprogress.d.ts +40 -0
  187. package/components/xprogress.js +345 -0
  188. package/components/xradio.d.ts +50 -0
  189. package/components/xradio.js +474 -0
  190. package/components/xrouter.d.ts +244 -0
  191. package/components/xrouter.js +1841 -0
  192. package/components/xsection.d.ts +34 -0
  193. package/components/xsection.js +253 -0
  194. package/components/xselect.d.ts +46 -0
  195. package/components/xselect.js +463 -0
  196. package/components/xsidepanel.d.ts +56 -0
  197. package/components/xsidepanel.js +728 -0
  198. package/components/xspinner.d.ts +38 -0
  199. package/components/xspinner.js +388 -0
  200. package/components/xstate.d.ts +137 -0
  201. package/components/xstate.js +493 -0
  202. package/components/xstatus.d.ts +41 -0
  203. package/components/xstatus.js +381 -0
  204. package/components/xsummary.d.ts +43 -0
  205. package/components/xsummary.js +293 -0
  206. package/components/xsurfacemanager-controller.d.ts +130 -0
  207. package/components/xsurfacemanager-controller.js +699 -0
  208. package/components/xsurfacemanager.d.ts +452 -0
  209. package/components/xsurfacemanager.js +3775 -0
  210. package/components/xsurfaceoverlay-bridge.d.ts +43 -0
  211. package/components/xsurfaceoverlay-bridge.js +238 -0
  212. package/components/xsurfacewindow.d.ts +50 -0
  213. package/components/xsurfacewindow.js +576 -0
  214. package/components/xtabs.d.ts +73 -0
  215. package/components/xtabs.js +611 -0
  216. package/components/xtend-public-types.d.ts +208 -0
  217. package/components/xtextarea.d.ts +46 -0
  218. package/components/xtextarea.js +451 -0
  219. package/components/xtheme.d.ts +253 -0
  220. package/components/xtheme.js +1438 -0
  221. package/components/xtoast.d.ts +39 -0
  222. package/components/xtoast.js +389 -0
  223. package/components/xtooltip.d.ts +53 -0
  224. package/components/xtooltip.js +432 -0
  225. package/components/xtype.d.ts +42 -0
  226. package/components/xtype.js +244 -0
  227. package/components/xutils.d.ts +164 -0
  228. package/components/xutils.js +496 -0
  229. package/components/xwriter.d.ts +67 -0
  230. package/components/xwriter.js +854 -0
  231. package/design-tokens/themes/enterprise-light.json +40 -0
  232. package/design-tokens/themes/xtend-signature.json +126 -0
  233. package/design-tokens/xtend-design-tokens.d.ts +95 -0
  234. package/design-tokens/xtend-design-tokens.js +395 -0
  235. package/design-tokens/xtheme-token-alias-layer.d.ts +84 -0
  236. package/design-tokens/xtheme-token-alias-layer.js +423 -0
  237. package/docs/.htaccess +51 -0
  238. package/docs/README.md +340 -0
  239. package/docs/XTend-ADR.md +221 -0
  240. package/docs/a11y-keyboard-smokes.md +62 -0
  241. package/docs/about.md +18 -0
  242. package/docs/api.md +157 -0
  243. package/docs/best-practices.md +76 -0
  244. package/docs/component-catalog-coverage.md +58 -0
  245. package/docs/component-lab.md +103 -0
  246. package/docs/component-long-tail-migration.md +41 -0
  247. package/docs/component-platform.md +159 -0
  248. package/docs/component-ux-app-authoring.md +130 -0
  249. package/docs/component-ux-authoring.md +96 -0
  250. package/docs/component-ux-gates.md +45 -0
  251. package/docs/components/x-rmt-lifecycle-demo-build.md +60 -0
  252. package/docs/components/xalert.md +81 -0
  253. package/docs/components/xbutton.md +103 -0
  254. package/docs/components/xcalendar.md +82 -0
  255. package/docs/components/xcards.md +128 -0
  256. package/docs/components/xcheckbox.md +102 -0
  257. package/docs/components/xcode.md +126 -0
  258. package/docs/components/xdialog.md +92 -0
  259. package/docs/components/xdrawer.md +84 -0
  260. package/docs/components/xfooter.md +126 -0
  261. package/docs/components/xform.md +128 -0
  262. package/docs/components/xheader.md +308 -0
  263. package/docs/components/xhero.md +142 -0
  264. package/docs/components/xicon.md +125 -0
  265. package/docs/components/xinput.md +129 -0
  266. package/docs/components/xlightbox.md +98 -0
  267. package/docs/components/xlink.md +109 -0
  268. package/docs/components/xmasonry.md +124 -0
  269. package/docs/components/xmenu.md +158 -0
  270. package/docs/components/xmodal.md +82 -0
  271. package/docs/components/xplayer.md +104 -0
  272. package/docs/components/xpopover.md +67 -0
  273. package/docs/components/xprogress.md +56 -0
  274. package/docs/components/xradio.md +103 -0
  275. package/docs/components/xrouter.md +260 -0
  276. package/docs/components/xsection.md +125 -0
  277. package/docs/components/xselect.md +105 -0
  278. package/docs/components/xsidepanel.md +30 -0
  279. package/docs/components/xspinner.md +102 -0
  280. package/docs/components/xstate.md +148 -0
  281. package/docs/components/xstatus.md +55 -0
  282. package/docs/components/xsummary.md +78 -0
  283. package/docs/components/xsurfacemanager.md +27 -0
  284. package/docs/components/xsurfacewindow.md +21 -0
  285. package/docs/components/xtabs.md +160 -0
  286. package/docs/components/xtextarea.md +98 -0
  287. package/docs/components/xtheme.md +167 -0
  288. package/docs/components/xtoast.md +62 -0
  289. package/docs/components/xtooltip.md +66 -0
  290. package/docs/components/xtype.md +82 -0
  291. package/docs/components/xutils.md +144 -0
  292. package/docs/components/xwriter.md +94 -0
  293. package/docs/components.md +117 -0
  294. package/docs/conditional-network-evidence-ci.md +38 -0
  295. package/docs/conditional-network-evidence.md +50 -0
  296. package/docs/core-migration-guide.md +110 -0
  297. package/docs/design-tokens.md +116 -0
  298. package/docs/docs-rmt-production-hardening.md +31 -0
  299. package/docs/enterprise-adoption.md +411 -0
  300. package/docs/enterprise-component-flex-release-handoff.md +129 -0
  301. package/docs/epic10-platform-gates.md +62 -0
  302. package/docs/epic10-release-handoff.md +81 -0
  303. package/docs/epic11-enterprise-ux-handoff.md +70 -0
  304. package/docs/epic12-rc0-handoff.md +61 -0
  305. package/docs/existing-component-metadata.md +67 -0
  306. package/docs/hydration-performance-closure.md +34 -0
  307. package/docs/hydration-policies.md +71 -0
  308. package/docs/index.php +1625 -0
  309. package/docs/known-residual-triage.md +22 -0
  310. package/docs/manifest-import-policy.md +79 -0
  311. package/docs/manifest.md +106 -0
  312. package/docs/menu.json +1190 -0
  313. package/docs/motion-contrast.md +67 -0
  314. package/docs/package-export-lock.md +44 -0
  315. package/docs/performance-measurements.md +106 -0
  316. package/docs/performance-regression.md +89 -0
  317. package/docs/performance.md +94 -0
  318. package/docs/previews/README.md +17 -0
  319. package/docs/prod-browser-csp-smokes.md +40 -0
  320. package/docs/public-component-types.md +79 -0
  321. package/docs/quick-start-guide.md +152 -0
  322. package/docs/rc0-adoption-guide.md +102 -0
  323. package/docs/rc0-gate-matrix.md +58 -0
  324. package/docs/rc1-gate-matrix-ci-handoff.md +56 -0
  325. package/docs/rc1-migration-notes.md +69 -0
  326. package/docs/rc1-readiness.md +46 -0
  327. package/docs/release-owner-acceptance.md +56 -0
  328. package/docs/release-report-pack-dry-run-evidence.md +39 -0
  329. package/docs/rmt-dsl-authoring-polish.md +122 -0
  330. package/docs/rmt-first-demo-app.md +77 -0
  331. package/docs/rmt-first-xtend-apps.md +105 -0
  332. package/docs/rmt-kernel-panic-recovery-incident-handoff.md +61 -0
  333. package/docs/rmt-kernel-security-hardening-migration.md +50 -0
  334. package/docs/rmt-kernel-trusted-output-authoring.md +69 -0
  335. package/docs/rmt-language-server.md +177 -0
  336. package/docs/rmt-lifecycle-demo.md +25 -0
  337. package/docs/rmt-linter.md +140 -0
  338. package/docs/rmt-production-readiness.md +63 -0
  339. package/docs/rmt-tooling-release-gates.md +77 -0
  340. package/docs/rmt-vnext-authoring.md +60 -0
  341. package/docs/rmt-vnext-cross-surface-events.md +68 -0
  342. package/docs/rmt-vnext-enterprise-mfe-handoff.md +70 -0
  343. package/docs/rmt-vnext-migration-notes.md +62 -0
  344. package/docs/rmt-vnext-release-handoff.md +69 -0
  345. package/docs/rmt-vnext-remote-surfaces.md +90 -0
  346. package/docs/rmt-vnext-surface-registry-enterprise.md +76 -0
  347. package/docs/screenreader-signals.md +56 -0
  348. package/docs/supply-chain-gates.md +100 -0
  349. package/docs/surface-manager-authoring-guide.md +94 -0
  350. package/docs/surface-manager-browser-lab.md +45 -0
  351. package/docs/surface-manager-component-lab.md +43 -0
  352. package/docs/surface-manager-controller.md +66 -0
  353. package/docs/surface-manager-layout-engines.md +32 -0
  354. package/docs/surface-manager-lazy-hydration.md +63 -0
  355. package/docs/surface-manager-migration-guide.md +94 -0
  356. package/docs/surface-manager-native-rmt-surfaces.md +38 -0
  357. package/docs/surface-manager-overlay-bridge.md +53 -0
  358. package/docs/surface-manager-persistence.md +30 -0
  359. package/docs/surface-manager-quality-gates.md +51 -0
  360. package/docs/surface-manager-release-handoff.md +68 -0
  361. package/docs/surface-manager-remote-policy.md +54 -0
  362. package/docs/surface-manager-rmt-authoring.md +86 -0
  363. package/docs/surface-manager-route-lifecycle.md +59 -0
  364. package/docs/surface-manager-runtime-release-handoff.md +69 -0
  365. package/docs/surface-manager-side-panel-runtime.md +36 -0
  366. package/docs/surface-manager-stack-policy.md +39 -0
  367. package/docs/surface-manager-window-runtime.md +47 -0
  368. package/docs/surface-manager-workbench-fixture.md +43 -0
  369. package/docs/third-party-design-authoring.md +406 -0
  370. package/docs/trusted-dom-boundary-browser-proof.md +32 -0
  371. package/docs/trusted-dom-sanitizing.md +110 -0
  372. package/docs/type-exports.md +61 -0
  373. package/docs/typescript-components.md +63 -0
  374. package/docs/utils/fabric-runtime.js +650 -0
  375. package/docs/utils/pageloader.js +2823 -0
  376. package/docs/utils/parsedown.php +298 -0
  377. package/docs/visual-browser-regression.md +83 -0
  378. package/docs/visual-owner-artifacts.md +46 -0
  379. package/docs/visual-snapshot-automation.md +87 -0
  380. package/docs/xtend-api-types.md +55 -0
  381. package/docs/xtend-builder-types.md +55 -0
  382. package/docs/xtend-catalog-types.md +44 -0
  383. package/docs/xtend-fabric-rmt-lane-mapping.md +143 -0
  384. package/docs/xtend-fabric.md +474 -0
  385. package/docs/xtend-loader-types.md +58 -0
  386. package/docs/xtend-loader.md +265 -0
  387. package/docs/xtend-policy-types.md +38 -0
  388. package/docs/xtend-rmt-types.md +39 -0
  389. package/docs/xtend-vendor-types.md +36 -0
  390. package/docs/xtendrmt-app-dsl.md +269 -0
  391. package/docs/xtendrmt-migration-guide.md +235 -0
  392. package/docs/xtendrmt-native-authoring.md +337 -0
  393. package/docs/xtendrmt-overview.md +89 -0
  394. package/docs/xtendrmt-parsedown-docs.rmt +956 -0
  395. package/docs/xtendrmt-parsedown-scheduling.md +301 -0
  396. package/docs/xtendrmt-runtime-bridge.md +155 -0
  397. package/fabric/hydration-policy.d.ts +27 -0
  398. package/fabric/hydration-policy.js +306 -0
  399. package/fabric/package.json +58 -0
  400. package/fabric/rmt-lane-mapping.d.ts +47 -0
  401. package/fabric/rmt-lane-mapping.js +504 -0
  402. package/fabric/xtend-fabric.d.ts +81 -0
  403. package/fabric/xtend-fabric.js +2669 -0
  404. package/fabric/xtend-policy-public-types.d.ts +135 -0
  405. package/package.json +8225 -0
  406. package/security/README.md +54 -0
  407. package/security/manifest-import-policy.d.ts +43 -0
  408. package/security/manifest-import-policy.js +260 -0
  409. package/security/supply-chain-gate-policy.d.ts +45 -0
  410. package/security/supply-chain-gate-policy.js +249 -0
  411. package/security/trusted-dom-policy.d.ts +36 -0
  412. package/security/trusted-dom-policy.js +316 -0
  413. package/tools/package.json +77 -0
  414. package/tools/rmt-editor/vscode/README.md +33 -0
  415. package/tools/rmt-editor/vscode/extension.d.ts +9 -0
  416. package/tools/rmt-editor/vscode/extension.js +55 -0
  417. package/tools/rmt-editor/vscode/language-configuration.json +28 -0
  418. package/tools/rmt-editor/vscode/package.json +83 -0
  419. package/tools/rmt-editor/vscode/snippets/rmt.code-snippets +243 -0
  420. package/tools/rmt-editor/vscode/syntaxes/rmt.tmLanguage.json +13 -0
  421. package/tools/rmt-editor/vscode/xtend-rmt-language-0.0.0-enterprise-readiness.vsix +0 -0
  422. package/tools/rmt-language/code-actions.d.ts +15 -0
  423. package/tools/rmt-language/code-actions.js +566 -0
  424. package/tools/rmt-language/completions.d.ts +22 -0
  425. package/tools/rmt-language/completions.js +475 -0
  426. package/tools/rmt-language/definitions.d.ts +13 -0
  427. package/tools/rmt-language/definitions.js +212 -0
  428. package/tools/rmt-language/diagnostics.d.ts +23 -0
  429. package/tools/rmt-language/diagnostics.js +486 -0
  430. package/tools/rmt-language/format-adapter.d.ts +16 -0
  431. package/tools/rmt-language/format-adapter.js +270 -0
  432. package/tools/rmt-language/hover.d.ts +12 -0
  433. package/tools/rmt-language/hover.js +326 -0
  434. package/tools/rmt-language/kernel-escalation.d.ts +122 -0
  435. package/tools/rmt-language/kernel-escalation.js +427 -0
  436. package/tools/rmt-language/kernel-panic-monitor.d.ts +176 -0
  437. package/tools/rmt-language/kernel-panic-monitor.js +674 -0
  438. package/tools/rmt-language/kernel-policy-parity.d.ts +142 -0
  439. package/tools/rmt-language/kernel-policy-parity.js +629 -0
  440. package/tools/rmt-language/kernel-recovery.d.ts +173 -0
  441. package/tools/rmt-language/kernel-recovery.js +666 -0
  442. package/tools/rmt-language/kernel-scheduler-failure.d.ts +136 -0
  443. package/tools/rmt-language/kernel-scheduler-failure.js +486 -0
  444. package/tools/rmt-language/kernel-security-regression.d.ts +154 -0
  445. package/tools/rmt-language/kernel-security-regression.js +465 -0
  446. package/tools/rmt-language/kernel-trust-authority.d.ts +120 -0
  447. package/tools/rmt-language/kernel-trust-authority.js +549 -0
  448. package/tools/rmt-language/parser.d.ts +14 -0
  449. package/tools/rmt-language/parser.js +111 -0
  450. package/tools/rmt-language/rmt-tooling-public-types.d.ts +179 -0
  451. package/tools/rmt-language/rules/boundary-policy.js +81 -0
  452. package/tools/rmt-language/rules/document-policy.js +65 -0
  453. package/tools/rmt-language/rules/index.js +29 -0
  454. package/tools/rmt-language/rules/route-policy.js +81 -0
  455. package/tools/rmt-language/rules/scheduler-policy.js +66 -0
  456. package/tools/rmt-language/rules/template-policy.js +130 -0
  457. package/tools/rmt-language/semantic-graph.d.ts +18 -0
  458. package/tools/rmt-language/semantic-graph.js +827 -0
  459. package/tools/rmt-language/snippets/README.md +17 -0
  460. package/tools/rmt-language/snippets/index.d.ts +17 -0
  461. package/tools/rmt-language/snippets/index.js +417 -0
  462. package/tools/rmt-language/snippets/rmt.code-snippets +243 -0
  463. package/tools/rmt-language/source-model.d.ts +14 -0
  464. package/tools/rmt-language/source-model.js +731 -0
  465. package/tools/rmt-language/symbols.d.ts +13 -0
  466. package/tools/rmt-language/symbols.js +183 -0
  467. package/tools/rmt-language/vnext-compatibility.d.ts +28 -0
  468. package/tools/rmt-language/vnext-compatibility.js +675 -0
  469. package/tools/rmt-language/vnext-compiler.d.ts +17 -0
  470. package/tools/rmt-language/vnext-compiler.js +716 -0
  471. package/tools/rmt-language/vnext-composition.d.ts +30 -0
  472. package/tools/rmt-language/vnext-composition.js +595 -0
  473. package/tools/rmt-language/vnext-conditions.d.ts +25 -0
  474. package/tools/rmt-language/vnext-conditions.js +474 -0
  475. package/tools/rmt-language/vnext-cross-surface-events.d.ts +30 -0
  476. package/tools/rmt-language/vnext-cross-surface-events.js +607 -0
  477. package/tools/rmt-language/vnext-degradation.d.ts +23 -0
  478. package/tools/rmt-language/vnext-degradation.js +428 -0
  479. package/tools/rmt-language/vnext-enterprise-fixtures.d.ts +28 -0
  480. package/tools/rmt-language/vnext-enterprise-fixtures.js +487 -0
  481. package/tools/rmt-language/vnext-enterprise-registry.d.ts +21 -0
  482. package/tools/rmt-language/vnext-enterprise-registry.js +495 -0
  483. package/tools/rmt-language/vnext-enterprise-release.d.ts +44 -0
  484. package/tools/rmt-language/vnext-enterprise-release.js +472 -0
  485. package/tools/rmt-language/vnext-event-governance.d.ts +29 -0
  486. package/tools/rmt-language/vnext-event-governance.js +488 -0
  487. package/tools/rmt-language/vnext-events.d.ts +44 -0
  488. package/tools/rmt-language/vnext-events.js +680 -0
  489. package/tools/rmt-language/vnext-import-resolver.d.ts +28 -0
  490. package/tools/rmt-language/vnext-import-resolver.js +642 -0
  491. package/tools/rmt-language/vnext-lifecycle.d.ts +22 -0
  492. package/tools/rmt-language/vnext-lifecycle.js +404 -0
  493. package/tools/rmt-language/vnext-parser.d.ts +21 -0
  494. package/tools/rmt-language/vnext-parser.js +1391 -0
  495. package/tools/rmt-language/vnext-regression.d.ts +25 -0
  496. package/tools/rmt-language/vnext-regression.js +394 -0
  497. package/tools/rmt-language/vnext-release.d.ts +29 -0
  498. package/tools/rmt-language/vnext-release.js +293 -0
  499. package/tools/rmt-language/vnext-remote-compatibility.d.ts +33 -0
  500. package/tools/rmt-language/vnext-remote-compatibility.js +892 -0
  501. package/tools/rmt-language/vnext-remote-compiler.d.ts +14 -0
  502. package/tools/rmt-language/vnext-remote-compiler.js +520 -0
  503. package/tools/rmt-language/vnext-remote-manifest.d.ts +33 -0
  504. package/tools/rmt-language/vnext-remote-manifest.js +538 -0
  505. package/tools/rmt-language/vnext-remote-security.d.ts +27 -0
  506. package/tools/rmt-language/vnext-remote-security.js +380 -0
  507. package/tools/rmt-language/vnext-remote-tooling.d.ts +25 -0
  508. package/tools/rmt-language/vnext-remote-tooling.js +805 -0
  509. package/tools/rmt-language/vnext-scheduler.d.ts +24 -0
  510. package/tools/rmt-language/vnext-scheduler.js +469 -0
  511. package/tools/rmt-language/vnext-security.d.ts +28 -0
  512. package/tools/rmt-language/vnext-security.js +597 -0
  513. package/tools/rmt-language/vnext-streaming.d.ts +28 -0
  514. package/tools/rmt-language/vnext-streaming.js +593 -0
  515. package/tools/rmt-language/vnext-surfaces.d.ts +24 -0
  516. package/tools/rmt-language/vnext-surfaces.js +406 -0
  517. package/tools/rmt-language/vnext-tooling.d.ts +25 -0
  518. package/tools/rmt-language/vnext-tooling.js +728 -0
  519. package/tools/rmt-language-server/protocol.d.ts +22 -0
  520. package/tools/rmt-language-server/protocol.js +352 -0
  521. package/tools/rmt-language-server/server.d.ts +15 -0
  522. package/tools/rmt-language-server/server.js +622 -0
  523. package/tools/rmt-linter/cli.d.ts +14 -0
  524. package/tools/rmt-linter/cli.js +450 -0
  525. package/tools/rmt-linter/reporter.d.ts +16 -0
  526. package/tools/rmt-linter/reporter.js +472 -0
  527. package/xtend-builder/README.md +83 -0
  528. package/xtend-builder/a11y/README.md +42 -0
  529. package/xtend-builder/a11y/component-a11y-profile.d.ts +14 -0
  530. package/xtend-builder/a11y/component-a11y-profile.js +314 -0
  531. package/xtend-builder/blueprints/README.md +105 -0
  532. package/xtend-builder/blueprints/component-blueprint.contract.d.ts +16 -0
  533. package/xtend-builder/blueprints/component-blueprint.contract.js +343 -0
  534. package/xtend-builder/builder-public-types.d.ts +234 -0
  535. package/xtend-builder/extensions/README.md +26 -0
  536. package/xtend-builder/extensions/component-extension-points.d.ts +11 -0
  537. package/xtend-builder/extensions/component-extension-points.js +277 -0
  538. package/xtend-builder/generators/README.md +149 -0
  539. package/xtend-builder/generators/component-files.d.ts +5 -0
  540. package/xtend-builder/generators/component-files.js +769 -0
  541. package/xtend-builder/generators/component-plan.d.ts +4 -0
  542. package/xtend-builder/generators/component-plan.js +104 -0
  543. package/xtend-builder/generators/registry.d.ts +6 -0
  544. package/xtend-builder/generators/registry.js +118 -0
  545. package/xtend-builder/generators/rmt-build.js +738 -0
  546. package/xtend-builder/generators/rmt-lifecycle-demo.js +922 -0
  547. package/xtend-builder/lib/cli.d.ts +9 -0
  548. package/xtend-builder/lib/cli.js +543 -0
  549. package/xtend-builder/lib/layout.d.ts +6 -0
  550. package/xtend-builder/lib/layout.js +153 -0
  551. package/xtend-builder/lib/package-resolver.js +25 -0
  552. package/xtend-builder/package.json +90 -0
  553. package/xtend-builder/performance/README.md +31 -0
  554. package/xtend-builder/performance/component-performance-profile.d.ts +11 -0
  555. package/xtend-builder/performance/component-performance-profile.js +347 -0
  556. package/xtend-builder/performance/component-ux-performance-contract.d.ts +27 -0
  557. package/xtend-builder/performance/component-ux-performance-contract.js +424 -0
  558. package/xtend-builder/preview/README.md +61 -0
  559. package/xtend-builder/preview/component-lab-ux-inspector.d.ts +20 -0
  560. package/xtend-builder/preview/component-lab-ux-inspector.js +448 -0
  561. package/xtend-builder/preview/component-lab.d.ts +14 -0
  562. package/xtend-builder/preview/component-lab.js +278 -0
  563. package/xtend-builder/preview/component-preview.d.ts +5 -0
  564. package/xtend-builder/preview/component-preview.js +160 -0
  565. package/xtend-builder/scaffold.config.d.ts +4 -0
  566. package/xtend-builder/scaffold.config.js +2056 -0
  567. package/xtend-builder/scaffold.d.ts +3 -0
  568. package/xtend-builder/scaffold.js +11 -0
  569. package/xtend-builder/templates/README.md +33 -0
  570. package/xtend-builder/templates/component/a11y.template.ts +11 -0
  571. package/xtend-builder/templates/component/component-suite.template.d.ts +2 -0
  572. package/xtend-builder/templates/component/component-suite.template.js +108 -0
  573. package/xtend-builder/templates/component/contract.template.ts +10 -0
  574. package/xtend-builder/templates/component/demo-plan.template.md +73 -0
  575. package/xtend-builder/templates/component/docs.template.md +301 -0
  576. package/xtend-builder/templates/component/fixture-data.template.ts +28 -0
  577. package/xtend-builder/templates/component/fixture.template.html +37 -0
  578. package/xtend-builder/templates/component/manifest-plan.template.json +22 -0
  579. package/xtend-builder/templates/component/performance.template.ts +13 -0
  580. package/xtend-builder/templates/component/rmt.template.ts +12 -0
  581. package/xtend-builder/templates/component/source.template.d.ts +2 -0
  582. package/xtend-builder/templates/component/source.template.js +137 -0
  583. package/xtend-builder/templates/component/source.template.ts +110 -0
  584. package/xtend-builder/templates/component/types.template.d.ts +423 -0
  585. package/xtend-builder/templates/loader.d.ts +4 -0
  586. package/xtend-builder/templates/loader.js +51 -0
  587. package/xtend-builder/templates/registry.d.ts +6 -0
  588. package/xtend-builder/templates/registry.js +119 -0
  589. package/xtend-builder/typing/README.md +130 -0
  590. package/xtend-builder/typing/component-contract-v2.d.ts +15 -0
  591. package/xtend-builder/typing/component-contract-v2.js +248 -0
  592. package/xtend-builder/typing/component-network-contract.d.ts +22 -0
  593. package/xtend-builder/typing/component-network-contract.js +478 -0
  594. package/xtend-builder/typing/component-shell-contract.d.ts +21 -0
  595. package/xtend-builder/typing/component-shell-contract.js +312 -0
  596. package/xtend-builder/typing/component-styling-contract.d.ts +22 -0
  597. package/xtend-builder/typing/component-styling-contract.js +301 -0
  598. package/xtend-builder/typing/component-types.d.ts +10 -0
  599. package/xtend-builder/typing/component-types.js +551 -0
  600. package/xtend-builder/typing/enterprise-component-flex-hardening-contract.d.ts +20 -0
  601. package/xtend-builder/typing/enterprise-component-flex-hardening-contract.js +332 -0
  602. package/xtend-builder/typing/feedback-status-ux-contract.d.ts +25 -0
  603. package/xtend-builder/typing/feedback-status-ux-contract.js +347 -0
  604. package/xtend-builder/typing/form-controls-ux-contract.d.ts +25 -0
  605. package/xtend-builder/typing/form-controls-ux-contract.js +357 -0
  606. package/xtend-builder/typing/layout-display-media-ux-contract.d.ts +25 -0
  607. package/xtend-builder/typing/layout-display-media-ux-contract.js +420 -0
  608. package/xtend-builder/typing/navigation-routing-ux-contract.d.ts +17 -0
  609. package/xtend-builder/typing/navigation-routing-ux-contract.js +297 -0
  610. package/xtend-builder/typing/overlay-interaction-ux-contract.d.ts +25 -0
  611. package/xtend-builder/typing/overlay-interaction-ux-contract.js +383 -0
  612. package/xtend-builder/typing/rmt-dsl-authoring-polish.d.ts +27 -0
  613. package/xtend-builder/typing/rmt-dsl-authoring-polish.js +419 -0
  614. package/xtend-builder/typing/rmt-shell-authoring-contract.d.ts +26 -0
  615. package/xtend-builder/typing/rmt-shell-authoring-contract.js +315 -0
  616. package/xtend-builder/utils/README.md +8 -0
  617. package/xtend-builder/utils/naming.d.ts +7 -0
  618. package/xtend-builder/utils/naming.js +36 -0
  619. package/xtend-builder/utils/validation.d.ts +5 -0
  620. package/xtend-builder/utils/validation.js +95 -0
  621. package/xtend-builder/wiring/README.md +46 -0
  622. package/xtend-builder/wiring/features.d.ts +5 -0
  623. package/xtend-builder/wiring/features.js +165 -0
  624. package/xtend-builder/wiring/hydration.d.ts +4 -0
  625. package/xtend-builder/wiring/hydration.js +44 -0
  626. package/xtend-builder/wiring/manifest.d.ts +5 -0
  627. package/xtend-builder/wiring/manifest.js +48 -0
  628. package/xtend-builder/workflows/README.md +47 -0
  629. package/xtend-builder/workflows/developer-workflow.d.ts +6 -0
  630. package/xtend-builder/workflows/developer-workflow.js +125 -0
  631. package/xtend-builder/writing/manifest-patcher.d.ts +49 -0
  632. package/xtend-builder/writing/manifest-patcher.js +391 -0
  633. package/xtend-builder/writing/write-plan.d.ts +148 -0
  634. package/xtend-builder/writing/write-plan.js +646 -0
  635. package/xtend-dev.d.ts +23 -0
  636. package/xtend-dev.js +4 -0
  637. package/xtend-loader.d.ts +201 -0
  638. package/xtend-loader.js +1704 -0
  639. package/xtend.css +402 -0
  640. package/xtendrmt/package.json +64 -0
  641. package/xtendrmt/rmt-core.d.ts +4452 -0
  642. package/xtendrmt/rmt-core.esm.js +25793 -0
  643. package/xtendrmt/rmt-first-demo-app.js +265 -0
  644. package/xtendrmt/rmt-first-demo-app.rmt +737 -0
  645. package/xtendrmt/rmt-lifecycle-demo.app.js +493 -0
  646. package/xtendrmt/rmt-lifecycle-demo.core.json +810 -0
  647. package/xtendrmt/rmt-lifecycle-demo.rmt +35 -0
  648. package/xtendrmt/rmt-lifecycle-demo.rmt-build.app.js +153 -0
  649. package/xtendrmt/rmt-lifecycle-demo.rmt-build.core.json +810 -0
  650. package/xtendrmt/rmt-lifecycle-demo.rmt-build.scaffold.json +202 -0
  651. package/xtendrmt/rmt-lifecycle-demo.scaffold.json +187 -0
  652. package/xtendrmt/rmt-manifest.json +548 -0
  653. package/xtendrmt/rmt-runtime.browser.js +26183 -0
  654. package/xtendrmt/rmt-runtime.esm.js +26214 -0
  655. package/xtendrmt/rmt-vnext-enterprise-mfe-demo.core.json +849 -0
  656. package/xtendrmt/rmt-vnext-enterprise-mfe-demo.rmt +50 -0
  657. package/xtendrmt/rmt-vnext-reference-demo.core.json +1069 -0
  658. package/xtendrmt/rmt-vnext-reference-demo.rmt +50 -0
  659. package/xtendrmt/rmt.schema.json +3145 -0
  660. package/xtendrmt/surface-workbench.js +316 -0
  661. package/xtendrmt/surface-workbench.rmt +762 -0
  662. package/xtendrmt/xtendrmt-bestcase-demo.core.json +1187 -0
  663. package/xtendrmt/xtendrmt-bestcase-demo.js +1728 -0
  664. package/xtendrmt/xtendrmt-bestcase-demo.rmt +57 -0
package/docs/index.php ADDED
@@ -0,0 +1,1625 @@
1
+ <?php
2
+ // XTend Docs SPA – index.php
3
+ // Lädt alle .md-Dateien, parsed sie mit Parsedown und bietet SPA-Routing mit Slugs
4
+ // This project uses parsedown for markdown parsing. See license at https://github.com/erusev/parsedown/blob/master/LICENSE.txt
5
+
6
+ if (function_exists('header_remove')) {
7
+ header_remove('X-Powered-By');
8
+ }
9
+
10
+ // --- Konfiguration ---
11
+ $docsRoot = __DIR__;
12
+ $componentsDir = $docsRoot . '/components';
13
+ $utilsDir = $docsRoot . '/utils';
14
+ $parsedownFile = $utilsDir . '/parsedown.php';
15
+ $rmtPilotDocument = 'xtendrmt-parsedown-docs.rmt';
16
+ $rmtPilotDocumentPath = $docsRoot . '/' . $rmtPilotDocument;
17
+ $rmtPilotDocumentData = null;
18
+ $rmtPilotDocumentJson = '{}';
19
+
20
+ function docsAssetMap($docsRoot) {
21
+ return [
22
+ 'favicon.ico' => [
23
+ 'path' => $docsRoot . '/../icons/favicon.ico',
24
+ 'type' => 'image/x-icon'
25
+ ],
26
+ 'favicon-16x16.png' => [
27
+ 'path' => $docsRoot . '/../icons/favicon-16x16.png',
28
+ 'type' => 'image/png'
29
+ ],
30
+ 'favicon-32x32.png' => [
31
+ 'path' => $docsRoot . '/../icons/favicon-32x32.png',
32
+ 'type' => 'image/png'
33
+ ],
34
+ 'apple-touch-icon.png' => [
35
+ 'path' => $docsRoot . '/../icons/apple-touch-icon.png',
36
+ 'type' => 'image/png'
37
+ ],
38
+ 'xtend-scaffold.webp' => [
39
+ 'path' => $docsRoot . '/../icons/xtend-scaffold.webp',
40
+ 'type' => 'image/webp'
41
+ ],
42
+ 'xtend-logo.png' => [
43
+ 'path' => $docsRoot . '/../XTend-Logo.png',
44
+ 'type' => 'image/png'
45
+ ]
46
+ ];
47
+ }
48
+
49
+ function docsServeAsset($assetName, $docsRoot) {
50
+ $assetKey = strtolower(basename((string) $assetName));
51
+ $assets = docsAssetMap($docsRoot);
52
+ if (!isset($assets[$assetKey])) {
53
+ http_response_code(404);
54
+ header('Content-Type: text/plain; charset=UTF-8');
55
+ header('X-Content-Type-Options: nosniff');
56
+ echo 'Docs asset not found.';
57
+ exit;
58
+ }
59
+
60
+ $asset = $assets[$assetKey];
61
+ $path = $asset['path'];
62
+ if (!is_file($path) || !is_readable($path)) {
63
+ http_response_code(404);
64
+ header('Content-Type: text/plain; charset=UTF-8');
65
+ header('X-Content-Type-Options: nosniff');
66
+ echo 'Docs asset unavailable.';
67
+ exit;
68
+ }
69
+
70
+ $mtime = filemtime($path);
71
+ $size = filesize($path);
72
+ $etag = '"' . sha1($assetKey . '|' . $mtime . '|' . $size) . '"';
73
+ $ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim((string) $_SERVER['HTTP_IF_NONE_MATCH']) : '';
74
+ $ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime((string) $_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
75
+
76
+ header('Content-Type: ' . $asset['type']);
77
+ header('X-Content-Type-Options: nosniff');
78
+ header('Cross-Origin-Resource-Policy: same-origin');
79
+ header('Cache-Control: public, max-age=31536000, immutable');
80
+ header('ETag: ' . $etag);
81
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime) . ' GMT');
82
+
83
+ if ($ifNoneMatch === $etag || ($ifModifiedSince !== false && $ifModifiedSince >= $mtime)) {
84
+ http_response_code(304);
85
+ exit;
86
+ }
87
+
88
+ header('Content-Length: ' . $size);
89
+ readfile($path);
90
+ exit;
91
+ }
92
+
93
+ function docsAssetUrl($assetName, $version) {
94
+ return 'index.php?xtend-docs-asset=' . rawurlencode((string) $assetName) . '&v=' . rawurlencode((string) $version);
95
+ }
96
+
97
+ if (isset($_GET['xtend-docs-asset'])) {
98
+ docsServeAsset($_GET['xtend-docs-asset'], $docsRoot);
99
+ }
100
+
101
+ // --- CSP Nonce generieren ---
102
+ $nonce = base64_encode(random_bytes(16));
103
+ header("Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-$nonce'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; font-src 'self'; object-src 'none';");
104
+
105
+ if (is_readable($rmtPilotDocumentPath)) {
106
+ $rmtPilotDecoded = json_decode(file_get_contents($rmtPilotDocumentPath), true);
107
+ if (json_last_error() === JSON_ERROR_NONE && is_array($rmtPilotDecoded)) {
108
+ $rmtPilotDocumentData = $rmtPilotDecoded;
109
+ }
110
+ }
111
+
112
+ function xtendAssetVersion($paths) {
113
+ $version = 1;
114
+ foreach ($paths as $path) {
115
+ if (is_readable($path)) {
116
+ $version = max($version, filemtime($path));
117
+ }
118
+ }
119
+ return (string) $version;
120
+ }
121
+
122
+ $xtendAssetVersion = xtendAssetVersion([
123
+ __DIR__ . '/../xtend.css',
124
+ __DIR__ . '/../xtend-loader.js',
125
+ __DIR__ . '/../fabric/xtend-fabric.js',
126
+ __DIR__ . '/../components/manifest.json',
127
+ __DIR__ . '/../components/xtheme.js',
128
+ __DIR__ . '/../components/xbutton.js',
129
+ __DIR__ . '/../components/xicon.js',
130
+ __DIR__ . '/../components/xlink.js',
131
+ __DIR__ . '/../components/xinput.js',
132
+ __DIR__ . '/../components/xform.js',
133
+ __DIR__ . '/../components/xheader.js',
134
+ __DIR__ . '/../components/xhero.js',
135
+ __DIR__ . '/../components/xrouter.js',
136
+ __DIR__ . '/../components/xfooter.js',
137
+ __DIR__ . '/../components/xcode.js',
138
+ __DIR__ . '/../components/xmodal.js',
139
+ __DIR__ . '/../components/xdialog.js',
140
+ __DIR__ . '/../components/xdrawer.js',
141
+ __DIR__ . '/../components/xpopover.js',
142
+ __DIR__ . '/../components/xtooltip.js',
143
+ __DIR__ . '/../components/xtabs.js',
144
+ __DIR__ . '/../components/xalert.js',
145
+ __DIR__ . '/../components/xtoast.js',
146
+ __DIR__ . '/../components/xselect.js',
147
+ __DIR__ . '/../components/xcheckbox.js',
148
+ __DIR__ . '/../components/xradio.js',
149
+ __DIR__ . '/../components/xtextarea.js',
150
+ __DIR__ . '/../components/xcalendar.js',
151
+ __DIR__ . '/../components/xstatus.js',
152
+ __DIR__ . '/../components/xprogress.js',
153
+ __DIR__ . '/../components/xsidepanel.js',
154
+ __DIR__ . '/../components/xsurfacewindow.js',
155
+ __DIR__ . '/../components/xsurfacemanager.js',
156
+ __DIR__ . '/../icons/favicon.ico',
157
+ __DIR__ . '/../icons/favicon-16x16.png',
158
+ __DIR__ . '/../icons/favicon-32x32.png',
159
+ __DIR__ . '/../icons/apple-touch-icon.png',
160
+ __DIR__ . '/../icons/xtend-scaffold.webp',
161
+ __DIR__ . '/../XTend-Logo.png',
162
+ __DIR__ . '/../docs/utils/pageloader.js',
163
+ __DIR__ . '/../docs/utils/fabric-runtime.js',
164
+ __DIR__ . '/../docs/xtendrmt-parsedown-docs.rmt',
165
+ __DIR__ . '/../api.js',
166
+ ]);
167
+ $xtendAssetVersionAttr = htmlspecialchars($xtendAssetVersion, ENT_QUOTES, 'UTF-8');
168
+ $docsFaviconIcoUrl = htmlspecialchars(docsAssetUrl('favicon.ico', $xtendAssetVersion), ENT_QUOTES, 'UTF-8');
169
+ $docsFavicon32Url = htmlspecialchars(docsAssetUrl('favicon-32x32.png', $xtendAssetVersion), ENT_QUOTES, 'UTF-8');
170
+ $docsFavicon16Url = htmlspecialchars(docsAssetUrl('favicon-16x16.png', $xtendAssetVersion), ENT_QUOTES, 'UTF-8');
171
+ $docsAppleTouchIconUrl = htmlspecialchars(docsAssetUrl('apple-touch-icon.png', $xtendAssetVersion), ENT_QUOTES, 'UTF-8');
172
+ $docsLogoUrl = htmlspecialchars(docsAssetUrl('xtend-scaffold.webp', $xtendAssetVersion), ENT_QUOTES, 'UTF-8');
173
+ $docsLightboxLogoUrl = htmlspecialchars(docsAssetUrl('xtend-logo.png', $xtendAssetVersion), ENT_QUOTES, 'UTF-8');
174
+
175
+ // Alle Markdown-Dateien finden (rekursiv)
176
+ function findMarkdownFiles($dir, $base = '') {
177
+ $files = [];
178
+ foreach (scandir($dir) as $file) {
179
+ if ($file === '.' || $file === '..') continue;
180
+ $path = "$dir/$file";
181
+ $rel = ltrim("$base/$file", '/');
182
+ if (is_dir($path)) {
183
+ $files = array_merge($files, findMarkdownFiles($path, $rel));
184
+ } elseif (preg_match('/\\.md$/i', $file)) {
185
+ $files[$rel] = $path;
186
+ }
187
+ }
188
+ return $files;
189
+ }
190
+
191
+ $mdFiles = findMarkdownFiles($docsRoot);
192
+
193
+ // Slug-Generierung: z.B. components/xalert.md => components-xalert
194
+ function slugify($path) {
195
+ return strtolower(preg_replace('/[^a-z0-9]+/i', '-', preg_replace('/\\.md$/i', '', $path)));
196
+ }
197
+
198
+ function docsRouteIdFromSlug($slug) {
199
+ return 'docs.' . str_replace('-', '.', $slug);
200
+ }
201
+
202
+ function docsMenuIconForSlug($slug) {
203
+ $slug = (string) $slug;
204
+ $exact = [
205
+ 'readme' => 'home',
206
+ 'quick-start-guide' => 'book-open',
207
+ 'about' => 'info',
208
+ 'best-practices' => 'success',
209
+ 'manifest' => 'file',
210
+ 'api' => 'terminal',
211
+ 'xtend-loader' => 'download',
212
+ 'xtend-fabric' => 'zap',
213
+ 'components' => 'component',
214
+ 'component-platform' => 'layers',
215
+ 'component-catalog-coverage' => 'boxes',
216
+ 'design-tokens' => 'palette',
217
+ 'xtendrmt-overview' => 'route',
218
+ 'rmt-linter' => 'terminal',
219
+ 'rmt-language-server' => 'server',
220
+ 'performance' => 'gauge',
221
+ 'hydration-policies' => 'zap',
222
+ 'a11y-keyboard-smokes' => 'accessibility',
223
+ 'trusted-dom-sanitizing' => 'shield-check',
224
+ 'supply-chain-gates' => 'shield-check',
225
+ 'rc0-gate-matrix' => 'package',
226
+ 'rc1-readiness' => 'rocket',
227
+ 'enterprise-adoption' => 'layers'
228
+ ];
229
+ if (isset($exact[$slug])) return $exact[$slug];
230
+ if (str_starts_with($slug, 'components-xcode')) return 'code';
231
+ if (str_starts_with($slug, 'components-xicon') || str_starts_with($slug, 'components-xtheme')) return 'palette';
232
+ if (str_starts_with($slug, 'components-xstate')) return 'database';
233
+ if (str_starts_with($slug, 'components-xrouter') || str_starts_with($slug, 'xtendrmt') || str_starts_with($slug, 'rmt-')) return 'route';
234
+ if (str_starts_with($slug, 'components-')) return 'component';
235
+ if (str_contains($slug, 'security') || str_contains($slug, 'trusted-dom') || str_contains($slug, 'supply-chain') || str_contains($slug, 'csp') || str_contains($slug, 'network')) return 'shield-check';
236
+ if (str_contains($slug, 'performance') || str_contains($slug, 'hydration')) return 'gauge';
237
+ if (str_contains($slug, 'a11y') || str_contains($slug, 'screenreader') || str_contains($slug, 'motion-contrast')) return 'accessibility';
238
+ if (str_contains($slug, 'release') || str_starts_with($slug, 'rc') || str_starts_with($slug, 'epic')) return 'rocket';
239
+ if (str_contains($slug, 'component') || str_contains($slug, 'surface') || str_contains($slug, 'visual')) return 'layers';
240
+ return 'docs';
241
+ }
242
+
243
+ function docsFallbackTitleFromPath($rel) {
244
+ return ucfirst(preg_replace('/[-_]/', ' ', preg_replace('/\\.md$/i', '', basename($rel))));
245
+ }
246
+
247
+ function docsPlainText($value) {
248
+ $text = html_entity_decode((string) $value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
249
+ $text = preg_replace('/[`*_#>\\[\\]()!]+/', ' ', $text);
250
+ $text = preg_replace('/\\s+/', ' ', $text);
251
+ return trim($text);
252
+ }
253
+
254
+ function docsExtractMarkdownTitle($markdown, $rel) {
255
+ if (preg_match('/^#\\s+(.+)$/m', (string) $markdown, $match)) {
256
+ $title = docsPlainText($match[1]);
257
+ if ($title !== '') return $title;
258
+ }
259
+ return docsFallbackTitleFromPath($rel);
260
+ }
261
+
262
+ function docsExtractMarkdownDescription($markdown, $fallbackTitle) {
263
+ $lines = preg_split('/\\R/', (string) $markdown);
264
+ foreach ($lines as $line) {
265
+ $line = trim($line);
266
+ if ($line === '' || strpos($line, '#') === 0 || strpos($line, '|') === 0 || strpos($line, '- ') === 0) {
267
+ continue;
268
+ }
269
+ $description = docsPlainText($line);
270
+ if ($description !== '') {
271
+ if (function_exists('mb_substr')) {
272
+ return mb_substr($description, 0, 155, 'UTF-8');
273
+ }
274
+ return substr($description, 0, 155);
275
+ }
276
+ }
277
+ return 'XTend Dokumentation: ' . $fallbackTitle;
278
+ }
279
+
280
+ function docsBuildRouteRecord($slug, $rel, $pageMeta) {
281
+ return [
282
+ 'id' => docsRouteIdFromSlug($slug),
283
+ 'path' => '/' . $slug,
284
+ 'router' => 'xtend.xrouter',
285
+ 'component' => 'docs.page',
286
+ 'title' => $pageMeta['title'],
287
+ 'documentTitle' => $pageMeta['documentTitle'],
288
+ 'titleTemplate' => $pageMeta['titleTemplate'],
289
+ 'metaDescription' => $pageMeta['metaDescription'],
290
+ 'metaKeywords' => $pageMeta['metaKeywords'],
291
+ 'template' => $pageMeta['template'],
292
+ 'shell' => $pageMeta['shellTemplate'],
293
+ 'schedule' => $pageMeta['schedules']['route'],
294
+ 'skeleton' => 'article',
295
+ 'skeletonLines' => 10,
296
+ 'skeletonMinHeight' => '26rem',
297
+ 'hydration' => [
298
+ 'schedule' => $pageMeta['schedules']['hydrate'],
299
+ 'policy' => 'visible'
300
+ ],
301
+ 'metadata' => [
302
+ 'source' => 'docs/' . $rel,
303
+ 'shellTemplate' => $pageMeta['shellTemplate'],
304
+ 'searchTemplate' => $pageMeta['searchTemplate'],
305
+ 'contentKind' => $pageMeta['contentKind'],
306
+ 'lazyPayload' => true,
307
+ 'skeletonLoader' => 'xtend.loader.skeleton-loader.v1',
308
+ 'seo' => [
309
+ 'title' => $pageMeta['title'],
310
+ 'documentTitle' => $pageMeta['documentTitle'],
311
+ 'titleTemplate' => $pageMeta['titleTemplate'],
312
+ 'description' => $pageMeta['metaDescription'],
313
+ 'keywords' => $pageMeta['metaKeywords']
314
+ ]
315
+ ]
316
+ ];
317
+ }
318
+
319
+ function docsBuildPageMeta($slug, $rel, $markdown) {
320
+ $title = docsExtractMarkdownTitle($markdown, $rel);
321
+ $description = docsExtractMarkdownDescription($markdown, $title);
322
+ $keywords = [
323
+ 'xtend',
324
+ 'dokumentation',
325
+ str_replace('-', ' ', $slug)
326
+ ];
327
+ $pageMeta = [
328
+ 'schema' => 'xtend.docs.parsedown-rmt-page.v1',
329
+ 'source' => 'docs/' . $rel,
330
+ 'routeId' => docsRouteIdFromSlug($slug),
331
+ 'path' => '/' . $slug,
332
+ 'router' => 'xtend.xrouter',
333
+ 'title' => $title,
334
+ 'documentTitle' => $title . ' | XTend Dokumentation',
335
+ 'titleTemplate' => '{{title}} | XTend Dokumentation',
336
+ 'metaDescription' => $description,
337
+ 'metaKeywords' => $keywords,
338
+ 'template' => 'docs.' . $slug . '.markdown',
339
+ 'shellFirst' => true,
340
+ 'shellTemplate' => 'docs.app.shell',
341
+ 'searchTemplate' => 'docs.header.search',
342
+ 'contentSlot' => 'content',
343
+ 'contentKind' => 'parsedownHtml',
344
+ 'adapter' => 'docs.parsedown',
345
+ 'component' => 'docs.page',
346
+ 'markupClass' => 'parsedownHtml',
347
+ 'trustBoundary' => 'xtend.security.sanitizing-boundary.v1',
348
+ 'lazyPayload' => true,
349
+ 'skeletonLoader' => 'xtend.loader.skeleton-loader.v1',
350
+ 'schedules' => [
351
+ 'shell' => 'docs.shell.render',
352
+ 'parse' => 'docs.markdown.parse',
353
+ 'route' => 'docs.route.render',
354
+ 'hydrate' => 'docs.page.hydrate',
355
+ 'search' => 'docs.search.index',
356
+ 'rich' => 'docs.rich-content.prepare',
357
+ 'media' => 'docs.media.lazy',
358
+ 'diagnostics' => 'docs.diagnostics.snapshot'
359
+ ],
360
+ 'endpoints' => [
361
+ 'shell' => 'xtendrmt.shell.render',
362
+ 'parse' => 'xtendrmt.docs.parsedown.parse',
363
+ 'route' => 'xtendrmt.route.render',
364
+ 'hydrate' => 'xtendrmt.component.hydrate',
365
+ 'search' => 'xtendrmt.docs.search.index',
366
+ 'rich' => 'xtendrmt.docs.rich-content.prepare',
367
+ 'media' => 'xtendrmt.docs.media.lazy',
368
+ 'diagnostics' => 'xtendrmt.diagnostics.snapshot'
369
+ ],
370
+ 'extensionSlots' => [
371
+ 'docs.slot.content',
372
+ 'docs.slot.sidebar',
373
+ 'docs.slot.related',
374
+ 'docs.slot.component-demo',
375
+ 'docs.slot.rich-content',
376
+ 'docs.slot.media',
377
+ 'docs.slot.diagnostics'
378
+ ]
379
+ ];
380
+ $pageMeta['route'] = docsBuildRouteRecord($slug, $rel, $pageMeta);
381
+ return $pageMeta;
382
+ }
383
+
384
+ function docsMergeRmtRoutes($document, $routes) {
385
+ if (!is_array($document)) {
386
+ $document = [
387
+ 'kind' => 'rmt_document',
388
+ 'version' => '1.0',
389
+ 'manifest' => [
390
+ 'documentId' => 'docs.xtend.parsedown-pilot',
391
+ 'namespace' => 'docs'
392
+ ],
393
+ 'routes' => []
394
+ ];
395
+ }
396
+ $indexed = [];
397
+ foreach (($document['routes'] ?? []) as $route) {
398
+ if (is_array($route) && isset($route['id'])) {
399
+ $indexed[$route['id']] = $route;
400
+ }
401
+ }
402
+ foreach ($routes as $route) {
403
+ $id = $route['id'];
404
+ $indexed[$id] = array_replace_recursive($indexed[$id] ?? [], $route);
405
+ }
406
+ $document['routes'] = array_values($indexed);
407
+ $document['metadata']['routeSeoSource'] = 'docs.generated.rmt.routes.v1';
408
+ return $document;
409
+ }
410
+
411
+ function docsRouteAttrValue($value) {
412
+ if (is_array($value)) {
413
+ $value = implode(', ', $value);
414
+ }
415
+ return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
416
+ }
417
+
418
+ function docsRenderXRoute($route, $pathOverride = null) {
419
+ global $xtendAssetVersionAttr;
420
+ $metadata = $route['metadata'] ?? [];
421
+ $attrs = [
422
+ 'path' => $pathOverride ?? ($route['path'] ?? ''),
423
+ 'component' => 'xtend-doc-page',
424
+ 'import' => '/docs/utils/pageloader.js?v=' . $xtendAssetVersionAttr,
425
+ 'title' => $route['title'] ?? '',
426
+ 'document-title' => $route['documentTitle'] ?? '',
427
+ 'title-template' => $route['titleTemplate'] ?? '',
428
+ 'meta-description' => $route['metaDescription'] ?? ($metadata['seo']['description'] ?? ''),
429
+ 'meta-keywords' => $route['metaKeywords'] ?? ($metadata['seo']['keywords'] ?? []),
430
+ 'skeleton' => $route['skeleton'] ?? 'article',
431
+ 'skeleton-lines' => $route['skeletonLines'] ?? 10,
432
+ 'skeleton-min-height' => $route['skeletonMinHeight'] ?? '26rem',
433
+ 'hydrate-schedule' => $route['hydration']['schedule'] ?? 'docs.page.hydrate',
434
+ 'data-rmt-route-id' => $route['id'] ?? '',
435
+ 'data-rmt-router' => $route['router'] ?? 'xtend.xrouter',
436
+ 'data-rmt-component' => $route['component'] ?? 'docs.page',
437
+ 'data-rmt-template' => $route['template'] ?? '',
438
+ 'data-rmt-schedule' => $route['schedule'] ?? '',
439
+ 'data-rmt-hydrate-schedule' => $route['hydration']['schedule'] ?? 'docs.page.hydrate',
440
+ 'data-rmt-metadata' => json_encode($metadata, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)
441
+ ];
442
+ $parts = [];
443
+ foreach ($attrs as $name => $value) {
444
+ if ($value === null || $value === '' || $value === []) continue;
445
+ $parts[] = $name . '="' . docsRouteAttrValue($value) . '"';
446
+ }
447
+ return '<x-route ' . implode(' ', $parts) . '></x-route>';
448
+ }
449
+
450
+ // Slug <-> Datei-Mapping
451
+ $slugToFile = [];
452
+ $fileToSlug = [];
453
+ foreach ($mdFiles as $rel => $abs) {
454
+ $slug = slugify($rel);
455
+ $slugToFile[$slug] = $rel;
456
+ $fileToSlug[$rel] = $slug;
457
+ }
458
+
459
+ // Routing: Slug aus URL
460
+ $page = $_GET['page'] ?? '';
461
+ if ($page && isset($slugToFile[$page])) {
462
+ $mdFile = $mdFiles[$slugToFile[$page]];
463
+ } else {
464
+ // Default: README.md
465
+ $mdFile = $docsRoot . '/README.md';
466
+ $page = $fileToSlug['README.md'] ?? slugify('README.md');
467
+ }
468
+
469
+ // Download-Handler
470
+ if (isset($_GET['download']) && isset($slugToFile[$_GET['download']])) {
471
+ $dlFile = $mdFiles[$slugToFile[$_GET['download']]];
472
+ header('Content-Type: text/markdown');
473
+ header('Content-Disposition: attachment; filename="' . basename($dlFile) . '"');
474
+ readfile($dlFile);
475
+ exit;
476
+ }
477
+
478
+ // Parsedown einbinden
479
+ require_once $parsedownFile;
480
+ $Parsedown = new Parsedown();
481
+ $Parsedown->setSafeMode(true);
482
+
483
+ if (isset($_GET['xtend-docs-page'])) {
484
+ $requestedSlug = slugify((string) $_GET['xtend-docs-page']);
485
+ if (!isset($slugToFile[$requestedSlug])) {
486
+ http_response_code(404);
487
+ header('Content-Type: application/json; charset=UTF-8');
488
+ header('X-Content-Type-Options: nosniff');
489
+ echo json_encode([
490
+ 'schema' => 'xtend.docs.parsedown-rmt-page-payload.v1',
491
+ 'ok' => false,
492
+ 'slug' => $requestedSlug,
493
+ 'error' => 'docs-page-not-found'
494
+ ], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
495
+ exit;
496
+ }
497
+
498
+ $rel = $slugToFile[$requestedSlug];
499
+ $markdown = file_get_contents($mdFiles[$rel]);
500
+ $meta = docsBuildPageMeta($requestedSlug, $rel, $markdown);
501
+ header('Content-Type: application/json; charset=UTF-8');
502
+ header('X-Content-Type-Options: nosniff');
503
+ header('Cache-Control: no-store');
504
+ echo json_encode([
505
+ 'schema' => 'xtend.docs.parsedown-rmt-page-payload.v1',
506
+ 'ok' => true,
507
+ 'slug' => $requestedSlug,
508
+ 'html' => $Parsedown->text($markdown),
509
+ 'meta' => $meta,
510
+ 'source' => $meta['source'],
511
+ 'schedule' => $meta['schedules']['parse'],
512
+ 'endpoint' => $meta['endpoints']['parse'],
513
+ 'skeletonLoader' => 'xtend.loader.skeleton-loader.v1'
514
+ ], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
515
+ exit;
516
+ }
517
+
518
+ // Navigation generieren
519
+ function navLinks($fileToSlug) {
520
+ $nav = "<nav><ul>";
521
+ foreach ($fileToSlug as $rel => $slug) {
522
+ $title = htmlspecialchars(ucfirst(preg_replace('/[-_]/', ' ', preg_replace('/\\.md$/i', '', basename($rel)))));
523
+ $nav .= "<li><a href='?page=$slug' data-link>$title</a></li>";
524
+ }
525
+ $nav .= "</ul></nav>";
526
+ return $nav;
527
+ }
528
+
529
+ // --- Nach dem Parsen aller Seiten: JS-Objekt für alle Seiteninhalte ---
530
+ $allPages = [];
531
+ $allPagesMeta = [];
532
+ $docsRmtRoutes = [];
533
+ $titles = [];
534
+ foreach ($fileToSlug as $rel => $slug) {
535
+ $mdFile = $mdFiles[$slugToFile[$slug]];
536
+ $mdContent = file_get_contents($mdFile);
537
+ $allPagesMeta[$slug] = docsBuildPageMeta($slug, $rel, $mdContent);
538
+ if ($slug === $page) {
539
+ $allPages[$slug] = $Parsedown->text($mdContent);
540
+ }
541
+ $docsRmtRoutes[] = $allPagesMeta[$slug]['route'];
542
+ $titles[$slug] = $allPagesMeta[$slug]['title'];
543
+ }
544
+ $readmeTitle = $allPagesMeta['readme']['title'] ?? 'XTend Dokumentation';
545
+ $readmeDocumentTitle = $allPagesMeta['readme']['documentTitle'] ?? 'XTend Dokumentation';
546
+ $readmeDescription = $allPagesMeta['readme']['metaDescription'] ?? 'XTend Dokumentation';
547
+ $docsRmtRoutes[] = array_replace_recursive($allPagesMeta['readme']['route'] ?? [], [
548
+ 'id' => 'docs.home',
549
+ 'path' => '/',
550
+ 'title' => $readmeTitle,
551
+ 'documentTitle' => $readmeDocumentTitle,
552
+ 'metadata' => [
553
+ 'source' => 'docs/README.md',
554
+ 'seo' => [
555
+ 'title' => $readmeTitle,
556
+ 'documentTitle' => $readmeDocumentTitle,
557
+ 'description' => $readmeDescription
558
+ ]
559
+ ]
560
+ ]);
561
+ $rmtPilotDocumentData = docsMergeRmtRoutes($rmtPilotDocumentData, $docsRmtRoutes);
562
+ $rmtPilotDocumentJson = json_encode($rmtPilotDocumentData, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
563
+ $initialDocsSlug = isset($allPagesMeta[$page]) ? $page : 'readme';
564
+ $initialTitle = $allPagesMeta[$initialDocsSlug]['documentTitle'] ?? 'XTend Dokumentation';
565
+ $initialDescription = $allPagesMeta[$initialDocsSlug]['metaDescription'] ?? 'XTend Dokumentation';
566
+ $initialKeywords = implode(', ', $allPagesMeta[$initialDocsSlug]['metaKeywords'] ?? ['xtend', 'dokumentation']);
567
+ ?><!DOCTYPE html>
568
+ <html lang="de">
569
+ <head>
570
+ <meta charset="UTF-8">
571
+ <title><?= htmlspecialchars($initialTitle, ENT_QUOTES, 'UTF-8') ?></title>
572
+ <meta name="description" content="<?= htmlspecialchars($initialDescription, ENT_QUOTES, 'UTF-8') ?>">
573
+ <meta name="keywords" content="<?= htmlspecialchars($initialKeywords, ENT_QUOTES, 'UTF-8') ?>">
574
+ <meta name="viewport" content="width=device-width,initial-scale=1">
575
+ <meta name="xtend-preload" content="x-theme,x-button,x-icon,x-link,x-input,x-form,x-header,x-hero,x-router,x-footer,x-section,x-code,x-modal,x-dialog">
576
+ <link rel="icon" href="<?= $docsFaviconIcoUrl ?>" sizes="any">
577
+ <link rel="icon" type="image/png" sizes="32x32" href="<?= $docsFavicon32Url ?>">
578
+ <link rel="icon" type="image/png" sizes="16x16" href="<?= $docsFavicon16Url ?>">
579
+ <link rel="apple-touch-icon" href="<?= $docsAppleTouchIconUrl ?>">
580
+ <link rel="stylesheet" href="/xtend.css?v=<?= $xtendAssetVersionAttr ?>">
581
+ <script src="/fabric/xtend-fabric.js?v=<?= $xtendAssetVersionAttr ?>"></script>
582
+ <script type="module" src="/xtend-loader.js?v=<?= $xtendAssetVersionAttr ?>" data-manifest="/components/manifest.json?v=<?= $xtendAssetVersionAttr ?>" data-module-cache-bust="<?= $xtendAssetVersionAttr ?>"></script>
583
+ <script src="/components/prism.js" nonce="<?= $nonce ?>"></script>
584
+ <style>
585
+ html {
586
+ --body-bg: #f7f8fb;
587
+ --background-color: #f7f8fb;
588
+ --section-bg: #ffffff;
589
+ --surface-muted: #edf2f7;
590
+ --text-color: #1f2937;
591
+ --muted-text-color: #5f6f82;
592
+ --primary-color: #0e4e81;
593
+ --focus-color: #0e7cc1;
594
+ --border-color: rgba(15, 23, 42, 0.14);
595
+ --xtend-surface: #ffffff;
596
+ --xtend-surface-muted: #f7fafc;
597
+ --xtend-text: #1f2937;
598
+ --xtend-border-color: rgba(15, 23, 42, 0.14);
599
+ --xtend-overlay-bg: rgba(15, 23, 42, 0.52);
600
+ --docs-header-bg: #ffffff;
601
+ --docs-header-menu-bg: #ffffff;
602
+ --docs-header-fg: #1f2937;
603
+ --docs-shell-bg: transparent;
604
+ --docs-sidebar-bg: #ffffff;
605
+ --docs-sidebar-link-bg: #f7fafc;
606
+ --docs-sidebar-link-hover-bg: #e7f0f7;
607
+ --docs-menu-highlight-bg: rgba(14, 78, 129, 0.11);
608
+ --docs-menu-highlight-border: rgba(14, 78, 129, 0.28);
609
+ --docs-menu-active-rail: rgba(14, 78, 129, 0.72);
610
+ --docs-code-bg: #10131a;
611
+ --x-code-bg: #10131a;
612
+ --x-code-text: #f8fafc;
613
+ --x-code-border: rgba(15, 23, 42, 0.18);
614
+ --docs-shell-vertical-gap: 1.2rem;
615
+ --docs-viewport-gutter: 0.5rem;
616
+ --docs-layout-gap: clamp(1rem, 2.2vw, 2.5rem);
617
+ --docs-sidebar-width: clamp(20rem, 24vw, 27rem);
618
+ --docs-hero-bg-light: linear-gradient(135deg, #f8fbff 0%, #e7f0f7 100%);
619
+ --docs-hero-bg-dark: #050506;
620
+ --docs-hero-text-light: #162033;
621
+ --docs-hero-text-dark: #f8fafc;
622
+ max-width: 100%;
623
+ overflow-x: hidden;
624
+ overflow-x: clip;
625
+ }
626
+ [data-theme="dark"] {
627
+ --body-bg: #050506;
628
+ --background-color: #050506;
629
+ --section-bg: #0b0b0d;
630
+ --surface-muted: #111113;
631
+ --text-color: #f4f4f5;
632
+ --muted-text-color: #a1a1aa;
633
+ --primary-color: #8fd3ff;
634
+ --focus-color: #c7ecff;
635
+ --border-color: rgba(255, 255, 255, 0.13);
636
+ --xtend-surface: #0b0b0d;
637
+ --xtend-surface-muted: #111113;
638
+ --xtend-text: #f4f4f5;
639
+ --xtend-border-color: rgba(255, 255, 255, 0.13);
640
+ --xtend-overlay-bg: rgba(0, 0, 0, 0.72);
641
+ --docs-header-bg: #050506;
642
+ --docs-header-menu-bg: #09090b;
643
+ --docs-header-fg: #f4f4f5;
644
+ --docs-shell-bg: transparent;
645
+ --docs-sidebar-bg: #0d0d10;
646
+ --docs-sidebar-link-bg: #111114;
647
+ --docs-sidebar-link-hover-bg: #17171b;
648
+ --docs-menu-highlight-bg: rgba(143, 211, 255, 0.12);
649
+ --docs-menu-highlight-border: rgba(143, 211, 255, 0.32);
650
+ --docs-menu-active-rail: rgba(143, 211, 255, 0.74);
651
+ --docs-code-bg: #050506;
652
+ --x-code-bg: #050506;
653
+ --x-code-text: #f4f4f5;
654
+ --x-code-border: rgba(255, 255, 255, 0.16);
655
+ --docs-hero-bg-dark: #050506;
656
+ --input-bg: #0f0f12;
657
+ --input-bg-dark: #0f0f12;
658
+ --input-placeholder-color-dark: #a1a1aa;
659
+ }
660
+ body {
661
+ font-family: system-ui, sans-serif;
662
+ margin: 0;
663
+ min-width: 0;
664
+ max-width: 100%;
665
+ overflow-x: hidden;
666
+ overflow-x: clip;
667
+ background-color: var(--body-bg, var(--background-color));
668
+ color: var(--text-color);
669
+ }
670
+ main {
671
+ width: 100%;
672
+ min-width: 0;
673
+ box-sizing: border-box;
674
+ background: transparent;
675
+ border: 0;
676
+ border-radius: 0;
677
+ box-shadow: none;
678
+ transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease;
679
+ }
680
+ x-footer {
681
+ display: block;
682
+ margin: var(--docs-shell-vertical-gap) var(--docs-viewport-gutter) 0;
683
+ }
684
+ main > x-router {
685
+ display: block;
686
+ width: 100%;
687
+ max-width: 100%;
688
+ min-width: 0;
689
+ }
690
+ main > x-router::part(outlet) {
691
+ width: 100%;
692
+ max-width: 100%;
693
+ min-width: 0;
694
+ box-sizing: border-box;
695
+ }
696
+ x-header {
697
+ --header-bg: var(--docs-header-bg);
698
+ --header-menu-bg: var(--docs-header-menu-bg);
699
+ --header-fg: var(--docs-header-fg);
700
+ --header-title-color: var(--docs-header-fg);
701
+ --burger-color: var(--docs-header-fg);
702
+ --header-border: var(--border-color);
703
+ --header-radius: 0.75rem;
704
+ --header-drawer-inline-offset: clamp(0.5rem, 1.6vw, 1rem);
705
+ --header-drawer-content-max: none;
706
+ position: relative;
707
+ z-index: 20;
708
+ }
709
+ x-header::part(root) {
710
+ margin-left: var(--docs-viewport-gutter);
711
+ margin-right: var(--docs-viewport-gutter);
712
+ }
713
+ .docs-icon-button {
714
+ --xtend-button-min-touch-target: 44px;
715
+ color: var(--text-color);
716
+ flex: none;
717
+ }
718
+ .docs-icon-button::part(button) {
719
+ width: 44px;
720
+ height: 44px;
721
+ min-width: 44px;
722
+ min-height: 44px;
723
+ padding: 0;
724
+ border: 1px solid var(--border-color);
725
+ border-radius: 999px;
726
+ background: var(--surface-muted);
727
+ color: var(--text-color);
728
+ box-shadow: none;
729
+ backdrop-filter: none;
730
+ transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease, transform 0.16s ease;
731
+ }
732
+ .docs-icon-button:hover::part(button) {
733
+ transform: translateY(-1px);
734
+ border-color: color-mix(in srgb, var(--primary-color) 60%, var(--border-color));
735
+ background: var(--primary-color);
736
+ color: var(--section-bg);
737
+ }
738
+ .docs-icon-button:focus-visible::part(button) {
739
+ outline: 2px solid var(--focus-color);
740
+ outline-offset: 2px;
741
+ }
742
+ .docs-icon-button x-icon {
743
+ pointer-events: none;
744
+ }
745
+ .docs-visually-hidden {
746
+ position: absolute;
747
+ width: 1px;
748
+ height: 1px;
749
+ padding: 0;
750
+ margin: -1px;
751
+ overflow: hidden;
752
+ clip: rect(0, 0, 0, 0);
753
+ white-space: nowrap;
754
+ border: 0;
755
+ }
756
+ .docs-menu-shell {
757
+ display: grid;
758
+ grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
759
+ gap: 0.85rem;
760
+ width: 100%;
761
+ max-width: 100%;
762
+ min-width: 0;
763
+ box-sizing: border-box;
764
+ }
765
+ .docs-menu-section {
766
+ max-width: 100%;
767
+ min-width: 0;
768
+ padding: 0.65rem;
769
+ border: 1px solid var(--border-color);
770
+ border-radius: 0.7rem;
771
+ background: var(--surface-muted);
772
+ display: flex;
773
+ flex-direction: column;
774
+ gap: 0.5rem;
775
+ box-sizing: border-box;
776
+ }
777
+ .docs-menu-section-title {
778
+ margin: 0 0 0.45rem;
779
+ color: var(--muted-text-color);
780
+ font-size: 0.78rem;
781
+ font-weight: 700;
782
+ text-transform: uppercase;
783
+ display: inline-flex;
784
+ align-items: center;
785
+ gap: 0.42rem;
786
+ }
787
+ .docs-menu-section-title x-icon {
788
+ color: var(--primary-color);
789
+ flex: none;
790
+ }
791
+ .docs-menu-section-links {
792
+ display: grid;
793
+ gap: 0.42rem;
794
+ min-width: 0;
795
+ max-width: 100%;
796
+ }
797
+ .docs-menu-node {
798
+ display: grid;
799
+ gap: 0.3rem;
800
+ min-width: 0;
801
+ max-width: 100%;
802
+ isolation: isolate;
803
+ }
804
+ .docs-menu-node[data-doc-depth="0"] > x-link {
805
+ font-weight: 650;
806
+ }
807
+ .docs-menu-node[data-doc-depth="1"] > x-link,
808
+ .docs-menu-node[data-doc-depth="2"] > x-link {
809
+ font-size: 0.94rem;
810
+ }
811
+ .docs-menu-section x-link {
812
+ display: block;
813
+ width: 100%;
814
+ max-width: 100%;
815
+ box-sizing: border-box;
816
+ min-height: 36px;
817
+ padding: 0.42rem 0.55rem;
818
+ border: 1px solid transparent;
819
+ border-radius: 0.45rem;
820
+ color: var(--text-color);
821
+ overflow-wrap: anywhere;
822
+ transition: background 0.14s ease, border-color 0.14s ease, color 0.14s ease, box-shadow 0.14s ease;
823
+ }
824
+ .docs-menu-section x-link::part(link),
825
+ .docs-nav-link::part(link) {
826
+ display: grid;
827
+ grid-template-columns: auto minmax(0, 1fr);
828
+ align-items: center;
829
+ gap: 0.45rem;
830
+ width: 100%;
831
+ max-width: 100%;
832
+ min-width: 0;
833
+ box-sizing: border-box;
834
+ color: inherit;
835
+ text-decoration: none;
836
+ overflow-wrap: anywhere;
837
+ }
838
+ .docs-menu-link-icon,
839
+ .docs-nav-link-icon {
840
+ color: var(--primary-color);
841
+ flex: none;
842
+ opacity: 0.92;
843
+ }
844
+ .docs-menu-link-label,
845
+ .docs-nav-link-label {
846
+ min-width: 0;
847
+ overflow-wrap: anywhere;
848
+ }
849
+ .docs-menu-section x-link:hover,
850
+ .docs-menu-section x-link[active] {
851
+ background: var(--docs-menu-highlight-bg);
852
+ border-color: var(--docs-menu-highlight-border);
853
+ color: var(--primary-color);
854
+ }
855
+ .docs-menu-section x-link[active] {
856
+ font-weight: 700;
857
+ box-shadow: inset 3px 0 0 var(--docs-menu-active-rail);
858
+ }
859
+ .docs-menu-children {
860
+ margin: 0.12rem 0 0;
861
+ padding: 0;
862
+ border: 0;
863
+ min-width: 0;
864
+ max-width: 100%;
865
+ box-sizing: border-box;
866
+ }
867
+ .docs-menu-children summary {
868
+ min-height: 32px;
869
+ display: grid;
870
+ grid-template-columns: auto minmax(0, 1fr) auto;
871
+ align-items: center;
872
+ gap: 0.42rem;
873
+ width: 100%;
874
+ max-width: 100%;
875
+ box-sizing: border-box;
876
+ color: var(--muted-text-color);
877
+ cursor: pointer;
878
+ font-size: 0.82rem;
879
+ font-weight: 700;
880
+ letter-spacing: 0;
881
+ border-radius: 0.45rem;
882
+ padding: 0.28rem 0.42rem;
883
+ background: color-mix(in srgb, var(--surface-muted) 78%, var(--section-bg));
884
+ border: 1px solid transparent;
885
+ list-style: none;
886
+ transition: color 0.14s ease, background 0.14s ease, border-color 0.14s ease;
887
+ }
888
+ .docs-menu-children summary::-webkit-details-marker {
889
+ display: none;
890
+ }
891
+ .docs-menu-children summary:hover,
892
+ .docs-menu-children summary:focus-visible,
893
+ .docs-menu-children[open] summary {
894
+ color: var(--primary-color);
895
+ background: var(--docs-menu-highlight-bg);
896
+ border-color: var(--docs-menu-highlight-border);
897
+ outline: none;
898
+ }
899
+ .docs-menu-disclosure-icon {
900
+ color: var(--primary-color);
901
+ flex: none;
902
+ transition: transform 0.14s ease;
903
+ }
904
+ .docs-menu-children[open] > summary .docs-menu-disclosure-icon {
905
+ transform: rotate(90deg);
906
+ }
907
+ .docs-menu-disclosure-label {
908
+ min-width: 0;
909
+ overflow-wrap: anywhere;
910
+ }
911
+ .docs-menu-disclosure-count {
912
+ min-width: 1.35rem;
913
+ padding: 0.05rem 0.35rem;
914
+ border-radius: 999px;
915
+ background: var(--section-bg);
916
+ color: var(--muted-text-color);
917
+ font-size: 0.72rem;
918
+ line-height: 1.35;
919
+ text-align: center;
920
+ }
921
+ .docs-menu-children[open] > summary .docs-menu-disclosure-count {
922
+ color: var(--primary-color);
923
+ }
924
+ .docs-menu-child-list {
925
+ display: grid;
926
+ gap: 0.28rem;
927
+ margin: 0.3rem 0 0.18rem;
928
+ padding: 0.2rem 0 0 0.65rem;
929
+ border-left: 1px solid var(--border-color);
930
+ min-width: 0;
931
+ max-width: 100%;
932
+ box-sizing: border-box;
933
+ }
934
+ .docs-menu-children:not([open]) > .docs-menu-child-list {
935
+ display: none;
936
+ }
937
+ #xtend-search-form {
938
+ display: block;
939
+ position: relative;
940
+ width: 100%;
941
+ max-width: 30rem;
942
+ min-width: 0;
943
+ box-sizing: border-box;
944
+ --form-padding: 0;
945
+ --form-gap: 0;
946
+ --form-background: transparent;
947
+ --form-border: 0;
948
+ --form-shadow: none;
949
+ margin: 0;
950
+ padding: 0;
951
+ border: 0;
952
+ background: transparent;
953
+ }
954
+ #xtend-search-form::part(form) {
955
+ width: 100%;
956
+ max-width: 100%;
957
+ min-width: 0;
958
+ box-sizing: border-box;
959
+ }
960
+ #xtend-search-form label {
961
+ position: absolute;
962
+ width: 1px;
963
+ height: 1px;
964
+ overflow: hidden;
965
+ clip: rect(0,0,0,0);
966
+ }
967
+ #xtend-search-form x-input {
968
+ display: block;
969
+ width: 100%;
970
+ max-width: 100%;
971
+ box-sizing: border-box;
972
+ min-width: 12rem;
973
+ }
974
+ @media (max-width: 420px) {
975
+ #xtend-search-form x-input {
976
+ min-width: 0;
977
+ }
978
+ }
979
+ #search-results {
980
+ border: 1px solid var(--border-color);
981
+ background: var(--section-bg);
982
+ color: var(--text-color);
983
+ }
984
+ #search-results x-link {
985
+ display: block;
986
+ padding: 0.42rem 0.5rem;
987
+ border-radius: 0.45rem;
988
+ }
989
+ #search-results x-link:hover {
990
+ background: rgba(14, 78, 129, 0.12);
991
+ }
992
+ x-hero.docs-hero {
993
+ display: block;
994
+ margin: 0 var(--docs-viewport-gutter);
995
+ max-width: calc(100% - var(--docs-viewport-gutter) - var(--docs-viewport-gutter));
996
+ min-width: 0;
997
+ box-sizing: border-box;
998
+ --hero-padding: clamp(2.5rem, 6vw, 4.5rem) 1.25rem;
999
+ --hero-radius: 0.75rem;
1000
+ --hero-font-size: clamp(1rem, 2vw, 1.25rem);
1001
+ --hero-content-max-width: none;
1002
+ --hero-content-margin: 0;
1003
+ --hero-content-padding: clamp(1.8rem, 4vw, 3.4rem) clamp(1.5rem, 3.5vw, 3rem);
1004
+ }
1005
+ x-hero.docs-hero h1 {
1006
+ font-size: clamp(2rem, 5vw, 4.2rem);
1007
+ line-height: 1.02;
1008
+ margin: 0;
1009
+ }
1010
+ x-hero.docs-hero p {
1011
+ margin: 0.7rem 0 0;
1012
+ color: inherit;
1013
+ }
1014
+ .docs-shell-toolbar {
1015
+ display: flex;
1016
+ justify-content: flex-end;
1017
+ align-items: center;
1018
+ gap: 0.5rem;
1019
+ margin-bottom: 0.8rem;
1020
+ }
1021
+ .docs-app-shell {
1022
+ display: block;
1023
+ width: 100%;
1024
+ max-width: none;
1025
+ min-width: 0;
1026
+ box-sizing: border-box;
1027
+ --section-bg: var(--docs-shell-bg);
1028
+ --section-padding: 0;
1029
+ --main-content-padding: 0;
1030
+ --section-gap: 0;
1031
+ --border-radius: 0;
1032
+ }
1033
+ x-section.docs-app-shell::part(container),
1034
+ x-section.docs-app-shell::part(content) {
1035
+ display: block;
1036
+ width: 100%;
1037
+ max-width: none;
1038
+ min-width: 0;
1039
+ flex: 1 1 auto;
1040
+ box-sizing: border-box;
1041
+ padding: 0;
1042
+ overflow: visible;
1043
+ }
1044
+ .docs-shell-layout {
1045
+ display: grid;
1046
+ grid-template-columns: minmax(0, 1fr) var(--docs-sidebar-width);
1047
+ gap: var(--docs-layout-gap);
1048
+ align-items: start;
1049
+ width: calc(100% - var(--docs-viewport-gutter) - var(--docs-viewport-gutter));
1050
+ max-width: calc(100% - var(--docs-viewport-gutter) - var(--docs-viewport-gutter));
1051
+ margin-inline: var(--docs-viewport-gutter);
1052
+ min-width: 0;
1053
+ box-sizing: border-box;
1054
+ }
1055
+ .docs-article-surface,
1056
+ .docs-page-sidebar {
1057
+ min-width: 0;
1058
+ max-width: 100%;
1059
+ box-sizing: border-box;
1060
+ }
1061
+ .docs-article-surface {
1062
+ background: var(--section-bg);
1063
+ color: var(--text-color);
1064
+ border: 1px solid var(--border-color);
1065
+ border-radius: 8px;
1066
+ padding: clamp(1rem, 2vw, 2rem);
1067
+ box-shadow: 0 10px 28px rgba(15, 23, 42, 0.08);
1068
+ }
1069
+ [data-theme="dark"] .docs-article-surface {
1070
+ box-shadow: 0 20px 52px rgba(0, 0, 0, 0.45);
1071
+ }
1072
+ .docs-page-sidebar {
1073
+ position: static;
1074
+ display: grid;
1075
+ gap: 0.85rem;
1076
+ align-self: start;
1077
+ }
1078
+ .docs-sidebar-section {
1079
+ background: var(--docs-sidebar-bg);
1080
+ color: var(--text-color);
1081
+ border: 1px solid var(--border-color);
1082
+ border-radius: 8px;
1083
+ padding: 0.9rem;
1084
+ box-shadow: 0 8px 22px rgba(15, 23, 42, 0.06);
1085
+ }
1086
+ [data-theme="dark"] .docs-sidebar-section {
1087
+ box-shadow: 0 18px 36px rgba(0, 0, 0, 0.36);
1088
+ }
1089
+ .docs-sidebar-heading {
1090
+ display: flex;
1091
+ align-items: center;
1092
+ gap: 0.45rem;
1093
+ margin: 0 0 0.65rem;
1094
+ font-size: 0.86rem;
1095
+ line-height: 1.2;
1096
+ color: var(--text-color);
1097
+ }
1098
+ .docs-sidebar-heading x-icon {
1099
+ color: var(--primary-color);
1100
+ flex: none;
1101
+ }
1102
+ .docs-sidebar-copy {
1103
+ margin: -0.2rem 0 0.75rem;
1104
+ color: var(--muted-text-color);
1105
+ font-size: 0.88rem;
1106
+ line-height: 1.45;
1107
+ }
1108
+ .docs-related-list {
1109
+ display: grid;
1110
+ gap: 0.5rem;
1111
+ }
1112
+ .docs-related-link {
1113
+ display: grid;
1114
+ grid-template-columns: auto minmax(0, 1fr) auto;
1115
+ align-items: center;
1116
+ gap: 0.55rem;
1117
+ max-width: 100%;
1118
+ min-width: 0;
1119
+ box-sizing: border-box;
1120
+ min-height: 42px;
1121
+ padding: 0.55rem 0.62rem;
1122
+ border: 1px solid var(--border-color);
1123
+ border-radius: 7px;
1124
+ background: var(--docs-sidebar-link-bg);
1125
+ color: var(--text-color);
1126
+ text-decoration: none;
1127
+ transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease, transform 0.16s ease;
1128
+ }
1129
+ x-link.docs-related-link::part(link) {
1130
+ display: grid;
1131
+ grid-template-columns: auto minmax(0, 1fr) auto;
1132
+ align-items: center;
1133
+ gap: 0.55rem;
1134
+ width: 100%;
1135
+ max-width: 100%;
1136
+ min-width: 0;
1137
+ box-sizing: border-box;
1138
+ color: inherit;
1139
+ text-decoration: none;
1140
+ }
1141
+ .docs-related-link:hover,
1142
+ .docs-related-link:focus-visible {
1143
+ background: var(--docs-sidebar-link-hover-bg);
1144
+ border-color: color-mix(in srgb, var(--primary-color) 56%, var(--border-color));
1145
+ color: var(--primary-color);
1146
+ transform: translateX(2px);
1147
+ outline: none;
1148
+ }
1149
+ .docs-related-link x-icon {
1150
+ color: var(--primary-color);
1151
+ flex: none;
1152
+ }
1153
+ .docs-related-link span {
1154
+ min-width: 0;
1155
+ overflow-wrap: anywhere;
1156
+ }
1157
+ .docs-component-demo[hidden],
1158
+ .docs-sidebar-section[hidden] {
1159
+ display: none;
1160
+ }
1161
+ .docs-demo-preview {
1162
+ display: grid;
1163
+ gap: 0.7rem;
1164
+ min-height: 4rem;
1165
+ padding: 0.85rem;
1166
+ border: 1px solid var(--border-color);
1167
+ border-radius: 7px;
1168
+ background: var(--surface-muted);
1169
+ overflow: visible;
1170
+ }
1171
+ .docs-demo-preview x-button,
1172
+ .docs-demo-preview x-input,
1173
+ .docs-demo-preview x-select,
1174
+ .docs-demo-preview x-textarea,
1175
+ .docs-demo-preview x-status,
1176
+ .docs-demo-preview x-progress,
1177
+ .docs-demo-preview x-alert,
1178
+ .docs-demo-preview x-toast,
1179
+ .docs-demo-preview x-tabs,
1180
+ .docs-demo-preview x-code,
1181
+ .docs-demo-preview x-summary {
1182
+ max-width: 100%;
1183
+ }
1184
+ .docs-demo-actions {
1185
+ display: flex;
1186
+ flex-wrap: wrap;
1187
+ gap: 0.55rem;
1188
+ align-items: center;
1189
+ }
1190
+ .docs-demo-code-grid {
1191
+ display: grid;
1192
+ gap: 0.7rem;
1193
+ margin-top: 0.75rem;
1194
+ }
1195
+ .docs-demo-code-block h3 {
1196
+ margin: 0 0 0.35rem;
1197
+ color: var(--muted-text-color);
1198
+ font-size: 0.78rem;
1199
+ text-transform: uppercase;
1200
+ }
1201
+ .docs-demo-code-block x-code {
1202
+ margin: 0;
1203
+ max-height: 18rem;
1204
+ width: 100%;
1205
+ max-width: 100%;
1206
+ min-width: 0;
1207
+ box-sizing: border-box;
1208
+ background: var(--docs-code-bg);
1209
+ color: var(--x-code-text);
1210
+ border-radius: 8px;
1211
+ }
1212
+ .docs-demo-surface-zone {
1213
+ position: relative;
1214
+ min-height: 15rem;
1215
+ overflow: hidden;
1216
+ border-radius: 7px;
1217
+ background: color-mix(in srgb, var(--surface-muted) 80%, transparent);
1218
+ }
1219
+ .docs-demo-surface-zone x-surface-window,
1220
+ .docs-demo-surface-zone x-side-panel {
1221
+ position: absolute;
1222
+ }
1223
+ .download-link {
1224
+ float: none;
1225
+ font-size: 0.9em;
1226
+ }
1227
+ xtend-doc-page {
1228
+ display: block;
1229
+ width: 100%;
1230
+ max-width: none;
1231
+ box-sizing: border-box;
1232
+ opacity: 1;
1233
+ transform: translateY(0);
1234
+ transition: opacity 0.16s ease, transform 0.16s ease;
1235
+ }
1236
+ xtend-doc-page[data-docs-route-state="loading"] {
1237
+ opacity: 0.72;
1238
+ transform: translateY(4px);
1239
+ }
1240
+ xtend-doc-page [data-rmt-shell] {
1241
+ transition: border-color 0.16s ease, box-shadow 0.16s ease;
1242
+ }
1243
+ xtend-doc-page[data-docs-route-state="ready"] [data-rmt-shell] {
1244
+ box-shadow: 0 6px 18px rgba(15, 23, 42, 0.06);
1245
+ }
1246
+ @media (max-width: 700px) {
1247
+ :root {
1248
+ --docs-shell-vertical-gap: 1rem;
1249
+ }
1250
+ x-hero.docs-hero {
1251
+ margin: 0 var(--docs-viewport-gutter);
1252
+ max-width: calc(100% - var(--docs-viewport-gutter) - var(--docs-viewport-gutter));
1253
+ }
1254
+ .docs-shell-layout {
1255
+ grid-template-columns: 1fr;
1256
+ }
1257
+ .docs-page-sidebar {
1258
+ position: static;
1259
+ }
1260
+ .docs-menu-shell {
1261
+ grid-template-columns: 1fr;
1262
+ }
1263
+ #xtend-search-form {
1264
+ width: 100%;
1265
+ }
1266
+ }
1267
+ @media (prefers-reduced-motion: reduce) {
1268
+ *,
1269
+ *::before,
1270
+ *::after {
1271
+ transition-duration: 0.01ms !important;
1272
+ animation-duration: 0.01ms !important;
1273
+ animation-iteration-count: 1 !important;
1274
+ }
1275
+ .docs-menu-section x-link:hover,
1276
+ .docs-menu-section x-link[active],
1277
+ .docs-icon-button:hover::part(button),
1278
+ .docs-related-link:hover,
1279
+ .docs-related-link:focus-visible,
1280
+ xtend-doc-page[data-docs-route-state="loading"] {
1281
+ transform: none;
1282
+ }
1283
+ }
1284
+ </style>
1285
+ <script nonce="<?= $nonce ?>">
1286
+ window.xtendInitialDocsSlug = <?= json_encode($initialDocsSlug, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); ?>;
1287
+ if (!location.hash) location.hash = '#/' + (window.xtendInitialDocsSlug || 'readme');
1288
+ window.xtendDocsPages = <?php echo json_encode($allPages, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); ?>;
1289
+ window.xtendDocsPageEndpoint = 'index.php?xtend-docs-page=';
1290
+ window.xtendDocsPagesMeta = <?php echo json_encode($allPagesMeta, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); ?>;
1291
+ window.xtendDocsTitles = <?php echo json_encode($titles, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); ?>;
1292
+ window.xtendDocsAssetUrls = {
1293
+ favicon: '<?= $docsFaviconIcoUrl ?>',
1294
+ favicon32: '<?= $docsFavicon32Url ?>',
1295
+ favicon16: '<?= $docsFavicon16Url ?>',
1296
+ appleTouchIcon: '<?= $docsAppleTouchIconUrl ?>',
1297
+ logo: '<?= $docsLogoUrl ?>',
1298
+ lightboxLogo: '<?= $docsLightboxLogoUrl ?>'
1299
+ };
1300
+ window.xtendDocsRmtRuntimeModule = '/xtendrmt/rmt-runtime.esm.js?v=<?= $xtendAssetVersionAttr ?>';
1301
+ window.xtendDocsRmtDocument = <?php echo $rmtPilotDocumentJson; ?>;
1302
+ window.xtendDocsRmtPilot = {
1303
+ schema: 'xtend.docs.parsedown-rmt-pilot.v1',
1304
+ workpackage: 'ER-WP-40',
1305
+ document: './<?= htmlspecialchars($rmtPilotDocument, ENT_QUOTES, 'UTF-8') ?>',
1306
+ renderMode: 'shell-first',
1307
+ insularHydration: true,
1308
+ lazyParsedownRoutes: true,
1309
+ skeletonLoader: 'xtend.loader.skeleton-loader.v1',
1310
+ shellTemplate: 'docs.app.shell',
1311
+ searchTemplate: 'docs.header.search',
1312
+ adapter: 'docs.parsedown',
1313
+ component: 'docs.page',
1314
+ shellSchedule: 'docs.shell.render',
1315
+ parseSchedule: 'docs.markdown.parse',
1316
+ routeSchedule: 'docs.route.render',
1317
+ hydrateSchedule: 'docs.page.hydrate',
1318
+ syntaxSchedule: 'docs.syntax.highlight',
1319
+ searchSchedule: 'docs.search.index',
1320
+ richContentSchedule: 'docs.rich-content.prepare',
1321
+ mediaSchedule: 'docs.media.lazy',
1322
+ shellEndpoint: 'xtendrmt.shell.render',
1323
+ parseEndpoint: 'xtendrmt.docs.parsedown.parse',
1324
+ searchEndpoint: 'xtendrmt.docs.search.index',
1325
+ richContentEndpoint: 'xtendrmt.docs.rich-content.prepare',
1326
+ mediaEndpoint: 'xtendrmt.docs.media.lazy',
1327
+ fabricRuntime: {
1328
+ schema: 'xtend.docs.fabric-runtime.v1',
1329
+ runtime: 'docs/utils/fabric-runtime.js',
1330
+ rmtBridgeModule: '/xtendrmt/rmt-runtime.esm.js?v=<?= $xtendAssetVersionAttr ?>',
1331
+ api: 'xtend.fabric.api.v1',
1332
+ bridge: 'xtend.fabric.runtime-diagnostics-bridge.v1',
1333
+ telemetrySnapshot: 'xtend.fabric.telemetry-snapshot.v1',
1334
+ rmtTelemetryBridge: 'xtend.rmt.state-scheduler-diagnostics-bridge.v1',
1335
+ diagnosticsSchedule: 'docs.diagnostics.snapshot',
1336
+ snapshotStateKey: 'xtend.docs.fabric.snapshot'
1337
+ },
1338
+ markupClass: 'parsedownHtml',
1339
+ trustBoundary: 'xtend.security.sanitizing-boundary.v1',
1340
+ trustedDomProofSchema: 'xtend.epic13.trusted-dom-boundary.v1',
1341
+ trustedDomSanitizer: 'xtend.security.trusted-dom-sanitizer.v1',
1342
+ kernelBoundary: 'Parsedown, PHP execution and Sanitizing stay in the Docs host adapter.',
1343
+ futureContentKinds: ['richHtml', 'xplayerTutorial']
1344
+ };
1345
+ window.xtendDocsRmtProductionHardening = {
1346
+ schema: 'xtend.epic13.docs-rmt-production-hardening.v1',
1347
+ workpackage: 'WP-E13-10',
1348
+ status: 'accepted-docs-rmt-production-hardening',
1349
+ document: './<?= htmlspecialchars($rmtPilotDocument, ENT_QUOTES, 'UTF-8') ?>',
1350
+ renderSchema: 'xtend.epic13.docs-rmt-production-hardening.v1',
1351
+ shellTemplate: 'docs.app.shell',
1352
+ searchTemplate: 'docs.header.search',
1353
+ shellFirst: true,
1354
+ insularHydration: true,
1355
+ parsedownOrchestrated: true,
1356
+ parsedownEmbeddedInRmtKernel: false,
1357
+ richHtmlSchedulable: true,
1358
+ xplayerTutorialSchedulable: true,
1359
+ diagnosticsSchedule: 'docs.diagnostics.snapshot',
1360
+ diagnosticsEndpoint: 'xtendrmt.diagnostics.snapshot',
1361
+ fabricRuntime: {
1362
+ schema: 'xtend.docs.fabric-runtime.v1',
1363
+ runtime: 'docs/utils/fabric-runtime.js',
1364
+ rmtBridgeModule: '/xtendrmt/rmt-runtime.esm.js?v=<?= $xtendAssetVersionAttr ?>',
1365
+ telemetrySnapshot: 'xtend.fabric.telemetry-snapshot.v1',
1366
+ rmtTelemetryBridge: 'xtend.rmt.state-scheduler-diagnostics-bridge.v1',
1367
+ bridge: 'xtend.fabric.runtime-diagnostics-bridge.v1'
1368
+ },
1369
+ trustBoundary: 'xtend.security.sanitizing-boundary.v1',
1370
+ trustedDomProofSchema: 'xtend.epic13.trusted-dom-boundary.v1',
1371
+ trustedDomSanitizer: 'xtend.security.trusted-dom-sanitizer.v1',
1372
+ kernelBoundary: 'Parsedown, PHP execution and Sanitizing stay in the Docs host adapter.',
1373
+ extensionSlots: ['docs.slot.content', 'docs.slot.sidebar', 'docs.slot.related', 'docs.slot.component-demo', 'docs.slot.rich-content', 'docs.slot.media', 'docs.slot.diagnostics'],
1374
+ localGate: 'node scripts/run_xtend_tests.js epic13-docs-rmt-production-hardening --json',
1375
+ nextWorkpackage: 'WP-E13-13',
1376
+ nextDecision: 'rc1-gate-matrix-ci-handoff'
1377
+ };
1378
+ window.xtendDocsTrustedDomBoundaryProof = {
1379
+ schema: 'xtend.epic13.trusted-dom-boundary.v1',
1380
+ workpackage: 'WP-E13-11',
1381
+ status: 'accepted-trusted-dom-boundary-browser-proof',
1382
+ sanitizer: 'xtend.security.trusted-dom-sanitizer.v1',
1383
+ trustBoundary: 'xtend.security.sanitizing-boundary.v1',
1384
+ sourceMarkupClasses: ['parsedownHtml', 'htmlFragment'],
1385
+ blockedVectors: ['script', 'inline-event-handler', 'javascript-url', 'srcdoc'],
1386
+ fixture: 'tests/browser/fixtures/epic13-trusted-dom-boundary-smoke.html',
1387
+ localGate: 'node scripts/run_xtend_tests.js epic13-trusted-dom-boundary --json',
1388
+ nextWorkpackage: 'WP-E13-13',
1389
+ nextDecision: 'rc1-gate-matrix-ci-handoff'
1390
+ };
1391
+ </script>
1392
+ <script src="/docs/utils/fabric-runtime.js?v=<?= $xtendAssetVersionAttr ?>" nonce="<?= $nonce ?>"></script>
1393
+ </head>
1394
+ <body xt-ui-effects="none">
1395
+ <x-theme></x-theme>
1396
+ <x-header src="<?= $docsLogoUrl ?>" logo-size="48" sticky data-xtend-skeleton style="--xtend-skeleton-min-height: 4.75rem;">
1397
+ <span slot="title">XTend Dokumentation</span>
1398
+ <x-button
1399
+ id="theme-toggle"
1400
+ class="docs-icon-button docs-theme-toggle"
1401
+ slot="actions"
1402
+ type="button"
1403
+ variant="secondary"
1404
+ aria-label="Dunkelmodus aktivieren"
1405
+ title="Dunkelmodus aktivieren"
1406
+ aria-pressed="false"
1407
+ >
1408
+ <x-icon id="theme-toggle-icon" name="moon" pack="core" decorative size="1.1rem"></x-icon>
1409
+ <span id="theme-toggle-label" class="docs-visually-hidden">Dunkelmodus aktivieren</span>
1410
+ </x-button>
1411
+ <?php foreach ($fileToSlug as $rel => $slug): ?>
1412
+ <x-link class="docs-nav-link" slot="nav" href="/<?= $slug ?>" <?= $page === $slug ? 'active' : '' ?>>
1413
+ <x-icon class="docs-nav-link-icon" name="<?= htmlspecialchars(docsMenuIconForSlug($slug), ENT_QUOTES, 'UTF-8') ?>" decorative size="1rem"></x-icon>
1414
+ <span class="docs-nav-link-label"><?= htmlspecialchars(ucfirst(preg_replace('/[-_]/', ' ', preg_replace('/\.md$/i', '', basename($rel))))) ?></span>
1415
+ </x-link>
1416
+ <?php endforeach; ?>
1417
+ </x-header>
1418
+ <x-hero
1419
+ class="docs-hero"
1420
+ data-xtend-skeleton
1421
+ style="--xtend-skeleton-min-height: clamp(12rem, 30vw, 22rem);"
1422
+ background-light="var(--docs-hero-bg-light)"
1423
+ background-dark="var(--docs-hero-bg-dark)"
1424
+ font-color-light="var(--docs-hero-text-light)"
1425
+ font-color-dark="var(--docs-hero-text-dark)"
1426
+ overlay-light="rgba(255, 255, 255, 0.16)"
1427
+ overlay-dark="rgba(0, 0, 0, 0.28)"
1428
+ align="block"
1429
+ overlay
1430
+ animate
1431
+ vertical-align="top"
1432
+ >
1433
+ <h1>XTend Developer Center</h1>
1434
+ <p>Build with XTend today</p>
1435
+ </x-hero>
1436
+ <main>
1437
+ <x-router mode="hash" reuse-component skeleton="article" skeleton-lines="10" skeleton-min-height="26rem" skeleton-label="Dokumentation wird geladen" data-xtend-skeleton style="--xtend-skeleton-min-height: 26rem; --xtend-skeleton-width: calc(100% - var(--docs-viewport-gutter) - var(--docs-viewport-gutter)); --xtend-skeleton-max-width: calc(100% - var(--docs-viewport-gutter) - var(--docs-viewport-gutter)); --xtend-skeleton-margin-inline: var(--docs-viewport-gutter);" document-title-template="{{title}} | XTend Dokumentation" default-title="XTend Dokumentation">
1438
+ <?= docsRenderXRoute($allPagesMeta['readme']['route'], '/') . "\n" ?>
1439
+ <?php foreach ($fileToSlug as $rel => $slug): ?>
1440
+ <?= docsRenderXRoute($allPagesMeta[$slug]['route']) . "\n" ?>
1441
+ <?php endforeach; ?>
1442
+ <x-route path="*" component="xtend-doc-page" import="/docs/utils/pageloader.js?v=<?= $xtendAssetVersionAttr ?>" title="Seite nicht gefunden" document-title="Seite nicht gefunden | XTend Dokumentation" meta-description="Die angeforderte Dokumentationsseite wurde nicht gefunden." skeleton="article" skeleton-lines="8" skeleton-min-height="20rem" hydrate-schedule="docs.page.hydrate" data-rmt-route-id="docs.notFound" data-rmt-router="xtend.xrouter" data-rmt-component="docs.page" data-rmt-schedule="docs.route.render" data-rmt-hydrate-schedule="docs.page.hydrate"></x-route>
1443
+ </x-router>
1444
+ </main>
1445
+ <x-footer src="<?= $docsLogoUrl ?>" logo-size="32" data-xtend-skeleton="inline" style="--xtend-skeleton-min-height: 3.25rem;">
1446
+ <span slot="title">© 2026 – CCS Networks | Powered by XRouter PHP Extension</span>
1447
+ </x-footer>
1448
+ <script src="/docs/utils/pageloader.js?v=<?= $xtendAssetVersionAttr ?>" nonce="<?= $nonce ?>">
1449
+ </script>
1450
+ <script nonce="<?= $nonce ?>">
1451
+ document.addEventListener('DOMContentLoaded', function() {
1452
+ // Theme-Button-Logik
1453
+ const btn = document.getElementById('theme-toggle');
1454
+ const label = document.getElementById('theme-toggle-label');
1455
+ const icon = document.getElementById('theme-toggle-icon');
1456
+ function updateThemeButton() {
1457
+ if (!btn || !label) return;
1458
+ const theme = document.documentElement.getAttribute('data-theme');
1459
+ if (theme === 'dark') {
1460
+ label.textContent = 'Hellmodus aktivieren';
1461
+ btn.setAttribute('aria-label', 'Hellmodus aktivieren');
1462
+ btn.setAttribute('title', 'Hellmodus aktivieren');
1463
+ btn.setAttribute('aria-pressed', 'true');
1464
+ if (icon) icon.setAttribute('name', 'sun');
1465
+ } else {
1466
+ label.textContent = 'Dunkelmodus aktivieren';
1467
+ btn.setAttribute('aria-label', 'Dunkelmodus aktivieren');
1468
+ btn.setAttribute('title', 'Dunkelmodus aktivieren');
1469
+ btn.setAttribute('aria-pressed', 'false');
1470
+ if (icon) icon.setAttribute('name', 'moon');
1471
+ }
1472
+ }
1473
+ if (btn) {
1474
+ btn.addEventListener('button-interaction', function() {
1475
+ if (window.XTend && window.XTend.theme) {
1476
+ window.XTend.theme.toggleDarkMode();
1477
+ }
1478
+ });
1479
+ }
1480
+ // Theme-Status beim Seitenaufruf und bei Theme-Wechseln immer korrekt setzen
1481
+ updateThemeButton();
1482
+ document.addEventListener('theme-changed', updateThemeButton);
1483
+ document.addEventListener('theme-initialized', updateThemeButton);
1484
+ // Standardfarben für beide Themes setzen
1485
+ if (window.XTend && window.XTend.theme) {
1486
+ window.XTend.theme.setTheme('light');
1487
+ window.XTend.theme.set('--body-bg', '#f9f9f9');
1488
+ window.XTend.theme.set('--background-color', '#f9f9f9');
1489
+ window.XTend.theme.set('--primary-color', '#0e4e81');
1490
+ window.XTend.theme.set('--text-color', '#222');
1491
+ window.XTend.theme.set('--muted-text-color', '#5f6f82');
1492
+ window.XTend.theme.set('--surface-muted', '#edf2f7');
1493
+ window.XTend.theme.set('--border-color', 'rgba(15, 23, 42, 0.14)');
1494
+ window.XTend.theme.set('--xtend-surface', '#ffffff');
1495
+ window.XTend.theme.set('--xtend-surface-muted', '#f7fafc');
1496
+ window.XTend.theme.set('--xtend-text', '#1f2937');
1497
+ window.XTend.theme.set('--xtend-border-color', 'rgba(15, 23, 42, 0.14)');
1498
+ window.XTend.theme.set('--xtend-overlay-bg', 'rgba(15, 23, 42, 0.52)');
1499
+ window.XTend.theme.set('--docs-header-bg', '#ffffff');
1500
+ window.XTend.theme.set('--docs-header-menu-bg', '#ffffff');
1501
+ window.XTend.theme.set('--docs-header-fg', '#1f2937');
1502
+ window.XTend.theme.set('--docs-sidebar-bg', '#ffffff');
1503
+ window.XTend.theme.set('--docs-sidebar-link-bg', '#f7fafc');
1504
+ window.XTend.theme.set('--docs-sidebar-link-hover-bg', '#e7f0f7');
1505
+ window.XTend.theme.set('--docs-code-bg', '#10131a');
1506
+ window.XTend.theme.set('--x-code-bg', '#10131a');
1507
+ window.XTend.theme.set('--x-code-text', '#f8fafc');
1508
+ window.XTend.theme.set('--x-code-border', 'rgba(15, 23, 42, 0.18)');
1509
+ window.XTend.theme.set('--footer-bg', '#f9f9f9');
1510
+ window.XTend.theme.set('--section-bg', '#fff');
1511
+ window.XTend.theme.set('--active-tab-color', '#0e4e81');
1512
+ window.XTend.theme.set('--tab-bg', '#f5f5f5');
1513
+ window.XTend.theme.set('--tab-text', '#222');
1514
+ window.XTend.theme.set('--input-bg', '#fff');
1515
+ window.XTend.theme.set('--input-bg-dark', '#0f0f12');
1516
+ window.XTend.theme.set('--input-placeholder-color-dark', '#b8c4d4');
1517
+ window.XTend.theme.set('--form-background', 'transparent');
1518
+ window.XTend.theme.set('--docs-hero-bg-light', 'linear-gradient(135deg, #f8fbff 0%, #e7f0f7 100%)');
1519
+ window.XTend.theme.set('--docs-hero-text-light', '#162033');
1520
+ // Dark Mode
1521
+ window.XTend.theme.registerTheme('dark', {
1522
+ '--body-bg': '#050506',
1523
+ '--background-color': '#050506',
1524
+ '--primary-color': '#8fd3ff',
1525
+ '--text-color': '#f4f4f5',
1526
+ '--muted-text-color': '#a1a1aa',
1527
+ '--surface-muted': '#111113',
1528
+ '--border-color': 'rgba(255, 255, 255, 0.13)',
1529
+ '--xtend-surface': '#0b0b0d',
1530
+ '--xtend-surface-muted': '#111113',
1531
+ '--xtend-text': '#f4f4f5',
1532
+ '--xtend-border-color': 'rgba(255, 255, 255, 0.13)',
1533
+ '--xtend-overlay-bg': 'rgba(0, 0, 0, 0.72)',
1534
+ '--docs-header-bg': '#050506',
1535
+ '--docs-header-menu-bg': '#09090b',
1536
+ '--docs-header-fg': '#f4f4f5',
1537
+ '--docs-sidebar-bg': '#0d0d10',
1538
+ '--docs-sidebar-link-bg': '#111114',
1539
+ '--docs-sidebar-link-hover-bg': '#17171b',
1540
+ '--docs-code-bg': '#050506',
1541
+ '--x-code-bg': '#050506',
1542
+ '--x-code-text': '#f4f4f5',
1543
+ '--x-code-border': 'rgba(255, 255, 255, 0.16)',
1544
+ '--footer-bg': '#050506',
1545
+ '--section-bg': '#0b0b0d',
1546
+ '--active-tab-color': '#8fd3ff',
1547
+ '--tab-bg': '#111114',
1548
+ '--tab-text': '#f4f4f5',
1549
+ '--input-bg': '#0f0f12',
1550
+ '--input-bg-dark': '#0f0f12',
1551
+ '--input-placeholder-color-dark': '#a1a1aa',
1552
+ '--form-background': 'transparent',
1553
+ '--docs-hero-bg-dark': '#050506',
1554
+ '--docs-hero-text-dark': '#f8fafc'
1555
+ });
1556
+ }
1557
+ updateThemeButton();
1558
+ function checkDocsViewportOverflow() {
1559
+ const root = document.documentElement;
1560
+ const body = document.body;
1561
+ const clientWidth = root ? root.clientWidth : window.innerWidth;
1562
+ const scrollWidth = Math.max(
1563
+ root ? root.scrollWidth : 0,
1564
+ body ? body.scrollWidth : 0
1565
+ );
1566
+ const overflowX = Math.max(0, scrollWidth - clientWidth);
1567
+ const snapshot = {
1568
+ schema: 'xtend.docs.viewport-overflow.v1',
1569
+ viewport: window.matchMedia('(max-width: 700px)').matches ? 'mobile' : 'wide',
1570
+ clientWidth,
1571
+ scrollWidth,
1572
+ overflowX,
1573
+ viewportSafe: overflowX <= 1
1574
+ };
1575
+ window.xtendDocsViewportOverflow = snapshot;
1576
+ if (root) {
1577
+ root.toggleAttribute('data-xtend-viewport-overflow', !snapshot.viewportSafe);
1578
+ }
1579
+ window.dispatchEvent(new CustomEvent('xtend-docs-viewport-overflow-check', { detail: snapshot }));
1580
+ return snapshot;
1581
+ }
1582
+ window.xtendDocsCheckViewportOverflow = checkDocsViewportOverflow;
1583
+ window.addEventListener('resize', function() {
1584
+ requestAnimationFrame(checkDocsViewportOverflow);
1585
+ }, { passive: true });
1586
+ // Prism wird scoped und idle ausgefuehrt, damit Routen-Klicks nicht die ganze Seite blockieren.
1587
+ let prismFrame = 0;
1588
+ let prismIdle = 0;
1589
+ function schedulePrismHighlight(root) {
1590
+ const scope = root && root.querySelectorAll ? root : document;
1591
+ const run = () => {
1592
+ if (!window.Prism) return;
1593
+ if (typeof Prism.highlightAllUnder === 'function') {
1594
+ Prism.highlightAllUnder(scope);
1595
+ return;
1596
+ }
1597
+ if (typeof Prism.highlightElement === 'function') {
1598
+ scope.querySelectorAll('pre code, code[class*="language-"]').forEach((node) => Prism.highlightElement(node));
1599
+ }
1600
+ };
1601
+ if (prismFrame) cancelAnimationFrame(prismFrame);
1602
+ if (prismIdle && typeof cancelIdleCallback === 'function') cancelIdleCallback(prismIdle);
1603
+ prismFrame = requestAnimationFrame(() => {
1604
+ prismFrame = 0;
1605
+ if (typeof requestIdleCallback === 'function') {
1606
+ prismIdle = requestIdleCallback(() => {
1607
+ prismIdle = 0;
1608
+ run();
1609
+ }, { timeout: 700 });
1610
+ } else {
1611
+ setTimeout(run, 0);
1612
+ }
1613
+ });
1614
+ }
1615
+ window.xtendDocsHighlightPrism = schedulePrismHighlight;
1616
+ window.addEventListener('xtend-docs-content-ready', function(event) {
1617
+ schedulePrismHighlight(event.detail && event.detail.root);
1618
+ requestAnimationFrame(checkDocsViewportOverflow);
1619
+ });
1620
+ requestAnimationFrame(checkDocsViewportOverflow);
1621
+ schedulePrismHighlight(document);
1622
+ });
1623
+ </script>
1624
+ </body>
1625
+ </html>