@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
@@ -11,16 +11,17 @@ export function childrenWithSlots(doc, node) {
11
11
  /**
12
12
  * The tree as the rows that are visible: a node's children follow it when it is expanded. Iterative
13
13
  * (a document may be deep) and guarded against a node reached twice, so a corrupt document cannot
14
- * loop it.
14
+ * loop it. With `only` the tree is filtered: nodes outside the set are left out (the caller puts the
15
+ * matches and their ancestors in it), and a node counts as having children only among those kept.
15
16
  */
16
- export function flattenTree(doc, expanded) {
17
+ export function flattenTree(doc, expanded, only) {
17
18
  const rows = [];
18
19
  const seen = new Set();
19
20
  const root = doc.nodes[doc.root];
20
21
  if (root === undefined)
21
22
  return rows;
22
23
  const stack = [
23
- { id: doc.root, parentId: null, level: 1, pos: 1, size: 1, slot: 'default' },
24
+ { id: doc.root, parentId: null, level: 1, pos: 1, size: 1, slot: 'default', multi: false },
24
25
  ];
25
26
  while (stack.length > 0) {
26
27
  const frame = stack.pop();
@@ -30,7 +31,7 @@ export function flattenTree(doc, expanded) {
30
31
  const node = doc.nodes[frame.id];
31
32
  if (node === undefined)
32
33
  continue;
33
- const children = childrenWithSlots(doc, node);
34
+ const children = childrenWithSlots(doc, node).filter((child) => only === undefined || only.has(child.id));
34
35
  const open = children.length > 0 && expanded.has(frame.id);
35
36
  rows.push({
36
37
  id: frame.id,
@@ -42,8 +43,10 @@ export function flattenTree(doc, expanded) {
42
43
  hasChildren: children.length > 0,
43
44
  expanded: open,
44
45
  slot: frame.slot,
46
+ multiSlot: frame.multi,
45
47
  });
46
48
  if (open) {
49
+ const multi = new Set(children.map((child) => child.slot)).size > 1;
47
50
  for (let i = children.length - 1; i >= 0; i--) {
48
51
  const child = children[i];
49
52
  stack.push({
@@ -53,9 +56,50 @@ export function flattenTree(doc, expanded) {
53
56
  pos: i + 1,
54
57
  size: children.length,
55
58
  slot: child.slot,
59
+ multi,
56
60
  });
57
61
  }
58
62
  }
59
63
  }
60
64
  return rows;
61
65
  }
66
+ /**
67
+ * The nodes a filter keeps: those `matches` accepts plus every ancestor of one (`only`), and the
68
+ * ancestors alone (`open`), which the filtered tree shows expanded so each match is in view.
69
+ * Walks from the root without recursion and visits a node once.
70
+ */
71
+ export function filterTree(doc, matches) {
72
+ const only = new Set();
73
+ const open = new Set();
74
+ const seen = new Set();
75
+ const stack = [{ id: doc.root, path: [] }];
76
+ while (stack.length > 0) {
77
+ const { id, path } = stack.pop();
78
+ if (seen.has(id))
79
+ continue;
80
+ seen.add(id);
81
+ const node = doc.nodes[id];
82
+ if (node === undefined)
83
+ continue;
84
+ if (matches(node)) {
85
+ only.add(id);
86
+ for (const ancestor of path) {
87
+ only.add(ancestor);
88
+ open.add(ancestor);
89
+ }
90
+ }
91
+ const next = [...path, id];
92
+ for (const child of childrenWithSlots(doc, node))
93
+ stack.push({ id: child.id, path: next });
94
+ }
95
+ return { only, open };
96
+ }
97
+ /** Every node that has children: what "Expand all" opens. */
98
+ export function nodesWithChildren(doc) {
99
+ const ids = new Set();
100
+ for (const [id, node] of Object.entries(doc.nodes)) {
101
+ if (childrenWithSlots(doc, node).length > 0)
102
+ ids.add(id);
103
+ }
104
+ return ids;
105
+ }
@@ -1,8 +1,11 @@
1
+ import type { RemoveRequest } from '../../app/contracts.ts';
1
2
  /** Every row is this tall, which is what lets the list render only the rows in view. */
2
- export declare const ROW_HEIGHT = 28;
3
+ export declare const ROW_HEIGHT = 32;
3
4
  export interface LayersPanelProps {
4
5
  /** The component a "Wrap in container" wraps the selection in. */
5
6
  readonly wrapperType?: string;
7
+ /** Hands a removal to the shell (confirmation, Undo toast); without it the nodes are removed at once. */
8
+ readonly onRemoveRequest?: (request: RemoveRequest) => void;
6
9
  }
7
10
  /**
8
11
  * The document as a tree (docs/editor.md#layers): a WAI-ARIA tree that is fully operable with the
@@ -10,5 +13,5 @@ export interface LayersPanelProps {
10
13
  * the store (the canvas and the tree show the same node), with rename, badges and a context menu.
11
14
  * Focus stays on the tree and `aria-activedescendant` names the row; the selection follows it.
12
15
  */
13
- export declare function LayersPanel({ wrapperType }: LayersPanelProps): import("react").JSX.Element;
16
+ export declare function LayersPanel(props: LayersPanelProps): import("react").JSX.Element;
14
17
  //# sourceMappingURL=layers-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layers-panel.d.ts","sourceRoot":"","sources":["../../../src/panels/layers/layers-panel.tsx"],"names":[],"mappings":"AAqCA,wFAAwF;AACxF,eAAO,MAAM,UAAU,KAAK,CAAC;AAS7B,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAmBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,WAA0B,EAAE,EAAE,gBAAgB,+BA8X3E"}
1
+ {"version":3,"file":"layers-panel.d.ts","sourceRoot":"","sources":["../../../src/panels/layers/layers-panel.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA8B5D,wFAAwF;AACxF,eAAO,MAAM,UAAU,KAAK,CAAC;AAS7B,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yGAAyG;IACzG,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC7D;AAmBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BASlD"}
@@ -1,13 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useId, useMemo, useRef, useState, } from 'react';
3
3
  import { componentMeta, useManifest } from '../../app/manifest.js';
4
+ import { useClipboardActions } from '../../clipboard/index.js';
4
5
  import { MoveToDialog, useDragAutoscroll, useDragAvailable, useDragPress, useDragState, useRegisterTree, } from '../../dnd/index.js';
5
6
  import { useT } from '../../messages/index.js';
6
- import { pathTo, useEditor, useEditorState } from '../../store/index.js';
7
- import { ComponentIcon, ContextMenu, Icon, IconButton, Input, Tooltip, } from '../../ui/index.js';
8
- import { flattenTree } from './flatten.js';
7
+ import { useOptionalShortcutRegistry } from '../../shortcuts/index.js';
8
+ import { hasDescendants } from '../../shortcuts/navigation.js';
9
+ import { pathTo, structureLockedIds, useEditor, useEditorState } from '../../store/index.js';
10
+ import { useViewState } from '../../store/react.js';
11
+ import { ComponentIcon, ContextMenu, Icon, IconButton, Input, SearchField, Tooltip, useStructureLockedNotice, } from '../../ui/index.js';
12
+ import { filterTree, flattenTree, nodesWithChildren } from './flatten.js';
9
13
  /** Every row is this tall, which is what lets the list render only the rows in view. */
10
- export const ROW_HEIGHT = 28;
14
+ export const ROW_HEIGHT = 32;
11
15
  const OVERSCAN = 6;
12
16
  /** Used until the list has been measured (and where nothing is laid out, as in tests). */
13
17
  const FALLBACK_HEIGHT = 400;
@@ -41,9 +45,20 @@ function useIssueNodes() {
41
45
  * the store (the canvas and the tree show the same node), with rename, badges and a context menu.
42
46
  * Focus stays on the tree and `aria-activedescendant` names the row; the selection follows it.
43
47
  */
44
- export function LayersPanel({ wrapperType = 'buildr/box' }) {
48
+ export function LayersPanel(props) {
49
+ const registry = useOptionalShortcutRegistry();
50
+ // The editor shell pairs the shortcut and clipboard providers. Standalone trees
51
+ // still support navigation and commands without requiring either provider.
52
+ return registry === undefined ? (_jsx(LayersPanelBody, { ...props })) : (_jsx(ClipboardLayersPanel, { ...props }));
53
+ }
54
+ function ClipboardLayersPanel(props) {
55
+ const clipboard = useClipboardActions();
56
+ return _jsx(LayersPanelBody, { ...props, clipboard: clipboard });
57
+ }
58
+ function LayersPanelBody({ wrapperType = 'buildr/box', onRemoveRequest, clipboard, }) {
45
59
  const t = useT();
46
60
  const store = useEditor();
61
+ const notifyLocked = useStructureLockedNotice();
47
62
  const manifest = useManifest();
48
63
  const treeId = useId();
49
64
  const doc = useEditorState((state) => state.doc);
@@ -52,6 +67,8 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
52
67
  const hoveredId = useEditorState((state) => state.hoveredId);
53
68
  const readOnly = useEditorState((state) => state.readOnly);
54
69
  const issueNodes = useIssueNodes();
70
+ const { hiddenIds, toggleHidden } = useViewState();
71
+ const hiddenSet = useMemo(() => new Set(hiddenIds), [hiddenIds]);
55
72
  const [expanded, setExpanded] = useState(() => new Set([doc.root]));
56
73
  const [renaming, setRenaming] = useState(null);
57
74
  const [menuTarget, setMenuTarget] = useState(null);
@@ -65,7 +82,15 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
65
82
  const canDrag = useDragAvailable();
66
83
  const drop = useDragState((state) => (state.over === 'tree' ? state.tree : null));
67
84
  const dropTarget = useDragState((state) => (state.over === 'tree' ? state.target : null));
68
- const rows = useMemo(() => flattenTree(doc, expanded), [doc, expanded]);
85
+ // The filter keeps the blocks whose name or type contains the text, and their ancestors.
86
+ const [filter, setFilter] = useState('');
87
+ const needle = filter.trim().toLocaleLowerCase();
88
+ const kept = useMemo(() => needle === ''
89
+ ? undefined
90
+ : filterTree(doc, (candidate) => [candidate.name, componentMeta(manifest, candidate.type)?.label, candidate.type].some((text) => text?.toLocaleLowerCase().includes(needle) === true)), [doc, manifest, needle]);
91
+ const rows = useMemo(() => kept !== undefined && kept.only.size === 0
92
+ ? []
93
+ : flattenTree(doc, kept?.open ?? expanded, kept?.only), [doc, expanded, kept]);
69
94
  useRegisterTree(() => {
70
95
  const element = scroller.current;
71
96
  if (element === null)
@@ -140,8 +165,12 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
140
165
  // --- doing things ---
141
166
  const run = useCallback((command, label) => {
142
167
  const result = store.dispatch(command, label !== undefined ? { label } : undefined);
143
- setNotice(result.ok ? '' : result.error.message);
144
- }, [store]);
168
+ setNotice(result.ok
169
+ ? ''
170
+ : result.error.code === 'command.unlock-not-permitted'
171
+ ? t('layers.unlockNotPermitted')
172
+ : result.error.message);
173
+ }, [store, t]);
145
174
  const toggle = useCallback((id, open) => {
146
175
  setExpanded((current) => {
147
176
  const next = new Set(current);
@@ -152,6 +181,18 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
152
181
  return next;
153
182
  });
154
183
  }, []);
184
+ /** Locking is a document attribute (`node.setAttr` `lock`); unlocking may be refused by the host's `canUnlock`. */
185
+ const toggleLock = useCallback((id) => {
186
+ const locked = store.getState().doc.nodes[id]?.lock !== undefined;
187
+ run({
188
+ type: 'node.setAttr',
189
+ payload: {
190
+ id,
191
+ key: 'lock',
192
+ value: locked ? null : { structure: true, content: true, style: true },
193
+ },
194
+ });
195
+ }, [store, run]);
155
196
  const startRename = (id) => {
156
197
  if (!readOnly && id !== doc.root)
157
198
  setRenaming(id);
@@ -165,11 +206,26 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
165
206
  return;
166
207
  run({ type: 'node.setAttr', payload: { id, key: 'name', value: name === '' ? null : name } });
167
208
  };
209
+ /** A block locked for structure (itself or in a locked block) is not removed, moved or duplicated: say why. */
210
+ const refuseLocked = (ids) => {
211
+ if (structureLockedIds(doc, ids).length === 0)
212
+ return false;
213
+ notifyLocked(ids);
214
+ return true;
215
+ };
216
+ const removeIds = (ids) => {
217
+ if (refuseLocked(ids))
218
+ return;
219
+ if (onRemoveRequest !== undefined)
220
+ onRemoveRequest({ ids, hasDescendants: hasDescendants(doc, ids) });
221
+ else
222
+ run({ type: 'node.remove', payload: { ids } });
223
+ };
168
224
  const removable = (ids) => ids.filter((id) => id !== doc.root);
169
225
  const remove = () => {
170
226
  const ids = removable(selectedIds);
171
227
  if (ids.length > 0)
172
- run({ type: 'node.remove', payload: { ids } });
228
+ removeIds(ids);
173
229
  };
174
230
  // --- keyboard ---
175
231
  const activeIndex = anchorId === null ? -1 : (rowIndex.get(anchorId) ?? -1);
@@ -247,7 +303,7 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
247
303
  const id = rowOf(event);
248
304
  if (id === undefined)
249
305
  return;
250
- if (event.target.closest('[data-more]') !== null)
306
+ if (event.target.closest('[data-more], [data-action]') !== null)
251
307
  return;
252
308
  if (event.target.closest('[data-toggle]') !== null)
253
309
  return toggle(id);
@@ -261,7 +317,7 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
261
317
  const id = rowOf(event);
262
318
  if (id === undefined || id === doc.root)
263
319
  return;
264
- if (event.target.closest('[data-toggle], [data-more]') !== null)
320
+ if (event.target.closest('[data-toggle], [data-more], [data-action]') !== null)
265
321
  return;
266
322
  const ids = selected.has(id) ? removable(selectedIds) : [id];
267
323
  if (ids.length === 0)
@@ -275,7 +331,7 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
275
331
  const onDoubleClick = (event) => {
276
332
  const id = rowOf(event);
277
333
  if (id !== undefined &&
278
- event.target.closest('[data-toggle], [data-more]') === null) {
334
+ event.target.closest('[data-toggle], [data-more], [data-action]') === null) {
279
335
  startRename(id);
280
336
  }
281
337
  };
@@ -308,7 +364,10 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
308
364
  id: 'move',
309
365
  label: t('dnd.moveTo'),
310
366
  disabled: readOnly || ids.length === 0,
311
- onSelect: () => setMoving(ids),
367
+ onSelect: () => {
368
+ if (!refuseLocked(ids))
369
+ setMoving(ids);
370
+ },
312
371
  },
313
372
  ]
314
373
  : [];
@@ -316,47 +375,123 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
316
375
  {
317
376
  id: 'rename',
318
377
  label: t('layers.menu.rename'),
378
+ kbd: t('layers.shortcut.rename'),
379
+ shortcut: 'F2',
380
+ icon: 'pencil-line',
319
381
  disabled: readOnly || isRoot,
320
382
  onSelect: () => startRename(menuTarget),
321
383
  },
322
384
  {
323
385
  id: 'duplicate',
324
386
  label: t('layers.menu.duplicate'),
387
+ kbd: t('layers.shortcut.duplicate'),
388
+ shortcut: 'Control+D',
389
+ icon: 'copy',
325
390
  disabled: readOnly || ids.length === 0,
326
- onSelect: () => run({ type: 'node.duplicate', payload: { ids } }),
391
+ onSelect: () => {
392
+ if (!refuseLocked(ids))
393
+ run({ type: 'node.duplicate', payload: { ids } });
394
+ },
395
+ },
396
+ {
397
+ id: 'copy',
398
+ label: t('layers.menu.copy'),
399
+ kbd: t('layers.shortcut.copy'),
400
+ shortcut: 'Control+C',
401
+ icon: 'copy',
402
+ disabled: clipboard === undefined || ids.length === 0,
403
+ onSelect: () => {
404
+ clipboard?.copy?.();
405
+ },
406
+ },
407
+ {
408
+ id: 'paste',
409
+ label: t('layers.menu.paste'),
410
+ kbd: t('layers.shortcut.paste'),
411
+ shortcut: 'Control+V',
412
+ icon: 'clipboard-paste',
413
+ disabled: readOnly || clipboard === undefined,
414
+ onSelect: () => {
415
+ clipboard?.paste?.();
416
+ },
327
417
  },
328
418
  {
329
419
  id: 'wrap',
330
420
  label: t('layers.menu.wrap'),
331
421
  disabled: readOnly || ids.length === 0 || !canWrap,
332
- onSelect: () => run({ type: 'node.wrap', payload: { ids, wrapper: { type: wrapperType } } }),
422
+ onSelect: () => {
423
+ if (!refuseLocked(ids))
424
+ run({ type: 'node.wrap', payload: { ids, wrapper: { type: wrapperType } } });
425
+ },
333
426
  },
334
427
  {
335
428
  id: 'unwrap',
336
429
  label: t('layers.menu.unwrap'),
337
430
  disabled: readOnly || isRoot || target.slots === undefined,
338
- onSelect: () => run({ type: 'node.unwrap', payload: { id: menuTarget } }),
431
+ onSelect: () => {
432
+ if (!refuseLocked([menuTarget]))
433
+ run({ type: 'node.unwrap', payload: { id: menuTarget } });
434
+ },
339
435
  },
340
436
  ...move,
437
+ {
438
+ id: 'hide',
439
+ label: hiddenSet.has(menuTarget) ? t('layers.menu.show') : t('layers.menu.hide'),
440
+ icon: hiddenSet.has(menuTarget) ? 'eye' : 'eye-off',
441
+ onSelect: () => toggleHidden(menuTarget),
442
+ },
443
+ {
444
+ id: 'lock',
445
+ label: target.lock !== undefined ? t('layers.menu.unlock') : t('layers.menu.lock'),
446
+ icon: target.lock !== undefined ? 'lock-open' : 'lock',
447
+ disabled: readOnly || isRoot,
448
+ onSelect: () => toggleLock(menuTarget),
449
+ },
341
450
  {
342
451
  id: 'delete',
343
452
  label: t('layers.menu.delete'),
453
+ kbd: t('layers.shortcut.delete'),
454
+ shortcut: 'Delete',
455
+ icon: 'trash-2',
344
456
  danger: true,
345
457
  disabled: readOnly || ids.length === 0,
346
- onSelect: () => run({ type: 'node.remove', payload: { ids } }),
458
+ onSelect: () => removeIds(ids),
347
459
  },
348
460
  ];
349
461
  // biome-ignore lint/correctness/useExhaustiveDependencies: startRename and removable read the same inputs
350
- }, [menuTarget, doc, selectedIds, manifest, wrapperType, readOnly, canDrag, t, run]);
462
+ }, [
463
+ menuTarget,
464
+ doc,
465
+ selectedIds,
466
+ manifest,
467
+ wrapperType,
468
+ readOnly,
469
+ canDrag,
470
+ t,
471
+ run,
472
+ onRemoveRequest,
473
+ notifyLocked,
474
+ clipboard,
475
+ hiddenSet,
476
+ toggleHidden,
477
+ toggleLock,
478
+ ]);
351
479
  const activeRow = activeIndex >= 0 ? rows[activeIndex] : undefined;
480
+ const filtering = needle !== '';
352
481
  const rowDomId = (id) => `${treeId}-${id}`;
353
482
  return (_jsxs("div", { className: "bd-layers", style: {
354
483
  '--layer-row': `${ROW_HEIGHT}px`,
355
484
  '--layer-indent': `${INDENT}px`,
356
485
  '--layer-pad': `${PAD}px`,
357
- }, children: [_jsx(ContextMenu, { items: menu, label: t('layers.menu'), children: _jsx("div", { ref: scroller, role: "tree", "aria-label": t('layers.title'), "aria-multiselectable": "true", "aria-activedescendant": activeRow !== undefined && activeIndex >= first && activeIndex < last
486
+ }, children: [_jsxs("div", { className: "bd-layers-tools", onKeyDown: (event) => {
487
+ // From the filter field the arrow key goes down into the tree.
488
+ if (event.key === 'ArrowDown' && event.target instanceof HTMLInputElement) {
489
+ event.preventDefault();
490
+ scroller.current?.focus();
491
+ }
492
+ }, children: [_jsx(SearchField, { className: "bd-layers-filter", value: filter, onChange: setFilter, label: t('structure.filter'), clearLabel: t('structure.filter.clear'), placeholder: t('structure.filter') }), _jsx(IconButton, { size: "sm", icon: "chevrons-down-up", label: t('structure.collapseAll'), disabled: filtering, onClick: () => setExpanded(new Set([doc.root])) }), _jsx(IconButton, { size: "sm", icon: "chevrons-up-down", label: t('structure.expandAll'), disabled: filtering, onClick: () => setExpanded(new Set(nodesWithChildren(doc))) })] }), filtering && rows.length === 0 ? (_jsx("p", { className: "bd-layers-empty", role: "status", children: t('structure.noMatch') })) : null, _jsx(ContextMenu, { items: menu, label: t('layers.menu'), children: _jsx("div", { ref: scroller, role: "tree", "aria-label": t('structure.title'), "aria-multiselectable": "true", "aria-activedescendant": activeRow !== undefined && activeIndex >= first && activeIndex < last
358
493
  ? rowDomId(activeRow.id)
359
- : undefined, tabIndex: 0, className: "bd-layers-scroll", onScroll: (event) => setScrollTop(event.currentTarget.scrollTop), onKeyDown: onKeyDown, onClick: onClick, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onPointerOver: onPointerOver, onPointerLeave: () => store.setHovered(null), onContextMenu: onContextMenu, children: _jsx("div", { className: "bd-layers-list", style: { height: rows.length * ROW_HEIGHT }, children: visible.map((row, i) => (_jsx(Layer, { row: row, top: (first + i) * ROW_HEIGHT, domId: rowDomId(row.id), selected: selected.has(row.id), hovered: hoveredId === row.id, hasIssue: issueNodes.has(row.id), drop: drop !== null && rows[drop.rowIndex]?.id === row.id
494
+ : undefined, tabIndex: 0, className: "bd-layers-scroll", onScroll: (event) => setScrollTop(event.currentTarget.scrollTop), onKeyDown: onKeyDown, onClick: onClick, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onPointerOver: onPointerOver, onPointerLeave: () => store.setHovered(null), onContextMenu: onContextMenu, children: _jsx("div", { className: "bd-layers-list", style: { height: rows.length * ROW_HEIGHT }, children: visible.map((row, i) => (_jsx(Layer, { row: row, top: (first + i) * ROW_HEIGHT, domId: rowDomId(row.id), selected: selected.has(row.id), hovered: hoveredId === row.id, hasIssue: issueNodes.has(row.id), hidden: hiddenSet.has(row.id), readOnly: readOnly, onToggleHidden: () => toggleHidden(row.id), onToggleLock: () => toggleLock(row.id), drop: drop !== null && rows[drop.rowIndex]?.id === row.id
360
495
  ? dropTarget === null
361
496
  ? 'denied'
362
497
  : drop.position
@@ -368,15 +503,13 @@ export function LayersPanel({ wrapperType = 'buildr/box' }) {
368
503
  setMoving(null);
369
504
  }, ids: moving ?? [] })) : null] }));
370
505
  }
371
- function Layer({ row, top, domId, selected, hovered, hasIssue, drop, renaming, onRename, onCancelRename, }) {
506
+ function Layer({ row, top, domId, selected, hovered, hasIssue, hidden, readOnly, onToggleHidden, onToggleLock, drop, renaming, onRename, onCancelRename, }) {
372
507
  const t = useT();
373
508
  const manifest = useManifest();
374
509
  const { node } = row;
375
510
  const meta = componentMeta(manifest, node.type);
376
511
  const label = node.name ?? meta?.label ?? node.type;
377
512
  const badges = [];
378
- if (node.lock !== undefined)
379
- badges.push({ key: 'layers.badge.lock', icon: 'lock' });
380
513
  if (node.visibleIf !== undefined)
381
514
  badges.push({ key: 'layers.badge.visibleIf', icon: 'eye' });
382
515
  const bp = node.styles?.bp;
@@ -385,22 +518,31 @@ function Layer({ row, top, domId, selected, hovered, hasIssue, drop, renaming, o
385
518
  }
386
519
  if (hasIssue)
387
520
  badges.push({ key: 'layers.badge.issues', icon: 'triangle-alert' });
388
- return (_jsxs("div", { role: "treeitem", id: domId, "data-node-id": row.id, "aria-level": row.level, "aria-posinset": row.posInSet, "aria-setsize": row.setSize, "aria-selected": selected, "aria-expanded": row.hasChildren ? row.expanded : undefined, className: "bd-layer", "data-selected": selected, "data-hovered": hovered, "data-drop": drop, style: {
521
+ return (_jsxs("div", { role: "treeitem", id: domId, "data-node-id": row.id, "aria-level": row.level, "aria-posinset": row.posInSet, "aria-setsize": row.setSize, "aria-selected": selected, "aria-expanded": row.hasChildren ? row.expanded : undefined, className: "bd-layer", "data-selected": selected, "data-hovered": hovered, "data-hidden": hidden || undefined, "data-locked": node.lock !== undefined || undefined, "data-drop": drop, style: {
389
522
  top,
390
523
  height: ROW_HEIGHT,
391
524
  paddingLeft: PAD + (row.level - 1) * INDENT,
392
525
  '--layer-level': row.level - 1,
393
- }, children: [_jsx("span", { className: "bd-layer-toggle", "data-toggle": true, "aria-hidden": "true", children: row.hasChildren ? _jsx(Icon, { name: row.expanded ? 'chevron-down' : 'chevron-right' }) : null }), _jsx("span", { className: "bd-layer-icon", "data-icon": meta?.icon, "aria-hidden": "true", children: _jsx(ComponentIcon, { meta: meta }) }), renaming ? (_jsx(RenameField, { initial: node.name ?? '', placeholder: meta?.label ?? node.type, onCommit: onRename, onCancel: onCancelRename })) : (_jsx("span", { className: "bd-layer-label", children: label })), row.slot !== 'default' ? _jsx("span", { className: "bd-layer-slot", children: row.slot }) : null, badges.map((badge) => (_jsx(Tooltip, { content: t(badge.key), children: _jsx("span", { className: "bd-layer-badge", role: "img", "aria-label": t(badge.key), children: _jsx(Icon, { name: badge.icon }) }) }, badge.key))), _jsx("span", { className: "bd-layer-more", "data-more": true, children: _jsx(IconButton, { icon: "ellipsis", label: t('layers.more'), tabIndex: -1, onClick: (event) => {
394
- // The menu is the tree's own context menu: ask for it where the button is.
395
- event.stopPropagation();
396
- const box = event.currentTarget.getBoundingClientRect();
397
- event.currentTarget.dispatchEvent(new MouseEvent('contextmenu', {
398
- bubbles: true,
399
- cancelable: true,
400
- clientX: box.left,
401
- clientY: box.bottom,
402
- }));
403
- } }) })] }));
526
+ }, children: [_jsx("span", { className: "bd-layer-toggle", "data-toggle": true, "aria-hidden": "true", children: row.hasChildren ? _jsx(Icon, { name: row.expanded ? 'chevron-down' : 'chevron-right' }) : null }), _jsx("span", { className: "bd-layer-icon", "data-icon": meta?.icon, "aria-hidden": "true", children: _jsx(ComponentIcon, { meta: meta }) }), renaming ? (_jsx(RenameField, { initial: node.name ?? '', placeholder: meta?.label ?? node.type, onCommit: onRename, onCancel: onCancelRename })) : (_jsx("span", { className: "bd-layer-label", children: label })), node.name !== undefined && meta?.label !== undefined ? (_jsx("span", { className: "bd-layer-type", children: meta.label })) : null, row.multiSlot === true &&
527
+ row.slot !== 'default' &&
528
+ row.slot !== 'body' &&
529
+ row.slot !== 'children' ? (_jsx("span", { className: "bd-layer-slot", children: row.slot })) : null, badges.map((badge) => (_jsx(Tooltip, { content: t(badge.key), children: _jsx("span", { className: "bd-layer-badge", "data-badge": badge.key, role: "img", "aria-label": t(badge.key), children: _jsx(Icon, { name: badge.icon }) }) }, badge.key))), _jsxs("span", { className: "bd-layer-actions", "data-row-actions": true, children: [_jsxs("span", { className: "bd-layer-toggles", "data-action": true, children: [_jsx(IconButton, { size: "sm", icon: hidden ? 'eye-off' : 'eye', label: hidden ? t('layers.menu.show') : t('layers.menu.hide'), "aria-pressed": hidden, tabIndex: -1, "data-state": hidden ? 'on' : 'off', onClick: (event) => {
530
+ event.stopPropagation();
531
+ onToggleHidden();
532
+ } }), row.parentId === null ? null : (_jsx(IconButton, { size: "sm", icon: node.lock !== undefined ? 'lock' : 'lock-open', label: node.lock !== undefined ? t('layers.menu.unlock') : t('layers.menu.lock'), "aria-pressed": node.lock !== undefined, disabled: readOnly, tabIndex: -1, "data-state": node.lock !== undefined ? 'on' : 'off', onClick: (event) => {
533
+ event.stopPropagation();
534
+ onToggleLock();
535
+ } }))] }), _jsx("span", { className: "bd-layer-more", "data-more": true, children: _jsx(IconButton, { icon: "ellipsis", label: t('layers.more'), tabIndex: -1, onClick: (event) => {
536
+ // The menu is the tree's own context menu: ask for it where the button is.
537
+ event.stopPropagation();
538
+ const box = event.currentTarget.getBoundingClientRect();
539
+ event.currentTarget.dispatchEvent(new MouseEvent('contextmenu', {
540
+ bubbles: true,
541
+ cancelable: true,
542
+ clientX: box.left,
543
+ clientY: box.bottom,
544
+ }));
545
+ } }) })] })] }));
404
546
  }
405
547
  /** The name field of a layer being renamed: it ends once, whether by Enter, Escape or leaving it. */
406
548
  function RenameField({ initial, placeholder, onCommit, onCancel }) {