@cratis/scene.components 0.1.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 (539) hide show
  1. package/.storybook/main.ts +55 -0
  2. package/.storybook/preview.tsx +36 -0
  3. package/CratisComponents.stories.tsx +235 -0
  4. package/README.md +192 -0
  5. package/bindings/ArcRuntimeBoundary.tsx +36 -0
  6. package/bindings/BindingKind.ts +18 -0
  7. package/bindings/BoundConstructor.ts +21 -0
  8. package/bindings/ElementBinding.ts +19 -0
  9. package/bindings/MissingBinding.tsx +34 -0
  10. package/bindings/Placeholder.tsx +42 -0
  11. package/bindings/bindingRegistry.ts +105 -0
  12. package/bindings/for_bindingRegistry/when_a_command_is_registered.ts +30 -0
  13. package/bindings/for_bindingRegistry/when_a_query_is_not_registered.ts +17 -0
  14. package/bindings/for_bindingRegistry/when_a_query_is_registered.ts +30 -0
  15. package/bindings/for_bindingRegistry/when_bindings_are_cleared.ts +29 -0
  16. package/bindings/for_resolveElementBinding/when_resolving_a_command_binding.ts +34 -0
  17. package/bindings/for_resolveElementBinding/when_resolving_a_query_binding.ts +45 -0
  18. package/bindings/index.ts +11 -0
  19. package/bindings/resolveElementBinding.ts +33 -0
  20. package/common/SceneDropdown.tsx +31 -0
  21. package/common/SceneErrorBoundary.tsx +17 -0
  22. package/common/SceneIcon.tsx +18 -0
  23. package/common/SceneTooltip.tsx +28 -0
  24. package/common/index.ts +7 -0
  25. package/cratisComponents.ts +91 -0
  26. package/cratisComponentsPackage.ts +101 -0
  27. package/data/SceneDataTable.tsx +41 -0
  28. package/data/SceneObservableDataTable.tsx +41 -0
  29. package/data/for_SceneDataTable/when_the_query_binding_is_missing.tsx +48 -0
  30. package/data/index.ts +5 -0
  31. package/dialogs/SceneBusyIndicatorDialog.tsx +29 -0
  32. package/dialogs/SceneCommandDialog.tsx +42 -0
  33. package/dialogs/SceneConfirmationDialog.tsx +23 -0
  34. package/dialogs/SceneDialog.tsx +41 -0
  35. package/dialogs/SceneStepperCommandDialog.tsx +50 -0
  36. package/dialogs/index.ts +8 -0
  37. package/dist/cjs/bindings/ArcRuntimeBoundary.js +37 -0
  38. package/dist/cjs/bindings/ArcRuntimeBoundary.js.map +1 -0
  39. package/dist/cjs/bindings/BindingKind.js +19 -0
  40. package/dist/cjs/bindings/BindingKind.js.map +1 -0
  41. package/dist/cjs/bindings/MissingBinding.js +24 -0
  42. package/dist/cjs/bindings/MissingBinding.js.map +1 -0
  43. package/dist/cjs/bindings/Placeholder.js +38 -0
  44. package/dist/cjs/bindings/Placeholder.js.map +1 -0
  45. package/dist/cjs/bindings/bindingRegistry.js +101 -0
  46. package/dist/cjs/bindings/bindingRegistry.js.map +1 -0
  47. package/dist/cjs/bindings/resolveElementBinding.js +34 -0
  48. package/dist/cjs/bindings/resolveElementBinding.js.map +1 -0
  49. package/dist/cjs/common/SceneDropdown.js +30 -0
  50. package/dist/cjs/common/SceneDropdown.js.map +1 -0
  51. package/dist/cjs/common/SceneErrorBoundary.js +20 -0
  52. package/dist/cjs/common/SceneErrorBoundary.js.map +1 -0
  53. package/dist/cjs/common/SceneIcon.js +22 -0
  54. package/dist/cjs/common/SceneIcon.js.map +1 -0
  55. package/dist/cjs/common/SceneTooltip.js +29 -0
  56. package/dist/cjs/common/SceneTooltip.js.map +1 -0
  57. package/dist/cjs/cratisComponents.js +106 -0
  58. package/dist/cjs/cratisComponents.js.map +1 -0
  59. package/dist/cjs/cratisComponentsPackage.js +105 -0
  60. package/dist/cjs/cratisComponentsPackage.js.map +1 -0
  61. package/dist/cjs/data/SceneDataTable.js +46 -0
  62. package/dist/cjs/data/SceneDataTable.js.map +1 -0
  63. package/dist/cjs/data/SceneObservableDataTable.js +44 -0
  64. package/dist/cjs/data/SceneObservableDataTable.js.map +1 -0
  65. package/dist/cjs/dialogs/SceneBusyIndicatorDialog.js +30 -0
  66. package/dist/cjs/dialogs/SceneBusyIndicatorDialog.js.map +1 -0
  67. package/dist/cjs/dialogs/SceneCommandDialog.js +47 -0
  68. package/dist/cjs/dialogs/SceneCommandDialog.js.map +1 -0
  69. package/dist/cjs/dialogs/SceneConfirmationDialog.js +25 -0
  70. package/dist/cjs/dialogs/SceneConfirmationDialog.js.map +1 -0
  71. package/dist/cjs/dialogs/SceneDialog.js +41 -0
  72. package/dist/cjs/dialogs/SceneDialog.js.map +1 -0
  73. package/dist/cjs/dialogs/SceneStepperCommandDialog.js +54 -0
  74. package/dist/cjs/dialogs/SceneStepperCommandDialog.js.map +1 -0
  75. package/dist/cjs/editors/SceneFilterPanel.js +57 -0
  76. package/dist/cjs/editors/SceneFilterPanel.js.map +1 -0
  77. package/dist/cjs/editors/SceneObjectContentEditor.js +37 -0
  78. package/dist/cjs/editors/SceneObjectContentEditor.js.map +1 -0
  79. package/dist/cjs/editors/SceneObjectNavigationalBar.js +34 -0
  80. package/dist/cjs/editors/SceneObjectNavigationalBar.js.map +1 -0
  81. package/dist/cjs/editors/SceneSchemaEditor.js +33 -0
  82. package/dist/cjs/editors/SceneSchemaEditor.js.map +1 -0
  83. package/dist/cjs/editors/SceneTimeMachine.js +32 -0
  84. package/dist/cjs/editors/SceneTimeMachine.js.map +1 -0
  85. package/dist/cjs/editors/filterDefinitions.js +59 -0
  86. package/dist/cjs/editors/filterDefinitions.js.map +1 -0
  87. package/dist/cjs/editors/timeMachineVersions.js +44 -0
  88. package/dist/cjs/editors/timeMachineVersions.js.map +1 -0
  89. package/dist/cjs/editors/useEditableCopy.js +39 -0
  90. package/dist/cjs/editors/useEditableCopy.js.map +1 -0
  91. package/dist/cjs/forms/SceneCommandForm.js +46 -0
  92. package/dist/cjs/forms/SceneCommandForm.js.map +1 -0
  93. package/dist/cjs/forms/fields/CommandFormField.js +31 -0
  94. package/dist/cjs/forms/fields/CommandFormField.js.map +1 -0
  95. package/dist/cjs/forms/fields/SceneCalendarField.js +41 -0
  96. package/dist/cjs/forms/fields/SceneCalendarField.js.map +1 -0
  97. package/dist/cjs/forms/fields/SceneCheckboxField.js +28 -0
  98. package/dist/cjs/forms/fields/SceneCheckboxField.js.map +1 -0
  99. package/dist/cjs/forms/fields/SceneChipsField.js +33 -0
  100. package/dist/cjs/forms/fields/SceneChipsField.js.map +1 -0
  101. package/dist/cjs/forms/fields/SceneColorPickerField.js +30 -0
  102. package/dist/cjs/forms/fields/SceneColorPickerField.js.map +1 -0
  103. package/dist/cjs/forms/fields/SceneDropdownField.js +35 -0
  104. package/dist/cjs/forms/fields/SceneDropdownField.js.map +1 -0
  105. package/dist/cjs/forms/fields/SceneInputTextField.js +45 -0
  106. package/dist/cjs/forms/fields/SceneInputTextField.js.map +1 -0
  107. package/dist/cjs/forms/fields/SceneMultiSelectField.js +40 -0
  108. package/dist/cjs/forms/fields/SceneMultiSelectField.js.map +1 -0
  109. package/dist/cjs/forms/fields/SceneNumberField.js +32 -0
  110. package/dist/cjs/forms/fields/SceneNumberField.js.map +1 -0
  111. package/dist/cjs/forms/fields/SceneRadioButtonField.js +35 -0
  112. package/dist/cjs/forms/fields/SceneRadioButtonField.js.map +1 -0
  113. package/dist/cjs/forms/fields/SceneRadioGroupField.js +36 -0
  114. package/dist/cjs/forms/fields/SceneRadioGroupField.js.map +1 -0
  115. package/dist/cjs/forms/fields/SceneSliderField.js +31 -0
  116. package/dist/cjs/forms/fields/SceneSliderField.js.map +1 -0
  117. package/dist/cjs/forms/fields/SceneTextAreaField.js +31 -0
  118. package/dist/cjs/forms/fields/SceneTextAreaField.js.map +1 -0
  119. package/dist/cjs/forms/fields/resolveFieldBinding.js +27 -0
  120. package/dist/cjs/forms/fields/resolveFieldBinding.js.map +1 -0
  121. package/dist/cjs/index.js +123 -0
  122. package/dist/cjs/index.js.map +1 -0
  123. package/dist/cjs/package.json +3 -0
  124. package/dist/cjs/pages/SceneDataPage.js +45 -0
  125. package/dist/cjs/pages/SceneDataPage.js.map +1 -0
  126. package/dist/cjs/pages/SceneFormElement.js +26 -0
  127. package/dist/cjs/pages/SceneFormElement.js.map +1 -0
  128. package/dist/cjs/pages/ScenePage.js +28 -0
  129. package/dist/cjs/pages/ScenePage.js.map +1 -0
  130. package/dist/cjs/properties.js +104 -0
  131. package/dist/cjs/properties.js.map +1 -0
  132. package/dist/cjs/toolbar/SceneToolbar.js +27 -0
  133. package/dist/cjs/toolbar/SceneToolbar.js.map +1 -0
  134. package/dist/cjs/toolbar/SceneToolbarButton.js +32 -0
  135. package/dist/cjs/toolbar/SceneToolbarButton.js.map +1 -0
  136. package/dist/cjs/toolbar/SceneToolbarGroup.js +27 -0
  137. package/dist/cjs/toolbar/SceneToolbarGroup.js.map +1 -0
  138. package/dist/cjs/toolbar/SceneToolbarSeparator.js +25 -0
  139. package/dist/cjs/toolbar/SceneToolbarSeparator.js.map +1 -0
  140. package/dist/esm/CratisComponents.stories.d.ts +29 -0
  141. package/dist/esm/CratisComponents.stories.d.ts.map +1 -0
  142. package/dist/esm/CratisComponents.stories.js +187 -0
  143. package/dist/esm/CratisComponents.stories.js.map +1 -0
  144. package/dist/esm/bindings/ArcRuntimeBoundary.d.ts +6 -0
  145. package/dist/esm/bindings/ArcRuntimeBoundary.d.ts.map +1 -0
  146. package/dist/esm/bindings/ArcRuntimeBoundary.js +35 -0
  147. package/dist/esm/bindings/ArcRuntimeBoundary.js.map +1 -0
  148. package/dist/esm/bindings/BindingKind.d.ts +5 -0
  149. package/dist/esm/bindings/BindingKind.d.ts.map +1 -0
  150. package/dist/esm/bindings/BindingKind.js +17 -0
  151. package/dist/esm/bindings/BindingKind.js.map +1 -0
  152. package/dist/esm/bindings/BoundConstructor.d.ts +2 -0
  153. package/dist/esm/bindings/BoundConstructor.d.ts.map +1 -0
  154. package/dist/esm/bindings/BoundConstructor.js +2 -0
  155. package/dist/esm/bindings/BoundConstructor.js.map +1 -0
  156. package/dist/esm/bindings/ElementBinding.d.ts +6 -0
  157. package/dist/esm/bindings/ElementBinding.d.ts.map +1 -0
  158. package/dist/esm/bindings/ElementBinding.js +2 -0
  159. package/dist/esm/bindings/ElementBinding.js.map +1 -0
  160. package/dist/esm/bindings/MissingBinding.d.ts +9 -0
  161. package/dist/esm/bindings/MissingBinding.d.ts.map +1 -0
  162. package/dist/esm/bindings/MissingBinding.js +22 -0
  163. package/dist/esm/bindings/MissingBinding.js.map +1 -0
  164. package/dist/esm/bindings/Placeholder.d.ts +7 -0
  165. package/dist/esm/bindings/Placeholder.d.ts.map +1 -0
  166. package/dist/esm/bindings/Placeholder.js +36 -0
  167. package/dist/esm/bindings/Placeholder.js.map +1 -0
  168. package/dist/esm/bindings/bindingRegistry.d.ts +11 -0
  169. package/dist/esm/bindings/bindingRegistry.d.ts.map +1 -0
  170. package/dist/esm/bindings/bindingRegistry.js +91 -0
  171. package/dist/esm/bindings/bindingRegistry.js.map +1 -0
  172. package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.d.ts +2 -0
  173. package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.d.ts.map +1 -0
  174. package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.js +25 -0
  175. package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.js.map +1 -0
  176. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.d.ts +2 -0
  177. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.d.ts.map +1 -0
  178. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.js +12 -0
  179. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.js.map +1 -0
  180. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.d.ts +2 -0
  181. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.d.ts.map +1 -0
  182. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.js +23 -0
  183. package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.js.map +1 -0
  184. package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.d.ts +2 -0
  185. package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.d.ts.map +1 -0
  186. package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.js +18 -0
  187. package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.js.map +1 -0
  188. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.d.ts +2 -0
  189. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.d.ts.map +1 -0
  190. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.js +25 -0
  191. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.js.map +1 -0
  192. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.d.ts +2 -0
  193. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.d.ts.map +1 -0
  194. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.js +33 -0
  195. package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.js.map +1 -0
  196. package/dist/esm/bindings/index.d.ts +9 -0
  197. package/dist/esm/bindings/index.d.ts.map +1 -0
  198. package/dist/esm/bindings/index.js +9 -0
  199. package/dist/esm/bindings/index.js.map +1 -0
  200. package/dist/esm/bindings/resolveElementBinding.d.ts +5 -0
  201. package/dist/esm/bindings/resolveElementBinding.d.ts.map +1 -0
  202. package/dist/esm/bindings/resolveElementBinding.js +32 -0
  203. package/dist/esm/bindings/resolveElementBinding.js.map +1 -0
  204. package/dist/esm/common/SceneDropdown.d.ts +3 -0
  205. package/dist/esm/common/SceneDropdown.d.ts.map +1 -0
  206. package/dist/esm/common/SceneDropdown.js +28 -0
  207. package/dist/esm/common/SceneDropdown.js.map +1 -0
  208. package/dist/esm/common/SceneErrorBoundary.d.ts +3 -0
  209. package/dist/esm/common/SceneErrorBoundary.d.ts.map +1 -0
  210. package/dist/esm/common/SceneErrorBoundary.js +18 -0
  211. package/dist/esm/common/SceneErrorBoundary.js.map +1 -0
  212. package/dist/esm/common/SceneIcon.d.ts +3 -0
  213. package/dist/esm/common/SceneIcon.d.ts.map +1 -0
  214. package/dist/esm/common/SceneIcon.js +20 -0
  215. package/dist/esm/common/SceneIcon.js.map +1 -0
  216. package/dist/esm/common/SceneTooltip.d.ts +3 -0
  217. package/dist/esm/common/SceneTooltip.d.ts.map +1 -0
  218. package/dist/esm/common/SceneTooltip.js +27 -0
  219. package/dist/esm/common/SceneTooltip.js.map +1 -0
  220. package/dist/esm/common/index.d.ts +5 -0
  221. package/dist/esm/common/index.d.ts.map +1 -0
  222. package/dist/esm/common/index.js +5 -0
  223. package/dist/esm/common/index.js.map +1 -0
  224. package/dist/esm/cratisComponents.d.ts +4 -0
  225. package/dist/esm/cratisComponents.d.ts.map +1 -0
  226. package/dist/esm/cratisComponents.js +103 -0
  227. package/dist/esm/cratisComponents.js.map +1 -0
  228. package/dist/esm/cratisComponentsPackage.d.ts +5 -0
  229. package/dist/esm/cratisComponentsPackage.d.ts.map +1 -0
  230. package/dist/esm/cratisComponentsPackage.js +102 -0
  231. package/dist/esm/cratisComponentsPackage.js.map +1 -0
  232. package/dist/esm/data/SceneDataTable.d.ts +3 -0
  233. package/dist/esm/data/SceneDataTable.d.ts.map +1 -0
  234. package/dist/esm/data/SceneDataTable.js +44 -0
  235. package/dist/esm/data/SceneDataTable.js.map +1 -0
  236. package/dist/esm/data/SceneObservableDataTable.d.ts +3 -0
  237. package/dist/esm/data/SceneObservableDataTable.d.ts.map +1 -0
  238. package/dist/esm/data/SceneObservableDataTable.js +42 -0
  239. package/dist/esm/data/SceneObservableDataTable.js.map +1 -0
  240. package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.d.ts +2 -0
  241. package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.d.ts.map +1 -0
  242. package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.js +36 -0
  243. package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.js.map +1 -0
  244. package/dist/esm/data/index.d.ts +3 -0
  245. package/dist/esm/data/index.d.ts.map +1 -0
  246. package/dist/esm/data/index.js +3 -0
  247. package/dist/esm/data/index.js.map +1 -0
  248. package/dist/esm/dialogs/SceneBusyIndicatorDialog.d.ts +3 -0
  249. package/dist/esm/dialogs/SceneBusyIndicatorDialog.d.ts.map +1 -0
  250. package/dist/esm/dialogs/SceneBusyIndicatorDialog.js +28 -0
  251. package/dist/esm/dialogs/SceneBusyIndicatorDialog.js.map +1 -0
  252. package/dist/esm/dialogs/SceneCommandDialog.d.ts +3 -0
  253. package/dist/esm/dialogs/SceneCommandDialog.d.ts.map +1 -0
  254. package/dist/esm/dialogs/SceneCommandDialog.js +45 -0
  255. package/dist/esm/dialogs/SceneCommandDialog.js.map +1 -0
  256. package/dist/esm/dialogs/SceneConfirmationDialog.d.ts +2 -0
  257. package/dist/esm/dialogs/SceneConfirmationDialog.d.ts.map +1 -0
  258. package/dist/esm/dialogs/SceneConfirmationDialog.js +23 -0
  259. package/dist/esm/dialogs/SceneConfirmationDialog.js.map +1 -0
  260. package/dist/esm/dialogs/SceneDialog.d.ts +3 -0
  261. package/dist/esm/dialogs/SceneDialog.d.ts.map +1 -0
  262. package/dist/esm/dialogs/SceneDialog.js +39 -0
  263. package/dist/esm/dialogs/SceneDialog.js.map +1 -0
  264. package/dist/esm/dialogs/SceneStepperCommandDialog.d.ts +3 -0
  265. package/dist/esm/dialogs/SceneStepperCommandDialog.d.ts.map +1 -0
  266. package/dist/esm/dialogs/SceneStepperCommandDialog.js +52 -0
  267. package/dist/esm/dialogs/SceneStepperCommandDialog.js.map +1 -0
  268. package/dist/esm/dialogs/index.d.ts +6 -0
  269. package/dist/esm/dialogs/index.d.ts.map +1 -0
  270. package/dist/esm/dialogs/index.js +6 -0
  271. package/dist/esm/dialogs/index.js.map +1 -0
  272. package/dist/esm/editors/SceneFilterPanel.d.ts +3 -0
  273. package/dist/esm/editors/SceneFilterPanel.d.ts.map +1 -0
  274. package/dist/esm/editors/SceneFilterPanel.js +55 -0
  275. package/dist/esm/editors/SceneFilterPanel.js.map +1 -0
  276. package/dist/esm/editors/SceneObjectContentEditor.d.ts +3 -0
  277. package/dist/esm/editors/SceneObjectContentEditor.d.ts.map +1 -0
  278. package/dist/esm/editors/SceneObjectContentEditor.js +35 -0
  279. package/dist/esm/editors/SceneObjectContentEditor.js.map +1 -0
  280. package/dist/esm/editors/SceneObjectNavigationalBar.d.ts +3 -0
  281. package/dist/esm/editors/SceneObjectNavigationalBar.d.ts.map +1 -0
  282. package/dist/esm/editors/SceneObjectNavigationalBar.js +32 -0
  283. package/dist/esm/editors/SceneObjectNavigationalBar.js.map +1 -0
  284. package/dist/esm/editors/SceneSchemaEditor.d.ts +3 -0
  285. package/dist/esm/editors/SceneSchemaEditor.d.ts.map +1 -0
  286. package/dist/esm/editors/SceneSchemaEditor.js +31 -0
  287. package/dist/esm/editors/SceneSchemaEditor.js.map +1 -0
  288. package/dist/esm/editors/SceneTimeMachine.d.ts +3 -0
  289. package/dist/esm/editors/SceneTimeMachine.d.ts.map +1 -0
  290. package/dist/esm/editors/SceneTimeMachine.js +30 -0
  291. package/dist/esm/editors/SceneTimeMachine.js.map +1 -0
  292. package/dist/esm/editors/filterDefinitions.d.ts +3 -0
  293. package/dist/esm/editors/filterDefinitions.d.ts.map +1 -0
  294. package/dist/esm/editors/filterDefinitions.js +57 -0
  295. package/dist/esm/editors/filterDefinitions.js.map +1 -0
  296. package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.d.ts +2 -0
  297. package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.d.ts.map +1 -0
  298. package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.js +15 -0
  299. package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.js.map +1 -0
  300. package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.d.ts +2 -0
  301. package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.d.ts.map +1 -0
  302. package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.js +39 -0
  303. package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.js.map +1 -0
  304. package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.d.ts +2 -0
  305. package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.d.ts.map +1 -0
  306. package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.js +32 -0
  307. package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.js.map +1 -0
  308. package/dist/esm/editors/index.d.ts +9 -0
  309. package/dist/esm/editors/index.d.ts.map +1 -0
  310. package/dist/esm/editors/index.js +9 -0
  311. package/dist/esm/editors/index.js.map +1 -0
  312. package/dist/esm/editors/timeMachineVersions.d.ts +3 -0
  313. package/dist/esm/editors/timeMachineVersions.d.ts.map +1 -0
  314. package/dist/esm/editors/timeMachineVersions.js +42 -0
  315. package/dist/esm/editors/timeMachineVersions.js.map +1 -0
  316. package/dist/esm/editors/useEditableCopy.d.ts +2 -0
  317. package/dist/esm/editors/useEditableCopy.d.ts.map +1 -0
  318. package/dist/esm/editors/useEditableCopy.js +37 -0
  319. package/dist/esm/editors/useEditableCopy.js.map +1 -0
  320. package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.d.ts +2 -0
  321. package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.d.ts.map +1 -0
  322. package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.js +25 -0
  323. package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.js.map +1 -0
  324. package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.d.ts +2 -0
  325. package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.d.ts.map +1 -0
  326. package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.js +34 -0
  327. package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.js.map +1 -0
  328. package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.d.ts +2 -0
  329. package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.d.ts.map +1 -0
  330. package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.js +49 -0
  331. package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.js.map +1 -0
  332. package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.d.ts +2 -0
  333. package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.d.ts.map +1 -0
  334. package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.js +27 -0
  335. package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.js.map +1 -0
  336. package/dist/esm/for_properties/when_a_property_has_the_wrong_type.d.ts +2 -0
  337. package/dist/esm/for_properties/when_a_property_has_the_wrong_type.d.ts.map +1 -0
  338. package/dist/esm/for_properties/when_a_property_has_the_wrong_type.js +24 -0
  339. package/dist/esm/for_properties/when_a_property_has_the_wrong_type.js.map +1 -0
  340. package/dist/esm/for_properties/when_a_property_is_missing.d.ts +2 -0
  341. package/dist/esm/for_properties/when_a_property_is_missing.d.ts.map +1 -0
  342. package/dist/esm/for_properties/when_a_property_is_missing.js +13 -0
  343. package/dist/esm/for_properties/when_a_property_is_missing.js.map +1 -0
  344. package/dist/esm/for_properties/when_a_property_is_present.d.ts +2 -0
  345. package/dist/esm/for_properties/when_a_property_is_present.d.ts.map +1 -0
  346. package/dist/esm/for_properties/when_a_property_is_present.js +21 -0
  347. package/dist/esm/for_properties/when_a_property_is_present.js.map +1 -0
  348. package/dist/esm/forms/SceneCommandForm.d.ts +3 -0
  349. package/dist/esm/forms/SceneCommandForm.d.ts.map +1 -0
  350. package/dist/esm/forms/SceneCommandForm.js +44 -0
  351. package/dist/esm/forms/SceneCommandForm.js.map +1 -0
  352. package/dist/esm/forms/fields/CommandFormField.d.ts +9 -0
  353. package/dist/esm/forms/fields/CommandFormField.d.ts.map +1 -0
  354. package/dist/esm/forms/fields/CommandFormField.js +29 -0
  355. package/dist/esm/forms/fields/CommandFormField.js.map +1 -0
  356. package/dist/esm/forms/fields/FieldBinding.d.ts +6 -0
  357. package/dist/esm/forms/fields/FieldBinding.d.ts.map +1 -0
  358. package/dist/esm/forms/fields/FieldBinding.js +2 -0
  359. package/dist/esm/forms/fields/FieldBinding.js.map +1 -0
  360. package/dist/esm/forms/fields/SceneCalendarField.d.ts +3 -0
  361. package/dist/esm/forms/fields/SceneCalendarField.d.ts.map +1 -0
  362. package/dist/esm/forms/fields/SceneCalendarField.js +39 -0
  363. package/dist/esm/forms/fields/SceneCalendarField.js.map +1 -0
  364. package/dist/esm/forms/fields/SceneCheckboxField.d.ts +3 -0
  365. package/dist/esm/forms/fields/SceneCheckboxField.d.ts.map +1 -0
  366. package/dist/esm/forms/fields/SceneCheckboxField.js +26 -0
  367. package/dist/esm/forms/fields/SceneCheckboxField.js.map +1 -0
  368. package/dist/esm/forms/fields/SceneChipsField.d.ts +3 -0
  369. package/dist/esm/forms/fields/SceneChipsField.d.ts.map +1 -0
  370. package/dist/esm/forms/fields/SceneChipsField.js +31 -0
  371. package/dist/esm/forms/fields/SceneChipsField.js.map +1 -0
  372. package/dist/esm/forms/fields/SceneColorPickerField.d.ts +3 -0
  373. package/dist/esm/forms/fields/SceneColorPickerField.d.ts.map +1 -0
  374. package/dist/esm/forms/fields/SceneColorPickerField.js +28 -0
  375. package/dist/esm/forms/fields/SceneColorPickerField.js.map +1 -0
  376. package/dist/esm/forms/fields/SceneDropdownField.d.ts +3 -0
  377. package/dist/esm/forms/fields/SceneDropdownField.d.ts.map +1 -0
  378. package/dist/esm/forms/fields/SceneDropdownField.js +33 -0
  379. package/dist/esm/forms/fields/SceneDropdownField.js.map +1 -0
  380. package/dist/esm/forms/fields/SceneInputTextField.d.ts +3 -0
  381. package/dist/esm/forms/fields/SceneInputTextField.d.ts.map +1 -0
  382. package/dist/esm/forms/fields/SceneInputTextField.js +43 -0
  383. package/dist/esm/forms/fields/SceneInputTextField.js.map +1 -0
  384. package/dist/esm/forms/fields/SceneMultiSelectField.d.ts +3 -0
  385. package/dist/esm/forms/fields/SceneMultiSelectField.d.ts.map +1 -0
  386. package/dist/esm/forms/fields/SceneMultiSelectField.js +38 -0
  387. package/dist/esm/forms/fields/SceneMultiSelectField.js.map +1 -0
  388. package/dist/esm/forms/fields/SceneNumberField.d.ts +3 -0
  389. package/dist/esm/forms/fields/SceneNumberField.d.ts.map +1 -0
  390. package/dist/esm/forms/fields/SceneNumberField.js +30 -0
  391. package/dist/esm/forms/fields/SceneNumberField.js.map +1 -0
  392. package/dist/esm/forms/fields/SceneRadioButtonField.d.ts +3 -0
  393. package/dist/esm/forms/fields/SceneRadioButtonField.d.ts.map +1 -0
  394. package/dist/esm/forms/fields/SceneRadioButtonField.js +33 -0
  395. package/dist/esm/forms/fields/SceneRadioButtonField.js.map +1 -0
  396. package/dist/esm/forms/fields/SceneRadioGroupField.d.ts +3 -0
  397. package/dist/esm/forms/fields/SceneRadioGroupField.d.ts.map +1 -0
  398. package/dist/esm/forms/fields/SceneRadioGroupField.js +34 -0
  399. package/dist/esm/forms/fields/SceneRadioGroupField.js.map +1 -0
  400. package/dist/esm/forms/fields/SceneSliderField.d.ts +3 -0
  401. package/dist/esm/forms/fields/SceneSliderField.d.ts.map +1 -0
  402. package/dist/esm/forms/fields/SceneSliderField.js +29 -0
  403. package/dist/esm/forms/fields/SceneSliderField.js.map +1 -0
  404. package/dist/esm/forms/fields/SceneTextAreaField.d.ts +3 -0
  405. package/dist/esm/forms/fields/SceneTextAreaField.d.ts.map +1 -0
  406. package/dist/esm/forms/fields/SceneTextAreaField.js +29 -0
  407. package/dist/esm/forms/fields/SceneTextAreaField.js.map +1 -0
  408. package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.d.ts +2 -0
  409. package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.d.ts.map +1 -0
  410. package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.js +12 -0
  411. package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.js.map +1 -0
  412. package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.d.ts +2 -0
  413. package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.d.ts.map +1 -0
  414. package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js +24 -0
  415. package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js.map +1 -0
  416. package/dist/esm/forms/fields/index.d.ts +16 -0
  417. package/dist/esm/forms/fields/index.d.ts.map +1 -0
  418. package/dist/esm/forms/fields/index.js +16 -0
  419. package/dist/esm/forms/fields/index.js.map +1 -0
  420. package/dist/esm/forms/fields/resolveFieldBinding.d.ts +4 -0
  421. package/dist/esm/forms/fields/resolveFieldBinding.d.ts.map +1 -0
  422. package/dist/esm/forms/fields/resolveFieldBinding.js +25 -0
  423. package/dist/esm/forms/fields/resolveFieldBinding.js.map +1 -0
  424. package/dist/esm/forms/index.d.ts +3 -0
  425. package/dist/esm/forms/index.d.ts.map +1 -0
  426. package/dist/esm/forms/index.js +3 -0
  427. package/dist/esm/forms/index.js.map +1 -0
  428. package/dist/esm/given.d.ts +3 -0
  429. package/dist/esm/given.d.ts.map +1 -0
  430. package/dist/esm/given.js +21 -0
  431. package/dist/esm/given.js.map +1 -0
  432. package/dist/esm/index.d.ts +12 -0
  433. package/dist/esm/index.d.ts.map +1 -0
  434. package/dist/esm/index.js +51 -0
  435. package/dist/esm/index.js.map +1 -0
  436. package/dist/esm/package.json +3 -0
  437. package/dist/esm/pages/SceneDataPage.d.ts +3 -0
  438. package/dist/esm/pages/SceneDataPage.d.ts.map +1 -0
  439. package/dist/esm/pages/SceneDataPage.js +43 -0
  440. package/dist/esm/pages/SceneDataPage.js.map +1 -0
  441. package/dist/esm/pages/SceneFormElement.d.ts +3 -0
  442. package/dist/esm/pages/SceneFormElement.d.ts.map +1 -0
  443. package/dist/esm/pages/SceneFormElement.js +24 -0
  444. package/dist/esm/pages/SceneFormElement.js.map +1 -0
  445. package/dist/esm/pages/ScenePage.d.ts +3 -0
  446. package/dist/esm/pages/ScenePage.d.ts.map +1 -0
  447. package/dist/esm/pages/ScenePage.js +26 -0
  448. package/dist/esm/pages/ScenePage.js.map +1 -0
  449. package/dist/esm/pages/for_ScenePage/when_rendering_a_page.d.ts +2 -0
  450. package/dist/esm/pages/for_ScenePage/when_rendering_a_page.d.ts.map +1 -0
  451. package/dist/esm/pages/for_ScenePage/when_rendering_a_page.js +31 -0
  452. package/dist/esm/pages/for_ScenePage/when_rendering_a_page.js.map +1 -0
  453. package/dist/esm/pages/index.d.ts +4 -0
  454. package/dist/esm/pages/index.d.ts.map +1 -0
  455. package/dist/esm/pages/index.js +4 -0
  456. package/dist/esm/pages/index.js.map +1 -0
  457. package/dist/esm/properties.d.ts +9 -0
  458. package/dist/esm/properties.d.ts.map +1 -0
  459. package/dist/esm/properties.js +95 -0
  460. package/dist/esm/properties.js.map +1 -0
  461. package/dist/esm/toolbar/SceneToolbar.d.ts +3 -0
  462. package/dist/esm/toolbar/SceneToolbar.d.ts.map +1 -0
  463. package/dist/esm/toolbar/SceneToolbar.js +25 -0
  464. package/dist/esm/toolbar/SceneToolbar.js.map +1 -0
  465. package/dist/esm/toolbar/SceneToolbarButton.d.ts +3 -0
  466. package/dist/esm/toolbar/SceneToolbarButton.d.ts.map +1 -0
  467. package/dist/esm/toolbar/SceneToolbarButton.js +30 -0
  468. package/dist/esm/toolbar/SceneToolbarButton.js.map +1 -0
  469. package/dist/esm/toolbar/SceneToolbarGroup.d.ts +3 -0
  470. package/dist/esm/toolbar/SceneToolbarGroup.d.ts.map +1 -0
  471. package/dist/esm/toolbar/SceneToolbarGroup.js +25 -0
  472. package/dist/esm/toolbar/SceneToolbarGroup.js.map +1 -0
  473. package/dist/esm/toolbar/SceneToolbarSeparator.d.ts +3 -0
  474. package/dist/esm/toolbar/SceneToolbarSeparator.d.ts.map +1 -0
  475. package/dist/esm/toolbar/SceneToolbarSeparator.js +23 -0
  476. package/dist/esm/toolbar/SceneToolbarSeparator.js.map +1 -0
  477. package/dist/esm/toolbar/index.d.ts +5 -0
  478. package/dist/esm/toolbar/index.d.ts.map +1 -0
  479. package/dist/esm/toolbar/index.js +5 -0
  480. package/dist/esm/toolbar/index.js.map +1 -0
  481. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  482. package/editors/SceneFilterPanel.tsx +52 -0
  483. package/editors/SceneObjectContentEditor.tsx +36 -0
  484. package/editors/SceneObjectNavigationalBar.tsx +34 -0
  485. package/editors/SceneSchemaEditor.tsx +34 -0
  486. package/editors/SceneTimeMachine.tsx +32 -0
  487. package/editors/filterDefinitions.ts +59 -0
  488. package/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.tsx +18 -0
  489. package/editors/for_filterDefinitions/when_reading_filter_definitions.ts +49 -0
  490. package/editors/for_timeMachineVersions/when_reading_versions.ts +39 -0
  491. package/editors/index.ts +11 -0
  492. package/editors/timeMachineVersions.ts +44 -0
  493. package/editors/useEditableCopy.ts +32 -0
  494. package/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.tsx +37 -0
  495. package/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.ts +49 -0
  496. package/for_cratisComponentsPackage/when_resolving_its_dependencies.ts +68 -0
  497. package/for_cratisComponentsPackage/when_validating_the_bundle.ts +39 -0
  498. package/for_properties/when_a_property_has_the_wrong_type.ts +41 -0
  499. package/for_properties/when_a_property_is_missing.ts +26 -0
  500. package/for_properties/when_a_property_is_present.ts +36 -0
  501. package/forms/SceneCommandForm.tsx +45 -0
  502. package/forms/fields/CommandFormField.tsx +32 -0
  503. package/forms/fields/FieldBinding.ts +26 -0
  504. package/forms/fields/SceneCalendarField.tsx +41 -0
  505. package/forms/fields/SceneCheckboxField.tsx +29 -0
  506. package/forms/fields/SceneChipsField.tsx +34 -0
  507. package/forms/fields/SceneColorPickerField.tsx +31 -0
  508. package/forms/fields/SceneDropdownField.tsx +36 -0
  509. package/forms/fields/SceneInputTextField.tsx +37 -0
  510. package/forms/fields/SceneMultiSelectField.tsx +40 -0
  511. package/forms/fields/SceneNumberField.tsx +33 -0
  512. package/forms/fields/SceneRadioButtonField.tsx +37 -0
  513. package/forms/fields/SceneRadioGroupField.tsx +36 -0
  514. package/forms/fields/SceneSliderField.tsx +32 -0
  515. package/forms/fields/SceneTextAreaField.tsx +32 -0
  516. package/forms/fields/for_CommandFormField/when_the_field_names_no_property.tsx +16 -0
  517. package/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.ts +34 -0
  518. package/forms/fields/index.ts +18 -0
  519. package/forms/fields/resolveFieldBinding.ts +27 -0
  520. package/forms/index.ts +5 -0
  521. package/given.ts +33 -0
  522. package/index.ts +14 -0
  523. package/package.json +68 -0
  524. package/pages/SceneDataPage.tsx +40 -0
  525. package/pages/SceneFormElement.tsx +21 -0
  526. package/pages/ScenePage.tsx +30 -0
  527. package/pages/for_ScenePage/when_rendering_a_page.tsx +39 -0
  528. package/pages/index.ts +6 -0
  529. package/properties.ts +112 -0
  530. package/storybook-static/assets/CommandDialog-B78_eDOU.css +1 -0
  531. package/storybook-static/assets/CratisComponents-qPooLvTv.css +1 -0
  532. package/storybook-static/assets/DataPage-CroWzXsC.css +1 -0
  533. package/storybook-static/assets/iframe-DQhZBFM5.css +1 -0
  534. package/theme/sceneTokenBridge.css +72 -0
  535. package/toolbar/SceneToolbar.tsx +28 -0
  536. package/toolbar/SceneToolbarButton.tsx +31 -0
  537. package/toolbar/SceneToolbarGroup.tsx +28 -0
  538. package/toolbar/SceneToolbarSeparator.tsx +21 -0
  539. package/toolbar/index.ts +7 -0
