@next-buildr/editor 2.0.0 → 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 +7 -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 +6 -4
@@ -28,19 +28,43 @@ function templateItem(template) {
28
28
  export function safeThumbnail(value) {
29
29
  if (value === undefined)
30
30
  return undefined;
31
+ if (value.startsWith('data:image/svg+xml,')) {
32
+ try {
33
+ const svg = decodeURIComponent(value.slice('data:image/svg+xml,'.length));
34
+ // Only the manifest wireframe generator's fixed SVG vocabulary is accepted.
35
+ return /^<svg xmlns='http:\/\/www\.w3\.org\/2000\/svg' viewBox='0 0 160 100'>(?:<path fill='#[0-9a-f]{6}' d='[M0-9 .h/vz-]+'\/>)*<\/svg>$/i.test(svg)
36
+ ? value
37
+ : undefined;
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
31
43
  return /^(https?:\/\/|\/(?!\/)|data:image\/(png|jpe?g|gif|webp|avif);)/i.test(value)
32
44
  ? value
33
45
  : undefined;
34
46
  }
35
- /** Components that can be inserted (not root-only, not `insertable: false`) and templates, from the manifest. */
47
+ const HIDDEN_TYPES = new Set(['buildr/rich-text']);
48
+ const HIDDEN_CATEGORIES = new Set(['cms']);
49
+ /**
50
+ * Components and templates that can be inserted from the manifest: not root-only, and not
51
+ * `insertable: false` (for a component or a template). Hidden ones stay registered and keep
52
+ * working in existing documents.
53
+ */
36
54
  export function paletteItems(manifest) {
37
55
  const byLabel = (a, b) => a.label.localeCompare(b.label);
38
56
  return {
39
57
  components: Object.values(manifest.components)
40
- .filter((meta) => meta.capabilities?.insertable !== false && meta.capabilities?.root !== true)
58
+ .filter((meta) => meta.capabilities?.insertable !== false &&
59
+ meta.capabilities?.root !== true &&
60
+ !HIDDEN_TYPES.has(meta.type) &&
61
+ !HIDDEN_CATEGORIES.has(meta.category))
41
62
  .map(componentItem)
42
63
  .sort(byLabel),
43
- templates: Object.values(manifest.templates).map(templateItem).sort(byLabel),
64
+ templates: Object.values(manifest.templates)
65
+ .filter((template) => template.insertable !== false)
66
+ .map(templateItem)
67
+ .sort(byLabel),
44
68
  };
45
69
  }
46
70
  /** The items whose label, type, description or keywords contain every word of `query`. */
@@ -48,6 +72,64 @@ export function filterItems(items, query) {
48
72
  const words = query.toLowerCase().split(/\s+/).filter(Boolean);
49
73
  return items.filter((item) => words.every((word) => item.haystack.includes(word)));
50
74
  }
75
+ /** Explicit editor sections; unavailable types are skipped without placeholders. */
76
+ export const BLOCK_SECTIONS = [
77
+ {
78
+ section: 'layout',
79
+ types: ['buildr/container', 'buildr/grid', 'buildr/spacer', 'buildr/anchor'],
80
+ },
81
+ {
82
+ section: 'content',
83
+ types: [
84
+ 'buildr/heading',
85
+ 'buildr/text',
86
+ 'buildr/image',
87
+ 'buildr/list',
88
+ 'buildr/button',
89
+ 'buildr/link',
90
+ 'buildr/badge',
91
+ 'buildr/divider',
92
+ 'buildr/accordion',
93
+ 'buildr/card',
94
+ ],
95
+ },
96
+ {
97
+ section: 'media',
98
+ types: [
99
+ 'buildr/carousel',
100
+ 'buildr/gallery',
101
+ 'buildr/icon',
102
+ 'buildr/video',
103
+ 'buildr/iframe',
104
+ 'buildr/map',
105
+ ],
106
+ },
107
+ {
108
+ section: 'forms',
109
+ types: [
110
+ 'buildr/form',
111
+ 'buildr/input',
112
+ 'buildr/textarea',
113
+ 'buildr/select',
114
+ 'buildr/checkbox',
115
+ 'buildr/button',
116
+ 'buildr/fieldset',
117
+ 'buildr/captcha',
118
+ ],
119
+ },
120
+ ];
121
+ /** Mapped blocks may occur in multiple sections; all remaining blocks retain their categories. */
122
+ export function blockSections(items) {
123
+ const byType = new Map(items.map((item) => [item.id, item]));
124
+ const mapped = new Set(BLOCK_SECTIONS.flatMap(({ types }) => [...types]));
125
+ return [
126
+ ...BLOCK_SECTIONS.map(({ section, types }) => ({
127
+ category: section,
128
+ items: types.flatMap((type) => byType.get(type) ?? []),
129
+ })).filter((group) => group.items.length > 0),
130
+ ...groupByCategory(items.filter((item) => !mapped.has(item.id))),
131
+ ];
132
+ }
51
133
  /** The order categories appear in; a category this list does not know follows, alphabetically. */
52
134
  export const CATEGORY_ORDER = [
53
135
  'layout',
@@ -1,5 +1,6 @@
1
+ import { createRegistryMeta, toManifest } from '@next-buildr/core';
1
2
  import { describe, expect, it } from 'vitest';
2
- import { groupByCategory } from './catalog.js';
3
+ import { BLOCK_SECTIONS, blockSections, filterItems, groupByCategory, paletteItems, } from './catalog.js';
3
4
  const item = (category) => ({ id: `x/${category}`, kind: 'component', category, label: category });
4
5
  describe('category order', () => {
5
6
  it('lists layout, content, media, forms, ui, cms; unknown categories go last', () => {
@@ -15,3 +16,107 @@ describe('category order', () => {
15
16
  ]);
16
17
  });
17
18
  });
19
+ describe('block sections', () => {
20
+ const block = (id, category = 'ui') => ({
21
+ ...item(category),
22
+ id,
23
+ haystack: id,
24
+ });
25
+ it('uses explicit mapping order regardless of metadata or input order', () => {
26
+ const blocks = BLOCK_SECTIONS.flatMap(({ types }) => types.map((id) => block(id)));
27
+ const unique = [...new Map(blocks.map((entry) => [entry.id, entry])).values()];
28
+ const groups = blockSections(unique.reverse());
29
+ expect(groups.map((group) => group.category)).toEqual(['layout', 'content', 'media', 'forms']);
30
+ expect(groups.map((group) => group.items.map((entry) => entry.id))).toEqual(BLOCK_SECTIONS.map(({ types }) => [...types]));
31
+ });
32
+ it('places fieldset in the former label slot in forms', () => {
33
+ expect(BLOCK_SECTIONS.find(({ section }) => section === 'forms')?.types).toEqual([
34
+ 'buildr/form',
35
+ 'buildr/input',
36
+ 'buildr/textarea',
37
+ 'buildr/select',
38
+ 'buildr/checkbox',
39
+ 'buildr/button',
40
+ 'buildr/fieldset',
41
+ 'buildr/captcha',
42
+ ]);
43
+ });
44
+ it('lists button in content and forms while search returns it once', () => {
45
+ const blocks = [block('buildr/button')];
46
+ expect(blockSections(blocks).map((group) => group.category)).toEqual(['content', 'forms']);
47
+ expect(filterItems(blocks, 'button')).toHaveLength(1);
48
+ });
49
+ it('skips missing types and appends unmapped blocks by their original category', () => {
50
+ const groups = blockSections([
51
+ block('custom/widget', 'third-party'),
52
+ block('buildr/text'),
53
+ block('buildr/list-item'),
54
+ ]);
55
+ expect(groups.map((group) => group.category)).toEqual(['content', 'ui', 'third-party']);
56
+ expect(groups.flatMap((group) => group.items.map((entry) => entry.id))).toEqual([
57
+ 'buildr/text',
58
+ 'buildr/list-item',
59
+ 'custom/widget',
60
+ ]);
61
+ expect(blockSections([])).toEqual([]);
62
+ });
63
+ });
64
+ describe('palette visibility', () => {
65
+ it('lists carousel and gallery in media and excludes their non-insertable children', () => {
66
+ const types = [
67
+ 'buildr/carousel',
68
+ 'buildr/gallery',
69
+ 'buildr/carousel-slide',
70
+ 'buildr/gallery-item',
71
+ ];
72
+ const components = types.map((type) => ({
73
+ type,
74
+ label: type,
75
+ category: 'media',
76
+ version: 1,
77
+ props: {},
78
+ contentCategories: ['flow'],
79
+ styles: { groups: [] },
80
+ runtime: 'shared',
81
+ capabilities: { insertable: !type.endsWith('-slide') && !type.endsWith('-item') },
82
+ }));
83
+ const palette = paletteItems(toManifest(createRegistryMeta({ components, templates: [] }))).components;
84
+ const groups = blockSections(palette);
85
+ expect(groups.map((group) => group.category)).toEqual(['media']);
86
+ expect(groups[0]?.items.map((entry) => entry.id)).toEqual(types.slice(0, 2));
87
+ expect(BLOCK_SECTIONS.flatMap(({ types }) => [...types])).not.toContain('buildr/carousel-slide');
88
+ expect(BLOCK_SECTIONS.flatMap(({ types }) => [...types])).not.toContain('buildr/gallery-item');
89
+ });
90
+ it('filters hidden types and categories before section grouping and search', () => {
91
+ const components = [
92
+ ['buildr/rich-text', 'content'],
93
+ ['buildr/loop', 'cms'],
94
+ ['buildr/pagination', 'cms'],
95
+ ['custom/cms-block', 'cms'],
96
+ ['custom/widget', 'third-party'],
97
+ ].map(([type, category]) => ({
98
+ type,
99
+ category,
100
+ label: type,
101
+ version: 1,
102
+ props: {},
103
+ contentCategories: ['flow'],
104
+ styles: { groups: [] },
105
+ runtime: 'shared',
106
+ }));
107
+ const manifest = toManifest(createRegistryMeta({ components, templates: [] }));
108
+ const palette = paletteItems(manifest).components;
109
+ expect(blockSections(palette).map((group) => group.category)).toEqual(['third-party']);
110
+ expect(palette.map((entry) => entry.id)).toEqual(['custom/widget']);
111
+ for (const query of ['rich-text', 'loop', 'pagination', 'cms-block']) {
112
+ expect(filterItems(palette, query)).toEqual([]);
113
+ }
114
+ expect(filterItems(palette, 'widget').map((entry) => entry.id)).toEqual(['custom/widget']);
115
+ expect(Object.keys(manifest.components)).toHaveLength(5);
116
+ });
117
+ });
118
+ it('lists Map in media using the registered type', () => {
119
+ const types = BLOCK_SECTIONS.find(({ section }) => section === 'media')?.types;
120
+ expect(types).toContain('buildr/map');
121
+ expect(types).not.toContain('buildr/google-maps');
122
+ });
@@ -1,3 +1,4 @@
1
+ export type { InsertPanelProps } from './insert-panel.tsx';
1
2
  export { InsertPanel } from './insert-panel.tsx';
2
3
  export { placeInsertion } from './target.ts';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/panels/insert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/panels/insert/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -1,7 +1,17 @@
1
+ import { type RefObject } from 'react';
2
+ import type { PaletteMode } from '../../app/contracts.ts';
3
+ export interface InsertPanelProps {
4
+ /** Blocks or patterns; leave out for a panel that keeps the choice itself. */
5
+ readonly mode?: PaletteMode;
6
+ readonly onModeChange?: (mode: PaletteMode) => void;
7
+ /** Receives the search input, so the shell can focus it (the `/` shortcut, the empty page's "Add block"). */
8
+ readonly searchRef?: RefObject<HTMLInputElement | null>;
9
+ }
1
10
  /**
2
- * The component and template palette (docs/editor.md#insert): search, categories, and a click (or
3
- * Enter) that inserts at the first position the rules allow — inside the selected container, else
4
- * after the selection. It never needs drag and drop. When nothing fits the reason is shown instead.
11
+ * The block and pattern palette (docs/editor.md#insert): a Blocks / Patterns switch, search, the
12
+ * insert target and always-expanded block sections. A click (or Enter) inserts at the first
13
+ * position the rules allow: inside the selected container, else after the selection. It never needs
14
+ * drag and drop. When nothing fits the reason is shown instead.
5
15
  */
6
- export declare function InsertPanel(): import("react").JSX.Element;
16
+ export declare function InsertPanel({ mode: modeProp, onModeChange, searchRef: searchRefProp, }?: InsertPanelProps): import("react").JSX.Element;
7
17
  //# sourceMappingURL=insert-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"insert-panel.d.ts","sourceRoot":"","sources":["../../../src/panels/insert/insert-panel.tsx"],"names":[],"mappings":"AA2CA;;;;GAIG;AACH,wBAAgB,WAAW,gCA+P1B"}
1
+ {"version":3,"file":"insert-panel.d.ts","sourceRoot":"","sources":["../../../src/panels/insert/insert-panel.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAqB,KAAK,SAAS,EAAwC,MAAM,OAAO,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAqC1D,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpD,6GAA6G;IAC7G,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CACzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,SAAS,EAAE,aAAa,GACzB,GAAE,gBAAqB,+BAiavB"}
@@ -1,64 +1,103 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { fromTree, instantiateTemplate, registryVersions, } from '@next-buildr/core';
3
3
  import { useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useManifest } from '../../app/manifest.js';
5
5
  import { useDragPress } from '../../dnd/index.js';
6
- import { useT } from '../../messages/index.js';
6
+ import { usePlural, useT } from '../../messages/index.js';
7
7
  import { isTypingTarget } from '../../shortcuts/index.js';
8
8
  import { useEditor, useEditorState } from '../../store/index.js';
9
- import { ComponentIcon, Icon, IconButton, Input, Tooltip, useToast } from '../../ui/index.js';
10
- import { filterItems, groupByCategory, paletteItems, safeThumbnail, } from './catalog.js';
9
+ import { useViewState } from '../../store/react.js';
10
+ import { ComponentIcon, Icon, SearchField, SegmentedControl, Tooltip, useToast, } from '../../ui/index.js';
11
+ import { blockSections, filterItems, groupByCategory, paletteItems, safeThumbnail, } from './catalog.js';
11
12
  import { categoryName } from './category-name.js';
12
13
  import { placeInsertion } from './target.js';
13
- const VIEW_KEY = 'buildr.editor.insert.view';
14
14
  const SKELETONS = ['a', 'b', 'c', 'd'];
15
- function readView() {
16
- try {
17
- return globalThis.localStorage?.getItem(VIEW_KEY) === 'list' ? 'list' : 'grid';
18
- }
19
- catch {
20
- return 'grid';
21
- }
22
- }
23
- function writeView(view) {
24
- try {
25
- globalThis.localStorage?.setItem(VIEW_KEY, view);
26
- }
27
- catch {
28
- // Storage can be blocked; the choice then only lasts for this session.
29
- }
15
+ /** The label split around the first match of the query, for highlighting. */
16
+ function splitMatch(label, query) {
17
+ const needle = query.trim().toLowerCase();
18
+ const at = needle === '' ? -1 : label.toLowerCase().indexOf(needle);
19
+ return at === -1
20
+ ? [label, '', '']
21
+ : [label.slice(0, at), label.slice(at, at + needle.length), label.slice(at + needle.length)];
30
22
  }
31
23
  /**
32
- * The component and template palette (docs/editor.md#insert): search, categories, and a click (or
33
- * Enter) that inserts at the first position the rules allow — inside the selected container, else
34
- * after the selection. It never needs drag and drop. When nothing fits the reason is shown instead.
24
+ * The block and pattern palette (docs/editor.md#insert): a Blocks / Patterns switch, search, the
25
+ * insert target and always-expanded block sections. A click (or Enter) inserts at the first
26
+ * position the rules allow: inside the selected container, else after the selection. It never needs
27
+ * drag and drop. When nothing fits the reason is shown instead.
35
28
  */
36
- export function InsertPanel() {
29
+ export function InsertPanel({ mode: modeProp, onModeChange, searchRef: searchRefProp, } = {}) {
37
30
  const t = useT();
31
+ const plural = usePlural();
38
32
  const store = useEditor();
33
+ const { insertionTarget, setInsertionTarget } = useViewState();
34
+ const targetNode = useEditorState((state) => insertionTarget === null ? undefined : state.doc.nodes[insertionTarget.parentId]);
39
35
  const manifest = useManifest();
36
+ const selectedId = useEditorState((state) => state.anchorId);
37
+ const selectedNode = useEditorState((state) => state.anchorId === null ? undefined : state.doc.nodes[state.anchorId]);
38
+ const rootId = useEditorState((state) => state.doc.root);
40
39
  const readOnly = useEditorState((state) => state.readOnly);
41
40
  const [query, setQuery] = useState('');
42
- const [view, setView] = useState(readView);
43
- const [collapsed, setCollapsed] = useState(() => new Set());
44
- const searchRef = useRef(null);
41
+ const [ownMode, setOwnMode] = useState('blocks');
42
+ const mode = modeProp ?? ownMode;
43
+ const [patternCategory, setPatternCategory] = useState('all');
44
+ const ownSearchRef = useRef(null);
45
+ const searchRef = searchRefProp ?? ownSearchRef;
45
46
  const toast = useToast();
46
- const sections = useMemo(() => {
47
+ const chooseMode = (next) => {
48
+ setOwnMode(next);
49
+ onModeChange?.(next);
50
+ };
51
+ const palette = useMemo(() => {
47
52
  if (manifest === undefined)
48
- return [];
49
- const { components, templates } = paletteItems(manifest);
50
- return [
51
- { id: 'components', groups: groupByCategory(filterItems(components, query)) },
52
- { id: 'templates', groups: groupByCategory(filterItems(templates, query)) },
53
- ];
54
- }, [manifest, query]);
55
- const loading = manifest === undefined;
53
+ return undefined;
54
+ const items = paletteItems(manifest);
55
+ const knownPatterns = {
56
+ 'buildr/hero': 'heroImage',
57
+ 'buildr/feature-grid': 'threeCards',
58
+ 'buildr/testimonial': 'testimonial',
59
+ 'buildr/cta': 'cta',
60
+ };
61
+ return {
62
+ ...items,
63
+ templates: items.templates.map((item) => {
64
+ const known = knownPatterns[item.id];
65
+ if (known === undefined)
66
+ return item;
67
+ const label = t(`patterns.item.${known}.name`);
68
+ const description = t(`patterns.item.${known}.desc`);
69
+ return {
70
+ ...item,
71
+ label,
72
+ description,
73
+ haystack: `${item.haystack} ${label} ${description}`.toLowerCase(),
74
+ };
75
+ }),
76
+ };
77
+ }, [manifest, t]);
78
+ const patterns = mode === 'patterns';
79
+ const patternCategories = [...new Set(palette?.templates.map((item) => item.category) ?? [])];
80
+ const patternCategoryName = (category) => ['marketing', 'blog', 'commerce'].includes(category)
81
+ ? t(`patterns.cat.${category}`)
82
+ : categoryName(t, category);
83
+ const source = patterns
84
+ ? palette?.templates.filter((item) => patternCategory === 'all' || item.category === patternCategory)
85
+ : palette?.components;
56
86
  const searching = query.trim() !== '';
57
- const empty = !loading && sections.every((section) => section.groups.length === 0);
87
+ const loading = manifest === undefined;
88
+ const results = useMemo(() => (searching && source !== undefined ? filterItems(source, query) : []), [searching, source, query]);
89
+ const groups = useMemo(() => !searching && source !== undefined
90
+ ? patterns
91
+ ? groupByCategory(source)
92
+ : blockSections(source)
93
+ : [], [searching, source, patterns]);
58
94
  const press = useDragPress();
59
95
  // `/` jumps to the search, unless the keyboard already belongs to a field or an editable region.
60
96
  useEffect(() => {
61
97
  const onKey = (event) => {
98
+ if (event.key === 'Escape' && store.view.getState().insertionTarget !== null) {
99
+ store.view.getState().setInsertionTarget(null);
100
+ }
62
101
  if (event.key !== '/' || event.defaultPrevented || event.isComposing)
63
102
  return;
64
103
  if (event.ctrlKey || event.metaKey || event.altKey)
@@ -71,17 +110,7 @@ export function InsertPanel() {
71
110
  };
72
111
  document.addEventListener('keydown', onKey);
73
112
  return () => document.removeEventListener('keydown', onKey);
74
- }, []);
75
- const chooseView = (next) => {
76
- setView(next);
77
- writeView(next);
78
- };
79
- const toggleCategory = (key) => setCollapsed((current) => {
80
- const next = new Set(current);
81
- if (!next.delete(key))
82
- next.add(key);
83
- return next;
84
- });
113
+ }, [searchRef, store]);
85
114
  const fragmentOf = (item) => {
86
115
  const versions = registryVersions(store.registry);
87
116
  if (item.kind === 'template') {
@@ -107,7 +136,7 @@ export function InsertPanel() {
107
136
  if (fragment === undefined)
108
137
  return;
109
138
  const state = store.getState();
110
- const placement = placeInsertion(state.doc, store.registry, state.selectedIds.at(-1) ?? null, fragment);
139
+ const placement = placeInsertion(state.doc, store.registry, state.selectedIds.at(-1) ?? null, fragment, store.view.getState().insertionTarget);
111
140
  if (!placement.ok) {
112
141
  toast.show({
113
142
  id: 'insert',
@@ -125,31 +154,61 @@ export function InsertPanel() {
125
154
  toast.show({ id: 'insert', variant: 'error', message: result.error.message });
126
155
  return;
127
156
  }
128
- toast.show({ id: 'insert', variant: 'success', message: `${t('insert.done')}: ${item.label}` });
157
+ setInsertionTarget(null);
158
+ toast.show({
159
+ id: 'insert',
160
+ variant: 'success',
161
+ message: t('insert.done.named').replace('{name}', () => item.label),
162
+ });
129
163
  // The command gives the fragment fresh ids; the new node is the one now at the target position.
130
164
  const created = store.getState().doc.nodes[parentId]?.slots?.[slot]?.[at];
131
165
  if (created !== undefined)
132
166
  store.select(created);
133
167
  };
134
- const renderItem = (item) => {
168
+ const onPress = (item, event) => {
169
+ if (readOnly)
170
+ return;
171
+ press?.(item.kind === 'template'
172
+ ? { kind: 'template', id: item.id }
173
+ : { kind: 'component', type: item.id }, item.label, event);
174
+ };
175
+ const addLabel = (item) => t(item.kind === 'template' ? 'patterns.insert' : 'blocks.add').replace('{name}', () => item.label);
176
+ const glyph = (item) => {
135
177
  const thumbnail = safeThumbnail(item.thumbnail);
136
- const button = (_jsxs("button", { type: "button", className: "bd-insert-item", onPointerDown: (event) => {
137
- if (readOnly)
138
- return;
139
- press?.(item.kind === 'template'
140
- ? { kind: 'template', id: item.id }
141
- : { kind: 'component', type: item.id }, item.label, event);
142
- }, "data-kind": item.kind, "data-id": item.id, onClick: () => insert(item), children: [item.kind === 'template' ? (_jsx("span", { className: "bd-insert-thumb", "aria-hidden": "true", children: thumbnail !== undefined ? (_jsx("img", { src: thumbnail, alt: "", loading: "lazy" })) : (_jsx(ComponentIcon, { meta: { icon: 'layout-template' }, size: "md" })) })) : (_jsx("span", { className: "bd-insert-icon", "aria-hidden": "true", "data-icon": item.icon, children: _jsx(ComponentIcon, { meta: { icon: item.icon }, size: "md" }) })), _jsx("span", { className: "bd-insert-label", children: item.label }), view === 'list' && item.description !== undefined ? (_jsx("span", { className: "bd-insert-desc", "aria-hidden": "true", children: item.description })) : null] }));
143
- return (_jsx("li", { children: item.description === undefined ? (button) : (_jsx(Tooltip, { content: item.description, children: button })) }, `${item.kind}:${item.id}`));
178
+ return item.kind === 'template' ? (_jsx("span", { className: "bd-insert-thumb", "aria-hidden": "true", children: thumbnail !== undefined ? (_jsx("img", { src: thumbnail, alt: "", loading: "lazy" })) : (_jsx(ComponentIcon, { meta: { icon: 'layout-template' }, size: "md" })) })) : (_jsx("span", { className: "bd-insert-icon", "aria-hidden": "true", "data-icon": item.icon, children: _jsx(ComponentIcon, { meta: { icon: item.icon }, size: "md" }) }));
179
+ };
180
+ const renderTile = (item, keyPrefix) => {
181
+ const title = item.label;
182
+ const description = item.description ??
183
+ t('patterns.description').replace('{category}', () => patternCategoryName(item.category));
184
+ const button = (_jsxs("button", { type: "button", className: "bd-insert-item", "aria-label": addLabel(item), onPointerDown: (event) => onPress(item, event), "data-kind": item.kind, "data-id": item.id, onClick: () => insert(item), children: [glyph(item), _jsx(Icon, { name: "ellipsis", className: "bd-insert-grip", "aria-hidden": "true" }), _jsx("span", { className: "bd-insert-label", children: title }), item.kind === 'template' ? _jsx("span", { className: "bd-insert-desc", children: description }) : null] }));
185
+ return (_jsx("li", { children: item.description === undefined ? (button) : (_jsx(Tooltip, { content: item.description, children: button })) }, `${keyPrefix}:${item.kind}:${item.id}`));
186
+ };
187
+ const renderResult = (item) => {
188
+ const [pre, mid, post] = splitMatch(item.label, query);
189
+ return (_jsx("li", { children: _jsxs("button", { type: "button", className: "bd-insert-item bd-insert-result", "aria-label": addLabel(item), onPointerDown: (event) => onPress(item, event), "data-kind": item.kind, "data-id": item.id, onClick: () => insert(item), children: [glyph(item), _jsxs("span", { className: "bd-insert-result-text", children: [_jsxs("span", { className: "bd-insert-label", children: [pre, mid === '' ? null : _jsx("mark", { className: "bd-insert-mark", children: mid }), post] }), _jsx("span", { className: "bd-insert-result-cat", children: categoryName(t, item.category) }), item.description !== undefined ? (_jsx("span", { className: "bd-insert-desc", children: item.description })) : null] })] }) }, `${item.kind}:${item.id}`));
144
190
  };
145
- return (_jsxs("div", { className: "bd-insert", "data-view": view, children: [_jsxs("div", { className: "bd-insert-bar", children: [_jsxs("div", { className: "bd-insert-searchbox", children: [_jsx(Icon, { name: "search", className: "bd-insert-search-icon" }), _jsx(Input, { ref: searchRef, type: "search", className: "bd-insert-search", value: query, "aria-label": t('insert.search'), "aria-keyshortcuts": "/", placeholder: t('insert.search'), onChange: (event) => setQuery(event.target.value) }), query === '' ? null : (_jsx(IconButton, { className: "bd-insert-clear", label: t('insert.clear'), icon: "x", onClick: () => {
146
- setQuery('');
147
- searchRef.current?.focus();
148
- } }))] }), _jsxs("div", { className: "bd-insert-views", children: [_jsx(IconButton, { label: t('insert.view.grid'), icon: "layout-grid", "aria-pressed": view === 'grid', onClick: () => chooseView('grid') }), _jsx(IconButton, { label: t('insert.view.list'), icon: "list", "aria-pressed": view === 'list', onClick: () => chooseView('list') })] })] }), _jsxs("div", { className: "bd-insert-scroll", children: [empty ? _jsx("p", { className: "bd-insert-empty", children: t('insert.empty') }) : null, loading ? (_jsxs("section", { className: "bd-insert-section", "aria-busy": "true", children: [_jsx("h3", { className: "bd-insert-heading", children: t('insert.templates') }), _jsx("ul", { className: "bd-insert-list", "data-kind": "template", "aria-hidden": "true", children: SKELETONS.map((key) => (_jsx("li", { className: "bd-insert-skeleton" }, key))) })] })) : null, sections.map((section) => section.groups.length === 0 ? null : (_jsxs("section", { className: "bd-insert-section", children: [_jsx("h3", { className: "bd-insert-heading", children: t(`insert.${section.id}`) }), section.groups.map((group) => {
149
- const key = `${section.id}:${group.category}`;
150
- const open = searching || !collapsed.has(key);
151
- const name = categoryName(t, group.category);
152
- const listId = `bd-insert-${section.id}-${group.category}`;
153
- return (_jsxs("div", { role: "group", "aria-label": name, className: "bd-insert-group", children: [_jsx("h4", { className: "bd-insert-category", children: _jsxs("button", { type: "button", className: "bd-insert-category-toggle", "aria-expanded": open, "aria-controls": listId, onClick: () => toggleCategory(key), children: [_jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right' }), _jsx("span", { className: "bd-insert-category-name", children: name }), _jsx("span", { className: "bd-insert-count", children: group.items.length })] }) }), _jsx("ul", { className: "bd-insert-list", id: listId, "data-kind": section.id === 'templates' ? 'template' : 'component', hidden: !open, children: group.items.map(renderItem) })] }, key));
154
- })] }, section.id)))] })] }));
191
+ const renderGroup = (key, name, items) => (_jsxs("div", { role: "group", "aria-label": name, className: "bd-insert-group", children: [_jsxs("h4", { className: "bd-insert-category", children: [_jsx("span", { className: "bd-insert-category-name", children: name }), _jsx("span", { className: "bd-insert-count", children: items.length })] }), _jsx("ul", { className: "bd-insert-list", "data-kind": "component", children: items.map((item) => renderTile(item, key)) })] }, key));
192
+ const kind = patterns ? 'template' : 'component';
193
+ const label = t(patterns ? 'patterns.search' : 'blocks.search');
194
+ const targetName = selectedNode === undefined
195
+ ? undefined
196
+ : selectedId === rootId
197
+ ? t('blocks.target.page')
198
+ : (selectedNode.name ??
199
+ manifest?.components[selectedNode.type]?.label ??
200
+ selectedNode.type);
201
+ return (_jsxs("div", { className: "bd-insert", "data-view": "grid", "data-mode": mode, children: [_jsx(SegmentedControl, { className: "bd-seg--full", label: t('leftPanel.kind'), value: mode, onValueChange: (next) => chooseMode(next === 'patterns' ? 'patterns' : 'blocks'), options: [
202
+ { value: 'blocks', label: t('leftPanel.mode.blocks') },
203
+ { value: 'patterns', label: t('leftPanel.mode.patterns') },
204
+ ] }), _jsx(SearchField, { ref: searchRef, value: query, onChange: setQuery, label: label, clearLabel: t('blocks.search.clear'), placeholder: label, hint: "/" }), _jsxs("div", { className: "bd-insert-target", role: "status", "data-node-id": insertionTarget?.parentId ?? selectedId ?? undefined, children: [_jsx(Icon, { name: "arrow-right", "aria-hidden": "true" }), _jsx("span", { children: insertionTarget !== null ? (t('insert.target.gap')
205
+ .replace('{name}', () => targetNode?.name ??
206
+ manifest?.components[targetNode?.type ?? '']?.label ??
207
+ targetNode?.type ??
208
+ insertionTarget.parentId)
209
+ .replace('{position}', String(insertionTarget.index + 1))) : targetName === undefined ? (t('leftPanel.insertAtEnd')) : (_jsxs(_Fragment, { children: [t('blocks.insertAfter'), " ", _jsx("b", { children: targetName })] })) }), insertionTarget !== null ? (_jsx("button", { type: "button", "aria-label": t('insert.target.clear'), onClick: () => setInsertionTarget(null), children: _jsx(Icon, { name: "x", size: "sm" }) })) : null] }), patterns ? (_jsx("div", { className: "bd-pattern-filters", role: "group", "aria-label": t('patterns.category'), children: ['all', ...patternCategories, 'mine'].map((category) => (_jsx("button", { type: "button", "aria-pressed": patternCategory === category, onClick: () => setPatternCategory(category), children: category === 'all'
210
+ ? t('patterns.cat.all')
211
+ : category === 'mine'
212
+ ? t('patterns.cat.mine')
213
+ : patternCategoryName(category) }, category))) })) : null, _jsxs("div", { className: "bd-insert-scroll", children: [loading ? (_jsx("section", { className: "bd-insert-section", "aria-busy": "true", children: _jsx("ul", { className: "bd-insert-list", "data-kind": "template", "aria-hidden": "true", children: SKELETONS.map((key) => (_jsx("li", { className: "bd-insert-skeleton" }, key))) }) })) : null, searching && !loading && results.length > 0 ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "bd-insert-results-count", role: "status", children: plural('blocks.results', results.length) }), _jsx("ul", { className: "bd-insert-results", "data-kind": kind, children: results.map(renderResult) })] })) : null, searching && !loading && results.length === 0 ? (_jsxs("p", { className: "bd-insert-empty", children: [t('blocks.empty').replace('{query}', () => query.trim()), patterns ? null : (_jsxs(_Fragment, { children: [' ', t('blocks.empty.check'), ' ', _jsx("button", { type: "button", className: "bd-insert-link", onClick: () => chooseMode('patterns'), children: t('blocks.empty.patterns') })] }))] })) : null, !searching && !loading ? (patterns ? (source?.length ? (_jsx("ul", { className: "bd-insert-list bd-pattern-list", "data-kind": "template", children: source.map((item) => renderTile(item, 'patterns')) })) : (_jsx("p", { className: "bd-insert-shell", children: t('patterns.empty') }))) : (groups.map((group, index) => renderGroup(`components:${index}:${group.category}`, categoryName(t, group.category), group.items)))) : null] }, mode)] }));
155
214
  }