@next-buildr/editor 2.0.1 → 3.0.0-rc.0

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 (645) hide show
  1. package/README.md +2 -0
  2. package/UPGRADING.md +322 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/app/builder-editor.test.js +223 -18
  5. package/dist/app/config.d.ts +27 -4
  6. package/dist/app/config.d.ts.map +1 -1
  7. package/dist/app/config.js +4 -3
  8. package/dist/app/contracts.d.ts +40 -0
  9. package/dist/app/contracts.d.ts.map +1 -0
  10. package/dist/app/contracts.js +4 -0
  11. package/dist/app/editor-app.d.ts.map +1 -1
  12. package/dist/app/editor-app.js +316 -24
  13. package/dist/app/editor-app.test.js +144 -6
  14. package/dist/app/layout.d.ts +11 -2
  15. package/dist/app/layout.d.ts.map +1 -1
  16. package/dist/app/layout.js +170 -9
  17. package/dist/app/manifest.d.ts +7 -2
  18. package/dist/app/manifest.d.ts.map +1 -1
  19. package/dist/app/manifest.js +16 -4
  20. package/dist/app/shell-panels.d.ts +15 -0
  21. package/dist/app/shell-panels.d.ts.map +1 -1
  22. package/dist/app/small-screen.test.js +2 -2
  23. package/dist/app/stage-slots.d.ts +9 -0
  24. package/dist/app/stage-slots.d.ts.map +1 -0
  25. package/dist/app/stage-slots.js +10 -0
  26. package/dist/app/status-info.d.ts +2 -3
  27. package/dist/app/status-info.d.ts.map +1 -1
  28. package/dist/app/status-info.js +49 -16
  29. package/dist/canvas-host/canvas-frame.d.ts +13 -1
  30. package/dist/canvas-host/canvas-frame.d.ts.map +1 -1
  31. package/dist/canvas-host/canvas-frame.js +96 -8
  32. package/dist/canvas-host/canvas-frame.test.js +156 -3
  33. package/dist/canvas-host/host.d.ts +6 -0
  34. package/dist/canvas-host/host.d.ts.map +1 -1
  35. package/dist/canvas-host/host.js +116 -4
  36. package/dist/canvas-host/host.test.js +195 -6
  37. package/dist/clipboard/clipboard.d.ts +1 -1
  38. package/dist/clipboard/clipboard.d.ts.map +1 -1
  39. package/dist/clipboard/clipboard.js +5 -0
  40. package/dist/clipboard/clipboard.test.js +21 -1
  41. package/dist/clipboard/format.d.ts +3 -1
  42. package/dist/clipboard/format.d.ts.map +1 -1
  43. package/dist/clipboard/react.d.ts +1 -1
  44. package/dist/clipboard/react.d.ts.map +1 -1
  45. package/dist/clipboard/react.js +49 -3
  46. package/dist/dialogs/external-source.d.ts +15 -0
  47. package/dist/dialogs/external-source.d.ts.map +1 -0
  48. package/dist/dialogs/external-source.js +18 -0
  49. package/dist/dialogs/index.d.ts +4 -0
  50. package/dist/dialogs/index.d.ts.map +1 -1
  51. package/dist/dialogs/index.js +2 -0
  52. package/dist/dialogs/media-picker/index.d.ts +2 -2
  53. package/dist/dialogs/media-picker/index.d.ts.map +1 -1
  54. package/dist/dialogs/media-picker/index.js +1 -1
  55. package/dist/dialogs/media-picker/media-picker.d.ts +5 -0
  56. package/dist/dialogs/media-picker/media-picker.d.ts.map +1 -1
  57. package/dist/dialogs/media-picker/media-picker.js +67 -5
  58. package/dist/dialogs/media-picker/media-picker.test.js +72 -1
  59. package/dist/dialogs/media-picker/media-ref.d.ts +15 -0
  60. package/dist/dialogs/media-picker/media-ref.d.ts.map +1 -1
  61. package/dist/dialogs/media-picker/media-ref.js +29 -0
  62. package/dist/dialogs/remove-confirm.d.ts +14 -0
  63. package/dist/dialogs/remove-confirm.d.ts.map +1 -0
  64. package/dist/dialogs/remove-confirm.js +42 -0
  65. package/dist/dialogs/remove-confirm.test.d.ts +2 -0
  66. package/dist/dialogs/remove-confirm.test.d.ts.map +1 -0
  67. package/dist/dialogs/remove-confirm.test.js +118 -0
  68. package/dist/dnd/dnd-react.test.js +11 -2
  69. package/dist/dnd/dnd.test.js +23 -0
  70. package/dist/dnd/engine.d.ts +4 -2
  71. package/dist/dnd/engine.d.ts.map +1 -1
  72. package/dist/dnd/engine.js +6 -0
  73. package/dist/dnd/move-to-dialog.d.ts +4 -3
  74. package/dist/dnd/move-to-dialog.d.ts.map +1 -1
  75. package/dist/dnd/move-to-dialog.js +67 -10
  76. package/dist/dnd/react.d.ts.map +1 -1
  77. package/dist/dnd/react.js +5 -0
  78. package/dist/i18n/diagnostics.d.ts +22 -0
  79. package/dist/i18n/diagnostics.d.ts.map +1 -0
  80. package/dist/i18n/diagnostics.js +153 -0
  81. package/dist/i18n/diagnostics.test.d.ts +2 -0
  82. package/dist/i18n/diagnostics.test.d.ts.map +1 -0
  83. package/dist/i18n/diagnostics.test.js +74 -0
  84. package/dist/i18n/label-catalog.d.ts +20 -0
  85. package/dist/i18n/label-catalog.d.ts.map +1 -0
  86. package/dist/i18n/label-catalog.js +1 -0
  87. package/dist/i18n/locale-name.d.ts +7 -0
  88. package/dist/i18n/locale-name.d.ts.map +1 -0
  89. package/dist/i18n/locale-name.js +31 -0
  90. package/dist/i18n/localize-manifest.d.ts +11 -0
  91. package/dist/i18n/localize-manifest.d.ts.map +1 -0
  92. package/dist/i18n/localize-manifest.js +78 -0
  93. package/dist/i18n/localize-manifest.test.d.ts +2 -0
  94. package/dist/i18n/localize-manifest.test.d.ts.map +1 -0
  95. package/dist/i18n/localize-manifest.test.js +71 -0
  96. package/dist/messages/catalogs.test.d.ts +2 -0
  97. package/dist/messages/catalogs.test.d.ts.map +1 -0
  98. package/dist/messages/catalogs.test.js +80 -0
  99. package/dist/messages/en/app.d.ts +8 -0
  100. package/dist/messages/en/app.d.ts.map +1 -0
  101. package/dist/messages/en/app.js +7 -0
  102. package/dist/messages/en/blocks.d.ts +54 -0
  103. package/dist/messages/en/blocks.d.ts.map +1 -0
  104. package/dist/messages/en/blocks.js +53 -0
  105. package/dist/messages/en/canvas.d.ts +31 -0
  106. package/dist/messages/en/canvas.d.ts.map +1 -0
  107. package/dist/messages/en/canvas.js +30 -0
  108. package/dist/messages/en/clipboard.d.ts +13 -0
  109. package/dist/messages/en/clipboard.d.ts.map +1 -0
  110. package/dist/messages/en/clipboard.js +12 -0
  111. package/dist/messages/en/colorPicker.d.ts +20 -0
  112. package/dist/messages/en/colorPicker.d.ts.map +1 -0
  113. package/dist/messages/en/colorPicker.js +19 -0
  114. package/dist/messages/en/diagnostics.d.ts +40 -0
  115. package/dist/messages/en/diagnostics.d.ts.map +1 -0
  116. package/dist/messages/en/diagnostics.js +39 -0
  117. package/dist/messages/en/dialogs/common.d.ts +6 -0
  118. package/dist/messages/en/dialogs/common.d.ts.map +1 -0
  119. package/dist/messages/en/dialogs/common.js +5 -0
  120. package/dist/messages/en/dialogs/conflict.d.ts +15 -0
  121. package/dist/messages/en/dialogs/conflict.d.ts.map +1 -0
  122. package/dist/messages/en/dialogs/conflict.js +14 -0
  123. package/dist/messages/en/dialogs/delete.d.ts +19 -0
  124. package/dist/messages/en/dialogs/delete.d.ts.map +1 -0
  125. package/dist/messages/en/dialogs/delete.js +18 -0
  126. package/dist/messages/en/dialogs/pageOptions.d.ts +9 -0
  127. package/dist/messages/en/dialogs/pageOptions.d.ts.map +1 -0
  128. package/dist/messages/en/dialogs/pageOptions.js +8 -0
  129. package/dist/messages/en/dialogs/publish.d.ts +15 -0
  130. package/dist/messages/en/dialogs/publish.d.ts.map +1 -0
  131. package/dist/messages/en/dialogs/publish.js +14 -0
  132. package/dist/messages/en/dnd.d.ts +19 -0
  133. package/dist/messages/en/dnd.d.ts.map +1 -0
  134. package/dist/messages/en/dnd.js +18 -0
  135. package/dist/messages/en/editor.d.ts +30 -0
  136. package/dist/messages/en/editor.d.ts.map +1 -0
  137. package/dist/messages/en/editor.js +29 -0
  138. package/dist/messages/en/external.d.ts +6 -0
  139. package/dist/messages/en/external.d.ts.map +1 -0
  140. package/dist/messages/en/external.js +5 -0
  141. package/dist/messages/en/insert.d.ts +25 -0
  142. package/dist/messages/en/insert.d.ts.map +1 -0
  143. package/dist/messages/en/insert.js +24 -0
  144. package/dist/messages/en/inspector.d.ts +176 -0
  145. package/dist/messages/en/inspector.d.ts.map +1 -0
  146. package/dist/messages/en/inspector.js +175 -0
  147. package/dist/messages/en/issues.d.ts +36 -0
  148. package/dist/messages/en/issues.d.ts.map +1 -0
  149. package/dist/messages/en/issues.js +35 -0
  150. package/dist/messages/en/layers.d.ts +29 -0
  151. package/dist/messages/en/layers.d.ts.map +1 -0
  152. package/dist/messages/en/layers.js +28 -0
  153. package/dist/messages/en/leftPanel.d.ts +15 -0
  154. package/dist/messages/en/leftPanel.d.ts.map +1 -0
  155. package/dist/messages/en/leftPanel.js +14 -0
  156. package/dist/messages/en/list.d.ts +9 -0
  157. package/dist/messages/en/list.d.ts.map +1 -0
  158. package/dist/messages/en/list.js +8 -0
  159. package/dist/messages/en/locale.d.ts +4 -0
  160. package/dist/messages/en/locale.d.ts.map +1 -0
  161. package/dist/messages/en/locale.js +3 -0
  162. package/dist/messages/en/media.d.ts +51 -0
  163. package/dist/messages/en/media.d.ts.map +1 -0
  164. package/dist/messages/en/media.js +50 -0
  165. package/dist/messages/en/menu.d.ts +12 -0
  166. package/dist/messages/en/menu.d.ts.map +1 -0
  167. package/dist/messages/en/menu.js +11 -0
  168. package/dist/messages/en/patterns.d.ts +24 -0
  169. package/dist/messages/en/patterns.d.ts.map +1 -0
  170. package/dist/messages/en/patterns.js +23 -0
  171. package/dist/messages/en/preview.d.ts +8 -0
  172. package/dist/messages/en/preview.d.ts.map +1 -0
  173. package/dist/messages/en/preview.js +7 -0
  174. package/dist/messages/en/publish.d.ts +19 -0
  175. package/dist/messages/en/publish.d.ts.map +1 -0
  176. package/dist/messages/en/publish.js +18 -0
  177. package/dist/messages/en/richText.d.ts +21 -0
  178. package/dist/messages/en/richText.d.ts.map +1 -0
  179. package/dist/messages/en/richText.js +20 -0
  180. package/dist/messages/en/sample.d.ts +5 -0
  181. package/dist/messages/en/sample.d.ts.map +1 -0
  182. package/dist/messages/en/sample.js +4 -0
  183. package/dist/messages/en/save.d.ts +15 -0
  184. package/dist/messages/en/save.d.ts.map +1 -0
  185. package/dist/messages/en/save.js +14 -0
  186. package/dist/messages/en/shortcut.d.ts +36 -0
  187. package/dist/messages/en/shortcut.d.ts.map +1 -0
  188. package/dist/messages/en/shortcut.js +35 -0
  189. package/dist/messages/en/statusBar.d.ts +14 -0
  190. package/dist/messages/en/statusBar.d.ts.map +1 -0
  191. package/dist/messages/en/statusBar.js +13 -0
  192. package/dist/messages/en/structure.d.ts +28 -0
  193. package/dist/messages/en/structure.d.ts.map +1 -0
  194. package/dist/messages/en/structure.js +27 -0
  195. package/dist/messages/en/style.d.ts +168 -0
  196. package/dist/messages/en/style.d.ts.map +1 -0
  197. package/dist/messages/en/style.js +167 -0
  198. package/dist/messages/en/styleField.d.ts +301 -0
  199. package/dist/messages/en/styleField.d.ts.map +1 -0
  200. package/dist/messages/en/styleField.js +300 -0
  201. package/dist/messages/en/styleOption.d.ts +128 -0
  202. package/dist/messages/en/styleOption.d.ts.map +1 -0
  203. package/dist/messages/en/styleOption.js +127 -0
  204. package/dist/messages/en/styleSection.d.ts +16 -0
  205. package/dist/messages/en/styleSection.d.ts.map +1 -0
  206. package/dist/messages/en/styleSection.js +15 -0
  207. package/dist/messages/en/toast.d.ts +22 -0
  208. package/dist/messages/en/toast.d.ts.map +1 -0
  209. package/dist/messages/en/toast.js +21 -0
  210. package/dist/messages/en/toolbar.d.ts +47 -0
  211. package/dist/messages/en/toolbar.d.ts.map +1 -0
  212. package/dist/messages/en/toolbar.js +46 -0
  213. package/dist/messages/en/translation.d.ts +7 -0
  214. package/dist/messages/en/translation.d.ts.map +1 -0
  215. package/dist/messages/en/translation.js +6 -0
  216. package/dist/messages/en/ui.d.ts +4 -0
  217. package/dist/messages/en/ui.d.ts.map +1 -0
  218. package/dist/messages/en/ui.js +3 -0
  219. package/dist/messages/en/values.d.ts +45 -0
  220. package/dist/messages/en/values.d.ts.map +1 -0
  221. package/dist/messages/en/values.js +44 -0
  222. package/dist/messages/en.d.ts +1298 -202
  223. package/dist/messages/en.d.ts.map +1 -1
  224. package/dist/messages/en.js +82 -330
  225. package/dist/messages/index.d.ts +12 -0
  226. package/dist/messages/index.d.ts.map +1 -1
  227. package/dist/messages/index.js +28 -1
  228. package/dist/messages/pl/app.d.ts +8 -0
  229. package/dist/messages/pl/app.d.ts.map +1 -0
  230. package/dist/messages/pl/app.js +7 -0
  231. package/dist/messages/pl/blocks.d.ts +54 -0
  232. package/dist/messages/pl/blocks.d.ts.map +1 -0
  233. package/dist/messages/pl/blocks.js +53 -0
  234. package/dist/messages/pl/canvas.d.ts +31 -0
  235. package/dist/messages/pl/canvas.d.ts.map +1 -0
  236. package/dist/messages/pl/canvas.js +30 -0
  237. package/dist/messages/pl/clipboard.d.ts +13 -0
  238. package/dist/messages/pl/clipboard.d.ts.map +1 -0
  239. package/dist/messages/pl/clipboard.js +12 -0
  240. package/dist/messages/pl/colorPicker.d.ts +20 -0
  241. package/dist/messages/pl/colorPicker.d.ts.map +1 -0
  242. package/dist/messages/pl/colorPicker.js +19 -0
  243. package/dist/messages/pl/componentLabels.d.ts +9 -0
  244. package/dist/messages/pl/componentLabels.d.ts.map +1 -0
  245. package/dist/messages/pl/componentLabels.js +308 -0
  246. package/dist/messages/pl/diagnostics.d.ts +39 -0
  247. package/dist/messages/pl/diagnostics.d.ts.map +1 -0
  248. package/dist/messages/pl/diagnostics.js +38 -0
  249. package/dist/messages/pl/dialogs/common.d.ts +6 -0
  250. package/dist/messages/pl/dialogs/common.d.ts.map +1 -0
  251. package/dist/messages/pl/dialogs/common.js +5 -0
  252. package/dist/messages/pl/dialogs/conflict.d.ts +15 -0
  253. package/dist/messages/pl/dialogs/conflict.d.ts.map +1 -0
  254. package/dist/messages/pl/dialogs/conflict.js +14 -0
  255. package/dist/messages/pl/dialogs/delete.d.ts +19 -0
  256. package/dist/messages/pl/dialogs/delete.d.ts.map +1 -0
  257. package/dist/messages/pl/dialogs/delete.js +18 -0
  258. package/dist/messages/pl/dialogs/pageOptions.d.ts +9 -0
  259. package/dist/messages/pl/dialogs/pageOptions.d.ts.map +1 -0
  260. package/dist/messages/pl/dialogs/pageOptions.js +8 -0
  261. package/dist/messages/pl/dialogs/publish.d.ts +15 -0
  262. package/dist/messages/pl/dialogs/publish.d.ts.map +1 -0
  263. package/dist/messages/pl/dialogs/publish.js +14 -0
  264. package/dist/messages/pl/dnd.d.ts +19 -0
  265. package/dist/messages/pl/dnd.d.ts.map +1 -0
  266. package/dist/messages/pl/dnd.js +18 -0
  267. package/dist/messages/pl/editor.d.ts +30 -0
  268. package/dist/messages/pl/editor.d.ts.map +1 -0
  269. package/dist/messages/pl/editor.js +29 -0
  270. package/dist/messages/pl/external.d.ts +6 -0
  271. package/dist/messages/pl/external.d.ts.map +1 -0
  272. package/dist/messages/pl/external.js +5 -0
  273. package/dist/messages/pl/insert.d.ts +25 -0
  274. package/dist/messages/pl/insert.d.ts.map +1 -0
  275. package/dist/messages/pl/insert.js +24 -0
  276. package/dist/messages/pl/inspector.d.ts +176 -0
  277. package/dist/messages/pl/inspector.d.ts.map +1 -0
  278. package/dist/messages/pl/inspector.js +175 -0
  279. package/dist/messages/pl/issues.d.ts +36 -0
  280. package/dist/messages/pl/issues.d.ts.map +1 -0
  281. package/dist/messages/pl/issues.js +35 -0
  282. package/dist/messages/pl/layers.d.ts +29 -0
  283. package/dist/messages/pl/layers.d.ts.map +1 -0
  284. package/dist/messages/pl/layers.js +28 -0
  285. package/dist/messages/pl/leftPanel.d.ts +15 -0
  286. package/dist/messages/pl/leftPanel.d.ts.map +1 -0
  287. package/dist/messages/pl/leftPanel.js +14 -0
  288. package/dist/messages/pl/list.d.ts +9 -0
  289. package/dist/messages/pl/list.d.ts.map +1 -0
  290. package/dist/messages/pl/list.js +8 -0
  291. package/dist/messages/pl/locale.d.ts +4 -0
  292. package/dist/messages/pl/locale.d.ts.map +1 -0
  293. package/dist/messages/pl/locale.js +3 -0
  294. package/dist/messages/pl/media.d.ts +51 -0
  295. package/dist/messages/pl/media.d.ts.map +1 -0
  296. package/dist/messages/pl/media.js +50 -0
  297. package/dist/messages/pl/menu.d.ts +12 -0
  298. package/dist/messages/pl/menu.d.ts.map +1 -0
  299. package/dist/messages/pl/menu.js +11 -0
  300. package/dist/messages/pl/patterns.d.ts +24 -0
  301. package/dist/messages/pl/patterns.d.ts.map +1 -0
  302. package/dist/messages/pl/patterns.js +23 -0
  303. package/dist/messages/pl/preview.d.ts +8 -0
  304. package/dist/messages/pl/preview.d.ts.map +1 -0
  305. package/dist/messages/pl/preview.js +7 -0
  306. package/dist/messages/pl/publish.d.ts +19 -0
  307. package/dist/messages/pl/publish.d.ts.map +1 -0
  308. package/dist/messages/pl/publish.js +18 -0
  309. package/dist/messages/pl/richText.d.ts +21 -0
  310. package/dist/messages/pl/richText.d.ts.map +1 -0
  311. package/dist/messages/pl/richText.js +20 -0
  312. package/dist/messages/pl/sample.d.ts +5 -0
  313. package/dist/messages/pl/sample.d.ts.map +1 -0
  314. package/dist/messages/pl/sample.js +4 -0
  315. package/dist/messages/pl/save.d.ts +15 -0
  316. package/dist/messages/pl/save.d.ts.map +1 -0
  317. package/dist/messages/pl/save.js +14 -0
  318. package/dist/messages/pl/shortcut.d.ts +36 -0
  319. package/dist/messages/pl/shortcut.d.ts.map +1 -0
  320. package/dist/messages/pl/shortcut.js +35 -0
  321. package/dist/messages/pl/statusBar.d.ts +14 -0
  322. package/dist/messages/pl/statusBar.d.ts.map +1 -0
  323. package/dist/messages/pl/statusBar.js +13 -0
  324. package/dist/messages/pl/structure.d.ts +28 -0
  325. package/dist/messages/pl/structure.d.ts.map +1 -0
  326. package/dist/messages/pl/structure.js +27 -0
  327. package/dist/messages/pl/style.d.ts +168 -0
  328. package/dist/messages/pl/style.d.ts.map +1 -0
  329. package/dist/messages/pl/style.js +167 -0
  330. package/dist/messages/pl/styleField.d.ts +301 -0
  331. package/dist/messages/pl/styleField.d.ts.map +1 -0
  332. package/dist/messages/pl/styleField.js +300 -0
  333. package/dist/messages/pl/styleOption.d.ts +128 -0
  334. package/dist/messages/pl/styleOption.d.ts.map +1 -0
  335. package/dist/messages/pl/styleOption.js +127 -0
  336. package/dist/messages/pl/styleSection.d.ts +16 -0
  337. package/dist/messages/pl/styleSection.d.ts.map +1 -0
  338. package/dist/messages/pl/styleSection.js +15 -0
  339. package/dist/messages/pl/toast.d.ts +22 -0
  340. package/dist/messages/pl/toast.d.ts.map +1 -0
  341. package/dist/messages/pl/toast.js +21 -0
  342. package/dist/messages/pl/toolbar.d.ts +47 -0
  343. package/dist/messages/pl/toolbar.d.ts.map +1 -0
  344. package/dist/messages/pl/toolbar.js +46 -0
  345. package/dist/messages/pl/translation.d.ts +7 -0
  346. package/dist/messages/pl/translation.d.ts.map +1 -0
  347. package/dist/messages/pl/translation.js +6 -0
  348. package/dist/messages/pl/ui.d.ts +4 -0
  349. package/dist/messages/pl/ui.d.ts.map +1 -0
  350. package/dist/messages/pl/ui.js +3 -0
  351. package/dist/messages/pl/values.d.ts +45 -0
  352. package/dist/messages/pl/values.d.ts.map +1 -0
  353. package/dist/messages/pl/values.js +44 -0
  354. package/dist/messages/pl.d.ts.map +1 -1
  355. package/dist/messages/pl.js +82 -325
  356. package/dist/messages/plural.test.d.ts +2 -0
  357. package/dist/messages/plural.test.d.ts.map +1 -0
  358. package/dist/messages/plural.test.js +50 -0
  359. package/dist/panels/breadcrumbs/breadcrumbs.d.ts +1 -1
  360. package/dist/panels/breadcrumbs/breadcrumbs.d.ts.map +1 -1
  361. package/dist/panels/breadcrumbs/breadcrumbs.js +10 -3
  362. package/dist/panels/breadcrumbs/breadcrumbs.test.js +9 -2
  363. package/dist/panels/index.d.ts +3 -0
  364. package/dist/panels/index.d.ts.map +1 -1
  365. package/dist/panels/index.js +1 -0
  366. package/dist/panels/insert/catalog.d.ts +21 -1
  367. package/dist/panels/insert/catalog.d.ts.map +1 -1
  368. package/dist/panels/insert/catalog.js +85 -3
  369. package/dist/panels/insert/catalog.order.test.js +106 -1
  370. package/dist/panels/insert/index.d.ts +1 -0
  371. package/dist/panels/insert/index.d.ts.map +1 -1
  372. package/dist/panels/insert/insert-panel.d.ts +14 -4
  373. package/dist/panels/insert/insert-panel.d.ts.map +1 -1
  374. package/dist/panels/insert/insert-panel.js +128 -69
  375. package/dist/panels/insert/insert-panel.test.js +278 -37
  376. package/dist/panels/insert/target.d.ts +5 -1
  377. package/dist/panels/insert/target.d.ts.map +1 -1
  378. package/dist/panels/insert/target.js +11 -1
  379. package/dist/panels/inspector/author-fields.d.ts +21 -0
  380. package/dist/panels/inspector/author-fields.d.ts.map +1 -0
  381. package/dist/panels/inspector/author-fields.js +191 -0
  382. package/dist/panels/inspector/author-fields.test.d.ts +2 -0
  383. package/dist/panels/inspector/author-fields.test.d.ts.map +1 -0
  384. package/dist/panels/inspector/author-fields.test.js +237 -0
  385. package/dist/panels/inspector/controls/external-link.d.ts +24 -0
  386. package/dist/panels/inspector/controls/external-link.d.ts.map +1 -0
  387. package/dist/panels/inspector/controls/external-link.js +43 -0
  388. package/dist/panels/inspector/controls/external-link.test.d.ts +2 -0
  389. package/dist/panels/inspector/controls/external-link.test.d.ts.map +1 -0
  390. package/dist/panels/inspector/controls/external-link.test.js +105 -0
  391. package/dist/panels/inspector/controls/index.d.ts +1 -0
  392. package/dist/panels/inspector/controls/index.d.ts.map +1 -1
  393. package/dist/panels/inspector/controls/index.js +1 -0
  394. package/dist/panels/inspector/controls/media.d.ts +3 -1
  395. package/dist/panels/inspector/controls/media.d.ts.map +1 -1
  396. package/dist/panels/inspector/controls/media.js +8 -3
  397. package/dist/panels/inspector/controls/rich-text.d.ts.map +1 -1
  398. package/dist/panels/inspector/controls/rich-text.js +36 -6
  399. package/dist/panels/inspector/controls/textarea.d.ts +7 -2
  400. package/dist/panels/inspector/controls/textarea.d.ts.map +1 -1
  401. package/dist/panels/inspector/controls/textarea.js +37 -2
  402. package/dist/panels/inspector/default-hint.d.ts +13 -0
  403. package/dist/panels/inspector/default-hint.d.ts.map +1 -0
  404. package/dist/panels/inspector/default-hint.js +30 -0
  405. package/dist/panels/inspector/default-hint.test.d.ts +2 -0
  406. package/dist/panels/inspector/default-hint.test.d.ts.map +1 -0
  407. package/dist/panels/inspector/default-hint.test.js +46 -0
  408. package/dist/panels/inspector/index.d.ts +3 -3
  409. package/dist/panels/inspector/index.d.ts.map +1 -1
  410. package/dist/panels/inspector/index.js +2 -2
  411. package/dist/panels/inspector/inspector.d.ts +20 -2
  412. package/dist/panels/inspector/inspector.d.ts.map +1 -1
  413. package/dist/panels/inspector/inspector.js +246 -26
  414. package/dist/panels/inspector/inspector.test.js +276 -11
  415. package/dist/panels/inspector/props-panel.d.ts +36 -0
  416. package/dist/panels/inspector/props-panel.d.ts.map +1 -1
  417. package/dist/panels/inspector/props-panel.js +99 -17
  418. package/dist/panels/inspector/props-panel.test.d.ts +2 -0
  419. package/dist/panels/inspector/props-panel.test.d.ts.map +1 -0
  420. package/dist/panels/inspector/props-panel.test.js +17 -0
  421. package/dist/panels/inspector/scrub-label.d.ts +14 -0
  422. package/dist/panels/inspector/scrub-label.d.ts.map +1 -0
  423. package/dist/panels/inspector/scrub-label.js +75 -0
  424. package/dist/panels/inspector/scrub-label.test.d.ts +2 -0
  425. package/dist/panels/inspector/scrub-label.test.d.ts.map +1 -0
  426. package/dist/panels/inspector/scrub-label.test.js +132 -0
  427. package/dist/panels/inspector/styles/background-media.d.ts +28 -0
  428. package/dist/panels/inspector/styles/background-media.d.ts.map +1 -0
  429. package/dist/panels/inspector/styles/background-media.js +78 -0
  430. package/dist/panels/inspector/styles/box-model.d.ts +13 -16
  431. package/dist/panels/inspector/styles/box-model.d.ts.map +1 -1
  432. package/dist/panels/inspector/styles/box-model.js +10 -25
  433. package/dist/panels/inspector/styles/color-input.d.ts +3 -0
  434. package/dist/panels/inspector/styles/color-input.d.ts.map +1 -0
  435. package/dist/panels/inspector/styles/color-input.js +72 -0
  436. package/dist/panels/inspector/styles/gradient-fields.d.ts +9 -0
  437. package/dist/panels/inspector/styles/gradient-fields.d.ts.map +1 -0
  438. package/dist/panels/inspector/styles/gradient-fields.js +50 -0
  439. package/dist/panels/inspector/styles/index.d.ts +2 -0
  440. package/dist/panels/inspector/styles/index.d.ts.map +1 -1
  441. package/dist/panels/inspector/styles/index.js +2 -0
  442. package/dist/panels/inspector/styles/model.d.ts +27 -5
  443. package/dist/panels/inspector/styles/model.d.ts.map +1 -1
  444. package/dist/panels/inspector/styles/model.js +101 -3
  445. package/dist/panels/inspector/styles/motion-rows.d.ts +17 -0
  446. package/dist/panels/inspector/styles/motion-rows.d.ts.map +1 -0
  447. package/dist/panels/inspector/styles/motion-rows.js +117 -0
  448. package/dist/panels/inspector/styles/number-input.d.ts +4 -0
  449. package/dist/panels/inspector/styles/number-input.d.ts.map +1 -0
  450. package/dist/panels/inspector/styles/number-input.js +12 -0
  451. package/dist/panels/inspector/styles/option-label.d.ts +7 -0
  452. package/dist/panels/inspector/styles/option-label.d.ts.map +1 -0
  453. package/dist/panels/inspector/styles/option-label.js +9 -0
  454. package/dist/panels/inspector/styles/property-label.d.ts +9 -0
  455. package/dist/panels/inspector/styles/property-label.d.ts.map +1 -0
  456. package/dist/panels/inspector/styles/property-label.js +11 -0
  457. package/dist/panels/inspector/styles/section-state.d.ts +22 -0
  458. package/dist/panels/inspector/styles/section-state.d.ts.map +1 -0
  459. package/dist/panels/inspector/styles/section-state.js +96 -0
  460. package/dist/panels/inspector/styles/section.d.ts +25 -0
  461. package/dist/panels/inspector/styles/section.d.ts.map +1 -0
  462. package/dist/panels/inspector/styles/section.js +43 -0
  463. package/dist/panels/inspector/styles/sections-context.d.ts +13 -0
  464. package/dist/panels/inspector/styles/sections-context.d.ts.map +1 -0
  465. package/dist/panels/inspector/styles/sections-context.js +19 -0
  466. package/dist/panels/inspector/styles/sections-context.test.d.ts +2 -0
  467. package/dist/panels/inspector/styles/sections-context.test.d.ts.map +1 -0
  468. package/dist/panels/inspector/styles/sections-context.test.js +18 -0
  469. package/dist/panels/inspector/styles/sections-toggle.d.ts +6 -0
  470. package/dist/panels/inspector/styles/sections-toggle.d.ts.map +1 -0
  471. package/dist/panels/inspector/styles/sections-toggle.js +18 -0
  472. package/dist/panels/inspector/styles/segments.d.ts +3 -0
  473. package/dist/panels/inspector/styles/segments.d.ts.map +1 -1
  474. package/dist/panels/inspector/styles/segments.js +11 -4
  475. package/dist/panels/inspector/styles/sides-editor.d.ts +1 -1
  476. package/dist/panels/inspector/styles/sides-editor.d.ts.map +1 -1
  477. package/dist/panels/inspector/styles/sides-editor.js +33 -4
  478. package/dist/panels/inspector/styles/style-inspector.d.ts +3 -1
  479. package/dist/panels/inspector/styles/style-inspector.d.ts.map +1 -1
  480. package/dist/panels/inspector/styles/style-inspector.js +610 -42
  481. package/dist/panels/inspector/styles/style-inspector.test.js +694 -14
  482. package/dist/panels/inspector/styles/token-picker.d.ts +1 -1
  483. package/dist/panels/inspector/styles/token-picker.d.ts.map +1 -1
  484. package/dist/panels/inspector/styles/token-picker.js +10 -3
  485. package/dist/panels/inspector/styles/widgets.d.ts +116 -0
  486. package/dist/panels/inspector/styles/widgets.d.ts.map +1 -0
  487. package/dist/panels/inspector/styles/widgets.js +304 -0
  488. package/dist/panels/inspector/styles/widgets.test.d.ts +2 -0
  489. package/dist/panels/inspector/styles/widgets.test.d.ts.map +1 -0
  490. package/dist/panels/inspector/styles/widgets.test.js +247 -0
  491. package/dist/panels/inspector/values/value-editor.d.ts +1 -1
  492. package/dist/panels/inspector/values/value-editor.d.ts.map +1 -1
  493. package/dist/panels/inspector/values/value-editor.js +9 -8
  494. package/dist/panels/inspector/values/values.test.js +9 -3
  495. package/dist/panels/issues/collect.d.ts +2 -0
  496. package/dist/panels/issues/collect.d.ts.map +1 -1
  497. package/dist/panels/issues/collect.js +1 -0
  498. package/dist/panels/issues/index.d.ts +1 -0
  499. package/dist/panels/issues/index.d.ts.map +1 -1
  500. package/dist/panels/issues/index.js +1 -0
  501. package/dist/panels/issues/issues-panel.d.ts +4 -3
  502. package/dist/panels/issues/issues-panel.d.ts.map +1 -1
  503. package/dist/panels/issues/issues-panel.js +22 -35
  504. package/dist/panels/issues/path.d.ts +7 -0
  505. package/dist/panels/issues/path.d.ts.map +1 -0
  506. package/dist/panels/issues/path.js +21 -0
  507. package/dist/panels/layers/flatten.d.ts +16 -2
  508. package/dist/panels/layers/flatten.d.ts.map +1 -1
  509. package/dist/panels/layers/flatten.js +48 -4
  510. package/dist/panels/layers/layers-panel.d.ts +5 -2
  511. package/dist/panels/layers/layers-panel.d.ts.map +1 -1
  512. package/dist/panels/layers/layers-panel.js +177 -35
  513. package/dist/panels/layers/layers-panel.test.js +173 -15
  514. package/dist/panels/left-panel.d.ts +17 -0
  515. package/dist/panels/left-panel.d.ts.map +1 -0
  516. package/dist/panels/left-panel.js +47 -0
  517. package/dist/panels/left-panel.test.d.ts +2 -0
  518. package/dist/panels/left-panel.test.d.ts.map +1 -0
  519. package/dist/panels/left-panel.test.js +77 -0
  520. package/dist/persistence/persistence.test.js +9 -3
  521. package/dist/persistence/react.d.ts.map +1 -1
  522. package/dist/persistence/react.js +2 -2
  523. package/dist/preview/preview.d.ts +8 -0
  524. package/dist/preview/preview.d.ts.map +1 -1
  525. package/dist/preview/preview.js +21 -1
  526. package/dist/preview/preview.test.js +18 -1
  527. package/dist/shortcuts/actions.d.ts +13 -2
  528. package/dist/shortcuts/actions.d.ts.map +1 -1
  529. package/dist/shortcuts/actions.js +70 -15
  530. package/dist/shortcuts/help.d.ts +11 -0
  531. package/dist/shortcuts/help.d.ts.map +1 -0
  532. package/dist/shortcuts/help.js +77 -0
  533. package/dist/shortcuts/index.d.ts +5 -2
  534. package/dist/shortcuts/index.d.ts.map +1 -1
  535. package/dist/shortcuts/index.js +3 -1
  536. package/dist/shortcuts/map.d.ts +1 -1
  537. package/dist/shortcuts/map.d.ts.map +1 -1
  538. package/dist/shortcuts/map.js +14 -8
  539. package/dist/shortcuts/navigation.d.ts +13 -0
  540. package/dist/shortcuts/navigation.d.ts.map +1 -0
  541. package/dist/shortcuts/navigation.js +48 -0
  542. package/dist/shortcuts/shortcuts.d.ts +12 -1
  543. package/dist/shortcuts/shortcuts.d.ts.map +1 -1
  544. package/dist/shortcuts/shortcuts.js +61 -14
  545. package/dist/shortcuts/shortcuts.test.js +206 -5
  546. package/dist/store/create-store.d.ts.map +1 -1
  547. package/dist/store/create-store.js +19 -1
  548. package/dist/store/index.d.ts +4 -1
  549. package/dist/store/index.d.ts.map +1 -1
  550. package/dist/store/index.js +3 -1
  551. package/dist/store/react.d.ts +4 -0
  552. package/dist/store/react.d.ts.map +1 -1
  553. package/dist/store/react.js +7 -0
  554. package/dist/store/store.test.js +24 -0
  555. package/dist/store/structure-lock.d.ts +16 -0
  556. package/dist/store/structure-lock.d.ts.map +1 -0
  557. package/dist/store/structure-lock.js +43 -0
  558. package/dist/store/structure-lock.test.d.ts +2 -0
  559. package/dist/store/structure-lock.test.d.ts.map +1 -0
  560. package/dist/store/structure-lock.test.js +49 -0
  561. package/dist/store/types.d.ts +9 -0
  562. package/dist/store/types.d.ts.map +1 -1
  563. package/dist/store/view.d.ts +20 -0
  564. package/dist/store/view.d.ts.map +1 -0
  565. package/dist/store/view.js +17 -0
  566. package/dist/store/view.test.d.ts +2 -0
  567. package/dist/store/view.test.d.ts.map +1 -0
  568. package/dist/store/view.test.js +103 -0
  569. package/dist/styles/tokens.test.js +88 -9
  570. package/dist/styles.css +4112 -586
  571. package/dist/toolbar/brand.d.ts +2 -2
  572. package/dist/toolbar/brand.d.ts.map +1 -1
  573. package/dist/toolbar/brand.js +4 -4
  574. package/dist/toolbar/breakpoint-control.d.ts +4 -0
  575. package/dist/toolbar/breakpoint-control.d.ts.map +1 -1
  576. package/dist/toolbar/breakpoint-control.js +11 -4
  577. package/dist/toolbar/editable-title.d.ts +4 -1
  578. package/dist/toolbar/editable-title.d.ts.map +1 -1
  579. package/dist/toolbar/editable-title.js +2 -2
  580. package/dist/toolbar/editable-title.test.js +10 -0
  581. package/dist/toolbar/locale-chip.d.ts +10 -0
  582. package/dist/toolbar/locale-chip.d.ts.map +1 -0
  583. package/dist/toolbar/locale-chip.js +27 -0
  584. package/dist/toolbar/locale-switcher.d.ts.map +1 -1
  585. package/dist/toolbar/locale-switcher.js +4 -1
  586. package/dist/toolbar/more-menu.d.ts +26 -4
  587. package/dist/toolbar/more-menu.d.ts.map +1 -1
  588. package/dist/toolbar/more-menu.js +60 -13
  589. package/dist/toolbar/page-chip.d.ts +10 -0
  590. package/dist/toolbar/page-chip.d.ts.map +1 -0
  591. package/dist/toolbar/page-chip.js +12 -0
  592. package/dist/toolbar/page-options-dialog.d.ts +16 -0
  593. package/dist/toolbar/page-options-dialog.d.ts.map +1 -0
  594. package/dist/toolbar/page-options-dialog.js +13 -0
  595. package/dist/toolbar/panel-toggles.d.ts +3 -2
  596. package/dist/toolbar/panel-toggles.d.ts.map +1 -1
  597. package/dist/toolbar/panel-toggles.js +9 -4
  598. package/dist/toolbar/publish-dialog.d.ts +3 -0
  599. package/dist/toolbar/publish-dialog.d.ts.map +1 -1
  600. package/dist/toolbar/publish-dialog.js +34 -7
  601. package/dist/toolbar/publish.test.js +63 -19
  602. package/dist/toolbar/safe-history.d.ts +3 -0
  603. package/dist/toolbar/safe-history.d.ts.map +1 -0
  604. package/dist/toolbar/safe-history.js +5 -0
  605. package/dist/toolbar/sample-picker.d.ts +24 -4
  606. package/dist/toolbar/sample-picker.d.ts.map +1 -1
  607. package/dist/toolbar/sample-picker.js +42 -18
  608. package/dist/toolbar/toolbar-centre.d.ts +3 -11
  609. package/dist/toolbar/toolbar-centre.d.ts.map +1 -1
  610. package/dist/toolbar/toolbar-centre.js +4 -5
  611. package/dist/toolbar/toolbar-left.d.ts +4 -7
  612. package/dist/toolbar/toolbar-left.d.ts.map +1 -1
  613. package/dist/toolbar/toolbar-left.js +13 -11
  614. package/dist/toolbar/toolbar-right.d.ts +21 -6
  615. package/dist/toolbar/toolbar-right.d.ts.map +1 -1
  616. package/dist/toolbar/toolbar-right.js +28 -14
  617. package/dist/toolbar/toolbar.d.ts +23 -17
  618. package/dist/toolbar/toolbar.d.ts.map +1 -1
  619. package/dist/toolbar/toolbar.js +28 -11
  620. package/dist/toolbar/toolbar.test.js +238 -23
  621. package/dist/toolbar/use-overflow-level.d.ts +2 -1
  622. package/dist/toolbar/use-overflow-level.d.ts.map +1 -1
  623. package/dist/toolbar/use-overflow-level.js +9 -3
  624. package/dist/toolbar/zoom-menu.d.ts +5 -1
  625. package/dist/toolbar/zoom-menu.d.ts.map +1 -1
  626. package/dist/toolbar/zoom-menu.js +3 -2
  627. package/dist/ui/icon.d.ts +53 -0
  628. package/dist/ui/icon.d.ts.map +1 -1
  629. package/dist/ui/icon.js +58 -1
  630. package/dist/ui/icon.test.js +101 -3
  631. package/dist/ui/index.d.ts +4 -3
  632. package/dist/ui/index.d.ts.map +1 -1
  633. package/dist/ui/index.js +3 -2
  634. package/dist/ui/primitives.d.ts +97 -14
  635. package/dist/ui/primitives.d.ts.map +1 -1
  636. package/dist/ui/primitives.js +108 -22
  637. package/dist/ui/primitives.test.js +204 -3
  638. package/dist/ui/structure-locked.d.ts +9 -0
  639. package/dist/ui/structure-locked.d.ts.map +1 -0
  640. package/dist/ui/structure-locked.js +28 -0
  641. package/dist/ui/toast.d.ts +3 -1
  642. package/dist/ui/toast.d.ts.map +1 -1
  643. package/dist/ui/toast.js +21 -5
  644. package/dist/ui/toast.test.js +34 -0
  645. package/package.json +5 -4
