@next-buildr/editor 0.0.0-stage → 2.0.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 (471) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/app/builder-editor.d.ts +8 -0
  4. package/dist/app/builder-editor.d.ts.map +1 -0
  5. package/dist/app/builder-editor.js +14 -0
  6. package/dist/app/builder-editor.test.d.ts +2 -0
  7. package/dist/app/builder-editor.test.d.ts.map +1 -0
  8. package/dist/app/builder-editor.test.js +199 -0
  9. package/dist/app/config.d.ts +59 -0
  10. package/dist/app/config.d.ts.map +1 -0
  11. package/dist/app/config.js +18 -0
  12. package/dist/app/content-language.test.d.ts +2 -0
  13. package/dist/app/content-language.test.d.ts.map +1 -0
  14. package/dist/app/content-language.test.js +157 -0
  15. package/dist/app/editor-app.d.ts +17 -0
  16. package/dist/app/editor-app.d.ts.map +1 -0
  17. package/dist/app/editor-app.js +206 -0
  18. package/dist/app/editor-app.test.d.ts +2 -0
  19. package/dist/app/editor-app.test.d.ts.map +1 -0
  20. package/dist/app/editor-app.test.js +135 -0
  21. package/dist/app/layout.d.ts +32 -0
  22. package/dist/app/layout.d.ts.map +1 -0
  23. package/dist/app/layout.js +82 -0
  24. package/dist/app/manifest.d.ts +12 -0
  25. package/dist/app/manifest.d.ts.map +1 -0
  26. package/dist/app/manifest.js +17 -0
  27. package/dist/app/shell-panels.d.ts +15 -0
  28. package/dist/app/shell-panels.d.ts.map +1 -0
  29. package/dist/app/shell-panels.js +5 -0
  30. package/dist/app/small-screen.d.ts +12 -0
  31. package/dist/app/small-screen.d.ts.map +1 -0
  32. package/dist/app/small-screen.js +33 -0
  33. package/dist/app/small-screen.test.d.ts +2 -0
  34. package/dist/app/small-screen.test.d.ts.map +1 -0
  35. package/dist/app/small-screen.test.js +108 -0
  36. package/dist/app/status-info.d.ts +14 -0
  37. package/dist/app/status-info.d.ts.map +1 -0
  38. package/dist/app/status-info.js +34 -0
  39. package/dist/app/use-resizable.d.ts +34 -0
  40. package/dist/app/use-resizable.d.ts.map +1 -0
  41. package/dist/app/use-resizable.js +84 -0
  42. package/dist/canvas-host/canvas-frame.d.ts +53 -0
  43. package/dist/canvas-host/canvas-frame.d.ts.map +1 -0
  44. package/dist/canvas-host/canvas-frame.js +146 -0
  45. package/dist/canvas-host/canvas-frame.test.d.ts +2 -0
  46. package/dist/canvas-host/canvas-frame.test.d.ts.map +1 -0
  47. package/dist/canvas-host/canvas-frame.test.js +91 -0
  48. package/dist/canvas-host/host.d.ts +109 -0
  49. package/dist/canvas-host/host.d.ts.map +1 -0
  50. package/dist/canvas-host/host.js +293 -0
  51. package/dist/canvas-host/host.test.d.ts +2 -0
  52. package/dist/canvas-host/host.test.d.ts.map +1 -0
  53. package/dist/canvas-host/host.test.js +398 -0
  54. package/dist/canvas-host/index.d.ts +5 -0
  55. package/dist/canvas-host/index.d.ts.map +1 -0
  56. package/dist/canvas-host/index.js +2 -0
  57. package/dist/clipboard/clipboard.d.ts +38 -0
  58. package/dist/clipboard/clipboard.d.ts.map +1 -0
  59. package/dist/clipboard/clipboard.js +160 -0
  60. package/dist/clipboard/clipboard.test.d.ts +2 -0
  61. package/dist/clipboard/clipboard.test.d.ts.map +1 -0
  62. package/dist/clipboard/clipboard.test.js +457 -0
  63. package/dist/clipboard/format.d.ts +27 -0
  64. package/dist/clipboard/format.d.ts.map +1 -0
  65. package/dist/clipboard/format.js +37 -0
  66. package/dist/clipboard/index.d.ts +6 -0
  67. package/dist/clipboard/index.d.ts.map +1 -0
  68. package/dist/clipboard/index.js +3 -0
  69. package/dist/clipboard/react.d.ts +20 -0
  70. package/dist/clipboard/react.d.ts.map +1 -0
  71. package/dist/clipboard/react.js +71 -0
  72. package/dist/dialogs/index.d.ts +2 -0
  73. package/dist/dialogs/index.d.ts.map +1 -0
  74. package/dist/dialogs/index.js +1 -0
  75. package/dist/dialogs/media-picker/index.d.ts +7 -0
  76. package/dist/dialogs/media-picker/index.d.ts.map +1 -0
  77. package/dist/dialogs/media-picker/index.js +3 -0
  78. package/dist/dialogs/media-picker/library.d.ts +17 -0
  79. package/dist/dialogs/media-picker/library.d.ts.map +1 -0
  80. package/dist/dialogs/media-picker/library.js +9 -0
  81. package/dist/dialogs/media-picker/media-picker.d.ts +18 -0
  82. package/dist/dialogs/media-picker/media-picker.d.ts.map +1 -0
  83. package/dist/dialogs/media-picker/media-picker.js +99 -0
  84. package/dist/dialogs/media-picker/media-picker.test.d.ts +2 -0
  85. package/dist/dialogs/media-picker/media-picker.test.d.ts.map +1 -0
  86. package/dist/dialogs/media-picker/media-picker.test.js +161 -0
  87. package/dist/dialogs/media-picker/media-ref.d.ts +28 -0
  88. package/dist/dialogs/media-picker/media-ref.d.ts.map +1 -0
  89. package/dist/dialogs/media-picker/media-ref.js +52 -0
  90. package/dist/dnd/check.d.ts +8 -0
  91. package/dist/dnd/check.d.ts.map +1 -0
  92. package/dist/dnd/check.js +12 -0
  93. package/dist/dnd/destinations.d.ts +15 -0
  94. package/dist/dnd/destinations.d.ts.map +1 -0
  95. package/dist/dnd/destinations.js +43 -0
  96. package/dist/dnd/dnd-react.test.d.ts +2 -0
  97. package/dist/dnd/dnd-react.test.d.ts.map +1 -0
  98. package/dist/dnd/dnd-react.test.js +93 -0
  99. package/dist/dnd/dnd.test.d.ts +2 -0
  100. package/dist/dnd/dnd.test.d.ts.map +1 -0
  101. package/dist/dnd/dnd.test.js +327 -0
  102. package/dist/dnd/engine.d.ts +85 -0
  103. package/dist/dnd/engine.d.ts.map +1 -0
  104. package/dist/dnd/engine.js +185 -0
  105. package/dist/dnd/fragment.d.ts +6 -0
  106. package/dist/dnd/fragment.d.ts.map +1 -0
  107. package/dist/dnd/fragment.js +18 -0
  108. package/dist/dnd/geometry.d.ts +30 -0
  109. package/dist/dnd/geometry.d.ts.map +1 -0
  110. package/dist/dnd/geometry.js +31 -0
  111. package/dist/dnd/index.d.ts +14 -0
  112. package/dist/dnd/index.d.ts.map +1 -0
  113. package/dist/dnd/index.js +7 -0
  114. package/dist/dnd/move-to-dialog.d.ts +13 -0
  115. package/dist/dnd/move-to-dialog.d.ts.map +1 -0
  116. package/dist/dnd/move-to-dialog.js +30 -0
  117. package/dist/dnd/react.d.ts +43 -0
  118. package/dist/dnd/react.d.ts.map +1 -0
  119. package/dist/dnd/react.js +185 -0
  120. package/dist/dnd/tree-target.d.ts +29 -0
  121. package/dist/dnd/tree-target.d.ts.map +1 -0
  122. package/dist/dnd/tree-target.js +97 -0
  123. package/dist/fonts/LICENSE-inter.txt +93 -0
  124. package/dist/fonts/inter-latin-400-normal.woff2 +0 -0
  125. package/dist/fonts/inter-latin-500-normal.woff2 +0 -0
  126. package/dist/fonts/inter-latin-600-normal.woff2 +0 -0
  127. package/dist/fonts/inter-latin-ext-400-normal.woff2 +0 -0
  128. package/dist/fonts/inter-latin-ext-500-normal.woff2 +0 -0
  129. package/dist/fonts/inter-latin-ext-600-normal.woff2 +0 -0
  130. package/dist/index.d.ts +22 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +21 -0
  133. package/dist/messages/en.d.ts +335 -0
  134. package/dist/messages/en.d.ts.map +1 -0
  135. package/dist/messages/en.js +332 -0
  136. package/dist/messages/index.d.ts +16 -0
  137. package/dist/messages/index.d.ts.map +1 -0
  138. package/dist/messages/index.js +22 -0
  139. package/dist/messages/pl.d.ts +3 -0
  140. package/dist/messages/pl.d.ts.map +1 -0
  141. package/dist/messages/pl.js +327 -0
  142. package/dist/panels/breadcrumbs/breadcrumbs.d.ts +6 -0
  143. package/dist/panels/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  144. package/dist/panels/breadcrumbs/breadcrumbs.js +24 -0
  145. package/dist/panels/breadcrumbs/breadcrumbs.test.d.ts +2 -0
  146. package/dist/panels/breadcrumbs/breadcrumbs.test.d.ts.map +1 -0
  147. package/dist/panels/breadcrumbs/breadcrumbs.test.js +56 -0
  148. package/dist/panels/index.d.ts +9 -0
  149. package/dist/panels/index.d.ts.map +1 -0
  150. package/dist/panels/index.js +6 -0
  151. package/dist/panels/insert/catalog.d.ts +30 -0
  152. package/dist/panels/insert/catalog.d.ts.map +1 -0
  153. package/dist/panels/insert/catalog.js +76 -0
  154. package/dist/panels/insert/catalog.order.test.d.ts +2 -0
  155. package/dist/panels/insert/catalog.order.test.d.ts.map +1 -0
  156. package/dist/panels/insert/catalog.order.test.js +17 -0
  157. package/dist/panels/insert/category-name.d.ts +4 -0
  158. package/dist/panels/insert/category-name.d.ts.map +1 -0
  159. package/dist/panels/insert/category-name.js +8 -0
  160. package/dist/panels/insert/index.d.ts +3 -0
  161. package/dist/panels/insert/index.d.ts.map +1 -0
  162. package/dist/panels/insert/index.js +2 -0
  163. package/dist/panels/insert/insert-panel.d.ts +7 -0
  164. package/dist/panels/insert/insert-panel.d.ts.map +1 -0
  165. package/dist/panels/insert/insert-panel.js +155 -0
  166. package/dist/panels/insert/insert-panel.test.d.ts +2 -0
  167. package/dist/panels/insert/insert-panel.test.d.ts.map +1 -0
  168. package/dist/panels/insert/insert-panel.test.js +323 -0
  169. package/dist/panels/insert/target.d.ts +17 -0
  170. package/dist/panels/insert/target.d.ts.map +1 -0
  171. package/dist/panels/insert/target.js +48 -0
  172. package/dist/panels/inspector/controls/boolean.d.ts +4 -0
  173. package/dist/panels/inspector/controls/boolean.d.ts.map +1 -0
  174. package/dist/panels/inspector/controls/boolean.js +4 -0
  175. package/dist/panels/inspector/controls/compound.d.ts +15 -0
  176. package/dist/panels/inspector/controls/compound.d.ts.map +1 -0
  177. package/dist/panels/inspector/controls/compound.js +99 -0
  178. package/dist/panels/inspector/controls/compound.test.d.ts +2 -0
  179. package/dist/panels/inspector/controls/compound.test.d.ts.map +1 -0
  180. package/dist/panels/inspector/controls/compound.test.js +195 -0
  181. package/dist/panels/inspector/controls/icon.d.ts +5 -0
  182. package/dist/panels/inspector/controls/icon.d.ts.map +1 -0
  183. package/dist/panels/inspector/controls/icon.js +6 -0
  184. package/dist/panels/inspector/controls/index.d.ts +13 -0
  185. package/dist/panels/inspector/controls/index.d.ts.map +1 -0
  186. package/dist/panels/inspector/controls/index.js +11 -0
  187. package/dist/panels/inspector/controls/label.d.ts +4 -0
  188. package/dist/panels/inspector/controls/label.d.ts.map +1 -0
  189. package/dist/panels/inspector/controls/label.js +8 -0
  190. package/dist/panels/inspector/controls/link.d.ts +5 -0
  191. package/dist/panels/inspector/controls/link.d.ts.map +1 -0
  192. package/dist/panels/inspector/controls/link.js +6 -0
  193. package/dist/panels/inspector/controls/media.d.ts +9 -0
  194. package/dist/panels/inspector/controls/media.d.ts.map +1 -0
  195. package/dist/panels/inspector/controls/media.js +21 -0
  196. package/dist/panels/inspector/controls/number.d.ts +10 -0
  197. package/dist/panels/inspector/controls/number.d.ts.map +1 -0
  198. package/dist/panels/inspector/controls/number.js +33 -0
  199. package/dist/panels/inspector/controls/rich-text-model.d.ts +20 -0
  200. package/dist/panels/inspector/controls/rich-text-model.d.ts.map +1 -0
  201. package/dist/panels/inspector/controls/rich-text-model.js +91 -0
  202. package/dist/panels/inspector/controls/rich-text.d.ts +10 -0
  203. package/dist/panels/inspector/controls/rich-text.d.ts.map +1 -0
  204. package/dist/panels/inspector/controls/rich-text.js +159 -0
  205. package/dist/panels/inspector/controls/select.d.ts +5 -0
  206. package/dist/panels/inspector/controls/select.d.ts.map +1 -0
  207. package/dist/panels/inspector/controls/select.js +16 -0
  208. package/dist/panels/inspector/controls/select.test.d.ts +2 -0
  209. package/dist/panels/inspector/controls/select.test.d.ts.map +1 -0
  210. package/dist/panels/inspector/controls/select.test.js +43 -0
  211. package/dist/panels/inspector/controls/text.d.ts +4 -0
  212. package/dist/panels/inspector/controls/text.d.ts.map +1 -0
  213. package/dist/panels/inspector/controls/text.js +5 -0
  214. package/dist/panels/inspector/controls/textarea.d.ts +4 -0
  215. package/dist/panels/inspector/controls/textarea.d.ts.map +1 -0
  216. package/dist/panels/inspector/controls/textarea.js +4 -0
  217. package/dist/panels/inspector/controls/types.d.ts +16 -0
  218. package/dist/panels/inspector/controls/types.d.ts.map +1 -0
  219. package/dist/panels/inspector/controls/types.js +1 -0
  220. package/dist/panels/inspector/index.d.ts +17 -0
  221. package/dist/panels/inspector/index.d.ts.map +1 -0
  222. package/dist/panels/inspector/index.js +9 -0
  223. package/dist/panels/inspector/inspector.d.ts +16 -0
  224. package/dist/panels/inspector/inspector.d.ts.map +1 -0
  225. package/dist/panels/inspector/inspector.js +116 -0
  226. package/dist/panels/inspector/inspector.test.d.ts +2 -0
  227. package/dist/panels/inspector/inspector.test.d.ts.map +1 -0
  228. package/dist/panels/inspector/inspector.test.js +328 -0
  229. package/dist/panels/inspector/props-panel.d.ts +26 -0
  230. package/dist/panels/inspector/props-panel.d.ts.map +1 -0
  231. package/dist/panels/inspector/props-panel.js +117 -0
  232. package/dist/panels/inspector/styles/box-model.d.ts +20 -0
  233. package/dist/panels/inspector/styles/box-model.d.ts.map +1 -0
  234. package/dist/panels/inspector/styles/box-model.js +31 -0
  235. package/dist/panels/inspector/styles/index.d.ts +5 -0
  236. package/dist/panels/inspector/styles/index.d.ts.map +1 -0
  237. package/dist/panels/inspector/styles/index.js +2 -0
  238. package/dist/panels/inspector/styles/model.d.ts +55 -0
  239. package/dist/panels/inspector/styles/model.d.ts.map +1 -0
  240. package/dist/panels/inspector/styles/model.js +111 -0
  241. package/dist/panels/inspector/styles/segments.d.ts +18 -0
  242. package/dist/panels/inspector/styles/segments.d.ts.map +1 -0
  243. package/dist/panels/inspector/styles/segments.js +75 -0
  244. package/dist/panels/inspector/styles/sides-editor.d.ts +34 -0
  245. package/dist/panels/inspector/styles/sides-editor.d.ts.map +1 -0
  246. package/dist/panels/inspector/styles/sides-editor.js +86 -0
  247. package/dist/panels/inspector/styles/style-inspector.d.ts +15 -0
  248. package/dist/panels/inspector/styles/style-inspector.d.ts.map +1 -0
  249. package/dist/panels/inspector/styles/style-inspector.js +219 -0
  250. package/dist/panels/inspector/styles/style-inspector.test.d.ts +2 -0
  251. package/dist/panels/inspector/styles/style-inspector.test.d.ts.map +1 -0
  252. package/dist/panels/inspector/styles/style-inspector.test.js +265 -0
  253. package/dist/panels/inspector/styles/token-picker.d.ts +15 -0
  254. package/dist/panels/inspector/styles/token-picker.d.ts.map +1 -0
  255. package/dist/panels/inspector/styles/token-picker.js +23 -0
  256. package/dist/panels/inspector/styles/use-style-value.d.ts +28 -0
  257. package/dist/panels/inspector/styles/use-style-value.d.ts.map +1 -0
  258. package/dist/panels/inspector/styles/use-style-value.js +51 -0
  259. package/dist/panels/inspector/value.d.ts +20 -0
  260. package/dist/panels/inspector/value.d.ts.map +1 -0
  261. package/dist/panels/inspector/value.js +32 -0
  262. package/dist/panels/inspector/values/analyze.d.ts +49 -0
  263. package/dist/panels/inspector/values/analyze.d.ts.map +1 -0
  264. package/dist/panels/inspector/values/analyze.js +115 -0
  265. package/dist/panels/inspector/values/data.d.ts +18 -0
  266. package/dist/panels/inspector/values/data.d.ts.map +1 -0
  267. package/dist/panels/inspector/values/data.js +10 -0
  268. package/dist/panels/inspector/values/translation.d.ts +20 -0
  269. package/dist/panels/inspector/values/translation.d.ts.map +1 -0
  270. package/dist/panels/inspector/values/translation.js +25 -0
  271. package/dist/panels/inspector/values/value-editor.d.ts +30 -0
  272. package/dist/panels/inspector/values/value-editor.d.ts.map +1 -0
  273. package/dist/panels/inspector/values/value-editor.js +191 -0
  274. package/dist/panels/inspector/values/values.test.d.ts +2 -0
  275. package/dist/panels/inspector/values/values.test.d.ts.map +1 -0
  276. package/dist/panels/inspector/values/values.test.js +173 -0
  277. package/dist/panels/issues/collect.d.ts +70 -0
  278. package/dist/panels/issues/collect.d.ts.map +1 -0
  279. package/dist/panels/issues/collect.js +96 -0
  280. package/dist/panels/issues/index.d.ts +5 -0
  281. package/dist/panels/issues/index.d.ts.map +1 -0
  282. package/dist/panels/issues/index.js +2 -0
  283. package/dist/panels/issues/issues-panel.d.ts +17 -0
  284. package/dist/panels/issues/issues-panel.d.ts.map +1 -0
  285. package/dist/panels/issues/issues-panel.js +77 -0
  286. package/dist/panels/layers/flatten.d.ts +28 -0
  287. package/dist/panels/layers/flatten.d.ts.map +1 -0
  288. package/dist/panels/layers/flatten.js +61 -0
  289. package/dist/panels/layers/layers-panel.d.ts +14 -0
  290. package/dist/panels/layers/layers-panel.d.ts.map +1 -0
  291. package/dist/panels/layers/layers-panel.js +428 -0
  292. package/dist/panels/layers/layers-panel.test.d.ts +2 -0
  293. package/dist/panels/layers/layers-panel.test.d.ts.map +1 -0
  294. package/dist/panels/layers/layers-panel.test.js +315 -0
  295. package/dist/persistence/controller.d.ts +55 -0
  296. package/dist/persistence/controller.d.ts.map +1 -0
  297. package/dist/persistence/controller.js +341 -0
  298. package/dist/persistence/index.d.ts +6 -0
  299. package/dist/persistence/index.d.ts.map +1 -0
  300. package/dist/persistence/index.js +3 -0
  301. package/dist/persistence/load.d.ts +35 -0
  302. package/dist/persistence/load.d.ts.map +1 -0
  303. package/dist/persistence/load.js +67 -0
  304. package/dist/persistence/persistence.test.d.ts +2 -0
  305. package/dist/persistence/persistence.test.d.ts.map +1 -0
  306. package/dist/persistence/persistence.test.js +483 -0
  307. package/dist/persistence/react.d.ts +18 -0
  308. package/dist/persistence/react.d.ts.map +1 -0
  309. package/dist/persistence/react.js +105 -0
  310. package/dist/persistence/types.d.ts +182 -0
  311. package/dist/persistence/types.d.ts.map +1 -0
  312. package/dist/persistence/types.js +1 -0
  313. package/dist/preview/index.d.ts +3 -0
  314. package/dist/preview/index.d.ts.map +1 -0
  315. package/dist/preview/index.js +2 -0
  316. package/dist/preview/prepare.d.ts +16 -0
  317. package/dist/preview/prepare.d.ts.map +1 -0
  318. package/dist/preview/prepare.js +21 -0
  319. package/dist/preview/preview.d.ts +27 -0
  320. package/dist/preview/preview.d.ts.map +1 -0
  321. package/dist/preview/preview.js +51 -0
  322. package/dist/preview/preview.test.d.ts +2 -0
  323. package/dist/preview/preview.test.d.ts.map +1 -0
  324. package/dist/preview/preview.test.js +129 -0
  325. package/dist/shortcuts/actions.d.ts +17 -0
  326. package/dist/shortcuts/actions.d.ts.map +1 -0
  327. package/dist/shortcuts/actions.js +85 -0
  328. package/dist/shortcuts/index.d.ts +11 -0
  329. package/dist/shortcuts/index.d.ts.map +1 -0
  330. package/dist/shortcuts/index.js +5 -0
  331. package/dist/shortcuts/keys.d.ts +29 -0
  332. package/dist/shortcuts/keys.d.ts.map +1 -0
  333. package/dist/shortcuts/keys.js +100 -0
  334. package/dist/shortcuts/map.d.ts +17 -0
  335. package/dist/shortcuts/map.d.ts.map +1 -0
  336. package/dist/shortcuts/map.js +31 -0
  337. package/dist/shortcuts/registry.d.ts +32 -0
  338. package/dist/shortcuts/registry.d.ts.map +1 -0
  339. package/dist/shortcuts/registry.js +53 -0
  340. package/dist/shortcuts/shortcuts.d.ts +32 -0
  341. package/dist/shortcuts/shortcuts.d.ts.map +1 -0
  342. package/dist/shortcuts/shortcuts.js +95 -0
  343. package/dist/shortcuts/shortcuts.test.d.ts +2 -0
  344. package/dist/shortcuts/shortcuts.test.d.ts.map +1 -0
  345. package/dist/shortcuts/shortcuts.test.js +263 -0
  346. package/dist/store/create-store.d.ts +13 -0
  347. package/dist/store/create-store.d.ts.map +1 -0
  348. package/dist/store/create-store.js +248 -0
  349. package/dist/store/index.d.ts +9 -0
  350. package/dist/store/index.d.ts.map +1 -0
  351. package/dist/store/index.js +5 -0
  352. package/dist/store/locale.d.ts +23 -0
  353. package/dist/store/locale.d.ts.map +1 -0
  354. package/dist/store/locale.js +31 -0
  355. package/dist/store/react.d.ts +17 -0
  356. package/dist/store/react.d.ts.map +1 -0
  357. package/dist/store/react.js +32 -0
  358. package/dist/store/selection.d.ts +32 -0
  359. package/dist/store/selection.d.ts.map +1 -0
  360. package/dist/store/selection.js +84 -0
  361. package/dist/store/selection.test.d.ts +2 -0
  362. package/dist/store/selection.test.d.ts.map +1 -0
  363. package/dist/store/selection.test.js +95 -0
  364. package/dist/store/selectors.d.ts +18 -0
  365. package/dist/store/selectors.d.ts.map +1 -0
  366. package/dist/store/selectors.js +39 -0
  367. package/dist/store/store.test.d.ts +2 -0
  368. package/dist/store/store.test.d.ts.map +1 -0
  369. package/dist/store/store.test.js +331 -0
  370. package/dist/store/types.d.ts +114 -0
  371. package/dist/store/types.d.ts.map +1 -0
  372. package/dist/store/types.js +1 -0
  373. package/dist/styles/tokens.test.d.ts +2 -0
  374. package/dist/styles/tokens.test.d.ts.map +1 -0
  375. package/dist/styles/tokens.test.js +199 -0
  376. package/dist/styles.css +2885 -0
  377. package/dist/toolbar/brand.d.ts +7 -0
  378. package/dist/toolbar/brand.d.ts.map +1 -0
  379. package/dist/toolbar/brand.js +11 -0
  380. package/dist/toolbar/breakpoint-control.d.ts +9 -0
  381. package/dist/toolbar/breakpoint-control.d.ts.map +1 -0
  382. package/dist/toolbar/breakpoint-control.js +23 -0
  383. package/dist/toolbar/editable-title.d.ts +14 -0
  384. package/dist/toolbar/editable-title.d.ts.map +1 -0
  385. package/dist/toolbar/editable-title.js +46 -0
  386. package/dist/toolbar/editable-title.test.d.ts +2 -0
  387. package/dist/toolbar/editable-title.test.d.ts.map +1 -0
  388. package/dist/toolbar/editable-title.test.js +53 -0
  389. package/dist/toolbar/index.d.ts +12 -0
  390. package/dist/toolbar/index.d.ts.map +1 -0
  391. package/dist/toolbar/index.js +5 -0
  392. package/dist/toolbar/locale-switcher.d.ts +10 -0
  393. package/dist/toolbar/locale-switcher.d.ts.map +1 -0
  394. package/dist/toolbar/locale-switcher.js +20 -0
  395. package/dist/toolbar/more-menu.d.ts +12 -0
  396. package/dist/toolbar/more-menu.d.ts.map +1 -0
  397. package/dist/toolbar/more-menu.js +47 -0
  398. package/dist/toolbar/panel-toggles.d.ts +9 -0
  399. package/dist/toolbar/panel-toggles.d.ts.map +1 -0
  400. package/dist/toolbar/panel-toggles.js +19 -0
  401. package/dist/toolbar/publish-dialog.d.ts +18 -0
  402. package/dist/toolbar/publish-dialog.d.ts.map +1 -0
  403. package/dist/toolbar/publish-dialog.js +49 -0
  404. package/dist/toolbar/publish.test.d.ts +2 -0
  405. package/dist/toolbar/publish.test.d.ts.map +1 -0
  406. package/dist/toolbar/publish.test.js +258 -0
  407. package/dist/toolbar/sample-picker.d.ts +18 -0
  408. package/dist/toolbar/sample-picker.d.ts.map +1 -0
  409. package/dist/toolbar/sample-picker.js +72 -0
  410. package/dist/toolbar/sample-picker.test.d.ts +2 -0
  411. package/dist/toolbar/sample-picker.test.d.ts.map +1 -0
  412. package/dist/toolbar/sample-picker.test.js +78 -0
  413. package/dist/toolbar/save-indicator.d.ts +8 -0
  414. package/dist/toolbar/save-indicator.d.ts.map +1 -0
  415. package/dist/toolbar/save-indicator.js +30 -0
  416. package/dist/toolbar/theme.d.ts +22 -0
  417. package/dist/toolbar/theme.d.ts.map +1 -0
  418. package/dist/toolbar/theme.js +46 -0
  419. package/dist/toolbar/theme.test.d.ts +2 -0
  420. package/dist/toolbar/theme.test.d.ts.map +1 -0
  421. package/dist/toolbar/theme.test.js +49 -0
  422. package/dist/toolbar/toolbar-centre.d.ts +13 -0
  423. package/dist/toolbar/toolbar-centre.d.ts.map +1 -0
  424. package/dist/toolbar/toolbar-centre.js +7 -0
  425. package/dist/toolbar/toolbar-left.d.ts +12 -0
  426. package/dist/toolbar/toolbar-left.d.ts.map +1 -0
  427. package/dist/toolbar/toolbar-left.js +16 -0
  428. package/dist/toolbar/toolbar-right.d.ts +19 -0
  429. package/dist/toolbar/toolbar-right.d.ts.map +1 -0
  430. package/dist/toolbar/toolbar-right.js +21 -0
  431. package/dist/toolbar/toolbar.d.ts +38 -0
  432. package/dist/toolbar/toolbar.d.ts.map +1 -0
  433. package/dist/toolbar/toolbar.js +27 -0
  434. package/dist/toolbar/toolbar.test.d.ts +2 -0
  435. package/dist/toolbar/toolbar.test.d.ts.map +1 -0
  436. package/dist/toolbar/toolbar.test.js +289 -0
  437. package/dist/toolbar/use-overflow-level.d.ts +9 -0
  438. package/dist/toolbar/use-overflow-level.d.ts.map +1 -0
  439. package/dist/toolbar/use-overflow-level.js +40 -0
  440. package/dist/toolbar/zoom-menu.d.ts +10 -0
  441. package/dist/toolbar/zoom-menu.d.ts.map +1 -0
  442. package/dist/toolbar/zoom-menu.js +17 -0
  443. package/dist/ui/icon.d.ts +102 -0
  444. package/dist/ui/icon.d.ts.map +1 -0
  445. package/dist/ui/icon.js +182 -0
  446. package/dist/ui/icon.test.d.ts +2 -0
  447. package/dist/ui/icon.test.d.ts.map +1 -0
  448. package/dist/ui/icon.test.js +115 -0
  449. package/dist/ui/index.d.ts +11 -0
  450. package/dist/ui/index.d.ts.map +1 -0
  451. package/dist/ui/index.js +5 -0
  452. package/dist/ui/panel.d.ts +18 -0
  453. package/dist/ui/panel.d.ts.map +1 -0
  454. package/dist/ui/panel.js +21 -0
  455. package/dist/ui/portal.d.ts +14 -0
  456. package/dist/ui/portal.d.ts.map +1 -0
  457. package/dist/ui/portal.js +14 -0
  458. package/dist/ui/primitives.d.ts +190 -0
  459. package/dist/ui/primitives.d.ts.map +1 -0
  460. package/dist/ui/primitives.js +164 -0
  461. package/dist/ui/primitives.test.d.ts +2 -0
  462. package/dist/ui/primitives.test.d.ts.map +1 -0
  463. package/dist/ui/primitives.test.js +215 -0
  464. package/dist/ui/toast.d.ts +39 -0
  465. package/dist/ui/toast.d.ts.map +1 -0
  466. package/dist/ui/toast.js +76 -0
  467. package/dist/ui/toast.test.d.ts +2 -0
  468. package/dist/ui/toast.test.d.ts.map +1 -0
  469. package/dist/ui/toast.test.js +95 -0
  470. package/package.json +66 -3
  471. package/README.md +0 -3
