@webiny/website-builder-sdk 0.0.0-unstable.eb196ccd2f → 0.0.0-unstable.eb81deee7e

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 (307) hide show
  1. package/BindingsApi.js +29 -36
  2. package/BindingsApi.js.map +1 -1
  3. package/BindingsProcessor.js +34 -43
  4. package/BindingsProcessor.js.map +1 -1
  5. package/BindingsProcessor.test.js +82 -77
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.d.ts +5 -2
  8. package/BindingsResolver.js +99 -122
  9. package/BindingsResolver.js.map +1 -1
  10. package/BindingsResolver.test.js +399 -362
  11. package/BindingsResolver.test.js.map +1 -1
  12. package/ComponentInputTraverser.js +32 -49
  13. package/ComponentInputTraverser.js.map +1 -1
  14. package/ComponentManifestToAstConverter.js +20 -21
  15. package/ComponentManifestToAstConverter.js.map +1 -1
  16. package/ComponentRegistry.d.ts +9 -0
  17. package/ComponentRegistry.js +38 -22
  18. package/ComponentRegistry.js.map +1 -1
  19. package/ComponentResolver.d.ts +3 -2
  20. package/ComponentResolver.js +39 -29
  21. package/ComponentResolver.js.map +1 -1
  22. package/ComponentResolver.test.d.ts +1 -0
  23. package/ComponentResolver.test.js +81 -0
  24. package/ComponentResolver.test.js.map +1 -0
  25. package/ConstraintEvaluator.d.ts +36 -0
  26. package/ConstraintEvaluator.js +288 -0
  27. package/ConstraintEvaluator.js.map +1 -0
  28. package/ConstraintEvaluator.test.d.ts +1 -0
  29. package/ConstraintEvaluator.test.js +1634 -0
  30. package/ConstraintEvaluator.test.js.map +1 -0
  31. package/ContentSdk.d.ts +17 -3
  32. package/ContentSdk.js +113 -90
  33. package/ContentSdk.js.map +1 -1
  34. package/DocumentStore.d.ts +1 -1
  35. package/DocumentStore.js +47 -59
  36. package/DocumentStore.js.map +1 -1
  37. package/DocumentStoreManager.js +17 -16
  38. package/DocumentStoreManager.js.map +1 -1
  39. package/EditingSdk.d.ts +2 -2
  40. package/EditingSdk.js +92 -124
  41. package/EditingSdk.js.map +1 -1
  42. package/ElementFactory.d.ts +2 -3
  43. package/ElementFactory.js +164 -163
  44. package/ElementFactory.js.map +1 -1
  45. package/ElementFactory.objectListDefaults.test.d.ts +1 -0
  46. package/ElementFactory.objectListDefaults.test.js +423 -0
  47. package/ElementFactory.objectListDefaults.test.js.map +1 -0
  48. package/ElementFactory.test.d.ts +1 -0
  49. package/ElementFactory.test.js +353 -0
  50. package/ElementFactory.test.js.map +1 -0
  51. package/Environment.js +18 -19
  52. package/Environment.js.map +1 -1
  53. package/FunctionConverter.js +8 -7
  54. package/FunctionConverter.js.map +1 -1
  55. package/HashObject.js +11 -12
  56. package/HashObject.js.map +1 -1
  57. package/HotkeyManager.js +41 -48
  58. package/HotkeyManager.js.map +1 -1
  59. package/IBindingsUpdater.js +0 -3
  60. package/IRedirects.js +0 -3
  61. package/InheritanceProcessor.d.ts +2 -2
  62. package/InheritanceProcessor.js +99 -139
  63. package/InheritanceProcessor.js.map +1 -1
  64. package/InheritanceProcessor.test.js +178 -178
  65. package/InheritanceProcessor.test.js.map +1 -1
  66. package/InheritedValueResolver.d.ts +18 -1
  67. package/InheritedValueResolver.js +18 -20
  68. package/InheritedValueResolver.js.map +1 -1
  69. package/InputBindingsProcessor.d.ts +23 -2
  70. package/InputBindingsProcessor.js +200 -289
  71. package/InputBindingsProcessor.js.map +1 -1
  72. package/InputBindingsProcessorTokens.test.d.ts +1 -0
  73. package/InputBindingsProcessorTokens.test.js +400 -0
  74. package/InputBindingsProcessorTokens.test.js.map +1 -0
  75. package/InputsBindingsProcessor.test.js +334 -313
  76. package/InputsBindingsProcessor.test.js.map +1 -1
  77. package/InputsUpdater.d.ts +1 -1
  78. package/InputsUpdater.js +23 -26
  79. package/InputsUpdater.js.map +1 -1
  80. package/LiveSdk.d.ts +2 -2
  81. package/LiveSdk.js +12 -13
  82. package/LiveSdk.js.map +1 -1
  83. package/Logger.d.ts +2 -1
  84. package/Logger.js +9 -8
  85. package/Logger.js.map +1 -1
  86. package/MouseTracker.js +77 -83
  87. package/MouseTracker.js.map +1 -1
  88. package/NullSdk.d.ts +4 -3
  89. package/NullSdk.js +22 -14
  90. package/NullSdk.js.map +1 -1
  91. package/PreviewDocument.d.ts +1 -0
  92. package/PreviewDocument.js +30 -30
  93. package/PreviewDocument.js.map +1 -1
  94. package/PreviewSdk.d.ts +4 -3
  95. package/PreviewSdk.js +19 -17
  96. package/PreviewSdk.js.map +1 -1
  97. package/PreviewViewport.d.ts +0 -1
  98. package/PreviewViewport.js +50 -82
  99. package/PreviewViewport.js.map +1 -1
  100. package/README.md +10 -2
  101. package/ResizeObserver.js +24 -31
  102. package/ResizeObserver.js.map +1 -1
  103. package/StylesBindingsProcessor.d.ts +12 -2
  104. package/StylesBindingsProcessor.js +62 -79
  105. package/StylesBindingsProcessor.js.map +1 -1
  106. package/StylesUpdater.d.ts +1 -1
  107. package/StylesUpdater.js +20 -25
  108. package/StylesUpdater.js.map +1 -1
  109. package/Theme.js +30 -32
  110. package/Theme.js.map +1 -1
  111. package/ViewportManager.d.ts +2 -0
  112. package/ViewportManager.js +89 -97
  113. package/ViewportManager.js.map +1 -1
  114. package/assertBindingShapes.d.ts +31 -0
  115. package/assertBindingShapes.js +64 -0
  116. package/assertBindingShapes.js.map +1 -0
  117. package/assertBindingShapes.test.d.ts +1 -0
  118. package/assertBindingShapes.test.js +131 -0
  119. package/assertBindingShapes.test.js.map +1 -0
  120. package/asset/deliveryUrl.d.ts +41 -0
  121. package/asset/deliveryUrl.js +34 -0
  122. package/asset/deliveryUrl.js.map +1 -0
  123. package/asset/deliveryUrl.test.d.ts +1 -0
  124. package/asset/deliveryUrl.test.js +127 -0
  125. package/asset/deliveryUrl.test.js.map +1 -0
  126. package/asset/geometry.d.ts +7 -0
  127. package/asset/geometry.js +10 -0
  128. package/asset/geometry.js.map +1 -0
  129. package/asset/imageSrcSet.d.ts +63 -0
  130. package/asset/imageSrcSet.js +98 -0
  131. package/asset/imageSrcSet.js.map +1 -0
  132. package/asset/imageSrcSet.test.d.ts +1 -0
  133. package/asset/imageSrcSet.test.js +103 -0
  134. package/asset/imageSrcSet.test.js.map +1 -0
  135. package/asset/index.d.ts +5 -0
  136. package/asset/index.js +5 -0
  137. package/asset/normalize.d.ts +24 -0
  138. package/asset/normalize.js +106 -0
  139. package/asset/normalize.js.map +1 -0
  140. package/asset/normalize.test.d.ts +1 -0
  141. package/asset/normalize.test.js +263 -0
  142. package/asset/normalize.test.js.map +1 -0
  143. package/asset/types.d.ts +2 -0
  144. package/asset/types.js +0 -0
  145. package/constants.d.ts +1 -0
  146. package/constants.js +7 -5
  147. package/constants.js.map +1 -1
  148. package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
  149. package/contentEntry/ContentEntryBindingsResolver.js +45 -0
  150. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
  151. package/contentEntry/ContentEntryCache.d.ts +46 -0
  152. package/contentEntry/ContentEntryCache.js +50 -0
  153. package/contentEntry/ContentEntryCache.js.map +1 -0
  154. package/contentEntry/resolveContentEntry.d.ts +74 -0
  155. package/contentEntry/resolveContentEntry.js +53 -0
  156. package/contentEntry/resolveContentEntry.js.map +1 -0
  157. package/contentEntry/resolveContentEntry.test.d.ts +1 -0
  158. package/contentEntry/resolveContentEntry.test.js +213 -0
  159. package/contentEntry/resolveContentEntry.test.js.map +1 -0
  160. package/createComponent.d.ts +5 -0
  161. package/createComponent.js +32 -0
  162. package/createComponent.js.map +1 -0
  163. package/createElement.js +5 -6
  164. package/createElement.js.map +1 -1
  165. package/createInput.d.ts +132 -16
  166. package/createInput.js +92 -111
  167. package/createInput.js.map +1 -1
  168. package/createTheme.js +2 -3
  169. package/createTheme.js.map +1 -1
  170. package/dataProviders/ApiClient.d.ts +10 -5
  171. package/dataProviders/ApiClient.js +40 -49
  172. package/dataProviders/ApiClient.js.map +1 -1
  173. package/dataProviders/DefaultDataProvider.d.ts +7 -3
  174. package/dataProviders/DefaultDataProvider.js +91 -45
  175. package/dataProviders/DefaultDataProvider.js.map +1 -1
  176. package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
  177. package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
  178. package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
  179. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  180. package/dataProviders/GET_PAGE_BY_ID.js +4 -1
  181. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  182. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  183. package/dataProviders/GET_PAGE_BY_PATH.js +4 -1
  184. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  185. package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
  186. package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
  187. package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
  188. package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
  189. package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
  190. package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
  191. package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
  192. package/dataProviders/LIST_PUBLISHED_PAGES.js +17 -5
  193. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  194. package/dataProviders/NullDataProvider.d.ts +16 -4
  195. package/dataProviders/NullDataProvider.js +30 -13
  196. package/dataProviders/NullDataProvider.js.map +1 -1
  197. package/dataProviders/RedirectsProvider.js +24 -27
  198. package/dataProviders/RedirectsProvider.js.map +1 -1
  199. package/defaultBreakpoints.js +43 -22
  200. package/defaultBreakpoints.js.map +1 -1
  201. package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
  202. package/documentOperations/$addElementReferenceToParent.js +30 -26
  203. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  204. package/documentOperations/AddElement.js +8 -7
  205. package/documentOperations/AddElement.js.map +1 -1
  206. package/documentOperations/AddToParent.d.ts +2 -2
  207. package/documentOperations/AddToParent.js +14 -13
  208. package/documentOperations/AddToParent.js.map +1 -1
  209. package/documentOperations/IDocumentOperation.js +0 -3
  210. package/documentOperations/RemoveElement.js +10 -7
  211. package/documentOperations/RemoveElement.js.map +1 -1
  212. package/documentOperations/SetGlobalInputBinding.js +23 -22
  213. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  214. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  215. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  216. package/documentOperations/SetInputBindingOverride.js +30 -29
  217. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  218. package/documentOperations/SetStyleBindingOverride.js +30 -31
  219. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  220. package/documentOperations/index.js +9 -8
  221. package/documentOperations/index.js.map +1 -1
  222. package/experiments/PostHogAnalyticsProvider.d.ts +31 -0
  223. package/experiments/PostHogAnalyticsProvider.js +28 -0
  224. package/experiments/PostHogAnalyticsProvider.js.map +1 -0
  225. package/experiments/analyticsProvider.d.ts +4 -0
  226. package/experiments/analyticsProvider.js +11 -0
  227. package/experiments/analyticsProvider.js.map +1 -0
  228. package/experiments/bucketing.d.ts +27 -0
  229. package/experiments/bucketing.js +91 -0
  230. package/experiments/bucketing.js.map +1 -0
  231. package/experiments/bucketing.test.d.ts +1 -0
  232. package/experiments/bucketing.test.js +183 -0
  233. package/experiments/bucketing.test.js.map +1 -0
  234. package/experiments/index.d.ts +5 -0
  235. package/experiments/index.js +5 -0
  236. package/experiments/render.d.ts +79 -0
  237. package/experiments/render.js +149 -0
  238. package/experiments/render.js.map +1 -0
  239. package/experiments/types.d.ts +108 -0
  240. package/experiments/types.js +4 -0
  241. package/experiments/types.js.map +1 -0
  242. package/findMatchingAstNode.js +11 -13
  243. package/findMatchingAstNode.js.map +1 -1
  244. package/generateElementId.d.ts +1 -1
  245. package/generateElementId.js +2 -2
  246. package/generateElementId.js.map +1 -1
  247. package/headersProvider.js +4 -3
  248. package/headersProvider.js.map +1 -1
  249. package/image/geometry.d.ts +54 -0
  250. package/image/geometry.js +112 -0
  251. package/image/geometry.js.map +1 -0
  252. package/image/geometry.test.d.ts +1 -0
  253. package/image/geometry.test.js +190 -0
  254. package/image/geometry.test.js.map +1 -0
  255. package/image/index.d.ts +3 -0
  256. package/image/index.js +3 -0
  257. package/image/presets.d.ts +6 -0
  258. package/image/presets.js +20 -0
  259. package/image/presets.js.map +1 -0
  260. package/image/types.d.ts +10 -0
  261. package/image/types.js +0 -0
  262. package/index.d.ts +12 -1
  263. package/index.js +11 -3
  264. package/jsonPatch.d.ts +1 -1
  265. package/jsonPatch.js +5 -9
  266. package/jsonPatch.js.map +1 -1
  267. package/messages.js +12 -11
  268. package/messages.js.map +1 -1
  269. package/messenger/MessageOrigin.js +12 -11
  270. package/messenger/MessageOrigin.js.map +1 -1
  271. package/messenger/Messenger.js +59 -70
  272. package/messenger/Messenger.js.map +1 -1
  273. package/messenger/index.js +0 -2
  274. package/package.json +19 -22
  275. package/registerComponentGroup.js +5 -6
  276. package/registerComponentGroup.js.map +1 -1
  277. package/tokenBinding.d.ts +26 -0
  278. package/tokenBinding.js +15 -0
  279. package/tokenBinding.js.map +1 -0
  280. package/tokenBinding.test.d.ts +1 -0
  281. package/tokenBinding.test.js +165 -0
  282. package/tokenBinding.test.js.map +1 -0
  283. package/types/ShorthandCssProperties.js +0 -3
  284. package/types/WebsiteBuilderTheme.d.ts +54 -45
  285. package/types/WebsiteBuilderTheme.js +0 -3
  286. package/types.d.ts +294 -13
  287. package/types.js +0 -3
  288. package/IBindingsUpdater.js.map +0 -1
  289. package/IRedirects.js.map +0 -1
  290. package/documentOperations/IDocumentOperation.js.map +0 -1
  291. package/index.js.map +0 -1
  292. package/lexical/createDefaultLexicalTheme.d.ts +0 -2
  293. package/lexical/createDefaultLexicalTheme.js +0 -84
  294. package/lexical/createDefaultLexicalTheme.js.map +0 -1
  295. package/lexical/createLexicalTheme.d.ts +0 -2
  296. package/lexical/createLexicalTheme.js +0 -7
  297. package/lexical/createLexicalTheme.js.map +0 -1
  298. package/lexical/deepMerge.d.ts +0 -1
  299. package/lexical/deepMerge.js +0 -23
  300. package/lexical/deepMerge.js.map +0 -1
  301. package/messenger/index.js.map +0 -1
  302. package/types/LexicalEditorTheme.d.ts +0 -2
  303. package/types/LexicalEditorTheme.js +0 -3
  304. package/types/LexicalEditorTheme.js.map +0 -1
  305. package/types/ShorthandCssProperties.js.map +0 -1
  306. package/types/WebsiteBuilderTheme.js.map +0 -1
  307. package/types.js.map +0 -1
