@ccslabs/xtend 0.1.0-rc.1 → 0.1.2

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 (566) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +4 -0
  3. package/catalog/component-catalog-coverage.js +2 -0
  4. package/catalog/epic13-package-export-lock.js +11 -1
  5. package/catalog/epic13-rmt-production-readiness.js +0 -1
  6. package/catalog/epic18-rmt-action-effect-runtime.d.ts +36 -0
  7. package/catalog/epic18-rmt-action-effect-runtime.js +249 -0
  8. package/catalog/epic18-rmt-app-platform-authoring.d.ts +39 -0
  9. package/catalog/epic18-rmt-app-platform-authoring.js +319 -0
  10. package/catalog/epic18-rmt-app-platform-fixture.d.ts +33 -0
  11. package/catalog/epic18-rmt-app-platform-fixture.js +221 -0
  12. package/catalog/epic18-rmt-app-platform-release-handoff.d.ts +30 -0
  13. package/catalog/epic18-rmt-app-platform-release-handoff.js +231 -0
  14. package/catalog/epic18-rmt-app-platform-tooling.d.ts +38 -0
  15. package/catalog/epic18-rmt-app-platform-tooling.js +242 -0
  16. package/catalog/epic18-rmt-component-template-primitives.d.ts +33 -0
  17. package/catalog/epic18-rmt-component-template-primitives.js +240 -0
  18. package/catalog/epic18-rmt-dom-descriptor-renderer.d.ts +35 -0
  19. package/catalog/epic18-rmt-dom-descriptor-renderer.js +232 -0
  20. package/catalog/epic18-rmt-event-routing-runtime.d.ts +35 -0
  21. package/catalog/epic18-rmt-event-routing-runtime.js +234 -0
  22. package/catalog/epic18-rmt-state-selector-runtime.d.ts +34 -0
  23. package/catalog/epic18-rmt-state-selector-runtime.js +216 -0
  24. package/catalog/epic18-rmt-surface-resource-graph-runtime.d.ts +36 -0
  25. package/catalog/epic18-rmt-surface-resource-graph-runtime.js +256 -0
  26. package/catalog/surface-manager-controller.js +5 -1
  27. package/catalog/surface-manager-materialization.js +7 -1
  28. package/catalog/surface-manager-overlay-bridge.js +41 -6
  29. package/catalog/surface-manager-workbench-fixture.js +1 -1
  30. package/catalog/surface-type-capability-matrix.d.ts +61 -0
  31. package/catalog/surface-type-capability-matrix.js +183 -0
  32. package/catalog/type-exports-rmt.js +37 -1
  33. package/catalog/type-exports.js +3 -3
  34. package/components/icon-packs/lucide.js +4 -0
  35. package/components/manifest.json +2 -0
  36. package/components/prism-rmt.d.ts +34 -0
  37. package/components/prism-rmt.js +130 -0
  38. package/components/xcards.js +15 -0
  39. package/components/xcode.d.ts +36 -1
  40. package/components/xcode.js +215 -20
  41. package/components/xfooter.js +17 -0
  42. package/components/xheader.js +14 -0
  43. package/components/xhero.js +16 -1
  44. package/components/xlink.js +97 -14
  45. package/components/xmasonry.js +15 -0
  46. package/components/xplayer.d.ts +44 -2
  47. package/components/xplayer.js +242 -15
  48. package/components/xrouter.js +27 -2
  49. package/components/xsection.js +15 -0
  50. package/components/xsidepanel.js +10 -2
  51. package/components/xsurfacemanager-controller.d.ts +2 -1
  52. package/components/xsurfacemanager-controller.js +27 -3
  53. package/components/xsurfacemanager.d.ts +2 -0
  54. package/components/xsurfacemanager.js +20 -8
  55. package/components/xsurfaceoverlay-bridge.d.ts +20 -5
  56. package/components/xsurfaceoverlay-bridge.js +114 -18
  57. package/components/xsurfaceportal.d.ts +29 -0
  58. package/components/xsurfaceportal.js +122 -0
  59. package/components/xsurfaceregion.d.ts +50 -0
  60. package/components/xsurfaceregion.js +285 -0
  61. package/components/xsurfacewindow.js +2 -1
  62. package/components/xtooltip.js +89 -23
  63. package/docs/README.md +222 -298
  64. package/docs/changelog.md +107 -0
  65. package/docs/component-catalog-coverage.md +9 -9
  66. package/docs/component-platform.md +19 -1
  67. package/docs/component-ux-app-authoring.md +56 -63
  68. package/docs/components/xcode.md +83 -53
  69. package/docs/components/xsurfaceportal.md +32 -0
  70. package/docs/components/xsurfaceregion.md +37 -0
  71. package/docs/components.md +105 -69
  72. package/docs/de/README.md +264 -0
  73. package/docs/de/XTend-ADR.md +221 -0
  74. package/docs/de/a11y-keyboard-smokes.md +62 -0
  75. package/docs/de/about.md +18 -0
  76. package/docs/de/api.md +157 -0
  77. package/docs/de/best-practices.md +76 -0
  78. package/docs/de/changelog.md +107 -0
  79. package/docs/de/component-catalog-coverage.md +58 -0
  80. package/docs/de/component-lab.md +103 -0
  81. package/docs/de/component-long-tail-migration.md +41 -0
  82. package/docs/de/component-platform.md +177 -0
  83. package/docs/de/component-ux-app-authoring.md +123 -0
  84. package/docs/de/component-ux-authoring.md +96 -0
  85. package/docs/de/component-ux-gates.md +45 -0
  86. package/docs/de/components/x-rmt-lifecycle-demo-build.md +60 -0
  87. package/docs/de/components/xalert.md +81 -0
  88. package/docs/de/components/xbutton.md +103 -0
  89. package/docs/de/components/xcalendar.md +82 -0
  90. package/docs/de/components/xcards.md +128 -0
  91. package/docs/de/components/xcheckbox.md +102 -0
  92. package/docs/de/components/xcode.md +156 -0
  93. package/docs/de/components/xdialog.md +92 -0
  94. package/docs/de/components/xdrawer.md +84 -0
  95. package/docs/de/components/xfooter.md +126 -0
  96. package/docs/de/components/xform.md +128 -0
  97. package/docs/de/components/xheader.md +308 -0
  98. package/docs/de/components/xhero.md +142 -0
  99. package/docs/de/components/xicon.md +125 -0
  100. package/docs/de/components/xinput.md +129 -0
  101. package/docs/de/components/xlightbox.md +98 -0
  102. package/docs/de/components/xlink.md +109 -0
  103. package/docs/de/components/xmasonry.md +124 -0
  104. package/docs/de/components/xmenu.md +158 -0
  105. package/docs/de/components/xmodal.md +82 -0
  106. package/docs/de/components/xplayer.md +104 -0
  107. package/docs/de/components/xpopover.md +67 -0
  108. package/docs/de/components/xprogress.md +56 -0
  109. package/docs/de/components/xradio.md +103 -0
  110. package/docs/de/components/xrouter.md +260 -0
  111. package/docs/de/components/xsection.md +125 -0
  112. package/docs/de/components/xselect.md +105 -0
  113. package/docs/de/components/xsidepanel.md +30 -0
  114. package/docs/de/components/xspinner.md +102 -0
  115. package/docs/de/components/xstate.md +148 -0
  116. package/docs/de/components/xstatus.md +55 -0
  117. package/docs/de/components/xsummary.md +78 -0
  118. package/docs/de/components/xsurfacemanager.md +27 -0
  119. package/docs/de/components/xsurfacewindow.md +21 -0
  120. package/docs/de/components/xtabs.md +160 -0
  121. package/docs/de/components/xtextarea.md +98 -0
  122. package/docs/de/components/xtheme.md +167 -0
  123. package/docs/de/components/xtoast.md +62 -0
  124. package/docs/de/components/xtooltip.md +66 -0
  125. package/docs/de/components/xtype.md +82 -0
  126. package/docs/de/components/xutils.md +144 -0
  127. package/docs/de/components/xwriter.md +94 -0
  128. package/docs/de/components.md +153 -0
  129. package/docs/de/conditional-network-evidence-ci.md +38 -0
  130. package/docs/de/conditional-network-evidence.md +50 -0
  131. package/docs/de/core-migration-guide.md +110 -0
  132. package/docs/de/design-tokens.md +116 -0
  133. package/docs/de/docs-rmt-production-hardening.md +31 -0
  134. package/docs/de/enterprise-adoption.md +413 -0
  135. package/docs/de/enterprise-component-flex-release-handoff.md +129 -0
  136. package/docs/de/epic10-platform-gates.md +62 -0
  137. package/docs/de/epic10-release-handoff.md +81 -0
  138. package/docs/de/epic11-enterprise-ux-handoff.md +70 -0
  139. package/docs/de/epic12-rc0-handoff.md +61 -0
  140. package/docs/de/epic18-media-manager-vendor-upstream.md +318 -0
  141. package/docs/de/epic18-rmt-app-platform-release-handoff.md +67 -0
  142. package/docs/de/epic18-vendor-bugfixes.md +34 -0
  143. package/docs/de/existing-component-metadata.md +67 -0
  144. package/docs/de/hydration-performance-closure.md +34 -0
  145. package/docs/de/hydration-policies.md +71 -0
  146. package/docs/de/known-residual-triage.md +22 -0
  147. package/docs/de/manifest-import-policy.md +79 -0
  148. package/docs/de/manifest.md +112 -0
  149. package/docs/de/motion-contrast.md +67 -0
  150. package/docs/de/package-export-lock.md +44 -0
  151. package/docs/de/performance-measurements.md +106 -0
  152. package/docs/de/performance-regression.md +89 -0
  153. package/docs/de/performance.md +94 -0
  154. package/docs/de/previews/README.md +17 -0
  155. package/docs/de/prod-browser-csp-smokes.md +40 -0
  156. package/docs/de/public-component-types.md +79 -0
  157. package/docs/de/quick-start-guide.md +220 -0
  158. package/docs/de/rc0-adoption-guide.md +102 -0
  159. package/docs/de/rc0-gate-matrix.md +58 -0
  160. package/docs/de/rc1-gate-matrix-ci-handoff.md +56 -0
  161. package/docs/de/rc1-migration-notes.md +69 -0
  162. package/docs/de/rc1-readiness.md +46 -0
  163. package/docs/de/release-owner-acceptance.md +56 -0
  164. package/docs/de/release-report-pack-dry-run-evidence.md +39 -0
  165. package/docs/de/rmt-action-effect-runtime.md +81 -0
  166. package/docs/de/rmt-app-platform-authoring.md +54 -0
  167. package/docs/de/rmt-app-platform-fixture.md +46 -0
  168. package/docs/de/rmt-app-platform-migration-guide.md +88 -0
  169. package/docs/de/rmt-app-platform-tooling.md +79 -0
  170. package/docs/de/rmt-component-template-primitives.md +57 -0
  171. package/docs/de/rmt-dom-descriptor-renderer.md +64 -0
  172. package/docs/de/rmt-dsl-authoring-polish.md +145 -0
  173. package/docs/de/rmt-event-routing-runtime.md +81 -0
  174. package/docs/de/rmt-first-demo-app.md +77 -0
  175. package/docs/de/rmt-first-xtend-apps.md +129 -0
  176. package/docs/de/rmt-kernel-panic-recovery-incident-handoff.md +61 -0
  177. package/docs/de/rmt-kernel-security-hardening-migration.md +50 -0
  178. package/docs/de/rmt-kernel-trusted-output-authoring.md +69 -0
  179. package/docs/de/rmt-language-server.md +234 -0
  180. package/docs/de/rmt-lifecycle-demo.md +24 -0
  181. package/docs/de/rmt-linter.md +140 -0
  182. package/docs/de/rmt-node-ssr-adapter.md +100 -0
  183. package/docs/de/rmt-php-ssr-adapter.md +120 -0
  184. package/docs/de/rmt-production-readiness.md +63 -0
  185. package/docs/de/rmt-state-selector-runtime.md +47 -0
  186. package/docs/de/rmt-surface-resource-graph-runtime.md +92 -0
  187. package/docs/de/rmt-tooling-release-gates.md +77 -0
  188. package/docs/de/rmt-vnext-authoring.md +170 -0
  189. package/docs/de/rmt-vnext-component-primitives.md +188 -0
  190. package/docs/de/rmt-vnext-cross-surface-events.md +68 -0
  191. package/docs/de/rmt-vnext-enterprise-mfe-handoff.md +70 -0
  192. package/docs/de/rmt-vnext-fabric-bridge-evidence.md +81 -0
  193. package/docs/de/rmt-vnext-migration-notes.md +62 -0
  194. package/docs/de/rmt-vnext-primitive-authoring-tooling.md +247 -0
  195. package/docs/de/rmt-vnext-primitive-grammar-design.md +289 -0
  196. package/docs/de/rmt-vnext-primitive-lowering.md +108 -0
  197. package/docs/de/rmt-vnext-primitive-migration.md +119 -0
  198. package/docs/de/rmt-vnext-primitive-parser-ast.md +76 -0
  199. package/docs/de/rmt-vnext-primitive-semantic-graph.md +118 -0
  200. package/docs/de/rmt-vnext-primitives-compiler-backlog.md +739 -0
  201. package/docs/de/rmt-vnext-release-handoff.md +83 -0
  202. package/docs/de/rmt-vnext-remote-surfaces.md +90 -0
  203. package/docs/de/rmt-vnext-source-to-sea-gate.md +612 -0
  204. package/docs/de/rmt-vnext-surface-registry-enterprise.md +76 -0
  205. package/docs/de/screenreader-signals.md +56 -0
  206. package/docs/de/supply-chain-gates.md +100 -0
  207. package/docs/de/surface-manager-authoring-guide.md +94 -0
  208. package/docs/de/surface-manager-browser-lab.md +45 -0
  209. package/docs/de/surface-manager-component-lab.md +43 -0
  210. package/docs/de/surface-manager-controller.md +66 -0
  211. package/docs/de/surface-manager-layout-engines.md +32 -0
  212. package/docs/de/surface-manager-lazy-hydration.md +63 -0
  213. package/docs/de/surface-manager-migration-guide.md +122 -0
  214. package/docs/de/surface-manager-native-rmt-surfaces.md +38 -0
  215. package/docs/de/surface-manager-overlay-bridge.md +53 -0
  216. package/docs/de/surface-manager-persistence.md +30 -0
  217. package/docs/de/surface-manager-quality-gates.md +51 -0
  218. package/docs/de/surface-manager-release-handoff.md +68 -0
  219. package/docs/de/surface-manager-remote-policy.md +54 -0
  220. package/docs/de/surface-manager-rmt-authoring.md +102 -0
  221. package/docs/de/surface-manager-route-lifecycle.md +59 -0
  222. package/docs/de/surface-manager-runtime-release-handoff.md +69 -0
  223. package/docs/de/surface-manager-side-panel-runtime.md +36 -0
  224. package/docs/de/surface-manager-stack-policy.md +39 -0
  225. package/docs/de/surface-manager-window-runtime.md +47 -0
  226. package/docs/de/surface-manager-workbench-fixture.md +43 -0
  227. package/docs/de/third-party-design-authoring.md +406 -0
  228. package/docs/de/trusted-dom-boundary-browser-proof.md +32 -0
  229. package/docs/de/trusted-dom-sanitizing.md +110 -0
  230. package/docs/de/type-exports.md +61 -0
  231. package/docs/de/typescript-components.md +63 -0
  232. package/docs/de/visual-browser-regression.md +83 -0
  233. package/docs/de/visual-owner-artifacts.md +46 -0
  234. package/docs/de/visual-snapshot-automation.md +87 -0
  235. package/docs/de/xtend-api-types.md +55 -0
  236. package/docs/de/xtend-builder-types.md +55 -0
  237. package/docs/de/xtend-catalog-types.md +44 -0
  238. package/docs/de/xtend-fabric-rmt-lane-mapping.md +143 -0
  239. package/docs/de/xtend-fabric.md +474 -0
  240. package/docs/de/xtend-loader-types.md +58 -0
  241. package/docs/de/xtend-loader.md +265 -0
  242. package/docs/de/xtend-policy-types.md +38 -0
  243. package/docs/de/xtend-rmt-types.md +40 -0
  244. package/docs/de/xtend-vendor-types.md +36 -0
  245. package/docs/de/xtendrmt-app-dsl.md +334 -0
  246. package/docs/de/xtendrmt-migration-guide.md +266 -0
  247. package/docs/de/xtendrmt-native-authoring.md +333 -0
  248. package/docs/de/xtendrmt-overview.md +109 -0
  249. package/docs/de/xtendrmt-parsedown-scheduling.md +301 -0
  250. package/docs/de/xtendrmt-runtime-bridge.md +155 -0
  251. package/docs/en/README.md +163 -0
  252. package/docs/en/XTend-ADR.md +221 -0
  253. package/docs/en/a11y-keyboard-smokes.md +68 -0
  254. package/docs/en/about.md +25 -0
  255. package/docs/en/api.md +171 -0
  256. package/docs/en/best-practices.md +125 -0
  257. package/docs/en/changelog.md +104 -0
  258. package/docs/en/component-catalog-coverage.md +104 -0
  259. package/docs/en/component-lab.md +103 -0
  260. package/docs/en/component-long-tail-migration.md +41 -0
  261. package/docs/en/component-platform.md +243 -0
  262. package/docs/en/component-ux-app-authoring.md +118 -0
  263. package/docs/en/component-ux-authoring.md +96 -0
  264. package/docs/en/component-ux-gates.md +45 -0
  265. package/docs/en/components/x-rmt-lifecycle-demo-build.md +75 -0
  266. package/docs/en/components/xalert.md +94 -0
  267. package/docs/en/components/xbutton.md +118 -0
  268. package/docs/en/components/xcalendar.md +95 -0
  269. package/docs/en/components/xcards.md +139 -0
  270. package/docs/en/components/xcheckbox.md +118 -0
  271. package/docs/en/components/xcode.md +153 -0
  272. package/docs/en/components/xdialog.md +108 -0
  273. package/docs/en/components/xdrawer.md +110 -0
  274. package/docs/en/components/xfooter.md +138 -0
  275. package/docs/en/components/xform.md +147 -0
  276. package/docs/en/components/xheader.md +308 -0
  277. package/docs/en/components/xhero.md +157 -0
  278. package/docs/en/components/xicon.md +149 -0
  279. package/docs/en/components/xinput.md +147 -0
  280. package/docs/en/components/xlightbox.md +113 -0
  281. package/docs/en/components/xlink.md +130 -0
  282. package/docs/en/components/xmasonry.md +136 -0
  283. package/docs/en/components/xmenu.md +185 -0
  284. package/docs/en/components/xmodal.md +102 -0
  285. package/docs/en/components/xplayer.md +114 -0
  286. package/docs/en/components/xpopover.md +87 -0
  287. package/docs/en/components/xprogress.md +73 -0
  288. package/docs/en/components/xradio.md +119 -0
  289. package/docs/en/components/xrouter.md +260 -0
  290. package/docs/en/components/xsection.md +136 -0
  291. package/docs/en/components/xselect.md +122 -0
  292. package/docs/en/components/xsidepanel.md +48 -0
  293. package/docs/en/components/xspinner.md +118 -0
  294. package/docs/en/components/xstate.md +163 -0
  295. package/docs/en/components/xstatus.md +71 -0
  296. package/docs/en/components/xsummary.md +90 -0
  297. package/docs/en/components/xsurfacemanager.md +42 -0
  298. package/docs/en/components/xsurfacewindow.md +31 -0
  299. package/docs/en/components/xtabs.md +187 -0
  300. package/docs/en/components/xtextarea.md +115 -0
  301. package/docs/en/components/xtheme.md +203 -0
  302. package/docs/en/components/xtoast.md +78 -0
  303. package/docs/en/components/xtooltip.md +85 -0
  304. package/docs/en/components/xtype.md +91 -0
  305. package/docs/en/components/xutils.md +161 -0
  306. package/docs/en/components/xwriter.md +106 -0
  307. package/docs/en/components.md +151 -0
  308. package/docs/en/conditional-network-evidence-ci.md +38 -0
  309. package/docs/en/conditional-network-evidence.md +50 -0
  310. package/docs/en/core-migration-guide.md +110 -0
  311. package/docs/en/design-tokens.md +137 -0
  312. package/docs/en/docs-rmt-production-hardening.md +31 -0
  313. package/docs/en/enterprise-adoption.md +413 -0
  314. package/docs/en/enterprise-component-flex-release-handoff.md +129 -0
  315. package/docs/en/epic10-platform-gates.md +62 -0
  316. package/docs/en/epic10-release-handoff.md +81 -0
  317. package/docs/en/epic11-enterprise-ux-handoff.md +70 -0
  318. package/docs/en/epic12-rc0-handoff.md +61 -0
  319. package/docs/en/epic18-media-manager-vendor-upstream.md +232 -0
  320. package/docs/en/epic18-rmt-app-platform-release-handoff.md +60 -0
  321. package/docs/en/epic18-vendor-bugfixes.md +29 -0
  322. package/docs/en/existing-component-metadata.md +67 -0
  323. package/docs/en/hydration-performance-closure.md +34 -0
  324. package/docs/en/hydration-policies.md +75 -0
  325. package/docs/en/known-residual-triage.md +22 -0
  326. package/docs/en/manifest-import-policy.md +81 -0
  327. package/docs/en/manifest.md +135 -0
  328. package/docs/en/motion-contrast.md +67 -0
  329. package/docs/en/package-export-lock.md +44 -0
  330. package/docs/en/performance-measurements.md +106 -0
  331. package/docs/en/performance-regression.md +89 -0
  332. package/docs/en/performance.md +132 -0
  333. package/docs/en/previews/README.md +17 -0
  334. package/docs/en/prod-browser-csp-smokes.md +40 -0
  335. package/docs/en/public-component-types.md +79 -0
  336. package/docs/en/quick-start-guide.md +189 -0
  337. package/docs/en/rc0-adoption-guide.md +102 -0
  338. package/docs/en/rc0-gate-matrix.md +58 -0
  339. package/docs/en/rc1-gate-matrix-ci-handoff.md +56 -0
  340. package/docs/en/rc1-migration-notes.md +69 -0
  341. package/docs/en/rc1-readiness.md +46 -0
  342. package/docs/en/release-owner-acceptance.md +56 -0
  343. package/docs/en/release-report-pack-dry-run-evidence.md +39 -0
  344. package/docs/en/rmt-action-effect-runtime.md +101 -0
  345. package/docs/en/rmt-app-platform-authoring.md +47 -0
  346. package/docs/en/rmt-app-platform-fixture.md +35 -0
  347. package/docs/en/rmt-app-platform-migration-guide.md +75 -0
  348. package/docs/en/rmt-app-platform-tooling.md +58 -0
  349. package/docs/en/rmt-component-template-primitives.md +49 -0
  350. package/docs/en/rmt-dom-descriptor-renderer.md +54 -0
  351. package/docs/en/rmt-dsl-authoring-polish.md +143 -0
  352. package/docs/en/rmt-event-routing-runtime.md +98 -0
  353. package/docs/en/rmt-first-demo-app.md +87 -0
  354. package/docs/en/rmt-first-xtend-apps.md +127 -0
  355. package/docs/en/rmt-kernel-panic-recovery-incident-handoff.md +60 -0
  356. package/docs/en/rmt-kernel-security-hardening-migration.md +49 -0
  357. package/docs/en/rmt-kernel-trusted-output-authoring.md +68 -0
  358. package/docs/en/rmt-language-server.md +243 -0
  359. package/docs/en/rmt-lifecycle-demo.md +23 -0
  360. package/docs/en/rmt-linter.md +146 -0
  361. package/docs/en/rmt-node-ssr-adapter.md +99 -0
  362. package/docs/en/rmt-php-ssr-adapter.md +118 -0
  363. package/docs/en/rmt-production-readiness.md +63 -0
  364. package/docs/en/rmt-state-selector-runtime.md +34 -0
  365. package/docs/en/rmt-surface-resource-graph-runtime.md +68 -0
  366. package/docs/en/rmt-tooling-release-gates.md +77 -0
  367. package/docs/en/rmt-vnext-authoring.md +102 -0
  368. package/docs/en/rmt-vnext-component-primitives.md +185 -0
  369. package/docs/en/rmt-vnext-cross-surface-events.md +59 -0
  370. package/docs/en/rmt-vnext-enterprise-mfe-handoff.md +62 -0
  371. package/docs/en/rmt-vnext-fabric-bridge-evidence.md +64 -0
  372. package/docs/en/rmt-vnext-migration-notes.md +62 -0
  373. package/docs/en/rmt-vnext-primitive-authoring-tooling.md +174 -0
  374. package/docs/en/rmt-vnext-primitive-grammar-design.md +268 -0
  375. package/docs/en/rmt-vnext-primitive-lowering.md +91 -0
  376. package/docs/en/rmt-vnext-primitive-migration.md +93 -0
  377. package/docs/en/rmt-vnext-primitive-parser-ast.md +59 -0
  378. package/docs/en/rmt-vnext-primitive-semantic-graph.md +103 -0
  379. package/docs/en/rmt-vnext-primitives-compiler-backlog.md +327 -0
  380. package/docs/en/rmt-vnext-release-handoff.md +83 -0
  381. package/docs/en/rmt-vnext-remote-surfaces.md +81 -0
  382. package/docs/en/rmt-vnext-source-to-sea-gate.md +482 -0
  383. package/docs/en/rmt-vnext-surface-registry-enterprise.md +68 -0
  384. package/docs/en/screenreader-signals.md +56 -0
  385. package/docs/en/supply-chain-gates.md +106 -0
  386. package/docs/en/surface-manager-authoring-guide.md +94 -0
  387. package/docs/en/surface-manager-browser-lab.md +45 -0
  388. package/docs/en/surface-manager-component-lab.md +43 -0
  389. package/docs/en/surface-manager-controller.md +66 -0
  390. package/docs/en/surface-manager-layout-engines.md +32 -0
  391. package/docs/en/surface-manager-lazy-hydration.md +63 -0
  392. package/docs/en/surface-manager-migration-guide.md +113 -0
  393. package/docs/en/surface-manager-native-rmt-surfaces.md +38 -0
  394. package/docs/en/surface-manager-overlay-bridge.md +53 -0
  395. package/docs/en/surface-manager-persistence.md +30 -0
  396. package/docs/en/surface-manager-quality-gates.md +51 -0
  397. package/docs/en/surface-manager-release-handoff.md +68 -0
  398. package/docs/en/surface-manager-remote-policy.md +54 -0
  399. package/docs/en/surface-manager-rmt-authoring.md +89 -0
  400. package/docs/en/surface-manager-route-lifecycle.md +59 -0
  401. package/docs/en/surface-manager-runtime-release-handoff.md +69 -0
  402. package/docs/en/surface-manager-side-panel-runtime.md +36 -0
  403. package/docs/en/surface-manager-stack-policy.md +39 -0
  404. package/docs/en/surface-manager-window-runtime.md +47 -0
  405. package/docs/en/surface-manager-workbench-fixture.md +43 -0
  406. package/docs/en/third-party-design-authoring.md +406 -0
  407. package/docs/en/trusted-dom-boundary-browser-proof.md +32 -0
  408. package/docs/en/trusted-dom-sanitizing.md +124 -0
  409. package/docs/en/type-exports.md +61 -0
  410. package/docs/en/typescript-components.md +63 -0
  411. package/docs/en/visual-browser-regression.md +83 -0
  412. package/docs/en/visual-owner-artifacts.md +46 -0
  413. package/docs/en/visual-snapshot-automation.md +87 -0
  414. package/docs/en/xtend-api-types.md +55 -0
  415. package/docs/en/xtend-builder-types.md +55 -0
  416. package/docs/en/xtend-catalog-types.md +44 -0
  417. package/docs/en/xtend-fabric-rmt-lane-mapping.md +143 -0
  418. package/docs/en/xtend-fabric.md +474 -0
  419. package/docs/en/xtend-loader-types.md +58 -0
  420. package/docs/en/xtend-loader.md +265 -0
  421. package/docs/en/xtend-policy-types.md +38 -0
  422. package/docs/en/xtend-rmt-types.md +40 -0
  423. package/docs/en/xtend-vendor-types.md +36 -0
  424. package/docs/en/xtendrmt-app-dsl.md +331 -0
  425. package/docs/en/xtendrmt-migration-guide.md +256 -0
  426. package/docs/en/xtendrmt-native-authoring.md +336 -0
  427. package/docs/en/xtendrmt-overview.md +63 -0
  428. package/docs/en/xtendrmt-parsedown-scheduling.md +301 -0
  429. package/docs/en/xtendrmt-runtime-bridge.md +155 -0
  430. package/docs/enterprise-adoption.md +4 -2
  431. package/docs/epic18-media-manager-vendor-upstream.md +318 -0
  432. package/docs/epic18-rmt-app-platform-release-handoff.md +67 -0
  433. package/docs/epic18-vendor-bugfixes.md +34 -0
  434. package/docs/index.php +1056 -109
  435. package/docs/manifest.md +8 -2
  436. package/docs/menu.json +986 -133
  437. package/docs/package-export-lock.md +2 -2
  438. package/docs/public-component-types.md +2 -2
  439. package/docs/quick-start-guide.md +126 -58
  440. package/docs/rmt-action-effect-runtime.md +101 -0
  441. package/docs/rmt-app-platform-authoring.md +54 -0
  442. package/docs/rmt-app-platform-fixture.md +46 -0
  443. package/docs/rmt-app-platform-migration-guide.md +88 -0
  444. package/docs/rmt-app-platform-tooling.md +79 -0
  445. package/docs/rmt-component-template-primitives.md +57 -0
  446. package/docs/rmt-dom-descriptor-renderer.md +64 -0
  447. package/docs/rmt-dsl-authoring-polish.md +67 -44
  448. package/docs/rmt-event-routing-runtime.md +98 -0
  449. package/docs/rmt-first-demo-app.md +2 -2
  450. package/docs/rmt-first-xtend-apps.md +70 -46
  451. package/docs/rmt-language-server.md +61 -4
  452. package/docs/rmt-lifecycle-demo.md +1 -2
  453. package/docs/rmt-node-ssr-adapter.md +144 -0
  454. package/docs/rmt-php-ssr-adapter.md +158 -0
  455. package/docs/rmt-state-selector-runtime.md +47 -0
  456. package/docs/rmt-surface-resource-graph-runtime.md +92 -0
  457. package/docs/rmt-vnext-authoring.md +128 -18
  458. package/docs/rmt-vnext-component-primitives.md +188 -0
  459. package/docs/rmt-vnext-fabric-bridge-evidence.md +81 -0
  460. package/docs/rmt-vnext-primitive-authoring-tooling.md +247 -0
  461. package/docs/rmt-vnext-primitive-grammar-design.md +289 -0
  462. package/docs/rmt-vnext-primitive-lowering.md +108 -0
  463. package/docs/rmt-vnext-primitive-migration.md +119 -0
  464. package/docs/rmt-vnext-primitive-parser-ast.md +76 -0
  465. package/docs/rmt-vnext-primitive-semantic-graph.md +118 -0
  466. package/docs/rmt-vnext-primitives-compiler-backlog.md +742 -0
  467. package/docs/rmt-vnext-release-handoff.md +14 -0
  468. package/docs/rmt-vnext-source-to-sea-gate.md +629 -0
  469. package/docs/surface-manager-migration-guide.md +34 -6
  470. package/docs/surface-manager-overlay-bridge.md +9 -4
  471. package/docs/surface-manager-rmt-authoring.md +50 -34
  472. package/docs/surface-manager-workbench-fixture.md +1 -2
  473. package/docs/third-party-design-authoring.md +1 -1
  474. package/docs/type-exports.md +3 -3
  475. package/docs/utils/pageloader.js +811 -62
  476. package/docs/visual-browser-regression.md +1 -1
  477. package/docs/xtend-rmt-types.md +3 -2
  478. package/docs/xtendrmt-app-dsl.md +187 -122
  479. package/docs/xtendrmt-docs-shell-vnext.rmt +165 -0
  480. package/docs/xtendrmt-migration-guide.md +48 -17
  481. package/docs/xtendrmt-native-authoring.md +213 -217
  482. package/docs/xtendrmt-overview.md +81 -61
  483. package/docs/xtendrmt-parsedown-scheduling.md +23 -8
  484. package/fabric/package.json +1 -1
  485. package/package.json +684 -21
  486. package/tools/package.json +5 -1
  487. package/tools/rmt-editor/vscode/README.md +72 -5
  488. package/tools/rmt-editor/vscode/XTend-Logo.png +0 -0
  489. package/tools/rmt-editor/vscode/extension.d.ts +33 -0
  490. package/tools/rmt-editor/vscode/extension.js +1816 -7
  491. package/tools/rmt-editor/vscode/language-configuration.json +2 -1
  492. package/tools/rmt-editor/vscode/package.json +193 -2
  493. package/tools/rmt-editor/vscode/snippets/rmt.code-snippets +41 -0
  494. package/tools/rmt-editor/vscode/syntaxes/rmt.tmLanguage.json +103 -1
  495. package/tools/rmt-editor/vscode/templates/launch.json +70 -0
  496. package/tools/rmt-editor/vscode/templates/tasks.json +172 -0
  497. package/tools/rmt-editor/vscode/xtend-rmt-language-0.0.0-enterprise-readiness.vsix +0 -0
  498. package/tools/rmt-language/app-platform-tooling.d.ts +128 -0
  499. package/tools/rmt-language/app-platform-tooling.js +677 -0
  500. package/tools/rmt-language/completions.d.ts +5 -0
  501. package/tools/rmt-language/completions.js +185 -3
  502. package/tools/rmt-language/diagnostics.js +54 -0
  503. package/tools/rmt-language/hover.js +36 -0
  504. package/tools/rmt-language/rmt-tooling-public-types.d.ts +7 -0
  505. package/tools/rmt-language/rules/app-platform-policy.js +39 -0
  506. package/tools/rmt-language/rules/index.js +5 -1
  507. package/tools/rmt-language/semantic-graph.d.ts +6 -0
  508. package/tools/rmt-language/semantic-graph.js +928 -0
  509. package/tools/rmt-language/snippets/index.js +44 -0
  510. package/tools/rmt-language/snippets/rmt.code-snippets +41 -0
  511. package/tools/rmt-language/vnext-compatibility.d.ts +10 -0
  512. package/tools/rmt-language/vnext-compatibility.js +642 -0
  513. package/tools/rmt-language/vnext-compiler.d.ts +5 -0
  514. package/tools/rmt-language/vnext-compiler.js +863 -17
  515. package/tools/rmt-language/vnext-parser.js +725 -9
  516. package/tools/rmt-language/vnext-release.d.ts +1 -0
  517. package/tools/rmt-language/vnext-release.js +20 -0
  518. package/tools/rmt-language/vnext-source-to-sea.d.ts +33 -0
  519. package/tools/rmt-language/vnext-source-to-sea.js +2227 -0
  520. package/tools/rmt-language/vnext-surfaces.js +111 -52
  521. package/tools/rmt-language/vnext-tooling.d.ts +19 -1
  522. package/tools/rmt-language/vnext-tooling.js +1247 -5
  523. package/tools/rmt-language-server/protocol.js +3 -0
  524. package/tools/rmt-language-server/server.d.ts +2 -0
  525. package/tools/rmt-language-server/server.js +176 -22
  526. package/tools/rmt-linter/cli.d.ts +2 -0
  527. package/tools/rmt-linter/cli.js +62 -0
  528. package/xtend-builder/generators/registry.js +11 -0
  529. package/xtend-builder/generators/rmt-app-platform.js +239 -0
  530. package/xtend-builder/generators/rmt-lifecycle-demo.js +3 -11
  531. package/xtend-builder/lib/cli.js +38 -0
  532. package/xtend-builder/package.json +3 -3
  533. package/xtend-builder/scaffold.config.js +29 -2
  534. package/xtend.css +49 -2
  535. package/xtendrmt/package.json +49 -1
  536. package/xtendrmt/rmt-action-effect-runtime.d.ts +126 -0
  537. package/xtendrmt/rmt-action-effect-runtime.js +494 -0
  538. package/xtendrmt/rmt-component-capability-registry.d.ts +180 -0
  539. package/xtendrmt/rmt-component-capability-registry.js +636 -0
  540. package/xtendrmt/rmt-core.d.ts +6 -0
  541. package/xtendrmt/rmt-core.esm.js +32 -6
  542. package/xtendrmt/rmt-dom-descriptor-renderer.d.ts +107 -0
  543. package/xtendrmt/rmt-dom-descriptor-renderer.js +1066 -0
  544. package/xtendrmt/rmt-event-routing-runtime.d.ts +144 -0
  545. package/xtendrmt/rmt-event-routing-runtime.js +666 -0
  546. package/xtendrmt/rmt-lifecycle-demo.app.js +2 -2
  547. package/xtendrmt/rmt-lifecycle-demo.core.json +4 -0
  548. package/xtendrmt/rmt-lifecycle-demo.rmt-build.app.js +1 -1
  549. package/xtendrmt/rmt-lifecycle-demo.rmt-build.scaffold.json +2 -2
  550. package/xtendrmt/rmt-lifecycle-demo.scaffold.json +4 -4
  551. package/xtendrmt/rmt-native-shell-runtime.d.ts +77 -0
  552. package/xtendrmt/rmt-native-shell-runtime.js +309 -0
  553. package/xtendrmt/rmt-node-ssr-adapter.d.ts +197 -0
  554. package/xtendrmt/rmt-node-ssr-adapter.js +1006 -0
  555. package/xtendrmt/rmt-php-ssr-adapter.php +976 -0
  556. package/xtendrmt/rmt-runtime.browser.js +32 -6
  557. package/xtendrmt/rmt-runtime.esm.js +32 -6
  558. package/xtendrmt/rmt-state-selector-runtime.d.ts +166 -0
  559. package/xtendrmt/rmt-state-selector-runtime.js +866 -0
  560. package/xtendrmt/rmt-surface-resource-graph-runtime.d.ts +224 -0
  561. package/xtendrmt/rmt-surface-resource-graph-runtime.js +932 -0
  562. package/xtendrmt/rmt-vnext-enterprise-mfe-demo.core.json +3 -0
  563. package/xtendrmt/rmt-vnext-reference-demo.core.json +3 -0
  564. package/xtendrmt/xtendrmt-bestcase-demo.core.json +3420 -372
  565. package/xtendrmt/xtendrmt-bestcase-demo.js +424 -8
  566. package/xtendrmt/xtendrmt-bestcase-demo.rmt +214 -6
