@morscherlab/mint-sdk 1.0.0-alpha.7 → 1.0.0-alpha.9

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 (217) hide show
  1. package/README.md +15 -15
  2. package/dist/{auth-BYmxZdJl.js → auth-DsI0rQ7_.js} +6 -6
  3. package/dist/auth-DsI0rQ7_.js.map +1 -0
  4. package/dist/components/index.js +2 -2
  5. package/dist/{components-CKf-UpGi.js → components-CzbQQPCb.js} +1429 -1429
  6. package/dist/components-CzbQQPCb.js.map +1 -0
  7. package/dist/composables/index.js +2 -2
  8. package/dist/composables/usePlatformContext.d.ts +3 -3
  9. package/dist/{composables-D0QfFzq1.js → composables-BXklV5ii.js} +3 -3
  10. package/dist/{composables-D0QfFzq1.js.map → composables-BXklV5ii.js.map} +1 -1
  11. package/dist/index.js +4 -4
  12. package/dist/install.d.ts +3 -3
  13. package/dist/install.js +5 -5
  14. package/dist/install.js.map +1 -1
  15. package/dist/stores/auth.d.ts +1 -1
  16. package/dist/stores/index.js +1 -1
  17. package/dist/stores/settings.d.ts +1 -1
  18. package/dist/styles.css +5388 -5388
  19. package/dist/types/platform.d.ts +1 -1
  20. package/dist/{useScheduleDrag-DAJueTbK.js → useScheduleDrag-CxBeqYcu.js} +331 -331
  21. package/dist/useScheduleDrag-CxBeqYcu.js.map +1 -0
  22. package/package.json +2 -2
  23. package/src/__tests__/components/AppLayout.test.ts +23 -23
  24. package/src/__tests__/components/AppSidebar.test.ts +29 -29
  25. package/src/__tests__/components/AppTopBar.test.ts +45 -45
  26. package/src/__tests__/components/BaseInput.test.ts +2 -2
  27. package/src/__tests__/components/BasePill.test.ts +37 -37
  28. package/src/__tests__/components/Calendar.test.ts +52 -52
  29. package/src/__tests__/components/CollapsibleCard.test.ts +81 -81
  30. package/src/__tests__/components/DataFrame.test.ts +80 -80
  31. package/src/__tests__/components/DropdownButton.test.ts +80 -80
  32. package/src/__tests__/composables/usePlatformContext.test.ts +1 -1
  33. package/src/components/AlertBox.story.vue +1 -1
  34. package/src/components/AlertBox.vue +14 -14
  35. package/src/components/AppAvatarMenu.vue +26 -26
  36. package/src/components/AppContainer.vue +3 -3
  37. package/src/components/AppLayout.vue +7 -7
  38. package/src/components/AppPageSelector.vue +30 -30
  39. package/src/components/AppPillNav.vue +10 -10
  40. package/src/components/AppPluginSwitcher.vue +31 -31
  41. package/src/components/AppSidebar.vue +8 -8
  42. package/src/components/AppTopBar.story.vue +7 -7
  43. package/src/components/AppTopBar.vue +102 -102
  44. package/src/components/AuditTrail.vue +19 -19
  45. package/src/components/AutoGroupModal.vue +76 -76
  46. package/src/components/Avatar.vue +6 -6
  47. package/src/components/BaseButton.vue +6 -6
  48. package/src/components/BaseCheckbox.vue +9 -9
  49. package/src/components/BaseInput.vue +4 -4
  50. package/src/components/BaseModal.story.vue +1 -1
  51. package/src/components/BaseModal.vue +14 -14
  52. package/src/components/BasePill.vue +9 -9
  53. package/src/components/BaseRadioGroup.vue +21 -21
  54. package/src/components/BaseSelect.vue +6 -6
  55. package/src/components/BaseSlider.vue +8 -8
  56. package/src/components/BaseTabs.vue +7 -7
  57. package/src/components/BaseTextarea.vue +5 -5
  58. package/src/components/BaseToggle.vue +10 -10
  59. package/src/components/BatchProgressList.vue +25 -25
  60. package/src/components/Breadcrumb.vue +8 -8
  61. package/src/components/Calendar.vue +19 -19
  62. package/src/components/ChartContainer.vue +9 -9
  63. package/src/components/ChemicalFormula.vue +7 -7
  64. package/src/components/CollapsibleCard.vue +20 -20
  65. package/src/components/ColorSlider.vue +6 -6
  66. package/src/components/ConcentrationInput.vue +12 -12
  67. package/src/components/ConfirmDialog.story.vue +1 -1
  68. package/src/components/ConfirmDialog.vue +7 -7
  69. package/src/components/DataFrame.vue +40 -40
  70. package/src/components/DatePicker.vue +29 -29
  71. package/src/components/DateTimePicker.vue +41 -41
  72. package/src/components/Divider.vue +9 -9
  73. package/src/components/DoseCalculator.vue +66 -66
  74. package/src/components/DropdownButton.vue +19 -19
  75. package/src/components/EmptyState.vue +9 -9
  76. package/src/components/ExperimentCodeBadge.vue +3 -3
  77. package/src/components/ExperimentDataViewer.vue +25 -25
  78. package/src/components/ExperimentPopover.vue +35 -35
  79. package/src/components/ExperimentSelectorModal.vue +40 -40
  80. package/src/components/ExperimentTimeline.vue +48 -48
  81. package/src/components/FileUploader.vue +31 -31
  82. package/src/components/FitPanel.vue +9 -9
  83. package/src/components/FormActions.vue +1 -1
  84. package/src/components/FormBuilder.vue +2 -2
  85. package/src/components/FormField.vue +7 -7
  86. package/src/components/FormSection.vue +7 -7
  87. package/src/components/FormulaInput.vue +10 -10
  88. package/src/components/GroupAssigner.vue +40 -40
  89. package/src/components/GroupingModal.vue +45 -45
  90. package/src/components/IconButton.vue +6 -6
  91. package/src/components/LoadingSpinner.vue +5 -5
  92. package/src/components/MoleculeInput.vue +21 -21
  93. package/src/components/MultiSelect.vue +13 -13
  94. package/src/components/NumberInput.vue +13 -13
  95. package/src/components/PlateMapEditor.vue +63 -63
  96. package/src/components/ProgressBar.vue +18 -18
  97. package/src/components/ProtocolStepEditor.vue +57 -57
  98. package/src/components/RackEditor.vue +28 -28
  99. package/src/components/ReagentEditor.vue +61 -61
  100. package/src/components/ReagentList.vue +49 -49
  101. package/src/components/ResourceCard.vue +28 -28
  102. package/src/components/SampleHierarchyTree.vue +13 -13
  103. package/src/components/SampleLegend.vue +12 -12
  104. package/src/components/SampleSelector.vue +104 -104
  105. package/src/components/ScheduleCalendar.vue +42 -42
  106. package/src/components/ScientificNumber.vue +11 -11
  107. package/src/components/SegmentedControl.vue +12 -12
  108. package/src/components/SequenceInput.vue +32 -32
  109. package/src/components/SettingsButton.vue +5 -5
  110. package/src/components/SettingsModal.vue +17 -17
  111. package/src/components/StatusIndicator.vue +5 -5
  112. package/src/components/StepWizard.vue +16 -16
  113. package/src/components/TagsInput.vue +20 -20
  114. package/src/components/ThemeToggle.vue +3 -3
  115. package/src/components/TimePicker.vue +21 -21
  116. package/src/components/TimeRangeInput.vue +5 -5
  117. package/src/components/ToastNotification.vue +8 -8
  118. package/src/components/Tooltip.vue +7 -7
  119. package/src/components/UnitInput.vue +12 -12
  120. package/src/components/WellEditPopup.vue +28 -28
  121. package/src/components/WellPlate.vue +37 -37
  122. package/src/composables/useAppExperiment.ts +1 -1
  123. package/src/composables/usePlatformContext.ts +16 -16
  124. package/src/composables/useProtocolTemplates.ts +1 -1
  125. package/src/install.ts +3 -3
  126. package/src/stores/auth.ts +3 -3
  127. package/src/stores/settings.ts +2 -2
  128. package/src/styles/components/alert-box.css +30 -30
  129. package/src/styles/components/app-avatar-menu.css +23 -23
  130. package/src/styles/components/app-container.css +6 -6
  131. package/src/styles/components/app-layout.css +15 -15
  132. package/src/styles/components/app-page-selector.css +26 -26
  133. package/src/styles/components/app-pill-nav.css +7 -7
  134. package/src/styles/components/app-plugin-switcher.css +27 -27
  135. package/src/styles/components/app-sidebar.css +24 -24
  136. package/src/styles/components/app-top-bar.css +65 -65
  137. package/src/styles/components/audit-trail.css +29 -29
  138. package/src/styles/components/auto-group-modal.css +91 -91
  139. package/src/styles/components/avatar.css +15 -15
  140. package/src/styles/components/batch-progress-list.css +40 -40
  141. package/src/styles/components/breadcrumb.css +8 -8
  142. package/src/styles/components/button.css +31 -31
  143. package/src/styles/components/calendar.css +27 -27
  144. package/src/styles/components/chart-container.css +9 -9
  145. package/src/styles/components/checkbox.css +20 -20
  146. package/src/styles/components/chemical-formula.css +8 -8
  147. package/src/styles/components/collapsible-card.css +35 -35
  148. package/src/styles/components/color-slider.css +8 -8
  149. package/src/styles/components/concentration-input.css +27 -27
  150. package/src/styles/components/confirm-dialog.css +32 -32
  151. package/src/styles/components/dataframe.css +66 -66
  152. package/src/styles/components/date-picker.css +40 -40
  153. package/src/styles/components/datetime-picker.css +37 -37
  154. package/src/styles/components/divider.css +13 -13
  155. package/src/styles/components/dose-calculator.css +43 -43
  156. package/src/styles/components/dropdown-button.css +46 -46
  157. package/src/styles/components/empty-state.css +44 -44
  158. package/src/styles/components/experiment-code-badge.css +8 -8
  159. package/src/styles/components/experiment-data-viewer.css +23 -23
  160. package/src/styles/components/experiment-popover.css +97 -97
  161. package/src/styles/components/experiment-selector-modal.css +39 -39
  162. package/src/styles/components/experiment-timeline.css +98 -98
  163. package/src/styles/components/file-uploader.css +44 -44
  164. package/src/styles/components/fit-panel.css +12 -12
  165. package/src/styles/components/form-builder.css +11 -11
  166. package/src/styles/components/form-field.css +7 -7
  167. package/src/styles/components/formula-input.css +17 -17
  168. package/src/styles/components/group-assigner.css +26 -26
  169. package/src/styles/components/grouping-modal.css +51 -51
  170. package/src/styles/components/icon-button.css +41 -41
  171. package/src/styles/components/input.css +13 -13
  172. package/src/styles/components/loading-spinner.css +12 -12
  173. package/src/styles/components/modal.css +69 -69
  174. package/src/styles/components/molecule-input.css +27 -27
  175. package/src/styles/components/multi-select.css +23 -23
  176. package/src/styles/components/number-input.css +32 -32
  177. package/src/styles/components/pill.css +37 -37
  178. package/src/styles/components/plate-map-editor.css +67 -67
  179. package/src/styles/components/progress-bar.css +41 -41
  180. package/src/styles/components/protocol-step-editor.css +63 -63
  181. package/src/styles/components/rack-editor.css +34 -34
  182. package/src/styles/components/radio-group.css +41 -41
  183. package/src/styles/components/reagent-editor.css +70 -70
  184. package/src/styles/components/reagent-list.css +65 -65
  185. package/src/styles/components/resource-card.css +52 -52
  186. package/src/styles/components/sample-hierarchy-tree.css +56 -56
  187. package/src/styles/components/sample-legend.css +37 -37
  188. package/src/styles/components/sample-selector.css +121 -121
  189. package/src/styles/components/schedule-calendar.css +67 -67
  190. package/src/styles/components/scientific-number.css +11 -11
  191. package/src/styles/components/segmented-control.css +33 -33
  192. package/src/styles/components/select.css +11 -11
  193. package/src/styles/components/sequence-input.css +29 -29
  194. package/src/styles/components/settings-button.css +16 -16
  195. package/src/styles/components/settings-modal.css +14 -14
  196. package/src/styles/components/skeleton.css +2 -2
  197. package/src/styles/components/slider.css +10 -10
  198. package/src/styles/components/status-indicator.css +12 -12
  199. package/src/styles/components/step-wizard.css +32 -32
  200. package/src/styles/components/tabs.css +16 -16
  201. package/src/styles/components/tags-input.css +46 -46
  202. package/src/styles/components/textarea.css +17 -17
  203. package/src/styles/components/theme-toggle.css +13 -13
  204. package/src/styles/components/time-picker.css +28 -28
  205. package/src/styles/components/time-range-input.css +8 -8
  206. package/src/styles/components/toast.css +18 -18
  207. package/src/styles/components/toggle.css +27 -27
  208. package/src/styles/components/tooltip.css +18 -18
  209. package/src/styles/components/unit-input.css +25 -25
  210. package/src/styles/components/well-edit-popup.css +32 -32
  211. package/src/styles/components/well-plate.css +49 -49
  212. package/src/styles/index.css +1 -1
  213. package/src/styles/variables.css +3 -3
  214. package/src/types/platform.ts +6 -6
  215. package/dist/auth-BYmxZdJl.js.map +0 -1
  216. package/dist/components-CKf-UpGi.js.map +0 -1
  217. package/dist/useScheduleDrag-DAJueTbK.js.map +0 -1
