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

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 (324) 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 +9 -6
  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 +7 -2
  44. package/dist/components/BaseInput.vue.d.ts +2 -2
  45. package/dist/components/BasePill.vue.d.ts +2 -2
  46. package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
  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 +7 -2
  51. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  52. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  53. package/dist/components/CollapsibleCard.vue.d.ts +9 -0
  54. package/dist/components/ColorSlider.vue.d.ts +2 -2
  55. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  56. package/dist/components/ControlWorkspaceView.vue.d.ts +4 -4
  57. package/dist/components/DatePicker.vue.d.ts +1 -1
  58. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  59. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  60. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +2 -2
  61. package/dist/components/DropdownButton.vue.d.ts +1 -1
  62. package/dist/components/FileUploader.vue.d.ts +2 -2
  63. package/dist/components/FormulaInput.vue.d.ts +2 -2
  64. package/dist/components/IconButton.vue.d.ts +1 -1
  65. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  66. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  67. package/dist/components/MultiSelect.vue.d.ts +1 -1
  68. package/dist/components/NumberInput.vue.d.ts +1 -1
  69. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  70. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  71. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  72. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  73. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  74. package/dist/components/PluginWorkspaceView.vue.d.ts +51 -196
  75. package/dist/components/ProgressBar.vue.d.ts +1 -1
  76. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  77. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  78. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  79. package/dist/components/ReagentList.presentation.d.ts +16 -0
  80. package/dist/components/ResourceCard.vue.d.ts +1 -1
  81. package/dist/components/SampleSelector.colors.d.ts +13 -0
  82. package/dist/components/SampleSelector.drag.d.ts +24 -0
  83. package/dist/components/SampleSelector.groups.d.ts +15 -0
  84. package/dist/components/SampleSelector.selection.d.ts +26 -0
  85. package/dist/components/SampleSelector.vue.d.ts +4 -1
  86. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  87. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  88. package/dist/components/SequenceInput.vue.d.ts +2 -2
  89. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  90. package/dist/components/SettingsModal.schema.d.ts +9 -0
  91. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  92. package/dist/components/TagsInput.vue.d.ts +2 -2
  93. package/dist/components/TimePicker.vue.d.ts +2 -2
  94. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  95. package/dist/components/UnitInput.vue.d.ts +2 -2
  96. package/dist/components/WellPlate.colors.d.ts +9 -0
  97. package/dist/components/WellPlate.conditions.d.ts +26 -0
  98. package/dist/components/WellPlate.geometry.d.ts +23 -0
  99. package/dist/components/WellPlate.interaction.d.ts +71 -0
  100. package/dist/components/WellPlate.legend.d.ts +2 -0
  101. package/dist/components/WellPlate.rendering.d.ts +24 -0
  102. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  103. package/dist/components/WellPlate.vue.d.ts +1 -1
  104. package/dist/components/index.js +2 -2
  105. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  106. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  107. package/dist/{components-DafPc4rM.js → components-Blx4MG--.js} +4073 -4222
  108. package/dist/components-Blx4MG--.js.map +1 -0
  109. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  110. package/dist/composables/autoGroup/classify.d.ts +28 -0
  111. package/dist/composables/autoGroup/colors.d.ts +2 -0
  112. package/dist/composables/autoGroup/columns.d.ts +10 -0
  113. package/dist/composables/autoGroup/compose.d.ts +8 -0
  114. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  115. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  116. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  117. package/dist/composables/autoGroup/index.d.ts +16 -0
  118. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  119. package/dist/composables/autoGroup/template.d.ts +15 -0
  120. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  121. package/dist/composables/autoGroupConstants.d.ts +1 -0
  122. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  123. package/dist/composables/controlComponentBindings.d.ts +1 -1
  124. package/dist/composables/controlSchemaAdapters.d.ts +1 -1
  125. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  126. package/dist/composables/controlSchemaLayout.d.ts +1 -1
  127. package/dist/composables/controlSchemaModel.d.ts +5 -0
  128. package/dist/composables/controlSchemaNormalize.d.ts +1 -1
  129. package/dist/composables/controlSchemaTypes.d.ts +311 -0
  130. package/dist/composables/controlWorkspaceOptions.d.ts +1 -1
  131. package/dist/composables/formBuilderSchema.d.ts +18 -0
  132. package/dist/composables/index.js +3 -3
  133. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  134. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  135. package/dist/composables/useAutoGroup.d.ts +61 -74
  136. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  137. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  138. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  139. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  140. package/dist/composables/useControlSchema.d.ts +4 -316
  141. package/dist/composables/useControlWorkspace.d.ts +1 -1
  142. package/dist/composables/useForm.d.ts +2 -33
  143. package/dist/composables/useFormBuilder.d.ts +2 -9
  144. package/dist/composables/useFormValidation.d.ts +34 -0
  145. package/dist/composables/usePluginClient.d.ts +1 -4
  146. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  147. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  148. package/dist/{composables-BMkPQhVK.js → composables-CHDjDIQT.js} +33 -31
  149. package/dist/composables-CHDjDIQT.js.map +1 -0
  150. package/dist/index.js +4 -4
  151. package/dist/install.js +2 -2
  152. package/dist/styles.css +1432 -660
  153. package/dist/templates/controlSchemaTypes.d.ts +1 -1
  154. package/dist/templates/index.js +1 -1
  155. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  156. package/dist/templates/templateCreateOptions.d.ts +165 -0
  157. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  158. package/dist/templates/types.d.ts +5 -250
  159. package/dist/{templates-bUAWMn5L.js → templates-DSbHJC4v.js} +1536 -297
  160. package/dist/templates-DSbHJC4v.js.map +1 -0
  161. package/dist/types/auto-group.d.ts +79 -9
  162. package/dist/types/componentLabTypes.d.ts +161 -0
  163. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  164. package/dist/types/components.d.ts +14 -311
  165. package/dist/types/form-builder.d.ts +3 -0
  166. package/dist/types/index.d.ts +1 -1
  167. package/dist/{useProtocolTemplates-QZtHFFH2.js → useProtocolTemplates-BbPOYPzO.js} +1220 -454
  168. package/dist/useProtocolTemplates-BbPOYPzO.js.map +1 -0
  169. package/package.json +1 -1
  170. package/src/__tests__/components/AppSidebar.test.ts +67 -0
  171. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  172. package/src/__tests__/components/CollapsibleCard.test.ts +47 -0
  173. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  174. package/src/__tests__/components/FormBuilder.test.ts +57 -0
  175. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  176. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  177. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  178. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
  179. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  180. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  181. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  182. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  183. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  184. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  185. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  186. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  187. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  188. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  189. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  190. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  191. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  192. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  193. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  194. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  195. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  196. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  197. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  198. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  199. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  200. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  201. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  202. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  203. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  204. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  205. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  206. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  207. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  208. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  209. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  210. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  211. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  212. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  213. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  214. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  215. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  216. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  217. package/src/components/AppSidebar.story.vue +79 -6
  218. package/src/components/AppSidebar.vue +74 -6
  219. package/src/components/AppTopBar.navigation.ts +62 -0
  220. package/src/components/AppTopBar.vue +17 -44
  221. package/src/components/AutoGroupModal.story.vue +50 -0
  222. package/src/components/AutoGroupModal.vue +441 -158
  223. package/src/components/BaseCheckbox.story.vue +27 -0
  224. package/src/components/BaseCheckbox.vue +63 -1
  225. package/src/components/BaseToggle.story.vue +27 -0
  226. package/src/components/BaseToggle.vue +66 -1
  227. package/src/components/CollapsibleCard.vue +123 -45
  228. package/src/components/ControlWorkspaceView.vue +2 -6
  229. package/src/components/DoseCalculator.vue +13 -73
  230. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  231. package/src/components/ExperimentTimeline.vue +6 -31
  232. package/src/components/FormBuilder.story.vue +13 -0
  233. package/src/components/FormBuilder.vue +2 -7
  234. package/src/components/PlateMapEditor.vue +32 -106
  235. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  236. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  237. package/src/components/PluginWorkspaceView.props.ts +174 -0
  238. package/src/components/PluginWorkspaceView.shell.ts +67 -0
  239. package/src/components/PluginWorkspaceView.vue +88 -404
  240. package/src/components/ProtocolStep.presentation.ts +31 -0
  241. package/src/components/ProtocolStepEditor.state.ts +104 -0
  242. package/src/components/ProtocolStepEditor.vue +48 -179
  243. package/src/components/ProtocolStepParameterField.vue +134 -0
  244. package/src/components/ReagentList.presentation.ts +105 -0
  245. package/src/components/ReagentList.vue +16 -79
  246. package/src/components/SampleSelector.colors.ts +43 -0
  247. package/src/components/SampleSelector.drag.ts +164 -0
  248. package/src/components/SampleSelector.groups.ts +109 -0
  249. package/src/components/SampleSelector.selection.ts +103 -0
  250. package/src/components/SampleSelector.vue +82 -349
  251. package/src/components/SampleSelectorSampleRow.vue +64 -0
  252. package/src/components/ScheduleCalendar.vue +44 -199
  253. package/src/components/SettingsModal.schema.ts +71 -0
  254. package/src/components/SettingsModal.vue +16 -46
  255. package/src/components/WellPlate.colors.ts +56 -0
  256. package/src/components/WellPlate.conditions.ts +100 -0
  257. package/src/components/WellPlate.geometry.ts +91 -0
  258. package/src/components/WellPlate.interaction.ts +272 -0
  259. package/src/components/WellPlate.legend.ts +8 -0
  260. package/src/components/WellPlate.rendering.ts +105 -0
  261. package/src/components/WellPlate.sampleDrop.ts +73 -0
  262. package/src/components/WellPlate.vue +102 -550
  263. package/src/components/internal/FormFieldRendererInternal.vue +23 -5
  264. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  265. package/src/composables/autoGroup/classKey.ts +5 -0
  266. package/src/composables/autoGroup/classify.ts +205 -0
  267. package/src/composables/autoGroup/colors.ts +6 -0
  268. package/src/composables/autoGroup/columns.ts +226 -0
  269. package/src/composables/autoGroup/compose.ts +156 -0
  270. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  271. package/src/composables/autoGroup/csv-shim.ts +44 -0
  272. package/src/composables/autoGroup/fingerprint.ts +49 -0
  273. package/src/composables/autoGroup/index.ts +20 -0
  274. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  275. package/src/composables/autoGroup/template.ts +126 -0
  276. package/src/composables/autoGroup/tokenize.ts +41 -0
  277. package/src/composables/autoGroup/vocab.json +67 -0
  278. package/src/composables/autoGroupConstants.ts +4 -0
  279. package/src/composables/autoGroupGrouping.ts +148 -0
  280. package/src/composables/controlComponentBindings.ts +1 -1
  281. package/src/composables/controlSchemaAdapters.ts +4 -1
  282. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  283. package/src/composables/controlSchemaFormFields.ts +4 -1
  284. package/src/composables/controlSchemaLayout.ts +1 -1
  285. package/src/composables/controlSchemaModel.ts +163 -0
  286. package/src/composables/controlSchemaNormalize.ts +1 -1
  287. package/src/composables/controlSchemaTypes.ts +372 -0
  288. package/src/composables/controlWorkspaceOptions.ts +1 -1
  289. package/src/composables/formBuilderSchema.ts +153 -0
  290. package/src/composables/pluginEndpointBuilder.ts +203 -0
  291. package/src/composables/protocolTemplateCatalog.ts +325 -0
  292. package/src/composables/useAutoGroup.ts +395 -549
  293. package/src/composables/useAutoGroupInputSources.ts +147 -0
  294. package/src/composables/useBioTemplateControls.ts +1 -1
  295. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  296. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  297. package/src/composables/useControlSchema.ts +21 -692
  298. package/src/composables/useControlWorkspace.ts +7 -13
  299. package/src/composables/useForm.ts +5 -187
  300. package/src/composables/useFormBuilder.ts +11 -153
  301. package/src/composables/useFormValidation.ts +154 -0
  302. package/src/composables/usePluginClient.ts +10 -193
  303. package/src/composables/useProtocolTemplates.ts +10 -328
  304. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  305. package/src/styles/components/app-sidebar.css +134 -6
  306. package/src/styles/components/auto-group-modal.css +248 -310
  307. package/src/styles/components/checkbox.css +87 -0
  308. package/src/styles/components/collapsible-card.css +154 -14
  309. package/src/styles/components/toggle.css +80 -0
  310. package/src/templates/controlSchemaTypes.ts +1 -1
  311. package/src/templates/templateAdapterTypes.ts +58 -0
  312. package/src/templates/templateCreateOptions.ts +208 -0
  313. package/src/templates/templateQpcrTypes.ts +48 -0
  314. package/src/templates/types.ts +79 -275
  315. package/src/types/auto-group.ts +107 -9
  316. package/src/types/componentLabTypes.ts +235 -0
  317. package/src/types/componentWorkflowTypes.ts +190 -0
  318. package/src/types/components.ts +95 -424
  319. package/src/types/form-builder.ts +3 -0
  320. package/src/types/index.ts +2 -0
  321. package/dist/components-DafPc4rM.js.map +0 -1
  322. package/dist/composables-BMkPQhVK.js.map +0 -1
  323. package/dist/templates-bUAWMn5L.js.map +0 -1
  324. package/dist/useProtocolTemplates-QZtHFFH2.js.map +0 -1