@@ -0,0 +1,866 @@
1
+ (function attachRmtStateSelectorRuntime(globalTarget) {
2
+ const RMT_STATE_SELECTOR_RUNTIME_SCHEMA = 'xtend.epic18.rmt-state-selector-runtime.v1';
3
+ const RMT_STATE_SELECTOR_DIAGNOSTIC_SCHEMA = 'xtend.epic18.rmt-state-selector-diagnostic.v1';
4
+ const DEFAULT_DIAGNOSTIC_CHANNEL = 'rmt.app_platform.state_selector';
5
+
6
+ function clampString(value, fallback = '') {
7
+ const normalized = String(value == null ? '' : value).trim();
8
+ return normalized || fallback;
9
+ }
10
+
11
+ function toArray(value) {
12
+ return Array.isArray(value) ? value : (value == null ? [] : [value]);
13
+ }
14
+
15
+ function objectRecord(value) {
16
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
17
+ }
18
+
19
+ function cloneValue(value, fallback = null) {
20
+ if (typeof value === 'undefined') return fallback;
21
+ if (value === null || typeof value !== 'object') return value;
22
+ try {
23
+ return JSON.parse(JSON.stringify(value));
24
+ } catch (_) {
25
+ return value;
26
+ }
27
+ }
28
+
29
+ function normalizePathSegments(path) {
30
+ return String(path || '')
31
+ .replace(/\[([0-9]+)\]/gu, '.$1')
32
+ .split('.')
33
+ .filter(Boolean);
34
+ }
35
+
36
+ function readPath(source, path) {
37
+ if (!path) return source;
38
+ if (source && typeof source === 'object' && Object.prototype.hasOwnProperty.call(source, path)) {
39
+ return source[path];
40
+ }
41
+ const parts = normalizePathSegments(path);
42
+ let cursor = source;
43
+ for (const part of parts) {
44
+ if (cursor == null) return undefined;
45
+ if ((Array.isArray(cursor) || typeof cursor === 'string') && part === 'length') {
46
+ cursor = cursor.length;
47
+ } else {
48
+ cursor = cursor[part];
49
+ }
50
+ }
51
+ return cursor;
52
+ }
53
+
54
+ function writePath(target, path, value) {
55
+ const parts = String(path || '').split('.').filter(Boolean);
56
+ if (!parts.length) return target;
57
+ let cursor = target;
58
+ parts.forEach((part, index) => {
59
+ if (index === parts.length - 1) {
60
+ cursor[part] = value;
61
+ return;
62
+ }
63
+ if (!cursor[part] || typeof cursor[part] !== 'object' || Array.isArray(cursor[part])) {
64
+ cursor[part] = {};
65
+ }
66
+ cursor = cursor[part];
67
+ });
68
+ return target;
69
+ }
70
+
71
+ function stableStringify(value) {
72
+ if (value === null || typeof value !== 'object') return JSON.stringify(value);
73
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;
74
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(',')}}`;
75
+ }
76
+
77
+ function createDiagnosticsRecorder(deps = {}) {
78
+ const diagnostics = [];
79
+ const diagnosticsHub = deps.diagnosticsHub || null;
80
+ const channel = clampString(deps.diagnosticChannel, DEFAULT_DIAGNOSTIC_CHANNEL);
81
+ return {
82
+ diagnostics,
83
+ publish(diagnostic) {
84
+ diagnostics.push(diagnostic);
85
+ if (diagnosticsHub && typeof diagnosticsHub.publish === 'function') {
86
+ diagnosticsHub.publish(channel, diagnostic, {
87
+ schema: RMT_STATE_SELECTOR_DIAGNOSTIC_SCHEMA
88
+ });
89
+ }
90
+ return diagnostic;
91
+ }
92
+ };
93
+ }
94
+
95
+ function createDiagnostic(code, message, details = {}, severity = 'error') {
96
+ return {
97
+ schema: RMT_STATE_SELECTOR_DIAGNOSTIC_SCHEMA,
98
+ code,
99
+ message,
100
+ severity,
101
+ details: cloneValue(details, {})
102
+ };
103
+ }
104
+
105
+ function normalizeStateDefinitions(states) {
106
+ return toArray(states).map((state) => ({
107
+ id: clampString(state && state.id),
108
+ type: clampString(state && state.type, 'object'),
109
+ schema: clampString(state && state.schema, ''),
110
+ initial: cloneValue(state && Object.prototype.hasOwnProperty.call(state, 'initial') ? state.initial : null, null),
111
+ preserve: clampString(state && state.preserve, ''),
112
+ xstateKey: clampString(state && state.xstateKey, state && state.id)
113
+ })).filter((state) => state.id);
114
+ }
115
+
116
+ function normalizeSelectorDefinitions(selectors) {
117
+ return toArray(selectors).map((selector) => ({
118
+ ...objectRecord(selector),
119
+ id: clampString(selector && selector.id),
120
+ from: clampString(selector && selector.from),
121
+ compute: clampString(selector && selector.compute, ''),
122
+ structural: selector && Object.prototype.hasOwnProperty.call(selector, 'structural') ? selector.structural !== false : true
123
+ })).filter((selector) => selector.id);
124
+ }
125
+
126
+ function normalizeDerivedDefinitions(derived) {
127
+ return toArray(derived).map((entry) => ({
128
+ ...objectRecord(entry),
129
+ id: clampString(entry && entry.id),
130
+ from: clampString(entry && entry.from),
131
+ compute: clampString(entry && entry.compute, ''),
132
+ structural: entry && Object.prototype.hasOwnProperty.call(entry, 'structural') ? entry.structural !== false : false
133
+ })).filter((entry) => entry.id);
134
+ }
135
+
136
+ function normalizeReducerDefinitions(reducers) {
137
+ return toArray(reducers).map((reducer) => ({
138
+ ...objectRecord(reducer),
139
+ id: clampString(reducer && reducer.id),
140
+ command: clampString(reducer && (reducer.command || reducer.id)),
141
+ state: clampString(reducer && reducer.state)
142
+ })).filter((reducer) => reducer.id && reducer.command && reducer.state);
143
+ }
144
+
145
+ function validateTypedValue(definition, value) {
146
+ const type = definition.type;
147
+ if (type === 'collection' || type === 'array') return Array.isArray(value);
148
+ if (type === 'object') return !!value && typeof value === 'object' && !Array.isArray(value);
149
+ if (type === 'string') return typeof value === 'string';
150
+ if (type === 'number') return typeof value === 'number' && Number.isFinite(value);
151
+ if (type === 'boolean') return typeof value === 'boolean';
152
+ if (type === 'nullable') return value === null || typeof value !== 'undefined';
153
+ return true;
154
+ }
155
+
156
+ function createRmtXStateBridge(options = {}) {
157
+ const xstate = options.xstate || null;
158
+ const writes = [];
159
+ const reads = [];
160
+
161
+ function set(key, value, metadata = {}) {
162
+ const safeKey = clampString(key);
163
+ if (!safeKey) return false;
164
+ let mirrored = false;
165
+ if (xstate && typeof xstate.set === 'function') {
166
+ xstate.set(safeKey, cloneValue(value, value));
167
+ mirrored = true;
168
+ } else if (xstate && typeof xstate.setState === 'function') {
169
+ xstate.setState(safeKey, cloneValue(value, value));
170
+ mirrored = true;
171
+ }
172
+ writes.push({ key: safeKey, value: cloneValue(value, value), mirrored, metadata: cloneValue(metadata, {}) });
173
+ return mirrored;
174
+ }
175
+
176
+ function get(key, fallbackValue) {
177
+ const safeKey = clampString(key);
178
+ let value;
179
+ if (xstate && typeof xstate.get === 'function') {
180
+ value = xstate.get(safeKey);
181
+ } else if (xstate && typeof xstate.getState === 'function') {
182
+ value = xstate.getState(safeKey);
183
+ }
184
+ reads.push({ key: safeKey, hit: typeof value !== 'undefined' });
185
+ return typeof value === 'undefined' ? fallbackValue : value;
186
+ }
187
+
188
+ function mirrorSnapshot(snapshot, metadata = {}) {
189
+ Object.entries(snapshot.states || {}).forEach(([key, value]) => set(key, value, metadata));
190
+ Object.entries(snapshot.selectors || {}).forEach(([key, value]) => set(key, value, metadata));
191
+ Object.entries(snapshot.derived || {}).forEach(([key, value]) => set(key, value, metadata));
192
+ }
193
+
194
+ function subscribe(listener) {
195
+ if (xstate && typeof xstate.subscribe === 'function') return xstate.subscribe(listener);
196
+ return () => undefined;
197
+ }
198
+
199
+ return Object.freeze({
200
+ schema: RMT_STATE_SELECTOR_RUNTIME_SCHEMA,
201
+ external: !!xstate,
202
+ set,
203
+ get,
204
+ mirrorSnapshot,
205
+ subscribe,
206
+ listWrites() {
207
+ return writes.map((entry) => cloneValue(entry, entry));
208
+ },
209
+ listReads() {
210
+ return reads.map((entry) => cloneValue(entry, entry));
211
+ }
212
+ });
213
+ }
214
+
215
+ function createEvaluationContext(stateValues, selectorValues = {}, derivedValues = {}, payload = {}, params = {}) {
216
+ return {
217
+ states: stateValues,
218
+ selectors: selectorValues,
219
+ derived: derivedValues,
220
+ payload,
221
+ params
222
+ };
223
+ }
224
+
225
+ function resolveRecordPath(records, expression) {
226
+ if (Object.prototype.hasOwnProperty.call(records, expression)) return records[expression];
227
+ const ownerKey = Object.keys(records)
228
+ .filter((key) => expression.startsWith(`${key}.`))
229
+ .sort((left, right) => right.length - left.length)[0];
230
+ if (ownerKey) return readPath(records[ownerKey], expression.slice(ownerKey.length + 1));
231
+ return readPath(records, expression);
232
+ }
233
+
234
+ function resolveReference(expression, context, item) {
235
+ if (Array.isArray(expression)) return expression.map((entry) => resolveReference(entry, context, item));
236
+ if (expression && typeof expression === 'object') return evaluateTransformExpression(expression, context, item);
237
+ if (typeof expression !== 'string') return expression;
238
+ if (expression.includes('${')) return interpolateString(expression, context, item);
239
+ if (expression === '$item') return item;
240
+ if (expression.startsWith('$item.')) return readPath(item, expression.slice(6));
241
+ if (expression === '$payload') return context.payload;
242
+ if (expression.startsWith('$payload.')) return readPath(context.payload, expression.slice(9));
243
+ if (expression === '$params') return context.params;
244
+ if (expression.startsWith('$params.')) return readPath(context.params, expression.slice(8));
245
+ if (expression.startsWith('$state.')) return resolveReference(`state.${expression.slice(7)}`, context, item);
246
+ if (expression.startsWith('state.')) {
247
+ return resolveRecordPath(context.states, expression);
248
+ }
249
+ if (expression.startsWith('$selector.')) return resolveReference(`selector.${expression.slice(10)}`, context, item);
250
+ if (expression.startsWith('selector.')) {
251
+ return resolveRecordPath(context.selectors, expression);
252
+ }
253
+ if (expression.startsWith('$derive.')) return resolveReference(`derive.${expression.slice(8)}`, context, item);
254
+ if (expression.startsWith('derive.')) {
255
+ return resolveRecordPath(context.derived, expression);
256
+ }
257
+ if (Object.prototype.hasOwnProperty.call(context.params || {}, expression)) return context.params[expression];
258
+ return expression;
259
+ }
260
+
261
+ function isEmptyValue(value) {
262
+ return value === null || typeof value === 'undefined' || value === '';
263
+ }
264
+
265
+ function applyFallback(value, fallback, context, item) {
266
+ return isEmptyValue(value) && typeof fallback !== 'undefined'
267
+ ? resolveReference(fallback, context, item)
268
+ : value;
269
+ }
270
+
271
+ function interpolateString(value, context, item) {
272
+ return String(value).replace(/\$\{([^}]+)\}/gu, (_, expression) => {
273
+ const normalized = clampString(expression, '');
274
+ const resolved = resolveReference(normalized.startsWith('$') ? normalized : `$${normalized}`, context, item);
275
+ return String(resolved == null ? '' : resolved);
276
+ });
277
+ }
278
+
279
+ function formatBytes(value) {
280
+ const bytes = Number(value);
281
+ if (!Number.isFinite(bytes)) return '';
282
+ if (bytes === 0) return '0 B';
283
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
284
+ const index = Math.min(Math.floor(Math.log(Math.abs(bytes)) / Math.log(1024)), units.length - 1);
285
+ const amount = bytes / Math.pow(1024, index);
286
+ const precision = index === 0 || Math.abs(amount) >= 10 ? 0 : 1;
287
+ return `${amount.toFixed(precision)} ${units[index]}`;
288
+ }
289
+
290
+ function formatDateShort(value) {
291
+ const date = value instanceof Date ? value : new Date(value);
292
+ if (Number.isNaN(date.getTime())) return '';
293
+ return date.toISOString().slice(0, 10);
294
+ }
295
+
296
+ function formatDuration(value) {
297
+ const totalSeconds = Math.max(0, Math.floor(Number(value) || 0));
298
+ const hours = Math.floor(totalSeconds / 3600);
299
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
300
+ const seconds = totalSeconds % 60;
301
+ const padded = (entry) => String(entry).padStart(2, '0');
302
+ return hours > 0 ? `${hours}:${padded(minutes)}:${padded(seconds)}` : `${minutes}:${padded(seconds)}`;
303
+ }
304
+
305
+ function evaluateTransformExpression(recordInput, context, item) {
306
+ const record = objectRecord(recordInput);
307
+ const op = clampString(record.op || record.operator || record.kind || record.compute || record.format, '');
308
+ const hasValue = Object.prototype.hasOwnProperty.call(record, 'value') || Object.prototype.hasOwnProperty.call(record, 'from') || Object.prototype.hasOwnProperty.call(record, 'source');
309
+ const sourceExpression = Object.prototype.hasOwnProperty.call(record, 'value')
310
+ ? record.value
311
+ : (Object.prototype.hasOwnProperty.call(record, 'from') ? record.from : record.source);
312
+ const source = hasValue ? resolveReference(sourceExpression, context, item) : (record.path ? readPath(item, record.path) : undefined);
313
+ let result;
314
+
315
+ switch (op) {
316
+ case '':
317
+ case 'path':
318
+ result = record.path && !hasValue ? readPath(item, record.path) : source;
319
+ break;
320
+ case 'uppercase':
321
+ case 'upper':
322
+ result = String(source == null ? '' : source).toUpperCase();
323
+ break;
324
+ case 'lowercase':
325
+ case 'lower':
326
+ result = String(source == null ? '' : source).toLowerCase();
327
+ break;
328
+ case 'replace': {
329
+ const search = resolveReference(record.search, context, item);
330
+ const replacement = resolveReference(record.replacement, context, item);
331
+ result = String(source == null ? '' : source).replace(new RegExp(String(search == null ? '' : search), record.flags || 'gu'), String(replacement == null ? '' : replacement));
332
+ break;
333
+ }
334
+ case 'concat':
335
+ case 'interpolate':
336
+ result = toArray(record.values || record.parts || source).map((entry) => resolveReference(entry, context, item)).join(record.separator || '');
337
+ break;
338
+ case 'slice':
339
+ result = Array.isArray(source) || typeof source === 'string'
340
+ ? source.slice(Number(resolveReference(record.start || 0, context, item)), typeof record.end === 'undefined' ? undefined : Number(resolveReference(record.end, context, item)))
341
+ : [];
342
+ break;
343
+ case 'contains':
344
+ case 'includes':
345
+ result = compareValues(source, resolveReference(record.search || record.item || record.right, context, item), 'contains', record);
346
+ break;
347
+ case 'map':
348
+ result = Array.isArray(source)
349
+ ? source.map((entry) => record.path ? readPath(entry, record.path) : resolveReference(record.expression || '$item', context, entry))
350
+ : [];
351
+ break;
352
+ case 'filter':
353
+ result = Array.isArray(source)
354
+ ? source.filter((entry) => toArray(record.where || record.filter || record.rules).every((rule) => evaluateRule(rule, context, entry)))
355
+ : [];
356
+ break;
357
+ case 'reduce':
358
+ if (record.mode === 'sum') {
359
+ result = Array.isArray(source) ? source.reduce((sum, entry) => sum + Number(record.path ? readPath(entry, record.path) : entry || 0), 0) : 0;
360
+ } else {
361
+ result = Array.isArray(source) || typeof source === 'string' ? source.length : Object.keys(objectRecord(source)).length;
362
+ }
363
+ break;
364
+ case 'countBy':
365
+ case 'count-by':
366
+ result = {};
367
+ if (Array.isArray(source)) {
368
+ source.forEach((entry) => {
369
+ const key = clampString(record.path ? readPath(entry, record.path) : resolveReference(record.key || '$item', context, entry), 'unknown');
370
+ result[key] = (result[key] || 0) + 1;
371
+ });
372
+ }
373
+ break;
374
+ case 'count':
375
+ result = Array.isArray(source) || typeof source === 'string' ? source.length : Object.keys(objectRecord(source)).length;
376
+ break;
377
+ case 'not-empty':
378
+ result = Array.isArray(source) || typeof source === 'string' ? source.length > 0 : !!source;
379
+ break;
380
+ case 'empty':
381
+ result = Array.isArray(source) || typeof source === 'string' ? source.length === 0 : !source;
382
+ break;
383
+ case 'boolean':
384
+ result = !!source;
385
+ break;
386
+ case 'first':
387
+ result = Array.isArray(source) ? source[0] || null : source;
388
+ break;
389
+ case 'formatBytes':
390
+ case 'bytes':
391
+ result = formatBytes(source);
392
+ break;
393
+ case 'formatDateShort':
394
+ case 'dateShort':
395
+ result = formatDateShort(source);
396
+ break;
397
+ case 'formatDuration':
398
+ case 'duration':
399
+ result = formatDuration(source);
400
+ break;
401
+ case 'fallback':
402
+ result = applyFallback(source, record.fallback, context, item);
403
+ break;
404
+ default:
405
+ result = hasValue ? source : recordInput;
406
+ break;
407
+ }
408
+
409
+ return applyFallback(result, record.fallback, context, item);
410
+ }
411
+
412
+ function compareValues(left, right, op, options = {}) {
413
+ const normalizedOp = clampString(op, 'equals');
414
+ if ((right === '' || right == null) && options.empty === 'pass') return true;
415
+ if (normalizedOp === 'equals' || normalizedOp === 'eq') return left === right;
416
+ if (normalizedOp === 'not-equals' || normalizedOp === 'neq') return left !== right;
417
+ if (normalizedOp === 'truthy') return !!left;
418
+ if (normalizedOp === 'falsy') return !left;
419
+ if (normalizedOp === 'in') return Array.isArray(right) && right.includes(left);
420
+ if (normalizedOp === 'includes') return Array.isArray(left) ? left.includes(right) : String(left == null ? '' : left).includes(String(right == null ? '' : right));
421
+ if (normalizedOp === 'contains') {
422
+ const leftText = String(left == null ? '' : left);
423
+ const rightText = String(right == null ? '' : right);
424
+ return options.ignoreCase ? leftText.toLowerCase().includes(rightText.toLowerCase()) : leftText.includes(rightText);
425
+ }
426
+ return left === right;
427
+ }
428
+
429
+ function evaluateRule(rule, context, item) {
430
+ if (typeof rule === 'string') return !!resolveReference(rule, context, item);
431
+ const record = objectRecord(rule);
432
+ const left = record.left
433
+ ? resolveReference(record.left, context, item)
434
+ : readPath(item, record.path || record.field || '');
435
+ const right = Object.prototype.hasOwnProperty.call(record, 'right')
436
+ ? resolveReference(record.right, context, item)
437
+ : resolveReference(record.value, context, item);
438
+ return compareValues(left, right, record.op || record.operator, record);
439
+ }
440
+
441
+ function applySelectorOperations(source, selector, context) {
442
+ let value = source;
443
+ if (selector.path) value = readPath(value, selector.path);
444
+ const filters = toArray(selector.where || selector.filter).filter(Boolean);
445
+ if (filters.length) {
446
+ value = Array.isArray(value)
447
+ ? value.filter((item) => filters.every((rule) => evaluateRule(rule, context, item)))
448
+ : [];
449
+ }
450
+ if (selector.find) {
451
+ const rules = toArray(selector.find).filter(Boolean);
452
+ value = Array.isArray(value)
453
+ ? value.find((item) => rules.every((rule) => evaluateRule(rule, context, item))) || null
454
+ : null;
455
+ }
456
+ if (selector.sort && Array.isArray(value)) {
457
+ const sort = objectRecord(selector.sort);
458
+ const direction = clampString(sort.direction, 'asc') === 'desc' ? -1 : 1;
459
+ value = value.slice().sort((left, right) => {
460
+ const leftValue = readPath(left, sort.by || sort.path || '');
461
+ const rightValue = readPath(right, sort.by || sort.path || '');
462
+ return String(leftValue == null ? '' : leftValue).localeCompare(String(rightValue == null ? '' : rightValue)) * direction;
463
+ });
464
+ }
465
+ if (selector.slice && (Array.isArray(value) || typeof value === 'string')) {
466
+ const slice = objectRecord(selector.slice);
467
+ value = value.slice(Number(resolveReference(slice.start || 0, context)), typeof slice.end === 'undefined' ? undefined : Number(resolveReference(slice.end, context)));
468
+ }
469
+ if (selector.map) {
470
+ const mapRecord = typeof selector.map === 'string' ? { path: selector.map } : objectRecord(selector.map);
471
+ value = Array.isArray(value)
472
+ ? value.map((item) => mapRecord.path ? readPath(item, mapRecord.path) : resolveReference(mapRecord.expression || mapRecord.value || '$item', context, item))
473
+ : [];
474
+ }
475
+ if (selector.transform) value = evaluateTransformExpression({ ...objectRecord(selector.transform), value }, context);
476
+ if (selector.compute === 'count') return Array.isArray(value) || typeof value === 'string' ? value.length : Object.keys(objectRecord(value)).length;
477
+ if (selector.compute === 'countBy' || selector.compute === 'count-by') {
478
+ const result = {};
479
+ if (Array.isArray(value)) {
480
+ const path = selector.countBy || selector.path || selector.key || '';
481
+ value.forEach((item) => {
482
+ const key = clampString(path ? readPath(item, path) : item, 'unknown');
483
+ result[key] = (result[key] || 0) + 1;
484
+ });
485
+ }
486
+ return result;
487
+ }
488
+ if (selector.compute === 'not-empty') return Array.isArray(value) || typeof value === 'string' ? value.length > 0 : !!value;
489
+ if (selector.compute === 'empty') return Array.isArray(value) || typeof value === 'string' ? value.length === 0 : !value;
490
+ if (selector.compute === 'first') return Array.isArray(value) ? value[0] || null : value;
491
+ if (selector.compute === 'boolean') return !!value;
492
+ return value;
493
+ }
494
+
495
+ function evaluateDerived(entry, context) {
496
+ let value = resolveReference(entry.from, context);
497
+ if (entry.path) value = readPath(value, entry.path);
498
+ if (entry.expression) {
499
+ if (typeof entry.expression === 'object') {
500
+ value = resolveReference({ ...entry.expression, value }, context);
501
+ } else {
502
+ const expression = clampString(entry.expression);
503
+ const sourceName = clampString(entry.sourceName || entry.from.split('.').pop());
504
+ if (expression.startsWith(`${sourceName}.`)) value = readPath(value, expression.slice(sourceName.length + 1));
505
+ else value = resolveReference(expression, context);
506
+ }
507
+ }
508
+ if (entry.transform) value = evaluateTransformExpression({ ...objectRecord(entry.transform), value }, context);
509
+ if (entry.compute === 'count') return Array.isArray(value) || typeof value === 'string' ? value.length : Object.keys(objectRecord(value)).length;
510
+ if (entry.compute === 'countBy' || entry.compute === 'count-by') return evaluateTransformExpression({ op: 'countBy', value, path: entry.countBy || entry.path }, context);
511
+ if (entry.compute === 'not-empty') return Array.isArray(value) || typeof value === 'string' ? value.length > 0 : !!value;
512
+ if (entry.compute === 'empty') return Array.isArray(value) || typeof value === 'string' ? value.length === 0 : !value;
513
+ if (entry.compute === 'boolean') return !!value;
514
+ return value;
515
+ }
516
+
517
+ function buildRenderModel(states, selectors, derived) {
518
+ const model = {};
519
+ Object.entries(states).forEach(([key, value]) => {
520
+ const cloned = cloneValue(value, value);
521
+ model[key] = cloned;
522
+ writePath(model, key, cloned);
523
+ if (key.startsWith('state.')) model[key.slice(6)] = cloned;
524
+ });
525
+ Object.entries(selectors).forEach(([key, value]) => {
526
+ const cloned = cloneValue(value, value);
527
+ model[key] = cloned;
528
+ writePath(model, key, cloned);
529
+ if (key.startsWith('selector.')) model[key.slice(9)] = cloned;
530
+ });
531
+ Object.entries(derived).forEach(([key, value]) => {
532
+ const cloned = cloneValue(value, value);
533
+ model[key] = cloned;
534
+ writePath(model, key, cloned);
535
+ if (key.startsWith('derive.')) model[key.slice(7)] = cloned;
536
+ });
537
+ return model;
538
+ }
539
+
540
+ function diffRecord(previous, next) {
541
+ const keys = new Set([...Object.keys(previous || {}), ...Object.keys(next || {})]);
542
+ return [...keys].filter((key) => stableStringify(previous && previous[key]) !== stableStringify(next && next[key]));
543
+ }
544
+
545
+ function planRmtStatePatch(previousSnapshot, nextSnapshot, options = {}) {
546
+ const selectorDefinitions = new Map(toArray(options.selectors).map((selector) => [selector.id, selector]));
547
+ const derivedDefinitions = new Map(toArray(options.derived).map((entry) => [entry.id, entry]));
548
+ const preserveStates = options.preserveStates instanceof Set
549
+ ? options.preserveStates
550
+ : new Set(toArray(options.preserveStates));
551
+ const changedStates = diffRecord(previousSnapshot.states, nextSnapshot.states);
552
+ const changedSelectors = diffRecord(previousSnapshot.selectors, nextSnapshot.selectors);
553
+ const changedDerived = diffRecord(previousSnapshot.derived, nextSnapshot.derived);
554
+ const structuralSelectors = changedSelectors.filter((id) => {
555
+ const selector = selectorDefinitions.get(id);
556
+ return !selector || selector.structural !== false;
557
+ });
558
+ const structuralDerived = changedDerived.filter((id) => {
559
+ const entry = derivedDefinitions.get(id);
560
+ return entry && entry.structural === true;
561
+ });
562
+ const structuralStates = changedStates.filter((id) => !preserveStates.has(id));
563
+ const structural = structuralStates.length > 0 || structuralSelectors.length > 0 || structuralDerived.length > 0;
564
+ return {
565
+ schema: 'xtend.epic18.rmt-state-patch-plan.v1',
566
+ strategy: structural ? 'rerender' : 'attribute-sync',
567
+ preserveDom: !structural,
568
+ structural,
569
+ changedStates,
570
+ changedSelectors,
571
+ changedDerived,
572
+ structuralStates,
573
+ structuralSelectors,
574
+ structuralDerived
575
+ };
576
+ }
577
+
578
+ function createRmtStateSelectorRuntime(options = {}) {
579
+ const diagnosticsRecorder = createDiagnosticsRecorder(options);
580
+ const stateDefinitions = normalizeStateDefinitions(options.states || options.state);
581
+ const selectorDefinitions = normalizeSelectorDefinitions(options.selectors);
582
+ const derivedDefinitions = normalizeDerivedDefinitions(options.derive || options.derived);
583
+ const reducers = normalizeReducerDefinitions(options.reducers || options.commands);
584
+ const xstateBridge = createRmtXStateBridge({ xstate: options.xstate });
585
+ const listeners = new Set();
586
+ const stateDefinitionMap = new Map(stateDefinitions.map((state) => [state.id, state]));
587
+ const selectorDefinitionMap = new Map(selectorDefinitions.map((selector) => [selector.id, selector]));
588
+ const derivedDefinitionMap = new Map(derivedDefinitions.map((entry) => [entry.id, entry]));
589
+ const preserveStates = new Set(stateDefinitions.filter((state) => state.preserve === 'attribute-sync' || state.preserve === 'component-state').map((state) => state.id));
590
+ const stateValues = {};
591
+
592
+ stateDefinitions.forEach((state) => {
593
+ const externalValue = xstateBridge.get(state.xstateKey, undefined);
594
+ const initialValue = typeof externalValue === 'undefined'
595
+ ? cloneValue((options.initialState && Object.prototype.hasOwnProperty.call(options.initialState, state.id)) ? options.initialState[state.id] : state.initial, null)
596
+ : cloneValue(externalValue, externalValue);
597
+ if (!validateTypedValue(state, initialValue)) {
598
+ diagnosticsRecorder.publish(createDiagnostic('rmt.state.type.invalid', `State ${state.id} passt nicht zum Typ ${state.type}.`, { state: state.id, type: state.type }));
599
+ }
600
+ stateValues[state.id] = initialValue;
601
+ });
602
+
603
+ function evaluateSelectors() {
604
+ const selectorValues = {};
605
+ selectorDefinitions.forEach((selector) => {
606
+ const context = createEvaluationContext(stateValues, selectorValues, {}, {}, {});
607
+ const source = resolveReference(selector.from, context);
608
+ selectorValues[selector.id] = applySelectorOperations(source, selector, context);
609
+ });
610
+ return selectorValues;
611
+ }
612
+
613
+ function evaluateDerivedValues(selectorValues = evaluateSelectors()) {
614
+ const derivedValues = {};
615
+ derivedDefinitions.forEach((entry) => {
616
+ const context = createEvaluationContext(stateValues, selectorValues, derivedValues, {}, {});
617
+ derivedValues[entry.id] = evaluateDerived(entry, context);
618
+ });
619
+ return derivedValues;
620
+ }
621
+
622
+ function snapshot() {
623
+ const selectors = evaluateSelectors();
624
+ const derived = evaluateDerivedValues(selectors);
625
+ return {
626
+ schema: 'xtend.epic18.rmt-state-selector-snapshot.v1',
627
+ states: cloneValue(stateValues, {}),
628
+ selectors: cloneValue(selectors, {}),
629
+ derived: cloneValue(derived, {}),
630
+ model: buildRenderModel(stateValues, selectors, derived)
631
+ };
632
+ }
633
+
634
+ function notify(previousSnapshot, metadata = {}) {
635
+ const nextSnapshot = snapshot();
636
+ const patchPlan = planRmtStatePatch(previousSnapshot, nextSnapshot, {
637
+ selectors: selectorDefinitions,
638
+ derived: derivedDefinitions,
639
+ preserveStates
640
+ });
641
+ xstateBridge.mirrorSnapshot(nextSnapshot, metadata);
642
+ const event = Object.freeze({
643
+ schema: 'xtend.epic18.rmt-state-change.v1',
644
+ previous: previousSnapshot,
645
+ next: nextSnapshot,
646
+ patchPlan,
647
+ metadata: cloneValue(metadata, {})
648
+ });
649
+ listeners.forEach((listener) => listener(event));
650
+ return event;
651
+ }
652
+
653
+ function setState(id, value, metadata = {}) {
654
+ const stateId = clampString(id);
655
+ const definition = stateDefinitionMap.get(stateId);
656
+ if (!definition) {
657
+ throw new Error(`RMT State ${stateId} ist nicht definiert.`);
658
+ }
659
+ if (!validateTypedValue(definition, value)) {
660
+ throw new Error(`RMT State ${stateId} erwartet Typ ${definition.type}.`);
661
+ }
662
+ const previousSnapshot = snapshot();
663
+ stateValues[stateId] = cloneValue(value, value);
664
+ xstateBridge.set(definition.xstateKey, stateValues[stateId], metadata);
665
+ return notify(previousSnapshot, { operation: 'setState', state: stateId, ...metadata });
666
+ }
667
+
668
+ function patchState(id, patch, metadata = {}) {
669
+ const stateId = clampString(id);
670
+ const current = objectRecord(stateValues[stateId]);
671
+ return setState(stateId, {
672
+ ...cloneValue(current, {}),
673
+ ...objectRecord(patch)
674
+ }, { operation: 'patchState', state: stateId, ...metadata });
675
+ }
676
+
677
+ function dispatch(commandId, payload = {}, metadata = {}) {
678
+ const command = clampString(commandId);
679
+ const reducer = reducers.find((entry) => entry.command === command || entry.id === command);
680
+ if (!reducer) throw new Error(`RMT Reducer ${command} ist nicht definiert.`);
681
+ const current = stateValues[reducer.state];
682
+ const context = createEvaluationContext(stateValues, evaluateSelectors(), evaluateDerivedValues(), payload, {});
683
+ if (reducer.set) {
684
+ return setState(reducer.state, resolveReference(reducer.set, context), { operation: 'dispatch', command, ...metadata });
685
+ }
686
+ if (reducer.patch) {
687
+ const patch = {};
688
+ Object.entries(objectRecord(reducer.patch)).forEach(([key, value]) => {
689
+ patch[key] = resolveReference(value, context);
690
+ });
691
+ return patchState(reducer.state, patch, { operation: 'dispatch', command, ...metadata });
692
+ }
693
+ if (reducer.toggle) {
694
+ const next = cloneValue(objectRecord(current), {});
695
+ const path = clampString(reducer.toggle);
696
+ writePath(next, path, !readPath(next, path));
697
+ return setState(reducer.state, next, { operation: 'dispatch', command, ...metadata });
698
+ }
699
+ return setState(reducer.state, cloneValue(payload, payload), { operation: 'dispatch', command, ...metadata });
700
+ }
701
+
702
+ function select(selectorId, params = {}) {
703
+ const id = clampString(selectorId);
704
+ if (!selectorDefinitionMap.has(id)) throw new Error(`RMT Selector ${id} ist nicht definiert.`);
705
+ const selectorValues = evaluateSelectors();
706
+ if (!Object.keys(params).length) return selectorValues[id];
707
+ const selector = selectorDefinitionMap.get(id);
708
+ const context = createEvaluationContext(stateValues, selectorValues, evaluateDerivedValues(selectorValues), {}, params);
709
+ return applySelectorOperations(resolveReference(selector.from, context), selector, context);
710
+ }
711
+
712
+ const initialSnapshot = snapshot();
713
+ xstateBridge.mirrorSnapshot(initialSnapshot, { operation: 'init' });
714
+
715
+ return Object.freeze({
716
+ schema: RMT_STATE_SELECTOR_RUNTIME_SCHEMA,
717
+ stateDefinitions: stateDefinitions.slice(),
718
+ selectorDefinitions: selectorDefinitions.slice(),
719
+ derivedDefinitions: derivedDefinitions.slice(),
720
+ reducers: reducers.slice(),
721
+ getState(id) {
722
+ return cloneValue(stateValues[clampString(id)], stateValues[clampString(id)]);
723
+ },
724
+ setState,
725
+ patchState,
726
+ dispatch,
727
+ select,
728
+ getSelectorValues() {
729
+ return cloneValue(evaluateSelectors(), {});
730
+ },
731
+ getDerivedValues() {
732
+ return cloneValue(evaluateDerivedValues(), {});
733
+ },
734
+ getRenderModel() {
735
+ const current = snapshot();
736
+ return current.model;
737
+ },
738
+ createRenderContext(extra = {}) {
739
+ const current = snapshot();
740
+ return {
741
+ ...extra,
742
+ model: {
743
+ ...(extra.model || {}),
744
+ ...current.model
745
+ },
746
+ selectors: new Map(selectorDefinitions.map((selector) => [selector.id, selector])),
747
+ selectorValues: current.selectors
748
+ };
749
+ },
750
+ resolve(expression, item, payload = {}, params = {}) {
751
+ const selectors = evaluateSelectors();
752
+ return resolveReference(expression, createEvaluationContext(stateValues, selectors, evaluateDerivedValues(selectors), payload, params), item);
753
+ },
754
+ snapshot,
755
+ planPatch(previousSnapshot, nextSnapshot) {
756
+ return planRmtStatePatch(previousSnapshot, nextSnapshot, {
757
+ selectors: selectorDefinitions,
758
+ derived: derivedDefinitions,
759
+ preserveStates
760
+ });
761
+ },
762
+ subscribe(listener) {
763
+ listeners.add(listener);
764
+ return () => listeners.delete(listener);
765
+ },
766
+ connectXState(target) {
767
+ return createRmtXStateBridge({ xstate: target });
768
+ },
769
+ xstateBridge,
770
+ listDiagnostics() {
771
+ return diagnosticsRecorder.diagnostics.slice();
772
+ }
773
+ });
774
+ }
775
+
776
+ function setClassToken(element, token, enabled) {
777
+ const current = String((element.getAttribute && element.getAttribute('class')) || '').split(/\s+/u).filter(Boolean);
778
+ const next = new Set(current);
779
+ if (enabled) next.add(token);
780
+ else next.delete(token);
781
+ if (element.setAttribute) element.setAttribute('class', [...next].join(' '));
782
+ }
783
+
784
+ function applyRmtStateBindings(root, bindings, runtime, options = {}) {
785
+ const operations = [];
786
+ toArray(bindings).forEach((binding) => {
787
+ const source = runtime.resolve(binding.source);
788
+ const items = Array.isArray(source) ? source : [source];
789
+ items.filter((item) => item != null).forEach((item) => {
790
+ const keyPath = clampString(binding.key || (binding.target && binding.target.key), 'id');
791
+ const key = String(readPath(item, keyPath));
792
+ const targetAttribute = clampString(binding.target && (binding.target.attribute || binding.target.byKeyAttribute), 'data-rmt-key');
793
+ const selector = `[${targetAttribute}="${key}"]`;
794
+ const element = root && typeof root.querySelector === 'function' ? root.querySelector(selector) : null;
795
+ if (!element) return;
796
+ Object.entries(objectRecord(binding.attributes)).forEach(([name, expression]) => {
797
+ const value = typeof expression === 'object'
798
+ ? evaluateRule(expression, createEvaluationContext(runtime.snapshot().states, runtime.getSelectorValues(), runtime.getDerivedValues(), {}, {}), item)
799
+ : runtime.resolve(expression, item);
800
+ if (value == null || (value === false && !String(name).startsWith('aria-'))) {
801
+ if (element.removeAttribute) element.removeAttribute(name);
802
+ } else if (element.setAttribute) {
803
+ element.setAttribute(name, value === true ? 'true' : String(value));
804
+ }
805
+ operations.push({ binding: binding.id, target: key, kind: 'attribute', name, value });
806
+ });
807
+ Object.entries(objectRecord(binding.classes)).forEach(([token, expression]) => {
808
+ const enabled = typeof expression === 'object'
809
+ ? evaluateRule(expression, createEvaluationContext(runtime.snapshot().states, runtime.getSelectorValues(), runtime.getDerivedValues(), {}, {}), item)
810
+ : !!runtime.resolve(expression, item);
811
+ setClassToken(element, token, enabled);
812
+ operations.push({ binding: binding.id, target: key, kind: 'class', name: token, value: enabled });
813
+ });
814
+ Object.entries(objectRecord(binding.properties)).forEach(([name, expression]) => {
815
+ element[name] = runtime.resolve(expression, item);
816
+ operations.push({ binding: binding.id, target: key, kind: 'property', name, value: element[name] });
817
+ });
818
+ });
819
+ });
820
+ return {
821
+ schema: 'xtend.epic18.rmt-state-binding-application.v1',
822
+ strategy: options.strategy || 'attribute-sync',
823
+ replacedRoot: false,
824
+ operationCount: operations.length,
825
+ operations
826
+ };
827
+ }
828
+
829
+ function createRmtStateBindingAdapter(options = {}) {
830
+ return Object.freeze({
831
+ schema: RMT_STATE_SELECTOR_RUNTIME_SCHEMA,
832
+ apply(root, bindings, runtime) {
833
+ return applyRmtStateBindings(root, bindings, runtime, options);
834
+ }
835
+ });
836
+ }
837
+
838
+ const api = {
839
+ RMT_STATE_SELECTOR_DIAGNOSTIC_SCHEMA,
840
+ RMT_STATE_SELECTOR_RUNTIME_SCHEMA,
841
+ applyRmtStateBindings,
842
+ createRmtStateBindingAdapter,
843
+ createRmtStateSelectorRuntime,
844
+ createRmtXStateBridge,
845
+ planRmtStatePatch
846
+ };
847
+
848
+ if (typeof module !== 'undefined' && module.exports) {
849
+ module.exports = api;
850
+ }
851
+ if (globalTarget) {
852
+ globalTarget.XTendRmtStateSelectorRuntime = api;
853
+ }
854
+ })(typeof globalThis !== 'undefined' ? globalThis : (typeof window !== 'undefined' ? window : this));
855
+
856
+ const __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__ = globalThis.XTendRmtStateSelectorRuntime;
857
+
858
+ export const RMT_STATE_SELECTOR_DIAGNOSTIC_SCHEMA = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.RMT_STATE_SELECTOR_DIAGNOSTIC_SCHEMA;
859
+ export const RMT_STATE_SELECTOR_RUNTIME_SCHEMA = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.RMT_STATE_SELECTOR_RUNTIME_SCHEMA;
860
+ export const applyRmtStateBindings = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.applyRmtStateBindings;
861
+ export const createRmtStateBindingAdapter = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.createRmtStateBindingAdapter;
862
+ export const createRmtStateSelectorRuntime = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.createRmtStateSelectorRuntime;
863
+ export const createRmtXStateBridge = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.createRmtXStateBridge;
864
+ export const planRmtStatePatch = __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__.planRmtStatePatch;
865
+
866
+ export default __XTEND_RMT_STATE_SELECTOR_RUNTIME_API__;