@@ -195,22 +195,22 @@ function formatLevel(value: number): string {
195
195
 
196
196
  <template>
197
197
  <div
198
- class="mld-reagent-editor"
198
+ class="mint-reagent-editor"
199
199
  :style="{ '--reagent-color': modelValue.color }"
200
200
  >
201
201
  <!-- Identity -->
202
- <div class="mld-reagent-editor__section">
203
- <div class="mld-reagent-editor__identity">
204
- <label class="mld-reagent-editor__color-wrapper">
202
+ <div class="mint-reagent-editor__section">
203
+ <div class="mint-reagent-editor__identity">
204
+ <label class="mint-reagent-editor__color-wrapper">
205
205
  <input
206
206
  type="color"
207
207
  :value="modelValue.color"
208
- class="mld-reagent-editor__color-input"
208
+ class="mint-reagent-editor__color-input"
209
209
  aria-label="Reagent color"
210
210
  @input="updateColor"
211
211
  />
212
212
  <span
213
- class="mld-reagent-editor__color-swatch"
213
+ class="mint-reagent-editor__color-swatch"
214
214
  :style="{ backgroundColor: modelValue.color }"
215
215
  />
216
216
  </label>
@@ -218,7 +218,7 @@ function formatLevel(value: number): string {
218
218
  type="text"
219
219
  :value="modelValue.name"
220
220
  placeholder="Reagent name"
221
- class="mld-reagent-editor__name-input"
221
+ class="mint-reagent-editor__name-input"
222
222
  maxlength="64"
223
223
  aria-label="Reagent name"
224
224
  @input="updateName"
@@ -227,16 +227,16 @@ function formatLevel(value: number): string {
227
227
  </div>
228
228
 
229
229
  <!-- Position Mapping -->
230
- <div class="mld-reagent-editor__section">
231
- <div class="mld-reagent-editor__section-header">
232
- <svg class="mld-reagent-editor__section-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
230
+ <div class="mint-reagent-editor__section">
231
+ <div class="mint-reagent-editor__section-header">
232
+ <svg class="mint-reagent-editor__section-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
233
233
  <rect x="3" y="3" width="7" height="7" /><rect x="14" y="3" width="7" height="7" /><rect x="3" y="14" width="7" height="7" /><rect x="14" y="14" width="7" height="7" />
234
234
  </svg>
235
235
  Position
236
236
  </div>
237
- <div class="mld-reagent-editor__position-row">
238
- <div class="mld-reagent-editor__field mld-reagent-editor__field--flex">
239
- <label class="mld-reagent-editor__label">Axis</label>
237
+ <div class="mint-reagent-editor__position-row">
238
+ <div class="mint-reagent-editor__field mint-reagent-editor__field--flex">
239
+ <label class="mint-reagent-editor__label">Axis</label>
240
240
  <BaseSelect
241
241
  :model-value="modelValue.axis"
242
242
  :options="axisOptions"
@@ -244,22 +244,22 @@ function formatLevel(value: number): string {
244
244
  @update:model-value="updateAxis"
245
245
  />
246
246
  </div>
247
- <div class="mld-reagent-editor__field mld-reagent-editor__field--flex">
248
- <label class="mld-reagent-editor__label">Start</label>
247
+ <div class="mint-reagent-editor__field mint-reagent-editor__field--flex">
248
+ <label class="mint-reagent-editor__label">Start</label>
249
249
  <input
250
250
  type="text"
251
251
  :value="modelValue.startPosition"
252
252
  :placeholder="modelValue.axis === 'row' ? 'e.g. B' : 'e.g. 2'"
253
253
  :class="[
254
- 'mld-reagent-editor__inline-input',
255
- startPositionError ? 'mld-reagent-editor__inline-input--error' : '',
254
+ 'mint-reagent-editor__inline-input',
255
+ startPositionError ? 'mint-reagent-editor__inline-input--error' : '',
256
256
  ]"
257
257
  :maxlength="modelValue.axis === 'row' ? 1 : 2"
258
258
  :aria-invalid="!!startPositionError"
259
259
  aria-label="Start position"
260
260
  @input="updateStartPosition"
261
261
  />
262
- <span v-if="startPositionError" class="mld-reagent-editor__field-error">
262
+ <span v-if="startPositionError" class="mint-reagent-editor__field-error">
263
263
  {{ startPositionError }}
264
264
  </span>
265
265
  </div>
@@ -267,15 +267,15 @@ function formatLevel(value: number): string {
267
267
  </div>
268
268
 
269
269
  <!-- Series -->
270
- <div class="mld-reagent-editor__section">
271
- <div class="mld-reagent-editor__section-header">
272
- <svg class="mld-reagent-editor__section-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
270
+ <div class="mint-reagent-editor__section">
271
+ <div class="mint-reagent-editor__section-header">
272
+ <svg class="mint-reagent-editor__section-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
273
273
  <path d="M3 3v18h18" /><path d="m19 9-5 5-4-4-3 3" />
274
274
  </svg>
275
275
  Series
276
276
  <select
277
277
  :value="modelValue.unit"
278
- class="mld-reagent-editor__unit-select"
278
+ class="mint-reagent-editor__unit-select"
279
279
  @change="updateUnit"
280
280
  >
281
281
  <option v-for="u in units" :key="u" :value="u">{{ u }}</option>
@@ -283,23 +283,23 @@ function formatLevel(value: number): string {
283
283
  </div>
284
284
 
285
285
  <!-- Dilution generator -->
286
- <div class="mld-reagent-editor__generator">
287
- <div class="mld-reagent-editor__generator-inputs">
288
- <div class="mld-reagent-editor__field mld-reagent-editor__field--flex">
289
- <label class="mld-reagent-editor__label">Start</label>
286
+ <div class="mint-reagent-editor__generator">
287
+ <div class="mint-reagent-editor__generator-inputs">
288
+ <div class="mint-reagent-editor__field mint-reagent-editor__field--flex">
289
+ <label class="mint-reagent-editor__label">Start</label>
290
290
  <NumberInput v-model="generatorStart" :min="0" :step="10" size="sm" />
291
291
  </div>
292
- <div class="mld-reagent-editor__field mld-reagent-editor__field--flex">
293
- <label class="mld-reagent-editor__label">Doses</label>
292
+ <div class="mint-reagent-editor__field mint-reagent-editor__field--flex">
293
+ <label class="mint-reagent-editor__label">Doses</label>
294
294
  <NumberInput v-model="generatorCount" :min="2" :max="maxLevels" :step="1" size="sm" />
295
295
  </div>
296
296
  </div>
297
- <div class="mld-reagent-editor__presets">
297
+ <div class="mint-reagent-editor__presets">
298
298
  <button
299
299
  v-for="preset in presets"
300
300
  :key="preset.label"
301
301
  type="button"
302
- class="mld-reagent-editor__preset-btn"
302
+ class="mint-reagent-editor__preset-btn"
303
303
  @click="applyPreset(preset)"
304
304
  >
305
305
  {{ preset.label }}
@@ -308,7 +308,7 @@ function formatLevel(value: number): string {
308
308
  </div>
309
309
 
310
310
  <!-- Manual entry -->
311
- <div class="mld-reagent-editor__manual" @keydown="handleManualKeydown">
311
+ <div class="mint-reagent-editor__manual" @keydown="handleManualKeydown">
312
312
  <NumberInput
313
313
  v-model="manualValue"
314
314
  :min="0"
@@ -318,7 +318,7 @@ function formatLevel(value: number): string {
318
318
  />
319
319
  <button
320
320
  type="button"
321
- class="mld-reagent-editor__add-btn"
321
+ class="mint-reagent-editor__add-btn"
322
322
  :disabled="manualValue === undefined || manualValue < 0 || modelValue.levels.length >= maxLevels"
323
323
  aria-label="Add level"
324
324
  @click="addManualLevel"
@@ -330,23 +330,23 @@ function formatLevel(value: number): string {
330
330
  </div>
331
331
 
332
332
  <!-- Level table -->
333
- <div v-if="modelValue.levels.length > 0" class="mld-reagent-editor__table">
334
- <div class="mld-reagent-editor__table-header">
335
- <span class="mld-reagent-editor__table-col mld-reagent-editor__table-col--level">Level</span>
336
- <span class="mld-reagent-editor__table-col mld-reagent-editor__table-col--reps">Reps</span>
337
- <span class="mld-reagent-editor__table-col mld-reagent-editor__table-col--action" />
333
+ <div v-if="modelValue.levels.length > 0" class="mint-reagent-editor__table">
334
+ <div class="mint-reagent-editor__table-header">
335
+ <span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--level">Level</span>
336
+ <span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--reps">Reps</span>
337
+ <span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--action" />
338
338
  </div>
339
- <div class="mld-reagent-editor__table-body">
339
+ <div class="mint-reagent-editor__table-body">
340
340
  <div
341
341
  v-for="(level, i) in modelValue.levels"
342
342
  :key="level.value"
343
- class="mld-reagent-editor__table-row"
343
+ class="mint-reagent-editor__table-row"
344
344
  >
345
- <span class="mld-reagent-editor__table-col mld-reagent-editor__table-col--level">
346
- <span class="mld-reagent-editor__level-value">{{ formatLevel(level.value) }}</span>
347
- <span v-if="level.value !== 0" class="mld-reagent-editor__level-unit">{{ modelValue.unit }}</span>
345
+ <span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--level">
346
+ <span class="mint-reagent-editor__level-value">{{ formatLevel(level.value) }}</span>
347
+ <span v-if="level.value !== 0" class="mint-reagent-editor__level-unit">{{ modelValue.unit }}</span>
348
348
  </span>
349
- <span class="mld-reagent-editor__table-col mld-reagent-editor__table-col--reps">
349
+ <span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--reps">
350
350
  <NumberInput
351
351
  :model-value="level.replicates"
352
352
  :min="1"
@@ -356,10 +356,10 @@ function formatLevel(value: number): string {
356
356
  @update:model-value="updateLevelReplicates(i, $event)"
357
357
  />
358
358
  </span>
359
- <span class="mld-reagent-editor__table-col mld-reagent-editor__table-col--action">
359
+ <span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--action">
360
360
  <button
361
361
  type="button"
362
- class="mld-reagent-editor__remove-level-btn"
362
+ class="mint-reagent-editor__remove-level-btn"
363
363
  aria-label="Remove level"
364
364
  @click="removeLevel(i)"
365
365
  >
@@ -372,7 +372,7 @@ function formatLevel(value: number): string {
372
372
  </div>
373
373
  </div>
374
374
 
375
- <div v-else class="mld-reagent-editor__empty">
375
+ <div v-else class="mint-reagent-editor__empty">
376
376
  Use a preset above or add levels manually
377
377
  </div>
378
378
  </div>
@@ -381,31 +381,31 @@ function formatLevel(value: number): string {
381
381
  <div
382
382
  v-if="modelValue.levels.length > 0 && modelValue.startPosition && !startPositionError"
383
383
  :class="[
384
- 'mld-reagent-editor__summary',
385
- positionOverflows ? 'mld-reagent-editor__summary--overflow' : '',
384
+ 'mint-reagent-editor__summary',
385
+ positionOverflows ? 'mint-reagent-editor__summary--overflow' : '',
386
386
  ]"
387
387
  >
388
- <div class="mld-reagent-editor__summary-item">
389
- <span class="mld-reagent-editor__summary-value">{{ modelValue.levels.length }}</span>
390
- <span class="mld-reagent-editor__summary-label">levels</span>
388
+ <div class="mint-reagent-editor__summary-item">
389
+ <span class="mint-reagent-editor__summary-value">{{ modelValue.levels.length }}</span>
390
+ <span class="mint-reagent-editor__summary-label">levels</span>
391
391
  </div>
392
- <div class="mld-reagent-editor__summary-dot" />
393
- <div class="mld-reagent-editor__summary-item">
394
- <span class="mld-reagent-editor__summary-value">{{ positionCount }}</span>
395
- <span class="mld-reagent-editor__summary-label">positions</span>
392
+ <div class="mint-reagent-editor__summary-dot" />
393
+ <div class="mint-reagent-editor__summary-item">
394
+ <span class="mint-reagent-editor__summary-value">{{ positionCount }}</span>
395
+ <span class="mint-reagent-editor__summary-label">positions</span>
396
396
  </div>
397
- <div v-if="positionRange" class="mld-reagent-editor__summary-dot" />
398
- <div v-if="positionRange" class="mld-reagent-editor__summary-item">
399
- <span class="mld-reagent-editor__summary-value">{{ positionRange }}</span>
400
- <span class="mld-reagent-editor__summary-label">{{ modelValue.axis === 'row' ? 'rows' : 'cols' }}</span>
397
+ <div v-if="positionRange" class="mint-reagent-editor__summary-dot" />
398
+ <div v-if="positionRange" class="mint-reagent-editor__summary-item">
399
+ <span class="mint-reagent-editor__summary-value">{{ positionRange }}</span>
400
+ <span class="mint-reagent-editor__summary-label">{{ modelValue.axis === 'row' ? 'rows' : 'cols' }}</span>
401
401
  </div>
402
- <span v-if="positionOverflows" class="mld-reagent-editor__summary-warning">
402
+ <span v-if="positionOverflows" class="mint-reagent-editor__summary-warning">
403
403
  Exceeds plate
404
404
  </span>
405
405
  </div>
406
406
 
407
407
  <!-- Remove -->
408
- <div class="mld-reagent-editor__footer">
408
+ <div class="mint-reagent-editor__footer">
409
409
  <BaseButton variant="danger" size="sm" @click="emit('remove')">
410
410
  Remove Reagent
411
411
  </BaseButton>
@@ -142,18 +142,18 @@ function getStockLevel(reagent: Reagent): number {
142
142
  }
143
143
 
144
144
  function getStockFillClass(level: number): string {
145
- if (level >= 50) return 'mld-reagent-list__stock-fill--good'
146
- if (level >= 20) return 'mld-reagent-list__stock-fill--warning'
147
- return 'mld-reagent-list__stock-fill--low'
145
+ if (level >= 50) return 'mint-reagent-list__stock-fill--good'
146
+ if (level >= 20) return 'mint-reagent-list__stock-fill--warning'
147
+ return 'mint-reagent-list__stock-fill--low'
148
148
  }
149
149
 
150
150
  function getRowClass(reagent: Reagent): string[] {
151
- const classes: string[] = ['mld-reagent-list__row']
152
- if (isExpired(reagent)) classes.push('mld-reagent-list__row--expired')
153
- else if (isExpiringSoon(reagent)) classes.push('mld-reagent-list__row--expiring-soon')
154
- if (isLowStock(reagent)) classes.push('mld-reagent-list__row--low-stock')
155
- if (draggedId.value === reagent.id) classes.push('mld-reagent-list__row--dragging')
156
- if (dragOverId.value === reagent.id) classes.push('mld-reagent-list__row--drag-over')
151
+ const classes: string[] = ['mint-reagent-list__row']
152
+ if (isExpired(reagent)) classes.push('mint-reagent-list__row--expired')
153
+ else if (isExpiringSoon(reagent)) classes.push('mint-reagent-list__row--expiring-soon')
154
+ if (isLowStock(reagent)) classes.push('mint-reagent-list__row--low-stock')
155
+ if (draggedId.value === reagent.id) classes.push('mint-reagent-list__row--dragging')
156
+ if (dragOverId.value === reagent.id) classes.push('mint-reagent-list__row--drag-over')
157
157
  return classes
158
158
  }
159
159
 
@@ -233,18 +233,18 @@ function handleDragEnd() {
233
233
  </script>
234
234
 
235
235
  <template>
236
- <div class="mld-reagent-list">
236
+ <div class="mint-reagent-list">
237
237
  <!-- Header -->
238
- <div class="mld-reagent-list__header">
238
+ <div class="mint-reagent-list__header">
239
239
  <!-- Search -->
240
- <div v-if="searchable" class="mld-reagent-list__search">
241
- <svg class="mld-reagent-list__search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
240
+ <div v-if="searchable" class="mint-reagent-list__search">
241
+ <svg class="mint-reagent-list__search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
242
242
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
243
243
  </svg>
244
244
  <input
245
245
  v-model="searchQuery"
246
246
  type="text"
247
- class="mld-reagent-list__search-input"
247
+ class="mint-reagent-list__search-input"
248
248
  placeholder="Search reagents..."
249
249
  />
250
250
  </div>
@@ -253,7 +253,7 @@ function handleDragEnd() {
253
253
  <button
254
254
  v-if="!readonly"
255
255
  type="button"
256
- class="mld-reagent-list__add-btn"
256
+ class="mint-reagent-list__add-btn"
257
257
  @click="handleAdd"
258
258
  >
259
259
  <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -264,22 +264,22 @@ function handleDragEnd() {
264
264
  </div>
265
265
 
266
266
  <!-- Table -->
267
- <table v-if="filteredReagents.length > 0" class="mld-reagent-list__table">
267
+ <table v-if="filteredReagents.length > 0" class="mint-reagent-list__table">
268
268
  <thead>
269
269
  <tr>
270
270
  <th v-if="sortable && !readonly" style="width: 24px" />
271
271
  <th
272
272
  v-for="col in columns"
273
273
  :key="col"
274
- :class="[sortable ? 'mld-reagent-list__col--sortable' : '']"
274
+ :class="[sortable ? 'mint-reagent-list__col--sortable' : '']"
275
275
  @click="handleSort(col)"
276
276
  >
277
277
  {{ columnLabels[col] }}
278
278
  <svg
279
279
  v-if="sortable"
280
280
  :class="[
281
- 'mld-reagent-list__sort-icon',
282
- sortColumn === col ? 'mld-reagent-list__sort-icon--active' : '',
281
+ 'mint-reagent-list__sort-icon',
282
+ sortColumn === col ? 'mint-reagent-list__sort-icon--active' : '',
283
283
  ]"
284
284
  fill="none"
285
285
  stroke="currentColor"
@@ -318,19 +318,19 @@ function handleDragEnd() {
318
318
  >
319
319
  <!-- Drag handle -->
320
320
  <td v-if="sortable && !readonly">
321
- <svg class="mld-reagent-list__drag-handle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
321
+ <svg class="mint-reagent-list__drag-handle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
322
322
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8h16M4 16h16" />
323
323
  </svg>
324
324
  </td>
325
325
 
326
326
  <!-- Name -->
327
- <td v-if="columns.includes('name')" class="mld-reagent-list__cell mld-reagent-list__cell--name">
327
+ <td v-if="columns.includes('name')" class="mint-reagent-list__cell mint-reagent-list__cell--name">
328
328
  <a
329
329
  v-if="reagent.url"
330
330
  :href="reagent.url"
331
331
  target="_blank"
332
332
  rel="noopener noreferrer"
333
- class="mld-reagent-list__link"
333
+ class="mint-reagent-list__link"
334
334
  >
335
335
  {{ reagent.name }}
336
336
  </a>
@@ -338,21 +338,21 @@ function handleDragEnd() {
338
338
  </td>
339
339
 
340
340
  <!-- Catalog number -->
341
- <td v-if="columns.includes('catalog')" class="mld-reagent-list__cell mld-reagent-list__cell--muted">
341
+ <td v-if="columns.includes('catalog')" class="mint-reagent-list__cell mint-reagent-list__cell--muted">
342
342
  {{ reagent.catalogNumber || '-' }}
343
343
  </td>
344
344
 
345
345
  <!-- Lot number -->
346
- <td v-if="columns.includes('lot')" class="mld-reagent-list__cell mld-reagent-list__cell--muted">
346
+ <td v-if="columns.includes('lot')" class="mint-reagent-list__cell mint-reagent-list__cell--muted">
347
347
  {{ reagent.lotNumber || '-' }}
348
348
  </td>
349
349
 
350
350
  <!-- Expiry -->
351
- <td v-if="columns.includes('expiry')" class="mld-reagent-list__cell">
352
- <span v-if="isExpired(reagent)" class="mld-reagent-list__expired-text">
351
+ <td v-if="columns.includes('expiry')" class="mint-reagent-list__cell">
352
+ <span v-if="isExpired(reagent)" class="mint-reagent-list__expired-text">
353
353
  {{ formatExpiryDate(reagent.expiryDate) }}
354
354
  </span>
355
- <span v-else-if="isExpiringSoon(reagent)" class="mld-reagent-list__expiring-text">
355
+ <span v-else-if="isExpiringSoon(reagent)" class="mint-reagent-list__expiring-text">
356
356
  {{ formatExpiryDate(reagent.expiryDate) }}
357
357
  </span>
358
358
  <span v-else>
@@ -360,14 +360,14 @@ function handleDragEnd() {
360
360
  </span>
361
361
 
362
362
  <!-- Expiry badge -->
363
- <span v-if="isExpired(reagent)" class="mld-reagent-list__badge mld-reagent-list__badge--error">
364
- <svg class="mld-reagent-list__badge-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
363
+ <span v-if="isExpired(reagent)" class="mint-reagent-list__badge mint-reagent-list__badge--error">
364
+ <svg class="mint-reagent-list__badge-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
365
365
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
366
366
  </svg>
367
367
  Expired
368
368
  </span>
369
- <span v-else-if="isExpiringSoon(reagent)" class="mld-reagent-list__badge mld-reagent-list__badge--warning">
370
- <svg class="mld-reagent-list__badge-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
369
+ <span v-else-if="isExpiringSoon(reagent)" class="mint-reagent-list__badge mint-reagent-list__badge--warning">
370
+ <svg class="mint-reagent-list__badge-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
371
371
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
372
372
  </svg>
373
373
  Soon
@@ -375,47 +375,47 @@ function handleDragEnd() {
375
375
  </td>
376
376
 
377
377
  <!-- Storage -->
378
- <td v-if="columns.includes('storage')" class="mld-reagent-list__cell">
378
+ <td v-if="columns.includes('storage')" class="mint-reagent-list__cell">
379
379
  <span
380
380
  v-if="reagent.storageCondition"
381
- :class="['mld-reagent-list__storage', `mld-reagent-list__storage--${reagent.storageCondition}`]"
381
+ :class="['mint-reagent-list__storage', `mint-reagent-list__storage--${reagent.storageCondition}`]"
382
382
  >
383
383
  {{ reagent.storageCondition }}
384
384
  </span>
385
- <span v-else class="mld-reagent-list__cell--muted">-</span>
385
+ <span v-else class="mint-reagent-list__cell--muted">-</span>
386
386
  </td>
387
387
 
388
388
  <!-- Location -->
389
- <td v-if="columns.includes('location')" class="mld-reagent-list__cell mld-reagent-list__cell--muted">
389
+ <td v-if="columns.includes('location')" class="mint-reagent-list__cell mint-reagent-list__cell--muted">
390
390
  {{ reagent.location || '-' }}
391
391
  </td>
392
392
 
393
393
  <!-- Stock -->
394
- <td v-if="columns.includes('stock') && showStockLevel" class="mld-reagent-list__cell">
395
- <div v-if="reagent.stockLevel !== undefined" class="mld-reagent-list__stock">
396
- <div class="mld-reagent-list__stock-bar">
394
+ <td v-if="columns.includes('stock') && showStockLevel" class="mint-reagent-list__cell">
395
+ <div v-if="reagent.stockLevel !== undefined" class="mint-reagent-list__stock">
396
+ <div class="mint-reagent-list__stock-bar">
397
397
  <div
398
- :class="['mld-reagent-list__stock-fill', getStockFillClass(getStockLevel(reagent))]"
398
+ :class="['mint-reagent-list__stock-fill', getStockFillClass(getStockLevel(reagent))]"
399
399
  :style="{ width: `${Math.min(100, getStockLevel(reagent))}%` }"
400
400
  />
401
401
  </div>
402
- <span class="mld-reagent-list__stock-text">
402
+ <span class="mint-reagent-list__stock-text">
403
403
  {{ getStockLevel(reagent) }}%
404
404
  </span>
405
405
  </div>
406
- <span v-else class="mld-reagent-list__cell--muted">-</span>
406
+ <span v-else class="mint-reagent-list__cell--muted">-</span>
407
407
  </td>
408
408
 
409
409
  <!-- Supplier -->
410
- <td v-if="columns.includes('supplier')" class="mld-reagent-list__cell mld-reagent-list__cell--muted">
410
+ <td v-if="columns.includes('supplier')" class="mint-reagent-list__cell mint-reagent-list__cell--muted">
411
411
  {{ reagent.supplier || '-' }}
412
412
  </td>
413
413
 
414
414
  <!-- Actions -->
415
- <td v-if="!readonly" class="mld-reagent-list__cell mld-reagent-list__cell--actions">
415
+ <td v-if="!readonly" class="mint-reagent-list__cell mint-reagent-list__cell--actions">
416
416
  <button
417
417
  type="button"
418
- class="mld-reagent-list__action-btn"
418
+ class="mint-reagent-list__action-btn"
419
419
  aria-label="Edit"
420
420
  @click="handleEdit(reagent)"
421
421
  >
@@ -425,7 +425,7 @@ function handleDragEnd() {
425
425
  </button>
426
426
  <button
427
427
  type="button"
428
- class="mld-reagent-list__action-btn mld-reagent-list__action-btn--danger"
428
+ class="mint-reagent-list__action-btn mint-reagent-list__action-btn--danger"
429
429
  aria-label="Remove"
430
430
  @click="handleRemove(reagent.id)"
431
431
  >
@@ -439,17 +439,17 @@ function handleDragEnd() {
439
439
  </table>
440
440
 
441
441
  <!-- Empty state -->
442
- <div v-else class="mld-reagent-list__empty">
443
- <svg class="mld-reagent-list__empty-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
442
+ <div v-else class="mint-reagent-list__empty">
443
+ <svg class="mint-reagent-list__empty-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
444
444
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z" />
445
445
  </svg>
446
- <p class="mld-reagent-list__empty-text">
446
+ <p class="mint-reagent-list__empty-text">
447
447
  {{ searchQuery ? 'No reagents found' : 'No reagents added yet' }}
448
448
  </p>
449
449
  <button
450
450
  v-if="!readonly && !searchQuery"
451
451
  type="button"
452
- class="mld-reagent-list__empty-btn"
452
+ class="mint-reagent-list__empty-btn"
453
453
  @click="handleAdd"
454
454
  >
455
455
  Add Reagent
@@ -43,9 +43,9 @@ const defaultStatusLabels: Record<ResourceStatus, string> = {
43
43
  const displayStatusLabel = computed(() => props.statusLabel ?? defaultStatusLabels[props.status])
44
44
 
45
45
  const cardClasses = computed(() => [
46
- 'mld-resource-card',
47
- `mld-resource-card--${props.size}`,
48
- { 'mld-resource-card--compact': props.compact },
46
+ 'mint-resource-card',
47
+ `mint-resource-card--${props.size}`,
48
+ { 'mint-resource-card--compact': props.compact },
49
49
  ])
50
50
 
51
51
  function handleBook(event: MouseEvent) {
@@ -62,12 +62,12 @@ function handleClick() {
62
62
  <!-- Compact mode -->
63
63
  <div v-if="compact" :class="cardClasses" @click="handleClick">
64
64
  <slot name="status">
65
- <span :class="['mld-resource-card__status-dot', `mld-resource-card__status-dot--${status}`]" />
65
+ <span :class="['mint-resource-card__status-dot', `mint-resource-card__status-dot--${status}`]" />
66
66
  </slot>
67
67
 
68
- <span class="mld-resource-card__name">{{ name }}</span>
68
+ <span class="mint-resource-card__name">{{ name }}</span>
69
69
 
70
- <span :class="['mld-resource-card__status-label', `mld-resource-card__status-label--${status}`]">
70
+ <span :class="['mint-resource-card__status-label', `mint-resource-card__status-label--${status}`]">
71
71
  {{ displayStatusLabel }}
72
72
  </span>
73
73
 
@@ -75,7 +75,7 @@ function handleClick() {
75
75
  <button
76
76
  v-if="showBookAction"
77
77
  type="button"
78
- class="mld-resource-card__book-btn"
78
+ class="mint-resource-card__book-btn"
79
79
  @click="handleBook"
80
80
  >
81
81
  Book
@@ -85,13 +85,13 @@ function handleClick() {
85
85
 
86
86
  <!-- Card mode -->
87
87
  <div v-else :class="cardClasses" @click="handleClick">
88
- <div class="mld-resource-card__content">
89
- <div class="mld-resource-card__header">
88
+ <div class="mint-resource-card__content">
89
+ <div class="mint-resource-card__header">
90
90
  <!-- Image / fallback -->
91
- <div class="mld-resource-card__image">
91
+ <div class="mint-resource-card__image">
92
92
  <slot name="image">
93
93
  <img v-if="image" :src="image" :alt="name" />
94
- <div v-else class="mld-resource-card__image-fallback">
94
+ <div v-else class="mint-resource-card__image-fallback">
95
95
  <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
96
96
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714a2.25 2.25 0 00.659 1.591L19 14.5M14.25 3.104c.251.023.501.05.75.082M19 14.5l-2.47 2.47a2.25 2.25 0 00-.659 1.59V21a.75.75 0 01-.75.75h-6.24a.75.75 0 01-.75-.75v-2.44a2.25 2.25 0 00-.659-1.59L5 14.5m14 0h-2.25m-10.5 0H4" />
97
97
  </svg>
@@ -100,48 +100,48 @@ function handleClick() {
100
100
  </div>
101
101
 
102
102
  <!-- Body -->
103
- <div class="mld-resource-card__body">
104
- <div class="mld-resource-card__title-row">
105
- <h3 class="mld-resource-card__name">{{ name }}</h3>
103
+ <div class="mint-resource-card__body">
104
+ <div class="mint-resource-card__title-row">
105
+ <h3 class="mint-resource-card__name">{{ name }}</h3>
106
106
 
107
107
  <slot name="status">
108
- <div class="mld-resource-card__status">
109
- <span :class="['mld-resource-card__status-dot', `mld-resource-card__status-dot--${status}`]" />
110
- <span class="mld-resource-card__status-label">{{ displayStatusLabel }}</span>
108
+ <div class="mint-resource-card__status">
109
+ <span :class="['mint-resource-card__status-dot', `mint-resource-card__status-dot--${status}`]" />
110
+ <span class="mint-resource-card__status-label">{{ displayStatusLabel }}</span>
111
111
  </div>
112
112
  </slot>
113
113
  </div>
114
114
 
115
- <p v-if="description" class="mld-resource-card__description">{{ description }}</p>
115
+ <p v-if="description" class="mint-resource-card__description">{{ description }}</p>
116
116
 
117
- <p v-if="location" class="mld-resource-card__location">Location: {{ location }}</p>
117
+ <p v-if="location" class="mint-resource-card__location">Location: {{ location }}</p>
118
118
 
119
- <p v-if="nextAvailable" class="mld-resource-card__next-available">Next available: {{ nextAvailable }}</p>
119
+ <p v-if="nextAvailable" class="mint-resource-card__next-available">Next available: {{ nextAvailable }}</p>
120
120
  </div>
121
121
  </div>
122
122
 
123
123
  <!-- Specs -->
124
- <div v-if="specs.length > 0 || $slots.specs" class="mld-resource-card__specs">
124
+ <div v-if="specs.length > 0 || $slots.specs" class="mint-resource-card__specs">
125
125
  <slot name="specs">
126
- <div v-for="spec in specs" :key="spec.label" class="mld-resource-card__spec">
127
- <span class="mld-resource-card__spec-label">{{ spec.label }}</span>
128
- <span class="mld-resource-card__spec-value">{{ spec.value }}</span>
126
+ <div v-for="spec in specs" :key="spec.label" class="mint-resource-card__spec">
127
+ <span class="mint-resource-card__spec-label">{{ spec.label }}</span>
128
+ <span class="mint-resource-card__spec-value">{{ spec.value }}</span>
129
129
  </div>
130
130
  </slot>
131
131
  </div>
132
132
 
133
133
  <!-- Tags + action -->
134
- <div v-if="tags.length > 0 || showBookAction || $slots.action" class="mld-resource-card__footer">
135
- <div class="mld-resource-card__tags">
134
+ <div v-if="tags.length > 0 || showBookAction || $slots.action" class="mint-resource-card__footer">
135
+ <div class="mint-resource-card__tags">
136
136
  <BasePill v-for="tag in tags" :key="tag" size="sm">{{ tag }}</BasePill>
137
137
  </div>
138
138
 
139
- <div class="mld-resource-card__action">
139
+ <div class="mint-resource-card__action">
140
140
  <slot name="action">
141
141
  <button
142
142
  v-if="showBookAction"
143
143
  type="button"
144
- class="mld-resource-card__book-btn"
144
+ class="mint-resource-card__book-btn"
145
145
  @click="handleBook"
146
146
  >
147
147
  Book Now