@pwfabric/runtime 1.0.0-rc.0 → 1.0.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 (455) hide show
  1. package/README.md +35 -5
  2. package/dist/a11y/announcer.d.ts +0 -1
  3. package/dist/a11y/announcer.js.map +1 -1
  4. package/dist/a11y/contrast.d.ts +0 -1
  5. package/dist/a11y/contrast.js.map +1 -1
  6. package/dist/a11y/focus.d.ts +0 -1
  7. package/dist/a11y/focus.js.map +1 -1
  8. package/dist/a11y/index.d.ts +0 -1
  9. package/dist/a11y/index.js.map +1 -1
  10. package/dist/a11y/keyboard.d.ts +0 -1
  11. package/dist/a11y/keyboard.js.map +1 -1
  12. package/dist/adapters/default-image.d.ts +0 -1
  13. package/dist/adapters/default-image.js.map +1 -1
  14. package/dist/adapters/index.d.ts +0 -1
  15. package/dist/adapters/index.js.map +1 -1
  16. package/dist/adapters/next-image.d.ts +0 -1
  17. package/dist/adapters/next-image.js.map +1 -1
  18. package/dist/adapters/types.d.ts +0 -1
  19. package/dist/adapters/types.js.map +1 -1
  20. package/dist/analytics/index.d.ts +0 -1
  21. package/dist/analytics/index.js.map +1 -1
  22. package/dist/analytics/tracker.d.ts +0 -1
  23. package/dist/analytics/tracker.js.map +1 -1
  24. package/dist/analytics/types.d.ts +0 -1
  25. package/dist/analytics/types.js.map +1 -1
  26. package/dist/auth/index.d.ts +0 -1
  27. package/dist/auth/index.js.map +1 -1
  28. package/dist/auth/provider.d.ts +0 -1
  29. package/dist/auth/provider.js.map +1 -1
  30. package/dist/auth/types.d.ts +0 -1
  31. package/dist/auth/types.js.map +1 -1
  32. package/dist/binding/collection.d.ts +0 -1
  33. package/dist/binding/collection.js.map +1 -1
  34. package/dist/binding/datasource.d.ts +0 -1
  35. package/dist/binding/datasource.js.map +1 -1
  36. package/dist/binding/engine.d.ts +0 -1
  37. package/dist/binding/engine.js.map +1 -1
  38. package/dist/binding/expression.d.ts +0 -1
  39. package/dist/binding/expression.js.map +1 -1
  40. package/dist/binding/index.d.ts +0 -1
  41. package/dist/binding/index.js.map +1 -1
  42. package/dist/binding/two-way.d.ts +0 -1
  43. package/dist/binding/two-way.js.map +1 -1
  44. package/dist/binding/types.d.ts +0 -1
  45. package/dist/binding/types.js.map +1 -1
  46. package/dist/blocks/component-types.d.ts +0 -1
  47. package/dist/blocks/component-types.js.map +1 -1
  48. package/dist/blocks/composition-rules.d.ts +0 -1
  49. package/dist/blocks/composition-rules.js.map +1 -1
  50. package/dist/blocks/hooks.d.ts +0 -1
  51. package/dist/blocks/hooks.js.map +1 -1
  52. package/dist/blocks/index.d.ts +0 -2
  53. package/dist/blocks/index.js +5 -6
  54. package/dist/blocks/index.js.map +1 -1
  55. package/dist/blocks/registry.d.ts +0 -1
  56. package/dist/blocks/registry.js.map +1 -1
  57. package/dist/blocks/rule-engine.d.ts +0 -1
  58. package/dist/blocks/rule-engine.js.map +1 -1
  59. package/dist/blocks/surface-event-context.d.ts +0 -1
  60. package/dist/blocks/surface-event-context.js.map +1 -1
  61. package/dist/blocks/surface-id-context.d.ts +0 -1
  62. package/dist/blocks/surface-id-context.js.map +1 -1
  63. package/dist/bus.d.ts +0 -1
  64. package/dist/bus.js.map +1 -1
  65. package/dist/cache/index.d.ts +0 -1
  66. package/dist/cache/index.js.map +1 -1
  67. package/dist/cache/memory.d.ts +0 -1
  68. package/dist/cache/memory.js.map +1 -1
  69. package/dist/cache/types.d.ts +0 -1
  70. package/dist/cache/types.js.map +1 -1
  71. package/dist/capability/index.d.ts +0 -1
  72. package/dist/capability/index.js.map +1 -1
  73. package/dist/capability/kernel-capabilities.d.ts +0 -1
  74. package/dist/capability/kernel-capabilities.js.map +1 -1
  75. package/dist/capability/platform-capabilities.d.ts +0 -1
  76. package/dist/capability/platform-capabilities.js.map +1 -1
  77. package/dist/capability/type-mapping.d.ts +0 -1
  78. package/dist/capability/type-mapping.js.map +1 -1
  79. package/dist/capability/validation.d.ts +0 -1
  80. package/dist/capability/validation.js.map +1 -1
  81. package/dist/connectors/declared-connector.d.ts +0 -1
  82. package/dist/connectors/declared-connector.js.map +1 -1
  83. package/dist/connectors/engine-registry.d.ts +0 -1
  84. package/dist/connectors/engine-registry.js.map +1 -1
  85. package/dist/connectors/index.d.ts +0 -1
  86. package/dist/connectors/index.js.map +1 -1
  87. package/dist/connectors/module-loader.d.ts +0 -1
  88. package/dist/connectors/module-loader.js.map +1 -1
  89. package/dist/connectors/types.d.ts +0 -1
  90. package/dist/connectors/types.js.map +1 -1
  91. package/dist/context.d.ts +0 -1
  92. package/dist/context.js.map +1 -1
  93. package/dist/data/DataCapabilityProvider.d.ts +0 -1
  94. package/dist/data/DataCapabilityProvider.js.map +1 -1
  95. package/dist/data/index.d.ts +0 -1
  96. package/dist/data/index.js.map +1 -1
  97. package/dist/data/manager.d.ts +0 -1
  98. package/dist/data/manager.js.map +1 -1
  99. package/dist/data/types.d.ts +0 -1
  100. package/dist/data/types.js.map +1 -1
  101. package/dist/entity/aggregate.d.ts +0 -1
  102. package/dist/entity/aggregate.js.map +1 -1
  103. package/dist/entity/apply-query.d.ts +0 -1
  104. package/dist/entity/apply-query.js.map +1 -1
  105. package/dist/entity/behavior.d.ts +0 -1
  106. package/dist/entity/behavior.js.map +1 -1
  107. package/dist/entity/connector.d.ts +0 -1
  108. package/dist/entity/connector.js.map +1 -1
  109. package/dist/entity/connectors/index.d.ts +0 -1
  110. package/dist/entity/connectors/index.js.map +1 -1
  111. package/dist/entity/connectors/static.d.ts +0 -1
  112. package/dist/entity/connectors/static.js.map +1 -1
  113. package/dist/entity/entity-datasource.d.ts +0 -1
  114. package/dist/entity/entity-datasource.js.map +1 -1
  115. package/dist/entity/facade.d.ts +0 -1
  116. package/dist/entity/facade.js.map +1 -1
  117. package/dist/entity/http-connector.d.ts +0 -1
  118. package/dist/entity/http-connector.js.map +1 -1
  119. package/dist/entity/index.d.ts +0 -1
  120. package/dist/entity/index.js.map +1 -1
  121. package/dist/entity/postgres-connector.d.ts +0 -1
  122. package/dist/entity/postgres-connector.js.map +1 -1
  123. package/dist/entity/registry.d.ts +0 -1
  124. package/dist/entity/registry.js.map +1 -1
  125. package/dist/entity/store.d.ts +0 -1
  126. package/dist/entity/store.js.map +1 -1
  127. package/dist/entity/types.d.ts +0 -1
  128. package/dist/entity/types.js.map +1 -1
  129. package/dist/execution-context.d.ts +0 -1
  130. package/dist/execution-context.js.map +1 -1
  131. package/dist/executor.d.ts +0 -1
  132. package/dist/executor.js.map +1 -1
  133. package/dist/forms/form-entity-bridge.d.ts +0 -1
  134. package/dist/forms/form-entity-bridge.js.map +1 -1
  135. package/dist/forms/form-write-target.d.ts +0 -1
  136. package/dist/forms/form-write-target.js.map +1 -1
  137. package/dist/forms/index.d.ts +0 -1
  138. package/dist/forms/index.js.map +1 -1
  139. package/dist/forms/named-control-values.d.ts +0 -1
  140. package/dist/forms/named-control-values.js.map +1 -1
  141. package/dist/forms/processor.d.ts +0 -1
  142. package/dist/forms/processor.js.map +1 -1
  143. package/dist/forms/types.d.ts +0 -1
  144. package/dist/forms/types.js.map +1 -1
  145. package/dist/forms/validator.d.ts +0 -1
  146. package/dist/forms/validator.js.map +1 -1
  147. package/dist/graph/index.d.ts +0 -1
  148. package/dist/graph/index.js.map +1 -1
  149. package/dist/graph/resolver.d.ts +0 -1
  150. package/dist/graph/resolver.js.map +1 -1
  151. package/dist/graph/types.d.ts +0 -1
  152. package/dist/graph/types.js.map +1 -1
  153. package/dist/hooks/useInstalledAtoms.d.ts +0 -1
  154. package/dist/hooks/useInstalledAtoms.js.map +1 -1
  155. package/dist/i18n/index.d.ts +0 -1
  156. package/dist/i18n/index.js.map +1 -1
  157. package/dist/i18n/translator.d.ts +0 -1
  158. package/dist/i18n/translator.js.map +1 -1
  159. package/dist/i18n/types.d.ts +0 -1
  160. package/dist/i18n/types.js.map +1 -1
  161. package/dist/index.d.ts +0 -1
  162. package/dist/index.js.map +1 -1
  163. package/dist/kernel.d.ts +0 -1
  164. package/dist/kernel.js.map +1 -1
  165. package/dist/perf/budget.d.ts +0 -1
  166. package/dist/perf/budget.js.map +1 -1
  167. package/dist/perf/index.d.ts +0 -1
  168. package/dist/perf/index.js.map +1 -1
  169. package/dist/perf/render-timer.d.ts +0 -1
  170. package/dist/perf/render-timer.js.map +1 -1
  171. package/dist/perf/reporter.d.ts +0 -1
  172. package/dist/perf/reporter.js.map +1 -1
  173. package/dist/perf/web-vitals.d.ts +0 -1
  174. package/dist/perf/web-vitals.js.map +1 -1
  175. package/dist/registry.d.ts +0 -1
  176. package/dist/registry.js.map +1 -1
  177. package/dist/render/BehaviorSurfaceProvider.d.ts +0 -1
  178. package/dist/render/BehaviorSurfaceProvider.js.map +1 -1
  179. package/dist/render/BlockErrorBoundary.d.ts +0 -1
  180. package/dist/render/BlockErrorBoundary.js.map +1 -1
  181. package/dist/render/DataBoundSurfaceRenderer.d.ts +0 -1
  182. package/dist/render/DataBoundSurfaceRenderer.js.map +1 -1
  183. package/dist/render/DynamicBlockWrapper.d.ts +0 -1
  184. package/dist/render/DynamicBlockWrapper.js.map +1 -1
  185. package/dist/render/appearance-resolver.d.ts +0 -1
  186. package/dist/render/appearance-resolver.js.map +1 -1
  187. package/dist/render/capability-gate.d.ts +0 -1
  188. package/dist/render/capability-gate.js.map +1 -1
  189. package/dist/render/conditional-states-css.d.ts +0 -1
  190. package/dist/render/conditional-states-css.js.map +1 -1
  191. package/dist/render/connections-context.d.ts +0 -1
  192. package/dist/render/connections-context.js.map +1 -1
  193. package/dist/render/dark-theme-css.d.ts +0 -1
  194. package/dist/render/dark-theme-css.js.map +1 -1
  195. package/dist/render/data-binding-types.d.ts +0 -1
  196. package/dist/render/data-binding-types.js.map +1 -1
  197. package/dist/render/data-cache.d.ts +0 -1
  198. package/dist/render/data-cache.js.map +1 -1
  199. package/dist/render/derive-dark-theme.d.ts +0 -1
  200. package/dist/render/derive-dark-theme.js.map +1 -1
  201. package/dist/render/dynamic-artifact-context.d.ts +0 -1
  202. package/dist/render/dynamic-artifact-context.js.map +1 -1
  203. package/dist/render/dynamic-block-loader.d.ts +0 -1
  204. package/dist/render/dynamic-block-loader.js.map +1 -1
  205. package/dist/render/endpoint.d.ts +0 -1
  206. package/dist/render/endpoint.js.map +1 -1
  207. package/dist/render/entity-facade-context.d.ts +0 -1
  208. package/dist/render/entity-facade-context.js.map +1 -1
  209. package/dist/render/group-states-css.d.ts +0 -1
  210. package/dist/render/group-states-css.js.map +1 -1
  211. package/dist/render/hooks/useSurfaceEvents.d.ts +0 -1
  212. package/dist/render/hooks/useSurfaceEvents.js.map +1 -1
  213. package/dist/render/hooks/useSurfaceId.d.ts +0 -1
  214. package/dist/render/hooks/useSurfaceId.js.map +1 -1
  215. package/dist/render/index.d.ts +0 -1
  216. package/dist/render/index.js.map +1 -1
  217. package/dist/render/interaction-rule-engine.d.ts +0 -1
  218. package/dist/render/interaction-rule-engine.js.map +1 -1
  219. package/dist/render/keyframes-css.d.ts +0 -1
  220. package/dist/render/keyframes-css.js.map +1 -1
  221. package/dist/render/query-state.d.ts +0 -1
  222. package/dist/render/query-state.js.map +1 -1
  223. package/dist/render/renderer.d.ts +0 -1
  224. package/dist/render/renderer.js.map +1 -1
  225. package/dist/render/resolve-expressions.d.ts +0 -1
  226. package/dist/render/resolve-expressions.js.map +1 -1
  227. package/dist/render/responsive-style-css.d.ts +0 -1
  228. package/dist/render/responsive-style-css.js.map +1 -1
  229. package/dist/render/responsive.d.ts +0 -1
  230. package/dist/render/responsive.js.map +1 -1
  231. package/dist/render/scoped-css.d.ts +0 -1
  232. package/dist/render/scoped-css.js.map +1 -1
  233. package/dist/render/shell-selection.d.ts +0 -1
  234. package/dist/render/shell-selection.js.map +1 -1
  235. package/dist/render/states-css.d.ts +0 -1
  236. package/dist/render/states-css.js.map +1 -1
  237. package/dist/render/surface-data-context.d.ts +0 -1
  238. package/dist/render/surface-data-context.js.map +1 -1
  239. package/dist/render/surface-event-bus.d.ts +0 -1
  240. package/dist/render/surface-event-bus.js.map +1 -1
  241. package/dist/render/surface-event-context.d.ts +0 -1
  242. package/dist/render/surface-event-context.js.map +1 -1
  243. package/dist/render/surface-id-context.d.ts +0 -1
  244. package/dist/render/surface-id-context.js.map +1 -1
  245. package/dist/render/theme-utils.d.ts +0 -1
  246. package/dist/render/theme-utils.js.map +1 -1
  247. package/dist/render/types.d.ts +0 -1
  248. package/dist/render/types.js.map +1 -1
  249. package/dist/render/visibility-css.d.ts +0 -1
  250. package/dist/render/visibility-css.js.map +1 -1
  251. package/dist/render/width-scope.d.ts +0 -1
  252. package/dist/render/width-scope.js.map +1 -1
  253. package/dist/render/write-only-sources.d.ts +0 -1
  254. package/dist/render/write-only-sources.js.map +1 -1
  255. package/dist/routing/index.d.ts +0 -1
  256. package/dist/routing/index.js.map +1 -1
  257. package/dist/routing/router.d.ts +0 -1
  258. package/dist/routing/router.js.map +1 -1
  259. package/dist/routing/types.d.ts +0 -1
  260. package/dist/routing/types.js.map +1 -1
  261. package/dist/seo/generator.d.ts +0 -1
  262. package/dist/seo/generator.js.map +1 -1
  263. package/dist/seo/index.d.ts +0 -1
  264. package/dist/seo/index.js.map +1 -1
  265. package/dist/seo/types.d.ts +0 -1
  266. package/dist/seo/types.js.map +1 -1
  267. package/dist/state/index.d.ts +0 -1
  268. package/dist/state/index.js.map +1 -1
  269. package/dist/state/manager.d.ts +0 -1
  270. package/dist/state/manager.js.map +1 -1
  271. package/dist/state/store.d.ts +0 -1
  272. package/dist/state/store.js.map +1 -1
  273. package/dist/state/types.d.ts +0 -1
  274. package/dist/state/types.js.map +1 -1
  275. package/dist/surface/expression.d.ts +0 -1
  276. package/dist/surface/expression.js.map +1 -1
  277. package/dist/surface/index.d.ts +0 -1
  278. package/dist/surface/index.js.map +1 -1
  279. package/dist/surface/interpreter.d.ts +0 -1
  280. package/dist/surface/interpreter.js.map +1 -1
  281. package/dist/surface/layout.d.ts +0 -1
  282. package/dist/surface/layout.js.map +1 -1
  283. package/dist/surface/output.d.ts +0 -1
  284. package/dist/surface/output.js.map +1 -1
  285. package/dist/surface/primitives.d.ts +0 -1
  286. package/dist/surface/primitives.js.map +1 -1
  287. package/dist/surface/renderer.d.ts +0 -1
  288. package/dist/surface/renderer.js.map +1 -1
  289. package/dist/surface/schemas.d.ts +0 -1
  290. package/dist/surface/schemas.js.map +1 -1
  291. package/dist/surface/transforms.d.ts +0 -1
  292. package/dist/surface/transforms.js.map +1 -1
  293. package/dist/surface/types.d.ts +0 -1
  294. package/dist/surface/types.js.map +1 -1
  295. package/dist/surface/validation.d.ts +0 -1
  296. package/dist/surface/validation.js.map +1 -1
  297. package/dist/validator.d.ts +0 -1
  298. package/dist/validator.js.map +1 -1
  299. package/package.json +41 -40
  300. package/dist/__tests__/dom-test-setup.d.ts +0 -21
  301. package/dist/__tests__/dom-test-setup.d.ts.map +0 -1
  302. package/dist/__tests__/dom-test-setup.js +0 -36
  303. package/dist/__tests__/dom-test-setup.js.map +0 -1
  304. package/dist/a11y/announcer.d.ts.map +0 -1
  305. package/dist/a11y/contrast.d.ts.map +0 -1
  306. package/dist/a11y/focus.d.ts.map +0 -1
  307. package/dist/a11y/index.d.ts.map +0 -1
  308. package/dist/a11y/keyboard.d.ts.map +0 -1
  309. package/dist/adapters/default-image.d.ts.map +0 -1
  310. package/dist/adapters/index.d.ts.map +0 -1
  311. package/dist/adapters/next-image.d.ts.map +0 -1
  312. package/dist/adapters/types.d.ts.map +0 -1
  313. package/dist/analytics/index.d.ts.map +0 -1
  314. package/dist/analytics/tracker.d.ts.map +0 -1
  315. package/dist/analytics/types.d.ts.map +0 -1
  316. package/dist/auth/index.d.ts.map +0 -1
  317. package/dist/auth/provider.d.ts.map +0 -1
  318. package/dist/auth/types.d.ts.map +0 -1
  319. package/dist/binding/collection.d.ts.map +0 -1
  320. package/dist/binding/datasource.d.ts.map +0 -1
  321. package/dist/binding/engine.d.ts.map +0 -1
  322. package/dist/binding/expression.d.ts.map +0 -1
  323. package/dist/binding/index.d.ts.map +0 -1
  324. package/dist/binding/two-way.d.ts.map +0 -1
  325. package/dist/binding/types.d.ts.map +0 -1
  326. package/dist/blocks/__test-fixtures__/block-fixtures.d.ts +0 -40
  327. package/dist/blocks/__test-fixtures__/block-fixtures.d.ts.map +0 -1
  328. package/dist/blocks/__test-fixtures__/block-fixtures.js +0 -506
  329. package/dist/blocks/__test-fixtures__/block-fixtures.js.map +0 -1
  330. package/dist/blocks/component-types.d.ts.map +0 -1
  331. package/dist/blocks/composition-rules.d.ts.map +0 -1
  332. package/dist/blocks/hooks.d.ts.map +0 -1
  333. package/dist/blocks/index.d.ts.map +0 -1
  334. package/dist/blocks/registry.d.ts.map +0 -1
  335. package/dist/blocks/rule-engine.d.ts.map +0 -1
  336. package/dist/blocks/surface-event-context.d.ts.map +0 -1
  337. package/dist/blocks/surface-id-context.d.ts.map +0 -1
  338. package/dist/bus.d.ts.map +0 -1
  339. package/dist/cache/index.d.ts.map +0 -1
  340. package/dist/cache/memory.d.ts.map +0 -1
  341. package/dist/cache/types.d.ts.map +0 -1
  342. package/dist/capability/index.d.ts.map +0 -1
  343. package/dist/capability/kernel-capabilities.d.ts.map +0 -1
  344. package/dist/capability/platform-capabilities.d.ts.map +0 -1
  345. package/dist/capability/type-mapping.d.ts.map +0 -1
  346. package/dist/capability/validation.d.ts.map +0 -1
  347. package/dist/connectors/declared-connector.d.ts.map +0 -1
  348. package/dist/connectors/engine-registry.d.ts.map +0 -1
  349. package/dist/connectors/index.d.ts.map +0 -1
  350. package/dist/connectors/module-loader.d.ts.map +0 -1
  351. package/dist/connectors/types.d.ts.map +0 -1
  352. package/dist/context.d.ts.map +0 -1
  353. package/dist/data/DataCapabilityProvider.d.ts.map +0 -1
  354. package/dist/data/index.d.ts.map +0 -1
  355. package/dist/data/manager.d.ts.map +0 -1
  356. package/dist/data/types.d.ts.map +0 -1
  357. package/dist/entity/aggregate.d.ts.map +0 -1
  358. package/dist/entity/apply-query.d.ts.map +0 -1
  359. package/dist/entity/behavior.d.ts.map +0 -1
  360. package/dist/entity/connector.d.ts.map +0 -1
  361. package/dist/entity/connectors/index.d.ts.map +0 -1
  362. package/dist/entity/connectors/static.d.ts.map +0 -1
  363. package/dist/entity/entity-datasource.d.ts.map +0 -1
  364. package/dist/entity/facade.d.ts.map +0 -1
  365. package/dist/entity/http-connector.d.ts.map +0 -1
  366. package/dist/entity/index.d.ts.map +0 -1
  367. package/dist/entity/postgres-connector.d.ts.map +0 -1
  368. package/dist/entity/registry.d.ts.map +0 -1
  369. package/dist/entity/store.d.ts.map +0 -1
  370. package/dist/entity/types.d.ts.map +0 -1
  371. package/dist/execution-context.d.ts.map +0 -1
  372. package/dist/executor.d.ts.map +0 -1
  373. package/dist/forms/form-entity-bridge.d.ts.map +0 -1
  374. package/dist/forms/form-write-target.d.ts.map +0 -1
  375. package/dist/forms/index.d.ts.map +0 -1
  376. package/dist/forms/named-control-values.d.ts.map +0 -1
  377. package/dist/forms/processor.d.ts.map +0 -1
  378. package/dist/forms/types.d.ts.map +0 -1
  379. package/dist/forms/validator.d.ts.map +0 -1
  380. package/dist/graph/index.d.ts.map +0 -1
  381. package/dist/graph/resolver.d.ts.map +0 -1
  382. package/dist/graph/types.d.ts.map +0 -1
  383. package/dist/hooks/useInstalledAtoms.d.ts.map +0 -1
  384. package/dist/i18n/index.d.ts.map +0 -1
  385. package/dist/i18n/translator.d.ts.map +0 -1
  386. package/dist/i18n/types.d.ts.map +0 -1
  387. package/dist/index.d.ts.map +0 -1
  388. package/dist/kernel.d.ts.map +0 -1
  389. package/dist/perf/budget.d.ts.map +0 -1
  390. package/dist/perf/index.d.ts.map +0 -1
  391. package/dist/perf/render-timer.d.ts.map +0 -1
  392. package/dist/perf/reporter.d.ts.map +0 -1
  393. package/dist/perf/web-vitals.d.ts.map +0 -1
  394. package/dist/registry.d.ts.map +0 -1
  395. package/dist/render/BehaviorSurfaceProvider.d.ts.map +0 -1
  396. package/dist/render/BlockErrorBoundary.d.ts.map +0 -1
  397. package/dist/render/DataBoundSurfaceRenderer.d.ts.map +0 -1
  398. package/dist/render/DynamicBlockWrapper.d.ts.map +0 -1
  399. package/dist/render/appearance-resolver.d.ts.map +0 -1
  400. package/dist/render/capability-gate.d.ts.map +0 -1
  401. package/dist/render/conditional-states-css.d.ts.map +0 -1
  402. package/dist/render/connections-context.d.ts.map +0 -1
  403. package/dist/render/dark-theme-css.d.ts.map +0 -1
  404. package/dist/render/data-binding-types.d.ts.map +0 -1
  405. package/dist/render/data-cache.d.ts.map +0 -1
  406. package/dist/render/derive-dark-theme.d.ts.map +0 -1
  407. package/dist/render/dynamic-artifact-context.d.ts.map +0 -1
  408. package/dist/render/dynamic-block-loader.d.ts.map +0 -1
  409. package/dist/render/endpoint.d.ts.map +0 -1
  410. package/dist/render/entity-facade-context.d.ts.map +0 -1
  411. package/dist/render/group-states-css.d.ts.map +0 -1
  412. package/dist/render/hooks/useSurfaceEvents.d.ts.map +0 -1
  413. package/dist/render/hooks/useSurfaceId.d.ts.map +0 -1
  414. package/dist/render/index.d.ts.map +0 -1
  415. package/dist/render/interaction-rule-engine.d.ts.map +0 -1
  416. package/dist/render/keyframes-css.d.ts.map +0 -1
  417. package/dist/render/query-state.d.ts.map +0 -1
  418. package/dist/render/renderer.d.ts.map +0 -1
  419. package/dist/render/resolve-expressions.d.ts.map +0 -1
  420. package/dist/render/responsive-style-css.d.ts.map +0 -1
  421. package/dist/render/responsive.d.ts.map +0 -1
  422. package/dist/render/scoped-css.d.ts.map +0 -1
  423. package/dist/render/shell-selection.d.ts.map +0 -1
  424. package/dist/render/states-css.d.ts.map +0 -1
  425. package/dist/render/surface-data-context.d.ts.map +0 -1
  426. package/dist/render/surface-event-bus.d.ts.map +0 -1
  427. package/dist/render/surface-event-context.d.ts.map +0 -1
  428. package/dist/render/surface-id-context.d.ts.map +0 -1
  429. package/dist/render/theme-utils.d.ts.map +0 -1
  430. package/dist/render/types.d.ts.map +0 -1
  431. package/dist/render/visibility-css.d.ts.map +0 -1
  432. package/dist/render/width-scope.d.ts.map +0 -1
  433. package/dist/render/write-only-sources.d.ts.map +0 -1
  434. package/dist/routing/index.d.ts.map +0 -1
  435. package/dist/routing/router.d.ts.map +0 -1
  436. package/dist/routing/types.d.ts.map +0 -1
  437. package/dist/seo/generator.d.ts.map +0 -1
  438. package/dist/seo/index.d.ts.map +0 -1
  439. package/dist/seo/types.d.ts.map +0 -1
  440. package/dist/state/index.d.ts.map +0 -1
  441. package/dist/state/manager.d.ts.map +0 -1
  442. package/dist/state/store.d.ts.map +0 -1
  443. package/dist/state/types.d.ts.map +0 -1
  444. package/dist/surface/expression.d.ts.map +0 -1
  445. package/dist/surface/index.d.ts.map +0 -1
  446. package/dist/surface/interpreter.d.ts.map +0 -1
  447. package/dist/surface/layout.d.ts.map +0 -1
  448. package/dist/surface/output.d.ts.map +0 -1
  449. package/dist/surface/primitives.d.ts.map +0 -1
  450. package/dist/surface/renderer.d.ts.map +0 -1
  451. package/dist/surface/schemas.d.ts.map +0 -1
  452. package/dist/surface/transforms.d.ts.map +0 -1
  453. package/dist/surface/types.d.ts.map +0 -1
  454. package/dist/surface/validation.d.ts.map +0 -1
  455. package/dist/validator.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-expressions.js","sourceRoot":"","sources":["../../src/render/resolve-expressions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-expressions.js","sourceRoot":"","sources":["../../src/render/resolve-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Expression Resolution for Block Props\n *\n * Resolves {{expression}} placeholders in block prop values.\n * Uses the existing expression engine (evaluate/interpolate) from surface/expression.\n *\n * Key behavior:\n * - Whole-value: \"{{items}}\" returns raw value (array, object, etc.)\n * - String interpolation: \"Total: {{count}}\" returns interpolated string\n * - Recursively walks block tree and nested objects/arrays in props\n *\n * @module @pwfabric/runtime/render/resolve-expressions\n */\n\nimport type { Block } from '@pwfabric/core'\nimport { BREAKPOINT_ORDER } from '@pwfabric/core'\nimport { evaluate, interpolate, createExpressionContext } from '../surface/expression.js'\nimport type { ExpressionContext } from '../surface/expression.js'\n\n// ============================================================\n// WHOLE-VALUE PATTERN\n// ============================================================\n\n/**\n * Matches a string that is exactly one expression placeholder with no surrounding text.\n * e.g. \"{{products}}\" or \"{{ state.x === 'a' ? 'primary' : 'outline' }}\"\n * The inner capture uses a negative lookahead to prevent matching across }} boundaries,\n * so \"{{a}} · {{b}}\" is NOT treated as a whole-value expression.\n */\nconst WHOLE_VALUE_PATTERN = /^\\{\\{((?:(?!\\}\\}).)+)\\}\\}$/s\n\n/**\n * Matches strings that contain at least one expression placeholder.\n */\nconst HAS_EXPRESSION_PATTERN = /\\{\\{.+?\\}\\}/\n\n// ============================================================\n// STRING RESOLUTION\n// ============================================================\n\n/**\n * Resolve a single string value.\n *\n * - If the string is exactly \"{{expr}}\", evaluate and return the raw value (preserving type).\n * - If the string contains embedded \"{{expr}}\", interpolate and return a string.\n * - Otherwise return as-is.\n */\nexport function resolveString(value: string, context: ExpressionContext): unknown {\n // Check for whole-value expression first\n const wholeMatch = WHOLE_VALUE_PATTERN.exec(value)\n if (wholeMatch) {\n const expr = (wholeMatch[1] ?? '').trim()\n const result = evaluate(expr, context)\n if (result.success) {\n return result.value\n }\n // On failure, return original string as fallback\n return value\n }\n\n // Check for embedded expressions\n if (HAS_EXPRESSION_PATTERN.test(value)) {\n const result = interpolate(value, context)\n if (result.success) {\n return result.value\n }\n // On failure, return original string as fallback\n return value\n }\n\n // No expressions, return as-is\n return value\n}\n\n// ============================================================\n// PROP VALUE RESOLUTION\n// ============================================================\n\n/**\n * Recursively resolve expressions in a prop value.\n * - Strings are checked for expressions\n * - Arrays and plain objects are traversed\n * - Other types pass through unchanged\n */\nfunction resolveValue(value: unknown, context: ExpressionContext): unknown {\n if (typeof value === 'string') {\n return resolveString(value, context)\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => resolveValue(item, context))\n }\n\n if (value !== null && typeof value === 'object') {\n const resolved: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n resolved[key] = resolveValue(val, context)\n }\n return resolved\n }\n\n return value\n}\n\n// ============================================================\n// BLOCK EXPRESSION RESOLUTION\n// ============================================================\n\n/**\n * Resolve all {{expression}} placeholders in a block tree.\n *\n * Creates a deep copy of the blocks with all string prop values\n * containing expressions resolved against the provided data context.\n *\n * @param blocks - Block array to resolve\n * @param data - Data context (keyed by source ID, plus 'state')\n * @param helpers - Optional additional helper functions\n * @returns New block array with resolved prop values\n */\nexport function resolveBlockExpressions(\n blocks: readonly Block[],\n data: Record<string, unknown>,\n helpers?: Record<string, (...args: unknown[]) => unknown>\n): Block[] {\n const context = createExpressionContext(data, helpers)\n return blocks\n .map((block) => resolveBlock(block, context, false))\n .filter((b): b is Block => b !== null)\n}\n\n/**\n * A block may carry a conditional-visibility expression — `visibleWhen` (or the\n * shorthand `if`) — a template string evaluated against surface state/data. When\n * it resolves falsy the block (and its subtree) is omitted from the render\n * entirely. This drives state-driven UI in the blocks-array receipt path:\n * form↔success toggles, wizard steps, \"show X only when {{state.y}}\". The\n * companion is a `setState` action (e.g. a form's onSubmitAction) flipping state.\n *\n * Falsy = empty string, 'false', 'undefined', 'null', '0', NaN or a falsy primitive.\n */\nfunction isFalsyCondition(value: unknown): boolean {\n if (value == null || value === false) return true\n if (typeof value === 'string') {\n const t = value.trim().toLowerCase()\n return t === '' || t === 'false' || t === 'undefined' || t === 'null' || t === '0'\n }\n if (typeof value === 'number') return value === 0 || Number.isNaN(value)\n return false\n}\n\n/**\n * Evaluate a `visibleWhen` / `if` condition. Unlike a prop, a condition that\n * cannot be evaluated has NO fallback value: a prop keeps its raw template so\n * the author can see it, but a raw template in a condition is a non-empty\n * string — truthy — and the block would show forever (a \"no results\" empty\n * state beside the results). FAIL CLOSED: not evaluable means hidden.\n */\nfunction evaluateCondition(\n condition: string,\n context: ExpressionContext\n): { ok: true; value: unknown } | { ok: false; error: string } {\n const whole = WHOLE_VALUE_PATTERN.exec(condition)\n if (whole) {\n const r = evaluate((whole[1] ?? '').trim(), context)\n return r.success ? { ok: true, value: r.value } : { ok: false, error: r.error }\n }\n if (HAS_EXPRESSION_PATTERN.test(condition)) {\n const r = interpolate(condition, context)\n return r.success ? { ok: true, value: r.value } : { ok: false, error: r.error }\n }\n return { ok: true, value: condition }\n}\n\n/** One warning per block + condition, not one per render. */\nconst warnedConditions = new Set<string>()\n\nfunction warnUnevaluable(blockId: string, condition: string, error: string): void {\n const nodeEnv = typeof process !== 'undefined' ? process.env?.['NODE_ENV'] : undefined\n if (nodeEnv === 'production') return\n const key = `${blockId}|${condition}`\n if (warnedConditions.has(key)) return\n if (warnedConditions.size > 500) warnedConditions.clear()\n warnedConditions.add(key)\n console.warn(\n `[surface] block \"${blockId}\": visibleWhen ${JSON.stringify(condition)} could not be evaluated, so the block is HIDDEN. ${error}`\n )\n}\n\n/** The block that gathers its descendants' fields into one submission. */\nfunction isFormBlock(block: Block): boolean {\n const type = String((block as { type?: unknown }).type ?? '')\n return type === 'form' || type.endsWith('/form')\n}\n\n/** `layout.hidden` is responsive; every breakpoint, so no authored one wins. */\nconst HIDDEN_AT_EVERY_BREAKPOINT: Readonly<Record<string, boolean>> = Object.freeze(\n Object.fromEntries(BREAKPOINT_ORDER.map((bp) => [bp, true]))\n)\n\n/**\n * Hidden but still mounted: the wrapper gets `display: none` through the\n * block's own layout (`layout.hidden`, the same switch the responsive layout\n * uses), so the renderer keeps the subtree — and its inputs — in the DOM.\n */\nfunction hideInPlace(block: Block): Block {\n const layout = block.layout as unknown as Record<string, unknown> | undefined\n return { ...block, layout: { ...(layout ?? {}), hidden: HIDDEN_AT_EVERY_BREAKPOINT } } as Block\n}\n\n/**\n * Resolve expressions in a single block and its children recursively.\n * Returns null when the block's `visibleWhen`/`if` condition resolves falsy\n * (or cannot be evaluated — see evaluateCondition).\n *\n * A reserved surface-state key `__show:<blockId>` (written by `showBlock`/\n * `hideBlock` actions) acts as a visibility OVERRIDE that is checked BEFORE\n * the `visibleWhen`/`if` template evaluation:\n * - `true` → block is forced VISIBLE (visibleWhen/if skipped)\n * - `false` → block is forced HIDDEN\n * - absent → fall through to the visibleWhen/if logic\n *\n * The key is read directly from the context data (not via the template\n * evaluator) because the colon in `__show:<id>` breaks the path grammar.\n *\n * INSIDE A FORM, HIDDEN MEANS HIDDEN — NOT UNMOUNTED. A wizard is\n * one `form` whose steps are sections gated by `visibleWhen: {{state.step == N}}`.\n * The form block gathers its values from the DOM (`new FormData(form)`), so an\n * unmounted step contributed nothing: the RSVP wizard submitted an empty\n * record, and going \"back\" remounted step 1 with empty inputs. A block under a\n * form is therefore kept in the tree with `layout.hidden` (display:none) — its\n * inputs keep their values and stay part of the submission. The form itself,\n * and everything outside forms, still unmounts as before.\n */\nfunction resolveBlock(block: Block, context: ExpressionContext, insideForm: boolean): Block | null {\n const stateMap = context.data['state'] as Record<string, unknown> | undefined\n const override = stateMap?.[`__show:${block.id}`]\n let hidden = override === false\n if (override !== true && override !== false) {\n const condition = (block as { visibleWhen?: unknown; if?: unknown }).visibleWhen\n ?? (block as { visibleWhen?: unknown; if?: unknown }).if\n if (typeof condition === 'string' && condition.trim()) {\n const r = evaluateCondition(condition, context)\n if (!r.ok) {\n warnUnevaluable(block.id, condition, r.error)\n hidden = true\n } else if (isFalsyCondition(r.value)) {\n hidden = true\n }\n }\n }\n if (hidden && !insideForm) return null\n\n const resolved = resolveVisibleBlock(block, context, insideForm || isFormBlock(block))\n return hidden ? hideInPlace(resolved) : resolved\n}\n\nfunction resolveVisibleBlock(block: Block, context: ExpressionContext, insideForm: boolean): Block {\n const resolvedProps = block.props\n ? (resolveValue(block.props, context) as Record<string, unknown>)\n : block.props\n\n // Item-template expansion (repeat + {{item.*}} scope): a block carrying a\n // block-level `repeat` expression treats its authored children as a PER-ITEM\n // TEMPLATE. The binding resolves to an array; for each element the template\n // subtree is cloned and re-resolved with `item` and `index` added to the\n // expression context — so `{{item.Title}}` / `{{index}}` resolve per row.\n // Cloned block ids get a `--<index>` suffix (unique React keys /\n // data-block-id). Without `repeat` nothing changes (children resolve\n // normally, byte-identical to the previous behavior); a non-array binding\n // (source still loading) expands to zero children rather than leaking the\n // raw template. First consumer: the repeater block family — but the\n // contract is deliberately block-agnostic (a plain container can repeat).\n const repeatExpr = (block as { repeat?: unknown }).repeat\n if (typeof repeatExpr === 'string' && repeatExpr.trim() && block.children?.length) {\n const resolved = resolveValue(repeatExpr, context)\n const items = Array.isArray(resolved) ? resolved : []\n const template = block.children\n const expanded: Block[] = []\n for (let index = 0; index < items.length; index++) {\n const itemContext: ExpressionContext = {\n ...context,\n data: { ...context.data, item: items[index], index },\n }\n for (const child of template) {\n const clone = resolveBlock(suffixIds(child, index), itemContext, insideForm)\n if (clone) expanded.push(clone)\n }\n }\n const { repeat: _repeat, ...rest } = block as Block & { repeat?: unknown }\n return markRepeatExpanded({ ...(rest as Block), props: resolvedProps, children: expanded })\n }\n\n if (block.children) {\n return {\n ...block,\n props: resolvedProps,\n children: block.children\n .map((child) => resolveBlock(child, context, insideForm))\n .filter((b): b is Block => b !== null),\n }\n }\n\n return {\n ...block,\n props: resolvedProps,\n }\n}\n\n/**\n * THE BLOCK THAT EXPANDED A REPEAT OWNS ITS CLONES' LAYOUT.\n *\n * `repeat` is stripped from the resolved block, so the renderer could no\n * longer tell a repeater from any other parent: every clone got the surface\n * default `gridColumn: span 12`, and inside the repeater's own grid\n * (`repeat(auto-fit, minmax(…))`) a 12-column span put each item on a row of\n * its own — every repeater wall rendered as one column. The mark survives\n * object spread (an own enumerable symbol key) and never reaches JSON, so the\n * surface document is unchanged; the renderer reads it through\n * `isRepeatExpanded` and leaves the clones to the parent's own grid.\n */\nconst REPEAT_EXPANDED: unique symbol = Symbol.for('pwfabric.repeatExpanded')\n\nfunction markRepeatExpanded(block: Block): Block {\n return { ...block, [REPEAT_EXPANDED]: true } as Block\n}\n\n/** True when this resolved block expanded a `repeat` — its children are clones. */\nexport function isRepeatExpanded(block: Block | undefined): boolean {\n return (block as { [REPEAT_EXPANDED]?: unknown } | undefined)?.[REPEAT_EXPANDED] === true\n}\n\n/**\n * Deep-clone a template subtree, suffixing every block id with `--<index>` so\n * expanded clones stay unique across rows (React keys, data-block-id lookups,\n * label htmlFor targets).\n */\nfunction suffixIds(block: Block, index: number): Block {\n return {\n ...block,\n id: `${block.id}--${index}`,\n ...(block.children\n ? { children: block.children.map((c) => suffixIds(c, index)) }\n : {}),\n }\n}\n"]}