@@ -0,0 +1,13 @@
1
+ import type { EditorStore, EditorStoreOptions } from './types.ts';
2
+ /** How long after the last change validation and the accessibility checks run. */
3
+ export declare const DEFAULT_VALIDATION_DELAY_MS = 300;
4
+ /**
5
+ * The editor's store (docs/state-management.md, ADR-013): a vanilla Zustand store whose document
6
+ * changes only through `@next-buildr/core/commands`. `dispatch` runs `execute`, records the result in
7
+ * the history and swaps in the new document; `undo` and `redo` apply the history's patches with
8
+ * `applyDocumentPatches`; nothing here writes into a document. Every change bumps `docVersion` and
9
+ * is announced to `onChange` (the canvas host turns it into `doc:patch` / `doc:set`), and validation
10
+ * runs a moment after the last one.
11
+ */
12
+ export declare function createEditorStore(options: EditorStoreOptions): EditorStore;
13
+ //# sourceMappingURL=create-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-store.d.ts","sourceRoot":"","sources":["../../src/store/create-store.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAIV,WAAW,EACX,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAEpB,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAmB/C;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CA8O1E"}
@@ -0,0 +1,248 @@
1
+ import { err, generateId, ok, runA11y, validateDocument, } from '@next-buildr/core';
2
+ import { applyDocumentPatches, commandError, commandMergeKey, coreCommandHandlers, createCommandRegistry, createHistory, execute, executeBatch, } from '@next-buildr/core/commands';
3
+ import { createStore } from 'zustand/vanilla';
4
+ import { EMPTY_SELECTION, normalizeSelection, relativeNode, selectIn, } from './selection.js';
5
+ /** How long after the last change validation and the accessibility checks run. */
6
+ export const DEFAULT_VALIDATION_DELAY_MS = 300;
7
+ function defaultTimers() {
8
+ const g = globalThis;
9
+ return { setTimeout: (cb, ms) => g.setTimeout(cb, ms), clearTimeout: (h) => g.clearTimeout(h) };
10
+ }
11
+ /** The ids that are still nodes of `doc`, in order and without repeats. */
12
+ function existing(doc, ids) {
13
+ const kept = [];
14
+ for (const id of ids) {
15
+ if (Object.hasOwn(doc.nodes, id) && !kept.includes(id))
16
+ kept.push(id);
17
+ }
18
+ return kept;
19
+ }
20
+ const readOnlyError = () => commandError('editor.read-only', 'the document cannot be changed');
21
+ /**
22
+ * The editor's store (docs/state-management.md, ADR-013): a vanilla Zustand store whose document
23
+ * changes only through `@next-buildr/core/commands`. `dispatch` runs `execute`, records the result in
24
+ * the history and swaps in the new document; `undo` and `redo` apply the history's patches with
25
+ * `applyDocumentPatches`; nothing here writes into a document. Every change bumps `docVersion` and
26
+ * is announced to `onChange` (the canvas host turns it into `doc:patch` / `doc:set`), and validation
27
+ * runs a moment after the last one.
28
+ */
29
+ export function createEditorStore(options) {
30
+ const commands = options.commands ?? createCommandRegistry(coreCommandHandlers);
31
+ const history = createHistory(options.history);
32
+ const env = {
33
+ registry: options.registry,
34
+ commands,
35
+ generateId: options.generateId ?? generateId,
36
+ canUnlock: options.canUnlock,
37
+ checkInvariants: options.checkInvariants ?? false,
38
+ };
39
+ const timers = options.timers ?? defaultTimers();
40
+ const delay = options.validationDelayMs === undefined
41
+ ? DEFAULT_VALIDATION_DELAY_MS
42
+ : options.validationDelayMs;
43
+ const historyState = () => ({
44
+ canUndo: history.canUndo,
45
+ canRedo: history.canRedo,
46
+ inTransaction: history.inTransaction,
47
+ cursorId: history.cursorId,
48
+ undoLabel: history.past[history.past.length - 1]?.label,
49
+ redoLabel: history.future[history.future.length - 1]?.label,
50
+ });
51
+ const api = createStore(() => ({
52
+ doc: options.doc,
53
+ docVersion: 0,
54
+ readOnly: options.readOnly ?? false,
55
+ ...historyState(),
56
+ savedCursorId: history.cursorId,
57
+ ...EMPTY_SELECTION,
58
+ hoveredId: null,
59
+ validation: undefined,
60
+ }));
61
+ const listeners = new Set();
62
+ let timer;
63
+ const validateNow = () => {
64
+ timers.clearTimeout(timer);
65
+ const { doc, docVersion } = api.getState();
66
+ const snapshot = {
67
+ docVersion,
68
+ issues: validateDocument(doc, { registry: options.registry }).issues,
69
+ a11y: runA11y(doc, options.registry, { locales: options.locales }),
70
+ };
71
+ api.setState({ validation: snapshot });
72
+ return snapshot;
73
+ };
74
+ const scheduleValidation = () => {
75
+ if (delay === null)
76
+ return;
77
+ timers.clearTimeout(timer);
78
+ timer = timers.setTimeout(validateNow, delay);
79
+ };
80
+ const announce = (change) => {
81
+ for (const listener of [...listeners])
82
+ listener(change);
83
+ };
84
+ /** Puts a new document in the state and tells the listeners which patches led to it. */
85
+ const commit = (doc, patches, selection) => {
86
+ const state = api.getState();
87
+ const from = state.docVersion;
88
+ api.setState({
89
+ doc,
90
+ docVersion: from + 1,
91
+ ...normalizeSelection(doc, {
92
+ selectedIds: selection,
93
+ anchorId: state.anchorId,
94
+ selectedInstance: state.selectedInstance,
95
+ }),
96
+ hoveredId: state.hoveredId !== null && Object.hasOwn(doc.nodes, state.hoveredId)
97
+ ? state.hoveredId
98
+ : null,
99
+ ...historyState(),
100
+ });
101
+ scheduleValidation();
102
+ announce({ kind: 'patch', from, to: from + 1, patches });
103
+ };
104
+ const applyPatches = (patches, selection) => {
105
+ const applied = applyDocumentPatches(api.getState().doc, patches);
106
+ if (!applied.ok)
107
+ return err(applied.error);
108
+ commit(applied.value, patches, selection);
109
+ return ok(true);
110
+ };
111
+ const run = (commandList, options_) => {
112
+ const state = api.getState();
113
+ if (state.readOnly)
114
+ return err(readOnlyError());
115
+ const only = commandList.length === 1 ? commandList[0] : undefined;
116
+ const result = only !== undefined
117
+ ? execute(state.doc, only, env)
118
+ : executeBatch(state.doc, commandList, env);
119
+ if (!result.ok)
120
+ return result;
121
+ const { value } = result;
122
+ const before = state.selectedIds;
123
+ const after = value.select ?? before;
124
+ history.record({
125
+ label: options_?.label ?? commandList[0]?.type ?? 'batch',
126
+ commands: commandList,
127
+ patches: value.patches,
128
+ inverse: value.inverse,
129
+ selectionBefore: before,
130
+ selectionAfter: existing(value.doc, after),
131
+ mergeKey: commandMergeKey(commands, commandList),
132
+ });
133
+ if (value.patches.length > 0)
134
+ commit(value.doc, value.patches, after);
135
+ else
136
+ api.setState(historyState());
137
+ return result;
138
+ };
139
+ const store = {
140
+ ...api,
141
+ registry: options.registry,
142
+ history,
143
+ dispatch: (command, options_) => run([command], options_),
144
+ dispatchBatch: (commandList, options_) => run(commandList, options_),
145
+ transaction(label, fn) {
146
+ if (api.getState().readOnly)
147
+ return false;
148
+ const began = history.begin(label);
149
+ if (!began.ok)
150
+ return false;
151
+ api.setState(historyState());
152
+ const rollBack = () => {
153
+ const inverse = history.rollback();
154
+ if (inverse.ok && inverse.value.length > 0) {
155
+ applyPatches(inverse.value, api.getState().selectedIds);
156
+ }
157
+ else
158
+ api.setState(historyState());
159
+ };
160
+ let keep;
161
+ try {
162
+ keep = fn() !== false;
163
+ }
164
+ catch (error) {
165
+ rollBack();
166
+ throw error;
167
+ }
168
+ if (!keep) {
169
+ rollBack();
170
+ return false;
171
+ }
172
+ history.commit();
173
+ api.setState(historyState());
174
+ return true;
175
+ },
176
+ undo() {
177
+ if (api.getState().readOnly)
178
+ return err(readOnlyError());
179
+ const step = history.undo();
180
+ if (step === undefined)
181
+ return err(commandError('editor.nothing-to-undo', 'nothing to undo'));
182
+ return applyPatches(step.patches, step.selection);
183
+ },
184
+ redo() {
185
+ if (api.getState().readOnly)
186
+ return err(readOnlyError());
187
+ const step = history.redo();
188
+ if (step === undefined)
189
+ return err(commandError('editor.nothing-to-redo', 'nothing to redo'));
190
+ return applyPatches(step.patches, step.selection);
191
+ },
192
+ replaceDocument(doc, replaceOptions) {
193
+ history.clear();
194
+ const state = api.getState();
195
+ const version = state.docVersion + 1;
196
+ api.setState({
197
+ doc,
198
+ docVersion: version,
199
+ readOnly: replaceOptions?.readOnly ?? state.readOnly,
200
+ ...historyState(),
201
+ savedCursorId: history.cursorId,
202
+ ...normalizeSelection(doc, {
203
+ selectedIds: state.selectedIds,
204
+ anchorId: state.anchorId,
205
+ selectedInstance: state.selectedInstance,
206
+ }),
207
+ hoveredId: null,
208
+ validation: undefined,
209
+ });
210
+ scheduleValidation();
211
+ announce({ kind: 'set', doc, version });
212
+ },
213
+ markSaved: (cursorId) => api.setState({ savedCursorId: cursorId ?? history.cursorId }),
214
+ select: (id, selectOptions) => api.setState((state) => Object.hasOwn(state.doc.nodes, id)
215
+ ? selectIn(state, id, selectOptions?.mode, selectOptions?.instance)
216
+ : state),
217
+ setSelection: (ids) => api.setState((state) => {
218
+ const next = {
219
+ selectedIds: ids,
220
+ anchorId: null,
221
+ selectedInstance: undefined,
222
+ };
223
+ return normalizeSelection(state.doc, next);
224
+ }),
225
+ clearSelection: () => api.setState(EMPTY_SELECTION),
226
+ moveSelection(move) {
227
+ const { doc, anchorId } = api.getState();
228
+ if (anchorId === null)
229
+ return undefined;
230
+ const target = relativeNode(doc, anchorId, move);
231
+ if (target === undefined)
232
+ return undefined;
233
+ api.setState(selectIn(EMPTY_SELECTION, target));
234
+ return target;
235
+ },
236
+ setHovered: (id) => api.setState({ hoveredId: id }),
237
+ setReadOnly: (readOnly) => api.setState({ readOnly }),
238
+ onChange(listener) {
239
+ listeners.add(listener);
240
+ return () => {
241
+ listeners.delete(listener);
242
+ };
243
+ },
244
+ validateNow,
245
+ destroy: () => timers.clearTimeout(timer),
246
+ };
247
+ return store;
248
+ }
@@ -0,0 +1,9 @@
1
+ export { createEditorStore, DEFAULT_VALIDATION_DELAY_MS } from './create-store.ts';
2
+ export type { LocaleState, LocaleStore } from './locale.ts';
3
+ export { createLocaleStore, LocaleProvider, useLocaleState, useOptionalLocaleStore, } from './locale.ts';
4
+ export { EditorStoreProvider, useEditor, useEditorState, useIsDirty, useNode, useNodeChildren, useSelectedNode, } from './react.tsx';
5
+ export type { SelectionMove, SelectMode } from './selection.ts';
6
+ export { pathTo, relativeNode } from './selection.ts';
7
+ export { selectChildren, selectIndex, selectIsDirty, selectNode, selectSelectedNode, selectSelectionPath, } from './selectors.ts';
8
+ export type { DispatchOptions, DocumentChange, EditorState, EditorStore, EditorStoreOptions, ValidationSnapshot, } from './types.ts';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,UAAU,EACV,OAAO,EACP,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createEditorStore, DEFAULT_VALIDATION_DELAY_MS } from './create-store.js';
2
+ export { createLocaleStore, LocaleProvider, useLocaleState, useOptionalLocaleStore, } from './locale.js';
3
+ export { EditorStoreProvider, useEditor, useEditorState, useIsDirty, useNode, useNodeChildren, useSelectedNode, } from './react.js';
4
+ export { pathTo, relativeNode } from './selection.js';
5
+ export { selectChildren, selectIndex, selectIsDirty, selectNode, selectSelectedNode, selectSelectionPath, } from './selectors.js';
@@ -0,0 +1,23 @@
1
+ import type { LocaleConfig } from '@next-buildr/core';
2
+ import { type ReactNode } from 'react';
3
+ import { type StoreApi } from 'zustand/vanilla';
4
+ /** The language of the content being edited (docs/i18n.md#model-shared-structure-localized-content). */
5
+ export interface LocaleState {
6
+ readonly config: LocaleConfig;
7
+ /** The language edits go to; always one of `config.locales`. */
8
+ readonly locale: string;
9
+ /** Changes the language. An unknown code is ignored. */
10
+ setLocale(locale: string): void;
11
+ }
12
+ export type LocaleStore = StoreApi<LocaleState>;
13
+ /** The state for a language configuration, starting on `initial` (the default language unless it is unknown). */
14
+ export declare function createLocaleStore(config: LocaleConfig, initial?: string): LocaleStore;
15
+ export declare function LocaleProvider(props: {
16
+ readonly store: LocaleStore;
17
+ readonly children: ReactNode;
18
+ }): import("react").FunctionComponentElement<import("react").ProviderProps<LocaleStore | undefined>>;
19
+ /** The locale store, or `undefined` outside a `LocaleProvider` (the panels then edit the default language). */
20
+ export declare const useOptionalLocaleStore: () => LocaleStore | undefined;
21
+ /** The current language state; the single-language default outside a provider. */
22
+ export declare function useLocaleState<T>(select: (state: LocaleState) => T): T;
23
+ //# sourceMappingURL=locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../src/store/locale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAgC,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7D,wGAAwG;AACxG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAEhD,iHAAiH;AACjH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CASrF;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B,oGAEA;AAED,+GAA+G;AAC/G,eAAO,MAAM,sBAAsB,QAAO,WAAW,GAAG,SAAsC,CAAC;AAS/F,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,CAAC,GAAG,CAAC,CAEtE"}
@@ -0,0 +1,31 @@
1
+ import { createContext, createElement, useContext } from 'react';
2
+ import { useStore } from 'zustand';
3
+ import { createStore } from 'zustand/vanilla';
4
+ /** The state for a language configuration, starting on `initial` (the default language unless it is unknown). */
5
+ export function createLocaleStore(config, initial) {
6
+ return createStore((set, get) => ({
7
+ config,
8
+ locale: initial !== undefined && config.locales.includes(initial) ? initial : config.default,
9
+ setLocale(locale) {
10
+ if (locale === get().locale || !config.locales.includes(locale))
11
+ return;
12
+ set({ locale });
13
+ },
14
+ }));
15
+ }
16
+ const LocaleContext = createContext(undefined);
17
+ export function LocaleProvider(props) {
18
+ return createElement(LocaleContext.Provider, { value: props.store }, props.children);
19
+ }
20
+ /** The locale store, or `undefined` outside a `LocaleProvider` (the panels then edit the default language). */
21
+ export const useOptionalLocaleStore = () => useContext(LocaleContext);
22
+ const FALLBACK = {
23
+ config: { locales: ['en'], default: 'en', fallback: true, intl: { en: 'English' } },
24
+ locale: 'en',
25
+ setLocale: () => undefined,
26
+ };
27
+ const FALLBACK_STORE = createStore(() => FALLBACK);
28
+ /** The current language state; the single-language default outside a provider. */
29
+ export function useLocaleState(select) {
30
+ return useStore(useOptionalLocaleStore() ?? FALLBACK_STORE, select);
31
+ }
@@ -0,0 +1,17 @@
1
+ import type { NodeId, PageNode, SlotName } from '@next-buildr/core';
2
+ import { type ReactNode } from 'react';
3
+ import type { EditorState, EditorStore } from './types.ts';
4
+ export declare function EditorStoreProvider(props: {
5
+ readonly store: EditorStore;
6
+ readonly children: ReactNode;
7
+ }): import("react").JSX.Element;
8
+ /** The store itself, for reading it outside a render or calling its actions. */
9
+ export declare function useEditor(): EditorStore;
10
+ /** Subscribes to a part of the state; the component renders again only when that part changes. */
11
+ export declare function useEditorState<T>(selector: (state: EditorState) => T): T;
12
+ /** One node; the component renders again only when that node does. */
13
+ export declare function useNode(id: NodeId): PageNode | undefined;
14
+ export declare function useSelectedNode(): PageNode | undefined;
15
+ export declare function useNodeChildren(id: NodeId, slot?: SlotName): readonly NodeId[];
16
+ export declare function useIsDirty(): boolean;
17
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/store/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAiB,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B,+BAEA;AAED,gFAAgF;AAChF,wBAAgB,SAAS,IAAI,WAAW,CAIvC;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,CAAC,GAAG,CAAC,CAExE;AAED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAExD;AAED,wBAAgB,eAAe,IAAI,QAAQ,GAAG,SAAS,CAEtD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,QAAoB,GAAG,SAAS,MAAM,EAAE,CAEzF;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from 'react';
3
+ import { useStore } from 'zustand';
4
+ import { selectChildren, selectIsDirty, selectNode, selectSelectedNode } from './selectors.js';
5
+ const StoreContext = createContext(undefined);
6
+ export function EditorStoreProvider(props) {
7
+ return _jsx(StoreContext.Provider, { value: props.store, children: props.children });
8
+ }
9
+ /** The store itself, for reading it outside a render or calling its actions. */
10
+ export function useEditor() {
11
+ const store = useContext(StoreContext);
12
+ if (store === undefined)
13
+ throw new Error('useEditor must be used inside <EditorStoreProvider>');
14
+ return store;
15
+ }
16
+ /** Subscribes to a part of the state; the component renders again only when that part changes. */
17
+ export function useEditorState(selector) {
18
+ return useStore(useEditor(), selector);
19
+ }
20
+ /** One node; the component renders again only when that node does. */
21
+ export function useNode(id) {
22
+ return useEditorState((state) => selectNode(state, id));
23
+ }
24
+ export function useSelectedNode() {
25
+ return useEditorState(selectSelectedNode);
26
+ }
27
+ export function useNodeChildren(id, slot = 'default') {
28
+ return useEditorState((state) => selectChildren(state, id, slot));
29
+ }
30
+ export function useIsDirty() {
31
+ return useEditorState(selectIsDirty);
32
+ }
@@ -0,0 +1,32 @@
1
+ import { type BuilderDocument, type NodeId } from '@next-buildr/core';
2
+ /** Where the keyboard moves the selection from the node it is on. */
3
+ export type SelectionMove = 'parent' | 'child' | 'next' | 'previous';
4
+ export type SelectMode =
5
+ /** The node becomes the whole selection. */
6
+ 'replace'
7
+ /** Ctrl/Cmd-click: in if it was out, out if it was in. */
8
+ | 'toggle'
9
+ /** Shift-click: in, whatever it was. */
10
+ | 'add';
11
+ export interface SelectionState {
12
+ /** In the order they were selected. */
13
+ readonly selectedIds: readonly NodeId[];
14
+ /** The node the selection is centred on: the inspector shows it, moves start from it, ranges will extend from it. */
15
+ readonly anchorId: NodeId | null;
16
+ /** Which repetition of a Loop the (single) selected node is: what the canvas reported on click. */
17
+ readonly selectedInstance: string | undefined;
18
+ }
19
+ export declare const EMPTY_SELECTION: SelectionState;
20
+ /** The selection with every node the document no longer has taken out, and its anchor and instance kept consistent. */
21
+ export declare function normalizeSelection(doc: BuilderDocument, selection: SelectionState): SelectionState;
22
+ /** What selecting `id` does to a selection. */
23
+ export declare function selectIn(current: SelectionState, id: NodeId, mode?: SelectMode, instance?: string): SelectionState;
24
+ /** The nodes from the root down to `id`, or `[]` when `id` is not in the document. */
25
+ export declare function pathTo(doc: BuilderDocument, id: NodeId): NodeId[];
26
+ /**
27
+ * The node one step from `id`: its parent, its first child, or the next or previous sibling (among
28
+ * the parent's children across all slots). `undefined` when there is no such node: the root has no
29
+ * parent or sibling, a leaf has no child, and the ends do not wrap.
30
+ */
31
+ export declare function relativeNode(doc: BuilderDocument, id: NodeId, move: SelectionMove): NodeId | undefined;
32
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/store/selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAe,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEnF,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAErE,MAAM,MAAM,UAAU;AACpB,4CAA4C;AAC1C,SAAS;AACX,0DAA0D;GACxD,QAAQ;AACV,wCAAwC;GACtC,KAAK,CAAC;AAEV,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,qHAAqH;IACrH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,mGAAmG;IACnG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED,eAAO,MAAM,eAAe,EAAE,cAI7B,CAAC;AAIF,uHAAuH;AACvH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,cAAc,GACxB,cAAc,CAchB;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,CACtB,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,UAAsB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAkBhB;AAED,sFAAsF;AACtF,wBAAgB,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAWjE;AAUD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,aAAa,GAClB,MAAM,GAAG,SAAS,CAUpB"}
@@ -0,0 +1,84 @@
1
+ import { createIndex } from '@next-buildr/core';
2
+ export const EMPTY_SELECTION = {
3
+ selectedIds: [],
4
+ anchorId: null,
5
+ selectedInstance: undefined,
6
+ };
7
+ const has = (doc, id) => Object.hasOwn(doc.nodes, id);
8
+ /** The selection with every node the document no longer has taken out, and its anchor and instance kept consistent. */
9
+ export function normalizeSelection(doc, selection) {
10
+ const ids = [];
11
+ for (const id of selection.selectedIds)
12
+ if (has(doc, id) && !ids.includes(id))
13
+ ids.push(id);
14
+ const anchor = selection.anchorId !== null && ids.includes(selection.anchorId)
15
+ ? selection.anchorId
16
+ : (ids[ids.length - 1] ?? null);
17
+ const instance = ids.length === 1 && ids[0] === anchor ? selection.selectedInstance : undefined;
18
+ const same = ids.length === selection.selectedIds.length &&
19
+ ids.every((id, i) => id === selection.selectedIds[i]) &&
20
+ anchor === selection.anchorId &&
21
+ instance === selection.selectedInstance;
22
+ return same ? selection : { selectedIds: ids, anchorId: anchor, selectedInstance: instance };
23
+ }
24
+ /** What selecting `id` does to a selection. */
25
+ export function selectIn(current, id, mode = 'replace', instance) {
26
+ if (mode === 'replace') {
27
+ return { selectedIds: [id], anchorId: id, selectedInstance: instance };
28
+ }
29
+ const present = current.selectedIds.includes(id);
30
+ if (mode === 'toggle' && present) {
31
+ const rest = current.selectedIds.filter((other) => other !== id);
32
+ return {
33
+ selectedIds: rest,
34
+ anchorId: current.anchorId === id ? (rest[rest.length - 1] ?? null) : current.anchorId,
35
+ selectedInstance: undefined,
36
+ };
37
+ }
38
+ return {
39
+ selectedIds: present ? current.selectedIds : [...current.selectedIds, id],
40
+ anchorId: id,
41
+ selectedInstance: undefined,
42
+ };
43
+ }
44
+ /** The nodes from the root down to `id`, or `[]` when `id` is not in the document. */
45
+ export function pathTo(doc, id) {
46
+ const index = createIndex(doc);
47
+ if (!has(doc, id) || (id !== doc.root && index.parentOf[id] === undefined))
48
+ return [];
49
+ const path = [id];
50
+ let at = id;
51
+ while (index.parentOf[at] !== undefined && path.length <= index.order.length) {
52
+ const parent = index.parentOf[at];
53
+ path.unshift(parent);
54
+ at = parent;
55
+ }
56
+ return path;
57
+ }
58
+ /** The children of a node, across all of its slots in order. */
59
+ function childrenOf(doc, id) {
60
+ const slots = doc.nodes[id]?.slots ?? {};
61
+ return Object.values(slots)
62
+ .flat()
63
+ .filter((child) => has(doc, child));
64
+ }
65
+ /**
66
+ * The node one step from `id`: its parent, its first child, or the next or previous sibling (among
67
+ * the parent's children across all slots). `undefined` when there is no such node: the root has no
68
+ * parent or sibling, a leaf has no child, and the ends do not wrap.
69
+ */
70
+ export function relativeNode(doc, id, move) {
71
+ if (!has(doc, id))
72
+ return undefined;
73
+ const index = createIndex(doc);
74
+ if (move === 'child')
75
+ return childrenOf(doc, id)[0];
76
+ const parent = index.parentOf[id];
77
+ if (parent === undefined)
78
+ return undefined;
79
+ if (move === 'parent')
80
+ return parent;
81
+ const siblings = childrenOf(doc, parent);
82
+ const at = siblings.indexOf(id);
83
+ return siblings[move === 'next' ? at + 1 : at - 1];
84
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=selection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.test.d.ts","sourceRoot":"","sources":["../../src/store/selection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,95 @@
1
+ import { createRegistryMeta, createSeededIdGenerator, } from '@next-buildr/core';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { createEditorStore } from './create-store.js';
4
+ import { pathTo, relativeNode } from './selection.js';
5
+ import { selectSelectedNode, selectSelectionPath } from './selectors.js';
6
+ const node = (id, type, extra = {}) => ({
7
+ id,
8
+ type,
9
+ ...extra,
10
+ });
11
+ const doc = {
12
+ schemaVersion: 1,
13
+ root: 'root',
14
+ nodes: {
15
+ root: node('root', 'buildr/page', { slots: { default: ['boxNode001', 'boxNode002'] } }),
16
+ boxNode001: node('boxNode001', 'buildr/box', {
17
+ slots: { default: ['textNodeA1', 'textNodeB1'] },
18
+ }),
19
+ boxNode002: node('boxNode002', 'buildr/box'),
20
+ textNodeA1: node('textNodeA1', 'buildr/text'),
21
+ textNodeB1: node('textNodeB1', 'buildr/text'),
22
+ },
23
+ components: {},
24
+ };
25
+ const create = () => createEditorStore({
26
+ doc,
27
+ registry: createRegistryMeta({ components: [] }),
28
+ generateId: createSeededIdGenerator(3),
29
+ validationDelayMs: null,
30
+ });
31
+ describe('selection', () => {
32
+ it('replaces, toggles and adds; the anchor is the last node selected', () => {
33
+ const store = create();
34
+ store.select('textNodeA1', { instance: 'loop:2' });
35
+ expect(store.getState().selectedIds).toEqual(['textNodeA1']);
36
+ expect(store.getState().selectedInstance).toBe('loop:2');
37
+ store.select('textNodeB1', { mode: 'add' });
38
+ expect(store.getState().selectedIds).toEqual(['textNodeA1', 'textNodeB1']);
39
+ expect(store.getState().anchorId).toBe('textNodeB1');
40
+ expect(store.getState().selectedInstance).toBeUndefined();
41
+ store.select('textNodeB1', { mode: 'toggle' });
42
+ expect(store.getState().selectedIds).toEqual(['textNodeA1']);
43
+ expect(store.getState().anchorId).toBe('textNodeA1');
44
+ store.select('boxNode002');
45
+ expect(store.getState().selectedIds).toEqual(['boxNode002']);
46
+ store.clearSelection();
47
+ expect(store.getState().selectedIds).toEqual([]);
48
+ expect(store.getState().anchorId).toBeNull();
49
+ });
50
+ it('ignores a node the document does not have', () => {
51
+ const store = create();
52
+ store.select('ghost');
53
+ expect(store.getState().selectedIds).toEqual([]);
54
+ });
55
+ it('drops a removed node from the selection and moves the anchor', () => {
56
+ const store = create();
57
+ store.select('textNodeA1');
58
+ store.select('textNodeB1', { mode: 'add' });
59
+ store.dispatch({ type: 'node.remove', payload: { ids: ['textNodeB1'] } });
60
+ expect(store.getState().selectedIds).toEqual(['textNodeA1']);
61
+ expect(store.getState().anchorId).toBe('textNodeA1');
62
+ expect(selectSelectedNode(store.getState())?.id).toBe('textNodeA1');
63
+ });
64
+ it('moves to the parent, first child and siblings, and stops at the ends', () => {
65
+ const store = create();
66
+ store.select('boxNode001');
67
+ expect(store.moveSelection('child')).toBe('textNodeA1');
68
+ expect(store.moveSelection('next')).toBe('textNodeB1');
69
+ expect(store.moveSelection('next')).toBeUndefined();
70
+ expect(store.getState().anchorId).toBe('textNodeB1');
71
+ expect(store.moveSelection('previous')).toBe('textNodeA1');
72
+ expect(store.moveSelection('parent')).toBe('boxNode001');
73
+ expect(store.moveSelection('parent')).toBe('root');
74
+ expect(store.moveSelection('parent')).toBeUndefined();
75
+ expect(store.moveSelection('child')).toBe('boxNode001');
76
+ });
77
+ it('does nothing without a selection', () => {
78
+ expect(create().moveSelection('child')).toBeUndefined();
79
+ });
80
+ it('knows the path from the root', () => {
81
+ expect(pathTo(doc, 'textNodeB1')).toEqual(['root', 'boxNode001', 'textNodeB1']);
82
+ expect(pathTo(doc, 'root')).toEqual(['root']);
83
+ expect(pathTo(doc, 'ghost')).toEqual([]);
84
+ expect(relativeNode(doc, 'textNodeA1', 'previous')).toBeUndefined();
85
+ const store = create();
86
+ store.select('textNodeA1');
87
+ expect(selectSelectionPath(store.getState())).toEqual(['root', 'boxNode001', 'textNodeA1']);
88
+ });
89
+ it('clears a hover on a node that is gone', () => {
90
+ const store = create();
91
+ store.setHovered('textNodeB1');
92
+ store.dispatch({ type: 'node.remove', payload: { ids: ['textNodeB1'] } });
93
+ expect(store.getState().hoveredId).toBeNull();
94
+ });
95
+ });
@@ -0,0 +1,18 @@
1
+ import { type DocumentIndex, type NodeId, type PageNode, type SlotName } from '@next-buildr/core';
2
+ import type { EditorState } from './types.ts';
3
+ /**
4
+ * The parent/slot index of the document, built when first asked for and reused until the document
5
+ * changes (a new document is a new object, so the cache needs no invalidation).
6
+ */
7
+ export declare function selectIndex(state: Pick<EditorState, 'doc'>): DocumentIndex;
8
+ /** A node, or `undefined`. The same object until that node changes (structural sharing). */
9
+ export declare function selectNode(state: Pick<EditorState, 'doc'>, id: NodeId): PageNode | undefined;
10
+ /** The children of a node in one slot; the same array until it changes. */
11
+ export declare function selectChildren(state: Pick<EditorState, 'doc'>, id: NodeId, slot?: SlotName): readonly NodeId[];
12
+ /** The anchor of the selection (the last node selected), if any. */
13
+ export declare function selectSelectedNode(state: Pick<EditorState, 'doc' | 'anchorId'>): PageNode | undefined;
14
+ /** The nodes from the root down to the anchor (empty with no selection). */
15
+ export declare function selectSelectionPath(state: Pick<EditorState, 'doc' | 'anchorId'>): readonly NodeId[];
16
+ /** Whether the document differs from the saved one; undoing back to the saved state is clean again. */
17
+ export declare function selectIsDirty(state: Pick<EditorState, 'cursorId' | 'savedCursorId'>): boolean;
18
+ //# sourceMappingURL=selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/store/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,aAAa,CAO1E;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE5F;AAID,2EAA2E;AAC3E,wBAAgB,cAAc,CAC5B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC/B,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,QAAoB,GACzB,SAAS,MAAM,EAAE,CAKnB;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,UAAU,CAAC,GAC3C,QAAQ,GAAG,SAAS,CAEtB;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,UAAU,CAAC,GAC3C,SAAS,MAAM,EAAE,CAEnB;AAED,uGAAuG;AACvG,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,eAAe,CAAC,GAAG,OAAO,CAE7F"}