@morscherlab/mint-sdk 1.0.0-rc.4 → 1.0.0-rc.5

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 (304) hide show
  1. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  2. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  3. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  4. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  5. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  6. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  7. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  8. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  9. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  10. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  11. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  12. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  13. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  14. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  15. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  16. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  17. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  18. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  19. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  20. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  21. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  22. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  23. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  24. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  25. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  26. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  27. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  28. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  29. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  30. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  31. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  32. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  33. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  34. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  35. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  36. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  37. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  38. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  39. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  40. package/dist/components/AppSidebar.vue.d.ts +3 -3
  41. package/dist/components/AppTopBar.navigation.d.ts +11 -0
  42. package/dist/components/BaseButton.vue.d.ts +1 -1
  43. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  44. package/dist/components/BaseInput.vue.d.ts +2 -2
  45. package/dist/components/BasePill.vue.d.ts +1 -1
  46. package/dist/components/BaseRadioGroup.vue.d.ts +1 -1
  47. package/dist/components/BaseSelect.vue.d.ts +1 -1
  48. package/dist/components/BaseSlider.vue.d.ts +2 -2
  49. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  50. package/dist/components/BaseToggle.vue.d.ts +1 -1
  51. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  52. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  53. package/dist/components/ColorSlider.vue.d.ts +2 -2
  54. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  55. package/dist/components/ControlWorkspaceView.vue.d.ts +3 -3
  56. package/dist/components/DatePicker.vue.d.ts +1 -1
  57. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  58. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  59. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +1 -1
  60. package/dist/components/DropdownButton.vue.d.ts +1 -1
  61. package/dist/components/FileUploader.vue.d.ts +2 -2
  62. package/dist/components/FormulaInput.vue.d.ts +2 -2
  63. package/dist/components/IconButton.vue.d.ts +1 -1
  64. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  65. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  66. package/dist/components/MultiSelect.vue.d.ts +1 -1
  67. package/dist/components/NumberInput.vue.d.ts +1 -1
  68. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  69. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  70. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  71. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  72. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  73. package/dist/components/PluginWorkspaceView.vue.d.ts +46 -195
  74. package/dist/components/ProgressBar.vue.d.ts +1 -1
  75. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  76. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  77. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  78. package/dist/components/ReagentList.presentation.d.ts +16 -0
  79. package/dist/components/ResourceCard.vue.d.ts +1 -1
  80. package/dist/components/SampleSelector.colors.d.ts +13 -0
  81. package/dist/components/SampleSelector.drag.d.ts +24 -0
  82. package/dist/components/SampleSelector.groups.d.ts +15 -0
  83. package/dist/components/SampleSelector.selection.d.ts +26 -0
  84. package/dist/components/SampleSelector.vue.d.ts +4 -1
  85. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  86. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  87. package/dist/components/SequenceInput.vue.d.ts +2 -2
  88. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  89. package/dist/components/SettingsModal.schema.d.ts +9 -0
  90. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  91. package/dist/components/TagsInput.vue.d.ts +2 -2
  92. package/dist/components/TimePicker.vue.d.ts +2 -2
  93. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  94. package/dist/components/UnitInput.vue.d.ts +2 -2
  95. package/dist/components/WellPlate.colors.d.ts +9 -0
  96. package/dist/components/WellPlate.conditions.d.ts +26 -0
  97. package/dist/components/WellPlate.geometry.d.ts +23 -0
  98. package/dist/components/WellPlate.interaction.d.ts +71 -0
  99. package/dist/components/WellPlate.legend.d.ts +2 -0
  100. package/dist/components/WellPlate.rendering.d.ts +24 -0
  101. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  102. package/dist/components/WellPlate.vue.d.ts +1 -1
  103. package/dist/components/index.js +2 -2
  104. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  105. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  106. package/dist/{components-DafPc4rM.js → components-DtHA2bgp.js} +3754 -2991
  107. package/dist/components-DtHA2bgp.js.map +1 -0
  108. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  109. package/dist/composables/autoGroup/classify.d.ts +28 -0
  110. package/dist/composables/autoGroup/colors.d.ts +2 -0
  111. package/dist/composables/autoGroup/columns.d.ts +10 -0
  112. package/dist/composables/autoGroup/compose.d.ts +8 -0
  113. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  114. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  115. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  116. package/dist/composables/autoGroup/index.d.ts +16 -0
  117. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  118. package/dist/composables/autoGroup/template.d.ts +15 -0
  119. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  120. package/dist/composables/autoGroupConstants.d.ts +1 -0
  121. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  122. package/dist/composables/controlComponentBindings.d.ts +1 -1
  123. package/dist/composables/controlSchemaAdapters.d.ts +1 -1
  124. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  125. package/dist/composables/controlSchemaLayout.d.ts +1 -1
  126. package/dist/composables/controlSchemaModel.d.ts +5 -0
  127. package/dist/composables/controlSchemaNormalize.d.ts +1 -1
  128. package/dist/composables/controlSchemaTypes.d.ts +305 -0
  129. package/dist/composables/controlWorkspaceOptions.d.ts +1 -1
  130. package/dist/composables/formBuilderSchema.d.ts +18 -0
  131. package/dist/composables/index.js +3 -3
  132. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  133. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  134. package/dist/composables/useAutoGroup.d.ts +61 -74
  135. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  136. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  137. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  138. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  139. package/dist/composables/useControlSchema.d.ts +4 -316
  140. package/dist/composables/useControlWorkspace.d.ts +1 -1
  141. package/dist/composables/useForm.d.ts +2 -33
  142. package/dist/composables/useFormBuilder.d.ts +2 -9
  143. package/dist/composables/useFormValidation.d.ts +34 -0
  144. package/dist/composables/usePluginClient.d.ts +1 -4
  145. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  146. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  147. package/dist/{composables-BMkPQhVK.js → composables-Dlg8jenH.js} +33 -31
  148. package/dist/composables-Dlg8jenH.js.map +1 -0
  149. package/dist/index.js +4 -4
  150. package/dist/install.js +2 -2
  151. package/dist/styles.css +547 -516
  152. package/dist/templates/controlSchemaTypes.d.ts +1 -1
  153. package/dist/templates/index.js +1 -1
  154. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  155. package/dist/templates/templateCreateOptions.d.ts +165 -0
  156. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  157. package/dist/templates/types.d.ts +5 -250
  158. package/dist/{templates-bUAWMn5L.js → templates-DtdUvJ4c.js} +144 -136
  159. package/dist/templates-DtdUvJ4c.js.map +1 -0
  160. package/dist/types/auto-group.d.ts +79 -9
  161. package/dist/types/componentLabTypes.d.ts +161 -0
  162. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  163. package/dist/types/components.d.ts +2 -311
  164. package/dist/{useProtocolTemplates-QZtHFFH2.js → useProtocolTemplates-Bm5vyH4_.js} +1220 -454
  165. package/dist/useProtocolTemplates-Bm5vyH4_.js.map +1 -0
  166. package/package.json +1 -1
  167. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  168. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  169. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  170. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  171. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  172. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +41 -0
  173. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  174. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  175. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  176. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  177. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  178. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  179. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  180. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  181. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  182. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  183. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  184. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  185. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  186. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  187. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  188. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  189. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  190. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  191. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  192. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  193. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  194. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  195. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  196. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  197. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  198. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  199. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  200. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  201. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  202. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  203. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  204. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  205. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  206. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  207. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  208. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  209. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  210. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  211. package/src/components/AppSidebar.vue +2 -6
  212. package/src/components/AppTopBar.navigation.ts +62 -0
  213. package/src/components/AppTopBar.vue +17 -44
  214. package/src/components/AutoGroupModal.story.vue +50 -0
  215. package/src/components/AutoGroupModal.vue +441 -158
  216. package/src/components/ControlWorkspaceView.vue +2 -6
  217. package/src/components/DoseCalculator.vue +13 -73
  218. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  219. package/src/components/ExperimentTimeline.vue +6 -31
  220. package/src/components/FormBuilder.vue +2 -7
  221. package/src/components/PlateMapEditor.vue +32 -106
  222. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  223. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  224. package/src/components/PluginWorkspaceView.props.ts +174 -0
  225. package/src/components/PluginWorkspaceView.shell.ts +66 -0
  226. package/src/components/PluginWorkspaceView.vue +85 -404
  227. package/src/components/ProtocolStep.presentation.ts +31 -0
  228. package/src/components/ProtocolStepEditor.state.ts +104 -0
  229. package/src/components/ProtocolStepEditor.vue +48 -179
  230. package/src/components/ProtocolStepParameterField.vue +134 -0
  231. package/src/components/ReagentList.presentation.ts +105 -0
  232. package/src/components/ReagentList.vue +16 -79
  233. package/src/components/SampleSelector.colors.ts +43 -0
  234. package/src/components/SampleSelector.drag.ts +164 -0
  235. package/src/components/SampleSelector.groups.ts +109 -0
  236. package/src/components/SampleSelector.selection.ts +103 -0
  237. package/src/components/SampleSelector.vue +82 -349
  238. package/src/components/SampleSelectorSampleRow.vue +64 -0
  239. package/src/components/ScheduleCalendar.vue +44 -199
  240. package/src/components/SettingsModal.schema.ts +71 -0
  241. package/src/components/SettingsModal.vue +16 -46
  242. package/src/components/WellPlate.colors.ts +56 -0
  243. package/src/components/WellPlate.conditions.ts +100 -0
  244. package/src/components/WellPlate.geometry.ts +91 -0
  245. package/src/components/WellPlate.interaction.ts +272 -0
  246. package/src/components/WellPlate.legend.ts +8 -0
  247. package/src/components/WellPlate.rendering.ts +105 -0
  248. package/src/components/WellPlate.sampleDrop.ts +73 -0
  249. package/src/components/WellPlate.vue +102 -550
  250. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  251. package/src/composables/autoGroup/classKey.ts +5 -0
  252. package/src/composables/autoGroup/classify.ts +205 -0
  253. package/src/composables/autoGroup/colors.ts +6 -0
  254. package/src/composables/autoGroup/columns.ts +226 -0
  255. package/src/composables/autoGroup/compose.ts +156 -0
  256. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  257. package/src/composables/autoGroup/csv-shim.ts +44 -0
  258. package/src/composables/autoGroup/fingerprint.ts +49 -0
  259. package/src/composables/autoGroup/index.ts +20 -0
  260. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  261. package/src/composables/autoGroup/template.ts +126 -0
  262. package/src/composables/autoGroup/tokenize.ts +41 -0
  263. package/src/composables/autoGroup/vocab.json +67 -0
  264. package/src/composables/autoGroupConstants.ts +4 -0
  265. package/src/composables/autoGroupGrouping.ts +148 -0
  266. package/src/composables/controlComponentBindings.ts +1 -1
  267. package/src/composables/controlSchemaAdapters.ts +1 -1
  268. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  269. package/src/composables/controlSchemaFormFields.ts +1 -1
  270. package/src/composables/controlSchemaLayout.ts +1 -1
  271. package/src/composables/controlSchemaModel.ts +163 -0
  272. package/src/composables/controlSchemaNormalize.ts +1 -1
  273. package/src/composables/controlSchemaTypes.ts +364 -0
  274. package/src/composables/controlWorkspaceOptions.ts +1 -1
  275. package/src/composables/formBuilderSchema.ts +153 -0
  276. package/src/composables/pluginEndpointBuilder.ts +203 -0
  277. package/src/composables/protocolTemplateCatalog.ts +325 -0
  278. package/src/composables/useAutoGroup.ts +395 -549
  279. package/src/composables/useAutoGroupInputSources.ts +147 -0
  280. package/src/composables/useBioTemplateControls.ts +1 -1
  281. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  282. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  283. package/src/composables/useControlSchema.ts +21 -692
  284. package/src/composables/useControlWorkspace.ts +7 -13
  285. package/src/composables/useForm.ts +5 -187
  286. package/src/composables/useFormBuilder.ts +11 -153
  287. package/src/composables/useFormValidation.ts +154 -0
  288. package/src/composables/usePluginClient.ts +10 -193
  289. package/src/composables/useProtocolTemplates.ts +10 -328
  290. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  291. package/src/styles/components/auto-group-modal.css +248 -310
  292. package/src/templates/controlSchemaTypes.ts +1 -1
  293. package/src/templates/templateAdapterTypes.ts +58 -0
  294. package/src/templates/templateCreateOptions.ts +208 -0
  295. package/src/templates/templateQpcrTypes.ts +48 -0
  296. package/src/templates/types.ts +79 -275
  297. package/src/types/auto-group.ts +107 -9
  298. package/src/types/componentLabTypes.ts +235 -0
  299. package/src/types/componentWorkflowTypes.ts +190 -0
  300. package/src/types/components.ts +74 -424
  301. package/dist/components-DafPc4rM.js.map +0 -1
  302. package/dist/composables-BMkPQhVK.js.map +0 -1
  303. package/dist/templates-bUAWMn5L.js.map +0 -1
  304. package/dist/useProtocolTemplates-QZtHFFH2.js.map +0 -1
