@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.
- 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
|
@@ -346,7 +346,7 @@ function handleGroupDragStart(name: string, kind: GroupDragKind, event: DragEven
|
|
|
346
346
|
draggingGroupKind.value = kind
|
|
347
347
|
if (event.dataTransfer) {
|
|
348
348
|
event.dataTransfer.effectAllowed = 'move'
|
|
349
|
-
event.dataTransfer.setData('text/plain', `
|
|
349
|
+
event.dataTransfer.setData('text/plain', `mint-group:${name}`)
|
|
350
350
|
}
|
|
351
351
|
}
|
|
352
352
|
|
|
@@ -503,32 +503,32 @@ function addNewGroup() {
|
|
|
503
503
|
</script>
|
|
504
504
|
|
|
505
505
|
<template>
|
|
506
|
-
<div class="
|
|
506
|
+
<div class="mint-sample-selector">
|
|
507
507
|
<!-- Select All Row -->
|
|
508
|
-
<label class="
|
|
508
|
+
<label class="mint-sample-selector__select-all">
|
|
509
509
|
<input
|
|
510
510
|
type="checkbox"
|
|
511
511
|
:checked="isAllSelected"
|
|
512
512
|
@change="toggleSelectAll"
|
|
513
|
-
class="
|
|
513
|
+
class="mint-sample-selector__checkbox"
|
|
514
514
|
/>
|
|
515
|
-
<span class="
|
|
516
|
-
<span class="
|
|
515
|
+
<span class="mint-sample-selector__select-all-label">Select All</span>
|
|
516
|
+
<span class="mint-sample-selector__select-all-count">{{ samples.length }} samples</span>
|
|
517
517
|
</label>
|
|
518
518
|
|
|
519
519
|
<!-- Action Buttons Row -->
|
|
520
|
-
<div v-if="enableGrouping" class="
|
|
521
|
-
<div class="
|
|
520
|
+
<div v-if="enableGrouping" class="mint-sample-selector__actions">
|
|
521
|
+
<div class="mint-sample-selector__actions-row">
|
|
522
522
|
<!-- Smart Group Button -->
|
|
523
523
|
<BaseButton
|
|
524
524
|
v-if="enableSmartGroup"
|
|
525
525
|
:variant="groupingEnabled ? 'primary' : 'secondary'"
|
|
526
526
|
size="sm"
|
|
527
527
|
:disabled="samples.length === 0"
|
|
528
|
-
class="
|
|
528
|
+
class="mint-sample-selector__action-btn"
|
|
529
529
|
@click="showSmartGroupModal = true"
|
|
530
530
|
>
|
|
531
|
-
<svg class="
|
|
531
|
+
<svg class="mint-sample-selector__action-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
532
532
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
533
533
|
</svg>
|
|
534
534
|
<span>Smart Group</span>
|
|
@@ -539,11 +539,11 @@ function addNewGroup() {
|
|
|
539
539
|
variant="ghost"
|
|
540
540
|
size="sm"
|
|
541
541
|
:disabled="internalGroups.length === 0"
|
|
542
|
-
class="
|
|
542
|
+
class="mint-sample-selector__action-btn mint-sample-selector__action-btn--reset"
|
|
543
543
|
@click="clearGroups"
|
|
544
544
|
title="Clear all groups"
|
|
545
545
|
>
|
|
546
|
-
<svg class="
|
|
546
|
+
<svg class="mint-sample-selector__action-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
547
547
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
|
|
548
548
|
</svg>
|
|
549
549
|
</BaseButton>
|
|
@@ -551,18 +551,18 @@ function addNewGroup() {
|
|
|
551
551
|
</div>
|
|
552
552
|
|
|
553
553
|
<!-- Grouped View -->
|
|
554
|
-
<div v-if="groupingEnabled" class="
|
|
554
|
+
<div v-if="groupingEnabled" class="mint-sample-selector__grouped">
|
|
555
555
|
<!-- Groups Header -->
|
|
556
|
-
<div class="
|
|
557
|
-
<span class="
|
|
558
|
-
<div class="
|
|
559
|
-
<button type="button" class="
|
|
560
|
-
<svg class="
|
|
556
|
+
<div class="mint-sample-selector__groups-header">
|
|
557
|
+
<span class="mint-sample-selector__groups-title">Groups ({{ internalGroups.length }})</span>
|
|
558
|
+
<div class="mint-sample-selector__groups-controls">
|
|
559
|
+
<button type="button" class="mint-sample-selector__expand-btn" @click="expandAllGroups" title="Expand all">
|
|
560
|
+
<svg class="mint-sample-selector__expand-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
561
561
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
562
562
|
</svg>
|
|
563
563
|
</button>
|
|
564
|
-
<button type="button" class="
|
|
565
|
-
<svg class="
|
|
564
|
+
<button type="button" class="mint-sample-selector__expand-btn" @click="collapseAllGroups" title="Collapse all">
|
|
565
|
+
<svg class="mint-sample-selector__expand-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
566
566
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
567
567
|
</svg>
|
|
568
568
|
</button>
|
|
@@ -570,21 +570,21 @@ function addNewGroup() {
|
|
|
570
570
|
</div>
|
|
571
571
|
|
|
572
572
|
<!-- Hierarchical Tree -->
|
|
573
|
-
<div class="
|
|
573
|
+
<div class="mint-sample-selector__tree">
|
|
574
574
|
<!-- Major Groups (when hierarchy is meaningful) -->
|
|
575
575
|
<template v-if="showHierarchy">
|
|
576
576
|
<div
|
|
577
577
|
v-for="majorGroup in hierarchicalGroups"
|
|
578
578
|
:key="majorGroup.name"
|
|
579
|
-
class="
|
|
579
|
+
class="mint-sample-selector__major-group"
|
|
580
580
|
>
|
|
581
581
|
<!-- Major Group Header -->
|
|
582
582
|
<div
|
|
583
583
|
:class="[
|
|
584
|
-
'
|
|
585
|
-
draggingGroup === majorGroup.name && draggingGroupKind === 'major' ? '
|
|
586
|
-
reorderTarget === majorGroup.name && draggingGroupKind === 'major' && reorderPosition === 'before' ? '
|
|
587
|
-
reorderTarget === majorGroup.name && draggingGroupKind === 'major' && reorderPosition === 'after' ? '
|
|
584
|
+
'mint-sample-selector__major-header',
|
|
585
|
+
draggingGroup === majorGroup.name && draggingGroupKind === 'major' ? 'mint-sample-selector__header--dragging' : '',
|
|
586
|
+
reorderTarget === majorGroup.name && draggingGroupKind === 'major' && reorderPosition === 'before' ? 'mint-sample-selector__header--drag-over-before' : '',
|
|
587
|
+
reorderTarget === majorGroup.name && draggingGroupKind === 'major' && reorderPosition === 'after' ? 'mint-sample-selector__header--drag-over-after' : '',
|
|
588
588
|
]"
|
|
589
589
|
draggable="true"
|
|
590
590
|
@click="toggleGroupExpanded(`major:${majorGroup.name}`)"
|
|
@@ -596,8 +596,8 @@ function addNewGroup() {
|
|
|
596
596
|
>
|
|
597
597
|
<svg
|
|
598
598
|
:class="[
|
|
599
|
-
'
|
|
600
|
-
isGroupExpanded(`major:${majorGroup.name}`) ? '
|
|
599
|
+
'mint-sample-selector__chevron',
|
|
600
|
+
isGroupExpanded(`major:${majorGroup.name}`) ? 'mint-sample-selector__chevron--open' : '',
|
|
601
601
|
]"
|
|
602
602
|
fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
603
603
|
>
|
|
@@ -608,7 +608,7 @@ function addNewGroup() {
|
|
|
608
608
|
type="checkbox"
|
|
609
609
|
:checked="isMajorGroupFullySelected(majorGroup)"
|
|
610
610
|
:indeterminate="isMajorGroupPartiallySelected(majorGroup)"
|
|
611
|
-
class="
|
|
611
|
+
class="mint-sample-selector__checkbox"
|
|
612
612
|
:style="{ accentColor: majorGroup.color }"
|
|
613
613
|
@click.stop
|
|
614
614
|
@change="toggleMajorGroupSamples(majorGroup)"
|
|
@@ -616,16 +616,16 @@ function addNewGroup() {
|
|
|
616
616
|
|
|
617
617
|
<button
|
|
618
618
|
type="button"
|
|
619
|
-
class="
|
|
619
|
+
class="mint-sample-selector__color-dot mint-sample-selector__color-dot--large mint-sample-selector__color-dot--clickable"
|
|
620
620
|
:style="{ backgroundColor: majorGroup.color }"
|
|
621
621
|
@click.stop="openMajorGroupColorPicker(majorGroup, $event)"
|
|
622
622
|
title="Click to change color family"
|
|
623
623
|
/>
|
|
624
624
|
|
|
625
|
-
<span class="
|
|
625
|
+
<span class="mint-sample-selector__major-name">{{ majorGroup.name }}</span>
|
|
626
626
|
|
|
627
627
|
<span
|
|
628
|
-
class="
|
|
628
|
+
class="mint-sample-selector__count-badge"
|
|
629
629
|
:style="{ backgroundColor: majorGroup.color + '20', color: majorGroup.color }"
|
|
630
630
|
>
|
|
631
631
|
{{ majorGroup.allSamples.length }}
|
|
@@ -633,7 +633,7 @@ function addNewGroup() {
|
|
|
633
633
|
|
|
634
634
|
<button
|
|
635
635
|
type="button"
|
|
636
|
-
class="
|
|
636
|
+
class="mint-sample-selector__delete-btn mint-sample-selector__delete-btn--hidden"
|
|
637
637
|
@click.stop="deleteMajorGroup(majorGroup)"
|
|
638
638
|
title="Remove major group"
|
|
639
639
|
>
|
|
@@ -644,18 +644,18 @@ function addNewGroup() {
|
|
|
644
644
|
</div>
|
|
645
645
|
|
|
646
646
|
<!-- Sub Groups (collapsible) -->
|
|
647
|
-
<Transition name="
|
|
647
|
+
<Transition name="mint-collapse">
|
|
648
648
|
<div
|
|
649
649
|
v-if="isGroupExpanded(`major:${majorGroup.name}`)"
|
|
650
|
-
class="
|
|
650
|
+
class="mint-sample-selector__sub-groups"
|
|
651
651
|
:style="{ borderColor: majorGroup.color + '30' }"
|
|
652
652
|
>
|
|
653
653
|
<div
|
|
654
654
|
v-for="subGroup in majorGroup.subGroups"
|
|
655
655
|
:key="subGroup.name"
|
|
656
656
|
:class="[
|
|
657
|
-
'
|
|
658
|
-
dragOverGroup === subGroup.name ? '
|
|
657
|
+
'mint-sample-selector__sub-group',
|
|
658
|
+
dragOverGroup === subGroup.name ? 'mint-sample-selector__sub-group--drag-over' : '',
|
|
659
659
|
]"
|
|
660
660
|
@dragover="handleDragOver(subGroup.name, $event)"
|
|
661
661
|
@dragleave="handleDragLeave"
|
|
@@ -664,10 +664,10 @@ function addNewGroup() {
|
|
|
664
664
|
<!-- Sub Group Header -->
|
|
665
665
|
<div
|
|
666
666
|
:class="[
|
|
667
|
-
'
|
|
668
|
-
draggingGroup === subGroup.name && draggingGroupKind === 'sub' ? '
|
|
669
|
-
reorderTarget === subGroup.name && draggingGroupKind === 'sub' && reorderPosition === 'before' ? '
|
|
670
|
-
reorderTarget === subGroup.name && draggingGroupKind === 'sub' && reorderPosition === 'after' ? '
|
|
667
|
+
'mint-sample-selector__sub-header',
|
|
668
|
+
draggingGroup === subGroup.name && draggingGroupKind === 'sub' ? 'mint-sample-selector__header--dragging' : '',
|
|
669
|
+
reorderTarget === subGroup.name && draggingGroupKind === 'sub' && reorderPosition === 'before' ? 'mint-sample-selector__header--drag-over-before' : '',
|
|
670
|
+
reorderTarget === subGroup.name && draggingGroupKind === 'sub' && reorderPosition === 'after' ? 'mint-sample-selector__header--drag-over-after' : '',
|
|
671
671
|
]"
|
|
672
672
|
draggable="true"
|
|
673
673
|
@click="toggleGroupExpanded(subGroup.name)"
|
|
@@ -679,8 +679,8 @@ function addNewGroup() {
|
|
|
679
679
|
>
|
|
680
680
|
<svg
|
|
681
681
|
:class="[
|
|
682
|
-
'
|
|
683
|
-
isGroupExpanded(subGroup.name) ? '
|
|
682
|
+
'mint-sample-selector__chevron mint-sample-selector__chevron--small',
|
|
683
|
+
isGroupExpanded(subGroup.name) ? 'mint-sample-selector__chevron--open' : '',
|
|
684
684
|
]"
|
|
685
685
|
fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
686
686
|
>
|
|
@@ -691,22 +691,22 @@ function addNewGroup() {
|
|
|
691
691
|
type="checkbox"
|
|
692
692
|
:checked="isGroupFullySelected(subGroup.name)"
|
|
693
693
|
:indeterminate="isGroupPartiallySelected(subGroup.name)"
|
|
694
|
-
class="
|
|
694
|
+
class="mint-sample-selector__checkbox mint-sample-selector__checkbox--small"
|
|
695
695
|
:style="{ accentColor: subGroup.displayColor }"
|
|
696
696
|
@click.stop
|
|
697
697
|
@change="toggleGroupSamples(subGroup.name)"
|
|
698
698
|
/>
|
|
699
699
|
|
|
700
700
|
<div
|
|
701
|
-
class="
|
|
701
|
+
class="mint-sample-selector__color-dot"
|
|
702
702
|
:style="{ backgroundColor: subGroup.displayColor }"
|
|
703
703
|
aria-hidden="true"
|
|
704
704
|
/>
|
|
705
705
|
|
|
706
|
-
<span class="
|
|
706
|
+
<span class="mint-sample-selector__sub-name">{{ subGroup.name }}</span>
|
|
707
707
|
|
|
708
708
|
<span
|
|
709
|
-
class="
|
|
709
|
+
class="mint-sample-selector__count-badge mint-sample-selector__count-badge--small"
|
|
710
710
|
:style="{ backgroundColor: subGroup.displayBg, color: subGroup.displayColor }"
|
|
711
711
|
>
|
|
712
712
|
{{ subGroup.samples.length }}
|
|
@@ -714,7 +714,7 @@ function addNewGroup() {
|
|
|
714
714
|
|
|
715
715
|
<button
|
|
716
716
|
type="button"
|
|
717
|
-
class="
|
|
717
|
+
class="mint-sample-selector__delete-btn mint-sample-selector__delete-btn--hidden"
|
|
718
718
|
@click.stop="deleteGroup(subGroup.name)"
|
|
719
719
|
title="Remove sub group"
|
|
720
720
|
>
|
|
@@ -725,37 +725,37 @@ function addNewGroup() {
|
|
|
725
725
|
</div>
|
|
726
726
|
|
|
727
727
|
<!-- Samples (collapsible) -->
|
|
728
|
-
<Transition name="
|
|
728
|
+
<Transition name="mint-collapse">
|
|
729
729
|
<div
|
|
730
730
|
v-if="isGroupExpanded(subGroup.name)"
|
|
731
|
-
class="
|
|
731
|
+
class="mint-sample-selector__samples"
|
|
732
732
|
:style="{ borderColor: subGroup.displayBorder }"
|
|
733
733
|
>
|
|
734
734
|
<div
|
|
735
735
|
v-for="sample in subGroup.samples"
|
|
736
736
|
:key="sample"
|
|
737
737
|
:class="[
|
|
738
|
-
'
|
|
739
|
-
draggingSample === sample ? '
|
|
738
|
+
'mint-sample-selector__sample',
|
|
739
|
+
draggingSample === sample ? 'mint-sample-selector__sample--dragging' : '',
|
|
740
740
|
]"
|
|
741
741
|
draggable="true"
|
|
742
742
|
@dragstart="handleDragStart(sample, subGroup.name, $event)"
|
|
743
743
|
@dragend="handleDragEnd"
|
|
744
744
|
>
|
|
745
|
-
<svg class="
|
|
745
|
+
<svg class="mint-sample-selector__drag-handle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
746
746
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8h16M4 16h16" />
|
|
747
747
|
</svg>
|
|
748
748
|
<input
|
|
749
749
|
type="checkbox"
|
|
750
750
|
:checked="modelValue.includes(sample)"
|
|
751
|
-
class="
|
|
751
|
+
class="mint-sample-selector__checkbox mint-sample-selector__checkbox--tiny"
|
|
752
752
|
:style="{ accentColor: subGroup.displayColor }"
|
|
753
753
|
@change="toggleSample(sample)"
|
|
754
754
|
/>
|
|
755
|
-
<span class="
|
|
755
|
+
<span class="mint-sample-selector__sample-name">{{ sample }}</span>
|
|
756
756
|
<button
|
|
757
757
|
type="button"
|
|
758
|
-
class="
|
|
758
|
+
class="mint-sample-selector__remove-btn"
|
|
759
759
|
@click="removeSampleFromGroup(sample, subGroup.name)"
|
|
760
760
|
title="Remove from group"
|
|
761
761
|
>
|
|
@@ -778,8 +778,8 @@ function addNewGroup() {
|
|
|
778
778
|
v-for="group in internalGroups"
|
|
779
779
|
:key="group.name"
|
|
780
780
|
:class="[
|
|
781
|
-
'
|
|
782
|
-
dragOverGroup === group.name ? '
|
|
781
|
+
'mint-sample-selector__sub-group',
|
|
782
|
+
dragOverGroup === group.name ? 'mint-sample-selector__sub-group--drag-over' : '',
|
|
783
783
|
]"
|
|
784
784
|
@dragover="handleDragOver(group.name, $event)"
|
|
785
785
|
@dragleave="handleDragLeave"
|
|
@@ -788,10 +788,10 @@ function addNewGroup() {
|
|
|
788
788
|
<!-- Group Header -->
|
|
789
789
|
<div
|
|
790
790
|
:class="[
|
|
791
|
-
'
|
|
792
|
-
draggingGroup === group.name && draggingGroupKind === 'flat' ? '
|
|
793
|
-
reorderTarget === group.name && draggingGroupKind === 'flat' && reorderPosition === 'before' ? '
|
|
794
|
-
reorderTarget === group.name && draggingGroupKind === 'flat' && reorderPosition === 'after' ? '
|
|
791
|
+
'mint-sample-selector__major-header',
|
|
792
|
+
draggingGroup === group.name && draggingGroupKind === 'flat' ? 'mint-sample-selector__header--dragging' : '',
|
|
793
|
+
reorderTarget === group.name && draggingGroupKind === 'flat' && reorderPosition === 'before' ? 'mint-sample-selector__header--drag-over-before' : '',
|
|
794
|
+
reorderTarget === group.name && draggingGroupKind === 'flat' && reorderPosition === 'after' ? 'mint-sample-selector__header--drag-over-after' : '',
|
|
795
795
|
]"
|
|
796
796
|
draggable="true"
|
|
797
797
|
@click="toggleGroupExpanded(group.name)"
|
|
@@ -803,8 +803,8 @@ function addNewGroup() {
|
|
|
803
803
|
>
|
|
804
804
|
<svg
|
|
805
805
|
:class="[
|
|
806
|
-
'
|
|
807
|
-
isGroupExpanded(group.name) ? '
|
|
806
|
+
'mint-sample-selector__chevron',
|
|
807
|
+
isGroupExpanded(group.name) ? 'mint-sample-selector__chevron--open' : '',
|
|
808
808
|
]"
|
|
809
809
|
fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
810
810
|
>
|
|
@@ -815,7 +815,7 @@ function addNewGroup() {
|
|
|
815
815
|
type="checkbox"
|
|
816
816
|
:checked="isGroupFullySelected(group.name)"
|
|
817
817
|
:indeterminate="isGroupPartiallySelected(group.name)"
|
|
818
|
-
class="
|
|
818
|
+
class="mint-sample-selector__checkbox"
|
|
819
819
|
:style="{ accentColor: group.color }"
|
|
820
820
|
@click.stop
|
|
821
821
|
@change="toggleGroupSamples(group.name)"
|
|
@@ -823,16 +823,16 @@ function addNewGroup() {
|
|
|
823
823
|
|
|
824
824
|
<button
|
|
825
825
|
type="button"
|
|
826
|
-
class="
|
|
826
|
+
class="mint-sample-selector__color-dot mint-sample-selector__color-dot--large mint-sample-selector__color-dot--clickable"
|
|
827
827
|
:style="{ backgroundColor: group.color }"
|
|
828
828
|
@click.stop="openColorPicker(group.name, $event)"
|
|
829
829
|
title="Click to change color"
|
|
830
830
|
/>
|
|
831
831
|
|
|
832
|
-
<span class="
|
|
832
|
+
<span class="mint-sample-selector__major-name">{{ group.name }}</span>
|
|
833
833
|
|
|
834
834
|
<span
|
|
835
|
-
class="
|
|
835
|
+
class="mint-sample-selector__count-badge"
|
|
836
836
|
:style="{ backgroundColor: group.color + '20', color: group.color }"
|
|
837
837
|
>
|
|
838
838
|
{{ group.samples.length }}
|
|
@@ -840,7 +840,7 @@ function addNewGroup() {
|
|
|
840
840
|
|
|
841
841
|
<button
|
|
842
842
|
type="button"
|
|
843
|
-
class="
|
|
843
|
+
class="mint-sample-selector__delete-btn mint-sample-selector__delete-btn--hidden"
|
|
844
844
|
@click.stop="deleteGroup(group.name)"
|
|
845
845
|
title="Remove group"
|
|
846
846
|
>
|
|
@@ -851,37 +851,37 @@ function addNewGroup() {
|
|
|
851
851
|
</div>
|
|
852
852
|
|
|
853
853
|
<!-- Samples (collapsible) -->
|
|
854
|
-
<Transition name="
|
|
854
|
+
<Transition name="mint-collapse">
|
|
855
855
|
<div
|
|
856
856
|
v-if="isGroupExpanded(group.name)"
|
|
857
|
-
class="
|
|
857
|
+
class="mint-sample-selector__samples"
|
|
858
858
|
:style="{ borderColor: group.color + '40' }"
|
|
859
859
|
>
|
|
860
860
|
<div
|
|
861
861
|
v-for="sample in group.samples"
|
|
862
862
|
:key="sample"
|
|
863
863
|
:class="[
|
|
864
|
-
'
|
|
865
|
-
draggingSample === sample ? '
|
|
864
|
+
'mint-sample-selector__sample',
|
|
865
|
+
draggingSample === sample ? 'mint-sample-selector__sample--dragging' : '',
|
|
866
866
|
]"
|
|
867
867
|
draggable="true"
|
|
868
868
|
@dragstart="handleDragStart(sample, group.name, $event)"
|
|
869
869
|
@dragend="handleDragEnd"
|
|
870
870
|
>
|
|
871
|
-
<svg class="
|
|
871
|
+
<svg class="mint-sample-selector__drag-handle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
872
872
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8h16M4 16h16" />
|
|
873
873
|
</svg>
|
|
874
874
|
<input
|
|
875
875
|
type="checkbox"
|
|
876
876
|
:checked="modelValue.includes(sample)"
|
|
877
|
-
class="
|
|
877
|
+
class="mint-sample-selector__checkbox mint-sample-selector__checkbox--tiny"
|
|
878
878
|
:style="{ accentColor: group.color }"
|
|
879
879
|
@change="toggleSample(sample)"
|
|
880
880
|
/>
|
|
881
|
-
<span class="
|
|
881
|
+
<span class="mint-sample-selector__sample-name">{{ sample }}</span>
|
|
882
882
|
<button
|
|
883
883
|
type="button"
|
|
884
|
-
class="
|
|
884
|
+
class="mint-sample-selector__remove-btn"
|
|
885
885
|
@click="removeSampleFromGroup(sample, group.name)"
|
|
886
886
|
title="Remove from group"
|
|
887
887
|
>
|
|
@@ -896,74 +896,74 @@ function addNewGroup() {
|
|
|
896
896
|
</template>
|
|
897
897
|
|
|
898
898
|
<!-- Empty state -->
|
|
899
|
-
<div v-if="internalGroups.length === 0" class="
|
|
899
|
+
<div v-if="internalGroups.length === 0" class="mint-sample-selector__empty">
|
|
900
900
|
Click Smart Group to auto-group samples
|
|
901
901
|
</div>
|
|
902
902
|
</div>
|
|
903
903
|
|
|
904
904
|
<!-- Ungrouped Samples Section -->
|
|
905
|
-
<div v-if="ungroupedSamples.length > 0" class="
|
|
905
|
+
<div v-if="ungroupedSamples.length > 0" class="mint-sample-selector__ungrouped">
|
|
906
906
|
<div
|
|
907
|
-
class="
|
|
907
|
+
class="mint-sample-selector__ungrouped-header"
|
|
908
908
|
@click="toggleGroupExpanded('__ungrouped__')"
|
|
909
909
|
>
|
|
910
910
|
<svg
|
|
911
911
|
:class="[
|
|
912
|
-
'
|
|
913
|
-
isGroupExpanded('__ungrouped__') ? '
|
|
912
|
+
'mint-sample-selector__chevron',
|
|
913
|
+
isGroupExpanded('__ungrouped__') ? 'mint-sample-selector__chevron--open' : '',
|
|
914
914
|
]"
|
|
915
915
|
fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
916
916
|
>
|
|
917
917
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
918
918
|
</svg>
|
|
919
|
-
<span class="
|
|
920
|
-
<span class="
|
|
919
|
+
<span class="mint-sample-selector__ungrouped-label">Ungrouped</span>
|
|
920
|
+
<span class="mint-sample-selector__ungrouped-count">{{ ungroupedSamples.length }}</span>
|
|
921
921
|
</div>
|
|
922
922
|
|
|
923
|
-
<Transition name="
|
|
923
|
+
<Transition name="mint-collapse">
|
|
924
924
|
<div
|
|
925
925
|
v-if="isGroupExpanded('__ungrouped__')"
|
|
926
|
-
class="
|
|
926
|
+
class="mint-sample-selector__ungrouped-list"
|
|
927
927
|
>
|
|
928
928
|
<div
|
|
929
929
|
v-for="sample in ungroupedSamples"
|
|
930
930
|
:key="sample"
|
|
931
931
|
:class="[
|
|
932
|
-
'
|
|
933
|
-
draggingSample === sample ? '
|
|
932
|
+
'mint-sample-selector__sample',
|
|
933
|
+
draggingSample === sample ? 'mint-sample-selector__sample--dragging' : '',
|
|
934
934
|
]"
|
|
935
935
|
draggable="true"
|
|
936
936
|
@dragstart="handleDragStart(sample, null, $event)"
|
|
937
937
|
@dragend="handleDragEnd"
|
|
938
938
|
>
|
|
939
|
-
<svg class="
|
|
939
|
+
<svg class="mint-sample-selector__drag-handle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
940
940
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8h16M4 16h16" />
|
|
941
941
|
</svg>
|
|
942
942
|
<input
|
|
943
943
|
type="checkbox"
|
|
944
944
|
:checked="modelValue.includes(sample)"
|
|
945
|
-
class="
|
|
945
|
+
class="mint-sample-selector__checkbox mint-sample-selector__checkbox--small"
|
|
946
946
|
@change="toggleSample(sample)"
|
|
947
947
|
/>
|
|
948
|
-
<span class="
|
|
948
|
+
<span class="mint-sample-selector__sample-name">{{ sample }}</span>
|
|
949
949
|
</div>
|
|
950
950
|
</div>
|
|
951
951
|
</Transition>
|
|
952
952
|
</div>
|
|
953
953
|
|
|
954
954
|
<!-- New Group Input -->
|
|
955
|
-
<div class="
|
|
955
|
+
<div class="mint-sample-selector__new-group">
|
|
956
956
|
<BaseInput
|
|
957
957
|
v-model="newGroupName"
|
|
958
958
|
placeholder="New group name..."
|
|
959
|
-
class="
|
|
959
|
+
class="mint-sample-selector__new-group-input"
|
|
960
960
|
@keyup.enter="addNewGroup"
|
|
961
961
|
/>
|
|
962
962
|
<BaseButton
|
|
963
963
|
variant="ghost"
|
|
964
964
|
size="sm"
|
|
965
965
|
:disabled="!newGroupName.trim()"
|
|
966
|
-
class="
|
|
966
|
+
class="mint-sample-selector__new-group-btn"
|
|
967
967
|
@click="addNewGroup"
|
|
968
968
|
>
|
|
969
969
|
Add
|
|
@@ -974,44 +974,44 @@ function addNewGroup() {
|
|
|
974
974
|
<input
|
|
975
975
|
ref="colorPickerInput"
|
|
976
976
|
type="color"
|
|
977
|
-
class="
|
|
977
|
+
class="mint-sample-selector__color-input"
|
|
978
978
|
:value="colorPickerSeed"
|
|
979
979
|
@change="handleColorChange"
|
|
980
980
|
/>
|
|
981
981
|
</div>
|
|
982
982
|
|
|
983
983
|
<!-- Flat View (when no groups) -->
|
|
984
|
-
<div v-if="!groupingEnabled" class="
|
|
984
|
+
<div v-if="!groupingEnabled" class="mint-sample-selector__flat">
|
|
985
985
|
<!-- Search -->
|
|
986
|
-
<div class="
|
|
987
|
-
<svg class="
|
|
986
|
+
<div class="mint-sample-selector__search">
|
|
987
|
+
<svg class="mint-sample-selector__search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
988
988
|
<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" />
|
|
989
989
|
</svg>
|
|
990
990
|
<input
|
|
991
991
|
v-model="searchQuery"
|
|
992
992
|
type="text"
|
|
993
993
|
placeholder="Search samples..."
|
|
994
|
-
class="
|
|
994
|
+
class="mint-sample-selector__search-input"
|
|
995
995
|
/>
|
|
996
996
|
</div>
|
|
997
997
|
|
|
998
998
|
<!-- Flat samples list -->
|
|
999
|
-
<div class="
|
|
999
|
+
<div class="mint-sample-selector__flat-list">
|
|
1000
1000
|
<div
|
|
1001
1001
|
v-for="sample in filteredSamples"
|
|
1002
1002
|
:key="sample"
|
|
1003
|
-
class="
|
|
1003
|
+
class="mint-sample-selector__flat-item"
|
|
1004
1004
|
>
|
|
1005
1005
|
<input
|
|
1006
1006
|
type="checkbox"
|
|
1007
1007
|
:checked="modelValue.includes(sample)"
|
|
1008
|
-
class="
|
|
1008
|
+
class="mint-sample-selector__checkbox"
|
|
1009
1009
|
@change="toggleSample(sample)"
|
|
1010
1010
|
/>
|
|
1011
|
-
<span class="
|
|
1011
|
+
<span class="mint-sample-selector__flat-name">{{ sample }}</span>
|
|
1012
1012
|
</div>
|
|
1013
1013
|
|
|
1014
|
-
<div v-if="filteredSamples.length === 0 && searchQuery.trim()" class="
|
|
1014
|
+
<div v-if="filteredSamples.length === 0 && searchQuery.trim()" class="mint-sample-selector__empty">
|
|
1015
1015
|
No samples match "{{ searchQuery }}"
|
|
1016
1016
|
</div>
|
|
1017
1017
|
</div>
|