@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
@@ -4,6 +4,7 @@ import { createRegistryMeta, createSeededIdGenerator, p, s, } from '@next-buildr
4
4
  import { act } from 'react';
5
5
  import { createRoot } from 'react-dom/client';
6
6
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import { StageSlotsContext } from '../app/stage-slots.js';
7
8
  import { MessagesProvider } from '../messages/index.js';
8
9
  import { collectIssues, countIssues, filterIssues, IssuesPanel, publishGate, } from '../panels/issues/index.js';
9
10
  import { createPersistence, PersistenceProvider, } from '../persistence/index.js';
@@ -142,32 +143,75 @@ describe('the Issues panel and the publish dialog', () => {
142
143
  await act(async () => target.click());
143
144
  expect(store.getState().selectedIds).toEqual(['widget0001']);
144
145
  });
145
- it('groups issues by severity, with severity and component icons', async () => {
146
+ it('lists issues worst first as rows with the severity icon, the message and the path', async () => {
146
147
  const { store, view } = setup(broken(), 'warn');
147
148
  await view(false);
148
149
  await act(async () => void store.validateNow());
149
- const sections = [...container.querySelectorAll('.bd-issues-severity')];
150
- expect(sections.length).toBeGreaterThan(0);
151
- const order = sections.map((section) => section.getAttribute('data-severity'));
152
- expect(order).toEqual(['error', 'warning', 'info'].filter((sev) => order.includes(sev)));
153
- for (const section of sections) {
154
- expect(section.querySelector('.bd-issues-heading svg')).not.toBeNull();
155
- expect(section.querySelector('.bd-issue-severity[role=img]')).not.toBeNull();
156
- expect(section.querySelector('.bd-issue-owner')?.textContent).not.toBe('');
150
+ const rows = [...container.querySelectorAll('.bd-issues-list .bd-issue')];
151
+ expect(rows.length).toBeGreaterThan(0);
152
+ const order = rows.map((row) => row.getAttribute('data-severity'));
153
+ expect(order).toEqual([...order].sort((x, y) => ['error', 'warning', 'info'].indexOf(x ?? '') -
154
+ ['error', 'warning', 'info'].indexOf(y ?? '')));
155
+ for (const row of rows) {
156
+ expect(row.querySelector('.bd-issue-severity[role=img]')).not.toBeNull();
157
+ expect(row.querySelector('.bd-issue-message')?.textContent).not.toBe('');
158
+ expect(row.querySelector('.bd-issue-path')?.textContent).not.toBe('');
157
159
  }
160
+ expect(container.querySelector('.bd-issues-count')?.textContent).toBe(String(rows.length));
161
+ expect(container.querySelector('.bd-issues-head h2')?.textContent).toBe('Issues on the page');
158
162
  });
159
- it('shows the publish counts as icon badges with a spoken text', async () => {
163
+ it('renders the help text of an issue under its message', async () => {
164
+ const { store, view } = setup(broken(), 'warn');
165
+ await view(false);
166
+ await act(async () => {
167
+ const snapshot = store.validateNow();
168
+ store.setState({
169
+ validation: {
170
+ ...snapshot,
171
+ a11y: [
172
+ {
173
+ ruleId: 'r',
174
+ severity: 'warning',
175
+ nodeId: 'widget0001',
176
+ message: 'Missing label',
177
+ help: 'Give it a label.',
178
+ },
179
+ ],
180
+ },
181
+ });
182
+ });
183
+ const helps = [...container.querySelectorAll('.bd-issues-list .bd-issue-help')];
184
+ expect(helps.map((help) => help.textContent)).toEqual(['Give it a label.']);
185
+ });
186
+ it('shows an all-good row when nothing was found', async () => {
187
+ const { store, view } = setup(clean(), 'warn');
188
+ await view(false);
189
+ await act(async () => void store.validateNow());
190
+ expect(container.querySelector('.bd-issue-ok')?.textContent).toContain('All good');
191
+ expect(container.querySelector('.bd-issues-count')?.textContent).toBe('0');
192
+ });
193
+ it('closes the drawer through the stage slots, and has no close button without them', async () => {
194
+ const { store, view } = setup(clean(), 'warn');
195
+ await view(false);
196
+ expect(container.querySelector('.bd-issues-head button')).toBeNull();
197
+ const setIssuesOpen = vi.fn();
198
+ await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(EditorStoreProvider, { store: store, children: _jsx(StageSlotsContext.Provider, { value: { stage: null, issuesOpen: true, setIssuesOpen }, children: _jsx(IssuesPanel, {}) }) }) })));
199
+ const close = container.querySelector('.bd-issues-head button[aria-label="Close issues panel"]');
200
+ expect(close).not.toBeNull();
201
+ await act(async () => close?.click());
202
+ expect(setIssuesOpen).toHaveBeenCalledWith(false);
203
+ });
204
+ it('shows the publish rows and the counts sentence, with scheduling disabled and the primary action focused', async () => {
160
205
  const { view } = setup(broken(), 'warn');
161
206
  await view(true);
162
- const badges = [...document.querySelectorAll('.bd-publish-badge')];
163
- expect(badges.map((badge) => badge.getAttribute('data-severity'))).toEqual([
164
- 'error',
165
- 'warning',
166
- 'info',
167
- ]);
168
- for (const badge of badges)
169
- expect(badge.querySelector('svg')).not.toBeNull();
170
- expect(badges[0]?.textContent).toMatch(/[0-9] errors/);
207
+ const dialog = document.querySelector('[role=dialog]');
208
+ expect(dialog?.querySelector('.bd-dialog-icon')).not.toBeNull();
209
+ expect(dialog?.querySelectorAll('.bd-publish-row').length).toBeGreaterThan(0);
210
+ expect(dialog?.querySelector('.bd-publish-counts')?.textContent).toMatch(/[0-9]+ (error|warning|note)/);
211
+ const options = [...(dialog?.querySelectorAll('.bd-publish-option') ?? [])];
212
+ expect(options.map((o) => o.getAttribute('aria-pressed'))).toEqual(['true', 'false']);
213
+ expect(options[1]?.getAttribute('aria-disabled')).toBe('true');
214
+ expect(document.activeElement?.textContent).toBe('Publish');
171
215
  });
172
216
  it('refuses to publish while errors exist under the block policy', async () => {
173
217
  const { publish, view } = setup(broken(), 'block');
@@ -0,0 +1,3 @@
1
+ /** The version history link of the host: a callback as it is, a URL only when it is a safe one. */
2
+ export declare function safeHistory<T extends string | (() => void) | undefined>(history: T): T | undefined;
3
+ //# sourceMappingURL=safe-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-history.d.ts","sourceRoot":"","sources":["../../src/toolbar/safe-history.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,EACrE,OAAO,EAAE,CAAC,GACT,CAAC,GAAG,SAAS,CAEf"}
@@ -0,0 +1,5 @@
1
+ import { isSafePreviewUrl } from '../preview/index.js';
2
+ /** The version history link of the host: a callback as it is, a URL only when it is a safe one. */
3
+ export function safeHistory(history) {
4
+ return typeof history === 'string' && !isSafePreviewUrl(history) ? undefined : history;
5
+ }
@@ -9,10 +9,30 @@ export interface SamplePickerProps {
9
9
  /** Where the choice is remembered; `localStorage` unless a test or host gives another. */
10
10
  readonly storage?: Pick<Storage, 'getItem' | 'setItem'> | undefined;
11
11
  }
12
+ export interface SamplesState {
13
+ readonly samples: readonly {
14
+ id: string;
15
+ label: string;
16
+ }[];
17
+ /** The chosen sample id, or DEFAULT_SAMPLE. */
18
+ readonly value: string;
19
+ /** The chosen entry's label; undefined while the default entry is in use. */
20
+ readonly label: string | undefined;
21
+ select(next: string): void;
22
+ }
23
+ /**
24
+ * The samples the adapter lists for a document and the remembered choice (docs/editor.md#sample-data):
25
+ * the choice is sent to the canvas as its context and remembered per document. Does nothing without
26
+ * props; samples stays empty when the adapter lists none (a page, not a template).
27
+ */
28
+ export declare function useSamples(props: SamplePickerProps | undefined): SamplesState;
29
+ /** The select that chooses the sample entry, for a useSamples state; nothing when there are none. */
30
+ export declare function SampleSelect({ state }: {
31
+ readonly state: SamplesState;
32
+ }): import("react").JSX.Element | null;
12
33
  /**
13
- * Chooses which entry a template is shown with (docs/editor.md#sample-data): the samples the adapter
14
- * lists, the choice sent to the canvas as its context and remembered per document. Renders nothing
15
- * when the adapter lists no samples (a page, not a template).
34
+ * Chooses which entry a template is shown with (docs/editor.md#sample-data). Renders nothing when the
35
+ * adapter lists no samples.
16
36
  */
17
- export declare function SamplePicker({ adapter, docRef, onChange, storage }: SamplePickerProps): import("react").JSX.Element | null;
37
+ export declare function SamplePicker(props: SamplePickerProps): import("react").JSX.Element;
18
38
  //# sourceMappingURL=sample-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sample-picker.d.ts","sourceRoot":"","sources":["../../src/toolbar/sample-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5E,4EAA4E;AAC5E,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CACrE;AAmBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,iBAAiB,sCAiDrF"}
1
+ {"version":3,"file":"sample-picker.d.ts","sourceRoot":"","sources":["../../src/toolbar/sample-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5E,4EAA4E;AAC5E,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CACrE;AAmBD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAgD7E;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,sCAcvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAEpD"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
2
+ import { useEffect, useRef, useState } from 'react';
3
3
  import { useT } from '../messages/index.js';
4
4
  import { Select } from '../ui/index.js';
5
5
  /** The choice that leaves the canvas on the adapter's own default entry. */
@@ -22,19 +22,23 @@ const write = (storage, key, value) => {
22
22
  }
23
23
  };
24
24
  /**
25
- * Chooses which entry a template is shown with (docs/editor.md#sample-data): the samples the adapter
26
- * lists, the choice sent to the canvas as its context and remembered per document. Renders nothing
27
- * when the adapter lists no samples (a page, not a template).
25
+ * The samples the adapter lists for a document and the remembered choice (docs/editor.md#sample-data):
26
+ * the choice is sent to the canvas as its context and remembered per document. Does nothing without
27
+ * props; samples stays empty when the adapter lists none (a page, not a template).
28
28
  */
29
- export function SamplePicker({ adapter, docRef, onChange, storage }) {
30
- const t = useT();
29
+ export function useSamples(props) {
31
30
  const [samples, setSamples] = useState([]);
32
31
  const [value, setValue] = useState(DEFAULT_SAMPLE);
33
- const collection = docRef.collection;
34
- const id = docRef.id;
35
- // `onChange` is deliberately not a dependency: the host passes a fresh closure every render.
36
- // biome-ignore lint/correctness/useExhaustiveDependencies: see above
32
+ const adapter = props?.adapter;
33
+ const storage = props?.storage;
34
+ const collection = props?.docRef.collection;
35
+ const id = props?.docRef.id;
36
+ // The latest callback, so a fresh closure every render does not restart the effect.
37
+ const onChange = useRef(props?.onChange);
38
+ onChange.current = props?.onChange;
37
39
  useEffect(() => {
40
+ if (adapter === undefined || collection === undefined || id === undefined)
41
+ return;
38
42
  let cancelled = false;
39
43
  const ref = { collection, id };
40
44
  void (async () => {
@@ -52,21 +56,41 @@ export function SamplePicker({ adapter, docRef, onChange, storage }) {
52
56
  // A remembered entry that no longer exists is forgotten, not sent to the canvas.
53
57
  if (saved !== null && list.some((sample) => sample.id === saved)) {
54
58
  setValue(saved);
55
- onChange(saved);
59
+ onChange.current?.(saved);
56
60
  }
57
61
  })();
58
62
  return () => {
59
63
  cancelled = true;
60
64
  };
61
65
  }, [adapter, collection, id, storage]);
62
- if (samples.length === 0)
66
+ const select = (next) => {
67
+ if (collection === undefined || id === undefined)
68
+ return;
69
+ setValue(next);
70
+ write(storage, keyOf({ collection, id }), next);
71
+ onChange.current?.(next === DEFAULT_SAMPLE ? null : next);
72
+ };
73
+ return {
74
+ samples,
75
+ value,
76
+ label: samples.find((sample) => sample.id === value)?.label,
77
+ select,
78
+ };
79
+ }
80
+ /** The select that chooses the sample entry, for a useSamples state; nothing when there are none. */
81
+ export function SampleSelect({ state }) {
82
+ const t = useT();
83
+ if (state.samples.length === 0)
63
84
  return null;
64
- return (_jsx(Select, { label: t('sample.label'), value: value, onValueChange: (next) => {
65
- setValue(next);
66
- write(storage, keyOf({ collection, id }), next);
67
- onChange(next === DEFAULT_SAMPLE ? null : next);
68
- }, options: [
85
+ return (_jsx(Select, { label: t('sample.label'), value: state.value, onValueChange: state.select, options: [
69
86
  { value: DEFAULT_SAMPLE, label: t('sample.default') },
70
- ...samples.map((sample) => ({ value: sample.id, label: sample.label })),
87
+ ...state.samples.map((sample) => ({ value: sample.id, label: sample.label })),
71
88
  ] }));
72
89
  }
90
+ /**
91
+ * Chooses which entry a template is shown with (docs/editor.md#sample-data). Renders nothing when the
92
+ * adapter lists no samples.
93
+ */
94
+ export function SamplePicker(props) {
95
+ return _jsx(SampleSelect, { state: useSamples(props) });
96
+ }
@@ -1,13 +1,5 @@
1
- import type { BreakpointConfig } from '../app/config.ts';
2
- import { type Zoom } from './zoom-menu.tsx';
3
- export interface ToolbarCentreProps {
4
- readonly breakpoints: readonly BreakpointConfig[];
5
- readonly breakpoint: string;
6
- readonly onBreakpointChange: (id: string) => void;
7
- /** The canvas zoom and how to change it (`host.setZoom`); the zoom menu is left out without a handler. */
8
- readonly zoom?: Zoom | undefined;
9
- readonly onZoomChange?: ((zoom: Zoom) => void) | undefined;
10
- }
11
- /** The screen-size control and the zoom menu. */
1
+ import { type PageChipProps } from './page-chip.tsx';
2
+ export type ToolbarCentreProps = PageChipProps;
3
+ /** The page chip, which opens the page options. */
12
4
  export declare function ToolbarCentre(props: ToolbarCentreProps): import("react").JSX.Element;
13
5
  //# sourceMappingURL=toolbar-centre.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-centre.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar-centre.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,KAAK,IAAI,EAAY,MAAM,iBAAiB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,0GAA0G;IAC1G,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC5D;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAatD"}
1
+ {"version":3,"file":"toolbar-centre.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar-centre.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAE/C,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAMtD"}
@@ -1,7 +1,6 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { BreakpointControl } from './breakpoint-control.js';
3
- import { ZoomMenu } from './zoom-menu.js';
4
- /** The screen-size control and the zoom menu. */
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { PageChip } from './page-chip.js';
3
+ /** The page chip, which opens the page options. */
5
4
  export function ToolbarCentre(props) {
6
- return (_jsxs("div", { className: "bd-toolbar-zone", "data-zone": "centre", children: [_jsx(BreakpointControl, { breakpoints: props.breakpoints, breakpoint: props.breakpoint, onChange: props.onBreakpointChange }), props.onZoomChange !== undefined && (_jsx(ZoomMenu, { zoom: props.zoom ?? 'fit', onChange: props.onZoomChange }))] }));
5
+ return (_jsx("div", { className: "bd-toolbar-cluster", "data-zone": "centre", children: _jsx(PageChip, { ...props }) }));
7
6
  }
@@ -1,12 +1,9 @@
1
1
  export interface ToolbarLeftProps {
2
- readonly title: string;
3
- /** Saves a new page name; without it (the backend cannot rename) the title is plain text. */
4
- readonly onRename?: ((title: string) => Promise<void>) | undefined;
5
- /** Draft or published; the pill is left out without it. */
6
- readonly status?: 'draft' | 'published' | undefined;
7
2
  /** The page in the CMS's admin; the link is left out without it, or when it moved to the more menu. */
8
3
  readonly cmsUrl?: string | undefined;
4
+ /** A phone-wide row: only the panel toggle, undo and redo stay (the mark and the back link are left out). */
5
+ readonly compact?: boolean;
9
6
  }
10
- /** The product mark, back to the CMS as an icon button, the page name and its draft or published pill. */
11
- export declare function ToolbarLeft({ title, onRename, status, cmsUrl }: ToolbarLeftProps): import("react").JSX.Element;
7
+ /** Back to the CMS, the product mark, a divider, the left panel toggle, undo and redo. */
8
+ export declare function ToolbarLeft({ cmsUrl, compact }: ToolbarLeftProps): import("react").JSX.Element;
12
9
  //# sourceMappingURL=toolbar-left.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-left.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar-left.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACnE,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,uGAAuG;IACvG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAOD,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,+BAkChF"}
1
+ {"version":3,"file":"toolbar-left.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar-left.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,uGAAuG;IACvG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,6GAA6G;IAC7G,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAe,EAAE,EAAE,gBAAgB,+BA+CxE"}
@@ -1,16 +1,18 @@
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 { useT } from '../messages/index.js';
3
- import { useEditorState } from '../store/index.js';
4
- import { Icon, Tooltip } from '../ui/index.js';
3
+ import { useShortcutHint } from '../shortcuts/index.js';
4
+ import { useEditor, useEditorState } from '../store/index.js';
5
+ import { Icon, IconButton, Tooltip } from '../ui/index.js';
5
6
  import { Brand } from './brand.js';
6
- import { EditableTitle } from './editable-title.js';
7
- const STATUS_LABELS = {
8
- draft: 'toolbar.status.draft',
9
- published: 'toolbar.status.published',
10
- };
11
- /** The product mark, back to the CMS as an icon button, the page name and its draft or published pill. */
12
- export function ToolbarLeft({ title, onRename, status, cmsUrl }) {
7
+ import { PanelToggle } from './panel-toggles.js';
8
+ /** Back to the CMS, the product mark, a divider, the left panel toggle, undo and redo. */
9
+ export function ToolbarLeft({ cmsUrl, compact = false }) {
13
10
  const t = useT();
11
+ const store = useEditor();
12
+ const canUndo = useEditorState((state) => state.canUndo);
13
+ const canRedo = useEditorState((state) => state.canRedo);
14
14
  const readOnly = useEditorState((state) => state.readOnly);
15
- return (_jsxs("div", { className: "bd-toolbar-zone", "data-zone": "left", children: [_jsx(Brand, {}), cmsUrl !== undefined && (_jsx(Tooltip, { content: t('toolbar.back'), children: _jsx("a", { className: "bd-button bd-icon-button bd-toolbar-link", "data-variant": "ghost", href: cmsUrl, "aria-label": t('toolbar.back'), children: _jsx(Icon, { name: "arrow-left" }) }) })), onRename === undefined ? (_jsx("h1", { className: "bd-toolbar-title", title: title, children: title })) : (_jsx("h1", { className: "bd-toolbar-heading", children: _jsx(EditableTitle, { title: title, onRename: onRename, disabled: readOnly }) })), status !== undefined && (_jsx("span", { className: "bd-status-pill", "data-status": status, children: t(STATUS_LABELS[status]) }))] }));
15
+ const undoHint = useShortcutHint('edit.undo');
16
+ const redoHint = useShortcutHint('edit.redo');
17
+ return (_jsxs("div", { className: "bd-toolbar-cluster", "data-zone": "left", children: [cmsUrl !== undefined && !compact && (_jsx(Tooltip, { content: t('toolbar.backToCms'), children: _jsx("a", { className: "bd-button bd-icon-button bd-toolbar-link", "data-variant": "ghost", href: cmsUrl, "aria-label": t('toolbar.backToCms'), children: _jsx(Icon, { name: "arrow-left" }) }) })), !compact && (_jsxs(_Fragment, { children: [_jsx(Brand, {}), _jsx("span", { className: "bd-toolbar-divider", "aria-hidden": "true" })] })), _jsx(PanelToggle, { side: "left" }), _jsx(IconButton, { label: t('toolbar.undo'), hint: undoHint, icon: "undo-2", variant: "ghost", disabled: !canUndo || readOnly, onClick: () => store.undo() }), _jsx(IconButton, { label: t('toolbar.redo'), hint: redoHint, icon: "redo-2", variant: "ghost", disabled: !canRedo || readOnly, onClick: () => store.redo() })] }));
16
18
  }
@@ -1,19 +1,34 @@
1
- import type { ReactNode } from 'react';
1
+ import type { BreakpointConfig } from '../app/config.ts';
2
+ import { type MoreMenuProps } from './more-menu.tsx';
2
3
  export interface ToolbarRightProps {
3
- /** The locale and sample pickers (the shell's), placed between the save status and Preview. */
4
- readonly pickers?: ReactNode;
4
+ readonly breakpoints: readonly BreakpointConfig[];
5
+ readonly breakpoint: string;
6
+ readonly onBreakpointChange: (id: string) => void;
5
7
  readonly status: string;
8
+ readonly onLocaleChange?: ((locale: string) => void) | undefined;
6
9
  readonly onPreview?: (() => void) | undefined;
7
10
  readonly onPublish?: (() => void) | undefined;
8
11
  readonly canPublish?: boolean | undefined;
9
12
  /** The save text is visually hidden (the row is tight). */
10
13
  readonly compactSave: boolean;
11
- /** The version history: a link in the row, or an item of the more menu when the row is tight. */
12
- readonly historyUrl?: string | undefined;
14
+ /**
15
+ * A phone-wide row: the screen size, the content language and Preview move into the more menu, and
16
+ * Publish keeps its icon (`tight`: without its text).
17
+ */
18
+ readonly compact?: boolean;
19
+ readonly tight?: boolean;
20
+ /** The version history: an icon link in the row, or an item of the more menu when the row is tight. */
21
+ readonly historyUrl?: string | (() => void) | undefined;
13
22
  readonly historyInMenu: boolean;
14
23
  /** The CMS link, when the row had no room for it; the more menu lists it. */
15
24
  readonly moreCmsUrl?: string | undefined;
25
+ readonly sample?: MoreMenuProps['sample'];
26
+ readonly helpUrl?: string | undefined;
27
+ readonly onOpenShortcuts?: (() => void) | undefined;
16
28
  }
17
- /** Undo and redo, the save status, the pickers, Preview (secondary), Publish (the one primary) and more. */
29
+ /**
30
+ * Screen size, save status, content language, version history, Preview, the more menu, the right
31
+ * panel toggle and Publish (the one primary action).
32
+ */
18
33
  export declare function ToolbarRight(props: ToolbarRightProps): import("react").JSX.Element;
19
34
  //# sourceMappingURL=toolbar-right.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-right.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar-right.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,MAAM,WAAW,iBAAiB;IAChC,+FAA+F;IAC/F,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,iGAAiG;IACjG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,4GAA4G;AAC5G,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAgEpD"}
1
+ {"version":3,"file":"toolbar-right.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar-right.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAK/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,uGAAuG;IACvG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACrD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BA+FpD"}
@@ -1,21 +1,35 @@
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 { useT } from '../messages/index.js';
3
- import { useShortcutHint } from '../shortcuts/index.js';
4
- import { useEditor, useEditorState } from '../store/index.js';
5
- import { Button, Icon, IconButton, Tooltip } from '../ui/index.js';
3
+ import { useEditorState } from '../store/index.js';
4
+ import { Button, Icon, Tooltip } from '../ui/index.js';
5
+ import { BreakpointControl } from './breakpoint-control.js';
6
+ import { LocaleChip } from './locale-chip.js';
6
7
  import { MoreMenu } from './more-menu.js';
8
+ import { PanelToggle } from './panel-toggles.js';
9
+ import { safeHistory } from './safe-history.js';
7
10
  import { SaveIndicator } from './save-indicator.js';
8
- /** Undo and redo, the save status, the pickers, Preview (secondary), Publish (the one primary) and more. */
11
+ /**
12
+ * Screen size, save status, content language, version history, Preview, the more menu, the right
13
+ * panel toggle and Publish (the one primary action).
14
+ */
9
15
  export function ToolbarRight(props) {
10
16
  const t = useT();
11
- const store = useEditor();
12
- const canUndo = useEditorState((state) => state.canUndo);
13
- const canRedo = useEditorState((state) => state.canRedo);
14
17
  const readOnly = useEditorState((state) => state.readOnly);
15
- const undoHint = useShortcutHint('edit.undo');
16
- const redoHint = useShortcutHint('edit.redo');
17
- return (_jsxs("div", { className: "bd-toolbar-zone", "data-zone": "right", children: [_jsxs("fieldset", { className: "bd-toolbar-group", "aria-label": t('toolbar.history'), children: [_jsx(IconButton, { label: t('shortcut.undo'), hint: undoHint, icon: "undo-2", variant: "ghost", disabled: !canUndo || readOnly, onClick: () => store.undo() }), _jsx(IconButton, { label: t('shortcut.redo'), hint: redoHint, icon: "redo-2", variant: "ghost", disabled: !canRedo || readOnly, onClick: () => store.redo() })] }), _jsx(SaveIndicator, { compact: props.compactSave }), props.pickers, props.historyUrl !== undefined && !props.historyInMenu && (_jsx(Tooltip, { content: t('toolbar.versions'), children: _jsx("a", { className: "bd-button bd-icon-button bd-toolbar-link", "data-variant": "ghost", href: props.historyUrl, "aria-label": t('toolbar.versions'), children: _jsx(Icon, { name: "history" }) }) })), _jsx(Button, { onClick: props.onPreview, disabled: props.onPreview === undefined, children: t('toolbar.preview') }), _jsx(Button, { variant: "primary", onClick: props.onPublish, disabled: props.onPublish === undefined ||
18
- props.canPublish === false ||
19
- readOnly ||
20
- props.status === 'conflict', children: t('toolbar.publish') }), _jsx(MoreMenu, { historyUrl: props.historyInMenu ? props.historyUrl : undefined, cmsUrl: props.moreCmsUrl })] }));
18
+ const compact = props.compact === true;
19
+ const historyUrl = safeHistory(props.historyUrl);
20
+ const publishDisabled = props.onPublish === undefined ||
21
+ props.canPublish === false ||
22
+ readOnly ||
23
+ props.status === 'conflict';
24
+ return (_jsxs("div", { className: "bd-toolbar-cluster", "data-zone": "right", children: [!compact && (_jsxs(_Fragment, { children: [_jsx(BreakpointControl, { breakpoints: props.breakpoints, breakpoint: props.breakpoint, onChange: props.onBreakpointChange }), _jsx("span", { className: "bd-toolbar-divider", "aria-hidden": "true" })] })), _jsx(SaveIndicator, { compact: props.compactSave }), !compact && _jsx(LocaleChip, { onChange: props.onLocaleChange }), historyUrl !== undefined &&
25
+ !props.historyInMenu &&
26
+ (typeof historyUrl === 'function' ? (_jsx(Tooltip, { content: t('toolbar.versions'), children: _jsx(Button, { variant: "ghost", className: "bd-icon-button", "aria-label": t('toolbar.versions'), onClick: historyUrl, children: _jsx(Icon, { name: "history" }) }) })) : (_jsx(Tooltip, { content: t('toolbar.versions'), children: _jsx("a", { className: "bd-button bd-icon-button bd-toolbar-link", "data-variant": "ghost", href: historyUrl, "aria-label": t('toolbar.versions'), children: _jsx(Icon, { name: "history" }) }) }))), !compact && (_jsx(Tooltip, { content: t('toolbar.preview.newTab'), children: _jsx(Button, { variant: "ghost", className: "bd-icon-button", "aria-label": t('toolbar.preview.page'), onClick: props.onPreview, disabled: props.onPreview === undefined, children: _jsx(Icon, { name: "eye" }) }) })), _jsx(MoreMenu, { compact: compact
27
+ ? {
28
+ breakpoints: props.breakpoints,
29
+ breakpoint: props.breakpoint,
30
+ onBreakpointChange: props.onBreakpointChange,
31
+ onPreview: props.onPreview,
32
+ onLocaleChange: props.onLocaleChange,
33
+ }
34
+ : undefined, historyUrl: props.historyInMenu ? historyUrl : undefined, cmsUrl: props.moreCmsUrl, sample: props.sample, helpUrl: props.helpUrl, onOpenShortcuts: props.onOpenShortcuts }), _jsx(PanelToggle, { side: "right" }), _jsxs(Button, { variant: "primary", className: "bd-publish", "aria-haspopup": "dialog", "aria-label": props.tight === true ? t('toolbar.publish') : undefined, "data-icon-only": props.tight === true, onClick: props.onPublish, disabled: publishDisabled, children: [compact && _jsx(Icon, { name: "send" }), props.tight !== true && t('toolbar.publish')] })] }));
21
35
  }
@@ -1,26 +1,32 @@
1
- import { type ReactNode } from 'react';
2
1
  import type { BreakpointConfig } from '../app/config.ts';
3
- import type { Zoom } from './zoom-menu.tsx';
2
+ import { type SamplePickerProps } from './sample-picker.tsx';
4
3
  export interface ToolbarProps {
5
- /** The document's title, shown after the link back. */
4
+ /** The document's title, shown in the page chip and renamed in the page options. */
6
5
  readonly title: string;
7
- /** Saves a new page name (`adapter.rename`); the title is not editable without it. */
6
+ /** Saves a new page name (`adapter.rename`); the name is read-only without it. */
8
7
  readonly onTitleChange?: ((title: string) => Promise<void>) | undefined;
9
- /** Draft or published, as a pill next to the title. */
8
+ /** The page's address, read-only in the page options; the row is left out without it. */
9
+ readonly slug?: string | undefined;
10
+ /** Draft or published, as a small chip in the page chip. */
10
11
  readonly status?: 'draft' | 'published' | undefined;
11
12
  readonly breakpoints: readonly BreakpointConfig[];
12
13
  readonly breakpoint: string;
13
14
  readonly onBreakpointChange: (id: string) => void;
14
- /** The canvas zoom (`host.setZoom`); `fit` when left out. */
15
- readonly zoom?: Zoom | undefined;
16
- /** Changes the canvas zoom; the zoom menu is left out without it. */
17
- readonly onZoomChange?: ((zoom: Zoom) => void) | undefined;
18
15
  /** The page in the CMS's admin (`adapter.cmsUrl`); the link is left out without it. */
19
16
  readonly cmsUrl?: string | undefined;
20
- /** The version history in the CMS; the link is left out without it. */
21
- readonly historyUrl?: string | undefined;
22
- /** The locale and sample pickers, rendered on the right between the save status and Preview. */
23
- readonly pickers?: ReactNode;
17
+ /** The version history: an address (a link) or a function (a button); the icon is left out without it. */
18
+ readonly historyUrl?: string | (() => void) | undefined;
19
+ /** The help page; the Help row of the more menu is left out without it. */
20
+ readonly helpUrl?: string | undefined;
21
+ /** Opens the shortcuts dialog from the more menu; without it the shortcut provider's own opener is used. */
22
+ readonly onOpenShortcuts?: (() => void) | undefined;
23
+ /** Tells the canvas which content language to render (`CanvasHost.setLocale`). */
24
+ readonly onLocaleChange?: ((locale: string) => void) | undefined;
25
+ /** The sample data source (templates); without it there is no sample data. */
26
+ readonly sample?: SamplePickerProps | undefined;
27
+ /** The page options dialog's state, when the shell controls it (the inspector's "Page settings" opens it too). */
28
+ readonly pageOptionsOpen?: boolean | undefined;
29
+ readonly onPageOptionsOpenChange?: ((open: boolean) => void) | undefined;
24
30
  /** Flushes the save and opens the preview (PB-091). */
25
31
  readonly onPreview?: (() => void) | undefined;
26
32
  /** Opens the publish dialog (PB-088). */
@@ -29,10 +35,10 @@ export interface ToolbarProps {
29
35
  readonly canPublish?: boolean | undefined;
30
36
  }
31
37
  /**
32
- * The editor's primary actions (docs/editor.md#toolbar-pb-083) in three zones: the link back, title
33
- * and status on the left; screen size and zoom in the centre; undo/redo, save status, pickers,
34
- * Preview, Publish and the more menu on the right. It reads the store and the persistence
35
- * controller from context; the shortcuts show in the tooltips.
38
+ * The editor's primary actions (docs/editor.md#toolbar-pb-083) in a `1fr / auto / 1fr` grid. Left:
39
+ * back, mark, left panel toggle, undo, redo. Centre: the page chip (opens the page options). Right:
40
+ * screen size, save status, content language, history, Preview, more, right panel toggle, Publish.
41
+ * It reads the store and the persistence controller from context; shortcuts show in the tooltips.
36
42
  */
37
43
  export declare function Toolbar(props: ToolbarProps): import("react").JSX.Element;
38
44
  //# sourceMappingURL=toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE,uDAAuD;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,qEAAqE;IACrE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gGAAgG;IAChG,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AASD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BAsC1C"}
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/toolbar/toolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKzD,OAAO,EAAE,KAAK,iBAAiB,EAAc,MAAM,qBAAqB,CAAC;AAMzE,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,0GAA0G;IAC1G,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACxD,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,4GAA4G;IAC5G,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACpD,kFAAkF;IAClF,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjE,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChD,kHAAkH;IAClH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACzE,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AASD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BA6D1C"}
@@ -1,27 +1,44 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useRef } from 'react';
2
+ import { useRef, useState } from 'react';
3
+ import { useShellPanels } from '../app/shell-panels.js';
3
4
  import { usePersistenceState } from '../persistence/index.js';
4
- import { PanelToggle } from './panel-toggles.js';
5
+ import { useEditorState } from '../store/index.js';
6
+ import { PageOptionsDialog } from './page-options-dialog.js';
7
+ import { useSamples } from './sample-picker.js';
5
8
  import { ToolbarCentre } from './toolbar-centre.js';
6
9
  import { ToolbarLeft } from './toolbar-left.js';
7
10
  import { ToolbarRight } from './toolbar-right.js';
8
11
  import { useOverflowLevel } from './use-overflow-level.js';
9
12
  /**
10
- * What changes as the row runs out of room, in order (a step is taken only when the content
11
- * overflows): 1 the version history moves into the more menu, 2 the save text becomes icon only,
12
- * 3 the link back to the CMS moves into the more menu, 4 the title may shrink.
13
+ * What changes as the row runs out of room, in order (a step is taken only when a zone overflows):
14
+ * 1 the version history moves into the more menu, 2 the save text becomes icon only, 3 the link
15
+ * back to the CMS moves into the more menu, 4 the page name and the product name are hidden.
13
16
  */
14
17
  const COLLAPSE = { versions: 1, saveText: 2, cms: 3, title: 4 };
15
18
  /**
16
- * The editor's primary actions (docs/editor.md#toolbar-pb-083) in three zones: the link back, title
17
- * and status on the left; screen size and zoom in the centre; undo/redo, save status, pickers,
18
- * Preview, Publish and the more menu on the right. It reads the store and the persistence
19
- * controller from context; the shortcuts show in the tooltips.
19
+ * The editor's primary actions (docs/editor.md#toolbar-pb-083) in a `1fr / auto / 1fr` grid. Left:
20
+ * back, mark, left panel toggle, undo, redo. Centre: the page chip (opens the page options). Right:
21
+ * screen size, save status, content language, history, Preview, more, right panel toggle, Publish.
22
+ * It reads the store and the persistence controller from context; shortcuts show in the tooltips.
20
23
  */
21
24
  export function Toolbar(props) {
22
25
  const row = useRef(null);
23
26
  const level = useOverflowLevel(row, COLLAPSE.title);
24
27
  const status = usePersistenceState((state) => state.status);
25
- const cmsMoved = level >= COLLAPSE.cms;
26
- return (_jsxs("div", { className: "bd-toolbar-row", ref: row, "data-level": level, children: [_jsx(PanelToggle, { side: "left" }), _jsx(ToolbarLeft, { title: props.title, onRename: props.onTitleChange, status: props.status, cmsUrl: cmsMoved ? undefined : props.cmsUrl }), _jsx("span", { className: "bd-toolbar-spacer" }), _jsx(ToolbarCentre, { breakpoints: props.breakpoints, breakpoint: props.breakpoint, onBreakpointChange: props.onBreakpointChange, zoom: props.zoom, onZoomChange: props.onZoomChange }), _jsx("span", { className: "bd-toolbar-spacer" }), _jsx(ToolbarRight, { pickers: props.pickers, status: status, onPreview: props.onPreview, onPublish: props.onPublish, canPublish: props.canPublish, compactSave: level >= COLLAPSE.saveText, historyUrl: props.historyUrl, historyInMenu: level >= COLLAPSE.versions, moreCmsUrl: cmsMoved ? props.cmsUrl : undefined }), _jsx(PanelToggle, { side: "right" })] }));
28
+ const readOnly = useEditorState((state) => state.readOnly);
29
+ const [ownOpen, setOwnOpen] = useState(false);
30
+ const optionsOpen = props.pageOptionsOpen ?? ownOpen;
31
+ const setOptionsOpen = (open) => {
32
+ setOwnOpen(open);
33
+ props.onPageOptionsOpenChange?.(open);
34
+ };
35
+ const samples = useSamples(props.sample);
36
+ // A phone-wide editor (the layout says so) collapses the row by design, not by measuring.
37
+ const panels = useShellPanels();
38
+ const compact = panels?.compact === true;
39
+ const tight = panels?.tight === true;
40
+ const cmsMoved = compact || level >= COLLAPSE.cms;
41
+ return (_jsxs("div", { className: "bd-toolbar-row", ref: row, "data-level": level, "data-compact": compact, children: [_jsx(ToolbarLeft, { cmsUrl: cmsMoved ? undefined : props.cmsUrl, compact: compact }), _jsx(ToolbarCentre, { title: props.title, status: props.status, open: optionsOpen, onOpen: () => setOptionsOpen(true) }), _jsx(ToolbarRight, { breakpoints: props.breakpoints, breakpoint: props.breakpoint, onBreakpointChange: props.onBreakpointChange, status: status, onLocaleChange: props.onLocaleChange, onPreview: props.onPreview, onPublish: props.onPublish, canPublish: props.canPublish, compactSave: compact || level >= COLLAPSE.saveText, compact: compact, tight: tight, historyUrl: props.historyUrl, historyInMenu: compact || level >= COLLAPSE.versions, moreCmsUrl: cmsMoved ? props.cmsUrl : undefined, sample: samples.samples.length > 0
42
+ ? { entry: samples.label, onOpen: () => setOptionsOpen(true) }
43
+ : undefined, helpUrl: props.helpUrl, onOpenShortcuts: props.onOpenShortcuts }), _jsx(PageOptionsDialog, { open: optionsOpen, onOpenChange: setOptionsOpen, title: props.title, onRename: props.onTitleChange, slug: props.slug, readOnly: readOnly, samples: samples })] }));
27
44
  }