@@ -0,0 +1,364 @@
1
+ import type {
2
+ ComputedRef,
3
+ Ref,
4
+ } from 'vue'
5
+ import type {
6
+ PillNavItem,
7
+ SidebarToolSection,
8
+ SelectOption,
9
+ SettingsModalSchema,
10
+ TopBarSettingsConfig,
11
+ } from '../types'
12
+ import type { AccessPolicy, AccessAudienceInput } from '../permissions'
13
+ import type {
14
+ FieldCondition,
15
+ FieldValidation,
16
+ FormFieldSchema,
17
+ FormFieldType,
18
+ FormSchema,
19
+ FormSectionSchema,
20
+ } from '../types/form-builder'
21
+ import type { WellConcentration } from './useDoseCalculator'
22
+
23
+ export type ControlOptionValue = string | number | boolean
24
+ export type ControlOption = ControlOptionValue | SelectOption<unknown>
25
+ export type ControlPrimitive = string | number | boolean
26
+ export type ControlShorthand = ControlPrimitive | readonly ControlOption[]
27
+ export type ControlInput = ControlDefinition | ControlShorthand
28
+
29
+ export interface ControlSectionConfig {
30
+ id?: string
31
+ label?: string
32
+ title?: string
33
+ description?: string
34
+ subtitle?: string
35
+ icon?: string | string[]
36
+ iconColor?: string
37
+ iconBg?: string
38
+ columns?: 1 | 2 | 3
39
+ condition?: FieldCondition
40
+ access?: AccessPolicy
41
+ visibleFor?: AccessAudienceInput
42
+ requiresAdmin?: boolean
43
+ permissions?: readonly string[]
44
+ anyPermissions?: readonly string[]
45
+ defaultOpen?: boolean
46
+ showToggle?: boolean
47
+ }
48
+
49
+ export interface ControlViewConfig {
50
+ label?: string
51
+ icon?: string
52
+ to?: string
53
+ href?: string
54
+ disabled?: boolean
55
+ children?: PillNavItem['children']
56
+ }
57
+
58
+ export interface ControlSidebarConfig extends Omit<ControlSectionConfig, 'id' | 'title' | 'description' | 'columns'> {
59
+ enabled?: boolean
60
+ }
61
+
62
+ export interface ControlDefinition {
63
+ type?: FormFieldType
64
+ label?: string
65
+ default?: unknown
66
+ defaultValue?: unknown
67
+ placeholder?: string
68
+ hint?: string
69
+ size?: 'sm' | 'md' | 'lg'
70
+ disabled?: boolean
71
+ readonly?: boolean
72
+ required?: boolean | string
73
+ min?: number | { value: number; message: string }
74
+ max?: number | { value: number; message: string }
75
+ minLength?: number | { value: number; message: string }
76
+ maxLength?: number | { value: number; message: string }
77
+ email?: boolean | string
78
+ pattern?: string | { value: string; message: string }
79
+ validation?: FieldValidation
80
+ condition?: FieldCondition
81
+ access?: AccessPolicy
82
+ visibleFor?: AccessAudienceInput
83
+ requiresAdmin?: boolean
84
+ permissions?: readonly string[]
85
+ anyPermissions?: readonly string[]
86
+ options?: readonly ControlOption[]
87
+ section?: string
88
+ sectionLabel?: string
89
+ sectionDescription?: string
90
+ sectionSubtitle?: string
91
+ view?: string
92
+ order?: number
93
+ colSpan?: number
94
+ props?: Record<string, unknown>
95
+ sidebar?: boolean | ControlSidebarConfig
96
+ }
97
+
98
+ export type ControlSchema = Record<string, ControlInput>
99
+ export type ControlFormSchema = Extract<FormSchema, { sections: FormSectionSchema[] }>
100
+
101
+ export interface ControlSchemaOptions {
102
+ view?: string
103
+ views?: Record<string, ControlViewConfig>
104
+ section?: string
105
+ sectionLabel?: string
106
+ sections?: Record<string, ControlSectionConfig>
107
+ columns?: 1 | 2 | 3
108
+ submitLabel?: string
109
+ cancelLabel?: string
110
+ showCancel?: boolean
111
+ }
112
+
113
+ export interface ControlWorkspaceOptions extends ControlSchemaOptions {
114
+ initialValues?: Record<string, unknown>
115
+ topBarSettings?: Omit<TopBarSettingsConfig, 'schema' | 'controls' | 'controlOptions' | 'values'>
116
+ }
117
+
118
+ export interface ControlModelSectionConfig extends ControlSectionConfig {
119
+ controls: ControlSchema
120
+ sidebar?: boolean | ControlSidebarConfig
121
+ }
122
+
123
+ export interface ControlModelViewConfig extends ControlViewConfig {
124
+ controls?: ControlSchema
125
+ section?: string
126
+ sectionLabel?: string
127
+ sectionDescription?: string
128
+ sections?: Record<string, ControlModelSectionConfig>
129
+ }
130
+
131
+ export interface ControlModel extends Omit<ControlWorkspaceOptions, 'sections' | 'views'> {
132
+ controls?: ControlSchema
133
+ sections?: Record<string, ControlModelSectionConfig>
134
+ views?: Record<string, ControlModelViewConfig>
135
+ /** Optional SDK component bindings returned with generated component props for custom workspace slots. */
136
+ componentBindings?: ControlComponentBindingsConfig
137
+ /** Alias for componentBindings in raw control models. */
138
+ components?: ControlComponentBindingsConfig
139
+ /** Optional ControlWorkspaceView componentProps mapping returned with the generated controls/options. */
140
+ componentProps?: ControlComponentPropsMap
141
+ /** Optional named componentProps mappings returned for multiple SDK components. */
142
+ componentPropsById?: ControlComponentPropsByIdMap
143
+ }
144
+
145
+ export interface ControlModelBinding {
146
+ controls: ControlSchema
147
+ controlOptions: ControlWorkspaceOptions
148
+ componentBindings?: ControlComponentBindingsConfig
149
+ componentProps?: ControlComponentPropsMap
150
+ componentPropsById?: ControlComponentPropsByIdMap
151
+ }
152
+
153
+ export interface ControlSidebarBinding {
154
+ panels: Record<string, SidebarToolSection[]>
155
+ forms: Record<string, ControlFormSchema>
156
+ viewIds: string[]
157
+ viewItems: PillNavItem[]
158
+ defaultView: string
159
+ }
160
+
161
+ export interface ControlFormBinding {
162
+ schema: ControlFormSchema
163
+ }
164
+
165
+ export interface ControlSettingsBinding {
166
+ schema: SettingsModalSchema
167
+ }
168
+
169
+ export interface ControlTopBarSettingsBinding {
170
+ showSettings: true
171
+ settingsConfig: TopBarSettingsConfig
172
+ }
173
+
174
+ export interface ControlWorkspaceFormBinding extends ControlFormBinding {
175
+ modelValue: Record<string, unknown>
176
+ 'onUpdate:modelValue': (values: Record<string, unknown>) => void
177
+ }
178
+
179
+ export interface ControlWorkspaceSidebarBinding extends ControlSidebarBinding {
180
+ activeView: string
181
+ modelValue: Record<string, unknown>
182
+ 'onUpdate:modelValue': (values: Record<string, unknown>) => void
183
+ values: Record<string, unknown>
184
+ 'onUpdate:values': (values: Record<string, unknown>) => void
185
+ }
186
+
187
+ export interface ControlWorkspaceTopBarSettingsBinding extends ControlTopBarSettingsBinding {
188
+ onSettingsValuesChange: (values: Record<string, unknown>) => void
189
+ }
190
+
191
+ export interface ControlWorkspacePillNavBinding {
192
+ items: PillNavItem[]
193
+ currentItemId: string
194
+ onSelect: (item: PillNavItem) => void
195
+ }
196
+
197
+ export interface ControlWorkspaceTopBarBinding extends ControlWorkspaceTopBarSettingsBinding {
198
+ pillNav: PillNavItem[]
199
+ currentPillId: string
200
+ onPillSelect: (item: PillNavItem) => void
201
+ }
202
+
203
+ export type ControlWorkspaceAppTopBarPillBinding = ControlWorkspaceTopBarBinding
204
+
205
+ export interface ControlWorkspaceComponentBindings {
206
+ form: ControlWorkspaceFormBinding
207
+ sidebar: ControlWorkspaceSidebarBinding
208
+ topBar: ComputedRef<ControlWorkspaceTopBarBinding>
209
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
210
+ pillNav: ControlWorkspacePillNavBinding
211
+ componentBindings: ComputedRef<ControlComponentBinding[]>
212
+ componentBindingsById: ComputedRef<ControlComponentBindingsById>
213
+ componentProps: ComputedRef<Record<string, unknown>>
214
+ componentPropsById: ComputedRef<Record<string, Record<string, unknown>>>
215
+ }
216
+
217
+ export type ControlComponentPropSource<TValues extends Record<string, unknown> = Record<string, unknown>> =
218
+ | (keyof TValues & string)
219
+ | ((values: TValues) => unknown)
220
+
221
+ export type ControlComponentPropsMap<TValues extends Record<string, unknown> = Record<string, unknown>> =
222
+ | readonly (keyof TValues & string)[]
223
+ | Record<string, ControlComponentPropSource<TValues>>
224
+
225
+ export type ControlComponentPropsByIdMap<TValues extends Record<string, unknown> = Record<string, unknown>> =
226
+ Record<string, ControlComponentPropsMap<TValues>>
227
+
228
+ export interface ControlComponentBindingConfig<TValues extends Record<string, unknown> = Record<string, unknown>> {
229
+ id?: string
230
+ component: string
231
+ props?: ControlComponentPropsMap<TValues>
232
+ }
233
+
234
+ export interface ControlComponentBindingRecordConfig<TValues extends Record<string, unknown> = Record<string, unknown>> {
235
+ component: string
236
+ props?: ControlComponentPropsMap<TValues>
237
+ }
238
+
239
+ export type ControlComponentBindingsConfig<TValues extends Record<string, unknown> = Record<string, unknown>> =
240
+ | readonly ControlComponentBindingConfig<TValues>[]
241
+ | Record<string, ControlComponentBindingRecordConfig<TValues>>
242
+
243
+ export interface ControlComponentBinding {
244
+ id: string
245
+ component: string
246
+ props: Record<string, unknown>
247
+ }
248
+
249
+ export type ControlComponentBindingsById = Record<string, ControlComponentBinding>
250
+
251
+ export interface WellPlateControlPropsOptions<TValues extends Record<string, unknown> = Record<string, unknown>> {
252
+ selectedWells?: ControlComponentPropSource<TValues>
253
+ format?: ControlComponentPropSource<TValues>
254
+ wells?: ControlComponentPropSource<TValues>
255
+ disabled?: ControlComponentPropSource<TValues>
256
+ readonly?: ControlComponentPropSource<TValues>
257
+ showLegend?: ControlComponentPropSource<TValues>
258
+ showSampleTypeIndicator?: ControlComponentPropSource<TValues>
259
+ /** Listener for WellPlate v-model updates. Set false to keep generated props one-way. */
260
+ onUpdateModelValue?: ((values: TValues) => (wellIds: string[]) => void) | false
261
+ }
262
+
263
+ export interface DoseCalculatorControlPropsOptions<TValues extends Record<string, unknown> = Record<string, unknown>> {
264
+ mode?: ControlComponentPropSource<TValues>
265
+ targetWells?: ControlComponentPropSource<TValues>
266
+ /** Control value key used by the default apply-to-wells handler. */
267
+ wells?: ControlComponentPropSource<TValues>
268
+ disabled?: ControlComponentPropSource<TValues>
269
+ molecularWeight?: ControlComponentPropSource<TValues>
270
+ /** Listener for DoseCalculator apply-to-wells. Set false to keep generated props one-way. */
271
+ onApplyToWells?: ((values: TValues) => (results: WellConcentration[]) => void) | false
272
+ }
273
+
274
+ export interface WellPlateDoseControlPropsOptions<TValues extends Record<string, unknown> = Record<string, unknown>> {
275
+ plateId?: string
276
+ doseId?: string
277
+ plate?: WellPlateControlPropsOptions<TValues>
278
+ dose?: DoseCalculatorControlPropsOptions<TValues>
279
+ }
280
+
281
+ export interface DoseDesignControlModelOptions {
282
+ viewId?: string
283
+ viewLabel?: string
284
+ sectionId?: string
285
+ sectionLabel?: string
286
+ sectionDescription?: string
287
+ selectedWells?: readonly string[]
288
+ plateFormat?: number
289
+ plateFormats?: readonly number[]
290
+ doseMode?: 'serial' | 'dilution' | 'conversion'
291
+ doseModes?: readonly ('serial' | 'dilution' | 'conversion')[]
292
+ disabled?: boolean
293
+ includeMolecularWeight?: boolean
294
+ molecularWeight?: number
295
+ componentProps?: WellPlateDoseControlPropsOptions
296
+ }
297
+
298
+ export interface UseControlSchemaReturn<TControls extends ControlSchema> {
299
+ controls: TControls
300
+ fields: FormFieldSchema[]
301
+ formSchema: ControlFormSchema
302
+ form: ControlFormBinding
303
+ settingsSchema: SettingsModalSchema
304
+ settings: ControlSettingsBinding
305
+ topBarSettingsConfig: TopBarSettingsConfig
306
+ topBarSettings: ControlTopBarSettingsBinding
307
+ sidebarPanels: Record<string, SidebarToolSection[]>
308
+ viewIds: string[]
309
+ viewItems: PillNavItem[]
310
+ defaultView: string
311
+ sectionSchemas: Record<string, ControlFormSchema>
312
+ sidebar: ControlSidebarBinding
313
+ initialValues: ControlValues<TControls>
314
+ sectionSchema: (sectionId: string) => ControlFormSchema
315
+ }
316
+
317
+ export interface UseControlWorkspaceReturn<TControls extends ControlSchema>
318
+ extends Omit<UseControlSchemaReturn<TControls>, 'form' | 'sidebar' | 'topBarSettings'> {
319
+ schema: UseControlSchemaReturn<TControls>
320
+ values: ControlValues<TControls> & Record<string, unknown>
321
+ activeView: Ref<string>
322
+ form: ControlWorkspaceFormBinding
323
+ sidebar: ControlWorkspaceSidebarBinding
324
+ topBar: ComputedRef<ControlWorkspaceTopBarBinding>
325
+ pillNav: ControlWorkspacePillNavBinding
326
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
327
+ bindings: ControlWorkspaceComponentBindings
328
+ componentBindings: ComputedRef<ControlComponentBinding[]>
329
+ componentBindingsById: ComputedRef<ControlComponentBindingsById>
330
+ componentProps: ComputedRef<Record<string, unknown>>
331
+ componentPropsById: ComputedRef<Record<string, Record<string, unknown>>>
332
+ setActiveView: (viewId: string) => void
333
+ setValues: (values: Record<string, unknown>) => void
334
+ resetValues: (values?: Record<string, unknown>) => void
335
+ getComponentProps: (
336
+ mapping?: ControlComponentPropsMap<ControlValues<TControls> & Record<string, unknown>>
337
+ ) => Record<string, unknown>
338
+ getComponentPropsById: (
339
+ mappings?: ControlComponentPropsByIdMap<ControlValues<TControls> & Record<string, unknown>>
340
+ ) => Record<string, Record<string, unknown>>
341
+ getComponentBindings: (
342
+ bindings?: ControlComponentBindingsConfig<ControlValues<TControls> & Record<string, unknown>>
343
+ ) => ControlComponentBinding[]
344
+ getComponentBindingsById: (
345
+ bindings?: ControlComponentBindingsConfig<ControlValues<TControls> & Record<string, unknown>>
346
+ ) => ControlComponentBindingsById
347
+ }
348
+
349
+ export type ControlValues<TControls extends ControlSchema> = {
350
+ [K in keyof TControls]: ControlValue<TControls[K]>
351
+ }
352
+
353
+ type ControlValue<TControl> =
354
+ TControl extends { default: infer TDefault }
355
+ ? TDefault
356
+ : TControl extends { defaultValue: infer TDefaultValue }
357
+ ? TDefaultValue
358
+ : TControl extends readonly [infer First, ...unknown[]]
359
+ ? OptionValue<First>
360
+ : TControl extends ControlPrimitive
361
+ ? TControl
362
+ : unknown
363
+
364
+ type OptionValue<TOption> = TOption extends SelectOption<infer TValue> ? TValue : TOption
@@ -1,6 +1,6 @@
1
1
  import type {
2
2
  ControlWorkspaceOptions,
3
- } from './useControlSchema'
3
+ } from './controlSchemaTypes'
4
4
 