@@ -0,0 +1,287 @@
1
+ import { computed, type Ref } from 'vue'
2
+ import type {
3
+ ScheduleView,
4
+ ScheduleEvent,
5
+ ScheduleBlockedSlot,
6
+ ScheduleEventStatus,
7
+ } from '../types/components'
8
+ import { formatTime } from './useTimeUtils'
9
+
10
+ type ReadableRef<T> = Readonly<Ref<T>>
11
+
12
+ export const SCHEDULE_SLOT_HEIGHT = 40
13
+
14
+ export interface UseScheduleCalendarLayoutOptions {
15
+ currentView: ReadableRef<ScheduleView>
16
+ currentDate: ReadableRef<Date>
17
+ now: ReadableRef<Date>
18
+ events: ReadableRef<readonly ScheduleEvent[]>
19
+ blockedSlots: ReadableRef<readonly ScheduleBlockedSlot[]>
20
+ dayStartHour: ReadableRef<number>
21
+ dayEndHour: ReadableRef<number>
22
+ slotDuration: ReadableRef<number>
23
+ weekStartsOn: ReadableRef<0 | 1>
24
+ locale: ReadableRef<string>
25
+ showNowIndicator: ReadableRef<boolean>
26
+ slotHeight?: ReadableRef<number>
27
+ }
28
+
29
+ /** Builds ScheduleCalendar date ranges, event layout styles, and display labels. */
30
+ export function useScheduleCalendarLayout(options: UseScheduleCalendarLayoutOptions) {
31
+ const slotHeight = computed(() => options.slotHeight?.value ?? SCHEDULE_SLOT_HEIGHT)
32
+ const totalSlots = computed(() => {
33
+ return ((options.dayEndHour.value - options.dayStartHour.value) * 60) / options.slotDuration.value
34
+ })
35
+
36
+ const timeLabels = computed(() => buildTimeLabels(
37
+ options.dayStartHour.value,
38
+ options.slotDuration.value,
39
+ totalSlots.value,
40
+ ))
41
+ const weekDays = computed(() => buildWeekDays(options.currentDate.value, options.weekStartsOn.value))
42
+ const visibleDays = computed(() => {
43
+ if (options.currentView.value === 'day') return [options.currentDate.value]
44
+ if (options.currentView.value === 'week') return weekDays.value
45
+ return []
46
+ })
47
+ const headerTitle = computed(() => buildHeaderTitle(
48
+ options.currentView.value,
49
+ options.currentDate.value,
50
+ weekDays.value,
51
+ options.locale.value,
52
+ ))
53
+ const monthDays = computed(() => buildMonthDays(options.currentDate.value, options.weekStartsOn.value))
54
+ const monthWeekdayLabels = computed(() => buildMonthWeekdayLabels(
55
+ options.locale.value,
56
+ options.weekStartsOn.value,
57
+ ))
58
+
59
+ function isToday(date: Date): boolean {
60
+ return isSameDay(date, options.now.value)
61
+ }
62
+
63
+ function getEventStyle(event: ScheduleEvent, dayDate: Date): Record<string, string> | null {
64
+ return getTimedItemStyle(
65
+ event.start,
66
+ event.end,
67
+ dayDate,
68
+ options.dayStartHour.value,
69
+ options.dayEndHour.value,
70
+ options.slotDuration.value,
71
+ slotHeight.value,
72
+ true,
73
+ slotHeight.value / 2,
74
+ )
75
+ }
76
+
77
+ function getBlockedStyle(slot: ScheduleBlockedSlot): Record<string, string> {
78
+ return getTimedItemStyle(
79
+ slot.start,
80
+ slot.end,
81
+ new Date(slot.start),
82
+ options.dayStartHour.value,
83
+ options.dayEndHour.value,
84
+ options.slotDuration.value,
85
+ slotHeight.value,
86
+ false,
87
+ 0,
88
+ ) ?? { top: '0px', height: '0px' }
89
+ }
90
+
91
+ function getNowIndicatorStyle(): Record<string, string> | null {
92
+ if (!options.showNowIndicator.value) return null
93
+ const nowMin = dateToMinutes(options.now.value)
94
+ const dayStartMin = options.dayStartHour.value * 60
95
+ const dayEndMin = options.dayEndHour.value * 60
96
+ if (nowMin < dayStartMin || nowMin > dayEndMin) return null
97
+
98
+ const pixelsPerMin = slotHeight.value / options.slotDuration.value
99
+ return { top: `${(nowMin - dayStartMin) * pixelsPerMin}px` }
100
+ }
101
+
102
+ function getEventsForDay(day: Date): ScheduleEvent[] {
103
+ return eventsForDate(options.events.value, day)
104
+ }
105
+
106
+ function getEventsForDate(date: Date): ScheduleEvent[] {
107
+ return eventsForDate(options.events.value, date)
108
+ }
109
+
110
+ function getBlockedForDay(day: Date): ScheduleBlockedSlot[] {
111
+ return options.blockedSlots.value.filter((slot) => isSameDay(new Date(slot.start), day))
112
+ }
113
+
114
+ return {
115
+ totalSlots,
116
+ timeLabels,
117
+ weekDays,
118
+ visibleDays,
119
+ headerTitle,
120
+ monthDays,
121
+ monthWeekdayLabels,
122
+ isToday,
123
+ isSameDay,
124
+ getEventStyle,
125
+ getEventsForDay,
126
+ getEventsForDate,
127
+ getBlockedForDay,
128
+ getBlockedStyle,
129
+ getNowIndicatorStyle,
130
+ getStatusClass,
131
+ getMonthStatusClass,
132
+ formatEventTime,
133
+ }
134
+ }
135
+
136
+ export function parseScheduleModelDate(value?: Date | string): Date {
137
+ if (!value) return new Date()
138
+ if (value instanceof Date) return value
139
+ const d = new Date(value)
140
+ return isNaN(d.getTime()) ? new Date() : d
141
+ }
142
+
143
+ export function getWeekStart(date: Date, weekStartsOn: 0 | 1): Date {
144
+ const d = new Date(date)
145
+ const day = d.getDay()
146
+ const diff = (day - weekStartsOn + 7) % 7
147
+ d.setDate(d.getDate() - diff)
148
+ return d
149
+ }
150
+
151
+ export function isSameDay(a: Date, b: Date): boolean {
152
+ return a.toDateString() === b.toDateString()
153
+ }
154
+
155
+ function buildTimeLabels(dayStartHour: number, slotDuration: number, totalSlots: number): string[] {
156
+ const labels: string[] = []
157
+ for (let i = 0; i <= totalSlots; i++) {
158
+ const totalMinutes = dayStartHour * 60 + i * slotDuration
159
+ const hour = Math.floor(totalMinutes / 60)
160
+ const minute = totalMinutes % 60
161
+ labels.push(formatTime(hour, minute, '24h'))
162
+ }
163
+ return labels
164
+ }
165
+
166
+ function buildWeekDays(currentDate: Date, weekStartsOn: 0 | 1): Date[] {
167
+ const days: Date[] = []
168
+ const start = getWeekStart(currentDate, weekStartsOn)
169
+ for (let i = 0; i < 7; i++) {
170
+ const d = new Date(start)
171
+ d.setDate(d.getDate() + i)
172
+ days.push(d)
173
+ }
174
+ return days
175
+ }
176
+
177
+ function buildHeaderTitle(
178
+ view: ScheduleView,
179
+ currentDate: Date,
180
+ weekDays: Date[],
181
+ locale: string,
182
+ ): string {
183
+ if (view === 'day') {
184
+ return currentDate.toLocaleDateString(locale, {
185
+ weekday: 'long',
186
+ year: 'numeric',
187
+ month: 'long',
188
+ day: 'numeric',
189
+ })
190
+ }
191
+ if (view === 'week') {
192
+ const first = weekDays[0]
193
+ const last = weekDays[6]
194
+ const sameMonth = first.getMonth() === last.getMonth()
195
+ if (sameMonth) {
196
+ return `${first.toLocaleDateString(locale, { month: 'short', day: 'numeric' })} - ${last.getDate()}, ${last.getFullYear()}`
197
+ }
198
+ return `${first.toLocaleDateString(locale, { month: 'short', day: 'numeric' })} - ${last.toLocaleDateString(locale, { month: 'short', day: 'numeric' })}, ${last.getFullYear()}`
199
+ }
200
+ return currentDate.toLocaleDateString(locale, { year: 'numeric', month: 'long' })
201
+ }
202
+
203
+ function buildMonthDays(currentDate: Date, weekStartsOn: 0 | 1): { date: Date; isCurrentMonth: boolean }[] {
204
+ const year = currentDate.getFullYear()
205
+ const month = currentDate.getMonth()
206
+ const firstDay = new Date(year, month, 1)
207
+ const lastDay = new Date(year, month + 1, 0)
208
+ const days: { date: Date; isCurrentMonth: boolean }[] = []
209
+
210
+ let startPadding = firstDay.getDay() - weekStartsOn
211
+ if (startPadding < 0) startPadding += 7
212
+
213
+ for (let i = startPadding - 1; i >= 0; i--) {
214
+ days.push({ date: new Date(year, month, -i), isCurrentMonth: false })
215
+ }
216
+
217
+ for (let i = 1; i <= lastDay.getDate(); i++) {
218
+ days.push({ date: new Date(year, month, i), isCurrentMonth: true })
219
+ }
220
+
221
+ const remaining = 42 - days.length
222
+ for (let i = 1; i <= remaining; i++) {
223
+ days.push({ date: new Date(year, month + 1, i), isCurrentMonth: false })
224
+ }
225
+
226
+ return days
227
+ }
228
+
229
+ function buildMonthWeekdayLabels(locale: string, weekStartsOn: 0 | 1): string[] {
230
+ const labels: string[] = []
231
+ const base = new Date(2024, 0, weekStartsOn === 1 ? 1 : 7)
232
+ for (let i = 0; i < 7; i++) {
233
+ const d = new Date(base)
234
+ d.setDate(d.getDate() + i)
235
+ labels.push(d.toLocaleDateString(locale, { weekday: 'short' }))
236
+ }
237
+ return labels
238
+ }
239
+
240
+ function getTimedItemStyle(
241
+ startValue: string,
242
+ endValue: string,
243
+ dayDate: Date,
244
+ dayStartHour: number,
245
+ dayEndHour: number,
246
+ slotDuration: number,
247
+ slotHeight: number,
248
+ requireSameDayEdge: boolean,
249
+ minimumHeight: number,
250
+ ): Record<string, string> | null {
251
+ const start = new Date(startValue)
252
+ const end = new Date(endValue)
253
+ if (requireSameDayEdge && !isSameDay(start, dayDate) && !isSameDay(end, dayDate)) return null
254
+
255
+ const dayStartMin = dayStartHour * 60
256
+ const startMin = Math.max(dateToMinutes(start), dayStartMin) - dayStartMin
257
+ const endMin = Math.min(dateToMinutes(end), dayEndHour * 60) - dayStartMin
258
+ const pixelsPerMin = slotHeight / slotDuration
259
+ return {
260
+ top: `${startMin * pixelsPerMin}px`,
261
+ height: `${Math.max((endMin - startMin) * pixelsPerMin, minimumHeight)}px`,
262
+ }
263
+ }
264
+
265
+ function eventsForDate(events: readonly ScheduleEvent[], date: Date): ScheduleEvent[] {
266
+ return events.filter((event) => isSameDay(new Date(event.start), date))
267
+ }
268
+
269
+ function dateToMinutes(date: Date): number {
270
+ return date.getHours() * 60 + date.getMinutes()
271
+ }
272
+
273
+ function getStatusClass(status?: ScheduleEventStatus): string {
274
+ if (!status) return 'mint-schedule__event--confirmed'
275
+ return `mint-schedule__event--${status}`
276
+ }
277
+
278
+ function getMonthStatusClass(status?: ScheduleEventStatus): string {
279
+ if (!status) return 'mint-schedule__month-event--confirmed'
280
+ return `mint-schedule__month-event--${status}`
281
+ }
282
+
283
+ function formatEventTime(event: ScheduleEvent): string {
284
+ const start = new Date(event.start)
285
+ const end = new Date(event.end)
286
+ return `${formatTime(start.getHours(), start.getMinutes())} - ${formatTime(end.getHours(), end.getMinutes())}`
287
+ }
@@ -6,7 +6,7 @@
6
6
  height: 100%;
