@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,99 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useT } from '../../../messages/index.js';
3
+ import { Button, Icon } from '../../../ui/index.js';
4
+ import { BooleanControl } from './boolean.js';
5
+ import { IconControl } from './icon.js';
6
+ import { propLabel } from './label.js';
7
+ import { LinkControl } from './link.js';
8
+ import { MediaControl } from './media.js';
9
+ import { NumberControl } from './number.js';
10
+ import { RichTextControl } from './rich-text.js';
11
+ import { SelectControl } from './select.js';
12
+ import { TextControl } from './text.js';
13
+ import { TextareaControl } from './textarea.js';
14
+ /** The control for a prop of any kind, or `null` for a kind that has none. Lists and objects recurse. */
15
+ export function renderControl(def, common) {
16
+ switch (def.kind) {
17
+ case 'text':
18
+ return _jsx(TextControl, { ...common, def: def });
19
+ case 'textarea':
20
+ return _jsx(TextareaControl, { ...common, def: def });
21
+ case 'number':
22
+ return _jsx(NumberControl, { ...common, def: def });
23
+ case 'boolean':
24
+ return _jsx(BooleanControl, { ...common, def: def });
25
+ case 'select':
26
+ return _jsx(SelectControl, { ...common, def: def });
27
+ case 'link':
28
+ return _jsx(LinkControl, { ...common, def: def });
29
+ case 'icon':
30
+ return _jsx(IconControl, { ...common, def: def });
31
+ case 'media':
32
+ return _jsx(MediaControl, { ...common, def: def });
33
+ case 'richText':
34
+ return _jsx(RichTextControl, { ...common, def: def });
35
+ case 'list':
36
+ return _jsx(ListControl, { ...common, def: def });
37
+ case 'object':
38
+ return _jsx(ObjectControl, { ...common, def: def });
39
+ default:
40
+ return null;
41
+ }
42
+ }
43
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
44
+ /** What an item holds when a fresh one is added: the item definition's default, copied. */
45
+ const freshItem = (def) => structuredClone(def.default);
46
+ /** Moves the item at `from` to `to`; out of range returns the list unchanged. */
47
+ export function moveItem(list, from, to) {
48
+ const next = [...list];
49
+ if (from < 0 || from >= next.length || to < 0 || to >= next.length)
50
+ return next;
51
+ const [item] = next.splice(from, 1);
52
+ next.splice(to, 0, item);
53
+ return next;
54
+ }
55
+ /**
56
+ * A list of sub-props: each item is edited with the control of `def.of`, and items can be added
57
+ * (up to `max`), removed (down to `min`) and reordered. Every change writes the whole new list.
58
+ */
59
+ export function ListControl({ id, def, label, describedBy, value, disabled, onChange, }) {
60
+ const t = useT();
61
+ const items = Array.isArray(value) ? value : [];
62
+ const of = def.of;
63
+ const canAdd = def.max === undefined || items.length < def.max;
64
+ const canRemove = def.min === undefined || items.length > def.min;
65
+ const replace = (index, item) => onChange(items.map((current, at) => (at === index ? item : current)));
66
+ return (_jsxs("fieldset", { className: "bd-list", id: id, "aria-label": label, "aria-describedby": describedBy, children: [items.length === 0 ? _jsx("p", { className: "bd-list-empty", children: t('list.empty') }) : null, _jsx("ol", { className: "bd-list-items", children: items.map((item, index) => {
67
+ const number = index + 1;
68
+ const itemLabel = `${t('list.item')} ${number}`;
69
+ return (_jsxs("li", { className: "bd-list-item", children: [_jsxs("div", { className: "bd-list-item-head", children: [_jsx("span", { className: "bd-list-item-title", children: itemLabel }), _jsxs("span", { className: "bd-list-item-actions", children: [_jsx(Button, { variant: "ghost", disabled: disabled || index === 0, "aria-label": `${t('list.moveUp')}: ${itemLabel}`, onClick: () => onChange(moveItem(items, index, index - 1)), children: _jsx(Icon, { name: "arrow-up" }) }), _jsx(Button, { variant: "ghost", disabled: disabled || index === items.length - 1, "aria-label": `${t('list.moveDown')}: ${itemLabel}`, onClick: () => onChange(moveItem(items, index, index + 1)), children: _jsx(Icon, { name: "arrow-down" }) }), _jsx(Button, { variant: "ghost", disabled: disabled || !canRemove, "aria-label": `${t('list.remove')}: ${itemLabel}`, onClick: () => onChange(items.filter((_, at) => at !== index)), children: _jsx(Icon, { name: "x" }) })] })] }), _jsx("div", { className: "bd-list-item-body", children: renderControl(of, {
70
+ id: `${id}-${index}`,
71
+ def: of,
72
+ label: itemLabel,
73
+ describedBy: undefined,
74
+ value: item,
75
+ disabled,
76
+ onChange: (next) => replace(index, next),
77
+ }) })] }, index));
78
+ }) }), _jsx(Button, { variant: "default", disabled: disabled || !canAdd, onClick: () => onChange([...items, freshItem(of)]), children: t('list.add') })] }));
79
+ }
80
+ /** A group of named sub-props, each edited with its own control; a change writes the whole object. */
81
+ export function ObjectControl({ id, def, label, describedBy, value, disabled, onChange, }) {
82
+ const shown = isRecord(value) ? value : {};
83
+ const fields = Object.entries(def.fields);
84
+ return (_jsx("fieldset", { className: "bd-object", id: id, "aria-label": label, "aria-describedby": describedBy, children: fields.map(([name, field]) => {
85
+ const fieldId = `${id}-${name}`;
86
+ const fieldLabel = propLabel(name, field);
87
+ const own = Object.hasOwn(shown, name) ? shown[name] : field.default;
88
+ const control = renderControl(field, {
89
+ id: fieldId,
90
+ def: field,
91
+ label: fieldLabel,
92
+ describedBy: undefined,
93
+ value: own,
94
+ disabled,
95
+ onChange: (next) => onChange({ ...shown, [name]: next }),
96
+ });
97
+ return (_jsxs("div", { className: "bd-object-field", "data-field": name, "data-kind": field.kind, children: [_jsx("label", { htmlFor: fieldId, className: "bd-field-label", children: fieldLabel }), control] }, name));
98
+ }) }));
99
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compound.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.test.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/compound.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,195 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment jsdom
3
+ import { p, richTextSchema } from '@next-buildr/core';
4
+ import { $createParagraphNode, $createTextNode, $getRoot } from 'lexical';
5
+ import { act, useState } from 'react';
6
+ import { createRoot } from 'react-dom/client';
7
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
8
+ import { MessagesProvider } from '../../../messages/index.js';
9
+ import { moveItem, renderControl } from './compound.js';
10
+ import { serializeRichText, toRichText } from './rich-text-model.js';
11
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
12
+ let container;
13
+ let root;
14
+ beforeEach(() => {
15
+ container = document.createElement('div');
16
+ document.body.append(container);
17
+ root = createRoot(container);
18
+ });
19
+ afterEach(() => {
20
+ act(() => root.unmount());
21
+ document.body.innerHTML = '';
22
+ });
23
+ /** A control holding its own value, the way the store does; `seen` records every value it wrote. */
24
+ async function mount(def, initial, seen = []) {
25
+ function Host() {
26
+ const [value, setValue] = useState(initial);
27
+ return renderControl(def, {
28
+ id: 'c',
29
+ def,
30
+ label: 'Field',
31
+ describedBy: undefined,
32
+ value,
33
+ disabled: false,
34
+ onChange: (next) => {
35
+ seen.push(next);
36
+ setValue(next);
37
+ },
38
+ });
39
+ }
40
+ await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(Host, {}) })));
41
+ return seen;
42
+ }
43
+ const byLabel = (label) => container.querySelector(`[aria-label="${label}"]`);
44
+ const click = (element) => act(async () => {
45
+ element.dispatchEvent(new MouseEvent('click', { bubbles: true }));
46
+ });
47
+ /** Every node of the format carries `version: 1`; the samples leave it out and this adds it. */
48
+ const withVersions = (node) => {
49
+ if (Array.isArray(node))
50
+ return node.map(withVersions);
51
+ if (typeof node !== 'object' || node === null)
52
+ return node;
53
+ const entries = Object.entries(node).map(([key, value]) => [key, withVersions(value)]);
54
+ return { ...Object.fromEntries(entries), ...('type' in node ? { version: 1 } : {}) };
55
+ };
56
+ const doc = (children) => withVersions({ type: 'root', children });
57
+ const text = (value, format = 0) => ({ type: 'text', text: value, format });
58
+ describe('rich text model', () => {
59
+ const samples = [
60
+ doc([]),
61
+ doc([{ type: 'paragraph', children: [text('Hello '), text('world', 1)] }]),
62
+ doc([
63
+ { type: 'heading', tag: 'h2', children: [text('Title')] },
64
+ {
65
+ type: 'paragraph',
66
+ children: [
67
+ { type: 'link', url: 'https://example.com', children: [text('a link', 2)] },
68
+ { type: 'linebreak' },
69
+ text('after'),
70
+ ],
71
+ },
72
+ {
73
+ type: 'list',
74
+ listType: 'number',
75
+ children: [
76
+ { type: 'listitem', children: [text('one')] },
77
+ { type: 'listitem', children: [text('two')] },
78
+ ],
79
+ },
80
+ ]),
81
+ ];
82
+ it.each(samples.map((sample, index) => [index, sample]))('sample %i survives load and serialize', async (_, sample) => {
83
+ await mount(p.richText({}), sample);
84
+ const editor = container.querySelector('[role=textbox]').__lexicalEditor;
85
+ const out = serializeRichText(editor.getEditorState());
86
+ expect(out).toEqual(sample);
87
+ });
88
+ it('turns anything that is not rich text into an empty document', () => {
89
+ expect(toRichText(null).children).toEqual([]);
90
+ expect(toRichText('plain').children).toEqual([]);
91
+ expect(richTextSchema.safeParse(toRichText({ junk: true })).success).toBe(true);
92
+ });
93
+ it('only writes documents that pass the schema', async () => {
94
+ const seen = await mount(p.richText({}), doc([]));
95
+ const editor = container.querySelector('[role=textbox]').__lexicalEditor;
96
+ await act(async () => {
97
+ editor.update(() => {
98
+ const paragraph = $createParagraphNode();
99
+ paragraph.append($createTextNode('typed'));
100
+ $getRoot().clear().append(paragraph);
101
+ }, { discrete: true });
102
+ });
103
+ expect(seen.length).toBeGreaterThan(0);
104
+ for (const value of seen)
105
+ expect(richTextSchema.safeParse(value).success).toBe(true);
106
+ expect(seen.at(-1)).toEqual(doc([{ type: 'paragraph', children: [text('typed')] }]));
107
+ });
108
+ it('shows a value that changed elsewhere', async () => {
109
+ await mount(p.richText({}), doc([{ type: 'paragraph', children: [text('first')] }]));
110
+ expect(container.querySelector('[role=textbox]')?.textContent).toBe('first');
111
+ });
112
+ it('labels the toolbar buttons and reflects their state', async () => {
113
+ await mount(p.richText({}), doc([]));
114
+ expect(container.querySelector('[role=toolbar]')).not.toBeNull();
115
+ for (const name of ['Bold', 'Italic', 'Link', 'Heading 2', 'Bulleted list']) {
116
+ expect(byLabel(name).getAttribute('aria-pressed')).toBe('false');
117
+ }
118
+ });
119
+ it('refuses an unsafe link address', async () => {
120
+ await mount(p.richText({}), doc([{ type: 'paragraph', children: [text('x')] }]));
121
+ await click(byLabel('Link'));
122
+ const input = container.querySelector('input');
123
+ await act(async () => {
124
+ Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(input, 'javascript:alert(1)');
125
+ input.dispatchEvent(new Event('input', { bubbles: true }));
126
+ });
127
+ await act(async () => {
128
+ container
129
+ .querySelector('form')
130
+ ?.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));
131
+ });
132
+ expect(container.querySelector('[role=alert]')?.textContent).toBe('This address is not allowed.');
133
+ });
134
+ });
135
+ describe('list control', () => {
136
+ const def = p.list(p.text({ default: 'new' }), { min: 1, max: 3 });
137
+ it('adds an item made from the item default, up to the maximum', async () => {
138
+ const seen = await mount(def, ['a', 'b']);
139
+ await click([...container.querySelectorAll('button')].find((b) => b.textContent === 'Add item'));
140
+ expect(seen.at(-1)).toEqual(['a', 'b', 'new']);
141
+ expect([...container.querySelectorAll('button')].find((b) => b.textContent === 'Add item').disabled).toBe(true);
142
+ });
143
+ it('removes an item, down to the minimum', async () => {
144
+ const seen = await mount(def, ['a', 'b']);
145
+ await click(byLabel('Remove: Item 1'));
146
+ expect(seen.at(-1)).toEqual(['b']);
147
+ expect(byLabel('Remove: Item 1').disabled).toBe(true);
148
+ });
149
+ it('moves items and stops at the ends', async () => {
150
+ const seen = await mount(def, ['a', 'b', 'c']);
151
+ expect(byLabel('Move up: Item 1').disabled).toBe(true);
152
+ expect(byLabel('Move down: Item 3').disabled).toBe(true);
153
+ await click(byLabel('Move down: Item 1'));
154
+ expect(seen.at(-1)).toEqual(['b', 'a', 'c']);
155
+ await click(byLabel('Move up: Item 3'));
156
+ expect(seen.at(-1)).toEqual(['b', 'c', 'a']);
157
+ });
158
+ it('edits an item with the control of its kind', async () => {
159
+ const seen = await mount(def, ['a', 'b']);
160
+ const input = container.querySelector('#c-1');
161
+ await act(async () => {
162
+ Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(input, 'changed');
163
+ input.dispatchEvent(new Event('input', { bubbles: true }));
164
+ });
165
+ expect(seen.at(-1)).toEqual(['a', 'changed']);
166
+ });
167
+ it('treats a value that is not a list as empty', async () => {
168
+ await mount(p.list(p.text({})), 'nonsense');
169
+ expect(container.textContent).toContain('No items yet.');
170
+ });
171
+ it('moveItem ignores positions out of range', () => {
172
+ expect(moveItem([1, 2], 0, 5)).toEqual([1, 2]);
173
+ expect(moveItem([1, 2, 3], 2, 0)).toEqual([3, 1, 2]);
174
+ });
175
+ });
176
+ describe('object control', () => {
177
+ const def = p.object({ label: p.text({ default: 'L' }), count: p.number({ default: 2 }) });
178
+ it('shows defaults for missing fields and writes the whole object', async () => {
179
+ const seen = await mount(def, { label: 'Own' });
180
+ expect(container.querySelector('#c-label').value).toBe('Own');
181
+ expect(container.querySelector('#c-count').value).toBe('2');
182
+ const input = container.querySelector('#c-label');
183
+ await act(async () => {
184
+ Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(input, 'X');
185
+ input.dispatchEvent(new Event('input', { bubbles: true }));
186
+ });
187
+ expect(seen.at(-1)).toEqual({ label: 'X' });
188
+ });
189
+ it('nests lists inside objects', async () => {
190
+ const nested = p.object({ tags: p.list(p.text({ default: 't' })) });
191
+ const seen = await mount(nested, { tags: [] });
192
+ await click([...container.querySelectorAll('button')].find((b) => b.textContent === 'Add item'));
193
+ expect(seen.at(-1)).toEqual({ tags: ['t'] });
194
+ });
195
+ });
@@ -0,0 +1,5 @@
1
+ import type { IconPropDef } from '@next-buildr/core';
2
+ import type { ControlProps } from './types.ts';
3
+ /** An icon is named (`arrow-right`); the picker with a preview comes with the icon library. */
4
+ export declare function IconControl({ id, def, label, describedBy, value, disabled, onChange, }: ControlProps<IconPropDef>): import("react").JSX.Element;
5
+ //# sourceMappingURL=icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,GAAG,EACH,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,YAAY,CAAC,WAAW,CAAC,+BAc3B"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Input } from '../../../ui/index.js';
3
+ /** An icon is named (`arrow-right`); the picker with a preview comes with the icon library. */
4
+ export function IconControl({ id, def, label, describedBy, value, disabled, onChange, }) {
5
+ return (_jsx(Input, { id: id, type: "text", autoComplete: "off", spellCheck: false, value: typeof value === 'string' ? value : def.default, disabled: disabled, "aria-label": label, "aria-describedby": describedBy, onChange: (event) => onChange(event.target.value.trim()) }));
6
+ }
@@ -0,0 +1,13 @@
1
+ export { BooleanControl } from './boolean.tsx';
2
+ export { ListControl, moveItem, ObjectControl, renderControl } from './compound.tsx';
3
+ export { IconControl } from './icon.tsx';
4
+ export { propLabel } from './label.ts';
5
+ export { LinkControl } from './link.tsx';
6
+ export { MediaControl } from './media.tsx';
7
+ export { NumberControl, parseNumber } from './number.tsx';
8
+ export { RichTextControl } from './rich-text.tsx';
9
+ export { SelectControl } from './select.tsx';
10
+ export { TextControl } from './text.tsx';
11
+ export { TextareaControl } from './textarea.tsx';
12
+ export type { ControlProps } from './types.ts';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { BooleanControl } from './boolean.js';
2
+ export { ListControl, moveItem, ObjectControl, renderControl } from './compound.js';
3
+ export { IconControl } from './icon.js';
4
+ export { propLabel } from './label.js';
5
+ export { LinkControl } from './link.js';
6
+ export { MediaControl } from './media.js';
7
+ export { NumberControl, parseNumber } from './number.js';
8
+ export { RichTextControl } from './rich-text.js';
9
+ export { SelectControl } from './select.js';
10
+ export { TextControl } from './text.js';
11
+ export { TextareaControl } from './textarea.js';
@@ -0,0 +1,4 @@
1
+ import type { PropDef } from '@next-buildr/core';
2
+ /** The label of a prop: its own, else its name split into words. */
3
+ export declare function propLabel(name: string, def: PropDef): string;
4
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAI5D"}
@@ -0,0 +1,8 @@
1
+ const titleCase = (text) => text.charAt(0).toUpperCase() + text.slice(1);
2
+ /** The label of a prop: its own, else its name split into words. */
3
+ export function propLabel(name, def) {
4
+ if (def.label !== undefined)
5
+ return def.label;
6
+ const words = name.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[-_]+/g, ' ');
7
+ return titleCase(words.toLowerCase());
8
+ }
@@ -0,0 +1,5 @@
1
+ import type { LinkPropDef } from '@next-buildr/core';
2
+ import type { ControlProps } from './types.ts';
3
+ /** The address is free text here; what a link may point at is checked by the property's own schema on write. */
4
+ export declare function LinkControl({ id, def, label, describedBy, value, disabled, onChange, }: ControlProps<LinkPropDef>): import("react").JSX.Element;
5
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,gHAAgH;AAChH,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,GAAG,EACH,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,YAAY,CAAC,WAAW,CAAC,+BAe3B"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Input } from '../../../ui/index.js';
3
+ /** The address is free text here; what a link may point at is checked by the property's own schema on write. */
4
+ export function LinkControl({ id, def, label, describedBy, value, disabled, onChange, }) {
5
+ return (_jsx(Input, { id: id, type: "text", inputMode: "url", autoComplete: "off", spellCheck: false, value: typeof value === 'string' ? value : def.default, disabled: disabled, "aria-label": label, "aria-describedby": describedBy, onChange: (event) => onChange(event.target.value) }));
6
+ }
@@ -0,0 +1,9 @@
1
+ import type { MediaPropDef } from '@next-buildr/core';
2
+ import type { ControlProps } from './types.ts';
3
+ /**
4
+ * A media prop: the picked file's thumbnail and alternative text, and buttons to choose, replace or
5
+ * remove it. Choosing opens the media picker; what is stored is a `MediaRef` with a snapshot. To bind
6
+ * the prop to a data field instead, use the Data mode of the value switch.
7
+ */
8
+ export declare function MediaControl({ id, def, label, describedBy, value, disabled, onChange, }: ControlProps<MediaPropDef>): import("react").JSX.Element;
9
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/media.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EACF,GAAG,EACH,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,YAAY,CAAC,YAAY,CAAC,+BAmD5B"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { MediaPicker, parseMediaRef, toMediaRef, useMediaLibrary, } from '../../../dialogs/media-picker/index.js';
4
+ import { useT } from '../../../messages/index.js';
5
+ import { Button } from '../../../ui/index.js';
6
+ /**
7
+ * A media prop: the picked file's thumbnail and alternative text, and buttons to choose, replace or
8
+ * remove it. Choosing opens the media picker; what is stored is a `MediaRef` with a snapshot. To bind
9
+ * the prop to a data field instead, use the Data mode of the value switch.
10
+ */
11
+ export function MediaControl({ id, def, label, describedBy, value, disabled, onChange, }) {
12
+ const t = useT();
13
+ const library = useMediaLibrary();
14
+ const [open, setOpen] = useState(false);
15
+ const ref = parseMediaRef(value);
16
+ const snapshot = ref?.snapshot;
17
+ return (_jsxs("div", { className: "bd-media-control", id: id, "aria-describedby": describedBy, children: [ref !== undefined ? (_jsxs("div", { className: "bd-media-preview", children: [snapshot !== undefined && (snapshot.mimeType ?? 'image/').startsWith('image/') ? (_jsx("img", { src: snapshot.url, alt: snapshot.alt ?? '', width: 64, height: 64 })) : (_jsx("span", { className: "bd-media-file", children: snapshot?.mimeType ?? ref.id })), _jsx("span", { className: "bd-media-name", children: snapshot?.alt ?? ref.id })] })) : (_jsx("p", { className: "bd-field-hint", children: t('media.none') })), _jsxs("div", { className: "bd-media-actions", children: [_jsx(Button, { disabled: disabled || library === undefined, "aria-label": `${label}: ${t(ref === undefined ? 'media.choose' : 'media.replace')}`, onClick: () => setOpen(true), children: t(ref === undefined ? 'media.choose' : 'media.replace') }), ref !== undefined ? (_jsx(Button, { variant: "ghost", disabled: disabled, "aria-label": `${label}: ${t('media.remove')}`, onClick: () => onChange(null), children: t('media.remove') })) : null] }), library === undefined ? _jsx("p", { className: "bd-field-hint", children: t('media.unavailable') }) : null, _jsx(MediaPicker, { open: open, onOpenChange: setOpen, accept: def.accept, onPick: (asset) => {
18
+ if (library !== undefined)
19
+ onChange(toMediaRef(asset, library.collection));
20
+ } })] }));
21
+ }
@@ -0,0 +1,10 @@
1
+ import type { NumberPropDef } from '@next-buildr/core';
2
+ import type { ControlProps } from './types.ts';
3
+ /** Whether `text` is a number the prop accepts (finite and inside its range). */
4
+ export declare function parseNumber(text: string, def: NumberPropDef): number | undefined;
5
+ /**
6
+ * The text is a draft ("1." and "" are steps on the way to a number); only a valid number is
7
+ * written, and leaving the field shows the stored value again.
8
+ */
9
+ export declare function NumberControl({ id, def, label, describedBy, value, disabled, onChange, }: ControlProps<NumberPropDef>): import("react").JSX.Element;
10
+ //# sourceMappingURL=number.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/number.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAOhF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EACF,GAAG,EACH,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,YAAY,CAAC,aAAa,CAAC,+BA0B7B"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Input } from '../../../ui/index.js';
4
+ /** Whether `text` is a number the prop accepts (finite and inside its range). */
5
+ export function parseNumber(text, def) {
6
+ if (text.trim() === '')
7
+ return undefined;
8
+ const parsed = Number(text);
9
+ if (!Number.isFinite(parsed))
10
+ return undefined;
11
+ if (def.min !== undefined && parsed < def.min)
12
+ return undefined;
13
+ if (def.max !== undefined && parsed > def.max)
14
+ return undefined;
15
+ return parsed;
16
+ }
17
+ /**
18
+ * The text is a draft ("1." and "" are steps on the way to a number); only a valid number is
19
+ * written, and leaving the field shows the stored value again.
20
+ */
21
+ export function NumberControl({ id, def, label, describedBy, value, disabled, onChange, }) {
22
+ const current = typeof value === 'number' ? value : def.default;
23
+ const [draft, setDraft] = useState(String(current));
24
+ useEffect(() => {
25
+ setDraft((shown) => (parseNumber(shown, def) === current ? shown : String(current)));
26
+ }, [current, def]);
27
+ return (_jsx(Input, { id: id, type: "number", inputMode: "decimal", value: draft, min: def.min, max: def.max, step: def.step, disabled: disabled, "aria-label": label, "aria-describedby": describedBy, onChange: (event) => {
28
+ setDraft(event.target.value);
29
+ const next = parseNumber(event.target.value, def);
30
+ if (next !== undefined && next !== current)
31
+ onChange(next);
32
+ }, onBlur: () => setDraft(String(current)) }));
33
+ }
@@ -0,0 +1,20 @@
1
+ import { type RichTextRootNode } from '@next-buildr/core';
2
+ import { type EditorState } from 'lexical';
3
+ /** The tags the toolbar offers; the format itself allows h1 to h6, so pasted h1 still round-trips. */
4
+ export declare const HEADING_TAGS: readonly ['h2', 'h3', 'h4'];
5
+ /** A well-formed empty document: one empty paragraph is what the editor shows, and what it saves. */
6
+ export declare const EMPTY_RICH_TEXT: RichTextRootNode;
7
+ /**
8
+ * What a rich text prop holds, as the format the renderer reads. Anything that is not a rich text
9
+ * document (a `null` default, a plain string, corrupt JSON) becomes an empty one; nothing throws.
10
+ */
11
+ export declare function toRichText(value: unknown): RichTextRootNode;
12
+ /** Replaces the editor's content with `root`. Call inside `editor.update`. */
13
+ export declare function $loadRichText(root: RichTextRootNode): void;
14
+ /**
15
+ * The editor's content in the core rich text format, or `undefined` when it does not conform (which
16
+ * the walk into `normalizeRichText` makes impossible, but the schema has the last word — nothing
17
+ * that fails `richTextSchema` ever reaches the document).
18
+ */
19
+ export declare function serializeRichText(state: EditorState): RichTextRootNode | undefined;
20
+ //# sourceMappingURL=rich-text-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text-model.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/rich-text-model.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,gBAAgB,EAEtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAKL,KAAK,WAAW,EAGjB,MAAM,SAAS,CAAC;AAEjB,sGAAsG;AACtG,eAAO,MAAM,YAAY,YAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAExD,qGAAqG;AACrG,eAAO,MAAM,eAAe,EAAE,gBAA6D,CAAC;AAE5F;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAK3D;AA+CD,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAK1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,SAAS,CAelF"}
@@ -0,0 +1,91 @@
1
+ import { $createLinkNode } from '@lexical/link';
2
+ import { $createListItemNode, $createListNode } from '@lexical/list';
3
+ import { $createHeadingNode, $createQuoteNode } from '@lexical/rich-text';
4
+ import { normalizeRichText, richTextSchema, } from '@next-buildr/core';
5
+ import { $createLineBreakNode, $createParagraphNode, $createTextNode, $getRoot, } from 'lexical';
6
+ /** The tags the toolbar offers; the format itself allows h1 to h6, so pasted h1 still round-trips. */
7
+ export const HEADING_TAGS = ['h2', 'h3', 'h4'];
8
+ /** A well-formed empty document: one empty paragraph is what the editor shows, and what it saves. */
9
+ export const EMPTY_RICH_TEXT = { type: 'root', version: 1, children: [] };
10
+ /**
11
+ * What a rich text prop holds, as the format the renderer reads. Anything that is not a rich text
12
+ * document (a `null` default, a plain string, corrupt JSON) becomes an empty one; nothing throws.
13
+ */
14
+ export function toRichText(value) {
15
+ if (value === null || value === undefined)
16
+ return EMPTY_RICH_TEXT;
17
+ const parsed = richTextSchema.safeParse(value);
18
+ if (parsed.success)
19
+ return parsed.data;
20
+ return normalizeRichText(value).value;
21
+ }
22
+ function inline(node) {
23
+ switch (node.type) {
24
+ case 'text':
25
+ return $createTextNode(node.text).setFormat(node.format);
26
+ case 'linebreak':
27
+ return $createLineBreakNode();
28
+ case 'link': {
29
+ const link = $createLinkNode(node.url);
30
+ link.append(...node.children.map(inline));
31
+ return link;
32
+ }
33
+ }
34
+ }
35
+ function block(node) {
36
+ switch (node.type) {
37
+ case 'paragraph': {
38
+ const paragraph = $createParagraphNode();
39
+ paragraph.append(...node.children.map(inline));
40
+ return paragraph;
41
+ }
42
+ case 'heading': {
43
+ const heading = $createHeadingNode(node.tag);
44
+ heading.append(...node.children.map(inline));
45
+ return heading;
46
+ }
47
+ case 'quote': {
48
+ const quote = $createQuoteNode();
49
+ quote.append(...node.children.map(inline));
50
+ return quote;
51
+ }
52
+ case 'list': {
53
+ const list = $createListNode(node.listType === 'number' ? 'number' : 'bullet');
54
+ for (const item of node.children) {
55
+ const entry = $createListItemNode();
56
+ entry.append(...item.children.map((child) => (child.type === 'list' ? block(child) : inline(child))));
57
+ list.append(entry);
58
+ }
59
+ return list;
60
+ }
61
+ }
62
+ }
63
+ /** Replaces the editor's content with `root`. Call inside `editor.update`. */
64
+ export function $loadRichText(root) {
65
+ const top = $getRoot();
66
+ top.clear();
67
+ for (const child of root.children)
68
+ top.append(block(child));
69
+ if (root.children.length === 0)
70
+ top.append($createParagraphNode());
71
+ }
72
+ /**
73
+ * The editor's content in the core rich text format, or `undefined` when it does not conform (which
74
+ * the walk into `normalizeRichText` makes impossible, but the schema has the last word — nothing
75
+ * that fails `richTextSchema` ever reaches the document).
76
+ */
77
+ export function serializeRichText(state) {
78
+ const json = state.toJSON().root;
79
+ const { value } = normalizeRichText(json);
80
+ const checked = richTextSchema.safeParse(value);
81
+ if (!checked.success)
82
+ return undefined;
83
+ // An editor holding only an empty paragraph is an empty document.
84
+ const [only] = checked.data.children;
85
+ if (checked.data.children.length === 1 &&
86
+ only?.type === 'paragraph' &&
87
+ only.children.length === 0) {
88
+ return { ...checked.data, children: [] };
89
+ }
90
+ return checked.data;
91
+ }
@@ -0,0 +1,10 @@
1
+ import { type RichTextPropDef } from '@next-buildr/core';
2
+ import type { ControlProps } from './types.ts';
3
+ /**
4
+ * A small Lexical editor (paragraph, headings 2 to 4, bold, italic, link, lists) whose output is the
5
+ * core rich text format. The editor's state never leaves through anything but `serializeRichText`,
6
+ * which walks it into `normalizeRichText` and checks `richTextSchema`, so what is written to the
7
+ * document always passes the schema (docs/editor.md#inspector).
8
+ */
9
+ export declare function RichTextControl({ id, label, describedBy, value, disabled, onChange, }: ControlProps<RichTextPropDef>): import("react").JSX.Element;
10
+ //# sourceMappingURL=rich-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/controls/rich-text.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,mBAAmB,CAAC;AAmBtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuC/C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,YAAY,CAAC,eAAe,CAAC,+BAiN/B"}