5
5
  export function mergeControlWorkspaceOptions(
6
6
  base?: ControlWorkspaceOptions,
@@ -0,0 +1,153 @@
1
+ import { getTypeDefault } from './formBuilderRegistry'
2
+ import type { FieldRules } from './useForm'
3
+ import type {
4
+ FieldCondition,
5
+ FieldValidation,
6
+ FormEnhancements,
7
+ FormFieldSchema,
8
+ FormSchema,
9
+ FormSectionSchema,
10
+ } from '../types/form-builder'
11
+
12
+ /**
13
+ * Evaluate a JSON-serializable field condition against the current form data.
14
+ *
15
+ * Supports logical operators (`and`, `or`, `not`) and comparison operators
16
+ * (`eq`, `neq`, `gt`, `lt`, `gte`, `lte`, `in`, `notIn`, `truthy`, `falsy`,
17
+ * `contains`). Returns `true` if the condition passes.
18
+ */
19
+ export function evaluateCondition(
20
+ condition: FieldCondition,
21
+ data: Record<string, unknown>,
22
+ ): boolean {
23
+ if ('and' in condition) {
24
+ return condition.and.every((c) => evaluateCondition(c, data))
25
+ }
26
+ if ('or' in condition) {
27
+ return condition.or.some((c) => evaluateCondition(c, data))
28
+ }
29
+ if ('not' in condition) {
30
+ return !evaluateCondition(condition.not, data)
31
+ }
32
+
33
+ const value = data[condition.field]
34
+
35
+ if ('eq' in condition) return value === condition.eq
36
+ if ('neq' in condition) return value !== condition.neq
37
+ if ('gt' in condition) return typeof value === 'number' && value > condition.gt
38
+ if ('lt' in condition) return typeof value === 'number' && value < condition.lt
39
+ if ('gte' in condition) return typeof value === 'number' && value >= condition.gte
40
+ if ('lte' in condition) return typeof value === 'number' && value <= condition.lte
41
+ if ('in' in condition) return condition.in.includes(value)
42
+ if ('notIn' in condition) return !condition.notIn.includes(value)
43
+ if ('truthy' in condition) return !!value
44
+ if ('falsy' in condition) return !value
45
+ if ('contains' in condition) {
46
+ if (typeof value === 'string') return value.includes(condition.contains)
47
+ if (Array.isArray(value)) return value.includes(condition.contains)
48
+ return false
49
+ }
50
+
51
+ return true
52
+ }
53
+
54
+ /** Return all sections across steps (wizard) or directly from a flat schema. */
55
+ export function collectSections(schema: FormSchema): FormSectionSchema[] {
56
+ return schema.steps ? schema.steps.flatMap((step) => step.sections) : schema.sections
57
+ }
58
+
59
+ /** Return all field schemas in schema order, flattening sections and steps. */
60
+ export function flattenFields(schema: FormSchema): FormFieldSchema[] {
61
+ return collectSections(schema).flatMap((section) => section.fields)
62
+ }
63
+
64
+ /** Convert a JSON-safe `FieldValidation` descriptor to a runtime `FieldRules` object. */
65
+ function convertValidation(v: FieldValidation): FieldRules {
66
+ const rules: FieldRules = {}
67
+
68
+ if (v.required !== undefined) rules.required = v.required
69
+ if (v.minLength !== undefined) rules.minLength = v.minLength
70
+ if (v.maxLength !== undefined) rules.maxLength = v.maxLength
71
+ if (v.min !== undefined) rules.min = v.min
72
+ if (v.max !== undefined) rules.max = v.max
73
+ if (v.email !== undefined) rules.email = v.email
74
+
75
+ if (v.pattern !== undefined) {
76
+ rules.pattern =
77
+ typeof v.pattern === 'string'
78
+ ? new RegExp(v.pattern)
79
+ : { value: new RegExp(v.pattern.value), message: v.pattern.message }
80
+ }
81
+
82
+ return rules
83
+ }
84
+
85
+ export function buildInitialValues<T extends Record<string, unknown>>(
86
+ fields: readonly FormFieldSchema[],
87
+ initialData?: Partial<T>,
88
+ ): Record<string, unknown> {
89
+ const initialValues = {} as Record<string, unknown>
90
+
91
+ for (const field of fields) {
92
+ const key = field.name
93
+ if (initialData && hasOwnKey(initialData, key)) {
94
+ initialValues[key] = (initialData as Record<string, unknown>)[key]
95
+ } else if (field.defaultValue !== undefined) {
96
+ initialValues[key] = field.defaultValue
97
+ } else {
98
+ initialValues[key] = getTypeDefault(field.type)
99
+ }
100
+ }
101
+
102
+ return initialValues
103
+ }
104
+
105
+ export function buildRules<T extends Record<string, unknown>>(
106
+ fields: readonly FormFieldSchema[],
107
+ enhancements?: FormEnhancements<T>,
108
+ ): Partial<Record<string, FieldRules>> {
109
+ const rules: Partial<Record<string, FieldRules>> = {}
110
+
111
+ for (const field of fields) {
112
+ const base: FieldRules = field.validation ? convertValidation(field.validation) : {}
113
+ const enhancement = enhancements?.fields?.[field.name as keyof T]
114
+
115
+ const customValidators: Array<(
116
+ value: unknown,
117
+ formData: Record<string, unknown>,
118
+ ) => string | undefined | null> = []
119
+
120
+ if (enhancement?.validate) {
121
+ const fn = enhancement.validate
122
+ customValidators.push((value, formData) => fn(value, formData as T))
123
+ }
124
+
125
+ if (customValidators.length > 0) {
126
+ base.custom = customValidators
127
+ }
128
+
129
+ if (Object.keys(base).length > 0) {
130
+ rules[field.name] = base
131
+ }
132
+ }
133
+
134
+ return rules
135
+ }
136
+
137
+ export function replaceArray<T>(target: T[], values: readonly T[]): void {
138
+ target.splice(0, target.length, ...values)
139
+ }
140
+
141
+ export function replaceRecord<TValue>(
142
+ target: Partial<Record<string, TValue>>,
143
+ source: Partial<Record<string, TValue>>,
144
+ ): void {
145
+ for (const key of Object.keys(target)) {
146
+ delete target[key]
147
+ }
148
+ Object.assign(target, source)
149
+ }
150
+
151
+ function hasOwnKey(source: object, key: string): boolean {
152
+ return Object.prototype.hasOwnProperty.call(source, key)
153
+ }