7
7
  overflow: hidden;
8
8
  background-color: var(--bg-secondary);
9
- transition: width 180ms ease;
9
+ transition: width 180ms ease, background-color 150ms ease;
10
10
  }
11
11
 
12
12
  .mint-sidebar--hidden {
@@ -54,6 +54,11 @@
54
54
  gap: 0.75rem;
55
55
  }
56
56
 
57
+ .mint-sidebar--analysis.mint-sidebar--dense .mint-sidebar__sections {
58
+ padding: 0.75rem;
59
+ gap: 0.75rem;
60
+ }
61
+
57
62
  /* Header / Footer slots */
58
63
  .mint-sidebar__header {
59
64
  padding: 0.75rem;
@@ -182,6 +187,107 @@
182
187
  gap: 0.5rem;
183
188
  }
184
189
 
190
+ .mint-sidebar__collapsed--default {
191
+ padding-top: 0.75rem;
192
+ }
193
+
194
+ .mint-sidebar__rail-item {
195
+ position: relative;
196
+ display: inline-flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ width: 2rem;
200
+ height: 2rem;
201
+ border: 0;
202
+ border-radius: var(--radius-md);
203
+ color: var(--text-secondary);
204
+ background: transparent;
205
+ cursor: pointer;
206
+ transition:
207
+ background-color 150ms ease,
208
+ transform 150ms ease;
209
+ }
210
+
211
+ .mint-sidebar__rail-item:hover {
212
+ background: var(--bg-tertiary);
213
+ transform: translateY(-1px);
214
+ }
215
+
216
+ .mint-sidebar__rail-item:focus-visible {
217
+ outline: none;
218
+ box-shadow: var(--focus-ring);
219
+ }
220
+
221
+ .mint-sidebar__rail-icon {
222
+ display: inline-flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ width: 1.75rem;
226
+ height: 1.75rem;
227
+ border-radius: var(--radius-md);
228
+ transition: transform 150ms ease;
229
+ }
230
+
231
+ .mint-sidebar__rail-item:hover .mint-sidebar__rail-icon {
232
+ transform: scale(1.04);
233
+ }
234
+
235
+ .mint-sidebar__rail-svg {
236
+ width: 0.9375rem;
237
+ height: 0.9375rem;
238
+ }
239
+
240
+ .mint-sidebar__rail-text-icon {
241
+ font-size: 0.8125rem;
242
+ font-weight: 700;
243
+ line-height: 1;
244
+ }
245
+
246
+ .mint-sidebar__rail-badge {
247
+ position: absolute;
248
+ top: -0.25rem;
249
+ right: -0.25rem;
250
+ min-width: 1rem;
251
+ height: 1rem;
252
+ padding: 0 0.25rem;
253
+ border-radius: 9999px;
254
+ background: var(--mint-sidebar-rail-badge-color);
255
+ color: white;
256
+ font-size: 0.625rem;
257
+ font-weight: 700;
258
+ line-height: 1rem;
259
+ text-align: center;
260
+ font-variant-numeric: tabular-nums;
261
+ }
262
+
263
+ .mint-sidebar__rail-badge--primary {
264
+ --mint-sidebar-rail-badge-color: var(--color-primary);
265
+ }
266
+
267
+ .mint-sidebar__rail-badge--cta {
268
+ --mint-sidebar-rail-badge-color: var(--color-cta);
269
+ }
270
+
271
+ .mint-sidebar__rail-badge--success {
272
+ --mint-sidebar-rail-badge-color: var(--mint-success);
273
+ }
274
+
275
+ .mint-sidebar__rail-badge--warning {
276
+ --mint-sidebar-rail-badge-color: var(--mint-warning);
277
+ }
278
+
279
+ .mint-sidebar__rail-badge--error {
280
+ --mint-sidebar-rail-badge-color: var(--mint-error);
281
+ }
282
+
283
+ .mint-sidebar__rail-badge--info {
284
+ --mint-sidebar-rail-badge-color: var(--mint-info);
285
+ }
286
+
287
+ .mint-sidebar__rail-badge--neutral {
288
+ --mint-sidebar-rail-badge-color: var(--text-secondary);
289
+ }
290
+
185
291
  /* Dense sidebar variant — compact sections */
