@next-buildr/editor 0.0.0-stage → 2.0.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 (471) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +4 -2
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/app/builder-editor.d.ts +8 -0
  5. package/dist/app/builder-editor.d.ts.map +1 -0
  6. package/dist/app/builder-editor.js +14 -0
  7. package/dist/app/builder-editor.test.d.ts +2 -0
  8. package/dist/app/builder-editor.test.d.ts.map +1 -0
  9. package/dist/app/builder-editor.test.js +199 -0
  10. package/dist/app/config.d.ts +59 -0
  11. package/dist/app/config.d.ts.map +1 -0
  12. package/dist/app/config.js +18 -0
  13. package/dist/app/content-language.test.d.ts +2 -0
  14. package/dist/app/content-language.test.d.ts.map +1 -0
  15. package/dist/app/content-language.test.js +157 -0
  16. package/dist/app/editor-app.d.ts +17 -0
  17. package/dist/app/editor-app.d.ts.map +1 -0
  18. package/dist/app/editor-app.js +206 -0
  19. package/dist/app/editor-app.test.d.ts +2 -0
  20. package/dist/app/editor-app.test.d.ts.map +1 -0
  21. package/dist/app/editor-app.test.js +135 -0
  22. package/dist/app/layout.d.ts +32 -0
  23. package/dist/app/layout.d.ts.map +1 -0
  24. package/dist/app/layout.js +82 -0
  25. package/dist/app/manifest.d.ts +12 -0
  26. package/dist/app/manifest.d.ts.map +1 -0
  27. package/dist/app/manifest.js +17 -0
  28. package/dist/app/shell-panels.d.ts +15 -0
  29. package/dist/app/shell-panels.d.ts.map +1 -0
  30. package/dist/app/shell-panels.js +5 -0
  31. package/dist/app/small-screen.d.ts +12 -0
  32. package/dist/app/small-screen.d.ts.map +1 -0
  33. package/dist/app/small-screen.js +33 -0
  34. package/dist/app/small-screen.test.d.ts +2 -0
  35. package/dist/app/small-screen.test.d.ts.map +1 -0
  36. package/dist/app/small-screen.test.js +108 -0
  37. package/dist/app/status-info.d.ts +14 -0
  38. package/dist/app/status-info.d.ts.map +1 -0
  39. package/dist/app/status-info.js +34 -0
  40. package/dist/app/use-resizable.d.ts +34 -0
  41. package/dist/app/use-resizable.d.ts.map +1 -0
  42. package/dist/app/use-resizable.js +84 -0
  43. package/dist/canvas-host/canvas-frame.d.ts +53 -0
  44. package/dist/canvas-host/canvas-frame.d.ts.map +1 -0
  45. package/dist/canvas-host/canvas-frame.js +146 -0
  46. package/dist/canvas-host/canvas-frame.test.d.ts +2 -0
  47. package/dist/canvas-host/canvas-frame.test.d.ts.map +1 -0
  48. package/dist/canvas-host/canvas-frame.test.js +91 -0
  49. package/dist/canvas-host/host.d.ts +109 -0
  50. package/dist/canvas-host/host.d.ts.map +1 -0
  51. package/dist/canvas-host/host.js +293 -0
  52. package/dist/canvas-host/host.test.d.ts +2 -0
  53. package/dist/canvas-host/host.test.d.ts.map +1 -0
  54. package/dist/canvas-host/host.test.js +398 -0
  55. package/dist/canvas-host/index.d.ts +5 -0
  56. package/dist/canvas-host/index.d.ts.map +1 -0
  57. package/dist/canvas-host/index.js +2 -0
  58. package/dist/clipboard/clipboard.d.ts +38 -0
  59. package/dist/clipboard/clipboard.d.ts.map +1 -0
  60. package/dist/clipboard/clipboard.js +160 -0
  61. package/dist/clipboard/clipboard.test.d.ts +2 -0
  62. package/dist/clipboard/clipboard.test.d.ts.map +1 -0
  63. package/dist/clipboard/clipboard.test.js +457 -0
  64. package/dist/clipboard/format.d.ts +27 -0
  65. package/dist/clipboard/format.d.ts.map +1 -0
  66. package/dist/clipboard/format.js +37 -0
  67. package/dist/clipboard/index.d.ts +6 -0
  68. package/dist/clipboard/index.d.ts.map +1 -0
  69. package/dist/clipboard/index.js +3 -0
  70. package/dist/clipboard/react.d.ts +20 -0
  71. package/dist/clipboard/react.d.ts.map +1 -0
  72. package/dist/clipboard/react.js +71 -0
  73. package/dist/dialogs/index.d.ts +2 -0
  74. package/dist/dialogs/index.d.ts.map +1 -0
  75. package/dist/dialogs/index.js +1 -0
  76. package/dist/dialogs/media-picker/index.d.ts +7 -0
  77. package/dist/dialogs/media-picker/index.d.ts.map +1 -0
  78. package/dist/dialogs/media-picker/index.js +3 -0
  79. package/dist/dialogs/media-picker/library.d.ts +17 -0
  80. package/dist/dialogs/media-picker/library.d.ts.map +1 -0
  81. package/dist/dialogs/media-picker/library.js +9 -0
  82. package/dist/dialogs/media-picker/media-picker.d.ts +18 -0
  83. package/dist/dialogs/media-picker/media-picker.d.ts.map +1 -0
  84. package/dist/dialogs/media-picker/media-picker.js +99 -0
  85. package/dist/dialogs/media-picker/media-picker.test.d.ts +2 -0
  86. package/dist/dialogs/media-picker/media-picker.test.d.ts.map +1 -0
  87. package/dist/dialogs/media-picker/media-picker.test.js +161 -0
  88. package/dist/dialogs/media-picker/media-ref.d.ts +28 -0
  89. package/dist/dialogs/media-picker/media-ref.d.ts.map +1 -0
  90. package/dist/dialogs/media-picker/media-ref.js +52 -0
  91. package/dist/dnd/check.d.ts +8 -0
  92. package/dist/dnd/check.d.ts.map +1 -0
  93. package/dist/dnd/check.js +12 -0
  94. package/dist/dnd/destinations.d.ts +15 -0
  95. package/dist/dnd/destinations.d.ts.map +1 -0
  96. package/dist/dnd/destinations.js +43 -0
  97. package/dist/dnd/dnd-react.test.d.ts +2 -0
  98. package/dist/dnd/dnd-react.test.d.ts.map +1 -0
  99. package/dist/dnd/dnd-react.test.js +93 -0
  100. package/dist/dnd/dnd.test.d.ts +2 -0
  101. package/dist/dnd/dnd.test.d.ts.map +1 -0
  102. package/dist/dnd/dnd.test.js +327 -0
  103. package/dist/dnd/engine.d.ts +85 -0
  104. package/dist/dnd/engine.d.ts.map +1 -0
  105. package/dist/dnd/engine.js +185 -0
  106. package/dist/dnd/fragment.d.ts +6 -0
  107. package/dist/dnd/fragment.d.ts.map +1 -0
  108. package/dist/dnd/fragment.js +18 -0
  109. package/dist/dnd/geometry.d.ts +30 -0
  110. package/dist/dnd/geometry.d.ts.map +1 -0
  111. package/dist/dnd/geometry.js +31 -0
  112. package/dist/dnd/index.d.ts +14 -0
  113. package/dist/dnd/index.d.ts.map +1 -0
  114. package/dist/dnd/index.js +7 -0
  115. package/dist/dnd/move-to-dialog.d.ts +13 -0
  116. package/dist/dnd/move-to-dialog.d.ts.map +1 -0
  117. package/dist/dnd/move-to-dialog.js +30 -0
  118. package/dist/dnd/react.d.ts +43 -0
  119. package/dist/dnd/react.d.ts.map +1 -0
  120. package/dist/dnd/react.js +185 -0
  121. package/dist/dnd/tree-target.d.ts +29 -0
  122. package/dist/dnd/tree-target.d.ts.map +1 -0
  123. package/dist/dnd/tree-target.js +97 -0
  124. package/dist/fonts/LICENSE-inter.txt +93 -0
  125. package/dist/fonts/inter-latin-400-normal.woff2 +0 -0
  126. package/dist/fonts/inter-latin-500-normal.woff2 +0 -0
  127. package/dist/fonts/inter-latin-600-normal.woff2 +0 -0
  128. package/dist/fonts/inter-latin-ext-400-normal.woff2 +0 -0
  129. package/dist/fonts/inter-latin-ext-500-normal.woff2 +0 -0
  130. package/dist/fonts/inter-latin-ext-600-normal.woff2 +0 -0
  131. package/dist/index.d.ts +22 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +21 -0
  134. package/dist/messages/en.d.ts +335 -0
  135. package/dist/messages/en.d.ts.map +1 -0
  136. package/dist/messages/en.js +332 -0
  137. package/dist/messages/index.d.ts +16 -0
  138. package/dist/messages/index.d.ts.map +1 -0
  139. package/dist/messages/index.js +22 -0
  140. package/dist/messages/pl.d.ts +3 -0
  141. package/dist/messages/pl.d.ts.map +1 -0
  142. package/dist/messages/pl.js +327 -0
  143. package/dist/panels/breadcrumbs/breadcrumbs.d.ts +6 -0
  144. package/dist/panels/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  145. package/dist/panels/breadcrumbs/breadcrumbs.js +24 -0
  146. package/dist/panels/breadcrumbs/breadcrumbs.test.d.ts +2 -0
  147. package/dist/panels/breadcrumbs/breadcrumbs.test.d.ts.map +1 -0
  148. package/dist/panels/breadcrumbs/breadcrumbs.test.js +56 -0
  149. package/dist/panels/index.d.ts +9 -0
  150. package/dist/panels/index.d.ts.map +1 -0
  151. package/dist/panels/index.js +6 -0
  152. package/dist/panels/insert/catalog.d.ts +30 -0
  153. package/dist/panels/insert/catalog.d.ts.map +1 -0
  154. package/dist/panels/insert/catalog.js +76 -0
  155. package/dist/panels/insert/catalog.order.test.d.ts +2 -0
  156. package/dist/panels/insert/catalog.order.test.d.ts.map +1 -0
  157. package/dist/panels/insert/catalog.order.test.js +17 -0
  158. package/dist/panels/insert/category-name.d.ts +4 -0
  159. package/dist/panels/insert/category-name.d.ts.map +1 -0
  160. package/dist/panels/insert/category-name.js +8 -0
  161. package/dist/panels/insert/index.d.ts +3 -0
  162. package/dist/panels/insert/index.d.ts.map +1 -0
  163. package/dist/panels/insert/index.js +2 -0
  164. package/dist/panels/insert/insert-panel.d.ts +7 -0
  165. package/dist/panels/insert/insert-panel.d.ts.map +1 -0
  166. package/dist/panels/insert/insert-panel.js +155 -0
  167. package/dist/panels/insert/insert-panel.test.d.ts +2 -0
  168. package/dist/panels/insert/insert-panel.test.d.ts.map +1 -0
  169. package/dist/panels/insert/insert-panel.test.js +323 -0
  170. package/dist/panels/insert/target.d.ts +17 -0
  171. package/dist/panels/insert/target.d.ts.map +1 -0
  172. package/dist/panels/insert/target.js +48 -0
  173. package/dist/panels/inspector/controls/boolean.d.ts +4 -0
  174. package/dist/panels/inspector/controls/boolean.d.ts.map +1 -0
  175. package/dist/panels/inspector/controls/boolean.js +4 -0
  176. package/dist/panels/inspector/controls/compound.d.ts +15 -0
  177. package/dist/panels/inspector/controls/compound.d.ts.map +1 -0
  178. package/dist/panels/inspector/controls/compound.js +99 -0
  179. package/dist/panels/inspector/controls/compound.test.d.ts +2 -0
  180. package/dist/panels/inspector/controls/compound.test.d.ts.map +1 -0
  181. package/dist/panels/inspector/controls/compound.test.js +195 -0
  182. package/dist/panels/inspector/controls/icon.d.ts +5 -0
  183. package/dist/panels/inspector/controls/icon.d.ts.map +1 -0
  184. package/dist/panels/inspector/controls/icon.js +6 -0
  185. package/dist/panels/inspector/controls/index.d.ts +13 -0
  186. package/dist/panels/inspector/controls/index.d.ts.map +1 -0
  187. package/dist/panels/inspector/controls/index.js +11 -0
  188. package/dist/panels/inspector/controls/label.d.ts +4 -0
  189. package/dist/panels/inspector/controls/label.d.ts.map +1 -0
  190. package/dist/panels/inspector/controls/label.js +8 -0
  191. package/dist/panels/inspector/controls/link.d.ts +5 -0
  192. package/dist/panels/inspector/controls/link.d.ts.map +1 -0
  193. package/dist/panels/inspector/controls/link.js +6 -0
  194. package/dist/panels/inspector/controls/media.d.ts +9 -0
  195. package/dist/panels/inspector/controls/media.d.ts.map +1 -0
  196. package/dist/panels/inspector/controls/media.js +21 -0
  197. package/dist/panels/inspector/controls/number.d.ts +10 -0
  198. package/dist/panels/inspector/controls/number.d.ts.map +1 -0
  199. package/dist/panels/inspector/controls/number.js +33 -0
  200. package/dist/panels/inspector/controls/rich-text-model.d.ts +20 -0
  201. package/dist/panels/inspector/controls/rich-text-model.d.ts.map +1 -0
  202. package/dist/panels/inspector/controls/rich-text-model.js +91 -0
  203. package/dist/panels/inspector/controls/rich-text.d.ts +10 -0
  204. package/dist/panels/inspector/controls/rich-text.d.ts.map +1 -0
  205. package/dist/panels/inspector/controls/rich-text.js +159 -0
  206. package/dist/panels/inspector/controls/select.d.ts +5 -0
  207. package/dist/panels/inspector/controls/select.d.ts.map +1 -0
  208. package/dist/panels/inspector/controls/select.js +16 -0
  209. package/dist/panels/inspector/controls/select.test.d.ts +2 -0
  210. package/dist/panels/inspector/controls/select.test.d.ts.map +1 -0
  211. package/dist/panels/inspector/controls/select.test.js +43 -0
  212. package/dist/panels/inspector/controls/text.d.ts +4 -0
  213. package/dist/panels/inspector/controls/text.d.ts.map +1 -0
  214. package/dist/panels/inspector/controls/text.js +5 -0
  215. package/dist/panels/inspector/controls/textarea.d.ts +4 -0
  216. package/dist/panels/inspector/controls/textarea.d.ts.map +1 -0
  217. package/dist/panels/inspector/controls/textarea.js +4 -0
  218. package/dist/panels/inspector/controls/types.d.ts +16 -0
  219. package/dist/panels/inspector/controls/types.d.ts.map +1 -0
  220. package/dist/panels/inspector/controls/types.js +1 -0
  221. package/dist/panels/inspector/index.d.ts +17 -0
  222. package/dist/panels/inspector/index.d.ts.map +1 -0
  223. package/dist/panels/inspector/index.js +9 -0
  224. package/dist/panels/inspector/inspector.d.ts +16 -0
  225. package/dist/panels/inspector/inspector.d.ts.map +1 -0
  226. package/dist/panels/inspector/inspector.js +116 -0
  227. package/dist/panels/inspector/inspector.test.d.ts +2 -0
  228. package/dist/panels/inspector/inspector.test.d.ts.map +1 -0
  229. package/dist/panels/inspector/inspector.test.js +328 -0
  230. package/dist/panels/inspector/props-panel.d.ts +26 -0
  231. package/dist/panels/inspector/props-panel.d.ts.map +1 -0
  232. package/dist/panels/inspector/props-panel.js +117 -0
  233. package/dist/panels/inspector/styles/box-model.d.ts +20 -0
  234. package/dist/panels/inspector/styles/box-model.d.ts.map +1 -0
  235. package/dist/panels/inspector/styles/box-model.js +31 -0
  236. package/dist/panels/inspector/styles/index.d.ts +5 -0
  237. package/dist/panels/inspector/styles/index.d.ts.map +1 -0
  238. package/dist/panels/inspector/styles/index.js +2 -0
  239. package/dist/panels/inspector/styles/model.d.ts +55 -0
  240. package/dist/panels/inspector/styles/model.d.ts.map +1 -0
  241. package/dist/panels/inspector/styles/model.js +111 -0
  242. package/dist/panels/inspector/styles/segments.d.ts +18 -0
  243. package/dist/panels/inspector/styles/segments.d.ts.map +1 -0
  244. package/dist/panels/inspector/styles/segments.js +75 -0
  245. package/dist/panels/inspector/styles/sides-editor.d.ts +34 -0
  246. package/dist/panels/inspector/styles/sides-editor.d.ts.map +1 -0
  247. package/dist/panels/inspector/styles/sides-editor.js +86 -0
  248. package/dist/panels/inspector/styles/style-inspector.d.ts +15 -0
  249. package/dist/panels/inspector/styles/style-inspector.d.ts.map +1 -0
  250. package/dist/panels/inspector/styles/style-inspector.js +219 -0
  251. package/dist/panels/inspector/styles/style-inspector.test.d.ts +2 -0
  252. package/dist/panels/inspector/styles/style-inspector.test.d.ts.map +1 -0
  253. package/dist/panels/inspector/styles/style-inspector.test.js +265 -0
  254. package/dist/panels/inspector/styles/token-picker.d.ts +15 -0
  255. package/dist/panels/inspector/styles/token-picker.d.ts.map +1 -0
  256. package/dist/panels/inspector/styles/token-picker.js +23 -0
  257. package/dist/panels/inspector/styles/use-style-value.d.ts +28 -0
  258. package/dist/panels/inspector/styles/use-style-value.d.ts.map +1 -0
  259. package/dist/panels/inspector/styles/use-style-value.js +51 -0
  260. package/dist/panels/inspector/value.d.ts +20 -0
  261. package/dist/panels/inspector/value.d.ts.map +1 -0
  262. package/dist/panels/inspector/value.js +32 -0
  263. package/dist/panels/inspector/values/analyze.d.ts +49 -0
  264. package/dist/panels/inspector/values/analyze.d.ts.map +1 -0
  265. package/dist/panels/inspector/values/analyze.js +115 -0
  266. package/dist/panels/inspector/values/data.d.ts +18 -0
  267. package/dist/panels/inspector/values/data.d.ts.map +1 -0
  268. package/dist/panels/inspector/values/data.js +10 -0
  269. package/dist/panels/inspector/values/translation.d.ts +20 -0
  270. package/dist/panels/inspector/values/translation.d.ts.map +1 -0
  271. package/dist/panels/inspector/values/translation.js +25 -0
  272. package/dist/panels/inspector/values/value-editor.d.ts +30 -0
  273. package/dist/panels/inspector/values/value-editor.d.ts.map +1 -0
  274. package/dist/panels/inspector/values/value-editor.js +191 -0
  275. package/dist/panels/inspector/values/values.test.d.ts +2 -0
  276. package/dist/panels/inspector/values/values.test.d.ts.map +1 -0
  277. package/dist/panels/inspector/values/values.test.js +173 -0
  278. package/dist/panels/issues/collect.d.ts +70 -0
  279. package/dist/panels/issues/collect.d.ts.map +1 -0
  280. package/dist/panels/issues/collect.js +96 -0
  281. package/dist/panels/issues/index.d.ts +5 -0
  282. package/dist/panels/issues/index.d.ts.map +1 -0
  283. package/dist/panels/issues/index.js +2 -0
  284. package/dist/panels/issues/issues-panel.d.ts +17 -0
  285. package/dist/panels/issues/issues-panel.d.ts.map +1 -0
  286. package/dist/panels/issues/issues-panel.js +77 -0
  287. package/dist/panels/layers/flatten.d.ts +28 -0
  288. package/dist/panels/layers/flatten.d.ts.map +1 -0
  289. package/dist/panels/layers/flatten.js +61 -0
  290. package/dist/panels/layers/layers-panel.d.ts +14 -0
  291. package/dist/panels/layers/layers-panel.d.ts.map +1 -0
  292. package/dist/panels/layers/layers-panel.js +428 -0
  293. package/dist/panels/layers/layers-panel.test.d.ts +2 -0
  294. package/dist/panels/layers/layers-panel.test.d.ts.map +1 -0
  295. package/dist/panels/layers/layers-panel.test.js +315 -0
  296. package/dist/persistence/controller.d.ts +55 -0
  297. package/dist/persistence/controller.d.ts.map +1 -0
  298. package/dist/persistence/controller.js +341 -0
  299. package/dist/persistence/index.d.ts +6 -0
  300. package/dist/persistence/index.d.ts.map +1 -0
  301. package/dist/persistence/index.js +3 -0
  302. package/dist/persistence/load.d.ts +35 -0
  303. package/dist/persistence/load.d.ts.map +1 -0
  304. package/dist/persistence/load.js +67 -0
  305. package/dist/persistence/persistence.test.d.ts +2 -0
  306. package/dist/persistence/persistence.test.d.ts.map +1 -0
  307. package/dist/persistence/persistence.test.js +483 -0
  308. package/dist/persistence/react.d.ts +18 -0
  309. package/dist/persistence/react.d.ts.map +1 -0
  310. package/dist/persistence/react.js +105 -0
  311. package/dist/persistence/types.d.ts +182 -0
  312. package/dist/persistence/types.d.ts.map +1 -0
  313. package/dist/persistence/types.js +1 -0
  314. package/dist/preview/index.d.ts +3 -0
  315. package/dist/preview/index.d.ts.map +1 -0
  316. package/dist/preview/index.js +2 -0
  317. package/dist/preview/prepare.d.ts +16 -0
  318. package/dist/preview/prepare.d.ts.map +1 -0
  319. package/dist/preview/prepare.js +21 -0
  320. package/dist/preview/preview.d.ts +27 -0
  321. package/dist/preview/preview.d.ts.map +1 -0
  322. package/dist/preview/preview.js +51 -0
  323. package/dist/preview/preview.test.d.ts +2 -0
  324. package/dist/preview/preview.test.d.ts.map +1 -0
  325. package/dist/preview/preview.test.js +129 -0
  326. package/dist/shortcuts/actions.d.ts +17 -0
  327. package/dist/shortcuts/actions.d.ts.map +1 -0
  328. package/dist/shortcuts/actions.js +85 -0
  329. package/dist/shortcuts/index.d.ts +11 -0
  330. package/dist/shortcuts/index.d.ts.map +1 -0
  331. package/dist/shortcuts/index.js +5 -0
  332. package/dist/shortcuts/keys.d.ts +29 -0
  333. package/dist/shortcuts/keys.d.ts.map +1 -0
  334. package/dist/shortcuts/keys.js +100 -0
  335. package/dist/shortcuts/map.d.ts +17 -0
  336. package/dist/shortcuts/map.d.ts.map +1 -0
  337. package/dist/shortcuts/map.js +31 -0
  338. package/dist/shortcuts/registry.d.ts +32 -0
  339. package/dist/shortcuts/registry.d.ts.map +1 -0
  340. package/dist/shortcuts/registry.js +53 -0
  341. package/dist/shortcuts/shortcuts.d.ts +32 -0
  342. package/dist/shortcuts/shortcuts.d.ts.map +1 -0
  343. package/dist/shortcuts/shortcuts.js +95 -0
  344. package/dist/shortcuts/shortcuts.test.d.ts +2 -0
  345. package/dist/shortcuts/shortcuts.test.d.ts.map +1 -0
  346. package/dist/shortcuts/shortcuts.test.js +263 -0
  347. package/dist/store/create-store.d.ts +13 -0
  348. package/dist/store/create-store.d.ts.map +1 -0
  349. package/dist/store/create-store.js +248 -0
  350. package/dist/store/index.d.ts +9 -0
  351. package/dist/store/index.d.ts.map +1 -0
  352. package/dist/store/index.js +5 -0
  353. package/dist/store/locale.d.ts +23 -0
  354. package/dist/store/locale.d.ts.map +1 -0
  355. package/dist/store/locale.js +31 -0
  356. package/dist/store/react.d.ts +17 -0
  357. package/dist/store/react.d.ts.map +1 -0
  358. package/dist/store/react.js +32 -0
  359. package/dist/store/selection.d.ts +32 -0
  360. package/dist/store/selection.d.ts.map +1 -0
  361. package/dist/store/selection.js +84 -0
  362. package/dist/store/selection.test.d.ts +2 -0
  363. package/dist/store/selection.test.d.ts.map +1 -0
  364. package/dist/store/selection.test.js +95 -0
  365. package/dist/store/selectors.d.ts +18 -0
  366. package/dist/store/selectors.d.ts.map +1 -0
  367. package/dist/store/selectors.js +39 -0
  368. package/dist/store/store.test.d.ts +2 -0
  369. package/dist/store/store.test.d.ts.map +1 -0
  370. package/dist/store/store.test.js +331 -0
  371. package/dist/store/types.d.ts +114 -0
  372. package/dist/store/types.d.ts.map +1 -0
  373. package/dist/store/types.js +1 -0
  374. package/dist/styles/tokens.test.d.ts +2 -0
  375. package/dist/styles/tokens.test.d.ts.map +1 -0
  376. package/dist/styles/tokens.test.js +199 -0
  377. package/dist/styles.css +2885 -0
  378. package/dist/toolbar/brand.d.ts +7 -0
  379. package/dist/toolbar/brand.d.ts.map +1 -0
  380. package/dist/toolbar/brand.js +11 -0
  381. package/dist/toolbar/breakpoint-control.d.ts +9 -0
  382. package/dist/toolbar/breakpoint-control.d.ts.map +1 -0
  383. package/dist/toolbar/breakpoint-control.js +23 -0
  384. package/dist/toolbar/editable-title.d.ts +14 -0
  385. package/dist/toolbar/editable-title.d.ts.map +1 -0
  386. package/dist/toolbar/editable-title.js +46 -0
  387. package/dist/toolbar/editable-title.test.d.ts +2 -0
  388. package/dist/toolbar/editable-title.test.d.ts.map +1 -0
  389. package/dist/toolbar/editable-title.test.js +53 -0
  390. package/dist/toolbar/index.d.ts +12 -0
  391. package/dist/toolbar/index.d.ts.map +1 -0
  392. package/dist/toolbar/index.js +5 -0
  393. package/dist/toolbar/locale-switcher.d.ts +10 -0
  394. package/dist/toolbar/locale-switcher.d.ts.map +1 -0
  395. package/dist/toolbar/locale-switcher.js +20 -0
  396. package/dist/toolbar/more-menu.d.ts +12 -0
  397. package/dist/toolbar/more-menu.d.ts.map +1 -0
  398. package/dist/toolbar/more-menu.js +47 -0
  399. package/dist/toolbar/panel-toggles.d.ts +9 -0
  400. package/dist/toolbar/panel-toggles.d.ts.map +1 -0
  401. package/dist/toolbar/panel-toggles.js +19 -0
  402. package/dist/toolbar/publish-dialog.d.ts +18 -0
  403. package/dist/toolbar/publish-dialog.d.ts.map +1 -0
  404. package/dist/toolbar/publish-dialog.js +49 -0
  405. package/dist/toolbar/publish.test.d.ts +2 -0
  406. package/dist/toolbar/publish.test.d.ts.map +1 -0
  407. package/dist/toolbar/publish.test.js +258 -0
  408. package/dist/toolbar/sample-picker.d.ts +18 -0
  409. package/dist/toolbar/sample-picker.d.ts.map +1 -0
  410. package/dist/toolbar/sample-picker.js +72 -0
  411. package/dist/toolbar/sample-picker.test.d.ts +2 -0
  412. package/dist/toolbar/sample-picker.test.d.ts.map +1 -0
  413. package/dist/toolbar/sample-picker.test.js +78 -0
  414. package/dist/toolbar/save-indicator.d.ts +8 -0
  415. package/dist/toolbar/save-indicator.d.ts.map +1 -0
  416. package/dist/toolbar/save-indicator.js +30 -0
  417. package/dist/toolbar/theme.d.ts +22 -0
  418. package/dist/toolbar/theme.d.ts.map +1 -0
  419. package/dist/toolbar/theme.js +46 -0
  420. package/dist/toolbar/theme.test.d.ts +2 -0
  421. package/dist/toolbar/theme.test.d.ts.map +1 -0
  422. package/dist/toolbar/theme.test.js +49 -0
  423. package/dist/toolbar/toolbar-centre.d.ts +13 -0
  424. package/dist/toolbar/toolbar-centre.d.ts.map +1 -0
  425. package/dist/toolbar/toolbar-centre.js +7 -0
  426. package/dist/toolbar/toolbar-left.d.ts +12 -0
  427. package/dist/toolbar/toolbar-left.d.ts.map +1 -0
  428. package/dist/toolbar/toolbar-left.js +16 -0
  429. package/dist/toolbar/toolbar-right.d.ts +19 -0
  430. package/dist/toolbar/toolbar-right.d.ts.map +1 -0
  431. package/dist/toolbar/toolbar-right.js +21 -0
  432. package/dist/toolbar/toolbar.d.ts +38 -0
  433. package/dist/toolbar/toolbar.d.ts.map +1 -0
  434. package/dist/toolbar/toolbar.js +27 -0
  435. package/dist/toolbar/toolbar.test.d.ts +2 -0
  436. package/dist/toolbar/toolbar.test.d.ts.map +1 -0
  437. package/dist/toolbar/toolbar.test.js +289 -0
  438. package/dist/toolbar/use-overflow-level.d.ts +9 -0
  439. package/dist/toolbar/use-overflow-level.d.ts.map +1 -0
  440. package/dist/toolbar/use-overflow-level.js +40 -0
  441. package/dist/toolbar/zoom-menu.d.ts +10 -0
  442. package/dist/toolbar/zoom-menu.d.ts.map +1 -0
  443. package/dist/toolbar/zoom-menu.js +17 -0
  444. package/dist/ui/icon.d.ts +102 -0
  445. package/dist/ui/icon.d.ts.map +1 -0
  446. package/dist/ui/icon.js +182 -0
  447. package/dist/ui/icon.test.d.ts +2 -0
  448. package/dist/ui/icon.test.d.ts.map +1 -0
  449. package/dist/ui/icon.test.js +115 -0
  450. package/dist/ui/index.d.ts +11 -0
  451. package/dist/ui/index.d.ts.map +1 -0
  452. package/dist/ui/index.js +5 -0
  453. package/dist/ui/panel.d.ts +18 -0
  454. package/dist/ui/panel.d.ts.map +1 -0
  455. package/dist/ui/panel.js +21 -0
  456. package/dist/ui/portal.d.ts +14 -0
  457. package/dist/ui/portal.d.ts.map +1 -0
  458. package/dist/ui/portal.js +14 -0
  459. package/dist/ui/primitives.d.ts +190 -0
  460. package/dist/ui/primitives.d.ts.map +1 -0
  461. package/dist/ui/primitives.js +164 -0
  462. package/dist/ui/primitives.test.d.ts +2 -0
  463. package/dist/ui/primitives.test.d.ts.map +1 -0
  464. package/dist/ui/primitives.test.js +215 -0
  465. package/dist/ui/toast.d.ts +39 -0
  466. package/dist/ui/toast.d.ts.map +1 -0
  467. package/dist/ui/toast.js +76 -0
  468. package/dist/ui/toast.test.d.ts +2 -0
  469. package/dist/ui/toast.test.d.ts.map +1 -0
  470. package/dist/ui/toast.test.js +95 -0
  471. package/package.json +67 -3
