@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,182 @@
1
+ import type { BuilderDocument, DataContext, DataSchema, Diagnostic, LocaleConfig, MediaAsset } from '@next-buildr/core';
2
+ /** Which document the editor opens: a collection and an id in the host's backend. */
3
+ export interface DocumentRef {
4
+ readonly collection: string;
5
+ readonly id: string | number;
6
+ }
7
+ /** Who is editing and what they may do; decided by the host's backend. */
8
+ export interface EditorSession {
9
+ readonly userId?: string | undefined;
10
+ readonly canEdit: boolean;
11
+ readonly canPublish: boolean;
12
+ /** The languages the content can be written in; one language when the host has no localization. */
13
+ readonly locales?: LocaleConfig | undefined;
14
+ }
15
+ /** A document as the backend has it (`GET` of docs/payload.md#endpoints). */
16
+ export interface LoadedDocument {
17
+ readonly title: string;
18
+ readonly slug?: string | undefined;
19
+ readonly status: 'draft' | 'published';
20
+ readonly updatedAt: string;
21
+ /** Changes with every save; the next save says which one it builds on (`baseRevision`). */
22
+ readonly revision: number;
23
+ readonly document: BuilderDocument;
24
+ /** A viewer's role, or a component newer than this build knows: the document may not be changed. */
25
+ readonly readOnly?: boolean | undefined;
26
+ /** What the canvas binds against by default: the entry this document is (`collection:id` for Payload). */
27
+ readonly contextRef?: string | undefined;
28
+ }
29
+ export interface SaveRequest {
30
+ readonly document: BuilderDocument;
31
+ readonly baseRevision: number;
32
+ /** `true` for a save the editor started on its own, `false` for Ctrl+S; the backend may keep fewer versions of the former. */
33
+ readonly autosave: boolean;
34
+ }
35
+ /**
36
+ * What a save came to. A refused save is a value, not a rejection: only what the adapter could not
37
+ * tell (no network, a 5xx) rejects, and that is the case the editor retries.
38
+ */
39
+ export type SaveResult = {
40
+ readonly ok: true;
41
+ readonly revision: number;
42
+ readonly updatedAt: string;
43
+ } | {
44
+ readonly ok: false;
45
+ readonly kind: 'conflict';
46
+ readonly currentRevision: number;
47
+ } | {
48
+ readonly ok: false;
49
+ readonly kind: 'invalid';
50
+ readonly diagnostics: readonly Diagnostic[];
51
+ };
52
+ export type PublishResult = {
53
+ readonly ok: true;
54
+ readonly revision: number;
55
+ readonly updatedAt: string;
56
+ } | {
57
+ readonly ok: false;
58
+ readonly kind: 'conflict';
59
+ readonly currentRevision: number;
60
+ } | {
61
+ readonly ok: false;
62
+ readonly kind: 'invalid';
63
+ readonly diagnostics: readonly Diagnostic[];
64
+ };
65
+ /** What `PersistenceController.publish` came to. */
66
+ export type PublishOutcome = {
67
+ readonly ok: true;
68
+ readonly revision: number;
69
+ readonly updatedAt: string;
70
+ } | {
71
+ readonly ok: false;
72
+ readonly kind: 'conflict';
73
+ readonly currentRevision: number;
74
+ } | {
75
+ readonly ok: false;
76
+ readonly kind: 'invalid';
77
+ readonly diagnostics: readonly Diagnostic[];
78
+ }
79
+ /** The document could not be saved first, so there is nothing consistent to publish. */
80
+ | {
81
+ readonly ok: false;
82
+ readonly kind: 'unsaved';
83
+ } | {
84
+ readonly ok: false;
85
+ readonly kind: 'network';
86
+ readonly message: string;
87
+ };
88
+ export interface MediaSearchResult {
89
+ readonly items: readonly MediaAsset[];
90
+ readonly nextCursor?: string | undefined;
91
+ }
92
+ /** What the backend has now, without the document (`getRevision`). */
93
+ export interface RevisionInfo {
94
+ readonly revision: number;
95
+ readonly updatedAt: string;
96
+ /** Who made the last save (a name or an email), when the backend records it. */
97
+ readonly updatedBy?: string | undefined;
98
+ }
99
+ /** What the editor needs from a backend (docs/editor.md#persistence-pb-087); `@next-buildr/payload` implements it. */
100
+ export interface DocumentAdapter {
101
+ getSession(ref: DocumentRef): Promise<EditorSession>;
102
+ load(ref: DocumentRef): Promise<LoadedDocument>;
103
+ /**
104
+ * The current revision only (cheap): lets the editor notice a save made elsewhere, by an agent or
105
+ * another tab, before its own save is refused. Optional; without it nothing is polled.
106
+ */
107
+ getRevision?(ref: DocumentRef): Promise<RevisionInfo>;
108
+ save(ref: DocumentRef, request: SaveRequest): Promise<SaveResult>;
109
+ /**
110
+ * Renames the page and returns the name the backend kept (it may trim it). The name is not part of
111
+ * the document, so it is neither versioned nor autosaved. Optional; the editor's title is read-only
112
+ * without it. A refusal rejects.
113
+ */
114
+ rename?(ref: DocumentRef, title: string): Promise<{
115
+ readonly title: string;
116
+ }>;
117
+ publish(ref: DocumentRef, request: {
118
+ readonly baseRevision: number;
119
+ }): Promise<PublishResult>;
120
+ getDataSchema(ref: DocumentRef): Promise<DataSchema>;
121
+ /** The data the page is shown with; `sampleId` (one of `listSamples`) picks the entry a template is previewed against. */
122
+ getContext(ref: DocumentRef, options?: {
123
+ readonly sampleId?: string;
124
+ }): Promise<DataContext>;
125
+ listSamples?(ref: DocumentRef): Promise<readonly {
126
+ readonly id: string;
127
+ readonly label: string;
128
+ }[]>;
129
+ readonly media: {
130
+ search(query: {
131
+ readonly text?: string;
132
+ readonly cursor?: string;
133
+ readonly mimeTypes?: readonly string[];
134
+ }): Promise<MediaSearchResult>;
135
+ /** Adds a file to the library. `alt` is required: an image without alternative text is an accessibility error. */
136
+ upload?(file: File, alt: string): Promise<MediaAsset>;
137
+ };
138
+ /** Where the site shows the page as a visitor would; `draft` asks for the unpublished version. */
139
+ previewUrl(ref: DocumentRef, options?: {
140
+ readonly draft?: boolean;
141
+ }): string;
142
+ /** The page in the CMS's own admin, when it has one. */
143
+ cmsUrl?(ref: DocumentRef): string | undefined;
144
+ }
145
+ export type PersistenceStatus =
146
+ /** The document is the saved one. */
147
+ 'clean'
148
+ /** Changed since the last save; a save is scheduled. */
149
+ | 'dirty' | 'saving'
150
+ /** The last save failed and will be retried (or, for `invalid`, waits for a change). */
151
+ | 'error'
152
+ /** Somebody else saved in the meantime; the author chooses between reload and overwrite. */
153
+ | 'conflict';
154
+ export type PersistenceError = {
155
+ readonly kind: 'network';
156
+ readonly message: string;
157
+ readonly attempt: number;
158
+ } | {
159
+ readonly kind: 'invalid';
160
+ readonly diagnostics: readonly Diagnostic[];
161
+ };
162
+ export interface PersistenceState {
163
+ readonly status: PersistenceStatus;
164
+ /** The revision the next save builds on. */
165
+ readonly revision: number;
166
+ readonly lastSavedAt: string | undefined;
167
+ readonly error: PersistenceError | undefined;
168
+ /** The revision the backend has now, while `status` is `conflict`. */
169
+ readonly conflictRevision: number | undefined;
170
+ /** A newer revision seen on the backend while the local document is unchanged (offer a reload). */
171
+ readonly external: {
172
+ readonly revision: number;
173
+ readonly updatedBy: string | undefined;
174
+ } | undefined;
175
+ }
176
+ /** The timers the state machine runs on; tests inject their own. */
177
+ export interface Clock {
178
+ now(): number;
179
+ setTimeout(handler: () => void, ms: number): unknown;
180
+ clearTimeout(handle: unknown): void;
181
+ }
182
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/persistence/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export { isSafePreviewUrl, type PreviewResult, preparePreview } from './prepare.ts';
2
+ export { PreviewOverlay, type PreviewOverlayProps, type UsePreview, type UsePreviewOptions, usePreview, } from './preview.tsx';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,UAAU,GACX,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { isSafePreviewUrl, preparePreview } from './prepare.js';
2
+ export { PreviewOverlay, usePreview, } from './preview.js';
@@ -0,0 +1,16 @@
1
+ import type { DocumentAdapter, DocumentRef, PersistenceController } from '../persistence/index.ts';
2
+ export type PreviewResult = {
3
+ readonly ok: true;
4
+ readonly url: string;
5
+ } | {
6
+ readonly ok: false;
7
+ readonly reason: 'unsaved' | 'unsafe-url';
8
+ };
9
+ /** Only pages of the site itself or of another web address; never a `javascript:` or `data:` URL. */
10
+ export declare function isSafePreviewUrl(url: string): boolean;
11
+ /**
12
+ * Makes the preview show the latest changes: saves what is unsaved first, and only then asks the
13
+ * adapter for the draft URL. A preview of a document that could not be saved would show old work.
14
+ */
15
+ export declare function preparePreview(controller: Pick<PersistenceController, 'saveNow' | 'state'>, adapter: Pick<DocumentAdapter, 'previewUrl'>, ref: DocumentRef): Promise<PreviewResult>;
16
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/preview/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEnG,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAAA;CAAE,CAAC;AAEtE,qGAAqG;AACrG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,CAAC,EAC5D,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EAC5C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,aAAa,CAAC,CAKxB"}
@@ -0,0 +1,21 @@
1
+ /** Only pages of the site itself or of another web address; never a `javascript:` or `data:` URL. */
2
+ export function isSafePreviewUrl(url) {
3
+ try {
4
+ const parsed = new URL(url, 'http://localhost');
5
+ return parsed.protocol === 'http:' || parsed.protocol === 'https:';
6
+ }
7
+ catch {
8
+ return false;
9
+ }
10
+ }
11
+ /**
12
+ * Makes the preview show the latest changes: saves what is unsaved first, and only then asks the
13
+ * adapter for the draft URL. A preview of a document that could not be saved would show old work.
14
+ */
15
+ export async function preparePreview(controller, adapter, ref) {
16
+ await controller.saveNow();
17
+ if (controller.state.getState().status !== 'clean')
18
+ return { ok: false, reason: 'unsaved' };
19
+ const url = adapter.previewUrl(ref, { draft: true });
20
+ return isSafePreviewUrl(url) ? { ok: true, url } : { ok: false, reason: 'unsafe-url' };
21
+ }
@@ -0,0 +1,27 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type DocumentAdapter, type DocumentRef } from '../persistence/index.ts';
3
+ export interface PreviewOverlayProps {
4
+ readonly url: string;
5
+ readonly onExit: () => void;
6
+ }
7
+ /** The page as visitors get it, over the whole editor; Escape or the button leaves it. */
8
+ export declare function PreviewOverlay({ url, onExit }: PreviewOverlayProps): import("react").JSX.Element;
9
+ export interface UsePreviewOptions {
10
+ readonly adapter: Pick<DocumentAdapter, 'previewUrl'>;
11
+ readonly docRef: DocumentRef;
12
+ /** `overlay` (default) shows the page inside the editor, `tab` opens a new browser tab. */
13
+ readonly target?: 'overlay' | 'tab' | undefined;
14
+ /** Opens a tab; `window.open` unless a test gives another. */
15
+ readonly open?: ((url: string) => void) | undefined;
16
+ }
17
+ export interface UsePreview {
18
+ /** For the toolbar's `onPreview`. */
19
+ readonly preview: () => void;
20
+ /** Render this somewhere in the shell. */
21
+ readonly overlay: ReactNode;
22
+ /** Why the last attempt failed, as a message for a live region; empty when it did not. */
23
+ readonly error: string;
24
+ }
25
+ /** Saves, then shows the preview (docs/editor.md#preview). */
26
+ export declare function usePreview(options: UsePreviewOptions): UsePreview;
27
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/preview/preview.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoC,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAkB,MAAM,yBAAyB,CAAC;AAIjG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,mBAAmB,+BA0BlE;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;IAChD,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACrD;AAED,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,0FAA0F;IAC1F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CA6BjE"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { useT } from '../messages/index.js';
4
+ import { usePersistence } from '../persistence/index.js';
5
+ import { Button } from '../ui/index.js';
6
+ import { preparePreview } from './prepare.js';
7
+ /** The page as visitors get it, over the whole editor; Escape or the button leaves it. */
8
+ export function PreviewOverlay({ url, onExit }) {
9
+ const t = useT();
10
+ useEffect(() => {
11
+ const onKey = (event) => {
12
+ if (event.key === 'Escape')
13
+ onExit();
14
+ };
15
+ window.addEventListener('keydown', onKey);
16
+ return () => window.removeEventListener('keydown', onKey);
17
+ }, [onExit]);
18
+ return (_jsxs("div", { className: "bd-preview", role: "dialog", "aria-modal": "true", "aria-label": t('preview.title'), children: [_jsxs("div", { className: "bd-preview-bar", children: [_jsx("span", { children: t('preview.title') }), _jsx(Button, { variant: "primary", onClick: onExit, autoFocus: true, children: t('preview.exit') })] }), _jsx("iframe", { className: "bd-preview-frame", title: t('preview.frame'), src: url, sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", referrerPolicy: "no-referrer" })] }));
19
+ }
20
+ /** Saves, then shows the preview (docs/editor.md#preview). */
21
+ export function usePreview(options) {
22
+ const { adapter, docRef, target = 'overlay', open } = options;
23
+ const t = useT();
24
+ const controller = usePersistence();
25
+ const [url, setUrl] = useState();
26
+ const [error, setError] = useState('');
27
+ const preview = useCallback(() => {
28
+ setError('');
29
+ void preparePreview(controller, adapter, docRef).then((result) => {
30
+ if (!result.ok) {
31
+ setError(t(result.reason === 'unsaved' ? 'preview.unsaved' : 'preview.unsafe'));
32
+ return;
33
+ }
34
+ if (target === 'tab') {
35
+ if (open !== undefined)
36
+ open(result.url);
37
+ else
38
+ window.open(result.url, '_blank', 'noopener,noreferrer');
39
+ }
40
+ else {
41
+ setUrl(result.url);
42
+ }
43
+ });
44
+ }, [controller, adapter, docRef, target, open, t]);
45
+ const exit = useCallback(() => setUrl(undefined), []);
46
+ return {
47
+ preview,
48
+ error,
49
+ overlay: url === undefined ? null : _jsx(PreviewOverlay, { url: url, onExit: exit }),
50
+ };
51
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=preview.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.test.d.ts","sourceRoot":"","sources":["../../src/preview/preview.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // @vitest-environment jsdom
3
+ import { createRegistryMeta, createSeededIdGenerator, } from '@next-buildr/core';
4
+ import { act } from 'react';
5
+ import { createRoot } from 'react-dom/client';
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import { MessagesProvider } from '../messages/index.js';
8
+ import { createPersistence, PersistenceProvider } from '../persistence/index.js';
9
+ import { createEditorStore, EditorStoreProvider } from '../store/index.js';
10
+ import { ToastProvider } from '../ui/index.js';
11
+ import { isSafePreviewUrl } from './prepare.js';
12
+ import { usePreview } from './preview.js';
13
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
14
+ const item = {
15
+ type: 'buildr/item',
16
+ version: 1,
17
+ label: 'Item',
18
+ category: 'content',
19
+ props: {},
20
+ contentCategories: ['flow'],
21
+ styles: { groups: [] },
22
+ runtime: 'shared',
23
+ slots: { default: {} },
24
+ };
25
+ const page = {
26
+ ...item,
27
+ type: 'buildr/page',
28
+ label: 'Page',
29
+ capabilities: { root: true },
30
+ };
31
+ const registry = createRegistryMeta({ components: [page, item] });
32
+ const doc = () => ({
33
+ schemaVersion: 1,
34
+ root: 'root',
35
+ nodes: {
36
+ root: { id: 'root', type: 'buildr/page', slots: { default: ['itemAAAAA1'] } },
37
+ itemAAAAA1: { id: 'itemAAAAA1', type: 'buildr/item' },
38
+ },
39
+ components: { 'buildr/page': 1, 'buildr/item': 1 },
40
+ });
41
+ const ref = { collection: 'pages', id: '1' };
42
+ describe('preview', () => {
43
+ let container;
44
+ let root;
45
+ beforeEach(() => {
46
+ container = document.createElement('div');
47
+ document.body.append(container);
48
+ root = createRoot(container);
49
+ });
50
+ afterEach(() => {
51
+ act(() => root.unmount());
52
+ document.body.innerHTML = '';
53
+ });
54
+ it('accepts web addresses only', () => {
55
+ expect(isSafePreviewUrl('/blog?draft=1')).toBe(true);
56
+ expect(isSafePreviewUrl('https://site.test/a')).toBe(true);
57
+ expect(isSafePreviewUrl('javascript:alert(1)')).toBe(false);
58
+ expect(isSafePreviewUrl('data:text/html,x')).toBe(false);
59
+ });
60
+ function setup(opts) {
61
+ const order = [];
62
+ const adapter = {
63
+ save: async () => {
64
+ order.push('save');
65
+ return (await opts.save?.()) ?? { ok: true, revision: 2, updatedAt: 't' };
66
+ },
67
+ previewUrl: () => {
68
+ order.push('url');
69
+ return opts.url ?? '/preview/1';
70
+ },
71
+ };
72
+ const store = createEditorStore({
73
+ doc: doc(),
74
+ registry,
75
+ generateId: createSeededIdGenerator(2),
76
+ validationDelayMs: null,
77
+ });
78
+ const controller = createPersistence({ store, adapter, ref, revision: 1 });
79
+ const open = vi.fn((url) => void order.push(`open:${url}`));
80
+ let api;
81
+ function Probe() {
82
+ api = usePreview({ adapter, docRef: ref, target: opts.target, open });
83
+ return (_jsxs(_Fragment, { children: [api.overlay, _jsx("p", { role: "status", children: api.error })] }));
84
+ }
85
+ const mount = () => act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(EditorStoreProvider, { store: store, children: _jsx(ToastProvider, { children: _jsx(PersistenceProvider, { controller: controller, children: _jsx(Probe, {}) }) }) }) })));
86
+ const edit = () => act(() => {
87
+ store.dispatch({
88
+ type: 'node.setAttr',
89
+ payload: { id: 'itemAAAAA1', key: 'name', value: 'A' },
90
+ });
91
+ });
92
+ return { order, mount, edit, run: () => act(async () => api.preview()) };
93
+ }
94
+ it('saves before it asks for the address, then shows the page in an overlay', async () => {
95
+ const { order, mount, edit, run } = setup({});
96
+ await mount();
97
+ edit();
98
+ await run();
99
+ expect(order).toEqual(['save', 'url']);
100
+ const frame = container.ownerDocument.querySelector('iframe');
101
+ expect(frame.getAttribute('src')).toBe('/preview/1');
102
+ await act(async () => window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' })));
103
+ expect(document.querySelector('iframe')).toBeNull();
104
+ });
105
+ it('opens a tab after the save when asked to', async () => {
106
+ const { order, mount, edit, run } = setup({ target: 'tab' });
107
+ await mount();
108
+ edit();
109
+ await run();
110
+ expect(order).toEqual(['save', 'url', 'open:/preview/1']);
111
+ });
112
+ it('does not preview old work when the save failed', async () => {
113
+ const { mount, edit, run } = setup({
114
+ save: async () => ({ ok: false, kind: 'invalid', diagnostics: [] }),
115
+ });
116
+ await mount();
117
+ edit();
118
+ await run();
119
+ expect(document.querySelector('iframe')).toBeNull();
120
+ expect(container.textContent).toContain('could not be saved');
121
+ });
122
+ it('refuses an address that is not a web address', async () => {
123
+ const { mount, run } = setup({ url: 'javascript:alert(1)' });
124
+ await mount();
125
+ await run();
126
+ expect(document.querySelector('iframe')).toBeNull();
127
+ expect(container.textContent).toContain('not a web address');
128
+ });
129
+ });
@@ -0,0 +1,17 @@
1
+ import type { EditorStore } from '../store/index.ts';
2
+ import type { ShortcutRegistry } from './registry.ts';
3
+ /** What the editor's own shortcuts need from outside: the actions of other modules (PB-085, PB-087). */
4
+ export interface ExternalActions {
5
+ readonly copy?: () => boolean | undefined;
6
+ readonly cut?: () => boolean | undefined;
7
+ readonly paste?: () => boolean | undefined;
8
+ readonly save?: () => boolean | undefined;
9
+ }
10
+ /**
11
+ * Binds the shortcuts that act on the store (undo, redo, duplicate, delete, move, select, clear)
12
+ * and the ones other modules provide. Returns the function that unbinds them all. An action that
13
+ * cannot run (nothing selected, a locked node the command refuses) returns `false`, so the key is
14
+ * not swallowed.
15
+ */
16
+ export declare function bindEditorActions(registry: ShortcutRegistry, store: EditorStore, external?: ExternalActions): () => void;
17
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/shortcuts/actions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,wGAAwG;AACxG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;CAC3C;AAyCD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,WAAW,EAClB,QAAQ,GAAE,eAAoB,GAC7B,MAAM,IAAI,CAiCZ"}
@@ -0,0 +1,85 @@
1
+ import { createIndex } from '@next-buildr/core';
2
+ /** The selected nodes that can be acted on: the root is never removed, duplicated or moved. */
3
+ function actionable(store) {
4
+ const { doc, selectedIds } = store.getState();
5
+ return selectedIds.filter((id) => id !== doc.root && Object.hasOwn(doc.nodes, id));
6
+ }
7
+ function moveSelected(store, delta) {
8
+ const ids = actionable(store);
9
+ const [id] = ids;
10
+ if (ids.length !== 1 || id === undefined)
11
+ return false;
12
+ const { doc } = store.getState();
13
+ const index = createIndex(doc);
14
+ const parentId = index.parentOf[id];
15
+ const slot = index.slotOf[id];
16
+ const position = index.indexOf[id];
17
+ if (parentId === undefined || slot === undefined || position === undefined)
18
+ return false;
19
+ const siblings = doc.nodes[parentId]?.slots?.[slot] ?? [];
20
+ const target = position + delta;
21
+ if (target < 0 || target >= siblings.length)
22
+ return false;
23
+ // `index` is a position in the slot as it is now, so moving down passes the neighbour.
24
+ const result = store.dispatch({
25
+ type: 'node.move',
26
+ payload: { ids: [id], parentId, slot, index: delta === -1 ? target : target + 1 },
27
+ });
28
+ return result.ok;
29
+ }
30
+ function selectAll(store) {
31
+ const { doc, anchorId } = store.getState();
32
+ if (anchorId === null)
33
+ return false;
34
+ const index = createIndex(doc);
35
+ const parentId = index.parentOf[anchorId];
36
+ const slot = index.slotOf[anchorId];
37
+ if (parentId === undefined || slot === undefined)
38
+ return false;
39
+ const siblings = doc.nodes[parentId]?.slots?.[slot] ?? [];
40
+ store.setSelection(siblings);
41
+ return true;
42
+ }
43
+ /**
44
+ * Binds the shortcuts that act on the store (undo, redo, duplicate, delete, move, select, clear)
45
+ * and the ones other modules provide. Returns the function that unbinds them all. An action that
46
+ * cannot run (nothing selected, a locked node the command refuses) returns `false`, so the key is
47
+ * not swallowed.
48
+ */
49
+ export function bindEditorActions(registry, store, external = {}) {
50
+ const stops = [
51
+ registry.bind('edit.undo', () => store.undo().ok),
52
+ registry.bind('edit.redo', () => store.redo().ok),
53
+ registry.bind('edit.duplicate', () => {
54
+ const ids = actionable(store);
55
+ return ids.length > 0 && store.dispatch({ type: 'node.duplicate', payload: { ids } }).ok;
56
+ }),
57
+ registry.bind('edit.delete', () => {
58
+ const ids = actionable(store);
59
+ return ids.length > 0 && store.dispatch({ type: 'node.remove', payload: { ids } }).ok;
60
+ }),
61
+ registry.bind('node.moveUp', () => moveSelected(store, -1)),
62
+ registry.bind('node.moveDown', () => moveSelected(store, 1)),
63
+ registry.bind('selection.all', () => selectAll(store)),
64
+ registry.bind('selection.clear', () => {
65
+ if (store.getState().selectedIds.length === 0)
66
+ return false;
67
+ store.clearSelection();
68
+ return true;
69
+ }),
70
+ ];
71
+ const optional = {
72
+ 'edit.copy': external.copy,
73
+ 'edit.cut': external.cut,
74
+ 'edit.paste': external.paste,
75
+ 'file.save': external.save,
76
+ };
77
+ for (const [action, handler] of Object.entries(optional)) {
78
+ if (handler !== undefined)
79
+ stops.push(registry.bind(action, handler));
80
+ }
81
+ return () => {
82
+ for (const stop of stops)
83
+ stop();
84
+ };
85
+ }
@@ -0,0 +1,11 @@
1
+ export type { ExternalActions } from './actions.ts';
2
+ export { bindEditorActions } from './actions.ts';
3
+ export type { KeyInput, Platform } from './keys.ts';
4
+ export { comboOf, detectPlatform, displayCombo, isTypingTarget, normalizeCombo } from './keys.ts';
5
+ export type { ShortcutDef } from './map.ts';
6
+ export { applyOverrides, DEFAULT_SHORTCUTS } from './map.ts';
7
+ export type { ShortcutHandler, ShortcutRegistry, ShortcutRegistryOptions } from './registry.ts';
8
+ export { createShortcutRegistry } from './registry.ts';
9
+ export type { ShortcutProviderProps } from './shortcuts.tsx';
10
+ export { ShortcutProvider, useForwardedKeys, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.tsx';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shortcuts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAClG,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { bindEditorActions } from './actions.js';
2
+ export { comboOf, detectPlatform, displayCombo, isTypingTarget, normalizeCombo } from './keys.js';
3
+ export { applyOverrides, DEFAULT_SHORTCUTS } from './map.js';
4
+ export { createShortcutRegistry } from './registry.js';
5
+ export { ShortcutProvider, useForwardedKeys, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.js';
@@ -0,0 +1,29 @@
1
+ /** A key press as the editor sees it, from the DOM or forwarded by the canvas (`key:down`). */
2
+ export interface KeyInput {
3
+ readonly key: string;
4
+ readonly mods: {
5
+ readonly shift: boolean;
6
+ readonly alt: boolean;
7
+ readonly ctrl: boolean;
8
+ readonly meta: boolean;
9
+ };
10
+ }
11
+ /** Which key is the "primary" one: Cmd on a Mac, Ctrl elsewhere. */
12
+ export type Platform = 'mac' | 'other';
13
+ export declare function detectPlatform(navigatorLike?: {
14
+ readonly platform?: string;
15
+ readonly userAgent?: string;
16
+ } | undefined): Platform;
17
+ /**
18
+ * The canonical text of a combination: modifiers in a fixed order (`mod` is Cmd on a Mac and Ctrl
19
+ * elsewhere), then the key, all lower case — `mod+shift+z`, `alt+arrowup`, `delete`. Two spellings
20
+ * of one combination give the same text, so a lookup is a plain string comparison.
21
+ */
22
+ export declare function normalizeCombo(spec: string): string;
23
+ /** The canonical combination of a key press on `platform`. */
24
+ export declare function comboOf(input: KeyInput, platform: Platform): string;
25
+ /** How a combination is shown to the author on `platform` (`⌘⇧Z`, `Ctrl+Shift+Z`). */
26
+ export declare function displayCombo(combo: string, platform: Platform): string;
27
+ /** The keyboard belongs to text here: a field, a select or an editable region. */
28
+ export declare function isTypingTarget(target: EventTarget | null): boolean;
29
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/shortcuts/keys.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED,oEAAoE;AACpE,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvC,wBAAgB,cAAc,CAC5B,aAAa,GACT;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,SAAoE,GACvE,QAAQ,CAGV;AAcD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,8DAA8D;AAC9D,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAWnE;AAkCD,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAMtE;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAelE"}