@morscherlab/mint-sdk 1.0.0-alpha.8 → 1.0.0-beta.1
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.
- package/README.md +15 -15
- package/dist/{auth-BYmxZdJl.js → auth-DsI0rQ7_.js} +6 -6
- package/dist/auth-DsI0rQ7_.js.map +1 -0
- package/dist/components/index.js +2 -2
- package/dist/{components-CKf-UpGi.js → components-CzbQQPCb.js} +1429 -1429
- package/dist/components-CzbQQPCb.js.map +1 -0
- package/dist/composables/index.js +2 -2
- package/dist/composables/usePlatformContext.d.ts +3 -3
- package/dist/{composables-D0QfFzq1.js → composables-BXklV5ii.js} +3 -3
- package/dist/{composables-D0QfFzq1.js.map → composables-BXklV5ii.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/install.d.ts +3 -3
- package/dist/install.js +5 -5
- package/dist/install.js.map +1 -1
- package/dist/stores/auth.d.ts +1 -1
- package/dist/stores/index.js +1 -1
- package/dist/stores/settings.d.ts +1 -1
- package/dist/styles.css +5388 -5388
- package/dist/types/platform.d.ts +1 -1
- package/dist/{useScheduleDrag-DAJueTbK.js → useScheduleDrag-CxBeqYcu.js} +331 -331
- package/dist/useScheduleDrag-CxBeqYcu.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/components/AppLayout.test.ts +23 -23
- package/src/__tests__/components/AppSidebar.test.ts +29 -29
- package/src/__tests__/components/AppTopBar.test.ts +45 -45
- package/src/__tests__/components/BaseInput.test.ts +2 -2
- package/src/__tests__/components/BasePill.test.ts +37 -37
- package/src/__tests__/components/Calendar.test.ts +52 -52
- package/src/__tests__/components/CollapsibleCard.test.ts +81 -81
- package/src/__tests__/components/DataFrame.test.ts +80 -80
- package/src/__tests__/components/DropdownButton.test.ts +80 -80
- package/src/__tests__/composables/usePlatformContext.test.ts +1 -1
- package/src/components/AlertBox.story.vue +1 -1
- package/src/components/AlertBox.vue +14 -14
- package/src/components/AppAvatarMenu.vue +26 -26
- package/src/components/AppContainer.vue +3 -3
- package/src/components/AppLayout.vue +7 -7
- package/src/components/AppPageSelector.vue +30 -30
- package/src/components/AppPillNav.vue +10 -10
- package/src/components/AppPluginSwitcher.vue +31 -31
- package/src/components/AppSidebar.vue +8 -8
- package/src/components/AppTopBar.story.vue +7 -7
- package/src/components/AppTopBar.vue +102 -102
- package/src/components/AuditTrail.vue +19 -19
- package/src/components/AutoGroupModal.vue +76 -76
- package/src/components/Avatar.vue +6 -6
- package/src/components/BaseButton.vue +6 -6
- package/src/components/BaseCheckbox.vue +9 -9
- package/src/components/BaseInput.vue +4 -4
- package/src/components/BaseModal.story.vue +1 -1
- package/src/components/BaseModal.vue +14 -14
- package/src/components/BasePill.vue +9 -9
- package/src/components/BaseRadioGroup.vue +21 -21
- package/src/components/BaseSelect.vue +6 -6
- package/src/components/BaseSlider.vue +8 -8
- package/src/components/BaseTabs.vue +7 -7
- package/src/components/BaseTextarea.vue +5 -5
- package/src/components/BaseToggle.vue +10 -10
- package/src/components/BatchProgressList.vue +25 -25
- package/src/components/Breadcrumb.vue +8 -8
- package/src/components/Calendar.vue +19 -19
- package/src/components/ChartContainer.vue +9 -9
- package/src/components/ChemicalFormula.vue +7 -7
- package/src/components/CollapsibleCard.vue +20 -20
- package/src/components/ColorSlider.vue +6 -6
- package/src/components/ConcentrationInput.vue +12 -12
- package/src/components/ConfirmDialog.story.vue +1 -1
- package/src/components/ConfirmDialog.vue +7 -7
- package/src/components/DataFrame.vue +40 -40
- package/src/components/DatePicker.vue +29 -29
- package/src/components/DateTimePicker.vue +41 -41
- package/src/components/Divider.vue +9 -9
- package/src/components/DoseCalculator.vue +66 -66
- package/src/components/DropdownButton.vue +19 -19
- package/src/components/EmptyState.vue +9 -9
- package/src/components/ExperimentCodeBadge.vue +3 -3
- package/src/components/ExperimentDataViewer.vue +25 -25
- package/src/components/ExperimentPopover.vue +35 -35
- package/src/components/ExperimentSelectorModal.vue +40 -40
- package/src/components/ExperimentTimeline.vue +48 -48
- package/src/components/FileUploader.vue +31 -31
- package/src/components/FitPanel.vue +9 -9
- package/src/components/FormActions.vue +1 -1
- package/src/components/FormBuilder.vue +2 -2
- package/src/components/FormField.vue +7 -7
- package/src/components/FormSection.vue +7 -7
- package/src/components/FormulaInput.vue +10 -10
- package/src/components/GroupAssigner.vue +40 -40
- package/src/components/GroupingModal.vue +45 -45
- package/src/components/IconButton.vue +6 -6
- package/src/components/LoadingSpinner.vue +5 -5
- package/src/components/MoleculeInput.vue +21 -21
- package/src/components/MultiSelect.vue +13 -13
- package/src/components/NumberInput.vue +13 -13
- package/src/components/PlateMapEditor.vue +63 -63
- package/src/components/ProgressBar.vue +18 -18
- package/src/components/ProtocolStepEditor.vue +57 -57
- package/src/components/RackEditor.vue +28 -28
- package/src/components/ReagentEditor.vue +61 -61
- package/src/components/ReagentList.vue +49 -49
- package/src/components/ResourceCard.vue +28 -28
- package/src/components/SampleHierarchyTree.vue +13 -13
- package/src/components/SampleLegend.vue +12 -12
- package/src/components/SampleSelector.vue +104 -104
- package/src/components/ScheduleCalendar.vue +42 -42
- package/src/components/ScientificNumber.vue +11 -11
- package/src/components/SegmentedControl.vue +12 -12
- package/src/components/SequenceInput.vue +32 -32
- package/src/components/SettingsButton.vue +5 -5
- package/src/components/SettingsModal.vue +17 -17
- package/src/components/StatusIndicator.vue +5 -5
- package/src/components/StepWizard.vue +16 -16
- package/src/components/TagsInput.vue +20 -20
- package/src/components/ThemeToggle.vue +3 -3
- package/src/components/TimePicker.vue +21 -21
- package/src/components/TimeRangeInput.vue +5 -5
- package/src/components/ToastNotification.vue +8 -8
- package/src/components/Tooltip.vue +7 -7
- package/src/components/UnitInput.vue +12 -12
- package/src/components/WellEditPopup.vue +28 -28
- package/src/components/WellPlate.vue +37 -37
- package/src/composables/useAppExperiment.ts +1 -1
- package/src/composables/usePlatformContext.ts +16 -16
- package/src/composables/useProtocolTemplates.ts +1 -1
- package/src/install.ts +3 -3
- package/src/stores/auth.ts +3 -3
- package/src/stores/settings.ts +2 -2
- package/src/styles/components/alert-box.css +30 -30
- package/src/styles/components/app-avatar-menu.css +23 -23
- package/src/styles/components/app-container.css +6 -6
- package/src/styles/components/app-layout.css +15 -15
- package/src/styles/components/app-page-selector.css +26 -26
- package/src/styles/components/app-pill-nav.css +7 -7
- package/src/styles/components/app-plugin-switcher.css +27 -27
- package/src/styles/components/app-sidebar.css +24 -24
- package/src/styles/components/app-top-bar.css +65 -65
- package/src/styles/components/audit-trail.css +29 -29
- package/src/styles/components/auto-group-modal.css +91 -91
- package/src/styles/components/avatar.css +15 -15
- package/src/styles/components/batch-progress-list.css +40 -40
- package/src/styles/components/breadcrumb.css +8 -8
- package/src/styles/components/button.css +31 -31
- package/src/styles/components/calendar.css +27 -27
- package/src/styles/components/chart-container.css +9 -9
- package/src/styles/components/checkbox.css +20 -20
- package/src/styles/components/chemical-formula.css +8 -8
- package/src/styles/components/collapsible-card.css +35 -35
- package/src/styles/components/color-slider.css +8 -8
- package/src/styles/components/concentration-input.css +27 -27
- package/src/styles/components/confirm-dialog.css +32 -32
- package/src/styles/components/dataframe.css +66 -66
- package/src/styles/components/date-picker.css +40 -40
- package/src/styles/components/datetime-picker.css +37 -37
- package/src/styles/components/divider.css +13 -13
- package/src/styles/components/dose-calculator.css +43 -43
- package/src/styles/components/dropdown-button.css +46 -46
- package/src/styles/components/empty-state.css +44 -44
- package/src/styles/components/experiment-code-badge.css +8 -8
- package/src/styles/components/experiment-data-viewer.css +23 -23
- package/src/styles/components/experiment-popover.css +97 -97
- package/src/styles/components/experiment-selector-modal.css +39 -39
- package/src/styles/components/experiment-timeline.css +98 -98
- package/src/styles/components/file-uploader.css +44 -44
- package/src/styles/components/fit-panel.css +12 -12
- package/src/styles/components/form-builder.css +11 -11
- package/src/styles/components/form-field.css +7 -7
- package/src/styles/components/formula-input.css +17 -17
- package/src/styles/components/group-assigner.css +26 -26
- package/src/styles/components/grouping-modal.css +51 -51
- package/src/styles/components/icon-button.css +41 -41
- package/src/styles/components/input.css +13 -13
- package/src/styles/components/loading-spinner.css +12 -12
- package/src/styles/components/modal.css +69 -69
- package/src/styles/components/molecule-input.css +27 -27
- package/src/styles/components/multi-select.css +23 -23
- package/src/styles/components/number-input.css +32 -32
- package/src/styles/components/pill.css +37 -37
- package/src/styles/components/plate-map-editor.css +67 -67
- package/src/styles/components/progress-bar.css +41 -41
- package/src/styles/components/protocol-step-editor.css +63 -63
- package/src/styles/components/rack-editor.css +34 -34
- package/src/styles/components/radio-group.css +41 -41
- package/src/styles/components/reagent-editor.css +70 -70
- package/src/styles/components/reagent-list.css +65 -65
- package/src/styles/components/resource-card.css +52 -52
- package/src/styles/components/sample-hierarchy-tree.css +56 -56
- package/src/styles/components/sample-legend.css +37 -37
- package/src/styles/components/sample-selector.css +121 -121
- package/src/styles/components/schedule-calendar.css +67 -67
- package/src/styles/components/scientific-number.css +11 -11
- package/src/styles/components/segmented-control.css +33 -33
- package/src/styles/components/select.css +11 -11
- package/src/styles/components/sequence-input.css +29 -29
- package/src/styles/components/settings-button.css +16 -16
- package/src/styles/components/settings-modal.css +14 -14
- package/src/styles/components/skeleton.css +2 -2
- package/src/styles/components/slider.css +10 -10
- package/src/styles/components/status-indicator.css +12 -12
- package/src/styles/components/step-wizard.css +32 -32
- package/src/styles/components/tabs.css +16 -16
- package/src/styles/components/tags-input.css +46 -46
- package/src/styles/components/textarea.css +17 -17
- package/src/styles/components/theme-toggle.css +13 -13
- package/src/styles/components/time-picker.css +28 -28
- package/src/styles/components/time-range-input.css +8 -8
- package/src/styles/components/toast.css +18 -18
- package/src/styles/components/toggle.css +27 -27
- package/src/styles/components/tooltip.css +18 -18
- package/src/styles/components/unit-input.css +25 -25
- package/src/styles/components/well-edit-popup.css +32 -32
- package/src/styles/components/well-plate.css +49 -49
- package/src/styles/index.css +1 -1
- package/src/styles/variables.css +3 -3
- package/src/types/platform.ts +6 -6
- package/dist/auth-BYmxZdJl.js.map +0 -1
- package/dist/components-CKf-UpGi.js.map +0 -1
- 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="
|
|
198
|
+
class="mint-reagent-editor"
|
|
199
199
|
:style="{ '--reagent-color': modelValue.color }"
|
|
200
200
|
>
|
|
201
201
|
<!-- Identity -->
|
|
202
|
-
<div class="
|
|
203
|
-
<div class="
|
|
204
|
-
<label class="
|
|
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="
|
|
208
|
+
class="mint-reagent-editor__color-input"
|
|
209
209
|
aria-label="Reagent color"
|
|
210
210
|
@input="updateColor"
|
|
211
211
|
/>
|
|
212
212
|
<span
|
|
213
|
-
class="
|
|
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="
|
|
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="
|
|
231
|
-
<div class="
|
|
232
|
-
<svg class="
|
|
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="
|
|
238
|
-
<div class="
|
|
239
|
-
<label class="
|
|
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="
|
|
248
|
-
<label class="
|
|
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
|
-
'
|
|
255
|
-
startPositionError ? '
|
|
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="
|
|
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="
|
|
271
|
-
<div class="
|
|
272
|
-
<svg class="
|
|
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="
|
|
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="
|
|
287
|
-
<div class="
|
|
288
|
-
<div class="
|
|
289
|
-
<label class="
|
|
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="
|
|
293
|
-
<label class="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
334
|
-
<div class="
|
|
335
|
-
<span class="
|
|
336
|
-
<span class="
|
|
337
|
-
<span class="
|
|
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="
|
|
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="
|
|
343
|
+
class="mint-reagent-editor__table-row"
|
|
344
344
|
>
|
|
345
|
-
<span class="
|
|
346
|
-
<span class="
|
|
347
|
-
<span v-if="level.value !== 0" class="
|
|
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="
|
|
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="
|
|
359
|
+
<span class="mint-reagent-editor__table-col mint-reagent-editor__table-col--action">
|
|
360
360
|
<button
|
|
361
361
|
type="button"
|
|
362
|
-
class="
|
|
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="
|
|
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
|
-
'
|
|
385
|
-
positionOverflows ? '
|
|
384
|
+
'mint-reagent-editor__summary',
|
|
385
|
+
positionOverflows ? 'mint-reagent-editor__summary--overflow' : '',
|
|
386
386
|
]"
|
|
387
387
|
>
|
|
388
|
-
<div class="
|
|
389
|
-
<span class="
|
|
390
|
-
<span class="
|
|
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="
|
|
393
|
-
<div class="
|
|
394
|
-
<span class="
|
|
395
|
-
<span class="
|
|
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="
|
|
398
|
-
<div v-if="positionRange" class="
|
|
399
|
-
<span class="
|
|
400
|
-
<span class="
|
|
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="
|
|
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="
|
|
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 '
|
|
146
|
-
if (level >= 20) return '
|
|
147
|
-
return '
|
|
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[] = ['
|
|
152
|
-
if (isExpired(reagent)) classes.push('
|
|
153
|
-
else if (isExpiringSoon(reagent)) classes.push('
|
|
154
|
-
if (isLowStock(reagent)) classes.push('
|
|
155
|
-
if (draggedId.value === reagent.id) classes.push('
|
|
156
|
-
if (dragOverId.value === reagent.id) classes.push('
|
|
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="
|
|
236
|
+
<div class="mint-reagent-list">
|
|
237
237
|
<!-- Header -->
|
|
238
|
-
<div class="
|
|
238
|
+
<div class="mint-reagent-list__header">
|
|
239
239
|
<!-- Search -->
|
|
240
|
-
<div v-if="searchable" class="
|
|
241
|
-
<svg class="
|
|
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="
|
|
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="
|
|
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="
|
|
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 ? '
|
|
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
|
-
'
|
|
282
|
-
sortColumn === col ? '
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
352
|
-
<span v-if="isExpired(reagent)" class="
|
|
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="
|
|
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="
|
|
364
|
-
<svg class="
|
|
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="
|
|
370
|
-
<svg class="
|
|
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="
|
|
378
|
+
<td v-if="columns.includes('storage')" class="mint-reagent-list__cell">
|
|
379
379
|
<span
|
|
380
380
|
v-if="reagent.storageCondition"
|
|
381
|
-
:class="['
|
|
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="
|
|
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="
|
|
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="
|
|
395
|
-
<div v-if="reagent.stockLevel !== undefined" class="
|
|
396
|
-
<div class="
|
|
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="['
|
|
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="
|
|
402
|
+
<span class="mint-reagent-list__stock-text">
|
|
403
403
|
{{ getStockLevel(reagent) }}%
|
|
404
404
|
</span>
|
|
405
405
|
</div>
|
|
406
|
-
<span v-else class="
|
|
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="
|
|
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="
|
|
415
|
+
<td v-if="!readonly" class="mint-reagent-list__cell mint-reagent-list__cell--actions">
|
|
416
416
|
<button
|
|
417
417
|
type="button"
|
|
418
|
-
class="
|
|
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="
|
|
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="
|
|
443
|
-
<svg class="
|
|
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="
|
|
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="
|
|
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
|
-
'
|
|
47
|
-
`
|
|
48
|
-
{ '
|
|
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="['
|
|
65
|
+
<span :class="['mint-resource-card__status-dot', `mint-resource-card__status-dot--${status}`]" />
|
|
66
66
|
</slot>
|
|
67
67
|
|
|
68
|
-
<span class="
|
|
68
|
+
<span class="mint-resource-card__name">{{ name }}</span>
|
|
69
69
|
|
|
70
|
-
<span :class="['
|
|
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="
|
|
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="
|
|
89
|
-
<div class="
|
|
88
|
+
<div class="mint-resource-card__content">
|
|
89
|
+
<div class="mint-resource-card__header">
|
|
90
90
|
<!-- Image / fallback -->
|
|
91
|
-
<div class="
|
|
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="
|
|
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="
|
|
104
|
-
<div class="
|
|
105
|
-
<h3 class="
|
|
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="
|
|
109
|
-
<span :class="['
|
|
110
|
-
<span class="
|
|
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="
|
|
115
|
+
<p v-if="description" class="mint-resource-card__description">{{ description }}</p>
|
|
116
116
|
|
|
117
|
-
<p v-if="location" class="
|
|
117
|
+
<p v-if="location" class="mint-resource-card__location">Location: {{ location }}</p>
|
|
118
118
|
|
|
119
|
-
<p v-if="nextAvailable" class="
|
|
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="
|
|
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="
|
|
127
|
-
<span class="
|
|
128
|
-
<span class="
|
|
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="
|
|
135
|
-
<div class="
|
|
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="
|
|
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="
|
|
144
|
+
class="mint-resource-card__book-btn"
|
|
145
145
|
@click="handleBook"
|
|
146
146
|
>
|
|
147
147
|
Book Now
|