@@ -0,0 +1,398 @@
1
+ import { createRegistryMeta, createSeededIdGenerator, p, s, } from '@next-buildr/core';
2
+ import { createChildTransport, createParentTransport, } from '@next-buildr/core/protocol';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ import { DEFAULT_BREAKPOINTS } from '../app/config.js';
5
+ import { createEditorStore } from '../store/index.js';
6
+ import { createCanvasHost } from './host.js';
7
+ const SESSION = 'abcDEF0123456789_-xyz';
8
+ const EDITOR = 'https://editor.example.com';
9
+ const CANVAS = 'https://canvas.example.com';
10
+ const HASH = 'manifest-hash';
11
+ const mods = { shift: false, alt: false, ctrl: false, meta: false };
12
+ /** A window with an origin: posting to it delivers to its own listeners, from the peer. */
13
+ class FakeWindow {
14
+ origin;
15
+ listeners = new Set();
16
+ peer;
17
+ handle = {
18
+ postMessage: (message, targetOrigin) => {
19
+ if (targetOrigin !== this.origin || this.peer === undefined)
20
+ return;
21
+ const event = {
22
+ data: structuredClone(message),
23
+ origin: this.peer.origin,
24
+ source: this.peer.handle,
25
+ };
26
+ for (const listener of [...this.listeners])
27
+ listener(event);
28
+ },
29
+ };
30
+ constructor(origin) {
31
+ this.origin = origin;
32
+ }
33
+ addEventListener(_type, listener) {
34
+ this.listeners.add(listener);
35
+ }
36
+ removeEventListener(_type, listener) {
37
+ this.listeners.delete(listener);
38
+ }
39
+ }
40
+ const node = (id, type, extra = {}) => ({
41
+ id,
42
+ type,
43
+ ...extra,
44
+ });
45
+ const fixture = () => ({
46
+ schemaVersion: 1,
47
+ root: 'root',
48
+ nodes: {
49
+ root: node('root', 'buildr/page', { slots: { default: ['boxNode001'] } }),
50
+ boxNode001: node('boxNode001', 'buildr/box', {
51
+ slots: { default: ['textNodeA1', 'textNodeB1'] },
52
+ }),
53
+ textNodeA1: node('textNodeA1', 'buildr/text', { props: { text: s('A') } }),
54
+ textNodeB1: node('textNodeB1', 'buildr/text', { props: { text: s('B') } }),
55
+ },
56
+ components: {},
57
+ });
58
+ const meta = (type, overrides = {}) => ({
59
+ type,
60
+ version: 1,
61
+ label: type,
62
+ category: 'content',
63
+ props: {},
64
+ contentCategories: ['flow'],
65
+ styles: { groups: [] },
66
+ runtime: 'shared',
67
+ ...overrides,
68
+ });
69
+ const registry = createRegistryMeta({
70
+ components: [
71
+ meta('buildr/page', { capabilities: { root: true }, slots: { default: {} } }),
72
+ meta('buildr/box', { slots: { default: {} } }),
73
+ meta('buildr/text', { props: { text: p.text({ default: '' }) } }),
74
+ ],
75
+ });
76
+ const locales = { locales: ['en', 'pl'], default: 'en', fallback: true, intl: {} };
77
+ /** Frames that run when the test says so. */
78
+ function manualFrames() {
79
+ const callbacks = [];
80
+ const frames = {
81
+ request: (cb) => callbacks.push(cb),
82
+ cancel: () => { },
83
+ };
84
+ return {
85
+ frames,
86
+ pending: () => callbacks.length,
87
+ run() {
88
+ for (const cb of callbacks.splice(0))
89
+ cb();
90
+ },
91
+ };
92
+ }
93
+ function manualTimers() {
94
+ const tasks = new Map();
95
+ let next = 1;
96
+ return {
97
+ timers: {
98
+ setTimeout: (cb) => {
99
+ tasks.set(next, cb);
100
+ return next++;
101
+ },
102
+ clearTimeout: (handle) => void tasks.delete(handle),
103
+ },
104
+ fire: () => {
105
+ for (const [id, cb] of [...tasks]) {
106
+ tasks.delete(id);
107
+ cb();
108
+ }
109
+ },
110
+ };
111
+ }
112
+ function setup(overrides = {}, canvasHash = HASH) {
113
+ const editorWindow = new FakeWindow(EDITOR);
114
+ const canvasWindow = new FakeWindow(CANVAS);
115
+ editorWindow.peer = canvasWindow;
116
+ canvasWindow.peer = editorWindow;
117
+ const store = createEditorStore({
118
+ doc: fixture(),
119
+ registry,
120
+ generateId: createSeededIdGenerator(5),
121
+ validationDelayMs: null,
122
+ });
123
+ const frames = manualFrames();
124
+ const clock = manualTimers();
125
+ const rejections = [];
126
+ let host;
127
+ const transport = createParentTransport({
128
+ iframe: { contentWindow: canvasWindow.handle },
129
+ canvasOrigin: CANVAS,
130
+ session: SESSION,
131
+ host: editorWindow,
132
+ onReject: (r) => {
133
+ rejections.push(r);
134
+ host?.handleReject(r);
135
+ },
136
+ });
137
+ host = createCanvasHost({
138
+ store,
139
+ transport,
140
+ manifestHash: HASH,
141
+ locales,
142
+ breakpoints: DEFAULT_BREAKPOINTS,
143
+ frames: frames.frames,
144
+ timers: clock.timers,
145
+ ...overrides,
146
+ });
147
+ const received = [];
148
+ const connect = (hash = canvasHash) => {
149
+ const child = createChildTransport({
150
+ allowedOrigins: [EDITOR],
151
+ session: SESSION,
152
+ host: canvasWindow,
153
+ parent: editorWindow.handle,
154
+ });
155
+ for (const type of [
156
+ 'editor:init',
157
+ 'doc:patch',
158
+ 'doc:set',
159
+ 'selection:set',
160
+ 'hover:set',
161
+ 'viewport:set',
162
+ 'locale:set',
163
+ 'mode:set',
164
+ ]) {
165
+ child.on(type, (payload) => received.push({ type, payload }));
166
+ }
167
+ child.send('canvas:hello', { protocol: 1, rendererVersion: '1.0.0', manifestHash: hash });
168
+ return child;
169
+ };
170
+ return { store, host, connect, frames, clock, received, rejections, editorWindow, canvasWindow };
171
+ }
172
+ const types = (received) => received.map((m) => m.type);
173
+ const click = (id, extra = {}) => ({
174
+ id,
175
+ modifiers: { ...mods, ...extra },
176
+ });
177
+ describe('the handshake', () => {
178
+ it('answers a hello with the store as it is, and is ready when the canvas says so', () => {
179
+ const { store, host, connect, received } = setup();
180
+ store.select('textNodeA1');
181
+ expect(host.state.getState().status).toBe('connecting');
182
+ const child = connect();
183
+ expect(host.state.getState().status).toBe('initializing');
184
+ const [init] = received;
185
+ expect(init?.type).toBe('editor:init');
186
+ expect(init?.payload).toMatchObject({
187
+ docVersion: 0,
188
+ selection: ['textNodeA1'],
189
+ viewport: { breakpoint: 'desktop', width: 1280 },
190
+ locale: 'en',
191
+ mode: 'edit',
192
+ });
193
+ child.send('canvas:ready', {});
194
+ expect(host.state.getState().status).toBe('ready');
195
+ host.destroy();
196
+ });
197
+ it('shows an error for a canvas of other components, and recovers with a right one', () => {
198
+ const { host, connect } = setup({}, 'other-hash');
199
+ const wrong = connect();
200
+ expect(host.state.getState().status).toBe('error');
201
+ expect(host.state.getState().error).toMatchObject({ kind: 'manifest' });
202
+ wrong.close();
203
+ connect(HASH);
204
+ expect(host.state.getState().status).toBe('initializing');
205
+ expect(host.state.getState().error).toBeUndefined();
206
+ host.destroy();
207
+ });
208
+ it('shows a timeout when no canvas answers', () => {
209
+ const { host, clock } = setup();
210
+ clock.fire();
211
+ expect(host.state.getState().error?.kind).toBe('timeout');
212
+ host.destroy();
213
+ });
214
+ it('names a canvas of another protocol version', () => {
215
+ const { host, editorWindow, canvasWindow } = setup();
216
+ for (const listener of [...editorWindow.listeners]) {
217
+ listener({
218
+ origin: CANVAS,
219
+ source: canvasWindow.handle,
220
+ data: {
221
+ source: 'buildr',
222
+ protocol: 2,
223
+ session: SESSION,
224
+ type: 'canvas:hello',
225
+ payload: { protocol: 2, rendererVersion: '1', manifestHash: HASH },
226
+ },
227
+ });
228
+ }
229
+ expect(host.state.getState().error).toMatchObject({
230
+ kind: 'protocol',
231
+ details: { editor: 1, canvas: 2 },
232
+ });
233
+ host.destroy();
234
+ });
235
+ });
236
+ describe('sending changes', () => {
237
+ it('batches the patches of one frame into a single doc:patch', () => {
238
+ const { store, host, connect, frames, received } = setup();
239
+ connect().send('canvas:ready', {});
240
+ received.length = 0;
241
+ store.dispatch({
242
+ type: 'node.setProp',
243
+ payload: { id: 'textNodeA1', prop: 'text', value: s('One') },
244
+ });
245
+ store.dispatch({
246
+ type: 'node.setProp',
247
+ payload: { id: 'textNodeB1', prop: 'text', value: s('Two') },
248
+ });
249
+ expect(received).toHaveLength(0);
250
+ expect(frames.pending()).toBe(1);
251
+ frames.run();
252
+ expect(types(received)).toEqual(['doc:patch']);
253
+ expect(received[0]?.payload).toMatchObject({ from: 0, to: 2 });
254
+ host.destroy();
255
+ });
256
+ it('sends the whole document after a replacement, and on a resync request', () => {
257
+ const { store, host, connect, frames, received } = setup();
258
+ const child = connect();
259
+ child.send('canvas:ready', {});
260
+ received.length = 0;
261
+ store.dispatch({
262
+ type: 'node.setProp',
263
+ payload: { id: 'textNodeA1', prop: 'text', value: s('One') },
264
+ });
265
+ store.replaceDocument(fixture());
266
+ frames.run();
267
+ expect(types(received)).toEqual(['doc:set']);
268
+ expect(received[0]?.payload).toMatchObject({ docVersion: 2 });
269
+ received.length = 0;
270
+ child.send('doc:resync-request', { have: 1 });
271
+ expect(types(received)).toEqual(['doc:set']);
272
+ host.destroy();
273
+ });
274
+ it('sends selection and hover at once, and only when they change', () => {
275
+ const { store, host, connect, received } = setup();
276
+ connect().send('canvas:ready', {});
277
+ received.length = 0;
278
+ store.select('textNodeA1');
279
+ store.setHovered('textNodeB1');
280
+ store.setHovered('textNodeB1');
281
+ expect(received.map((m) => [m.type, m.payload])).toEqual([
282
+ ['selection:set', { ids: ['textNodeA1'] }],
283
+ ['hover:set', { id: 'textNodeB1' }],
284
+ ]);
285
+ host.destroy();
286
+ });
287
+ it('does not send anything to a canvas that is not there yet, and inits it with the latest', () => {
288
+ const { store, host, connect, frames, received } = setup();
289
+ store.dispatch({
290
+ type: 'node.setProp',
291
+ payload: { id: 'textNodeA1', prop: 'text', value: s('Early') },
292
+ });
293
+ frames.run();
294
+ connect();
295
+ expect(types(received)).toEqual(['editor:init']);
296
+ expect(received[0]?.payload).toMatchObject({ docVersion: 1 });
297
+ host.destroy();
298
+ });
299
+ it('a canvas that reloads is initialized again, with nothing lost', () => {
300
+ const { store, host, connect, received } = setup();
301
+ const first = connect();
302
+ first.send('canvas:ready', {});
303
+ store.select('textNodeB1');
304
+ first.close();
305
+ received.length = 0;
306
+ connect();
307
+ expect(received[0]?.type).toBe('editor:init');
308
+ expect(received[0]?.payload).toMatchObject({ selection: ['textNodeB1'] });
309
+ expect(host.state.getState().connections).toBe(2);
310
+ host.destroy();
311
+ });
312
+ it('sends the viewport, locale, mode and context when they change', () => {
313
+ const { host, connect, received } = setup();
314
+ connect().send('canvas:ready', {});
315
+ received.length = 0;
316
+ host.setBreakpoint('mobile');
317
+ host.setLocale('pl');
318
+ host.setLocale('xx');
319
+ host.setMode('interact');
320
+ expect(received.map((m) => [m.type, m.payload])).toEqual([
321
+ ['viewport:set', { breakpoint: 'mobile', width: 390 }],
322
+ ['locale:set', { locale: 'pl' }],
323
+ ['mode:set', { mode: 'interact' }],
324
+ ]);
325
+ host.destroy();
326
+ });
327
+ });
328
+ describe('what the canvas reports', () => {
329
+ it('a click selects, with Shift adding and Ctrl toggling', () => {
330
+ const { store, host, connect } = setup();
331
+ const child = connect();
332
+ child.send('node:click', { ...click('textNodeA1'), instance: 'loop:1' });
333
+ expect(store.getState().selectedIds).toEqual(['textNodeA1']);
334
+ expect(store.getState().selectedInstance).toBe('loop:1');
335
+ child.send('node:click', click('textNodeB1', { shift: true }));
336
+ expect(store.getState().selectedIds).toEqual(['textNodeA1', 'textNodeB1']);
337
+ child.send('node:click', click('textNodeA1', { ctrl: true }));
338
+ expect(store.getState().selectedIds).toEqual(['textNodeB1']);
339
+ child.send('node:hover', click('boxNode001'));
340
+ expect(store.getState().hoveredId).toBe('boxNode001');
341
+ host.destroy();
342
+ });
343
+ it('an inline edit becomes node.setProp, in the current locale', () => {
344
+ const { store, host, connect } = setup();
345
+ const child = connect();
346
+ child.send('inline:commit', { id: 'textNodeA1', prop: 'text', value: 'Edited' });
347
+ expect(JSON.stringify(store.getState().doc.nodes['textNodeA1']?.props?.['text'])).toContain('Edited');
348
+ expect(store.getState().undoLabel).toBe('inline-edit');
349
+ host.destroy();
350
+ });
351
+ it('a move intent becomes node.move; a refused command is reported', () => {
352
+ const onCommandError = vi.fn();
353
+ const { store, host, connect } = setup({ onCommandError });
354
+ const child = connect();
355
+ child.send('intent:move', {
356
+ ids: ['textNodeB1'],
357
+ target: { parentId: 'boxNode001', slot: 'default', index: 0 },
358
+ });
359
+ expect(store.getState().doc.nodes['boxNode001']?.slots?.['default']).toEqual([
360
+ 'textNodeB1',
361
+ 'textNodeA1',
362
+ ]);
363
+ child.send('inline:commit', { id: 'ghostNode1', prop: 'text', value: 'x' });
364
+ expect(onCommandError).toHaveBeenCalledTimes(1);
365
+ host.destroy();
366
+ });
367
+ it('forwards keys, the context menu and drop targets, and keeps diagnostics', () => {
368
+ const onKeyDown = vi.fn();
369
+ const onContextMenu = vi.fn();
370
+ const onDropTarget = vi.fn();
371
+ const { host, connect } = setup({ onKeyDown, onContextMenu, onDropTarget });
372
+ const child = connect();
373
+ child.send('key:down', { key: 'z', code: 'KeyZ', mods: { ...mods, ctrl: true } });
374
+ child.send('contextmenu', { id: 'textNodeA1', point: { x: 1, y: 2 } });
375
+ child.send('dnd:target', { target: null });
376
+ child.send('diagnostics', {
377
+ items: [{ code: 'x', message: 'y', severity: 'warning' }],
378
+ });
379
+ expect(onKeyDown).toHaveBeenCalledOnce();
380
+ expect(onContextMenu).toHaveBeenCalledOnce();
381
+ expect(onDropTarget).toHaveBeenCalledWith({ target: null });
382
+ expect(host.state.getState().diagnostics).toHaveLength(1);
383
+ host.destroy();
384
+ });
385
+ it('a fatal canvas error shows the error screen; a non-fatal one does not', () => {
386
+ const { host, connect } = setup();
387
+ const child = connect();
388
+ child.send('canvas:ready', {});
389
+ child.send('canvas:error', { message: 'a node broke', fatal: false });
390
+ expect(host.state.getState().status).toBe('ready');
391
+ child.send('canvas:error', { message: 'boom', fatal: true });
392
+ expect(host.state.getState()).toMatchObject({
393
+ status: 'error',
394
+ error: { kind: 'canvas', message: 'boom' },
395
+ });
396
+ host.destroy();
397
+ });
398
+ });
@@ -0,0 +1,5 @@
1
+ export type { CanvasFrameProps } from './canvas-frame.tsx';
2
+ export { CanvasFrame, canvasSource, createSession } from './canvas-frame.tsx';
3
+ export type { CanvasError, CanvasErrorKind, CanvasFrames, CanvasHost, CanvasHostOptions, CanvasHostState, CanvasMode, CanvasStatus, LocalesConfig, } from './host.ts';
4
+ export { createCanvasHost, DEFAULT_HANDSHAKE_TIMEOUT_MS } from './host.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canvas-host/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { CanvasFrame, canvasSource, createSession } from './canvas-frame.js';
2
+ export { createCanvasHost, DEFAULT_HANDSHAKE_TIMEOUT_MS } from './host.js';
@@ -0,0 +1,38 @@
1
+ import { type ComponentMigrations, type IdGenerator } from '@next-buildr/core';
2
+ import type { EditorStore } from '../store/index.ts';
3
+ import { type ClipboardError } from './format.ts';
4
+ /** The system clipboard as far as the editor needs it; both calls may reject (no permission, no API). */
5
+ export interface ClipboardIO {
6
+ writeText(text: string): Promise<void>;
7
+ readText(): Promise<string>;
8
+ }
9
+ /** `navigator.clipboard`, or `undefined` where there is none (an insecure context, a test). */
10
+ export declare function browserClipboard(): ClipboardIO | undefined;
11
+ export type ClipboardResult = {
12
+ readonly ok: true;
13
+ } | {
14
+ readonly ok: false;
15
+ readonly error: ClipboardError;
16
+ };
17
+ export interface ClipboardOptions {
18
+ readonly store: EditorStore;
19
+ /** The system clipboard; the editor works without it, within this window only. */
20
+ readonly io?: ClipboardIO | undefined;
21
+ readonly generateId?: IdGenerator;
22
+ /** What brings a fragment copied under older component versions up to the registry; without it such a paste is refused. */
23
+ readonly migrations?: ComponentMigrations | undefined;
24
+ }
25
+ export interface Clipboard {
26
+ copy(): Promise<ClipboardResult>;
27
+ cut(): Promise<ClipboardResult>;
28
+ paste(): Promise<ClipboardResult>;
29
+ }
30
+ /**
31
+ * Copy, cut and paste of nodes (docs/editor.md#clipboard-pb-085). What is copied is a fragment
32
+ * (`extractFragment`) written as text with a marker; what is pasted is parsed, validated, given new
33
+ * ids and inserted with `node.insert`, which checks it against the rules of the target. Without
34
+ * access to the system clipboard the last copy is kept in memory. Paste can therefore never do more
35
+ * than any other insert: an invalid fragment or an illegal place is refused, not partly applied.
36
+ */
37
+ export declare function createClipboard(options: ClipboardOptions): Clipboard;
38
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/clipboard/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAIxB,KAAK,WAAW,EAMjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,cAAc,EAAyC,MAAM,aAAa,CAAC;AAEzF,yGAAyG;AACzG,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,IAAI,WAAW,GAAG,SAAS,CAO1D;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;IAClC,2HAA2H;IAC3H,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;CACvD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACjC,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACnC;AAyDD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAyFpE"}
@@ -0,0 +1,160 @@
1
+ import { createIndex, extractFragment, generateId, isAncestor, migrateFragment, registryVersions, reId, } from '@next-buildr/core';
2
+ import { parseClipboardText, serializeFragment } from './format.js';
3
+ /** `navigator.clipboard`, or `undefined` where there is none (an insecure context, a test). */
4
+ export function browserClipboard() {
5
+ if (typeof navigator === 'undefined' || navigator.clipboard === undefined)
6
+ return undefined;
7
+ const clipboard = navigator.clipboard;
8
+ return {
9
+ writeText: (text) => clipboard.writeText(text),
10
+ readText: () => clipboard.readText(),
11
+ };
12
+ }
13
+ const fail = (error) => ({ ok: false, error });
14
+ const OK = { ok: true };
15
+ /** The selected nodes to copy, in document order, without the ones whose ancestor is selected too. */
16
+ function copyable(store) {
17
+ const { doc, selectedIds } = store.getState();
18
+ const rank = new Map(createIndex(doc).order.map((id, position) => [id, position]));
19
+ const wanted = selectedIds.filter((id) => id !== doc.root && Object.hasOwn(doc.nodes, id));
20
+ return wanted
21
+ .filter((id) => !wanted.some((other) => other !== id && isAncestor(doc, other, id)))
22
+ .sort((a, b) => (rank.get(a) ?? 0) - (rank.get(b) ?? 0));
23
+ }
24
+ /**
25
+ * Where a paste could go, best first: after the selected node, inside it, then after each of its
26
+ * ancestors, and finally at the end of the page. The first place the rules accept wins.
27
+ */
28
+ function pasteTargets(store) {
29
+ const { doc, anchorId } = store.getState();
30
+ const index = createIndex(doc);
31
+ const endOf = (parentId, slot) => doc.nodes[parentId]?.slots?.[slot]?.length ?? 0;
32
+ const after = (id) => {
33
+ const parentId = index.parentOf[id];
34
+ const slot = index.slotOf[id];
35
+ const position = index.indexOf[id];
36
+ return parentId === undefined || slot === undefined || position === undefined
37
+ ? undefined
38
+ : { parentId, slot, index: position + 1 };
39
+ };
40
+ const targets = [];
41
+ if (anchorId !== null && anchorId !== doc.root && doc.nodes[anchorId] !== undefined) {
42
+ const next = after(anchorId);
43
+ if (next !== undefined)
44
+ targets.push(next);
45
+ const slots = new Set(['default', ...Object.keys(doc.nodes[anchorId]?.slots ?? {})]);
46
+ for (const slot of slots)
47
+ targets.push({ parentId: anchorId, slot, index: endOf(anchorId, slot) });
48
+ for (let up = index.parentOf[anchorId]; up !== undefined && up !== doc.root; up = index.parentOf[up]) {
49
+ const outer = after(up);
50
+ if (outer !== undefined)
51
+ targets.push(outer);
52
+ }
53
+ }
54
+ targets.push({ parentId: doc.root, slot: 'default', index: endOf(doc.root, 'default') });
55
+ return targets;
56
+ }
57
+ /**
58
+ * Copy, cut and paste of nodes (docs/editor.md#clipboard-pb-085). What is copied is a fragment
59
+ * (`extractFragment`) written as text with a marker; what is pasted is parsed, validated, given new
60
+ * ids and inserted with `node.insert`, which checks it against the rules of the target. Without
61
+ * access to the system clipboard the last copy is kept in memory. Paste can therefore never do more
62
+ * than any other insert: an invalid fragment or an illegal place is refused, not partly applied.
63
+ */
64
+ export function createClipboard(options) {
65
+ const { store, io } = options;
66
+ const idGenerator = options.generateId ?? generateId;
67
+ let memory;
68
+ async function copy() {
69
+ const ids = copyable(store);
70
+ if (ids.length === 0)
71
+ return fail({ code: 'empty' });
72
+ const text = serializeFragment(extractFragment(store.getState().doc, ids));
73
+ memory = text;
74
+ try {
75
+ await io?.writeText(text);
76
+ }
77
+ catch {
78
+ // No permission or no API: the in-memory copy still serves this window.
79
+ }
80
+ return OK;
81
+ }
82
+ async function readText() {
83
+ if (io === undefined)
84
+ return memory;
85
+ try {
86
+ return await io.readText();
87
+ }
88
+ catch {
89
+ return memory;
90
+ }
91
+ }
92
+ /** The fragment as the running registry knows it, or `undefined` when it is outdated and cannot be migrated. */
93
+ function current(fragment) {
94
+ const versions = registryVersions(store.registry);
95
+ // The nodes count too: a type left out of `components` must not slip past the check.
96
+ const outdated = (candidate) => Object.entries(candidate.components).some(([type, version]) => versions[type] !== version) ||
97
+ Object.values(candidate.nodes).some(({ type }) => versions[type] === undefined || candidate.components[type] !== versions[type]);
98
+ if (!outdated(fragment))
99
+ return fragment;
100
+ if (options.migrations === undefined)
101
+ return undefined;
102
+ try {
103
+ const migrated = migrateFragment(fragment, options.migrations);
104
+ // Still not what the registry serves (a type nothing migrates): refuse rather than guess.
105
+ return migrated.readOnlyReasons.length === 0 && !outdated(migrated.fragment)
106
+ ? migrated.fragment
107
+ : undefined;
108
+ }
109
+ catch {
110
+ return undefined;
111
+ }
112
+ }
113
+ function insert(source) {
114
+ const fragment = current(source);
115
+ if (fragment === undefined)
116
+ return fail({ code: 'outdated' });
117
+ let fresh;
118
+ try {
119
+ fresh = reId(fragment, idGenerator);
120
+ }
121
+ catch {
122
+ // A child that is not in the fragment: the shape passed, the tree does not hold together.
123
+ return fail({ code: 'invalid' });
124
+ }
125
+ let firstError;
126
+ for (const target of pasteTargets(store)) {
127
+ const result = store.dispatch({
128
+ type: 'node.insert',
129
+ payload: { ...target, fragment: fresh },
130
+ });
131
+ if (result.ok)
132
+ return OK;
133
+ firstError ??= result.error.message;
134
+ }
135
+ return fail({ code: 'rejected', detail: firstError });
136
+ }
137
+ return {
138
+ copy,
139
+ async cut() {
140
+ if (store.getState().readOnly)
141
+ return fail({ code: 'readOnly' });
142
+ const copied = await copy();
143
+ if (!copied.ok)
144
+ return copied;
145
+ const removed = store.dispatch({ type: 'node.remove', payload: { ids: copyable(store) } });
146
+ return removed.ok ? OK : fail({ code: 'rejected', detail: removed.error.message });
147
+ },
148
+ async paste() {
149
+ if (store.getState().readOnly)
150
+ return fail({ code: 'readOnly' });
151
+ const text = await readText();
152
+ if (text === undefined)
153
+ return fail({ code: 'notFragment' });
154
+ const parsed = parseClipboardText(text);
155
+ if (!parsed.ok)
156
+ return parsed;
157
+ return insert(parsed.fragment);
158
+ },
159
+ };
160
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clipboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.test.d.ts","sourceRoot":"","sources":["../../src/clipboard/clipboard.test.tsx"],"names":[],"mappings":""}