@@ -1,14 +1,25 @@
1
1
  import { createIndex } from '@next-buildr/core';
2
+ import { structureLockedIds } from '../store/index.js';
3
+ import { hasDescendants, overlayOpen, parentSelection } from './navigation.js';
2
4
  /** The selected nodes that can be acted on: the root is never removed, duplicated or moved. */
3
5
  function actionable(store) {
4
6
  const { doc, selectedIds } = store.getState();
5
7
  return selectedIds.filter((id) => id !== doc.root && Object.hasOwn(doc.nodes, id));
6
8
  }
7
- function moveSelected(store, delta) {
9
+ /** True (after saying why) when one of the ids is locked for structure: the key is then taken but nothing changes. */
10
+ function refuseLocked(store, ids, notify) {
11
+ if (structureLockedIds(store.getState().doc, ids).length === 0)
12
+ return false;
13
+ notify?.(ids);
14
+ return true;
15
+ }
16
+ function moveSelected(store, delta, notify) {
8
17
  const ids = actionable(store);
9
18
  const [id] = ids;
10
19
  if (ids.length !== 1 || id === undefined)
11
20
  return false;
21
+ if (refuseLocked(store, ids, notify))
22
+ return true;
12
23
  const { doc } = store.getState();
13
24
  const index = createIndex(doc);
14
25
  const parentId = index.parentOf[id];
@@ -46,27 +57,71 @@ function selectAll(store) {
46
57
  * cannot run (nothing selected, a locked node the command refuses) returns `false`, so the key is
47
58
  * not swallowed.
48
59
  */
49
- export function bindEditorActions(registry, store, external = {}) {
60
+ export function bindEditorActions(registry, store, external = {}, host = {}) {
61
+ /**
62
+ * Every shortcut but Escape is left alone while a menu, list or dialog is open: the key belongs to
63
+ * it (Delete must not remove the node behind a dialog, Ctrl+Z is a text field's own undo).
64
+ */
65
+ const bind = (action, handler) => registry.bind(action, () => (overlayOpen() ? false : handler()));
66
+ /** A UI-only key: not taken (`false`) outside the editor or when the host gave no callback. */
67
+ const ui = (pick) => () => {
68
+ if (host.uiAllowed?.() === false)
69
+ return false;
70
+ const run = pick(host.callbacks?.() ?? {});
71
+ if (run === undefined)
72
+ return false;
73
+ run();
74
+ return true;
75
+ };
76
+ const locked = (ids) => host.onLocked?.()?.(ids);
77
+ const device = (key) => ui((callbacks) => callbacks.setDevice && (() => callbacks.setDevice?.(key)));
50
78
  const stops = [
51
- registry.bind('edit.undo', () => store.undo().ok),
52
- registry.bind('edit.redo', () => store.redo().ok),
53
- registry.bind('edit.duplicate', () => {
79
+ bind('edit.undo', () => store.undo().ok),
80
+ bind('edit.redo', () => store.redo().ok),
81
+ bind('edit.duplicate', () => {
54
82
  const ids = actionable(store);
55
- return ids.length > 0 && store.dispatch({ type: 'node.duplicate', payload: { ids } }).ok;
83
+ if (ids.length === 0)
84
+ return false;
85
+ if (refuseLocked(store, ids, locked))
86
+ return true;
87
+ return store.dispatch({ type: 'node.duplicate', payload: { ids } }).ok;
56
88
  }),
57
- registry.bind('edit.delete', () => {
89
+ bind('edit.delete', () => {
58
90
  const ids = actionable(store);
59
- return ids.length > 0 && store.dispatch({ type: 'node.remove', payload: { ids } }).ok;
91
+ if (ids.length === 0)
92
+ return false;
93
+ if (refuseLocked(store, ids, locked))
94
+ return true;
95
+ const onRemove = host.onRemove?.();
96
+ if (onRemove !== undefined) {
97
+ onRemove({ ids, hasDescendants: hasDescendants(store.getState().doc, ids) });
98
+ return true;
99
+ }
100
+ return store.dispatch({ type: 'node.remove', payload: { ids } }).ok;
60
101
  }),
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)
102
+ bind('node.moveUp', () => moveSelected(store, -1, locked)),
103
+ bind('node.moveDown', () => moveSelected(store, 1, locked)),
104
+ bind('selection.all', () => selectAll(store)),
105
+ // Escape goes up one level and clears at the top level; an open menu or dialog gets it first.
106
+ bind('selection.clear', () => {
107
+ if (overlayOpen())
108
+ return false;
109
+ const { doc, selectedIds } = store.getState();
110
+ if (selectedIds.length === 0)
66
111
  return false;
67
- store.clearSelection();
112
+ const parent = parentSelection(doc, selectedIds);
113
+ if (parent === null)
114
+ store.clearSelection();
115
+ else
116
+ store.select(parent);
68
117
  return true;
69
118
  }),
119
+ bind('ui.device1', device('1')),
120
+ bind('ui.device2', device('2')),
121
+ bind('ui.device3', device('3')),
122
+ bind('ui.panels', ui((callbacks) => callbacks.togglePanels && (() => callbacks.togglePanels?.()))),
123
+ bind('ui.guides', ui((callbacks) => callbacks.toggleGuides ?? store.view.getState().toggleOutlines)),
124
+ bind('ui.findBlock', ui((callbacks) => callbacks.focusBlockSearch && (() => callbacks.focusBlockSearch?.()))),
70
125
  ];
71
126
  const optional = {
72
127
  'edit.copy': external.copy,
@@ -76,7 +131,7 @@ export function bindEditorActions(registry, store, external = {}) {
76
131
  };
77
132
  for (const [action, handler] of Object.entries(optional)) {
78
133
  if (handler !== undefined)
79
- stops.push(registry.bind(action, handler));
134
+ stops.push(bind(action, handler));
80
135
  }
81
136
  return () => {
82
137
  for (const stop of stops)
@@ -0,0 +1,11 @@
1
+ import { type Platform } from './keys.ts';
2
+ import type { ShortcutRegistry } from './registry.ts';
3
+ export interface ShortcutsDialogProps {
4
+ readonly open: boolean;
5
+ readonly onOpenChange: (open: boolean) => void;
6
+ readonly registry: ShortcutRegistry;
7
+ readonly platform: Platform;
8
+ }
9
+ /** The shortcuts dialog (`?`): four groups of rows, one `Kbd` per key, and the note for Mac users. */
10
+ export declare function ShortcutsDialog({ open, onOpenChange, registry, platform }: ShortcutsDialogProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/shortcuts/help.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAqFtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,+BAgC/F"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useT } from '../messages/index.js';
3
+ import { Dialog, Kbd } from '../ui/index.js';
4
+ import { displayCombo } from './keys.js';
5
+ /** The tokens of an action's first combination; `shift` is dropped before `?`, which already implies it. */
6
+ function tokensOf(registry, action) {
7
+ const combo = registry.keysFor(action)[0];
8
+ if (combo === undefined)
9
+ return undefined;
10
+ const parts = combo.split('+');
11
+ return parts.at(-1) === '?' ? ['?'] : parts;
12
+ }
13
+ /** The rows of the help dialog, from the registry (so overrides show) plus the canvas-only keys. */
14
+ function helpGroups(registry) {
15
+ const row = (label, ...actions) => {
16
+ const groups = actions.map((action) => tokensOf(registry, action));
17
+ return groups.every((group) => group !== undefined)
18
+ ? { label, groups: groups }
19
+ : undefined;
20
+ };
21
+ const copyPaste = row('shortcut.copyPaste', 'edit.copy', 'edit.paste');
22
+ const device1 = tokensOf(registry, 'ui.device1');
23
+ const device = device1 === undefined
24
+ ? undefined
25
+ : { label: 'shortcut.device', groups: [[...device1, '2', '3']] };
26
+ const defined = (rows) => rows.filter((entry) => entry !== undefined);
27
+ return [
28
+ {
29
+ id: 'general',
30
+ title: 'shortcut.group.general',
31
+ rows: defined([
32
+ row('shortcut.save', 'file.save'),
33
+ row('shortcut.undo', 'edit.undo'),
34
+ row('shortcut.redo', 'edit.redo'),
35
+ row('shortcut.findBlock', 'ui.findBlock'),
36
+ row('shortcut.help', 'help.shortcuts'),
37
+ ]),
38
+ },
39
+ {
40
+ id: 'selection',
41
+ title: 'shortcut.group.selection',
42
+ rows: [
43
+ { label: 'shortcut.selectBlock', groups: [['enter']] },
44
+ ...defined([row('shortcut.selectAll', 'selection.all')]),
45
+ ...defined([row('shortcut.selectParent', 'selection.clear')]),
46
+ { label: 'shortcut.nextBlock', groups: [['tab']] },
47
+ { label: 'shortcut.prevBlock', groups: [['shift', 'tab']] },
48
+ ],
49
+ },
50
+ {
51
+ id: 'edit',
52
+ title: 'shortcut.group.edit',
53
+ rows: defined([
54
+ row('shortcut.duplicate', 'edit.duplicate'),
55
+ row('shortcut.delete', 'edit.delete'),
56
+ copyPaste,
57
+ row('shortcut.cut', 'edit.cut'),
58
+ row('shortcut.moveUp', 'node.moveUp'),
59
+ row('shortcut.moveDown', 'node.moveDown'),
60
+ ]),
61
+ },
62
+ {
63
+ id: 'view',
64
+ title: 'shortcut.group.view',
65
+ rows: defined([
66
+ device,
67
+ row('shortcut.togglePanels', 'ui.panels'),
68
+ row('shortcut.guides', 'ui.guides'),
69
+ ]),
70
+ },
71
+ ];
72
+ }
73
+ /** The shortcuts dialog (`?`): four groups of rows, one `Kbd` per key, and the note for Mac users. */
74
+ export function ShortcutsDialog({ open, onOpenChange, registry, platform }) {
75
+ const t = useT();
76
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, title: t('shortcut.title'), wide: true, children: _jsxs("div", { className: "bd-shortcut-help", children: [helpGroups(registry).map((group) => (_jsxs("section", { children: [_jsx("h3", { children: t(group.title) }), _jsx("dl", { children: group.rows.map((entry) => (_jsxs("div", { className: "bd-shortcut-row", children: [_jsx("dt", { children: t(entry.label) }), _jsx("dd", { children: entry.groups.map((keys, at) => (_jsxs("span", { children: [at > 0 ? ' / ' : '', keys.map((token, index) => (_jsx(Kbd, { children: displayCombo(token, platform) }, `${token}-${index}`)))] }, keys.join('+')))) })] }, entry.label))) })] }, group.id))), _jsx("p", { children: t('shortcut.macNote') })] }) }));
77
+ }
@@ -1,11 +1,14 @@
1
- export type { ExternalActions } from './actions.ts';
1
+ export type { ExternalActions, HostHooks } from './actions.ts';
2
2
  export { bindEditorActions } from './actions.ts';
3
+ export type { ShortcutsDialogProps } from './help.tsx';
4
+ export { ShortcutsDialog } from './help.tsx';
3
5
  export type { KeyInput, Platform } from './keys.ts';
4
6
  export { comboOf, detectPlatform, displayCombo, isTypingTarget, normalizeCombo } from './keys.ts';
5
7
  export type { ShortcutDef } from './map.ts';
6
8
  export { applyOverrides, DEFAULT_SHORTCUTS } from './map.ts';
9
+ export { descendantCount, hasDescendants, overlayOpen, parentSelection } from './navigation.ts';
7
10
  export type { ShortcutHandler, ShortcutRegistry, ShortcutRegistryOptions } from './registry.ts';
8
11
  export { createShortcutRegistry } from './registry.ts';
9
12
  export type { ShortcutProviderProps } from './shortcuts.tsx';
10
- export { ShortcutProvider, useForwardedKeys, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.tsx';
13
+ export { ShortcutProvider, useForwardedKeys, useOpenShortcuts, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.tsx';
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shortcuts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,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,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChG,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,gBAAgB,EAChB,2BAA2B,EAC3B,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
@@ -1,5 +1,7 @@
1
1
  export { bindEditorActions } from './actions.js';
2
+ export { ShortcutsDialog } from './help.js';
2
3
  export { comboOf, detectPlatform, displayCombo, isTypingTarget, normalizeCombo } from './keys.js';
3
4
  export { applyOverrides, DEFAULT_SHORTCUTS } from './map.js';
5
+ export { descendantCount, hasDescendants, overlayOpen, parentSelection } from './navigation.js';
4
6
  export { createShortcutRegistry } from './registry.js';
5
- export { ShortcutProvider, useForwardedKeys, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.js';
7
+ export { ShortcutProvider, useForwardedKeys, useOpenShortcuts, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.js';
@@ -2,7 +2,7 @@ import type { MessageKey } from '../messages/index.tsx';
2
2
  export interface ShortcutDef {
3
3
  readonly action: string;
4
4
  readonly label: MessageKey;
5
- readonly group: 'edit' | 'selection' | 'file' | 'help';
5
+ readonly group: 'general' | 'selection' | 'edit' | 'view';
6
6
  /** Canonical combinations (`mod+z`); the first is the one the help dialog shows first. */
7
7
  readonly keys: readonly string[];
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/shortcuts/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AASD,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,SAAS,WAAW,EAcnD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1C,WAAW,EAAE,CAMf"}
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/shortcuts/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1D,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AASD,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,SAAS,WAAW,EAoBnD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1C,WAAW,EAAE,CAMf"}
@@ -2,19 +2,25 @@ import { normalizeCombo } from './keys.js';
2
2
  const def = (action, label, group, ...keys) => ({ action, label, group, keys: keys.map(normalizeCombo) });
3
3
  /** The shortcuts of the MVP (docs/editor.md#keyboard-shortcuts-pb-084). */
4
4
  export const DEFAULT_SHORTCUTS = [
5
- def('edit.undo', 'shortcut.undo', 'edit', 'mod+z'),
6
- def('edit.redo', 'shortcut.redo', 'edit', 'mod+shift+z', 'mod+y'),
5
+ def('file.save', 'shortcut.save', 'general', 'mod+s'),
6
+ def('edit.undo', 'shortcut.undo', 'general', 'mod+z'),
7
+ def('edit.redo', 'shortcut.redo', 'general', 'mod+shift+z', 'mod+y'),
8
+ def('ui.findBlock', 'shortcut.findBlock', 'general', '/'),
9
+ def('help.shortcuts', 'shortcut.help', 'general', 'shift+?'),
10
+ def('selection.clear', 'shortcut.selectParent', 'selection', 'escape'),
11
+ def('selection.all', 'shortcut.selectAll', 'selection', 'mod+a'),
12
+ def('edit.duplicate', 'shortcut.duplicate', 'edit', 'mod+d'),
13
+ def('edit.delete', 'shortcut.delete', 'edit', 'delete', 'backspace'),
7
14
  def('edit.copy', 'shortcut.copy', 'edit', 'mod+c'),
8
15
  def('edit.cut', 'shortcut.cut', 'edit', 'mod+x'),
9
16
  def('edit.paste', 'shortcut.paste', 'edit', 'mod+v'),
10
- def('edit.duplicate', 'shortcut.duplicate', 'edit', 'mod+d'),
11
- def('edit.delete', 'shortcut.delete', 'edit', 'delete', 'backspace'),
12
17
  def('node.moveUp', 'shortcut.moveUp', 'edit', 'alt+arrowup'),
13
18
  def('node.moveDown', 'shortcut.moveDown', 'edit', 'alt+arrowdown'),
14
- def('selection.all', 'shortcut.selectAll', 'selection', 'mod+a'),
15
- def('selection.clear', 'shortcut.clearSelection', 'selection', 'escape'),
16
- def('file.save', 'shortcut.save', 'file', 'mod+s'),
17
- def('help.shortcuts', 'shortcut.help', 'help', 'shift+?'),
19
+ def('ui.device1', 'shortcut.device', 'view', 'mod+1'),
20
+ def('ui.device2', 'shortcut.device', 'view', 'mod+2'),
21
+ def('ui.device3', 'shortcut.device', 'view', 'mod+3'),
22
+ def('ui.panels', 'shortcut.togglePanels', 'view', 'mod+.'),
23
+ def('ui.guides', 'shortcut.guides', 'view', 'mod+shift+o'),
18
24
  ];
19
25
  /**
20
26
  * The map with the host's overrides applied (`config.shortcuts`, by action id): an override
@@ -0,0 +1,13 @@
1
+ import type { BuilderDocument, NodeId } from '@next-buildr/core';
2
+ /**
3
+ * What Escape selects: the parent of the first selected node, or `null` when the selection should
4
+ * be cleared instead (nothing selected, the node is at the top level, or it is not in the
5
+ * document). The page root is never selected this way.
6
+ */
7
+ export declare function parentSelection(doc: BuilderDocument, selectedIds: readonly NodeId[]): NodeId | null;
8
+ /** How many nodes lie below `ids` (their own descendants, each counted once; `ids` excluded). */
9
+ export declare function descendantCount(doc: BuilderDocument, ids: readonly NodeId[]): number;
10
+ export declare const hasDescendants: (doc: BuilderDocument, ids: readonly NodeId[]) => boolean;
11
+ /** Whether a menu, list, popover or dialog is open: a key then belongs to it (Escape closes it). */
12
+ export declare function overlayOpen(scope?: ParentNode): boolean;
13
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/shortcuts/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,MAAM,GAAG,IAAI,CAQf;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgBpF;AAED,eAAO,MAAM,cAAc,QAAS,eAAe,OAAO,SAAS,MAAM,EAAE,KAAG,OAC/C,CAAC;AAShC,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,KAAK,GAAE,UAAqB,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * What Escape selects: the parent of the first selected node, or `null` when the selection should
3
+ * be cleared instead (nothing selected, the node is at the top level, or it is not in the
4
+ * document). The page root is never selected this way.
5
+ */
6
+ export function parentSelection(doc, selectedIds) {
7
+ const [first] = selectedIds;
8
+ if (first === undefined || first === doc.root)
9
+ return null;
10
+ for (const [id, node] of Object.entries(doc.nodes)) {
11
+ if (id === doc.root)
12
+ continue;
13
+ if (Object.values(node.slots ?? {}).some((children) => children.includes(first)))
14
+ return id;
15
+ }
16
+ return null;
17
+ }
18
+ /** How many nodes lie below `ids` (their own descendants, each counted once; `ids` excluded). */
19
+ export function descendantCount(doc, ids) {
20
+ const own = new Set(ids);
21
+ const seen = new Set();
22
+ const stack = [...ids];
23
+ while (stack.length > 0) {
24
+ const id = stack.pop();
25
+ if (id === undefined)
26
+ continue;
27
+ for (const children of Object.values(doc.nodes[id]?.slots ?? {})) {
28
+ for (const child of children) {
29
+ if (seen.has(child) || own.has(child) || !Object.hasOwn(doc.nodes, child))
30
+ continue;
31
+ seen.add(child);
32
+ stack.push(child);
33
+ }
34
+ }
35
+ }
36
+ return seen.size;
37
+ }
38
+ export const hasDescendants = (doc, ids) => descendantCount(doc, ids) > 0;
39
+ const OVERLAY_SELECTOR = [
40
+ '[role="menu"][data-state="open"]',
41
+ '[role="listbox"][data-state="open"]',
42
+ '[role="dialog"][data-state="open"]',
43
+ '[role="alertdialog"][data-state="open"]',
44
+ ].join(', ');
45
+ /** Whether a menu, list, popover or dialog is open: a key then belongs to it (Escape closes it). */
46
+ export function overlayOpen(scope = document) {
47
+ return scope.querySelector(OVERLAY_SELECTOR) !== null;
48
+ }
@@ -1,7 +1,14 @@
1
1
  import { type ReactNode } from 'react';
2
+ import type { RemoveRequest, ShortcutCallbacks } from '../app/contracts.ts';
2
3
  import { type ExternalActions } from './actions.ts';
3
4
  import { type KeyInput, type Platform } from './keys.ts';
4
5
  import { type ShortcutRegistry } from './registry.ts';
6
+ /**
7
+ * Opens the shortcuts dialog directly (the host's `openShortcuts` callback, else the built-in
8
+ * dialog), without going through a key combination another action may have taken. `undefined`
9
+ * outside a `<ShortcutProvider>`.
10
+ */
11
+ export declare function useOpenShortcuts(): (() => void) | undefined;
5
12
  /** The registry of the enclosing `<ShortcutProvider>`, or `undefined` outside one (a toolbar shown without shortcuts). */
6
13
  export declare function useOptionalShortcutRegistry(): ShortcutRegistry | undefined;
7
14
  /** The registry of the enclosing `<ShortcutProvider>`, for modules that bind actions of their own. */
@@ -18,6 +25,10 @@ export interface ShortcutProviderProps {
18
25
  /** The actions other modules provide: clipboard (PB-085) and save (PB-087). */
19
26
  readonly actions?: ExternalActions;
20
27
  readonly platform?: Platform;
28
+ /** The shortcuts that change only the UI (device, panels, outlines, search, help); missing ones do nothing. */
29
+ readonly callbacks?: Partial<ShortcutCallbacks>;
30
+ /** Called instead of removing on Delete/Backspace, so the host can confirm or offer Undo. */
31
+ readonly onRemove?: (request: RemoveRequest) => void;
21
32
  readonly children: ReactNode;
22
33
  }
23
34
  /**
@@ -26,7 +37,7 @@ export interface ShortcutProviderProps {
26
37
  * A key press whose focus is in a text field is never handled, and a handled one gets
27
38
  * `preventDefault`, so the browser does not also act on it.
28
39
  */
29
- export declare function ShortcutProvider({ overrides, actions, platform, children, }: ShortcutProviderProps): import("react").JSX.Element;
40
+ export declare function ShortcutProvider({ overrides, actions, platform, callbacks, onRemove, children, }: ShortcutProviderProps): import("react").JSX.Element;
30
41
  /** How the first key of `action` is written on this platform (`Ctrl+Z`), for tooltips; `undefined` when it has none. */
31
42
  export declare function useShortcutHint(action: string): string | undefined;
32
43
  //# sourceMappingURL=shortcuts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../src/shortcuts/shortcuts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAIf,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAI9E,0HAA0H;AAC1H,wBAAgB,2BAA2B,IAAI,gBAAgB,GAAG,SAAS,CAE1E;AAED,sGAAsG;AACtG,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAG/D;AAED,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAOD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,GACT,EAAE,qBAAqB,+BAkFvB;AAED,wHAAwH;AACxH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE"}
1
+ {"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../src/shortcuts/shortcuts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG5E,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,WAAW,CAAC;AAEnB,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK9E;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAE3D;AAeD,0HAA0H;AAC1H,wBAAgB,2BAA2B,IAAI,gBAAgB,GAAG,SAAS,CAE1E;AAED,sGAAsG;AACtG,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAG/D;AAED,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,+GAA+G;IAC/G,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAOD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,GACT,EAAE,qBAAqB,+BAwFvB;AAED,wHAAwH;AACxH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE"}
@@ -1,12 +1,33 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
3
- import { useT } from '../messages/index.js';
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
4
3
  import { useEditor } from '../store/index.js';
5
- import { Dialog } from '../ui/index.js';
4
+ import { useStructureLockedNotice } from '../ui/structure-locked.js';
6
5
  import { bindEditorActions } from './actions.js';
6
+ import { ShortcutsDialog } from './help.js';
7
7
  import { detectPlatform, displayCombo, isTypingTarget, } from './keys.js';
8
+ import { overlayOpen } from './navigation.js';
8
9
  import { createShortcutRegistry } from './registry.js';
9
10
  const RegistryContext = createContext(undefined);
11
+ const OpenShortcutsContext = createContext(undefined);
12
+ /**
13
+ * Opens the shortcuts dialog directly (the host's `openShortcuts` callback, else the built-in
14
+ * dialog), without going through a key combination another action may have taken. `undefined`
15
+ * outside a `<ShortcutProvider>`.
16
+ */
17
+ export function useOpenShortcuts() {
18
+ return useContext(OpenShortcutsContext);
19
+ }
20
+ const EDITOR_ROOT = '.buildr-editor';
21
+ const OWN_KEYS = '[role="dialog"], [role="alertdialog"], [role="menu"], [role="listbox"]';
22
+ const inOverlay = (target) => target instanceof Element && target.closest(OWN_KEYS) !== null;
23
+ /** Whether a key press is aimed at a control of the host page outside the editor (body and the document are not). */
24
+ function outsideEditor(target) {
25
+ if (!(target instanceof Element))
26
+ return false;
27
+ if (target === document.body || target === document.documentElement)
28
+ return false;
29
+ return target.closest(EDITOR_ROOT) === null;
30
+ }
10
31
  /** The registry of the enclosing `<ShortcutProvider>`, or `undefined` outside one (a toolbar shown without shortcuts). */
11
32
  export function useOptionalShortcutRegistry() {
12
33
  return useContext(RegistryContext);
@@ -38,24 +59,39 @@ const toInput = (event) => ({
38
59
  * A key press whose focus is in a text field is never handled, and a handled one gets
39
60
  * `preventDefault`, so the browser does not also act on it.
40
61
  */
41
- export function ShortcutProvider({ overrides, actions, platform, children, }) {
62
+ export function ShortcutProvider({ overrides, actions, platform, callbacks, onRemove, children, }) {
42
63
  const store = useEditor();
43
- const t = useT();
64
+ const notifyLocked = useStructureLockedNotice();
44
65
  const [helpOpen, setHelpOpen] = useState(false);
45
66
  const detected = useMemo(() => platform ?? detectPlatform(), [platform]);
46
67
  const registry = useMemo(() => createShortcutRegistry({ platform: detected, overrides: overrides ?? {} }), [detected, overrides]);
47
68
  // The handlers read the latest actions without rebinding on every render.
48
69
  const external = useRef({});
49
70
  external.current = actions ?? {};
71
+ const host = useRef({ callbacks, onRemove, notifyLocked });
72
+ host.current = { callbacks, onRemove, notifyLocked };
73
+ // Set while a key press aimed outside the editor is handled: the UI-only keys then stay out of it.
74
+ const outside = useRef(false);
50
75
  useEffect(() => {
51
76
  const unbind = bindEditorActions(registry, store, {
52
77
  copy: () => external.current.copy?.() ?? false,
53
78
  cut: () => external.current.cut?.() ?? false,
54
79
  paste: () => external.current.paste?.() ?? false,
55
80
  save: () => external.current.save?.() ?? false,
81
+ }, {
82
+ callbacks: () => host.current.callbacks,
83
+ onRemove: () => host.current.onRemove,
84
+ uiAllowed: () => !outside.current,
85
+ onLocked: () => host.current.notifyLocked,
56
86
  });
57
87
  const unbindHelp = registry.bind('help.shortcuts', () => {
58
- setHelpOpen(true);
88
+ if (overlayOpen())
89
+ return false;
90
+ const open = host.current.callbacks?.openShortcuts;
91
+ if (open === undefined)
92
+ setHelpOpen(true);
93
+ else
94
+ open();
59
95
  return true;
60
96
  });
61
97
  return () => {
@@ -70,20 +106,31 @@ export function ShortcutProvider({ overrides, actions, platform, children, }) {
70
106
  const onKeyDown = (event) => {
71
107
  if (event.defaultPrevented || event.isComposing)
72
108
  return;
73
- const handled = registry.handle(toInput(event), { typing: isTypingTarget(event.target) });
109
+ // A dialog, menu or list keeps its own keys (Delete, Ctrl+Z); Escape is its own to handle.
110
+ if (inOverlay(event.target))
111
+ return;
112
+ outside.current = outsideEditor(event.target);
113
+ let handled;
114
+ try {
115
+ handled = registry.handle(toInput(event), { typing: isTypingTarget(event.target) });
116
+ }
117
+ finally {
118
+ outside.current = false;
119
+ }
74
120
  if (handled)
75
121
  event.preventDefault();
76
122
  };
77
123
  document.addEventListener('keydown', onKeyDown);
78
124
  return () => document.removeEventListener('keydown', onKeyDown);
79
125
  }, [registry]);
80
- const groups = ['edit', 'selection', 'file', 'help'].map((group) => ({
81
- group,
82
- items: registry.shortcuts.filter((shortcut) => shortcut.group === group && shortcut.keys.length > 0),
83
- }));
84
- return (_jsxs(RegistryContext.Provider, { value: registry, children: [children, _jsx(Dialog, { open: helpOpen, onOpenChange: setHelpOpen, title: t('shortcut.title'), children: _jsx("div", { className: "bd-shortcut-help", children: groups
85
- .filter(({ items }) => items.length > 0)
86
- .map(({ group, items }) => (_jsxs("section", { children: [_jsx("h4", { children: t(`shortcut.group.${group}`) }), _jsx("dl", { children: items.map((shortcut) => (_jsxs("div", { className: "bd-shortcut-row", children: [_jsx("dt", { children: t(shortcut.label) }), _jsx("dd", { children: shortcut.keys.map((combo, index) => (_jsxs("span", { children: [index > 0 ? ' / ' : '', _jsx("kbd", { children: displayCombo(combo, detected) })] }, combo))) })] }, shortcut.action))) })] }, group))) }) })] }));
126
+ const openShortcuts = useCallback(() => {
127
+ const open = host.current.callbacks?.openShortcuts;
128
+ if (open === undefined)
129
+ setHelpOpen(true);
130
+ else
131
+ open();
132
+ }, []);
133
+ return (_jsx(RegistryContext.Provider, { value: registry, children: _jsxs(OpenShortcutsContext.Provider, { value: openShortcuts, children: [children, _jsx(ShortcutsDialog, { open: helpOpen, onOpenChange: setHelpOpen, registry: registry, platform: detected })] }) }));
87
134
  }
88
135
  /** How the first key of `action` is written on this platform (`Ctrl+Z`), for tooltips; `undefined` when it has none. */
89
136
  export function useShortcutHint(action) {