@@ -6,5 +6,5 @@ export declare class StylesUpdater implements IBindingsUpdater {
6
6
  private elementId;
7
7
  constructor(elementId: string, bindings: ElementStylesBindings);
8
8
  applyToDocument(document: Document): void;
9
- createJsonPatch(bindings: DocumentElementBindings): import("./jsonPatch.js").JsonPatchOperation[];
9
+ createJsonPatch(bindings: DocumentElementBindings): import("fast-json-patch").Operation[];
10
10
  }
package/StylesUpdater.js CHANGED
@@ -1,34 +1,29 @@
1
1
  import { jsonPatch } from "./jsonPatch.js";
2
2
  import set from "lodash/set.js";
3
- export class StylesUpdater {
4
- constructor(elementId, bindings) {
5
- this.elementId = elementId;
6
- this.bindings = bindings;
7
- }
8
- applyToDocument(document) {
9
- if (this.bindings.styles) {
10
- document.bindings[this.elementId].styles = this.bindings.styles;
3
+ class StylesUpdater {
4
+ constructor(elementId, bindings){
5
+ this.elementId = elementId;
6
+ this.bindings = bindings;
11
7
  }
12
- if (this.bindings.overrides) {
13
- for (const [bp, overrides] of Object.entries(this.bindings.overrides)) {
14
- if (overrides.styles) {
15
- set(document.bindings, `${this.elementId}.overrides.${bp}.styles`, structuredClone(this.bindings.overrides[bp].styles));
8
+ applyToDocument(document) {
9
+ if (this.bindings.styles) document.bindings[this.elementId].styles = this.bindings.styles;
10
+ if (this.bindings.overrides) {
11
+ for (const [bp, overrides] of Object.entries(this.bindings.overrides))if (overrides.styles) set(document.bindings, `${this.elementId}.overrides.${bp}.styles`, structuredClone(this.bindings.overrides[bp].styles));
16
12
  }
17
- }
18
13
  }
19
- }
20
- createJsonPatch(bindings) {
21
- const toCompare = {
22
- ...this.bindings
23
- };
24
- if (Object.keys(toCompare.overrides ?? {}).length === 0) {
25
- delete toCompare.overrides;
14
+ createJsonPatch(bindings) {
15
+ const toCompare = {
16
+ ...this.bindings
17
+ };
18
+ if (0 === Object.keys(toCompare.overrides ?? {}).length) delete toCompare.overrides;
19
+ const ignore = [
20
+ "/inputs",
21
+ "/overrides/inputs",
22
+ "/metadata"
23
+ ];
24
+ return jsonPatch.compare(bindings, toCompare).filter((op)=>!ignore.some((prefix)=>op.path.startsWith(prefix)));
26
25
  }
27
- const ignore = ["/inputs", "/overrides/inputs", "/metadata"];
28
- return jsonPatch.compare(bindings, toCompare).filter(op => {
29
- return !ignore.some(prefix => op.path.startsWith(prefix));
30
- });
31
- }
32
26
  }
27
+ export { StylesUpdater };
33
28
 
34
29
  //# sourceMappingURL=StylesUpdater.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["jsonPatch","set","StylesUpdater","constructor","elementId","bindings","applyToDocument","document","styles","overrides","bp","Object","entries","structuredClone","createJsonPatch","toCompare","keys","length","ignore","compare","filter","op","some","prefix","path","startsWith"],"sources":["StylesUpdater.ts"],"sourcesContent":["import { jsonPatch } from \"~/jsonPatch.js\";\nimport set from \"lodash/set.js\";\nimport type { Document, DocumentElementBindings } from \"./types.js\";\nimport type { IBindingsUpdater } from \"./IBindingsUpdater.js\";\nimport type { ElementStylesBindings } from \"./StylesBindingsProcessor.js\";\n\nexport class StylesUpdater implements IBindingsUpdater {\n private readonly bindings: ElementStylesBindings;\n private elementId: string;\n\n constructor(elementId: string, bindings: ElementStylesBindings) {\n this.elementId = elementId;\n this.bindings = bindings;\n }\n\n applyToDocument(document: Document) {\n if (this.bindings.styles) {\n document.bindings[this.elementId].styles = this.bindings.styles;\n }\n\n if (this.bindings.overrides) {\n for (const [bp, overrides] of Object.entries(this.bindings.overrides)) {\n if (overrides.styles) {\n set(\n document.bindings,\n `${this.elementId}.overrides.${bp}.styles`,\n structuredClone(this.bindings.overrides[bp].styles)\n );\n }\n }\n }\n }\n\n createJsonPatch(bindings: DocumentElementBindings) {\n const toCompare: Partial<DocumentElementBindings> = { ...this.bindings };\n if (Object.keys(toCompare.overrides ?? {}).length === 0) {\n delete toCompare.overrides;\n }\n\n const ignore = [\"/inputs\", \"/overrides/inputs\", \"/metadata\"];\n\n return jsonPatch.compare(bindings, toCompare).filter(op => {\n return !ignore.some(prefix => op.path.startsWith(prefix));\n });\n }\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAClB,OAAOC,GAAG,MAAM,eAAe;AAK/B,OAAO,MAAMC,aAAa,CAA6B;EAInDC,WAAWA,CAACC,SAAiB,EAAEC,QAA+B,EAAE;IAC5D,IAAI,CAACD,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACC,QAAQ,GAAGA,QAAQ;EAC5B;EAEAC,eAAeA,CAACC,QAAkB,EAAE;IAChC,IAAI,IAAI,CAACF,QAAQ,CAACG,MAAM,EAAE;MACtBD,QAAQ,CAACF,QAAQ,CAAC,IAAI,CAACD,SAAS,CAAC,CAACI,MAAM,GAAG,IAAI,CAACH,QAAQ,CAACG,MAAM;IACnE;IAEA,IAAI,IAAI,CAACH,QAAQ,CAACI,SAAS,EAAE;MACzB,KAAK,MAAM,CAACC,EAAE,EAAED,SAAS,CAAC,IAAIE,MAAM,CAACC,OAAO,CAAC,IAAI,CAACP,QAAQ,CAACI,SAAS,CAAC,EAAE;QACnE,IAAIA,SAAS,CAACD,MAAM,EAAE;UAClBP,GAAG,CACCM,QAAQ,CAACF,QAAQ,EACjB,GAAG,IAAI,CAACD,SAAS,cAAcM,EAAE,SAAS,EAC1CG,eAAe,CAAC,IAAI,CAACR,QAAQ,CAACI,SAAS,CAACC,EAAE,CAAC,CAACF,MAAM,CACtD,CAAC;QACL;MACJ;IACJ;EACJ;EAEAM,eAAeA,CAACT,QAAiC,EAAE;IAC/C,MAAMU,SAA2C,GAAG;MAAE,GAAG,IAAI,CAACV;IAAS,CAAC;IACxE,IAAIM,MAAM,CAACK,IAAI,CAACD,SAAS,CAACN,SAAS,IAAI,CAAC,CAAC,CAAC,CAACQ,MAAM,KAAK,CAAC,EAAE;MACrD,OAAOF,SAAS,CAACN,SAAS;IAC9B;IAEA,MAAMS,MAAM,GAAG,CAAC,SAAS,EAAE,mBAAmB,EAAE,WAAW,CAAC;IAE5D,OAAOlB,SAAS,CAACmB,OAAO,CAACd,QAAQ,EAAEU,SAAS,CAAC,CAACK,MAAM,CAACC,EAAE,IAAI;MACvD,OAAO,CAACH,MAAM,CAACI,IAAI,CAACC,MAAM,IAAIF,EAAE,CAACG,IAAI,CAACC,UAAU,CAACF,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"StylesUpdater.js","sources":["../src/StylesUpdater.ts"],"sourcesContent":["import { jsonPatch } from \"~/jsonPatch.js\";\nimport set from \"lodash/set.js\";\nimport type { Document, DocumentElementBindings } from \"./types.js\";\nimport type { IBindingsUpdater } from \"./IBindingsUpdater.js\";\nimport type { ElementStylesBindings } from \"./StylesBindingsProcessor.js\";\n\nexport class StylesUpdater implements IBindingsUpdater {\n private readonly bindings: ElementStylesBindings;\n private elementId: string;\n\n constructor(elementId: string, bindings: ElementStylesBindings) {\n this.elementId = elementId;\n this.bindings = bindings;\n }\n\n applyToDocument(document: Document) {\n if (this.bindings.styles) {\n document.bindings[this.elementId].styles = this.bindings.styles;\n }\n\n if (this.bindings.overrides) {\n for (const [bp, overrides] of Object.entries(this.bindings.overrides)) {\n if (overrides.styles) {\n set(\n document.bindings,\n `${this.elementId}.overrides.${bp}.styles`,\n structuredClone(this.bindings.overrides[bp].styles)\n );\n }\n }\n }\n }\n\n createJsonPatch(bindings: DocumentElementBindings) {\n const toCompare: Partial<DocumentElementBindings> = { ...this.bindings };\n if (Object.keys(toCompare.overrides ?? {}).length === 0) {\n delete toCompare.overrides;\n }\n\n const ignore = [\"/inputs\", \"/overrides/inputs\", \"/metadata\"];\n\n return jsonPatch.compare(bindings, toCompare).filter(op => {\n return !ignore.some(prefix => op.path.startsWith(prefix));\n });\n }\n}\n"],"names":["StylesUpdater","elementId","bindings","document","bp","overrides","Object","set","structuredClone","toCompare","ignore","jsonPatch","op","prefix"],"mappings":";;AAMO,MAAMA;IAIT,YAAYC,SAAiB,EAAEC,QAA+B,CAAE;QAC5D,IAAI,CAAC,SAAS,GAAGD;QACjB,IAAI,CAAC,QAAQ,GAAGC;IACpB;IAEA,gBAAgBC,QAAkB,EAAE;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EACpBA,SAAS,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;QAGnE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB;YAAA,KAAK,MAAM,CAACC,IAAIC,UAAU,IAAIC,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAChE,IAAID,UAAU,MAAM,EAChBE,IACIJ,SAAS,QAAQ,EACjB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAEC,GAAG,OAAO,CAAC,EAC1CI,gBAAgB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAACJ,GAAG,CAAC,MAAM;QAG9D;IAER;IAEA,gBAAgBF,QAAiC,EAAE;QAC/C,MAAMO,YAA8C;YAAE,GAAG,IAAI,CAAC,QAAQ;QAAC;QACvE,IAAIH,AAAkD,MAAlDA,OAAO,IAAI,CAACG,UAAU,SAAS,IAAI,CAAC,GAAG,MAAM,EAC7C,OAAOA,UAAU,SAAS;QAG9B,MAAMC,SAAS;YAAC;YAAW;YAAqB;SAAY;QAE5D,OAAOC,UAAU,OAAO,CAACT,UAAUO,WAAW,MAAM,CAACG,CAAAA,KAC1C,CAACF,OAAO,IAAI,CAACG,CAAAA,SAAUD,GAAG,IAAI,CAAC,UAAU,CAACC;IAEzD;AACJ"}
package/Theme.js CHANGED
@@ -1,36 +1,34 @@
1
- import deepMerge from "deepmerge";
1
+ import deepmerge from "deepmerge";
2
2
  import { defaultBreakpoints } from "./defaultBreakpoints.js";
3
- import { createLexicalTheme } from "./lexical/createLexicalTheme.js";
4
- export class Theme {
5
- static from(input) {
6
- const {
7
- custom = {},
8
- ...builtInOverrides
9
- } = input?.breakpoints ?? {};
10
- const mergedBreakpoints = deepMerge.all([{}, defaultBreakpoints, builtInOverrides, custom]);
11
- const breakpoints = [];
12
- Object.entries(mergedBreakpoints ?? {}).forEach(([name, breakpoint]) => {
13
- breakpoints.push({
14
- name,
15
- ...breakpoint
16
- });
17
- });
18
- return {
19
- css: input.css,
20
- cssVariables: input.cssVariables,
21
- fonts: input.fonts,
22
- breakpoints: breakpoints.sort((a, b) => b.maxWidth - a.maxWidth),
23
- lexical: createLexicalTheme(input?.lexical),
24
- styles: {
25
- colors: {
26
- ...input?.styles?.colors
27
- },
28
- typography: {
29
- ...input?.styles?.typography
30
- }
31
- }
32
- };
33
- }
3
+ class Theme {
4
+ static from(input) {
5
+ const { custom = {}, ...builtInOverrides } = input?.breakpoints ?? {};
6
+ const mergedBreakpoints = deepmerge.all([
7
+ {},
8
+ defaultBreakpoints,
9
+ builtInOverrides,
10
+ custom
11
+ ]);
12
+ const breakpoints = [];
13
+ Object.entries(mergedBreakpoints ?? {}).forEach(([name, breakpoint])=>{
14
+ breakpoints.push({
15
+ name,
16
+ ...breakpoint
17
+ });
18
+ });
19
+ return {
20
+ css: input.css,
21
+ fonts: input.fonts,
22
+ fontSizes: input.fontSizes,
23
+ breakpoints: breakpoints.sort((a, b)=>b.maxWidth - a.maxWidth),
24
+ colors: input?.colors ?? [],
25
+ typography: {
26
+ ...input?.typography
27
+ },
28
+ allowCustomColors: input.allowCustomColors
29
+ };
30
+ }
34
31
  }
32
+ export { Theme };
35
33
 
36
34
  //# sourceMappingURL=Theme.js.map
package/Theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["deepMerge","defaultBreakpoints","createLexicalTheme","Theme","from","input","custom","builtInOverrides","breakpoints","mergedBreakpoints","all","Object","entries","forEach","name","breakpoint","push","css","cssVariables","fonts","sort","a","b","maxWidth","lexical","styles","colors","typography"],"sources":["Theme.ts"],"sourcesContent":["import deepMerge from \"deepmerge\";\nimport type {\n Breakpoint,\n WebsiteBuilderTheme,\n WebsiteBuilderThemeInput\n} from \"~/types/WebsiteBuilderTheme.js\";\nimport { defaultBreakpoints } from \"~/defaultBreakpoints.js\";\nimport { createLexicalTheme } from \"~/lexical/createLexicalTheme.js\";\n\nexport class Theme {\n static from(input: WebsiteBuilderThemeInput): WebsiteBuilderTheme {\n const { custom = {}, ...builtInOverrides } = input?.breakpoints ?? {};\n\n const mergedBreakpoints = deepMerge.all([\n {},\n defaultBreakpoints,\n builtInOverrides,\n custom\n ]) as WebsiteBuilderThemeInput[\"breakpoints\"];\n\n const breakpoints: Breakpoint[] = [];\n Object.entries(mergedBreakpoints ?? {}).forEach(([name, breakpoint]) => {\n breakpoints.push({\n name,\n ...(breakpoint as Omit<Breakpoint, \"name\">)\n });\n });\n\n return {\n css: input.css,\n cssVariables: input.cssVariables,\n fonts: input.fonts,\n breakpoints: breakpoints.sort((a, b) => b.maxWidth - a.maxWidth),\n lexical: createLexicalTheme(input?.lexical),\n styles: {\n colors: {\n ...input?.styles?.colors\n },\n typography: {\n ...input?.styles?.typography\n }\n }\n };\n }\n}\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,WAAW;AAMjC,SAASC,kBAAkB;AAC3B,SAASC,kBAAkB;AAE3B,OAAO,MAAMC,KAAK,CAAC;EACf,OAAOC,IAAIA,CAACC,KAA+B,EAAuB;IAC9D,MAAM;MAAEC,MAAM,GAAG,CAAC,CAAC;MAAE,GAAGC;IAAiB,CAAC,GAAGF,KAAK,EAAEG,WAAW,IAAI,CAAC,CAAC;IAErE,MAAMC,iBAAiB,GAAGT,SAAS,CAACU,GAAG,CAAC,CACpC,CAAC,CAAC,EACFT,kBAAkB,EAClBM,gBAAgB,EAChBD,MAAM,CACT,CAA4C;IAE7C,MAAME,WAAyB,GAAG,EAAE;IACpCG,MAAM,CAACC,OAAO,CAACH,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAACI,OAAO,CAAC,CAAC,CAACC,IAAI,EAAEC,UAAU,CAAC,KAAK;MACpEP,WAAW,CAACQ,IAAI,CAAC;QACbF,IAAI;QACJ,GAAIC;MACR,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,OAAO;MACHE,GAAG,EAAEZ,KAAK,CAACY,GAAG;MACdC,YAAY,EAAEb,KAAK,CAACa,YAAY;MAChCC,KAAK,EAAEd,KAAK,CAACc,KAAK;MAClBX,WAAW,EAAEA,WAAW,CAACY,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACC,QAAQ,GAAGF,CAAC,CAACE,QAAQ,CAAC;MAChEC,OAAO,EAAEtB,kBAAkB,CAACG,KAAK,EAAEmB,OAAO,CAAC;MAC3CC,MAAM,EAAE;QACJC,MAAM,EAAE;UACJ,GAAGrB,KAAK,EAAEoB,MAAM,EAAEC;QACtB,CAAC;QACDC,UAAU,EAAE;UACR,GAAGtB,KAAK,EAAEoB,MAAM,EAAEE;QACtB;MACJ;IACJ,CAAC;EACL;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"Theme.js","sources":["../src/Theme.ts"],"sourcesContent":["import deepMerge from \"deepmerge\";\nimport type {\n Breakpoint,\n WebsiteBuilderTheme,\n WebsiteBuilderThemeInput\n} from \"~/types/WebsiteBuilderTheme.js\";\nimport { defaultBreakpoints } from \"~/defaultBreakpoints.js\";\n\nexport class Theme {\n static from(input: WebsiteBuilderThemeInput): WebsiteBuilderTheme {\n const { custom = {}, ...builtInOverrides } = input?.breakpoints ?? {};\n\n const mergedBreakpoints = deepMerge.all([\n {},\n defaultBreakpoints,\n builtInOverrides,\n custom\n ]) as WebsiteBuilderThemeInput[\"breakpoints\"];\n\n const breakpoints: Breakpoint[] = [];\n Object.entries(mergedBreakpoints ?? {}).forEach(([name, breakpoint]) => {\n breakpoints.push({\n name,\n ...(breakpoint as Omit<Breakpoint, \"name\">)\n });\n });\n\n return {\n css: input.css,\n fonts: input.fonts,\n fontSizes: input.fontSizes,\n breakpoints: breakpoints.sort((a, b) => b.maxWidth - a.maxWidth),\n colors: input?.colors ?? [],\n typography: {\n ...input?.typography\n },\n allowCustomColors: input.allowCustomColors\n };\n }\n}\n"],"names":["Theme","input","custom","builtInOverrides","mergedBreakpoints","deepMerge","defaultBreakpoints","breakpoints","Object","name","breakpoint","a","b"],"mappings":";;AAQO,MAAMA;IACT,OAAO,KAAKC,KAA+B,EAAuB;QAC9D,MAAM,EAAEC,SAAS,CAAC,CAAC,EAAE,GAAGC,kBAAkB,GAAGF,OAAO,eAAe,CAAC;QAEpE,MAAMG,oBAAoBC,UAAAA,GAAa,CAAC;YACpC,CAAC;YACDC;YACAH;YACAD;SACH;QAED,MAAMK,cAA4B,EAAE;QACpCC,OAAO,OAAO,CAACJ,qBAAqB,CAAC,GAAG,OAAO,CAAC,CAAC,CAACK,MAAMC,WAAW;YAC/DH,YAAY,IAAI,CAAC;gBACbE;gBACA,GAAIC,UAAU;YAClB;QACJ;QAEA,OAAO;YACH,KAAKT,MAAM,GAAG;YACd,OAAOA,MAAM,KAAK;YAClB,WAAWA,MAAM,SAAS;YAC1B,aAAaM,YAAY,IAAI,CAAC,CAACI,GAAGC,IAAMA,EAAE,QAAQ,GAAGD,EAAE,QAAQ;YAC/D,QAAQV,OAAO,UAAU,EAAE;YAC3B,YAAY;gBACR,GAAGA,OAAO,UAAU;YACxB;YACA,mBAAmBA,MAAM,iBAAiB;QAC9C;IACJ;AACJ"}
@@ -2,6 +2,8 @@ import type { Breakpoint } from "./types.js";
2
2
  export interface ViewportInfo {
3
3
  width: number;
4
4
  height: number;
5
+ scrollWidth: number;
6
+ scrollHeight: number;
5
7
  scrollX: number;
6
8
  scrollY: number;
7
9
  breakpoint: string;
@@ -1,106 +1,98 @@
1
1
  "use client";
2
-
3
2
  import { environment } from "./Environment.js";
4
- export class ViewportManager {
5
- /**
6
- * We need this fallback breakpoint for server environments.
7
- */
8
- breakpoints = [{
9
- name: "desktop",
10
- title: "",
11
- description: "",
12
- icon: "",
13
- minWidth: 0,
14
- maxWidth: 4000
15
- }];
16
- constructor(timeout = 150) {
17
- this.changeTimeout = timeout;
18
- this.changeStartSubscribers = new Set();
19
- this.changeEndSubscribers = new Set();
20
- this.isChanging = false;
21
- this.changeTimer = null;
22
- this.handleViewportChange = this.handleViewportChange.bind(this);
23
- this.handleResize = this.handleResize.bind(this);
24
- if (environment.isClient()) {
25
- window.addEventListener("resize", this.handleResize, {
26
- passive: true
27
- });
3
+ class ViewportManager {
4
+ constructor(timeout = 150){
5
+ this.breakpoints = [
6
+ {
7
+ name: "desktop",
8
+ title: "",
9
+ description: "",
10
+ icon: "",
11
+ minWidth: 0,
12
+ maxWidth: 4000
13
+ }
14
+ ];
15
+ this.changeTimeout = timeout;
16
+ this.changeStartSubscribers = new Set();
17
+ this.changeEndSubscribers = new Set();
18
+ this.isChanging = false;
19
+ this.changeTimer = null;
20
+ this.handleViewportChange = this.handleViewportChange.bind(this);
21
+ this.handleResize = this.handleResize.bind(this);
22
+ if (environment.isClient()) window.addEventListener("resize", this.handleResize, {
23
+ passive: true
24
+ });
28
25
  }
29
- }
30
- setBreakpoints(breakpoints) {
31
- this.breakpoints = breakpoints;
32
- }
33
- onViewportChangeStart(callback) {
34
- this.changeStartSubscribers.add(callback);
35
- return () => this.changeStartSubscribers.delete(callback);
36
- }
37
- onViewportChangeEnd(callback) {
38
- this.changeEndSubscribers.add(callback);
39
- return () => this.changeEndSubscribers.delete(callback);
40
- }
41
-
42
- /**
43
- * Get the current viewport information
44
- */
45
- getViewport() {
46
- return this.getViewportInfo();
47
- }
48
- destroy() {
49
- if (environment.isClient()) {
50
- window.removeEventListener("resize", this.handleResize);
51
- if (this.changeTimer !== null) {
52
- clearTimeout(this.changeTimer);
53
- }
54
- this.changeStartSubscribers.clear();
55
- this.changeEndSubscribers.clear();
26
+ setBreakpoints(breakpoints) {
27
+ this.breakpoints = breakpoints;
28
+ }
29
+ onViewportChangeStart(callback) {
30
+ this.changeStartSubscribers.add(callback);
31
+ return ()=>this.changeStartSubscribers.delete(callback);
32
+ }
33
+ onViewportChangeEnd(callback) {
34
+ this.changeEndSubscribers.add(callback);
35
+ return ()=>this.changeEndSubscribers.delete(callback);
36
+ }
37
+ getViewport() {
38
+ return this.getViewportInfo();
39
+ }
40
+ destroy() {
41
+ if (environment.isClient()) {
42
+ window.removeEventListener("resize", this.handleResize);
43
+ if (null !== this.changeTimer) clearTimeout(this.changeTimer);
44
+ this.changeStartSubscribers.clear();
45
+ this.changeEndSubscribers.clear();
46
+ }
47
+ }
48
+ handleResize() {
49
+ this.handleViewportChange();
50
+ }
51
+ handleViewportChange() {
52
+ const viewportInfo = this.getViewportInfo();
53
+ if (!this.isChanging) {
54
+ this.isChanging = true;
55
+ this.notifySubscribers(this.changeStartSubscribers, viewportInfo);
56
+ }
57
+ if (null !== this.changeTimer) clearTimeout(this.changeTimer);
58
+ this.changeTimer = window.setTimeout(()=>{
59
+ this.isChanging = false;
60
+ this.notifySubscribers(this.changeEndSubscribers, viewportInfo);
61
+ }, this.changeTimeout);
56
62
  }
57
- }
58
- handleResize() {
59
- this.handleViewportChange();
60
- }
61
- handleViewportChange() {
62
- const viewportInfo = this.getViewportInfo();
63
- if (!this.isChanging) {
64
- this.isChanging = true;
65
- this.notifySubscribers(this.changeStartSubscribers, viewportInfo);
63
+ getViewportInfo() {
64
+ const modes = [
65
+ ...this.breakpoints
66
+ ].reverse();
67
+ const viewport = environment.isClient() ? {
68
+ width: window.innerWidth,
69
+ height: window.innerHeight,
70
+ scrollWidth: window.document.body.scrollWidth,
71
+ scrollHeight: window.document.body.scrollHeight,
72
+ scrollX: window.scrollX,
73
+ scrollY: window.scrollY
74
+ } : {
75
+ height: 0,
76
+ width: 2000,
77
+ scrollHeight: 0,
78
+ scrollWidth: 2000,
79
+ scrollX: 0,
80
+ scrollY: 0
81
+ };
82
+ const [breakpoint] = modes.filter((mode)=>mode.maxWidth >= viewport.width);
83
+ return {
84
+ ...viewport,
85
+ breakpoint: breakpoint.name,
86
+ breakpoints: this.breakpoints
87
+ };
66
88
  }
67
- if (this.changeTimer !== null) {
68
- clearTimeout(this.changeTimer);
89
+ notifySubscribers(subscribers, viewportInfo) {
90
+ subscribers.forEach((callback)=>{
91
+ if ("function" == typeof callback) callback(viewportInfo);
92
+ });
69
93
  }
70
- this.changeTimer = window.setTimeout(() => {
71
- this.isChanging = false;
72
- this.notifySubscribers(this.changeEndSubscribers, viewportInfo);
73
- }, this.changeTimeout);
74
- }
75
- getViewportInfo() {
76
- const modes = [...this.breakpoints].reverse();
77
- const viewport = environment.isClient() ? {
78
- width: window.innerWidth,
79
- height: window.innerHeight,
80
- scrollX: window.scrollX,
81
- scrollY: window.scrollY
82
- } : {
83
- // During SSR or Next.js build, viewport is not available.
84
- height: 0,
85
- width: 2000,
86
- scrollX: 0,
87
- scrollY: 0
88
- };
89
- const [breakpoint] = modes.filter(mode => mode.maxWidth >= viewport.width);
90
- return {
91
- ...viewport,
92
- breakpoint: breakpoint.name,
93
- breakpoints: this.breakpoints
94
- };
95
- }
96
- notifySubscribers(subscribers, viewportInfo) {
97
- subscribers.forEach(callback => {
98
- if (typeof callback === "function") {
99
- callback(viewportInfo);
100
- }
101
- });
102
- }
103
94
  }
104
- export const viewportManager = new ViewportManager();
95
+ const viewportManager = new ViewportManager();
96
+ export { ViewportManager, viewportManager };
105
97
 
106
98
  //# sourceMappingURL=ViewportManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["environment","ViewportManager","breakpoints","name","title","description","icon","minWidth","maxWidth","constructor","timeout","changeTimeout","changeStartSubscribers","Set","changeEndSubscribers","isChanging","changeTimer","handleViewportChange","bind","handleResize","isClient","window","addEventListener","passive","setBreakpoints","onViewportChangeStart","callback","add","delete","onViewportChangeEnd","getViewport","getViewportInfo","destroy","removeEventListener","clearTimeout","clear","viewportInfo","notifySubscribers","setTimeout","modes","reverse","viewport","width","innerWidth","height","innerHeight","scrollX","scrollY","breakpoint","filter","mode","subscribers","forEach","viewportManager"],"sources":["ViewportManager.ts"],"sourcesContent":["\"use client\";\nimport type { Breakpoint } from \"~/types.js\";\nimport { environment } from \"~/Environment.js\";\n\nexport interface ViewportInfo {\n width: number;\n height: number;\n scrollX: number;\n scrollY: number;\n breakpoint: string;\n breakpoints: Breakpoint[];\n}\n\nexport class ViewportManager {\n private readonly changeTimeout: number;\n private readonly changeStartSubscribers: Set<(info: ViewportInfo) => void>;\n private readonly changeEndSubscribers: Set<(info: ViewportInfo) => void>;\n private isChanging: boolean;\n private changeTimer: number | null;\n\n /**\n * We need this fallback breakpoint for server environments.\n */\n private breakpoints: Breakpoint[] = [\n {\n name: \"desktop\",\n title: \"\",\n description: \"\",\n icon: \"\",\n minWidth: 0,\n maxWidth: 4000\n }\n ];\n\n constructor(timeout: number = 150) {\n this.changeTimeout = timeout;\n this.changeStartSubscribers = new Set();\n this.changeEndSubscribers = new Set();\n this.isChanging = false;\n this.changeTimer = null;\n\n this.handleViewportChange = this.handleViewportChange.bind(this);\n this.handleResize = this.handleResize.bind(this);\n\n if (environment.isClient()) {\n window.addEventListener(\"resize\", this.handleResize, { passive: true });\n }\n }\n\n public setBreakpoints(breakpoints: Breakpoint[]) {\n this.breakpoints = breakpoints;\n }\n\n public onViewportChangeStart(callback: (info: ViewportInfo) => void): () => void {\n this.changeStartSubscribers.add(callback);\n return () => this.changeStartSubscribers.delete(callback);\n }\n\n public onViewportChangeEnd(callback: (info: ViewportInfo) => void): () => void {\n this.changeEndSubscribers.add(callback);\n return () => this.changeEndSubscribers.delete(callback);\n }\n\n /**\n * Get the current viewport information\n */\n public getViewport(): ViewportInfo {\n return this.getViewportInfo();\n }\n\n public destroy(): void {\n if (environment.isClient()) {\n window.removeEventListener(\"resize\", this.handleResize);\n if (this.changeTimer !== null) {\n clearTimeout(this.changeTimer);\n }\n this.changeStartSubscribers.clear();\n this.changeEndSubscribers.clear();\n }\n }\n\n private handleResize(): void {\n this.handleViewportChange();\n }\n\n private handleViewportChange(): void {\n const viewportInfo = this.getViewportInfo();\n\n if (!this.isChanging) {\n this.isChanging = true;\n this.notifySubscribers(this.changeStartSubscribers, viewportInfo);\n }\n\n if (this.changeTimer !== null) {\n clearTimeout(this.changeTimer);\n }\n\n this.changeTimer = window.setTimeout(() => {\n this.isChanging = false;\n this.notifySubscribers(this.changeEndSubscribers, viewportInfo);\n }, this.changeTimeout);\n }\n\n private getViewportInfo(): ViewportInfo {\n const modes = [...this.breakpoints].reverse();\n const viewport = environment.isClient()\n ? {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY\n }\n : {\n // During SSR or Next.js build, viewport is not available.\n height: 0,\n width: 2000,\n scrollX: 0,\n scrollY: 0\n };\n\n const [breakpoint] = modes.filter(mode => mode.maxWidth >= viewport.width);\n\n return { ...viewport, breakpoint: breakpoint.name, breakpoints: this.breakpoints };\n }\n\n private notifySubscribers(\n subscribers: Set<(info: ViewportInfo) => void>,\n viewportInfo: ViewportInfo\n ): void {\n subscribers.forEach(callback => {\n if (typeof callback === \"function\") {\n callback(viewportInfo);\n }\n });\n }\n}\n\nexport const viewportManager = new ViewportManager();\n"],"mappings":"AAAA,YAAY;;AAEZ,SAASA,WAAW;AAWpB,OAAO,MAAMC,eAAe,CAAC;EAOzB;AACJ;AACA;EACYC,WAAW,GAAiB,CAChC;IACIC,IAAI,EAAE,SAAS;IACfC,KAAK,EAAE,EAAE;IACTC,WAAW,EAAE,EAAE;IACfC,IAAI,EAAE,EAAE;IACRC,QAAQ,EAAE,CAAC;IACXC,QAAQ,EAAE;EACd,CAAC,CACJ;EAEDC,WAAWA,CAACC,OAAe,GAAG,GAAG,EAAE;IAC/B,IAAI,CAACC,aAAa,GAAGD,OAAO;IAC5B,IAAI,CAACE,sBAAsB,GAAG,IAAIC,GAAG,CAAC,CAAC;IACvC,IAAI,CAACC,oBAAoB,GAAG,IAAID,GAAG,CAAC,CAAC;IACrC,IAAI,CAACE,UAAU,GAAG,KAAK;IACvB,IAAI,CAACC,WAAW,GAAG,IAAI;IAEvB,IAAI,CAACC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACC,YAAY,GAAG,IAAI,CAACA,YAAY,CAACD,IAAI,CAAC,IAAI,CAAC;IAEhD,IAAIlB,WAAW,CAACoB,QAAQ,CAAC,CAAC,EAAE;MACxBC,MAAM,CAACC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAACH,YAAY,EAAE;QAAEI,OAAO,EAAE;MAAK,CAAC,CAAC;IAC3E;EACJ;EAEOC,cAAcA,CAACtB,WAAyB,EAAE;IAC7C,IAAI,CAACA,WAAW,GAAGA,WAAW;EAClC;EAEOuB,qBAAqBA,CAACC,QAAsC,EAAc;IAC7E,IAAI,CAACd,sBAAsB,CAACe,GAAG,CAACD,QAAQ,CAAC;IACzC,OAAO,MAAM,IAAI,CAACd,sBAAsB,CAACgB,MAAM,CAACF,QAAQ,CAAC;EAC7D;EAEOG,mBAAmBA,CAACH,QAAsC,EAAc;IAC3E,IAAI,CAACZ,oBAAoB,CAACa,GAAG,CAACD,QAAQ,CAAC;IACvC,OAAO,MAAM,IAAI,CAACZ,oBAAoB,CAACc,MAAM,CAACF,QAAQ,CAAC;EAC3D;;EAEA;AACJ;AACA;EACWI,WAAWA,CAAA,EAAiB;IAC/B,OAAO,IAAI,CAACC,eAAe,CAAC,CAAC;EACjC;EAEOC,OAAOA,CAAA,EAAS;IACnB,IAAIhC,WAAW,CAACoB,QAAQ,CAAC,CAAC,EAAE;MACxBC,MAAM,CAACY,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAACd,YAAY,CAAC;MACvD,IAAI,IAAI,CAACH,WAAW,KAAK,IAAI,EAAE;QAC3BkB,YAAY,CAAC,IAAI,CAAClB,WAAW,CAAC;MAClC;MACA,IAAI,CAACJ,sBAAsB,CAACuB,KAAK,CAAC,CAAC;MACnC,IAAI,CAACrB,oBAAoB,CAACqB,KAAK,CAAC,CAAC;IACrC;EACJ;EAEQhB,YAAYA,CAAA,EAAS;IACzB,IAAI,CAACF,oBAAoB,CAAC,CAAC;EAC/B;EAEQA,oBAAoBA,CAAA,EAAS;IACjC,MAAMmB,YAAY,GAAG,IAAI,CAACL,eAAe,CAAC,CAAC;IAE3C,IAAI,CAAC,IAAI,CAAChB,UAAU,EAAE;MAClB,IAAI,CAACA,UAAU,GAAG,IAAI;MACtB,IAAI,CAACsB,iBAAiB,CAAC,IAAI,CAACzB,sBAAsB,EAAEwB,YAAY,CAAC;IACrE;IAEA,IAAI,IAAI,CAACpB,WAAW,KAAK,IAAI,EAAE;MAC3BkB,YAAY,CAAC,IAAI,CAAClB,WAAW,CAAC;IAClC;IAEA,IAAI,CAACA,WAAW,GAAGK,MAAM,CAACiB,UAAU,CAAC,MAAM;MACvC,IAAI,CAACvB,UAAU,GAAG,KAAK;MACvB,IAAI,CAACsB,iBAAiB,CAAC,IAAI,CAACvB,oBAAoB,EAAEsB,YAAY,CAAC;IACnE,CAAC,EAAE,IAAI,CAACzB,aAAa,CAAC;EAC1B;EAEQoB,eAAeA,CAAA,EAAiB;IACpC,MAAMQ,KAAK,GAAG,CAAC,GAAG,IAAI,CAACrC,WAAW,CAAC,CAACsC,OAAO,CAAC,CAAC;IAC7C,MAAMC,QAAQ,GAAGzC,WAAW,CAACoB,QAAQ,CAAC,CAAC,GACjC;MACIsB,KAAK,EAAErB,MAAM,CAACsB,UAAU;MACxBC,MAAM,EAAEvB,MAAM,CAACwB,WAAW;MAC1BC,OAAO,EAAEzB,MAAM,CAACyB,OAAO;MACvBC,OAAO,EAAE1B,MAAM,CAAC0B;IACpB,CAAC,GACD;MACI;MACAH,MAAM,EAAE,CAAC;MACTF,KAAK,EAAE,IAAI;MACXI,OAAO,EAAE,CAAC;MACVC,OAAO,EAAE;IACb,CAAC;IAEP,MAAM,CAACC,UAAU,CAAC,GAAGT,KAAK,CAACU,MAAM,CAACC,IAAI,IAAIA,IAAI,CAAC1C,QAAQ,IAAIiC,QAAQ,CAACC,KAAK,CAAC;IAE1E,OAAO;MAAE,GAAGD,QAAQ;MAAEO,UAAU,EAAEA,UAAU,CAAC7C,IAAI;MAAED,WAAW,EAAE,IAAI,CAACA;IAAY,CAAC;EACtF;EAEQmC,iBAAiBA,CACrBc,WAA8C,EAC9Cf,YAA0B,EACtB;IACJe,WAAW,CAACC,OAAO,CAAC1B,QAAQ,IAAI;MAC5B,IAAI,OAAOA,QAAQ,KAAK,UAAU,EAAE;QAChCA,QAAQ,CAACU,YAAY,CAAC;MAC1B;IACJ,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMiB,eAAe,GAAG,IAAIpD,eAAe,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"ViewportManager.js","sources":["../src/ViewportManager.ts"],"sourcesContent":["\"use client\";\nimport type { Breakpoint } from \"~/types.js\";\nimport { environment } from \"~/Environment.js\";\n\nexport interface ViewportInfo {\n width: number;\n height: number;\n scrollWidth: number;\n scrollHeight: number;\n scrollX: number;\n scrollY: number;\n breakpoint: string;\n breakpoints: Breakpoint[];\n}\n\nexport class ViewportManager {\n private readonly changeTimeout: number;\n private readonly changeStartSubscribers: Set<(info: ViewportInfo) => void>;\n private readonly changeEndSubscribers: Set<(info: ViewportInfo) => void>;\n private isChanging: boolean;\n private changeTimer: number | null;\n\n /**\n * We need this fallback breakpoint for server environments.\n */\n private breakpoints: Breakpoint[] = [\n {\n name: \"desktop\",\n title: \"\",\n description: \"\",\n icon: \"\",\n minWidth: 0,\n maxWidth: 4000\n }\n ];\n\n constructor(timeout: number = 150) {\n this.changeTimeout = timeout;\n this.changeStartSubscribers = new Set();\n this.changeEndSubscribers = new Set();\n this.isChanging = false;\n this.changeTimer = null;\n\n this.handleViewportChange = this.handleViewportChange.bind(this);\n this.handleResize = this.handleResize.bind(this);\n\n if (environment.isClient()) {\n window.addEventListener(\"resize\", this.handleResize, { passive: true });\n }\n }\n\n public setBreakpoints(breakpoints: Breakpoint[]) {\n this.breakpoints = breakpoints;\n }\n\n public onViewportChangeStart(callback: (info: ViewportInfo) => void): () => void {\n this.changeStartSubscribers.add(callback);\n return () => this.changeStartSubscribers.delete(callback);\n }\n\n public onViewportChangeEnd(callback: (info: ViewportInfo) => void): () => void {\n this.changeEndSubscribers.add(callback);\n return () => this.changeEndSubscribers.delete(callback);\n }\n\n /**\n * Get the current viewport information\n */\n public getViewport(): ViewportInfo {\n return this.getViewportInfo();\n }\n\n public destroy(): void {\n if (environment.isClient()) {\n window.removeEventListener(\"resize\", this.handleResize);\n if (this.changeTimer !== null) {\n clearTimeout(this.changeTimer);\n }\n this.changeStartSubscribers.clear();\n this.changeEndSubscribers.clear();\n }\n }\n\n private handleResize(): void {\n this.handleViewportChange();\n }\n\n private handleViewportChange(): void {\n const viewportInfo = this.getViewportInfo();\n\n if (!this.isChanging) {\n this.isChanging = true;\n this.notifySubscribers(this.changeStartSubscribers, viewportInfo);\n }\n\n if (this.changeTimer !== null) {\n clearTimeout(this.changeTimer);\n }\n\n this.changeTimer = window.setTimeout(() => {\n this.isChanging = false;\n this.notifySubscribers(this.changeEndSubscribers, viewportInfo);\n }, this.changeTimeout);\n }\n\n private getViewportInfo(): ViewportInfo {\n const modes = [...this.breakpoints].reverse();\n const viewport = environment.isClient()\n ? {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollWidth: window.document.body.scrollWidth,\n scrollHeight: window.document.body.scrollHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY\n }\n : {\n // During SSR or Next.js build, viewport is not available.\n height: 0,\n width: 2000,\n scrollHeight: 0,\n scrollWidth: 2000,\n scrollX: 0,\n scrollY: 0\n };\n\n const [breakpoint] = modes.filter(mode => mode.maxWidth >= viewport.width);\n\n return { ...viewport, breakpoint: breakpoint.name, breakpoints: this.breakpoints };\n }\n\n private notifySubscribers(\n subscribers: Set<(info: ViewportInfo) => void>,\n viewportInfo: ViewportInfo\n ): void {\n subscribers.forEach(callback => {\n if (typeof callback === \"function\") {\n callback(viewportInfo);\n }\n });\n }\n}\n\nexport const viewportManager = new ViewportManager();\n"],"names":["ViewportManager","timeout","Set","environment","window","breakpoints","callback","clearTimeout","viewportInfo","modes","viewport","breakpoint","mode","subscribers","viewportManager"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { DocumentElementBindings } from "./types.js";
2
+ import type { InputAstNode } from "./ComponentManifestToAstConverter.js";
3
+ /**
4
+ * A binding whose value does not match the shape its input declares.
5
+ */
6
+ export interface BindingShapeViolation {
7
+ path: string;
8
+ /** What the input declares. */
9
+ declared: "list" | "scalar";
10
+ /** What the binding holds. */
11
+ found: "list" | "scalar";
12
+ value: unknown;
13
+ }
14
+ /**
15
+ * Checks a built element's bindings against the shapes its inputs declare.
16
+ *
17
+ * **Deliberately on the BINDINGS, not on the inputs handed to the factory.** A check on the inputs
18
+ * covers only the shapes that intermediate happens to carry, and the defect this exists for lived
19
+ * entirely downstream of it: the composition passed a correct array, and the traverser collapsed it
20
+ * to its last item while writing the bindings. An input-level check passed on all 34 occurrences
21
+ * while every one of those pages was failing to render. `stripInventedBindings` in the composition
22
+ * pipeline learned the same thing about invented destinations and says so in its own comment; this is
23
+ * that lesson paid for a second time.
24
+ *
25
+ * **READ THIS WITH the list tolerance in `BindingsResolver`, and do not remove one without the
26
+ * other.** This is the alarm: it fires where the bad write happens, so a writer that regresses is
27
+ * found rather than absorbed. The tolerance there is the recovery for documents already stored. Keep
28
+ * only the tolerance and a broken writer lives indefinitely, because nothing downstream ever looks
29
+ * wrong; keep only the alarm and every already-stored page stays broken.
30
+ */
31
+ export declare const assertBindingShapes: (bindings: DocumentElementBindings, inputAst: InputAstNode[]) => BindingShapeViolation[];
@@ -0,0 +1,64 @@
1
+ const assertBindingShapes = (bindings, inputAst)=>{
2
+ const violations = [];
3
+ const inputs = bindings?.inputs ?? {};
4
+ const check = (nodes, prefix)=>{
5
+ for (const node of nodes){
6
+ const path = [
7
+ ...prefix,
8
+ node.name
9
+ ].join("/");
10
+ if (node.children.length > 0) {
11
+ if (node.list) {
12
+ for (const index of indexesUnder(path, inputs))check(node.children, [
13
+ ...prefix,
14
+ `${node.name}/${index}`
15
+ ]);
16
+ continue;
17
+ }
18
+ check(node.children, [
19
+ ...prefix,
20
+ node.name
21
+ ]);
22
+ continue;
23
+ }
24
+ if (node.list) {
25
+ if (indexesUnder(path, inputs).length > 0) continue;
26
+ const binding = inputs[path];
27
+ if (!binding || !("static" in binding)) continue;
28
+ const value = binding.static;
29
+ if (null == value || Array.isArray(value)) continue;
30
+ violations.push({
31
+ path,
32
+ declared: "list",
33
+ found: "scalar",
34
+ value
35
+ });
36
+ continue;
37
+ }
38
+ const binding = inputs[path];
39
+ if (binding && "static" in binding && Array.isArray(binding.static)) violations.push({
40
+ path,
41
+ declared: "scalar",
42
+ found: "list",
43
+ value: binding.static
44
+ });
45
+ }
46
+ };
47
+ check(inputAst, []);
48
+ return violations;
49
+ };
50
+ const indexesUnder = (path, inputs)=>{
51
+ const seen = new Set();
52
+ const prefix = `${path}/`;
53
+ for (const key of Object.keys(inputs)){
54
+ if (!key.startsWith(prefix)) continue;
55
+ const index = Number.parseInt(key.slice(prefix.length).split("/")[0], 10);
56
+ if (Number.isInteger(index)) seen.add(index);
57
+ }
58
+ return [
59
+ ...seen
60
+ ].sort((a, b)=>a - b);
61
+ };
62
+ export { assertBindingShapes };
63
+
64
+ //# sourceMappingURL=assertBindingShapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertBindingShapes.js","sources":["../src/assertBindingShapes.ts"],"sourcesContent":["import type { DocumentElementBindings } from \"./types.js\";\nimport type { InputAstNode } from \"./ComponentManifestToAstConverter.js\";\n\n/**\n * A binding whose value does not match the shape its input declares.\n */\nexport interface BindingShapeViolation {\n path: string;\n /** What the input declares. */\n declared: \"list\" | \"scalar\";\n /** What the binding holds. */\n found: \"list\" | \"scalar\";\n value: unknown;\n}\n\n/**\n * Checks a built element's bindings against the shapes its inputs declare.\n *\n * **Deliberately on the BINDINGS, not on the inputs handed to the factory.** A check on the inputs\n * covers only the shapes that intermediate happens to carry, and the defect this exists for lived\n * entirely downstream of it: the composition passed a correct array, and the traverser collapsed it\n * to its last item while writing the bindings. An input-level check passed on all 34 occurrences\n * while every one of those pages was failing to render. `stripInventedBindings` in the composition\n * pipeline learned the same thing about invented destinations and says so in its own comment; this is\n * that lesson paid for a second time.\n *\n * **READ THIS WITH the list tolerance in `BindingsResolver`, and do not remove one without the\n * other.** This is the alarm: it fires where the bad write happens, so a writer that regresses is\n * found rather than absorbed. The tolerance there is the recovery for documents already stored. Keep\n * only the tolerance and a broken writer lives indefinitely, because nothing downstream ever looks\n * wrong; keep only the alarm and every already-stored page stays broken.\n */\nexport const assertBindingShapes = (\n bindings: DocumentElementBindings,\n inputAst: InputAstNode[]\n): BindingShapeViolation[] => {\n const violations: BindingShapeViolation[] = [];\n const inputs = bindings?.inputs ?? {};\n\n const check = (nodes: InputAstNode[], prefix: string[]): void => {\n for (const node of nodes) {\n const path = [...prefix, node.name].join(\"/\");\n\n if (node.children.length > 0) {\n // An object list is stored element-wise (`rows/0/label`), so its own path holds no\n // value to check; its children are checked under each index that exists.\n if (node.list) {\n for (const index of indexesUnder(path, inputs)) {\n check(node.children, [...prefix, `${node.name}/${index}`]);\n }\n continue;\n }\n check(node.children, [...prefix, node.name]);\n continue;\n }\n\n if (node.list) {\n /*\n * A scalar list is correct in either of two stored shapes: element-wise `name/0`,\n * `name/1`, … or a single binding holding an array. Both are what the resolver reads.\n * A single binding holding a scalar is the broken one.\n */\n if (indexesUnder(path, inputs).length > 0) {\n continue;\n }\n const binding = inputs[path];\n if (!binding || !(\"static\" in binding)) {\n continue;\n }\n const value = binding.static;\n if (value === undefined || value === null || Array.isArray(value)) {\n continue;\n }\n violations.push({ path, declared: \"list\", found: \"scalar\", value });\n continue;\n }\n\n const binding = inputs[path];\n if (binding && \"static\" in binding && Array.isArray(binding.static)) {\n violations.push({ path, declared: \"scalar\", found: \"list\", value: binding.static });\n }\n }\n };\n\n check(inputAst, []);\n return violations;\n};\n\n/** The indexes stored under a list path, from `name/0`, `name/1`, … */\nconst indexesUnder = (path: string, inputs: Record<string, unknown>): number[] => {\n const seen = new Set<number>();\n const prefix = `${path}/`;\n for (const key of Object.keys(inputs)) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n const index = Number.parseInt(key.slice(prefix.length).split(\"/\")[0], 10);\n if (Number.isInteger(index)) {\n seen.add(index);\n }\n }\n return [...seen].sort((a, b) => a - b);\n};\n"],"names":["assertBindingShapes","bindings","inputAst","violations","inputs","check","nodes","prefix","node","path","index","indexesUnder","binding","value","Array","seen","Set","key","Object","Number","a","b"],"mappings":"AAgCO,MAAMA,sBAAsB,CAC/BC,UACAC;IAEA,MAAMC,aAAsC,EAAE;IAC9C,MAAMC,SAASH,UAAU,UAAU,CAAC;IAEpC,MAAMI,QAAQ,CAACC,OAAuBC;QAClC,KAAK,MAAMC,QAAQF,MAAO;YACtB,MAAMG,OAAO;mBAAIF;gBAAQC,KAAK,IAAI;aAAC,CAAC,IAAI,CAAC;YAEzC,IAAIA,KAAK,QAAQ,CAAC,MAAM,GAAG,GAAG;gBAG1B,IAAIA,KAAK,IAAI,EAAE;oBACX,KAAK,MAAME,SAASC,aAAaF,MAAML,QACnCC,MAAMG,KAAK,QAAQ,EAAE;2BAAID;wBAAQ,GAAGC,KAAK,IAAI,CAAC,CAAC,EAAEE,OAAO;qBAAC;oBAE7D;gBACJ;gBACAL,MAAMG,KAAK,QAAQ,EAAE;uBAAID;oBAAQC,KAAK,IAAI;iBAAC;gBAC3C;YACJ;YAEA,IAAIA,KAAK,IAAI,EAAE;gBAMX,IAAIG,aAAaF,MAAML,QAAQ,MAAM,GAAG,GACpC;gBAEJ,MAAMQ,UAAUR,MAAM,CAACK,KAAK;gBAC5B,IAAI,CAACG,WAAW,CAAE,aAAYA,OAAM,GAChC;gBAEJ,MAAMC,QAAQD,QAAQ,MAAM;gBAC5B,IAAIC,QAAAA,SAAyCC,MAAM,OAAO,CAACD,QACvD;gBAEJV,WAAW,IAAI,CAAC;oBAAEM;oBAAM,UAAU;oBAAQ,OAAO;oBAAUI;gBAAM;gBACjE;YACJ;YAEA,MAAMD,UAAUR,MAAM,CAACK,KAAK;YAC5B,IAAIG,WAAW,YAAYA,WAAWE,MAAM,OAAO,CAACF,QAAQ,MAAM,GAC9DT,WAAW,IAAI,CAAC;gBAAEM;gBAAM,UAAU;gBAAU,OAAO;gBAAQ,OAAOG,QAAQ,MAAM;YAAC;QAEzF;IACJ;IAEAP,MAAMH,UAAU,EAAE;IAClB,OAAOC;AACX;AAGA,MAAMQ,eAAe,CAACF,MAAcL;IAChC,MAAMW,OAAO,IAAIC;IACjB,MAAMT,SAAS,GAAGE,KAAK,CAAC,CAAC;IACzB,KAAK,MAAMQ,OAAOC,OAAO,IAAI,CAACd,QAAS;QACnC,IAAI,CAACa,IAAI,UAAU,CAACV,SAChB;QAEJ,MAAMG,QAAQS,OAAO,QAAQ,CAACF,IAAI,KAAK,CAACV,OAAO,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;QACtE,IAAIY,OAAO,SAAS,CAACT,QACjBK,KAAK,GAAG,CAACL;IAEjB;IACA,OAAO;WAAIK;KAAK,CAAC,IAAI,CAAC,CAACK,GAAGC,IAAMD,IAAIC;AACxC"}
@@ -0,0 +1 @@
1
+ export {};