@@ -40,4 +40,3 @@ export declare function blockResponsiveStyleCss(blockId: string, style: NonNulla
40
40
  * existing surfaces are byte-identical.
41
41
  */
42
42
  export declare function collectResponsiveStyleCss(blocks: readonly Block[], surfaceId?: string): string;
43
- //# sourceMappingURL=responsive-style-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"responsive-style-css.js","sourceRoot":"","sources":["../../src/render/responsive-style-css.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"responsive-style-css.js","sourceRoot":"","sources":["../../src/render/responsive-style-css.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Per-prop responsive style CSS generation (block.style values vary by breakpoint).\n *\n * `block.style` sits inline and can express a single value per property; it\n * cannot express media queries. A style prop whose value is a\n * `ResponsiveValue<string>` map (`{ xs?, sm?, md?, lg?, xl?, '2xl'? }`) instead\n * of a flat string declares a value that varies per breakpoint. The renderer\n * flattens the base (`xs` / smallest defined) value inline so SSR / no-JS get a\n * sane default; this collector emits the LARGER-breakpoint values as scoped,\n * mobile-first `min-width` media-query rules — keyed by the block's\n * `data-block-id` — that override upward. Same mechanism `layout.hideOn`/\n * `showOn` (visibility-css) and `block.states` (states-css) use.\n *\n * For a block with `style.padding = { xs:'8px', md:'24px', lg:'48px' }`:\n *\n * `@media (min-width:768px){[data-pw-surface] [data-block-id=\"<id>\"]{padding:24px}}`\n * `@media (min-width:1024px){[data-pw-surface] [data-block-id=\"<id>\"]{padding:48px}}`\n *\n * The `xs` (base) value is NOT emitted here — it is rendered inline by the\n * renderer. Flat string values emit zero bytes (the inline path owns them).\n * Blocks without any responsive style value emit zero bytes so existing\n * surfaces are byte-identical.\n *\n * @module @pwfabric/runtime/render/responsive-style-css\n */\n\nimport type { Block } from '@pwfabric/core'\nimport { BREAKPOINTS, BREAKPOINT_ORDER } from '@pwfabric/core'\nimport type { BreakpointName } from '@pwfabric/core'\nimport { blockSelector, camelToKebab, collectScopedCss, LAYOUT_HOIST_KEYS, WRAPPER_ATTR } from './scoped-css.js'\n\n/** Breakpoint name → `minWidth` px (same thresholds the span/visibility systems use). */\nfunction minWidthFor(bp: BreakpointName): number {\n return BREAKPOINTS.find((b) => b.name === bp)?.minWidth ?? 0\n}\n\n/** A per-breakpoint value map (the responsive form of a style prop value). */\ntype ResponsiveStyleValue = Partial<Record<BreakpointName, string>>\n\n/** A style prop value is responsive when it is a non-null object (not a flat string). */\nfunction isResponsiveValue(value: unknown): value is ResponsiveStyleValue {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * Emit the scoped per-breakpoint media-query CSS for a single block's\n * responsive style props. Targets `[data-block-id=\"<id>\"]` scoped under the\n * surface root so it cannot leak to the host page. Only breakpoints LARGER than\n * `xs` are emitted (the `xs`/base value is inline); each emitted breakpoint key\n * becomes a `@media (min-width:<px>)` rule. Returns '' when the block declares\n * no responsive style value.\n */\nexport function blockResponsiveStyleCss(\n blockId: string,\n style: NonNullable<Block['style']>,\n surfaceId?: string\n): string {\n const selector = blockSelector(blockId, surfaceId)\n // Group declarations by breakpoint so one prop's md value and another prop's\n // md value share a single `@media` rule (mirrors how a mobile-first stylesheet\n // would be authored). The base (smallest defined breakpoint per prop) is a\n // NON-media rule so ALL breakpoints live in the stylesheet — never inline.\n // (Inline always beats stylesheet rules incl. @media, so a flattened-inline\n // base would pin the value and the larger @media overrides would never apply.)\n // THE HOISTING RULE APPLIES ON THE SELECTOR SIDE TOO.\n //\n // `[data-block-id]` matches BOTH the wrapper AND the component root. For flat\n // values the renderer hoists margin/maxWidth/flex to the wrapper and removes\n // them from the root; for responsive values the value leaves the inline style\n // and lands here, so without the same split here the rule would apply TWICE\n // (`marginTop:'-40%'` → both -335px and -256px).\n //\n // Hence two sets: hoisted keys go ONLY to the wrapper, the rest ONLY to the\n // component root.\n const HOIST = new Set<string>(LAYOUT_HOIST_KEYS)\n const baseDecls: string[] = []\n const byBreakpoint = new Map<BreakpointName, string[]>()\n const baseHoist: string[] = []\n const byBreakpointHoist = new Map<BreakpointName, string[]>()\n\n for (const [prop, value] of Object.entries(style)) {\n if (!isResponsiveValue(value)) continue // flat string → inline path owns it\n let baseTaken = false\n // BREAKPOINT_ORDER is mobile-first ascending → first defined key is the base.\n for (const bp of BREAKPOINT_ORDER) {\n const v = value[bp]\n if (v === undefined) continue\n // `!important`: a block COMPONENT often applies the same CSS property\n // inline with its own default (e.g. the text block sets\n // `font-size: var(--pw-font-size-base)`). Inline beats any stylesheet rule,\n // so without `!important` the author's responsive value would be pinned to\n // the component default. Scoped to `[data-block-id]`, this only overrides\n // the one block's own responsive props. Base + larger are both `!important`\n // at equal specificity → source order (larger emitted later) wins on match.\n const hoisted = HOIST.has(prop)\n const bag = hoisted ? baseHoist : baseDecls\n const map = hoisted ? byBreakpointHoist : byBreakpoint\n if (!baseTaken) {\n bag.push(`${camelToKebab(prop)}:${v} !important`)\n baseTaken = true\n } else {\n const decls = map.get(bp) ?? []\n decls.push(`${camelToKebab(prop)}:${v} !important`)\n map.set(bp, decls)\n }\n }\n }\n\n let css = ''\n // Base (non-media) first, then ascending breakpoint order so larger\n // breakpoints (later in source) win the cascade at equal specificity.\n const emit = (sel: string, base: string[], map: Map<BreakpointName, string[]>): void => {\n if (base.length > 0) css += `${sel}{${base.join(';')}}`\n for (const bp of BREAKPOINT_ORDER) {\n const decls = map.get(bp)\n if (!decls || decls.length === 0) continue\n css += `@media (min-width:${minWidthFor(bp)}px){${sel}{${decls.join(';')}}}`\n }\n }\n emit(`${selector}:not(${WRAPPER_ATTR})`, baseDecls, byBreakpoint)\n emit(`${selector}${WRAPPER_ATTR}`, baseHoist, byBreakpointHoist)\n return css\n}\n\n/**\n * Walk a surface block tree and concatenate the per-block responsive style CSS\n * for every block declaring a `ResponsiveValue` style prop. Blocks with only\n * flat string style values (or no style) are skipped (zero bytes emitted) so\n * existing surfaces are byte-identical.\n */\nexport function collectResponsiveStyleCss(blocks: readonly Block[], surfaceId?: string): string {\n return collectScopedCss(blocks, (block) =>\n block.style ? blockResponsiveStyleCss(block.id, block.style, surfaceId) : ''\n )\n}\n"]}
@@ -47,4 +47,3 @@ export declare function resolveMeasureStyle(viewport: BreakpointName, gap?: stri
47
47
  * Returns 'lg' on server (SSR fallback).
48
48
  */
49
49
  export declare function useViewport(): BreakpointName;
50
- //# sourceMappingURL=responsive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"responsive.js","sourceRoot":"","sources":["../../src/render/responsive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"responsive.js","sourceRoot":"","sources":["../../src/render/responsive.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Responsive Rendering Utilities\n *\n * Viewport-aware layout resolution for runtime rendering.\n * Re-exports pure functions from @pwfabric/core and provides\n * React-specific viewport hook.\n *\n * @module @pwfabric/runtime/render/responsive\n */\n\nimport * as React from 'react'\nimport type { BlockLayout, BreakpointName } from '@pwfabric/core'\nimport {\n BREAKPOINTS,\n resolveSpanAtBreakpoint,\n resolveResponsiveValue,\n getColumnsAtBreakpoint,\n getBreakpointForWidth,\n} from '@pwfabric/core'\n\n// Re-export pure functions for convenience\nexport {\n resolveResponsiveValue,\n resolveSpanAtBreakpoint,\n getColumnsAtBreakpoint,\n getBreakpointForWidth,\n} from '@pwfabric/core'\n\n// ============================================================\n// BLOCK STYLE RESOLUTION\n// ============================================================\n\n/**\n * Resolve the complete block layout at a given viewport breakpoint.\n * Returns span, offset, order, and hidden values.\n */\nexport function resolveBlockLayout(\n layout: BlockLayout,\n viewport: BreakpointName\n): {\n span: number\n offset: number | undefined\n order: number | undefined\n hidden: boolean | undefined\n} {\n return {\n span: resolveSpanAtBreakpoint(layout, viewport),\n offset: resolveResponsiveValue(layout.offset, viewport),\n order: resolveResponsiveValue(layout.order, viewport),\n hidden: resolveResponsiveValue(layout.hidden, viewport),\n }\n}\n\n/**\n * Surface root — carries NO MEASURE.\n *\n * If the root carried both the 12-column grid and\n * `maxWidth: var(--pw-layout-container-max-width)` + `margin: 0 auto`,\n * persistent chrome would sit inside the centred box too (a persistent rail\n * would start well in from the screen edge, as part of the narrower container).\n *\n * The measure goes to the inner container through `resolveMeasureStyle`;\n * the root is flow only.\n */\nexport function resolveSurfaceRootStyle(\n gap: string | number = 16,\n padding: string | number = 0\n): React.CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: typeof gap === 'number' ? `${gap}px` : gap,\n padding: typeof padding === 'number' ? `${padding}px` : padding,\n }\n}\n\n/**\n * Measured container — the wrapper of `container`-scoped blocks.\n *\n * The 12-column grid and `containerMaxWidth` live HERE. Blocks that declare\n * `widthScope:'viewport'` are drawn as SIBLINGS of this container, not its\n * children — the escape is placement, not a CSS trick (see render/width-scope.ts).\n */\nexport function resolveMeasureStyle(\n viewport: BreakpointName,\n gap: string | number = 16,\n padding: string | number = 24,\n containerMaxWidth = 'var(--pw-layout-container-max-width)'\n): React.CSSProperties {\n const columns = getColumnsAtBreakpoint(viewport)\n return {\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gap: typeof gap === 'number' ? `${gap}px` : gap,\n padding: typeof padding === 'number' ? `${padding}px` : padding,\n maxWidth: containerMaxWidth,\n margin: '0 auto',\n width: '100%',\n }\n}\n\n// ============================================================\n// VIEWPORT HOOK\n// ============================================================\n\n/**\n * React hook that returns the current viewport breakpoint.\n * Uses matchMedia for efficient viewport detection.\n *\n * Returns 'lg' on server (SSR fallback).\n */\nexport function useViewport(): BreakpointName {\n const [breakpoint, setBreakpoint] = React.useState<BreakpointName>('lg')\n\n React.useEffect(() => {\n // Set initial value from current window width\n setBreakpoint(getBreakpointForWidth(window.innerWidth))\n\n // Create media query listeners for each breakpoint transition\n const listeners: { mql: MediaQueryList; handler: () => void }[] = []\n\n for (const bp of BREAKPOINTS) {\n const mql = window.matchMedia(`(min-width: ${bp.minWidth}px)`)\n const handler = (): void => {\n setBreakpoint(getBreakpointForWidth(window.innerWidth))\n }\n mql.addEventListener('change', handler)\n listeners.push({ mql, handler })\n }\n\n return () => {\n for (const { mql, handler } of listeners) {\n mql.removeEventListener('change', handler)\n }\n }\n }, [])\n\n return breakpoint\n}\n"]}
@@ -69,4 +69,3 @@ export declare const FLEX_HOIST_KEYS: readonly ["flex", "flexGrow", "flexShrink"
69
69
  export declare const LAYOUT_HOIST_KEYS: readonly ["margin", "marginTop", "marginRight", "marginBottom", "marginLeft", "maxWidth", "minWidth", "flex", "flexGrow", "flexShrink", "flexBasis"];
70
70
  /** The attribute that tells the wrapper from the component root (the same marker states-css uses). */
71
71
  export declare const WRAPPER_ATTR = "[data-block-wrapper]";
72
- //# sourceMappingURL=scoped-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scoped-css.js","sourceRoot":"","sources":["../../src/render/scoped-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AAC7D,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,mBAAmB,WAAW,CAAC,EAAE,CAAC,IAAI,CAAA;AAC/C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,OAAO,SAAS,CAAC,CAAC,CAAC,qBAAqB,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC1F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,SAAkB;IAC1D,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAA;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAwB,EACxB,UAAoC;IAEpC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,MAAM,IAAI,GAAG,CAAC,KAAY,EAAQ,EAAE;QAClC,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAA;IACD,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAU,CAAA;AAEvF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ;IACR,WAAW;IACX,aAAa;IACb,cAAc;IACd,YAAY;IACZ,UAAU;IACV,UAAU;IACV,GAAG,eAAe;CACV,CAAA;AAEV,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAA"}
1
+ {"version":3,"file":"scoped-css.js","sourceRoot":"","sources":["../../src/render/scoped-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AAC7D,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,mBAAmB,WAAW,CAAC,EAAE,CAAC,IAAI,CAAA;AAC/C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,OAAO,SAAS,CAAC,CAAC,CAAC,qBAAqB,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC1F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,SAAkB;IAC1D,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAA;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAwB,EACxB,UAAoC;IAEpC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,MAAM,IAAI,GAAG,CAAC,KAAY,EAAQ,EAAE;QAClC,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAA;IACD,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAU,CAAA;AAEvF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ;IACR,WAAW;IACX,aAAa;IACb,cAAc;IACd,YAAY;IACZ,UAAU;IACV,UAAU;IACV,GAAG,eAAe;CACV,CAAA;AAEV,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAA","sourcesContent":["/**\n * Shared helpers for the scoped per-block CSS collectors.\n *\n * The runtime emits several kinds of scoped `<style>` rules keyed by a block's\n * stable `data-block-id` (visibility / interaction-states / responsive-style /\n * conditional-states / group-states). They all share the SAME primitives:\n *\n * - `cssEscapeId(id)` — conservative attribute-value escaper for block ids.\n * - `camelToKebab(prop)` — CSS camelCase property name → kebab-case.\n * - `blockSelector(id)` — `[data-pw-surface] [data-block-id=\"<escaped>\"]`,\n * the scoped base selector every rule attaches to.\n * - `collectScopedCss(blocks, perBlockFn)` — walk the block tree (including\n * children) and concatenate each block's CSS as\n * produced by `perBlockFn(block)`.\n *\n * Centralising these keeps the per-collector files focused on their own\n * selector/declaration semantics and guarantees byte-identical output across\n * the family (the same escaper, the same selector string, the same walk order).\n *\n * @module @pwfabric/runtime/render/scoped-css\n */\n\nimport type { Block } from '@pwfabric/core'\n\n/** Conservative CSS attribute-selector value escaper (block ids are slugs, but be safe). */\nexport function cssEscapeId(id: string): string {\n return id.replace(/[\"\\\\]/g, '\\\\$&')\n}\n\n/** camelCase CSS property → kebab-case (e.g. `backgroundColor` → `background-color`). */\nexport function camelToKebab(prop: string): string {\n return prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)\n}\n\n/** The bare `[data-block-id=\"<escaped-id>\"]` attribute selector (no surface scope). */\nexport function blockIdAttr(id: string): string {\n return `[data-block-id=\"${cssEscapeId(id)}\"]`\n}\n\n/**\n * The surface-root selector a scoped rule hangs off.\n *\n * With a `surfaceId` this is `[data-pw-surface=\"<id>\"]` — scope carried by the\n * attribute's VALUE, not merely its presence. That matters because the embed\n * autoloader hydrates EVERY `[data-pw-surface]` element in a document, so a host\n * page can hold several surfaces at once; a value-less selector makes each\n * surface's rules apply to all of them, and the last one in document order wins.\n *\n * Without a `surfaceId` it degrades to the historical `[data-pw-surface]`, which\n * is correct for rules whose content is identical for every surface (the base\n * CSS) and for unit tests that render a single surface.\n */\nexport function surfaceScope(surfaceId?: string): string {\n return surfaceId ? `[data-pw-surface=\"${cssEscapeId(surfaceId)}\"]` : '[data-pw-surface]'\n}\n\n/**\n * The scoped base selector a per-block rule attaches to:\n * `[data-pw-surface=\"<sid>\"] [data-block-id=\"<escaped-id>\"]`. Scoped under the\n * surface root so a rule can never leak to the host page — and, when the surface\n * id is supplied, never to a SIBLING surface that happens to reuse a block id.\n */\nexport function blockSelector(id: string, surfaceId?: string): string {\n return `${surfaceScope(surfaceId)} ${blockIdAttr(id)}`\n}\n\n/**\n * Walk a surface block tree (depth-first, children after their parent — the\n * order all collectors used) and concatenate the per-block CSS produced by\n * `perBlockFn(block)`. Blocks for which `perBlockFn` returns '' contribute zero\n * bytes, so existing surfaces stay byte-identical.\n */\nexport function collectScopedCss(\n blocks: readonly Block[],\n perBlockFn: (block: Block) => string\n): string {\n let css = ''\n const walk = (block: Block): void => {\n css += perBlockFn(block)\n if (block.children) {\n for (const child of block.children) walk(child)\n }\n }\n for (const block of blocks) walk(block)\n return css\n}\n\n/**\n * Style keys HOISTED to the wrapper — kept here so the renderer and the\n * responsive CSS generator see the SAME list.\n *\n * This list is a RULE: these keys apply to the outer wrapper, not the\n * component root. For flat values the renderer hoists them; for responsive\n * values the value leaves the inline style entirely and lands in CSS, so the\n * same rule has to be expressed on the selector side — otherwise the rule\n * matches both the wrapper and the root and the value is applied TWICE\n * (`marginTop:'-40%'` would move content by both -335px and -256px).\n */\nexport const FLEX_HOIST_KEYS = ['flex', 'flexGrow', 'flexShrink', 'flexBasis'] as const\n\nexport const LAYOUT_HOIST_KEYS = [\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'maxWidth',\n 'minWidth',\n ...FLEX_HOIST_KEYS,\n] as const\n\n/** The attribute that tells the wrapper from the component root (the same marker states-css uses). */\nexport const WRAPPER_ATTR = '[data-block-wrapper]'\n"]}
@@ -67,4 +67,3 @@ export interface ShellSelectionOptions {
67
67
  */
68
68
  export declare function useShellSelection(key: string, options?: ShellSelectionOptions): readonly [string | undefined, (id: string | undefined) => void];
69
69
  export {};
70
- //# sourceMappingURL=shell-selection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-selection.js","sourceRoot":"","sources":["../../src/render/shell-selection.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell-selection.js","sourceRoot":"","sources":["../../src/render/shell-selection.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shell selection — the state a SPLIT shell runs on.\n *\n * WHY THIS IS IN THE RUNTIME AND NOT IN THE BLOCK. A split surface (list on the\n * left, detail on the right) has exactly one piece of state: which item is\n * selected. Kept inside the block it is invisible to everything else — the URL\n * does not move, so the page cannot be linked to, the browser Back button does\n * nothing, and a second block on the same surface (a header showing the\n * selected record's title, a toolbar acting on it) has no way to read it.\n *\n * So selection is a SURFACE-level fact with a URL projection:\n *\n * ?<key>=<itemId>\n *\n * and this module is the single place that reads and writes it.\n *\n * THE URL IS THE SOURCE OF TRUTH when syncing is on. React state mirrors it\n * rather than the other way round, which is what makes a pasted link, a Back\n * press and a click on the list all land in the same place — three paths, one\n * rule.\n *\n * INERT HOSTS DO NOT NAVIGATE. An editor or preview canvas renders the same\n * block with `interactionMode: 'inert'`; there the selection stays in memory and\n * the host's own URL is never touched. That mirrors the existing rule for blocks\n * that navigate or write data.\n */\nimport * as React from 'react'\n\n// ============================================================\n// STORE\n// ============================================================\n\ntype Listener = () => void\n\nexport interface ShellSelectionStore {\n /** Current selection for a key, or undefined when nothing is selected. */\n get(key: string): string | undefined\n /** Select an item. Writes the URL when this store syncs. */\n set(key: string, id: string | undefined): void\n subscribe(listener: Listener): () => void\n readonly syncUrl: boolean\n}\n\nfunction readFromUrl(key: string): string | undefined {\n if (typeof window === 'undefined') return undefined\n const value = new URLSearchParams(window.location.search).get(key)\n return value === null || value === '' ? undefined : value\n}\n\n/**\n * Create a selection store.\n *\n * `syncUrl: false` gives an in-memory store with identical semantics — the same\n * hook, the same cross-block sharing, no address-bar side effects.\n */\nexport function createShellSelectionStore(syncUrl: boolean): ShellSelectionStore {\n const memory = new Map<string, string | undefined>()\n const listeners = new Set<Listener>()\n const emit = (): void => {\n for (const l of [...listeners]) l()\n }\n\n if (syncUrl && typeof window !== 'undefined') {\n window.addEventListener('popstate', emit)\n }\n\n return {\n syncUrl,\n get(key) {\n // URL first: a Back press changes the address without going through\n // `set`, so reading memory would serve a stale value.\n if (syncUrl) return readFromUrl(key) ?? memory.get(key)\n return memory.get(key)\n },\n set(key, id) {\n memory.set(key, id)\n if (syncUrl && typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n if (id === undefined) url.searchParams.delete(key)\n else url.searchParams.set(key, id)\n // pushState, not replaceState: selecting a record is a navigation the\n // user expects Back to undo. That is the whole point of putting it in\n // the URL rather than in a ref.\n if (url.href !== window.location.href) window.history.pushState({}, '', url)\n }\n emit()\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\n// ============================================================\n// CONTEXT\n// ============================================================\n\nexport const ShellSelectionContext = React.createContext<ShellSelectionStore | null>(null)\n\nexport interface ShellSelectionProviderProps {\n /** Off for editor/preview canvases — selection works, the address bar does not move. */\n readonly syncUrl?: boolean\n readonly children: React.ReactNode\n}\n\nexport function ShellSelectionProvider({\n syncUrl = true,\n children,\n}: ShellSelectionProviderProps): React.ReactElement {\n const store = React.useMemo(() => createShellSelectionStore(syncUrl), [syncUrl])\n return <ShellSelectionContext.Provider value={store}>{children}</ShellSelectionContext.Provider>\n}\n\n// ============================================================\n// HOOK\n// ============================================================\n\nexport interface ShellSelectionOptions {\n /** Selected when the URL carries nothing — normally the first list item. */\n readonly fallback?: string | undefined\n /**\n * Override the provider. A block rendered inert must not move the host's URL\n * even when the surrounding surface is live.\n */\n readonly syncUrl?: boolean\n}\n\n/**\n * Read and write the shell selection for `key`.\n *\n * Works with OR without a provider: with no `ShellSelectionProvider` above it,\n * the hook makes its own store, so a block dropped into a bare React tree keeps\n * behaving instead of throwing. The provider only widens the scope — one store\n * per surface means two blocks reading the same key see the same value.\n */\nexport function useShellSelection(\n key: string,\n options: ShellSelectionOptions = {}\n): readonly [string | undefined, (id: string | undefined) => void] {\n const provided = React.useContext(ShellSelectionContext)\n const wantsSync = options.syncUrl ?? provided?.syncUrl ?? true\n // A provider whose sync setting disagrees with this block's is not usable —\n // an inert block inside a live surface must not push history.\n const usable = provided && provided.syncUrl === wantsSync ? provided : null\n const fallbackStore = React.useMemo(\n () => (usable ? null : createShellSelectionStore(wantsSync)),\n [usable, wantsSync]\n )\n const store = usable ?? (fallbackStore as ShellSelectionStore)\n\n const subscribe = React.useCallback((l: Listener) => store.subscribe(l), [store])\n const selected = React.useSyncExternalStore(\n subscribe,\n () => store.get(key),\n // Server render: no URL, no memory — the fallback is the honest answer.\n () => undefined\n )\n\n const select = React.useCallback(\n (id: string | undefined) => {\n store.set(key, id)\n },\n [store, key]\n )\n\n return [selected ?? options.fallback, select] as const\n}\n"]}
@@ -30,4 +30,3 @@ export declare function blockStatesCss(blockId: string, states: NonNullable<Bloc
30
30
  * bytes emitted) so existing surfaces are byte-identical.
31
31
  */
32
32
  export declare function collectStatesCss(blocks: readonly Block[], surfaceId?: string): string;
33
- //# sourceMappingURL=states-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"states-css.js","sourceRoot":"","sources":["../../src/render/states-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,wEAAwE;AACxE,MAAM,eAAe,GAAiD;IACpE,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,gBAAgB;CACxB,CAAA;AAED,iFAAiF;AACjF,SAAS,UAAU,CAAC,KAAuC;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;SACxD,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,MAAoC,EACpC,SAAkB;IAElB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAClD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACvD,4EAA4E;QAC5E,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,uBAAuB;QACvB,GAAG,IAAI,GAAG,QAAQ,6BAA6B,eAAe,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAA;IAC7F,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB,EAAE,SAAkB;IAC3E,OAAO,gBAAgB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CACxC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACtE,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"states-css.js","sourceRoot":"","sources":["../../src/render/states-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,wEAAwE;AACxE,MAAM,eAAe,GAAiD;IACpE,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,gBAAgB;CACxB,CAAA;AAED,iFAAiF;AACjF,SAAS,UAAU,CAAC,KAAuC;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;SACxD,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,MAAoC,EACpC,SAAkB;IAElB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAClD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACvD,4EAA4E;QAC5E,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,uBAAuB;QACvB,GAAG,IAAI,GAAG,QAAQ,6BAA6B,eAAe,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAA;IAC7F,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB,EAAE,SAAkB;IAC3E,OAAO,gBAAgB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CACxC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CACtE,CAAA;AACH,CAAC","sourcesContent":["/**\n * Interaction-state CSS generation (token-driven hover/active/focus).\n *\n * `block.style` sits inline and cannot express pseudo-classes, so per-state\n * styling lives in `block.states` and the runtime emits scoped CSS rules —\n * keyed by the block's `data-block-id` — into the surface's generated\n * `<style>` (the SAME mechanism `layout.hideOn`/`showOn` use). For a block\n * with `states`, the runtime emits:\n *\n * `[data-pw-surface] [data-block-id=\"<id>\"]:hover{ … }`\n * `[data-pw-surface] [data-block-id=\"<id>\"]:active{ … }`\n * `[data-pw-surface] [data-block-id=\"<id>\"]:focus-visible{ … }`\n *\n * Keys are CSS camelCase property names (converted to kebab-case); values pass\n * through untouched, so `var(--pw-color-primary-subtle)` works. Blocks without\n * `states` emit zero bytes so existing surfaces are byte-identical.\n *\n * @module @pwfabric/runtime/render/states-css\n */\n\nimport type { Block } from '@pwfabric/core'\nimport { blockSelector, camelToKebab, collectScopedCss } from './scoped-css.js'\n\n/** Pseudo-state → selector suffix. `focus` maps to `:focus-visible`. */\nconst STATE_SELECTORS: Record<'hover' | 'active' | 'focus', string> = {\n hover: ':hover',\n active: ':active',\n focus: ':focus-visible',\n}\n\n/** Serialize a camelCase decl record to `prop:value;…` (values pass through). */\nfunction declsToCss(decls: Readonly<Record<string, string>>): string {\n return Object.entries(decls)\n .map(([prop, value]) => `${camelToKebab(prop)}:${value}`)\n .join(';')\n}\n\n/**\n * Emit the scoped CSS rule(s) for a single block's interaction states. Targets\n * `[data-block-id=\"<id>\"]<pseudo>` scoped under the surface root so it cannot\n * leak to the host page. Returns '' when the block declares no non-empty state.\n */\nexport function blockStatesCss(\n blockId: string,\n states: NonNullable<Block['states']>,\n surfaceId?: string\n): string {\n const selector = blockSelector(blockId, surfaceId)\n let css = ''\n for (const key of ['hover', 'active', 'focus'] as const) {\n const decls = states[key]\n if (!decls || Object.keys(decls).length === 0) continue\n // `data-block-id` lives on BOTH the renderer wrapper and the component root\n // (the wrapper keeps `data-block-wrapper`). A state rule keyed on the bare\n // id therefore fired twice: the square wrapper took the hover box-shadow\n // (square corners bleeding out from under a rounded card) and transforms\n // compounded. Exclude the wrapper — visual states belong to the styled\n // component root only.\n css += `${selector}:not([data-block-wrapper])${STATE_SELECTORS[key]}{${declsToCss(decls)}}`\n }\n return css\n}\n\n/**\n * Walk a surface block tree and concatenate the per-block interaction-state CSS\n * for every block declaring `states`. Blocks without `states` are skipped (zero\n * bytes emitted) so existing surfaces are byte-identical.\n */\nexport function collectStatesCss(blocks: readonly Block[], surfaceId?: string): string {\n return collectScopedCss(blocks, (block) =>\n block.states ? blockStatesCss(block.id, block.states, surfaceId) : ''\n )\n}\n"]}
@@ -16,4 +16,3 @@
16
16
  export type SurfaceData = Readonly<Record<string, unknown>>;
17
17
  export declare const SurfaceDataContext: import("react").Context<Readonly<Record<string, unknown>> | null>;
18
18
  export declare function useSurfaceData(): SurfaceData | null;
19
- //# sourceMappingURL=surface-data-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"surface-data-context.js","sourceRoot":"","sources":["../../src/render/surface-data-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAIjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAA;AAEzE,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACvC,CAAC"}
1
+ {"version":3,"file":"surface-data-context.js","sourceRoot":"","sources":["../../src/render/surface-data-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAIjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAA;AAEzE,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACvC,CAAC","sourcesContent":["/**\n * Surface Data Context\n *\n * What the data-bound renderer has CURRENTLY bound, keyed by source id — the\n * same object block expressions resolve `{{<sourceId>}}` against, offered to\n * the providers that sit between the data layer and the blocks.\n *\n * The form writer needs it: a binding that says `PATCH` can only name a\n * record the page has loaded, and until this context existed the writer\n * could not see one — so it patched the collection path and the API said\n * 404. `null` outside the data-bound path (behaviours-only surfaces, plain\n * `SurfaceRenderer`), where there is nothing bound to consult.\n *\n * @module @pwfabric/runtime/render/surface-data-context\n */\n\nimport { createContext, useContext } from 'react'\n\nexport type SurfaceData = Readonly<Record<string, unknown>>\n\nexport const SurfaceDataContext = createContext<SurfaceData | null>(null)\n\nexport function useSurfaceData(): SurfaceData | null {\n return useContext(SurfaceDataContext)\n}\n"]}
@@ -17,4 +17,3 @@ import type { SurfaceEventBus } from '@pwfabric/contracts';
17
17
  * prefix (e.g. `"capability:data-loaded"`).
18
18
  */
19
19
  export declare function createSurfaceEventBus(): SurfaceEventBus;
20
- //# sourceMappingURL=surface-event-bus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"surface-event-bus.js","sourceRoot":"","sources":["../../src/render/surface-event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAA;IAE5D,OAAO;QACL,IAAI,CAAC,KAA6B;YAChC,gEAAgE;YAChE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC3C,iDAAiD;gBACjD,KAAK,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,6BAA6B,EAAE,EAAE,EAAE;oBAC5E,MAAM,MAAM,GACV,6BAA6B,CAAC,KAAK,CAAC,IAAkD,CAAC,CAAA;oBACzF,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;wBAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;4BACpB,OAAO,CAAC,IAAI,CACV,qDAAqD,KAAK,CAAC,IAAI,IAAI,EACnE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACvB,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,wBAAwB;YACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACnC,CAAC;YAED,+DAA+D;YAC/D,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACtC,CAAC;YAED,yEAAyE;YACzE,qEAAqE;YACrE,2EAA2E;YAC3E,uEAAuE;YACvE,wDAAwD;YACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,EAAE,CAAC,SAAiB,EAAE,OAA4B;YAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;YACpC,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;YACrC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,CAAC;QAED,GAAG,CAAC,SAAiB,EAAE,OAA4B;YACjD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"surface-event-bus.js","sourceRoot":"","sources":["../../src/render/surface-event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAA;IAE5D,OAAO;QACL,IAAI,CAAC,KAA6B;YAChC,gEAAgE;YAChE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC3C,iDAAiD;gBACjD,KAAK,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,6BAA6B,EAAE,EAAE,EAAE;oBAC5E,MAAM,MAAM,GACV,6BAA6B,CAAC,KAAK,CAAC,IAAkD,CAAC,CAAA;oBACzF,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;wBAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;4BACpB,OAAO,CAAC,IAAI,CACV,qDAAqD,KAAK,CAAC,IAAI,IAAI,EACnE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACvB,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,wBAAwB;YACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACnC,CAAC;YAED,+DAA+D;YAC/D,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACtC,CAAC;YAED,yEAAyE;YACzE,qEAAqE;YACrE,2EAA2E;YAC3E,uEAAuE;YACvE,wDAAwD;YACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,EAAE,CAAC,SAAiB,EAAE,OAA4B;YAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;YACpC,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;YACrC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,CAAC;QAED,GAAG,CAAC,SAAiB,EAAE,OAA4B;YACjD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["/**\n * Surface Event Bus Implementation\n *\n * In-process pub/sub bus scoped to a single rendered surface.\n *\n * @module @pwfabric/runtime/render/surface-event-bus\n */\n\nimport type {\n SurfaceEventBus,\n SurfaceEventDescriptor,\n SurfaceEventHandler,\n Unsubscribe,\n} from '@pwfabric/contracts'\n\n/**\n * Create a new `SurfaceEventBus` instance.\n *\n * Each surface renderer creates its own bus so that events from one surface\n * do not leak into sibling or parent surfaces.\n *\n * Wildcard support: listeners registered as `\"<namespace>:*\"` (e.g.\n * `\"capability:*\"`) receive every event whose type starts with that namespace\n * prefix (e.g. `\"capability:data-loaded\"`).\n */\nexport function createSurfaceEventBus(): SurfaceEventBus {\n const handlers = new Map<string, Set<SurfaceEventHandler>>()\n\n return {\n emit(event: SurfaceEventDescriptor): void {\n // Dev-mode payload validation — async/lazy, does not block emit\n if (process.env.NODE_ENV === 'development') {\n // Import lazily to avoid prod bundle size impact\n void import('@pwfabric/contracts').then(({ SURFACE_EVENT_PAYLOAD_SCHEMAS }) => {\n const schema =\n SURFACE_EVENT_PAYLOAD_SCHEMAS[event.type as keyof typeof SURFACE_EVENT_PAYLOAD_SCHEMAS]\n if (schema && event.payload !== undefined) {\n const result = schema.safeParse(event.payload)\n if (!result.success) {\n console.warn(\n `[SurfaceEventBus] Payload validation warning for '${event.type}':`,\n result.error.flatten()\n )\n }\n }\n })\n }\n\n // Exact-match listeners\n const exactSet = handlers.get(event.type)\n if (exactSet) {\n exactSet.forEach((h) => h(event))\n }\n\n // Wildcard listeners for the namespace prefix (e.g. \"block:*\")\n const ns = event.type.split(':')[0]\n const wildcardSet = handlers.get(`${ns}:*`)\n if (wildcardSet) {\n wildcardSet.forEach((h) => h(event))\n }\n\n // Global wildcard \"*\" — every event. The surface renderer subscribes its\n // single event handler here so block-emitted events (with their full\n // payload, incl. a declarative `action`) reach the action dispatcher. This\n // is what lets a form's submit→setState run via the canonical bus path\n // instead of the retired legacy `context.onEvent` shim.\n const globalSet = handlers.get('*')\n if (globalSet) {\n globalSet.forEach((h) => h(event))\n }\n },\n\n on(eventType: string, handler: SurfaceEventHandler): Unsubscribe {\n if (!handlers.has(eventType)) {\n handlers.set(eventType, new Set())\n }\n handlers.get(eventType)?.add(handler)\n return () => handlers.get(eventType)?.delete(handler)\n },\n\n off(eventType: string, handler: SurfaceEventHandler): void {\n handlers.get(eventType)?.delete(handler)\n },\n }\n}\n"]}
@@ -9,4 +9,3 @@
9
9
  * @module @pwfabric/runtime/render/surface-event-context
10
10
  */
11
11
  export { SurfaceEventContext } from '../blocks/surface-event-context.js';
12
- //# sourceMappingURL=surface-event-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"surface-event-context.js","sourceRoot":"","sources":["../../src/render/surface-event-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA"}
1
+ {"version":3,"file":"surface-event-context.js","sourceRoot":"","sources":["../../src/render/surface-event-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA","sourcesContent":["/**\n * Surface Event Context\n *\n * Re-exports the canonical `SurfaceEventContext` from `@pwfabric/runtime/blocks`.\n * Runtime code that sets the context via\n * `BehaviorSurfaceProvider` and block components that consume it via\n * `useSurfaceEvents` share the same context object through this re-export.\n *\n * @module @pwfabric/runtime/render/surface-event-context\n */\n\nexport { SurfaceEventContext } from '../blocks/surface-event-context.js'\n"]}
@@ -6,4 +6,3 @@
6
6
  * @module @pwfabric/runtime/render/surface-id-context
7
7
  */
8
8
  export { SurfaceIdContext } from '../blocks/surface-id-context.js';
9
- //# sourceMappingURL=surface-id-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"surface-id-context.js","sourceRoot":"","sources":["../../src/render/surface-id-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA"}
1
+ {"version":3,"file":"surface-id-context.js","sourceRoot":"","sources":["../../src/render/surface-id-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA","sourcesContent":["/**\n * Surface ID Context\n *\n * Re-exports the canonical `SurfaceIdContext` from `@pwfabric/runtime/blocks`.\n *\n * @module @pwfabric/runtime/render/surface-id-context\n */\n\nexport { SurfaceIdContext } from '../blocks/surface-id-context.js'\n"]}
@@ -12,4 +12,3 @@
12
12
  * @module @pwfabric/runtime/render/theme-utils
13
13
  */
14
14
  export { surfaceThemeToCSS } from '@pwfabric/contracts';
15
- //# sourceMappingURL=theme-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-utils.js","sourceRoot":"","sources":["../../src/render/theme-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"theme-utils.js","sourceRoot":"","sources":["../../src/render/theme-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA","sourcesContent":["/**\n * Surface Theme Utilities\n *\n * Surface Theme Engine — converts SurfaceTheme to CSS custom properties.\n *\n * The implementation MOVED to `@pwfabric/contracts`\n * (`fabric/appearance-cascade`) shared with the theme exporter (export\n * `theme.css`) and the authoring studio (bake the dark variant at write time) need the same\n * transform, and `contracts` is the only leaf all three can reach. This module\n * stays as the runtime-facing name so existing import paths keep working.\n *\n * @module @pwfabric/runtime/render/theme-utils\n */\n\nexport { surfaceThemeToCSS } from '@pwfabric/contracts'\n"]}
@@ -280,4 +280,3 @@ export interface RenderResult {
280
280
  /** Required capabilities */
281
281
  readonly requiredCapabilities: CapabilityType[];
282
282
  }
283
- //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/render/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/render/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Surface Renderer Types\n *\n * Phase 2A.1: Type definitions for Surface-to-React rendering\n *\n * @module @pwfabric/runtime/render/types\n */\n\nimport type { Block, BreakpointName, SurfaceDocument, SurfaceTheme } from '@pwfabric/contracts'\nimport type { CSSProperties, ReactNode } from 'react'\nimport type { ImageAdapter as ImageAdapterType } from '../adapters/types.js'\nimport type { EntityFacade } from '../entity/facade.js'\nimport type { SurfaceConnectionsValue } from '../connectors/types.js'\n\n// Re-export EntityFacade for consumers who import from @pwfabric/runtime/render\nexport type { EntityFacade } from '../entity/facade.js'\n\n// Re-export ImageAdapter type for consumers\nexport type { ImageAdapter, ImageAdapterProps } from '../adapters/types.js'\n\n// Local alias for use in this file\ntype ImageAdapter = ImageAdapterType\n\n// ============================================================\n// CAPABILITY TYPES (mirrored from starters to avoid circular dep)\n// ============================================================\n\n/**\n * Capability types that can be required by surfaces\n * (defined capabilities)\n */\nexport type CapabilityType =\n | 'auth'\n | 'data'\n | 'state'\n | 'navigation'\n | 'analytics'\n | 'seo'\n | 'i18n'\n | 'forms'\n\n// ============================================================\n// RENDERABLE SURFACE\n// ============================================================\n\n/**\n * Renderable surface interface\n *\n * A structural projection of SurfaceDocument containing only the fields\n * needed for rendering. Any object with the matching shape can be rendered,\n * including custom definitions.\n *\n * Derived from SurfaceDocument so it stays structurally aligned with the\n * canonical type.\n */\n// theme + layout + styleVariables collapsed into `appearance` ref;\n// dataSources + initialState moved into platform/persistence capability config.\nexport type RenderableSurface = Pick<SurfaceDocument, 'blocks' | 'appearance' | 'capabilities'> & {\n /** Optional surface identifier — used by `BehaviorSurfaceProvider` to scope the event bus */\n readonly id?: string\n}\n\n// ============================================================\n// BLOCK COMPONENT TYPES\n// ============================================================\n\n/**\n * Props passed to block components\n */\nexport interface BlockComponentProps<T = Record<string, unknown>> {\n /** Block definition */\n readonly block: Block\n /** Resolved props (validated and defaulted) */\n readonly props: T\n /** Rendered children (for container blocks) */\n readonly children?: ReactNode\n /** Block context for capability access */\n readonly context: BlockContext\n}\n\n/**\n * Block component type\n */\nexport type BlockComponent<T = Record<string, unknown>> = ((\n props: BlockComponentProps<T>\n) => ReactNode) & {\n /**\n * How the block wants to be sized when it sits in a flex ROW.\n *\n * The engine's default for a row child is an equal share (`flex: 1 1 0`) —\n * right for two content columns, wrong for an avatar, a badge, a button: an\n * intrinsic thing stretched to half a row is the single most measured layout\n * defect of the 2026-09 surface audit (127 hand-written `flex: 0 0 auto`\n * overrides across 14 receipts). A block whose natural width is its content\n * declares `sizing: 'intrinsic'` — as a static on the component, the same\n * way `displayName` travels — and the engine gives it `flex: 0 0 auto`.\n * An authored flex hint on the instance still wins. The engine memorises no\n * block names: the block declares, the engine obeys.\n */\n sizing?: BlockSizing\n}\n\n/** The only sizing word the engine knows besides its default (fluid share). */\nexport type BlockSizing = 'intrinsic'\n\n/**\n * Block component registry\n */\nexport type BlockComponentRegistry = Record<string, BlockComponent>\n\n// ============================================================\n// CAPABILITY CONTEXT\n// ============================================================\n\n/**\n * Capability provider interface\n */\nexport interface CapabilityProvider {\n /** Capability type */\n readonly type: CapabilityType\n /** Provider-specific data */\n readonly data?: unknown\n}\n\n/**\n * Block rendering context\n */\nexport interface BlockContext {\n /** Available capabilities */\n readonly capabilities: Map<CapabilityType, CapabilityProvider>\n /** Base path for routing */\n readonly basePath: string\n /** Event handler */\n readonly onEvent: ((event: SurfaceEvent) => void) | undefined\n /** Image adapter for framework-specific optimization */\n readonly imageAdapter: ImageAdapter | undefined\n /** Current viewport breakpoint for responsive rendering */\n readonly viewport?: BreakpointName\n /**\n * Interaction mode (ADR render-unification). `onEvent` is a pure notification\n * and always fires; `interactionMode` gates real SIDE-EFFECTS. Blocks that\n * perform real navigation or data writes (e.g. `window.location.href`) MUST\n * skip those when `interactionMode === 'inert'` so editor/preview renders\n * don't trigger navigation or external mutations. Defaults to `live`.\n */\n readonly interactionMode?: BlockInteractionMode\n}\n\n// ============================================================\n// SURFACE EVENTS\n// ============================================================\n\n/**\n * Surface event types\n */\nexport type SurfaceEventType = 'click' | 'submit' | 'change' | 'navigate' | 'custom'\n\n/**\n * Surface event\n */\nexport interface SurfaceEvent {\n /** Event type */\n readonly type: SurfaceEventType\n /** Block ID that triggered the event */\n readonly blockId: string\n /** Event payload */\n readonly payload?: unknown\n /** Original DOM event (if applicable) */\n readonly originalEvent?: Event\n /** Canonical bus event name (e.g. 'block:click', 'form:submit') — set by the renderer bridge */\n readonly canonicalType?: string\n}\n\n// ============================================================\n// RENDERER PROPS\n// ============================================================\n\n/**\n * Surface renderer props\n */\n/**\n * Interaction mode for the runtime render (ADR render-unification).\n * - `live` (default): full runtime behavior — data-source auto-refresh timers run\n * and block-dispatched surface actions/events fire.\n * - `inert`: editor/preview render — no auto-refresh timers, block-dispatched\n * surface actions are no-ops, so an editor can intercept clicks (e.g. for\n * selection) without the surface mutating its own state.\n */\nexport type BlockInteractionMode = 'live' | 'inert'\n\n/**\n * Props the runtime puts on each block's outermost wrapper element. The exact\n * shape `renderBlock` would spread onto its own `<div>`. An editor decorator\n * (see `renderBlockWrapper`) spreads these onto its own element so the runtime's\n * computed layout + the per-block selector survive — the decorator never\n * recomputes layout.\n */\nexport interface BlockWrapperProps {\n readonly style?: CSSProperties\n /**\n * The block id as a DOM id, so `#<blockId>` is a reachable anchor.\n *\n * Separate from `data-block-id`, which addresses blocks for styling and\n * editing: only a real `id` makes a fragment link scroll, so without it\n * same-page navigation would be silently impossible.\n *\n * A decorator that renders its own wrapper receives this and is expected to\n * apply it — two elements carrying one id is worse than none.\n */\n readonly id?: string\n /** Unified per-block selector — present on every render path. */\n readonly 'data-block-id': string\n /** Any other `data-*` attributes the runtime sets (e.g. data-dynamic-block). */\n readonly [dataAttr: `data-${string}`]: string | undefined\n}\n\n/**\n * Arguments passed to a `renderBlockWrapper` decorator. `children` is the\n * runtime-rendered block content (already wrapped in its error boundary);\n * `wrapperProps` carries the runtime-computed layout style + selectors.\n */\nexport interface BlockWrapperRenderArgs {\n readonly block: Block\n readonly children: ReactNode\n readonly wrapperProps: BlockWrapperProps\n readonly parentBlock?: Block\n}\n\nexport interface SurfaceRendererProps {\n /** Surface definition (starter or custom) */\n readonly surface: RenderableSurface\n /** Capability providers */\n readonly capabilities?: CapabilityProvider[]\n /**\n * App-level color scheme hint (kept for external API compat, not injected into BlockContext).\n * Surface visual theming is done via surface.theme.\n */\n readonly theme?: 'light' | 'dark'\n /**\n * the Project's shared theme tokens,\n * merged as a layer BETWEEN the platform defaults and this surface's own\n * `appearance.config.theme` — a surface that hasn't set a given token\n * inherits the project's; one that has, keeps winning. Only wired for the\n * in-process fallback resolution path (no tenant-installed ui-appearance\n * atom bundle active); published/public rendering does not consume this\n * yet — editor-only for now.\n */\n readonly projectTheme?: SurfaceTheme\n /**\n * The Project's dark OVERRIDES (`appearanceConfig.darkTheme`), as the authoring studio writes\n * them: only the tokens the author changed. They sit on top of the dark\n * variant DERIVED from the effective light theme, under this surface's own\n * `appearance.config.darkTheme`. Omit it and the dark mode is the derivation\n * plus the surface's overrides, as before.\n */\n readonly projectDarkTheme?: SurfaceTheme\n /** Base path for links/routing */\n readonly basePath?: string\n /** Event handler */\n readonly onEvent?: (event: SurfaceEvent) => void\n /** Custom block component overrides */\n readonly components?: Partial<BlockComponentRegistry>\n /** Wrapper className */\n readonly className?: string\n /** Explicit viewport override (if not set, uses auto-detection) */\n readonly viewport?: BreakpointName\n /** Grid gap between blocks in pixels (default: 16) */\n readonly gap?: number | undefined\n /** Surface inner padding in pixels (default: 24) */\n readonly padding?: number | undefined\n /**\n * Image adapter for framework-specific image optimization\n *\n * Allows using Next.js Image, Astro Image, etc. while keeping\n * surface definitions framework-agnostic.\n *\n * @example\n * ```tsx\n * import { NextImageAdapter } from '@pwfabric/runtime/adapters'\n *\n * <SurfaceRenderer\n * surface={mySurface}\n * imageAdapter={NextImageAdapter}\n * />\n * ```\n */\n readonly imageAdapter?: ImageAdapter\n /**\n * EntityFacade instance for data model access.\n * When provided, entity data sources and form bindings are activated.\n * platform/entities is Tier 1 always-on — this prop is optional only\n * because caller controls instantiation (ConnectorRegistry binding is app-specific).\n */\n readonly entityFacade?: EntityFacade\n /**\n * The surface's connections context — the world's\n * configured connections (single dialect with the runner's\n * `connections.json` entries) plus the loaded connector-engine registry.\n * When provided, `{kind:'entity', connector}` data sources route through\n * the registry and the value is exposed to blocks via\n * `SurfaceConnectionsContext`. Absent = today's behavior (additive).\n */\n readonly connections?: SurfaceConnectionsValue\n /**\n * Editor-only seam (ADR render-unification): wrap each block's layout wrapper\n * with custom chrome (selection/drag/hover). Receives the runtime-computed\n * `wrapperProps` so the decorator never recomputes layout. When omitted\n * (runtime/published path), each block renders in the default `<div>` —\n * byte-identical to before this seam existed.\n */\n readonly renderBlockWrapper?: (args: BlockWrapperRenderArgs) => ReactNode\n /**\n * Interaction mode. Defaults to `live`. `inert` suppresses data auto-refresh\n * and block-dispatched surface actions (for editor/preview embedding).\n */\n readonly interactionMode?: BlockInteractionMode\n}\n\n/**\n * Block renderer props (internal)\n */\nexport interface BlockRendererProps {\n /** Block to render */\n readonly block: Block\n /** Rendering context */\n readonly context: BlockContext\n /** Component registry */\n readonly components: BlockComponentRegistry\n}\n\n// ============================================================\n// RENDER RESULT\n// ============================================================\n\n/**\n * Render result with metadata\n */\nexport interface RenderResult {\n /** Rendered element */\n readonly element: ReactNode\n /** Block IDs in render tree */\n readonly blockIds: string[]\n /** Required capabilities */\n readonly requiredCapabilities: CapabilityType[]\n}\n"]}
@@ -40,4 +40,3 @@ export declare function blockVisibilityCss(blockId: string, hidden: BreakpointNa
40
40
  * (zero bytes emitted) so existing surfaces are byte-identical.
41
41
  */
42
42
  export declare function collectVisibilityCss(blocks: readonly Block[], surfaceId?: string): string;
43
- //# sourceMappingURL=visibility-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"visibility-css.js","sourceRoot":"","sources":["../../src/render/visibility-css.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visibility-css.js","sourceRoot":"","sources":["../../src/render/visibility-css.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Per-breakpoint visibility CSS generation (the `hidden md:flex` equivalent).\n *\n * `block.layout.hideOn` / `block.layout.showOn` declare at which breakpoints a\n * block is hidden / the only breakpoints where it is visible. Inline styles\n * can't express media queries, so the runtime emits scoped CSS rules — keyed\n * by the block's `data-block-id` — into the surface's generated `<style>`\n * (alongside the box-sizing reset). The pixel thresholds are the SAME\n * `BREAKPOINTS[].minWidth` values the span system uses.\n *\n * Semantics:\n * - `hideOn: ['xs','sm']` → hidden across the xs+sm ranges → hidden below the\n * md threshold (768px) → `@media (max-width:767.98px){ display:none }`.\n * - `showOn: ['lg','xl']` → visible ONLY in the lg+xl ranges → hidden below\n * lg (1024px) AND at/above the breakpoint after xl (2xl = 1536px).\n * - `showOn` is the inverse of `hideOn`; when both are present `showOn` wins.\n *\n * @module @pwfabric/runtime/render/visibility-css\n */\n\nimport type { Block } from '@pwfabric/core'\nimport { BREAKPOINTS, BREAKPOINT_ORDER } from '@pwfabric/core'\nimport type { BreakpointName } from '@pwfabric/core'\nimport { blockSelector, collectScopedCss } from './scoped-css.js'\n\n/** Sub-pixel epsilon so `max-width` ranges don't overlap the next `min-width`. */\nconst MAX_EPSILON = 0.02\n\n/** `[minWidth, maxExclusive)` pixel range a named breakpoint covers. */\nfunction rangeFor(bp: BreakpointName): { min: number; maxExclusive: number } {\n const idx = BREAKPOINTS.findIndex((b) => b.name === bp)\n const def = BREAKPOINTS[idx]\n const next = BREAKPOINTS[idx + 1]\n return {\n min: def?.minWidth ?? 0,\n maxExclusive: next?.minWidth ?? Number.POSITIVE_INFINITY,\n }\n}\n\n/**\n * Resolve the SET of breakpoints at which a block must be hidden, given its\n * `hideOn` / `showOn` declarations. `showOn` takes precedence (the block is\n * hidden at every breakpoint NOT listed in `showOn`).\n */\nexport function resolveHiddenBreakpoints(\n hideOn: readonly BreakpointName[] | undefined,\n showOn: readonly BreakpointName[] | undefined\n): BreakpointName[] {\n if (showOn && showOn.length > 0) {\n const visible = new Set(showOn)\n return BREAKPOINT_ORDER.filter((bp) => !visible.has(bp))\n }\n if (hideOn && hideOn.length > 0) {\n const hide = new Set(hideOn)\n return BREAKPOINT_ORDER.filter((bp) => hide.has(bp))\n }\n return []\n}\n\n/**\n * Collapse a set of hidden breakpoints into the minimal set of\n * `[min, maxExclusive)` pixel ranges (contiguous breakpoints merge).\n */\nfunction collapseRanges(hidden: BreakpointName[]): { min: number; maxExclusive: number }[] {\n // Order by the canonical breakpoint order so contiguity is by ascending width.\n const ordered = BREAKPOINT_ORDER.filter((bp) => hidden.includes(bp))\n const out: { min: number; maxExclusive: number }[] = []\n for (const bp of ordered) {\n const r = rangeFor(bp)\n const last = out[out.length - 1]\n if (last && last.maxExclusive === r.min) {\n last.maxExclusive = r.maxExclusive // contiguous → extend\n } else {\n out.push({ ...r })\n }\n }\n return out\n}\n\n/** Build a single `@media` condition for a `[min, maxExclusive)` range. */\nfunction mediaCondition(min: number, maxExclusive: number): string {\n const parts: string[] = []\n if (min > 0) parts.push(`(min-width:${min}px)`)\n if (Number.isFinite(maxExclusive)) parts.push(`(max-width:${maxExclusive - MAX_EPSILON}px)`)\n return parts.join(' and ')\n}\n\n/**\n * Emit the CSS rule(s) that hide a single block at the resolved breakpoints.\n * Targets `[data-block-id=\"<id>\"]` scoped under the surface root so it cannot\n * leak to the host page. Uses `!important` so the rule beats the inline layout\n * style (`display:grid`/flex on the wrapper) it must override.\n *\n * Returns '' when there is nothing to hide.\n */\nexport function blockVisibilityCss(\n blockId: string,\n hidden: BreakpointName[],\n surfaceId?: string\n): string {\n if (hidden.length === 0) return ''\n const ranges = collapseRanges(hidden)\n // The whole spectrum is hidden (no showOn match anywhere): unconditional hide.\n const everything = ranges.length === 1 && ranges[0]!.min === 0 && !Number.isFinite(ranges[0]!.maxExclusive)\n const selector = blockSelector(blockId, surfaceId)\n if (everything) {\n return `${selector}{display:none !important}`\n }\n return ranges\n .map((r) => {\n const cond = mediaCondition(r.min, r.maxExclusive)\n return `@media ${cond}{${selector}{display:none !important}}`\n })\n .join('')\n}\n\n/**\n * Walk a surface block tree and concatenate the per-block visibility CSS for\n * every block declaring `hideOn` / `showOn`. Blocks without either are skipped\n * (zero bytes emitted) so existing surfaces are byte-identical.\n */\nexport function collectVisibilityCss(blocks: readonly Block[], surfaceId?: string): string {\n return collectScopedCss(blocks, (block) => {\n const layout = block.layout as\n | { hideOn?: readonly BreakpointName[]; showOn?: readonly BreakpointName[] }\n | undefined\n if (layout && (layout.hideOn?.length || layout.showOn?.length)) {\n const hidden = resolveHiddenBreakpoints(layout.hideOn, layout.showOn)\n return blockVisibilityCss(block.id, hidden, surfaceId)\n }\n return ''\n })\n}\n"]}
@@ -32,4 +32,3 @@ export interface WidthScopeChunk {
32
32
  export declare function resolveWidthScope(block: Block, viewport: BreakpointName): WidthScope;
33
33
  /** Groups consecutive blocks of the same scope together; order is kept. */
34
34
  export declare function chunkByWidthScope(blocks: readonly Block[], viewport: BreakpointName): readonly WidthScopeChunk[];
35
- //# sourceMappingURL=width-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"width-scope.js","sourceRoot":"","sources":["../../src/render/width-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GAGvB,MAAM,gBAAgB,CAAA;AAWvB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAY,EAAE,QAAwB;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,oBAAoB,CAAA;IACnD,OAAO,sBAAsB,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAA;AAC3E,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,QAAwB;IAExB,MAAM,MAAM,GAA6C,EAAE,CAAA;IAC3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACtC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"width-scope.js","sourceRoot":"","sources":["../../src/render/width-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GAGvB,MAAM,gBAAgB,CAAA;AAWvB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAY,EAAE,QAAwB;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,oBAAoB,CAAA;IACnD,OAAO,sBAAsB,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAA;AAC3E,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,QAAwB;IAExB,MAAM,MAAM,GAA6C,EAAE,CAAA;IAC3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACtC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["/**\n * Width scope — splits blocks into groups while KEEPING SOURCE ORDER.\n *\n * WHY. If the surface root carried both the 12-column grid and\n * `maxWidth: var(--pw-layout-container-max-width)` + `margin: 0 auto`,\n * persistent chrome would sit inside the centred box too (on a 1536px screen\n * a persistent rail would start 218px in from the edge). The rule: persistent\n * navigation chrome belongs to the viewport, the content body to the measure.\n *\n * WHY GROUPS, NOT BUCKETS. A surface runs `[navbar][body…][bottombar]`.\n * Collecting `viewport`-scoped blocks into one bucket and `container` ones\n * into another would break the order and put the bottom bar next to the top\n * bar. Consecutive grouping keeps the order: three groups, three DOM siblings.\n *\n * WHY NOT 100vw. The `width:100vw; margin-inline:calc(50% - 50vw)` trick is\n * the short way out of a centred container and is NOT used: `100vw` counts\n * the scrollbar too, so every page with a vertical scrollbar would get ~15px\n * of horizontal overflow — the very defect this module exists to avoid.\n *\n * @module @pwfabric/runtime/render/width-scope\n */\nimport {\n DEFAULT_BLOCK_LAYOUT,\n resolveResponsiveValue,\n type Block,\n type BreakpointName,\n} from '@pwfabric/core'\n// `WidthScope` comes from CONTRACTS, not from core's parallel copy:\n// `block.layout` is typed by contracts, and the two definitions are kept in\n// sync by hand, so the contracts type is the one to follow.\nimport type { WidthScope } from '@pwfabric/contracts'\n\nexport interface WidthScopeChunk {\n readonly scope: WidthScope\n readonly blocks: readonly Block[]\n}\n\n/**\n * A block's scope at this breakpoint. Without a declaration it is\n * `container`, so a block that declares nothing keeps the default behaviour.\n */\nexport function resolveWidthScope(block: Block, viewport: BreakpointName): WidthScope {\n const layout = block.layout ?? DEFAULT_BLOCK_LAYOUT\n return resolveResponsiveValue(layout.widthScope, viewport) ?? 'container'\n}\n\n/** Groups consecutive blocks of the same scope together; order is kept. */\nexport function chunkByWidthScope(\n blocks: readonly Block[],\n viewport: BreakpointName\n): readonly WidthScopeChunk[] {\n const chunks: { scope: WidthScope; blocks: Block[] }[] = []\n for (const block of blocks) {\n const scope = resolveWidthScope(block, viewport)\n const last = chunks[chunks.length - 1]\n if (last && last.scope === scope) last.blocks.push(block)\n else chunks.push({ scope, blocks: [block] })\n }\n return chunks\n}\n"]}
@@ -31,4 +31,3 @@ export interface WriteOnlySourceInput {
31
31
  }
32
32
  /** The ids of the declared sources that are only ever written to. */
33
33
  export declare function writeOnlySourceIds(input: WriteOnlySourceInput): ReadonlySet<string>;
34
- //# sourceMappingURL=write-only-sources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-only-sources.js","sourceRoot":"","sources":["../../src/render/write-only-sources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"write-only-sources.js","sourceRoot":"","sources":["../../src/render/write-only-sources.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WRITE-ONLY SOURCES — a form's target that nothing on the page reads.\n *\n * A data source a form writes to (`platform/entities` `config.formBindings[].sourceId`)\n * was also fetched as a list on mount and again after every submit (the\n * bridge's `refreshAll`). For an intake-only model — anonymous visitors may\n * create, never list — that is a refused request on every visit and every\n * submit (`GET /_host/records/<model>` → 403\n * `RECORDS_NOT_PUBLIC`, `__errors.records` set, no block bound to it).\n *\n * A source is write-only when:\n * - at least one form binding targets it, and every binding that does writes\n * with POST (a PATCH/PUT needs the loaded record to know what to update), and\n * - its id is referenced NOWHERE else: no block (props, expressions, actions,\n * repeat), no behavior, no other source, no other capability config.\n *\n * The reference check is a whole-word search of every string, which errs on\n * the side of fetching: a stray word equal to the id keeps today's behaviour.\n * A write-only source stays declared and registered — it is still the write\n * target — it is just never asked for its rows.\n *\n * @module @pwfabric/runtime/render/write-only-sources\n */\n\nimport { isCapability } from '../capability/type-mapping.js'\n\ninterface FormBindingLike {\n readonly sourceId?: unknown\n readonly method?: unknown\n}\n\ninterface CapabilityLike {\n readonly capability?: string\n readonly config?: unknown\n}\n\nexport interface WriteOnlySourceInput {\n readonly blocks: readonly unknown[]\n readonly dataSources: readonly { readonly id: string }[]\n readonly capabilities?: readonly unknown[] | undefined\n readonly behaviors?: readonly unknown[] | undefined\n}\n\nfunction collectStrings(value: unknown, out: string[], seen: Set<object>): void {\n if (typeof value === 'string') {\n out.push(value)\n return\n }\n if (value === null || typeof value !== 'object') return\n if (seen.has(value)) return\n seen.add(value)\n if (Array.isArray(value)) {\n for (const v of value) collectStrings(v, out, seen)\n return\n }\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n // A key can be a reference too (`{ records: … }` maps).\n out.push(k)\n collectStrings(v, out, seen)\n }\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/** The ids of the declared sources that are only ever written to. */\nexport function writeOnlySourceIds(input: WriteOnlySourceInput): ReadonlySet<string> {\n const capabilities = (input.capabilities ?? []) as readonly CapabilityLike[]\n const entities = capabilities.find((c) => isCapability(c, 'platform/entities'))\n const bindings = (entities?.config as { formBindings?: unknown } | undefined)?.formBindings\n if (!Array.isArray(bindings) || bindings.length === 0) return new Set()\n\n // Candidates: targeted by a form, and only ever with POST.\n const postOnly = new Map<string, boolean>()\n for (const raw of bindings as readonly FormBindingLike[]) {\n if (typeof raw?.sourceId !== 'string') continue\n const isPost = raw.method === undefined || raw.method === 'POST'\n postOnly.set(raw.sourceId, (postOnly.get(raw.sourceId) ?? true) && isPost)\n }\n const declared = new Set(input.dataSources.map((s) => s.id))\n const candidates = [...postOnly].filter(([id, post]) => post && declared.has(id)).map(([id]) => id)\n if (candidates.length === 0) return new Set()\n\n // Everything that could read a source, minus the declarations themselves:\n // the form bindings (they ARE the write) and the source list (each source is\n // checked against the OTHER sources below).\n const strings: string[] = []\n const seen = new Set<object>()\n collectStrings(input.blocks, strings, seen)\n collectStrings(input.behaviors ?? [], strings, seen)\n for (const c of capabilities) {\n const config = c.config\n if (config === null || typeof config !== 'object') continue\n const rest: Record<string, unknown> = { ...(config as Record<string, unknown>) }\n delete rest['dataSources']\n delete rest['behaviors'] // collected above (the same list, seeded from persistence)\n if (c === entities) delete rest['formBindings']\n collectStrings(rest, strings, seen)\n }\n\n const result = new Set<string>()\n for (const id of candidates) {\n const word = new RegExp(`(^|[^A-Za-z0-9_$])${escapeRegExp(id)}([^A-Za-z0-9_$]|$)`)\n const others: string[] = []\n for (const s of input.dataSources) if (s.id !== id) collectStrings(s, others, new Set())\n const read = strings.some((s) => word.test(s)) || others.some((s) => word.test(s))\n if (!read) result.add(id)\n }\n return result\n}\n"]}
@@ -12,4 +12,3 @@
12
12
  */
13
13
  export type { RouteDefinition, RouteGuard, RouteGuardContext, RouteMatchResult, RouteMatch, NavigationTarget, NavigationResult, NavigationFailureReason, NavigationListener, RoutingCapability, } from './types.js';
14
14
  export { DefaultRoutingCapability, createRoutingCapability } from './router.js';
15
- //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,kBAAkB;AAClB,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,kBAAkB;AAClB,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA","sourcesContent":["/**\n * Routing Capability Module\n *\n * Route matching, navigation, and URL parameter resolution\n *\n * Exports:\n * - Types: RouteDefinition, RouteMatch, NavigationTarget, RoutingCapability, etc.\n * - Implementations: DefaultRoutingCapability\n * - Factory functions: createRoutingCapability\n *\n * @module @pwfabric/runtime/routing\n */\n\n// Types\nexport type {\n RouteDefinition,\n RouteGuard,\n RouteGuardContext,\n RouteMatchResult,\n RouteMatch,\n NavigationTarget,\n NavigationResult,\n NavigationFailureReason,\n NavigationListener,\n RoutingCapability,\n} from './types.js'\n\n// Implementations\nexport { DefaultRoutingCapability, createRoutingCapability } from './router.js'\n"]}
@@ -40,4 +40,3 @@ export declare class DefaultRoutingCapability implements RoutingCapability {
40
40
  export declare function createRoutingCapability(options?: {
41
41
  maxHistorySize?: number;
42
42
  }): RoutingCapability;
43
- //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/routing/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/routing/router.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Routing Capability Implementation\n *\n * Route matching, navigation, and parameter resolution\n *\n * @module @pwfabric/runtime/routing/router\n */\n\nimport type {\n RoutingCapability,\n RouteDefinition,\n RouteMatch,\n RouteMatchResult,\n NavigationTarget,\n NavigationResult,\n NavigationListener,\n} from './types.js'\n\n// ============================================================\n// COMPILED ROUTE\n// ============================================================\n\ninterface CompiledRoute {\n definition: RouteDefinition\n regex: RegExp\n paramNames: string[]\n}\n\n// ============================================================\n// DEFAULT ROUTING CAPABILITY\n// ============================================================\n\n/**\n * Default routing capability implementation\n */\nexport class DefaultRoutingCapability implements RoutingCapability {\n private readonly routes = new Map<string, CompiledRoute>()\n private readonly listeners = new Set<NavigationListener>()\n private readonly navigationHistory: RouteMatch[] = []\n private currentRoute: RouteMatch | undefined = undefined\n private readonly maxHistorySize: number\n\n constructor(options?: { maxHistorySize?: number }) {\n this.maxHistorySize = options?.maxHistorySize ?? 50\n }\n\n addRoute(route: RouteDefinition): void {\n if (this.routes.has(route.id)) {\n throw new Error(`Route '${route.id}' is already registered`)\n }\n const compiled = this.compileRoute(route)\n this.routes.set(route.id, compiled)\n }\n\n removeRoute(routeId: string): boolean {\n return this.routes.delete(routeId)\n }\n\n matchRoute(path: string): RouteMatchResult {\n const { pathname, query, hash } = this.parsePath(path)\n\n for (const compiled of this.routes.values()) {\n const match = this.tryMatch(compiled, pathname, query, hash)\n if (match) {\n return { matched: true, match }\n }\n }\n\n return { matched: false, reason: `No route matches path: ${path}` }\n }\n\n async navigate(target: NavigationTarget): Promise<NavigationResult> {\n const fullPath = this.buildPath(target)\n const matchResult = this.matchRoute(fullPath)\n\n if (!matchResult.matched) {\n return { success: false, reason: 'no_match' }\n }\n\n const match = matchResult.match\n\n // Check if navigating to the same route\n if (\n this.currentRoute &&\n this.currentRoute.route.id === match.route.id &&\n this.currentRoute.path === match.path\n ) {\n return { success: false, reason: 'same_route' }\n }\n\n // Execute guards\n if (match.route.guards && match.route.guards.length > 0) {\n for (const guard of match.route.guards) {\n const canActivate = await guard.canActivate({\n from: this.currentRoute,\n to: match,\n params: match.params,\n })\n if (!canActivate) {\n return { success: false, reason: 'guard_rejected' }\n }\n }\n }\n\n // Update current route\n const previousRoute = this.currentRoute\n this.currentRoute = match\n\n // Add to history\n if (!target.replace) {\n this.navigationHistory.push(match)\n while (this.navigationHistory.length > this.maxHistorySize) {\n this.navigationHistory.shift()\n }\n } else if (this.navigationHistory.length > 0) {\n this.navigationHistory[this.navigationHistory.length - 1] = match\n } else {\n this.navigationHistory.push(match)\n }\n\n // Notify listeners\n this.notifyListeners(match, previousRoute)\n\n return { success: true, match }\n }\n\n resolveParams(pattern: string, params: Record<string, string>): string {\n let resolved = pattern\n for (const [key, value] of Object.entries(params)) {\n resolved = resolved.replace(`:${key}`, encodeURIComponent(value))\n }\n return resolved\n }\n\n getCurrentRoute(): RouteMatch | undefined {\n return this.currentRoute\n }\n\n getHistory(): readonly RouteMatch[] {\n return [...this.navigationHistory]\n }\n\n onNavigate(listener: NavigationListener): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n getRouteIds(): readonly string[] {\n return Array.from(this.routes.keys())\n }\n\n clear(): void {\n this.routes.clear()\n this.listeners.clear()\n this.navigationHistory.length = 0\n this.currentRoute = undefined\n }\n\n // ============================================================\n // PRIVATE METHODS\n // ============================================================\n\n private compileRoute(route: RouteDefinition): CompiledRoute {\n const paramNames: string[] = []\n\n // Convert pattern to regex\n // :param -> named capture group\n // * -> wildcard capture\n let regexStr = route.pattern\n .replace(/\\/:(\\w+)/g, (_match, paramName: string) => {\n paramNames.push(paramName)\n return '/([^/]+)'\n })\n .replace(/\\*$/, '(.*)')\n\n // Ensure exact match (anchor start and end)\n regexStr = `^${regexStr}$`\n\n return {\n definition: route,\n regex: new RegExp(regexStr),\n paramNames,\n }\n }\n\n private tryMatch(\n compiled: CompiledRoute,\n pathname: string,\n query: Record<string, string>,\n hash: string\n ): RouteMatch | null {\n const match = pathname.match(compiled.regex)\n if (!match) return null\n\n const params: Record<string, string> = {}\n for (let i = 0; i < compiled.paramNames.length; i++) {\n const name = compiled.paramNames[i]\n const value = match[i + 1]\n if (name && value !== undefined) {\n params[name] = decodeURIComponent(value)\n }\n }\n\n return {\n route: compiled.definition,\n params,\n query,\n path: pathname,\n hash,\n }\n }\n\n private parsePath(path: string): {\n pathname: string\n query: Record<string, string>\n hash: string\n } {\n let pathname = path\n let hash = ''\n const query: Record<string, string> = {}\n\n // Extract hash\n const hashIndex = pathname.indexOf('#')\n if (hashIndex >= 0) {\n hash = pathname.slice(hashIndex + 1)\n pathname = pathname.slice(0, hashIndex)\n }\n\n // Extract query\n const queryIndex = pathname.indexOf('?')\n if (queryIndex >= 0) {\n const queryString = pathname.slice(queryIndex + 1)\n pathname = pathname.slice(0, queryIndex)\n\n for (const pair of queryString.split('&')) {\n const [key, value] = pair.split('=')\n if (key) {\n query[decodeURIComponent(key)] = value ? decodeURIComponent(value) : ''\n }\n }\n }\n\n // Normalize pathname\n if (!pathname.startsWith('/')) {\n pathname = '/' + pathname\n }\n\n return { pathname, query, hash }\n }\n\n private buildPath(target: NavigationTarget): string {\n let path = target.path\n\n if (target.query && Object.keys(target.query).length > 0) {\n const queryParts = Object.entries(target.query).map(\n ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n )\n path += '?' + queryParts.join('&')\n }\n\n if (target.hash) {\n path += '#' + target.hash\n }\n\n return path\n }\n\n private notifyListeners(to: RouteMatch, from: RouteMatch | undefined): void {\n for (const listener of this.listeners) {\n try {\n listener(to, from)\n } catch {\n // Swallow listener errors\n }\n }\n }\n}\n\n// ============================================================\n// FACTORY FUNCTION\n// ============================================================\n\n/**\n * Create a routing capability instance\n */\nexport function createRoutingCapability(options?: { maxHistorySize?: number }): RoutingCapability {\n return new DefaultRoutingCapability(options)\n}\n"]}
@@ -122,4 +122,3 @@ export interface RoutingCapability {
122
122
  /** Clear all routes */
123
123
  clear(): void;
124
124
  }
125
- //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/routing/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/routing/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Routing Capability Types\n *\n * Route matching, navigation, and URL parameter resolution\n *\n * @module @pwfabric/runtime/routing/types\n */\n\n// ============================================================\n// ROUTE DEFINITION\n// ============================================================\n\n/**\n * Route definition for mapping URLs to surfaces\n */\nexport interface RouteDefinition {\n /** Unique route identifier */\n readonly id: string\n\n /** URL pattern (supports :param and * wildcard) */\n readonly pattern: string\n\n /** Surface ID this route maps to */\n readonly surfaceId: string\n\n /** Human-readable name */\n readonly name?: string\n\n /** Route metadata */\n readonly metadata?: Readonly<Record<string, unknown>>\n\n /** Navigation guards for this route */\n readonly guards?: readonly RouteGuard[]\n\n /** Child routes (for nested routing) */\n readonly children?: readonly RouteDefinition[]\n}\n\n/**\n * Route guard function\n */\nexport interface RouteGuard {\n readonly name: string\n canActivate(context: RouteGuardContext): boolean | Promise<boolean>\n}\n\n/**\n * Context provided to route guards\n */\nexport interface RouteGuardContext {\n readonly from: RouteMatch | undefined\n readonly to: RouteMatch\n readonly params: Readonly<Record<string, string>>\n}\n\n// ============================================================\n// ROUTE MATCH\n// ============================================================\n\n/**\n * Result of matching a URL against routes\n */\nexport type RouteMatchResult =\n | { readonly matched: true; readonly match: RouteMatch }\n | { readonly matched: false; readonly reason: string }\n\n/**\n * A successfully matched route\n */\nexport interface RouteMatch {\n /** The matched route definition */\n readonly route: RouteDefinition\n\n /** Extracted URL parameters */\n readonly params: Readonly<Record<string, string>>\n\n /** Query parameters */\n readonly query: Readonly<Record<string, string>>\n\n /** The full matched path */\n readonly path: string\n\n /** Hash fragment (without #) */\n readonly hash: string\n}\n\n// ============================================================\n// NAVIGATION\n// ============================================================\n\n/**\n * Navigation target\n */\nexport interface NavigationTarget {\n /** Path to navigate to */\n readonly path: string\n\n /** Query parameters */\n readonly query?: Readonly<Record<string, string>>\n\n /** Hash fragment */\n readonly hash?: string\n\n /** Whether to replace current history entry */\n readonly replace?: boolean\n\n /** Navigation state data */\n readonly state?: unknown\n}\n\n/**\n * Navigation result\n */\nexport type NavigationResult =\n | { readonly success: true; readonly match: RouteMatch }\n | { readonly success: false; readonly reason: NavigationFailureReason }\n\n/**\n * Reasons navigation can fail\n */\nexport type NavigationFailureReason = 'no_match' | 'guard_rejected' | 'same_route' | 'aborted'\n\n/**\n * Listener for navigation events\n */\nexport type NavigationListener = (to: RouteMatch, from: RouteMatch | undefined) => void\n\n// ============================================================\n// ROUTING CAPABILITY INTERFACE\n// ============================================================\n\n/**\n * Routing capability interface for managing routes and navigation\n */\nexport interface RoutingCapability {\n /** Register a route definition */\n addRoute(route: RouteDefinition): void\n\n /** Remove a route by ID */\n removeRoute(routeId: string): boolean\n\n /** Match a URL path against registered routes */\n matchRoute(path: string): RouteMatchResult\n\n /** Navigate to a target */\n navigate(target: NavigationTarget): Promise<NavigationResult>\n\n /** Resolve parameters from a route pattern and values */\n resolveParams(pattern: string, params: Record<string, string>): string\n\n /** Get the current route match */\n getCurrentRoute(): RouteMatch | undefined\n\n /** Get navigation history */\n getHistory(): readonly RouteMatch[]\n\n /** Subscribe to navigation events */\n onNavigate(listener: NavigationListener): () => void\n\n /** Get all registered route IDs */\n getRouteIds(): readonly string[]\n\n /** Clear all routes */\n clear(): void\n}\n"]}
@@ -37,4 +37,3 @@ export declare function createSeoCapability(defaults?: {
37
37
  defaultRobots?: string;
38
38
  }): SeoCapability;
39
39
  export {};
40
- //# sourceMappingURL=generator.d.ts.map