186
292
  .mint-sidebar--dense .mint-sidebar__sections {
187
293
  padding: 0.5rem;
@@ -202,24 +308,29 @@
202
308
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
203
309
  }
204
310
 
311
+ .mint-sidebar--analysis .mint-sidebar__sections > .mint-collapsible-card {
312
+ border-color: var(--border-color);
313
+ border-radius: var(--radius-lg);
314
+ }
315
+
205
316
  .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__header {
206
317
  padding: 0.625rem 0.75rem;
207
318
  min-height: auto;
208
319
  }
209
320
 
210
321
  .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__icon-badge {
211
- width: 2.25rem;
212
- height: 2.25rem;
322
+ width: 1.75rem;
323
+ height: 1.75rem;
213
324
  border-radius: var(--radius-md);
214
325
  }
215
326
 
216
327
  .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__icon {
217
- width: 1.125rem;
218
- height: 1.125rem;
328
+ width: 0.9375rem;
329
+ height: 0.9375rem;
219
330
  }
220
331
 
221
332
  .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__icon-text {
222
- font-size: 1.125rem;
333
+ font-size: 0.9375rem;
223
334
  }
224
335
 
225
336
  .mint-sidebar__sections > .mint-collapsible-card .mint-collapsible-card__title {
@@ -262,3 +373,20 @@
262
373
  flex-direction: column;
263
374
  gap: 0.75rem;
264
375
  }
376
+
377
+ .mint-sidebar__footer--collapsed {
378
+ padding: 0.5rem;
379
+ }
380
+
381
+ @media (prefers-reduced-motion: reduce) {
382
+ .mint-sidebar,
383
+ .mint-sidebar__rail-item,
384
+ .mint-sidebar__rail-icon {
385
+ transition: none;
386
+ }
387
+
388
+ .mint-sidebar__rail-item:hover,
389
+ .mint-sidebar__rail-item:hover .mint-sidebar__rail-icon {
390
+ transform: none;
391
+ }
392
+ }