@@ -0,0 +1,52 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useMemo, useRef, useState } from 'react';
5
+ import { FilterPanel, useFilterState } from '@cratis/components/Filter';
6
+ import { RegisteredComponentProps } from '@cratis/scene.react';
7
+ import { stringProperty } from '../properties';
8
+ import { filterDefinitions } from './filterDefinitions';
9
+
10
+ /**
11
+ * The `Cratis.Components:filterPanel` component - `FilterPanel` from `@cratis/components/Filter`.
12
+ *
13
+ * `FilterPanel` is a portal anchored to a button: it renders next to whatever opened it, which means it
14
+ * cannot be placed on a screen on its own. So this adapter is the whole control - the toggle button and
15
+ * the panel it anchors - and a screen places one element instead of having to model an anchor
16
+ * relationship the element tree has no way to express.
17
+ *
18
+ * Selection state comes from the library's own `useFilterState`, so the toggling, clearing and range
19
+ * behavior is the library's rather than a second implementation of it here.
20
+ */
21
+ export function SceneFilterPanel({ element, slots }: RegisteredComponentProps) {
22
+ const filters = useMemo(() => filterDefinitions(element.properties), [element.properties]);
23
+ const anchorRef = useRef<HTMLButtonElement>(null);
24
+ const [isOpen, setIsOpen] = useState(false);
25
+ const state = useFilterState(filters);
26
+
27
+ return (
28
+ <>
29
+ <button type='button' ref={anchorRef} data-scene-id={element.id} onClick={() => setIsOpen(open => !open)}>
30
+ {stringProperty(element.properties, 'label') ?? 'Filters'}
31
+ </button>
32
+ <FilterPanel
33
+ isOpen={isOpen}
34
+ filters={filters}
35
+ filterValues={state.filterValues}
36
+ rangeValues={state.rangeValues}
37
+ customValues={state.customValues}
38
+ searchPlaceholder={stringProperty(element.properties, 'searchPlaceholder')}
39
+ expandedFilterKey={state.expandedFilterKey}
40
+ anchorRef={anchorRef}
41
+ onClose={() => setIsOpen(false)}
42
+ onFilterToggle={state.handleToggleFilter}
43
+ onFilterClear={state.handleClearFilter}
44
+ onRangeChange={state.handleRangeChange}
45
+ onExpandedFilterChange={state.setExpandedFilterKey}
46
+ onCustomValueChange={state.handleCustomValueChange}
47
+ >
48
+ {slots.content}
49
+ </FilterPanel>
50
+ </>
51
+ );
52
+ }
@@ -0,0 +1,36 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useMemo } from 'react';
5
+ import { ObjectContentEditor } from '@cratis/components/ObjectContentEditor';
6
+ import { Json, JsonSchema } from '@cratis/components/types';
7
+ import { RegisteredComponentProps } from '@cratis/scene.react';
8
+ import { booleanProperty, objectProperty, stringProperty } from '../properties';
9
+ import { useEditableCopy } from './useEditableCopy';
10
+
11
+ /**
12
+ * The `Cratis.Components:objectContentEditor` component - `ObjectContentEditor` from
13
+ * `@cratis/components/ObjectContentEditor`.
14
+ *
15
+ * Renders an arbitrary JSON document against its schema, so nested objects and arrays are navigable and
16
+ * each value is edited with a control that matches its declared type. That is what makes it worth
17
+ * exposing to a screen at all: the alternative is a textarea full of JSON, which is not an editor.
18
+ *
19
+ * `object` and `schema` come through the property bag as plain JSON, which is exactly what they are at
20
+ * runtime - the conversions state that, since the property bag is typed as unknown values by definition.
21
+ */
22
+ export function SceneObjectContentEditor({ element }: RegisteredComponentProps) {
23
+ const declared = useMemo(() => (objectProperty(element.properties, 'object') ?? {}) as unknown as Json, [element.properties]);
24
+ const schema = useMemo(() => (objectProperty(element.properties, 'schema') ?? {}) as unknown as JsonSchema, [element.properties]);
25
+ const [object, setObject] = useEditableCopy(declared);
26
+
27
+ return (
28
+ <ObjectContentEditor
29
+ object={object}
30
+ schema={schema}
31
+ editMode={booleanProperty(element.properties, 'editMode')}
32
+ onChange={setObject}
33
+ className={stringProperty(element.properties, 'className')}
34
+ />
35
+ );
36
+ }
@@ -0,0 +1,34 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useMemo } from 'react';
5
+ import { ObjectNavigationalBar } from '@cratis/components/ObjectNavigationalBar';
6
+ import { RegisteredComponentProps } from '@cratis/scene.react';
7
+ import { stringArrayProperty, stringProperty } from '../properties';
8
+ import { useEditableCopy } from './useEditableCopy';
9
+
10
+ /**
11
+ * The `Cratis.Components:objectNavigationalBar` component - `ObjectNavigationalBar` from
12
+ * `@cratis/components/ObjectNavigationalBar`.
13
+ *
14
+ * The breadcrumb trail that says where you are inside a nested document, and lets you climb back out.
15
+ * Clicking a crumb truncates the trail to it, which is behavior the component reports rather than
16
+ * performs - so this adapter holds the trail and applies the truncation, and the bar is a working
17
+ * breadcrumb on a screen instead of a row of inert labels.
18
+ *
19
+ * The reported index is how many segments to *keep*, not the position of the crumb clicked: the bar
20
+ * prepends a `Root` crumb at index 0, so clicking the first real segment reports 1. `slice(0, index)` is
21
+ * what that means, and it is also exactly what the back arrow asks for when it reports `length - 1`.
22
+ */
23
+ export function SceneObjectNavigationalBar({ element }: RegisteredComponentProps) {
24
+ const declared = useMemo(() => stringArrayProperty(element.properties, 'navigationPath') ?? [], [element.properties]);
25
+ const [navigationPath, setNavigationPath] = useEditableCopy(declared);
26
+
27
+ return (
28
+ <ObjectNavigationalBar
29
+ navigationPath={navigationPath}
30
+ onNavigate={index => setNavigationPath(navigationPath.slice(0, index))}
31
+ className={stringProperty(element.properties, 'className')}
32
+ />
33
+ );
34
+ }
@@ -0,0 +1,34 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useMemo } from 'react';
5
+ import { SchemaEditor } from '@cratis/components/SchemaEditor';
6
+ import { JsonSchema } from '@cratis/components/types';
7
+ import { RegisteredComponentProps } from '@cratis/scene.react';
8
+ import { booleanProperty, objectProperty, stringProperty } from '../properties';
9
+ import { useEditableCopy } from './useEditableCopy';
10
+
11
+ /**
12
+ * The `Cratis.Components:schemaEditor` component - `SchemaEditor` from `@cratis/components/SchemaEditor`.
13
+ *
14
+ * Edits a JSON schema as a typed property tree rather than as text. In a Cratis application this is how
15
+ * an event type's shape is inspected and evolved, so `canEdit` and `canNotEditReason` are a pair worth
16
+ * setting together - a schema is often deliberately read-only, and saying *why* in the same place is
17
+ * what keeps that from looking like a bug.
18
+ */
19
+ export function SceneSchemaEditor({ element }: RegisteredComponentProps) {
20
+ const declared = useMemo(() => (objectProperty(element.properties, 'schema') ?? {}) as unknown as JsonSchema, [element.properties]);
21
+ const [schema, setSchema] = useEditableCopy(declared);
22
+
23
+ return (
24
+ <SchemaEditor
25
+ schema={schema}
26
+ eventTypeName={stringProperty(element.properties, 'eventTypeName')}
27
+ canEdit={booleanProperty(element.properties, 'canEdit')}
28
+ canNotEditReason={stringProperty(element.properties, 'canNotEditReason')}
29
+ editMode={booleanProperty(element.properties, 'editMode')}
30
+ onChange={setSchema}
31
+ className={stringProperty(element.properties, 'className')}
32
+ />
33
+ );
34
+ }
@@ -0,0 +1,32 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useMemo } from 'react';
5
+ import { TimeMachine } from '@cratis/components/TimeMachine';
6
+ import { RegisteredComponentProps } from '@cratis/scene.react';
7
+ import { numberProperty } from '../properties';
8
+ import { timeMachineVersions } from './timeMachineVersions';
9
+ import { useEditableCopy } from './useEditableCopy';
10
+
11
+ /**
12
+ * The `Cratis.Components:timeMachine` component - `TimeMachine` from `@cratis/components/TimeMachine`.
13
+ *
14
+ * Scrubs through successive versions of something on a timeline - which in an event-sourced application
15
+ * is the most natural way to look at anything, since every read model *has* a history rather than only a
16
+ * current value. The selected version is held here so the timeline scrubs on a screen; a host that wants
17
+ * to drive the selection renders the component itself.
18
+ */
19
+ export function SceneTimeMachine({ element }: RegisteredComponentProps) {
20
+ const versions = useMemo(() => timeMachineVersions(element.properties), [element.properties]);
21
+ const declaredIndex = numberProperty(element.properties, 'currentVersionIndex') ?? 0;
22
+ const [currentVersionIndex, setCurrentVersionIndex] = useEditableCopy(declaredIndex);
23
+
24
+ return (
25
+ <TimeMachine
26
+ versions={versions}
27
+ currentVersionIndex={currentVersionIndex}
28
+ onVersionChange={setCurrentVersionIndex}
29
+ scrollSensitivity={numberProperty(element.properties, 'scrollSensitivity')}
30
+ />
31
+ );
32
+ }
@@ -0,0 +1,59 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { FilterDefinition, FilterOption, FilterValue } from '@cratis/components/Filter';
5
+ import { booleanProperty, numberProperty, objectArrayProperty, stringProperty, unionProperty } from '../properties';
6
+
7
+ /** The value kinds a filter can be declared over. */
8
+ const filterTypes = ['string', 'number', 'date', 'custom'] as const;
9
+
10
+ /**
11
+ * Reads a `filters` property into the `FilterDefinition` list `FilterPanel` renders.
12
+ *
13
+ * A definition needs a `key` and a `label`; an entry without both is dropped, since a filter with no key
14
+ * has nothing to filter on and one with no label cannot be shown. Everything else is optional and falls
15
+ * through to the panel's own defaults.
16
+ */
17
+ export function filterDefinitions(properties: Record<string, unknown>): FilterDefinition[] {
18
+ const entries = objectArrayProperty(properties, 'filters') ?? [];
19
+
20
+ return entries
21
+ .map((entry): FilterDefinition | undefined => {
22
+ const key = stringProperty(entry, 'key');
23
+ const label = stringProperty(entry, 'label');
24
+ if (key === undefined || label === undefined) return undefined;
25
+
26
+ return {
27
+ key,
28
+ label,
29
+ type: unionProperty(entry, 'type', filterTypes),
30
+ multi: booleanProperty(entry, 'multi'),
31
+ options: filterOptions(entry),
32
+ searchable: booleanProperty(entry, 'searchable'),
33
+ searchPlaceholder: stringProperty(entry, 'searchPlaceholder'),
34
+ buckets: numberProperty(entry, 'buckets'),
35
+ };
36
+ })
37
+ .filter((definition): definition is FilterDefinition => definition !== undefined);
38
+ }
39
+
40
+ /**
41
+ * Reads one filter's selectable options. An option's `value` is what gets applied and its `key` is what
42
+ * the panel tracks selection by; `value` falls back to the key so the common case of a plain string
43
+ * choice needs only `key` and `label`.
44
+ */
45
+ function filterOptions(entry: Record<string, unknown>): FilterOption[] | undefined {
46
+ const options = objectArrayProperty(entry, 'options');
47
+ if (options === undefined) return undefined;
48
+
49
+ return options
50
+ .map((option): FilterOption | undefined => {
51
+ const key = stringProperty(option, 'key');
52
+ const label = stringProperty(option, 'label');
53
+ if (key === undefined || label === undefined) return undefined;
54
+
55
+ const value: FilterValue = stringProperty(option, 'value') ?? numberProperty(option, 'value') ?? booleanProperty(option, 'value') ?? key;
56
+ return { key, label, value, count: numberProperty(option, 'count') };
57
+ })
58
+ .filter((option): option is FilterOption => option !== undefined);
59
+ }
@@ -0,0 +1,18 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { fireEvent, render, screen } from '@testing-library/react';
5
+ import { externalComponent } from '../../given';
6
+ import { SceneObjectNavigationalBar } from '../SceneObjectNavigationalBar';
7
+
8
+ describe('when navigating back up the trail', () => {
9
+ beforeEach(() => {
10
+ const element = externalComponent('Cratis.Components:objectNavigationalBar', { navigationPath: ['shipping', 'address', 'street'] });
11
+ render(<SceneObjectNavigationalBar element={element} slots={{}} />);
12
+ fireEvent.click(screen.getByText('address'));
13
+ });
14
+
15
+ it('should keep the crumb that was clicked', () => screen.getByText('address').textContent!.should.equal('address'));
16
+ it('should keep everything above it', () => screen.getByText('shipping').textContent!.should.equal('shipping'));
17
+ it('should drop everything below it', () => (screen.queryByText('street') === null).should.be.true);
18
+ });
@@ -0,0 +1,49 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { filterDefinitions } from '../filterDefinitions';
5
+
6
+ describe('when reading filter definitions', () => {
7
+ describe('and a filter declares options', () => {
8
+ const definitions = filterDefinitions({
9
+ filters: [
10
+ {
11
+ key: 'status',
12
+ label: 'Status',
13
+ type: 'string',
14
+ multi: true,
15
+ options: [
16
+ { key: 'draft', label: 'Draft', count: 12 },
17
+ { key: 'approved', label: 'Approved', value: 'Approved' },
18
+ ],
19
+ },
20
+ ],
21
+ });
22
+
23
+ it('should read the filter', () => definitions.should.have.lengthOf(1));
24
+ it('should read the declared type', () => definitions[0].type!.should.equal('string'));
25
+ it('should read the multi flag', () => definitions[0].multi!.should.equal(true));
26
+ it('should fall back to the option key as its value', () => definitions[0].options![0].value!.should.equal('draft'));
27
+ it('should use a declared option value when there is one', () => definitions[0].options![1].value!.should.equal('Approved'));
28
+ it('should read the option count', () => definitions[0].options![0].count!.should.equal(12));
29
+ });
30
+
31
+ describe('and an entry is missing a key or a label', () => {
32
+ const definitions = filterDefinitions({
33
+ filters: [{ key: 'status', label: 'Status' }, { label: 'No key' }, { key: 'noLabel' }],
34
+ });
35
+
36
+ it('should keep only the filters that can be shown and applied', () =>
37
+ definitions.map(definition => definition.key).should.deep.equal(['status']));
38
+ });
39
+
40
+ describe('and a filter declares a type outside the allowed set', () => {
41
+ const definitions = filterDefinitions({ filters: [{ key: 'status', label: 'Status', type: 'colour' }] });
42
+
43
+ it('should leave the type unset rather than passing an unknown one through', () => (definitions[0].type === undefined).should.be.true);
44
+ });
45
+
46
+ describe('and no filters property is set', () => {
47
+ it('should read no filters', () => filterDefinitions({}).should.deep.equal([]));
48
+ });
49
+ });
@@ -0,0 +1,39 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { timeMachineVersions } from '../timeMachineVersions';
5
+
6
+ describe('when reading versions', () => {
7
+ describe('and every entry is complete', () => {
8
+ const versions = timeMachineVersions({
9
+ versions: [
10
+ { id: 'v1', label: 'Registered', timestamp: '2026-01-05T10:00:00.000Z', content: 'First' },
11
+ { id: 'v2', label: 'Approved', timestamp: 1767700800000, content: 'Second' },
12
+ ],
13
+ });
14
+
15
+ it('should read every version', () => versions.should.have.lengthOf(2));
16
+ it('should read an ISO timestamp', () => versions[0].timestamp.toISOString().should.equal('2026-01-05T10:00:00.000Z'));
17
+ it('should read an epoch timestamp', () => versions[1].timestamp.getTime().should.equal(1767700800000));
18
+ it('should read the content as text', () => versions[0].content!.should.equal('First'));
19
+ });
20
+
21
+ describe('and an entry is incomplete or unparseable', () => {
22
+ const versions = timeMachineVersions({
23
+ versions: [
24
+ { id: 'v1', label: 'Registered', timestamp: '2026-01-05T10:00:00.000Z' },
25
+ { label: 'No id', timestamp: '2026-01-05T10:00:00.000Z' },
26
+ { id: 'v3', timestamp: '2026-01-05T10:00:00.000Z' },
27
+ { id: 'v4', label: 'No timestamp' },
28
+ { id: 'v5', label: 'Unparseable', timestamp: 'the fifth of January' },
29
+ ],
30
+ });
31
+
32
+ it('should keep only the entries that can be placed on a timeline', () => versions.map(version => version.id).should.deep.equal(['v1']));
33
+ it('should default missing content to empty text', () => versions[0].content!.should.equal(''));
34
+ });
35
+
36
+ describe('and no versions property is set', () => {
37
+ it('should read no versions', () => timeMachineVersions({}).should.deep.equal([]));
38
+ });
39
+ });
@@ -0,0 +1,11 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ export * from './useEditableCopy';
5
+ export * from './timeMachineVersions';
6
+ export * from './filterDefinitions';
7
+ export * from './SceneObjectContentEditor';
8
+ export * from './SceneObjectNavigationalBar';
9
+ export * from './SceneSchemaEditor';
10
+ export * from './SceneTimeMachine';
11
+ export * from './SceneFilterPanel';
@@ -0,0 +1,44 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { Version } from '@cratis/components/TimeMachine';
5
+ import { numberProperty, objectArrayProperty, stringProperty } from '../properties';
6
+
7
+ /**
8
+ * Reads a `versions` property into the `Version` list `TimeMachine` renders.
9
+ *
10
+ * An entry without an `id`, a `label` and a parseable `timestamp` is dropped rather than defaulted,
11
+ * because `TimeMachine`'s whole job is to place versions on a timeline: a version invented at the epoch
12
+ * would not be a slightly wrong entry, it would silently reorder every real one around it. A dropped
13
+ * entry is visibly one item short; a fabricated one is a timeline that lies.
14
+ *
15
+ * `content` is rendered as text. A version whose content is a whole element tree is not something a
16
+ * property bag can carry, and pretending otherwise would be the wrong seam - that belongs in a screen
17
+ * template, not in a property.
18
+ */
19
+ export function timeMachineVersions(properties: Record<string, unknown>): Version[] {
20
+ const entries = objectArrayProperty(properties, 'versions') ?? [];
21
+
22
+ return entries
23
+ .map((entry): Version | undefined => {
24
+ const id = stringProperty(entry, 'id');
25
+ const label = stringProperty(entry, 'label');
26
+ const timestamp = timestampOf(entry);
27
+ if (id === undefined || label === undefined || timestamp === undefined) return undefined;
28
+
29
+ return { id, label, timestamp, content: stringProperty(entry, 'content') ?? '' };
30
+ })
31
+ .filter((version): version is Version => version !== undefined);
32
+ }
33
+
34
+ /**
35
+ * Reads an entry's `timestamp`, accepting both the ISO string a `.play` screen writes and the epoch
36
+ * number a serializer may produce, and rejecting anything that does not parse into a real date.
37
+ */
38
+ function timestampOf(entry: Record<string, unknown>): Date | undefined {
39
+ const value = stringProperty(entry, 'timestamp') ?? numberProperty(entry, 'timestamp');
40
+ if (value === undefined) return undefined;
41
+
42
+ const timestamp = new Date(value);
43
+ return Number.isNaN(timestamp.getTime()) ? undefined : timestamp;
44
+ }
@@ -0,0 +1,32 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useState } from 'react';
5
+
6
+ /**
7
+ * Keeps a locally editable copy of a value a screen declares, resetting it whenever the declared value
8
+ * itself changes.
9
+ *
10
+ * The editors in `@cratis/components` are controlled components: `ObjectContentEditor`, `SchemaEditor`
11
+ * and `TimeMachine` all render what they are given and report changes through a callback. A Scene screen
12
+ * can only *declare* the starting value - a property bag has no way to receive a callback - so without
13
+ * somewhere to put the result, every one of these would render as a dead surface that discards every
14
+ * keystroke. Local state is what makes them behave like the editors they are while a screen is being
15
+ * designed; a host that needs the edits for real reads them off its own model, not off the screen.
16
+ *
17
+ * The reset is deliberately done during render rather than in an effect: Studio rewrites an element's
18
+ * properties as the designer types, and an effect-based reset would show one frame of the previous
19
+ * value every time.
20
+ */
21
+ export function useEditableCopy<T>(source: T): [T, (value: T) => void] {
22
+ const [edited, setEdited] = useState(source);
23
+ const [lastSource, setLastSource] = useState(source);
24
+
25
+ if (lastSource !== source) {
26
+ setLastSource(source);
27
+ setEdited(source);
28
+ return [source, setEdited];
29
+ }
30
+
31
+ return [edited, setEdited];
32
+ }
@@ -0,0 +1,37 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { expect } from 'chai';
5
+ import { render, screen } from '@testing-library/react';
6
+ import { ExternalComponent } from '@cratis/scene.model';
7
+ import { SceneElementView } from '@cratis/scene.react';
8
+ import { externalComponent } from '../given';
9
+ import { cratisComponents } from '../cratisComponents';
10
+ import { clearBindings } from '../bindings';
11
+
12
+ function withContent(element: ExternalComponent, content: ExternalComponent[]): ExternalComponent {
13
+ return { ...element, slots: { content } };
14
+ }
15
+
16
+ const invoices = withContent(externalComponent('Cratis.Components:page', { title: 'Invoices', showTitle: true }), [
17
+ externalComponent('Cratis.Components:toolbar', {}),
18
+ externalComponent('Cratis.Components:dataTable', { query: 'AllInvoices', emptyMessage: 'No invoices' }),
19
+ ]);
20
+
21
+ describe('when rendering a screen through the real renderer', () => {
22
+ beforeEach(() => {
23
+ clearBindings();
24
+ render(<SceneElementView element={invoices} registry={cratisComponents} resolveBinding={() => undefined} />);
25
+ });
26
+
27
+ afterEach(() => clearBindings());
28
+
29
+ it('should resolve every component name against this package registry', () =>
30
+ expect(screen.getByRole('heading', { name: 'Invoices' })).to.exist);
31
+
32
+ it('should render the unbound table as a placeholder', () =>
33
+ expect(screen.getByText("Unresolved query binding 'AllInvoices' on Cratis.Components:dataTable")).to.exist);
34
+
35
+ it('should render no unresolved-component fallback', () =>
36
+ (document.querySelector('[data-scene-unresolved-component]') === null).should.be.true);
37
+ });
@@ -0,0 +1,49 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { UiProfile } from '@cratis/scene.model';
5
+ import { PackageCatalog, resolveComponentName } from '@cratis/scene.engine';
6
+ import { cratisComponentsPackageManifest } from '../cratisComponentsPackage';
7
+
8
+ const profile: UiProfile = { name: 'test', targetPlatform: 'web', packages: ['core', 'PrimeReact', 'Cratis.Components'] };
9
+
10
+ const catalog: PackageCatalog = {
11
+ core: ['text', 'button', 'card'],
12
+ PrimeReact: ['button', 'table', 'dialog'],
13
+ 'Cratis.Components': cratisComponentsPackageManifest.components,
14
+ };
15
+
16
+ describe('when a profile ranks it above the packages it layers on', () => {
17
+ describe('and it declares a name PrimeReact also declares', () => {
18
+ const resolution = resolveComponentName('table', profile, catalog)!;
19
+
20
+ it('should resolve to this package', () => resolution.package.should.equal('Cratis.Components'));
21
+ it('should record PrimeReact as shadowed rather than discarding it', () => resolution.shadows.should.deep.equal(['PrimeReact']));
22
+ });
23
+
24
+ describe('and it declares the dialog name PrimeReact also declares', () => {
25
+ const resolution = resolveComponentName('dialog', profile, catalog)!;
26
+
27
+ it('should resolve to the Arc-aware dialog rather than the bare PrimeReact one', () => resolution.package.should.equal('Cratis.Components'));
28
+ it('should record PrimeReact as shadowed', () => resolution.shadows.should.deep.equal(['PrimeReact']));
29
+ });
30
+
31
+ describe('and it declares a name nothing else does', () => {
32
+ const resolution = resolveComponentName('dataPage', profile, catalog)!;
33
+
34
+ it('should resolve to this package', () => resolution.package.should.equal('Cratis.Components'));
35
+ it('should shadow nothing', () => resolution.shadows.should.deep.equal([]));
36
+ });
37
+
38
+ describe('and a name it does not declare is asked for', () => {
39
+ const resolution = resolveComponentName('card', profile, catalog)!;
40
+
41
+ it('should fall through to the highest-priority package that does', () => resolution.package.should.equal('core'));
42
+ });
43
+
44
+ describe('and a screen qualifies the name with the package explicitly', () => {
45
+ const resolution = resolveComponentName('PrimeReact.table', profile, catalog)!;
46
+
47
+ it('should resolve to the named package even though this one outranks it', () => resolution.package.should.equal('PrimeReact'));
48
+ });
49
+ });
@@ -0,0 +1,68 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { PackageKind, ScenePackage } from '@cratis/scene.model';
5
+ import { isPackageSelectionValid, resolvePackageDependencies } from '@cratis/scene.engine';
6
+ import { cratisComponentsPackageManifest } from '../cratisComponentsPackage';
7
+
8
+ /**
9
+ * A styling package declaring nothing but itself - enough for `Cratis.Components` to depend on, and no
10
+ * more, so this spec fails only when *this* package's declaration is wrong.
11
+ */
12
+ const tailwind: ScenePackage = {
13
+ name: 'Tailwind',
14
+ version: '4.3.3',
15
+ kind: PackageKind.Styling,
16
+ dependencies: [],
17
+ components: [],
18
+ layouts: [],
19
+ screenTemplates: [],
20
+ dialogTemplates: [],
21
+ themes: [],
22
+ };
23
+
24
+ /** The base component library `Cratis.Components` wraps, at the version this repository pins. */
25
+ const primeReact: ScenePackage = {
26
+ name: 'PrimeReact',
27
+ version: '10.9.8',
28
+ kind: PackageKind.ComponentLibrary,
29
+ dependencies: [{ name: 'Tailwind' }],
30
+ components: ['button', 'table', 'dialog'],
31
+ layouts: [],
32
+ screenTemplates: [],
33
+ dialogTemplates: [],
34
+ themes: ['lara-light-blue', 'lara-dark-blue'],
35
+ };
36
+
37
+ describe('when resolving its dependencies', () => {
38
+ const catalog = [tailwind, primeReact, cratisComponentsPackageManifest];
39
+ const selection = resolvePackageDependencies(['Cratis.Components'], catalog);
40
+
41
+ it('should order every package it depends on before it', () =>
42
+ selection.packages.should.deep.equal(['Tailwind', 'PrimeReact', 'Cratis.Components']));
43
+
44
+ it('should report the packages it pulls in on the caller behalf', () => selection.added.should.deep.equal(['Tailwind', 'PrimeReact']));
45
+ it('should report nothing missing', () => selection.missing.should.deep.equal([]));
46
+ it('should report no version conflict', () => selection.versionConflicts.should.deep.equal([]));
47
+ it('should report no cycle', () => selection.cycles.should.deep.equal([]));
48
+ it('should be a valid selection', () => isPackageSelectionValid(selection).should.be.true);
49
+
50
+ describe('and neither dependency is in the catalog', () => {
51
+ const withoutDependencies = resolvePackageDependencies(['Cratis.Components'], [cratisComponentsPackageManifest]);
52
+
53
+ it('should report both as missing rather than silently ordering around them', () =>
54
+ withoutDependencies.missing.should.deep.equal([
55
+ { package: 'Cratis.Components', dependsOn: 'PrimeReact' },
56
+ { package: 'Cratis.Components', dependsOn: 'Tailwind' },
57
+ ]));
58
+ });
59
+
60
+ describe('and PrimeReact is older than the range the token layer needs', () => {
61
+ const older = resolvePackageDependencies(['Cratis.Components'], [tailwind, { ...primeReact, version: '10.8.0' }, cratisComponentsPackageManifest]);
62
+
63
+ it('should report the version conflict', () =>
64
+ older.versionConflicts.should.deep.equal([
65
+ { package: 'Cratis.Components', dependsOn: 'PrimeReact', requiredRange: '>=10.9.0', actualVersion: '10.8.0' },
66
+ ]));
67
+ });
68
+ });
@@ -0,0 +1,39 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { componentRegistryKey, validatePackageBundle } from '@cratis/scene.react';
5
+ import { cratisComponentsPackage, cratisComponentsPackageManifest } from '../cratisComponentsPackage';
6
+ import { cratisComponentsPackageName } from '../cratisComponents';
7
+
8
+ describe('when validating the bundle', () => {
9
+ const problems = validatePackageBundle(cratisComponentsPackage);
10
+
11
+ it('should report no problems', () => problems.should.deep.equal([]));
12
+
13
+ it('should register an implementation for every declared component', () => {
14
+ const missing = cratisComponentsPackageManifest.components.filter(
15
+ name => !(componentRegistryKey(cratisComponentsPackageName, name) in cratisComponentsPackage.components)
16
+ );
17
+ missing.should.deep.equal([]);
18
+ });
19
+
20
+ it('should key every registration under this package name', () => {
21
+ const foreign = Object.keys(cratisComponentsPackage.components).filter(key => !key.startsWith(`${cratisComponentsPackageName}:`));
22
+ foreign.should.deep.equal([]);
23
+ });
24
+
25
+ it('should declare every registered component', () => {
26
+ const declared = new Set(cratisComponentsPackageManifest.components);
27
+ const undeclared = Object.keys(cratisComponentsPackage.components).filter(
28
+ key => !declared.has(key.slice(`${cratisComponentsPackageName}:`.length))
29
+ );
30
+ undeclared.should.deep.equal([]);
31
+ });
32
+
33
+ it('should declare no layouts, screen templates, dialog templates or themes', () => {
34
+ cratisComponentsPackageManifest.layouts.should.deep.equal([]);
35
+ cratisComponentsPackageManifest.screenTemplates.should.deep.equal([]);
36
+ cratisComponentsPackageManifest.dialogTemplates.should.deep.equal([]);
37
+ cratisComponentsPackageManifest.themes.should.deep.equal([]);
38
+ });
39
+ });