@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,265 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment jsdom
3
+ import { createRegistryMeta, createSeededIdGenerator, defaultTheme, getStyleProperty, toManifest, } from '@next-buildr/core';
4
+ import { act } from 'react';
5
+ import { createRoot } from 'react-dom/client';
6
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
7
+ import { axe } from 'vitest-axe';
8
+ import * as matchers from 'vitest-axe/matchers';
9
+ import { ManifestProvider } from '../../../app/manifest.js';
10
+ import { MessagesProvider } from '../../../messages/index.js';
11
+ import { createEditorStore, EditorStoreProvider, useEditorState } from '../../../store/index.js';
12
+ import { checkStyleInput } from './model.js';
13
+ import { StyleInspector } from './style-inspector.js';
14
+ expect.extend(matchers);
15
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
16
+ const box = {
17
+ type: 'buildr/box',
18
+ version: 1,
19
+ label: 'Box',
20
+ category: 'layout',
21
+ props: {},
22
+ contentCategories: ['flow'],
23
+ styles: { groups: ['layout', 'spacing', 'visibility'] },
24
+ runtime: 'shared',
25
+ slots: { default: {} },
26
+ };
27
+ const page = {
28
+ ...box,
29
+ type: 'buildr/page',
30
+ label: 'Page',
31
+ capabilities: { root: true },
32
+ };
33
+ const registry = createRegistryMeta({ components: [page, box] });
34
+ const manifest = toManifest(registry);
35
+ const fixture = () => ({
36
+ schemaVersion: 1,
37
+ root: 'root',
38
+ nodes: {
39
+ root: { id: 'root', type: 'buildr/page', slots: { default: ['box0000001'] } },
40
+ box0000001: {
41
+ id: 'box0000001',
42
+ type: 'buildr/box',
43
+ styles: {
44
+ base: { layout: { gap: '$space.4' } },
45
+ bp: { tablet: { layout: { display: 'grid' } } },
46
+ },
47
+ },
48
+ },
49
+ components: {},
50
+ });
51
+ let container;
52
+ let root;
53
+ beforeEach(() => {
54
+ globalThis.ResizeObserver ??= class {
55
+ observe() { }
56
+ unobserve() { }
57
+ disconnect() { }
58
+ };
59
+ Element.prototype.scrollIntoView ??= () => { };
60
+ Element.prototype.hasPointerCapture ??= () => false;
61
+ container = document.createElement('div');
62
+ document.body.append(container);
63
+ root = createRoot(container);
64
+ });
65
+ afterEach(() => {
66
+ act(() => root.unmount());
67
+ document.body.innerHTML = '';
68
+ });
69
+ async function mount(breakpoint) {
70
+ const store = createEditorStore({
71
+ doc: fixture(),
72
+ registry,
73
+ generateId: createSeededIdGenerator(3),
74
+ validationDelayMs: null,
75
+ });
76
+ store.select('box0000001');
77
+ const View = () => {
78
+ const node = useEditorState((state) => state.doc.nodes['box0000001']);
79
+ if (node === undefined)
80
+ return null;
81
+ return _jsx(StyleInspector, { node: node, ...(breakpoint !== undefined ? { breakpoint } : {}) });
82
+ };
83
+ await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(ManifestProvider, { manifest: manifest, children: _jsx(EditorStoreProvider, { store: store, children: _jsx(View, {}) }) }) })));
84
+ return store;
85
+ }
86
+ const styles = (store) => store.getState().doc.nodes['box0000001']?.styles;
87
+ const inputAt = (path) => container.querySelector(`[data-path="${path}"] input`);
88
+ const type = (element, value) => act(async () => {
89
+ Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(element, value);
90
+ element.dispatchEvent(new Event('input', { bubbles: true }));
91
+ });
92
+ describe('checkStyleInput', () => {
93
+ const gap = getStyleProperty('layout', 'gap');
94
+ const opacity = getStyleProperty('effects', 'opacity');
95
+ it('accepts tokens the theme has and lengths', () => {
96
+ if (gap === undefined)
97
+ throw new Error('no gap');
98
+ expect(checkStyleInput(gap, '$space.4', defaultTheme)).toEqual({ ok: true, value: '$space.4' });
99
+ expect(checkStyleInput(gap, '12px', defaultTheme)).toEqual({ ok: true, value: '12px' });
100
+ });
101
+ it('rejects a token the theme lacks and values outside the grammar', () => {
102
+ if (gap === undefined)
103
+ throw new Error('no gap');
104
+ expect(checkStyleInput(gap, '$space.99', defaultTheme).ok).toBe(false);
105
+ for (const bad of ['url(x)', 'calc(1px + 2px)', '1px; color: red', '12qq']) {
106
+ expect(checkStyleInput(gap, bad, defaultTheme).ok).toBe(false);
107
+ }
108
+ });
109
+ it('turns numeric text into a number where the grammar takes one', () => {
110
+ if (opacity === undefined)
111
+ throw new Error('no opacity');
112
+ expect(checkStyleInput(opacity, '0.5', defaultTheme)).toEqual({ ok: true, value: 0.5 });
113
+ expect(checkStyleInput(opacity, '3', defaultTheme).ok).toBe(false);
114
+ });
115
+ });
116
+ describe('StyleInspector', () => {
117
+ it('shows only the groups the component allows', async () => {
118
+ await mount();
119
+ const groups = [...container.querySelectorAll('[data-group]')].map((g) => g.getAttribute('data-group'));
120
+ expect(groups).toEqual(['layout', 'spacing', 'visibility']);
121
+ });
122
+ it('writes to desktop with no breakpoint', async () => {
123
+ const store = await mount();
124
+ await type(inputAt('layout.gap'), '2rem');
125
+ expect(styles(store)?.base?.layout?.gap).toBe('2rem');
126
+ });
127
+ it('writes to the breakpoint being edited', async () => {
128
+ const store = await mount('mobile');
129
+ await type(inputAt('layout.gap'), '8px');
130
+ expect(styles(store)?.bp?.['mobile']?.layout?.gap).toBe('8px');
131
+ expect(styles(store)?.base?.layout?.gap).toBe('$space.4');
132
+ });
133
+ it('shows a value from a wider breakpoint as inherited', async () => {
134
+ await mount('mobile');
135
+ const field = container.querySelector('[data-path="layout.gap"]');
136
+ expect(field.textContent).toContain('from desktop');
137
+ const pressed = container.querySelector('[data-style-prop="layout.display"] [aria-pressed=true]');
138
+ expect(pressed?.textContent).toBe('grid');
139
+ });
140
+ it('does not save a value outside the grammar and says why', async () => {
141
+ const store = await mount();
142
+ await type(inputAt('layout.gap'), 'url(x)');
143
+ expect(styles(store)?.base?.layout?.gap).toBe('$space.4');
144
+ expect(container.querySelector('[role=alert]')).not.toBeNull();
145
+ expect(inputAt('layout.gap').getAttribute('aria-invalid')).toBe('true');
146
+ });
147
+ it('resets only the layer being edited', async () => {
148
+ const store = await mount('tablet');
149
+ const reset = container.querySelector('[data-style-prop="layout.display"] button');
150
+ await act(async () => reset.click());
151
+ expect(styles(store)?.bp?.['tablet']?.layout?.display).toBeUndefined();
152
+ expect(styles(store)?.base?.layout?.gap).toBe('$space.4');
153
+ });
154
+ it('edits one side of a box property', async () => {
155
+ const store = await mount();
156
+ await type(inputAt('spacing.margin.top'), '$space.2');
157
+ expect(styles(store)?.base?.spacing?.margin?.top).toBe('$space.2');
158
+ });
159
+ it('toggles hiding per breakpoint', async () => {
160
+ const store = await mount('mobile');
161
+ const check = container.querySelector('[data-style-prop="visibility.hidden"] input');
162
+ await act(async () => check.click());
163
+ expect(styles(store)?.bp?.['mobile']?.visibility?.hidden).toBe(true);
164
+ });
165
+ it('refuses an unknown breakpoint', async () => {
166
+ await mount('watch');
167
+ expect(container.textContent).toContain('not in the theme');
168
+ expect(inputAt('layout.gap').disabled).toBe(true);
169
+ });
170
+ });
171
+ const press = (element, key, init = {}) => act(async () => {
172
+ element.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true, ...init }));
173
+ });
174
+ const buttonNamed = (name) => [...container.querySelectorAll('button')].find((b) => b.getAttribute('aria-label') === name || b.textContent === name);
175
+ describe('style inspector controls (PB-128)', () => {
176
+ it('steps a number with the arrow keys, Shift takes ten, and one undo undoes the run', async () => {
177
+ const store = await mount();
178
+ const input = inputAt('layout.gap');
179
+ await type(input, '10px');
180
+ await press(input, 'ArrowUp');
181
+ expect(styles(store)?.base?.layout?.gap).toBe('11px');
182
+ await press(input, 'ArrowUp', { shiftKey: true });
183
+ expect(styles(store)?.base?.layout?.gap).toBe('21px');
184
+ await press(input, 'ArrowDown');
185
+ expect(styles(store)?.base?.layout?.gap).toBe('20px');
186
+ await act(async () => {
187
+ store.undo();
188
+ });
189
+ expect(styles(store)?.base?.layout?.gap).toBe('$space.4');
190
+ });
191
+ it('offers only the units of the grammar and keeps the number when the unit changes', async () => {
192
+ await mount();
193
+ await type(inputAt('layout.gap'), '10px');
194
+ const menu = container.querySelector('[data-path="layout.gap"] select.bd-unit-select');
195
+ expect(menu.getAttribute('aria-label')).toContain('Unit');
196
+ expect(menu.value).toBe('px');
197
+ expect(inputAt('layout.gap').value).toBe('10');
198
+ });
199
+ it('never steps to a value outside the grammar', async () => {
200
+ const store = await mount();
201
+ const input = inputAt('layout.gap');
202
+ await type(input, 'auto');
203
+ await press(input, 'ArrowUp');
204
+ expect(input.value).toBe('auto');
205
+ expect(styles(store)?.base?.layout?.gap).toBe('$space.4');
206
+ });
207
+ it('moves linked sides together as one undo step', async () => {
208
+ const store = await mount();
209
+ await type(inputAt('spacing.margin.left'), '12px');
210
+ const margin = styles(store)?.base?.spacing?.margin;
211
+ expect(margin).toEqual({ top: '12px', right: '12px', bottom: '12px', left: '12px' });
212
+ await act(async () => {
213
+ store.undo();
214
+ });
215
+ expect(styles(store)?.base?.spacing?.margin?.left).toBeUndefined();
216
+ expect(styles(store)?.base?.spacing?.margin?.right).toBeUndefined();
217
+ });
218
+ it('writes only one side once the sides are unlinked', async () => {
219
+ const store = await mount();
220
+ await act(async () => buttonNamed('Padding: Link sides').click());
221
+ await type(inputAt('spacing.padding.bottom'), '$space.2');
222
+ expect(styles(store)?.base?.spacing?.padding).toEqual({ bottom: '$space.2' });
223
+ });
224
+ it('writes the same command as typing when a segment is pressed, and unsets on a second press', async () => {
225
+ const store = await mount();
226
+ await act(async () => buttonNamed('column').click());
227
+ expect(styles(store)?.base?.layout?.direction).toBe('column');
228
+ const group = container.querySelector('[data-style-prop="layout.direction"] fieldset');
229
+ expect(group?.querySelector('[aria-pressed=true]')?.getAttribute('aria-label')).toBe('column');
230
+ await act(async () => buttonNamed('column').click());
231
+ expect(styles(store)?.base?.layout?.direction).toBeUndefined();
232
+ });
233
+ it('keeps keywords without a segment reachable through the other-values menu', async () => {
234
+ const store = await mount();
235
+ const select = container.querySelector('[data-style-prop="layout.justify"] select');
236
+ expect([...select.options].map((o) => o.value)).toContain('space-evenly');
237
+ await act(async () => {
238
+ select.value = 'space-evenly';
239
+ select.dispatchEvent(new Event('change', { bubbles: true }));
240
+ });
241
+ expect(styles(store)?.base?.layout?.justify).toBe('space-evenly');
242
+ });
243
+ it('marks where a value comes from', async () => {
244
+ await mount('mobile');
245
+ const origin = (path) => container.querySelector(`[data-style-prop="${path}"]`)?.getAttribute('data-origin');
246
+ expect(origin('layout.gap')).toBe('inherited');
247
+ expect(origin('layout.rowGap')).toBe('default');
248
+ await mount('tablet');
249
+ expect(origin('layout.display')).toBe('set');
250
+ const dot = container.querySelector('[data-style-prop="layout.display"] .bd-source-dot');
251
+ expect(dot?.getAttribute('aria-label')).toBe('Set on this breakpoint');
252
+ });
253
+ it('picks a token from the picker, which writes the token reference', async () => {
254
+ const store = await mount();
255
+ await act(async () => buttonNamed('Tokens: Gap').click());
256
+ const token = [...document.querySelectorAll('.bd-token')].find((b) => b.textContent?.startsWith('2'));
257
+ expect(token).toBeDefined();
258
+ await act(async () => token?.click());
259
+ expect(styles(store)?.base?.layout?.gap).toBe('$space.2');
260
+ });
261
+ it('has no accessibility violations', async () => {
262
+ await mount();
263
+ expect(await axe(container)).toHaveNoViolations();
264
+ });
265
+ });
@@ -0,0 +1,15 @@
1
+ import type { StylePropertyDef, Theme } from '@next-buildr/core';
2
+ /**
3
+ * The theme's tokens for a property, each with what it stands for: a swatch for a colour, the
4
+ * value for a length or a font. Choosing one writes its `$scale.name` reference, exactly as typing
5
+ * it would.
6
+ */
7
+ export declare function TokenPicker(props: {
8
+ readonly def: StylePropertyDef;
9
+ readonly theme: Theme;
10
+ readonly label: string;
11
+ readonly current: string | undefined;
12
+ readonly disabled: boolean;
13
+ readonly onPick: (ref: string) => void;
14
+ }): import("react").JSX.Element | null;
15
+ //# sourceMappingURL=token-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-picker.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/token-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAMjE;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,sCA2CA"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useT } from '../../../messages/index.js';
4
+ import { Button, ColorSwatch, Icon, Popover } from '../../../ui/index.js';
5
+ import { tokenEntries } from './model.js';
6
+ /**
7
+ * The theme's tokens for a property, each with what it stands for: a swatch for a colour, the
8
+ * value for a length or a font. Choosing one writes its `$scale.name` reference, exactly as typing
9
+ * it would.
10
+ */
11
+ export function TokenPicker(props) {
12
+ const t = useT();
13
+ const [open, setOpen] = useState(false);
14
+ const entries = tokenEntries(props.def, props.theme);
15
+ if (entries.length === 0)
16
+ return null;
17
+ const isColor = props.def.grammar.kind === 'color';
18
+ const pick = (entry) => {
19
+ props.onPick(entry.ref);
20
+ setOpen(false);
21
+ };
22
+ return (_jsx(Popover, { open: open, onOpenChange: setOpen, trigger: _jsx(Button, { variant: "ghost", className: "bd-icon-button bd-token-trigger", disabled: props.disabled, "aria-label": `${t('style.tokens')}: ${props.label}`, children: _jsx(Icon, { name: "chevron-down" }) }), children: _jsx("ul", { className: "bd-token-list", "aria-label": `${t('style.tokens')}: ${props.label}`, children: entries.map((entry) => (_jsx("li", { children: _jsxs("button", { type: "button", className: "bd-token", "aria-pressed": props.current === entry.ref, onClick: () => pick(entry), children: [isColor ? _jsx(ColorSwatch, { color: entry.value }) : null, _jsx("span", { className: "bd-token-name", children: entry.name }), isColor ? null : _jsx("span", { className: "bd-token-value", children: entry.value })] }) }, entry.ref))) }) }));
23
+ }
@@ -0,0 +1,28 @@
1
+ import type { EffectiveStyles, StylePropertyDef, Theme } from '@next-buildr/core';
2
+ export interface StyleValueOptions {
3
+ readonly def: StylePropertyDef;
4
+ readonly path: string;
5
+ readonly effective: EffectiveStyles;
6
+ readonly layer: string;
7
+ readonly theme: Theme;
8
+ readonly onSet: (value: string | number) => void;
9
+ readonly onUnset: () => void;
10
+ }
11
+ /**
12
+ * The state of one style value being edited: what is typed (a draft until the field is left), the
13
+ * stored value at the layer being edited, and the message when the text is outside the grammar.
14
+ * Text is only handed to `onSet` after `checkStyleInput` accepted it, so nothing the grammar
15
+ * refuses can be dispatched.
16
+ */
17
+ export declare function useStyleValue({ def, path, effective, layer, theme, onSet, onUnset, }: StyleValueOptions): {
18
+ current: import("@next-buildr/core").EffectiveValue | undefined;
19
+ stored: string;
20
+ shown: string;
21
+ error: string;
22
+ change: (text: string) => void;
23
+ pick: (ref: string) => void;
24
+ blur: () => void;
25
+ /** The value is inherited from a wider breakpoint rather than set at this layer. */
26
+ inherited: boolean;
27
+ };
28
+ //# sourceMappingURL=use-style-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-style-value.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/use-style-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAIlF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,IAAI,EACJ,SAAS,EACT,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,GACR,EAAE,iBAAiB;;;;;mBAOI,MAAM;gBAeT,MAAM;;IAkBvB,oFAAoF;;EAGvF"}
@@ -0,0 +1,51 @@
1
+ import { useState } from 'react';
2
+ import { checkStyleInput } from './model.js';
3
+ /**
4
+ * The state of one style value being edited: what is typed (a draft until the field is left), the
5
+ * stored value at the layer being edited, and the message when the text is outside the grammar.
6
+ * Text is only handed to `onSet` after `checkStyleInput` accepted it, so nothing the grammar
7
+ * refuses can be dispatched.
8
+ */
9
+ export function useStyleValue({ def, path, effective, layer, theme, onSet, onUnset, }) {
10
+ const current = Object.hasOwn(effective, path) ? effective[path] : undefined;
11
+ const [draft, setDraft] = useState(undefined);
12
+ const [error, setError] = useState('');
13
+ const stored = current !== undefined ? String(current.value) : '';
14
+ const shown = draft ?? stored;
15
+ const change = (text) => {
16
+ setDraft(text);
17
+ if (text.trim() === '') {
18
+ setError('');
19
+ if (current?.source === layer)
20
+ onUnset();
21
+ return;
22
+ }
23
+ const checked = checkStyleInput(def, text, theme);
24
+ if (!checked.ok) {
25
+ setError(checked.message);
26
+ return;
27
+ }
28
+ setError('');
29
+ onSet(checked.value);
30
+ };
31
+ const pick = (ref) => {
32
+ setDraft(undefined);
33
+ setError('');
34
+ onSet(ref);
35
+ };
36
+ const blur = () => {
37
+ setDraft(undefined);
38
+ setError('');
39
+ };
40
+ return {
41
+ current,
42
+ stored,
43
+ shown,
44
+ error,
45
+ change,
46
+ pick,
47
+ blur,
48
+ /** The value is inherited from a wider breakpoint rather than set at this layer. */
49
+ inherited: current !== undefined && current.source !== layer,
50
+ };
51
+ }
@@ -0,0 +1,20 @@
1
+ import type { PageNode, PropDef } from '@next-buildr/core';
2
+ /** What the inspector shows for one prop of one node. */
3
+ export interface PropReading {
4
+ /** `static` is editable here; a binding or a formula is shown as a chip (PB-081 edits them). */
5
+ readonly mode: 'static' | 'binding' | 'expression';
6
+ /** The value to show: the node's own, else the default. */
7
+ readonly value: unknown;
8
+ /** The node carries a value for this prop (in this language), so there is something to reset. */
9
+ readonly isSet: boolean;
10
+ /** For a binding the path, for a formula its source. */
11
+ readonly source: string | undefined;
12
+ }
13
+ /**
14
+ * Reads `prop` off `node`. In a language other than the default a localizable prop shows that
15
+ * language's translation, falling back to the default-language value (the fallback the renderer uses).
16
+ */
17
+ export declare function readProp(node: PageNode, prop: string, def: PropDef, locale: string | undefined, defaultLocale: string | undefined): PropReading;
18
+ /** The language edits are written to, or `undefined` for the default language (and for props that are not translated). */
19
+ export declare function translationLocale(def: PropDef, locale: string | undefined, defaultLocale: string | undefined): string | undefined;
20
+ //# sourceMappingURL=value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../../../src/panels/inspector/value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAS,MAAM,mBAAmB,CAAC;AAElE,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IACnD,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,WAAW,CAwBb;AAED,0HAA0H;AAC1H,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAEpB"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Reads `prop` off `node`. In a language other than the default a localizable prop shows that
3
+ * language's translation, falling back to the default-language value (the fallback the renderer uses).
4
+ */
5
+ export function readProp(node, prop, def, locale, defaultLocale) {
6
+ const raw = node.props !== undefined && Object.hasOwn(node.props, prop) ? node.props[prop] : undefined;
7
+ if (raw === undefined)
8
+ return { mode: 'static', value: def.default, isSet: false, source: undefined };
9
+ const value = raw;
10
+ if (value.kind === 'binding') {
11
+ return { mode: 'binding', value: def.default, isSet: true, source: value.path };
12
+ }
13
+ if (value.kind === 'expression') {
14
+ return { mode: 'expression', value: def.default, isSet: true, source: value.expr };
15
+ }
16
+ const translated = translationLocale(def, locale, defaultLocale);
17
+ if (translated !== undefined) {
18
+ const l10n = value.l10n;
19
+ const has = l10n !== undefined && Object.hasOwn(l10n, translated);
20
+ return {
21
+ mode: 'static',
22
+ value: has ? l10n[translated] : value.value,
23
+ isSet: has,
24
+ source: undefined,
25
+ };
26
+ }
27
+ return { mode: 'static', value: value.value, isSet: true, source: undefined };
28
+ }
29
+ /** The language edits are written to, or `undefined` for the default language (and for props that are not translated). */
30
+ export function translationLocale(def, locale, defaultLocale) {
31
+ return def.localizable && locale !== undefined && locale !== defaultLocale ? locale : undefined;
32
+ }
@@ -0,0 +1,49 @@
1
+ import { type DataContext, type DataSchema, type DataTypeTag, type Diagnostic, type FormatSpec, type Value } from '@next-buildr/core';
2
+ /** How a formula is read: an expression, or free text with `{{ }}` segments. */
3
+ export type FormulaMode = 'formula' | 'template';
4
+ /** A field the binding picker offers. */
5
+ export interface BindingOption {
6
+ readonly path: string;
7
+ /** What the field resolves to (`string`, `date`, ...). */
8
+ readonly tag: DataTypeTag;
9
+ readonly label: string | undefined;
10
+ }
11
+ /** The fields of the data schema a prop can take, in schema order. Empty without a schema. */
12
+ export declare function bindingOptions(schema: DataSchema | undefined, accepts: readonly DataTypeTag[]): BindingOption[];
13
+ /** Whether a binding path is fine, and if not, why. `unchecked` when there is no schema to check against. */
14
+ export type BindingStatus = 'ok' | 'missing' | 'type' | 'unchecked';
15
+ export declare function checkBinding(schema: DataSchema | undefined, path: string, accepts: readonly DataTypeTag[]): BindingStatus;
16
+ export interface FormulaCheck {
17
+ /** Every problem, tagged with the span (`details.start` / `details.end`) it concerns. */
18
+ readonly diagnostics: readonly Diagnostic[];
19
+ /** No error (a warning does not stop a formula from being saved). */
20
+ readonly valid: boolean;
21
+ }
22
+ /**
23
+ * Parses and typechecks a formula against the schema and the prop's `accepts`, without running it.
24
+ * An empty source is invalid (there is nothing to save).
25
+ */
26
+ export declare function checkFormula(source: string, mode: FormulaMode, schema: DataSchema | undefined, accepts: readonly DataTypeTag[]): FormulaCheck;
27
+ /** The `[start, end)` a diagnostic points at in the source, when it says. */
28
+ export declare function spanOf(diagnostic: Diagnostic): {
29
+ readonly start: number;
30
+ readonly end: number;
31
+ } | undefined;
32
+ export interface Preview {
33
+ /** The value as text, `undefined` when there is nothing to show. */
34
+ readonly text: string | undefined;
35
+ readonly diagnostics: readonly Diagnostic[];
36
+ }
37
+ /**
38
+ * What a binding or formula gives against sample data: the resolved value, formatted when a format
39
+ * is set. Never throws; a problem is a diagnostic and the text stays `undefined` (or the fallback).
40
+ */
41
+ export declare function previewValue(value: Value, context: DataContext | undefined): Preview;
42
+ /** The format families the picker offers; `none` writes no format. */
43
+ export type FormatKind = 'none' | FormatSpec['type'];
44
+ export declare const FORMAT_KINDS: readonly FormatKind[];
45
+ /** A fresh format of a kind, with the defaults the controls start from; `undefined` for `none`. */
46
+ export declare function defaultFormat(kind: FormatKind): FormatSpec | undefined;
47
+ /** Whether a format applies to a field of this type (a date format on a date, and so on). */
48
+ export declare function formatKindsFor(tag: DataTypeTag | undefined): readonly FormatKind[];
49
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/values/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EAOf,KAAK,KAAK,EACX,MAAM,mBAAmB,CAAC;AAE3B,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjD,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,8FAA8F;AAC9F,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,aAAa,EAAE,CAUjB;AAED,6GAA6G;AAC7G,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpE,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,aAAa,CAKf;AAED,MAAM,WAAW,YAAY;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,YAAY,CAcd;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CACpB,UAAU,EAAE,UAAU,GACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI9D;AAED,MAAM,WAAW,OAAO;IACtB,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAOD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAuBpF;AAED,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAmD,CAAC;AAElG,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAatE;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,UAAU,EAAE,CAelF"}
@@ -0,0 +1,115 @@
1
+ import { compileExpression, compileTemplate, formatValue, listPaths, resolveBinding, schemaAtPath, typecheck, } from '@next-buildr/core';
2
+ /** The fields of the data schema a prop can take, in schema order. Empty without a schema. */
3
+ export function bindingOptions(schema, accepts) {
4
+ if (schema === undefined || accepts.length === 0)
5
+ return [];
6
+ const paths = listPaths(schema, (type) => accepts.includes(type.t));
7
+ const options = [];
8
+ for (const path of paths) {
9
+ const field = schemaAtPath(schema, path);
10
+ if (field === undefined)
11
+ continue;
12
+ options.push({ path, tag: field.type.t, label: field.label });
13
+ }
14
+ return options;
15
+ }
16
+ export function checkBinding(schema, path, accepts) {
17
+ if (schema === undefined)
18
+ return 'unchecked';
19
+ const field = schemaAtPath(schema, path);
20
+ if (field === undefined)
21
+ return 'missing';
22
+ return accepts.includes(field.type.t) ? 'ok' : 'type';
23
+ }
24
+ /**
25
+ * Parses and typechecks a formula against the schema and the prop's `accepts`, without running it.
26
+ * An empty source is invalid (there is nothing to save).
27
+ */
28
+ export function checkFormula(source, mode, schema, accepts) {
29
+ if (source.trim() === '') {
30
+ return {
31
+ valid: false,
32
+ diagnostics: [{ code: 'expr.empty', message: 'The formula is empty.', severity: 'error' }],
33
+ };
34
+ }
35
+ const compiled = mode === 'template' ? compileTemplate(source) : compileExpression(source);
36
+ if (!compiled.ok)
37
+ return { valid: false, diagnostics: [compiled.error] };
38
+ const checked = typecheck(compiled.value.ast, schema, mode === 'formula' ? { accepts } : {});
39
+ return {
40
+ diagnostics: checked.diagnostics,
41
+ valid: !checked.diagnostics.some((diagnostic) => diagnostic.severity === 'error'),
42
+ };
43
+ }
44
+ /** The `[start, end)` a diagnostic points at in the source, when it says. */
45
+ export function spanOf(diagnostic) {
46
+ const start = diagnostic.details?.['start'];
47
+ const end = diagnostic.details?.['end'];
48
+ return typeof start === 'number' && typeof end === 'number' ? { start, end } : undefined;
49
+ }
50
+ const show = (value) => {
51
+ if (value === undefined || value === null)
52
+ return undefined;
53
+ return typeof value === 'string' ? value : JSON.stringify(value);
54
+ };
55
+ /**
56
+ * What a binding or formula gives against sample data: the resolved value, formatted when a format
57
+ * is set. Never throws; a problem is a diagnostic and the text stays `undefined` (or the fallback).
58
+ */
59
+ export function previewValue(value, context) {
60
+ if (context === undefined || value.kind === 'static')
61
+ return { text: undefined, diagnostics: [] };
62
+ if (value.kind === 'binding') {
63
+ const resolved = resolveBinding(value, context);
64
+ if (resolved.value === undefined) {
65
+ return { text: undefined, diagnostics: resolved.diagnostics };
66
+ }
67
+ if (value.format === undefined) {
68
+ return { text: show(resolved.value), diagnostics: resolved.diagnostics };
69
+ }
70
+ const formatted = formatValue(resolved.value, value.format, context);
71
+ return formatted.ok
72
+ ? { text: formatted.value, diagnostics: resolved.diagnostics }
73
+ : { text: show(resolved.value), diagnostics: [...resolved.diagnostics, formatted.error] };
74
+ }
75
+ const compiled = value.mode === 'template' ? compileTemplate(value.expr) : compileExpression(value.expr);
76
+ if (!compiled.ok)
77
+ return { text: show(value.fallback), diagnostics: [compiled.error] };
78
+ const result = compiled.value.evaluate(context);
79
+ return result.ok
80
+ ? { text: show(result.value), diagnostics: [] }
81
+ : { text: show(value.fallback), diagnostics: [result.error] };
82
+ }
83
+ export const FORMAT_KINDS = ['none', 'date', 'number', 'currency', 'text'];
84
+ /** A fresh format of a kind, with the defaults the controls start from; `undefined` for `none`. */
85
+ export function defaultFormat(kind) {
86
+ switch (kind) {
87
+ case 'none':
88
+ return undefined;
89
+ case 'date':
90
+ return { type: 'date', style: 'medium' };
91
+ case 'number':
92
+ return { type: 'number' };
93
+ case 'currency':
94
+ return { type: 'currency', currency: 'USD' };
95
+ case 'text':
96
+ return { type: 'text' };
97
+ }
98
+ }
99
+ /** Whether a format applies to a field of this type (a date format on a date, and so on). */
100
+ export function formatKindsFor(tag) {
101
+ switch (tag) {
102
+ case 'date':
103
+ return ['none', 'date'];
104
+ case 'number':
105
+ return ['none', 'number', 'currency'];
106
+ case 'string':
107
+ case 'enum':
108
+ case 'url':
109
+ return ['none', 'text'];
110
+ case undefined:
111
+ return FORMAT_KINDS;
112
+ default:
113
+ return ['none'];
114
+ }
115
+ }
@@ -0,0 +1,18 @@
1
+ import type { DataContext, DataSchema } from '@next-buildr/core';
2
+ import { type ReactNode } from 'react';
3
+ interface InspectorData {
4
+ /** The shape of the data a binding can read; without it paths are typed by hand and not checked. */
5
+ readonly schema: DataSchema | undefined;
6
+ /** Sample data for the live preview (PB-090 lets the author pick it); without it there is no preview. */
7
+ readonly context: DataContext | undefined;
8
+ }
9
+ export interface InspectorDataProviderProps {
10
+ readonly schema?: DataSchema | undefined;
11
+ readonly context?: DataContext | undefined;
12
+ readonly children: ReactNode;
13
+ }
14
+ /** What the value editors of the inspector know about the data: its schema and a sample of it. */
15
+ export declare function InspectorDataProvider({ schema, context, children }: InspectorDataProviderProps): import("react").JSX.Element;
16
+ export declare const useInspectorData: () => InspectorData;
17
+ export {};
18
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/values/data.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAiB,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAE3E,UAAU,aAAa;IACrB,oGAAoG;IACpG,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,yGAAyG;IACzG,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAKD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,0BAA0B,+BAG9F;AAED,eAAO,MAAM,gBAAgB,QAAO,aAAoC,CAAC"}