@morscherlab/mint-sdk 1.4.0-beta.2 → 1.4.0-beta.20
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 +14 -3
- package/dist/{ActionMenu-CScINahU.js → AlertBox-CzLg0UaL.js} +40 -209
- package/dist/AlertBox-CzLg0UaL.js.map +1 -0
- package/dist/{AppSidebar-BmiiPfz9.js → AppSidebar-6oTT-gPO.js} +1249 -239
- package/dist/AppSidebar-6oTT-gPO.js.map +1 -0
- package/dist/{ConfirmDialog-CJ7hqYUP.js → ConfirmDialog-CSls2Nuv.js} +2 -2
- package/dist/{ConfirmDialog-CJ7hqYUP.js.map → ConfirmDialog-CSls2Nuv.js.map} +1 -1
- package/dist/ExperimentPopover-9l4QZlvQ.js +337 -0
- package/dist/ExperimentPopover-9l4QZlvQ.js.map +1 -0
- package/dist/{ExperimentSelectorModal-D-9z7cNx.js → ExperimentSelectorModal-pR5fK3pA.js} +244 -211
- package/dist/ExperimentSelectorModal-pR5fK3pA.js.map +1 -0
- package/dist/{SegmentedControl-DERBN-Xd.js → SegmentedControl-CJ7EAmOq.js} +2 -2
- package/dist/{SegmentedControl-DERBN-Xd.js.map → SegmentedControl-CJ7EAmOq.js.map} +1 -1
- package/dist/{SettingsModal-CSLE31yg.js → SettingsModal-Dyitgzfp.js} +28 -27
- package/dist/SettingsModal-Dyitgzfp.js.map +1 -0
- package/dist/__stories__/experiment-helpers.d.ts +10 -0
- package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
- package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
- package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
- package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
- package/dist/components/AppSidebar.vue.d.ts +1 -1
- package/dist/components/AppTopBar.vue.d.ts +20 -5
- package/dist/components/ArtifactSaveDialog.vue.d.ts +9 -1
- package/dist/components/AuditTrail.vue.d.ts +1 -1
- package/dist/components/BaseButton.vue.d.ts +4 -2
- package/dist/components/BaseSelect.vue.d.ts +2 -2
- package/dist/components/ChartContainer.vue.d.ts +2 -0
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/ExperimentPopover.vue.d.ts +18 -0
- package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -5
- package/dist/components/FilePicker.vue.d.ts +1 -1
- package/dist/components/FileUploader.vue.d.ts +2 -2
- package/dist/components/JobsStatusTray.vue.d.ts +15 -4
- package/dist/components/PluginIcon.vue.d.ts +2 -2
- package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
- package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
- package/dist/components/SampleSelector.vue.d.ts +6 -6
- package/dist/components/SequenceProgressBar.vue.d.ts +3 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
- package/dist/components/StepWizard.vue.d.ts +3 -0
- package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
- package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +1 -1
- package/dist/components/internal/DatePickerTimeInternal.vue.d.ts +1 -1
- package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +2 -7
- package/dist/components/internal/SelectMultipleInternal.vue.d.ts +4 -0
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
- package/dist/composables/createClient.d.ts +2 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/pluginIdentity.d.ts +24 -0
- package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
- package/dist/composables/useAppExperiment.d.ts +8 -0
- package/dist/composables/useCalendarGrid.d.ts +1 -1
- package/dist/composables/useExperimentSelector.d.ts +6 -2
- package/dist/composables/useJobCenter.d.ts +41 -3
- package/dist/composables/useOnboarding.d.ts +119 -0
- package/dist/composables/usePlatform.d.ts +1 -0
- package/dist/{controlSchemaModel-CP5-_nAj.js → controlSchemaModel-DCUOx8ll.js} +2 -2
- package/dist/{controlSchemaModel-CP5-_nAj.js.map → controlSchemaModel-DCUOx8ll.js.map} +1 -1
- package/dist/{data-C2PwI_dn.js → data-DBnmeBZX.js} +179 -125
- package/dist/data-DBnmeBZX.js.map +1 -0
- package/dist/data.js +8 -8
- package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
- package/dist/experiment-DyO54FQB.js.map +1 -0
- package/dist/{experimentStatus-BZmU4czV.js → experimentStatus-BFrKpHAH.js} +3 -3
- package/dist/{experimentStatus-BZmU4czV.js.map → experimentStatus-BFrKpHAH.js.map} +1 -1
- package/dist/index.js +20 -20
- package/dist/{install-DAID6c2-.js → install-qjELyNwc.js} +15 -14
- package/dist/{install-DAID6c2-.js.map → install-qjELyNwc.js.map} +1 -1
- package/dist/install.js +1 -1
- package/dist/{lab-DLwRl_Ql.js → lab-UyTbokQC.js} +136 -148
- package/dist/lab-UyTbokQC.js.map +1 -0
- package/dist/lab.js +4 -3
- package/dist/{records-BzTcxekG.js → records-CR_pYzIP.js} +533 -335
- package/dist/records-CR_pYzIP.js.map +1 -0
- package/dist/{runtime-D6gVat6r.js → runtime-CoHhBP10.js} +417 -54
- package/dist/runtime-CoHhBP10.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +7 -7
- package/dist/{shell-5ju97nOS.js → shell-BDuZf2zb.js} +10 -5
- package/dist/{shell-5ju97nOS.js.map → shell-BDuZf2zb.js.map} +1 -1
- package/dist/shell.d.ts +1 -0
- package/dist/shell.js +6 -6
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +2 -2
- package/dist/stores/settings.d.ts +4 -12
- package/dist/styles.css +2732 -2083
- package/dist/types/componentWorkflowTypes.d.ts +2 -0
- package/dist/types/components.d.ts +2 -0
- package/dist/types/generated/platformContext.d.ts +1 -0
- package/dist/types/generated-ui.d.ts +4 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/jobs.d.ts +9 -0
- package/dist/types/platform.d.ts +1 -1
- package/dist/{BaseModal-DfRIuVoj.js → useDropdownState-Bb2N4m40.js} +74 -4
- package/dist/useDropdownState-Bb2N4m40.js.map +1 -0
- package/dist/{useExperimentSamples-CxcnxZ8h.js → useExperimentSamples-Dno1fFMq.js} +4 -4
- package/dist/{useExperimentSamples-CxcnxZ8h.js.map → useExperimentSamples-Dno1fFMq.js.map} +1 -1
- package/dist/{useListReorder-CcbEYxX-.js → useListReorder-CQ9OCScc.js} +183 -351
- package/dist/useListReorder-CQ9OCScc.js.map +1 -0
- package/dist/{useRackEditor-BD5NIo5s.js → useRackEditor-wL3kPrRT.js} +73 -59
- package/dist/useRackEditor-wL3kPrRT.js.map +1 -0
- package/dist/useRealtime-C3whhVvb.js +508 -0
- package/dist/useRealtime-C3whhVvb.js.map +1 -0
- package/dist/useRequest-CDkrXNU7.js +244 -0
- package/dist/useRequest-CDkrXNU7.js.map +1 -0
- package/dist/utils/time.d.ts +7 -0
- package/package.json +1 -1
- package/src/__stories__/experiment-helpers.ts +3 -3
- package/src/__tests__/components/AppTopBar.test.ts +257 -3
- package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
- package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
- package/src/__tests__/components/AppTopBarPillNav.test.ts +35 -0
- package/src/__tests__/components/ArtifactSaveDialog.test.ts +78 -0
- package/src/__tests__/components/BaseButton.test.ts +19 -0
- package/src/__tests__/components/BaseSelect.multiple.test.ts +87 -32
- package/src/__tests__/components/BaseSelect.test.ts +2 -1
- package/src/__tests__/components/BatchProgressList.test.ts +16 -0
- package/src/__tests__/components/CalendarGridPanel.test.ts +2 -2
- package/src/__tests__/components/ChartContainer.test.ts +11 -0
- package/src/__tests__/components/ChemicalFormula.test.ts +6 -3
- package/src/__tests__/components/DatePicker.datetime.test.ts +6 -0
- package/src/__tests__/components/DatePicker.test.ts +21 -0
- package/src/__tests__/components/DatePicker.time.test.ts +2 -2
- package/src/__tests__/components/EmptyState.test.ts +1 -1
- package/src/__tests__/components/ExperimentPopover.test.ts +125 -16
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +153 -14
- package/src/__tests__/components/GeneratedPluginView.test.ts +23 -2
- package/src/__tests__/components/InstrumentStateBadge.test.ts +4 -4
- package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
- package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +0 -20
- package/src/__tests__/components/SampleSelector.test.ts +33 -8
- package/src/__tests__/components/SequenceProgressBar.test.ts +12 -0
- package/src/__tests__/components/SettingsModal.test.ts +9 -2
- package/src/__tests__/components/StepWizard.test.ts +11 -0
- package/src/__tests__/components/WellPlate.decoration.test.ts +11 -4
- package/src/__tests__/components/deprecationTags.test.ts +1 -1
- package/src/__tests__/composables/useAppExperiment.test.ts +27 -1
- package/src/__tests__/composables/useCalendarGrid.test.ts +4 -2
- package/src/__tests__/composables/useExperimentSelector.test.ts +111 -0
- package/src/__tests__/composables/useJobCenter.test.ts +262 -3
- package/src/__tests__/composables/useOnboarding.test.ts +317 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
- package/src/__tests__/stores/settings.test.ts +21 -21
- package/src/__tests__/styles/baseControlsRules.test.ts +6 -2
- package/src/__tests__/styles/controlRefreshRules.test.ts +0 -6
- package/src/__tests__/styles/cssTokens.test.ts +6 -3
- package/src/__tests__/styles/menusShellRefresh.test.ts +22 -12
- package/src/__tests__/styles/paletteTokens.test.ts +44 -0
- package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
- package/src/__tests__/utils/plotlyTemplate.test.ts +4 -4
- package/src/__tests__/utils/time.test.ts +18 -1
- package/src/components/AdductText.story.vue +7 -0
- package/src/components/AdductText.vue +1 -1
- package/src/components/AlertBox.story.vue +2 -2
- package/src/components/AlertBox.vue +18 -16
- package/src/components/AppSidebar.story.vue +0 -28
- package/src/components/AppTopBar.onboarding.story.vue +69 -0
- package/src/components/AppTopBar.story.vue +105 -15
- package/src/components/AppTopBar.vue +248 -122
- package/src/components/ArtifactSaveDialog.story.vue +23 -0
- package/src/components/ArtifactSaveDialog.vue +102 -12
- package/src/components/AuditTrail.story.vue +2 -1
- package/src/components/AuditTrail.vue +2 -21
- package/src/components/Avatar.vue +10 -14
- package/src/components/BaseButton.vue +16 -2
- package/src/components/BaseSelect.multiple.story.vue +13 -2
- package/src/components/BaseSelect.vue +4 -3
- package/src/components/BatchProgressList.vue +35 -25
- package/src/components/ChartContainer.story.vue +2 -1
- package/src/components/ChartContainer.vue +8 -6
- package/src/components/ConfirmDialog.story.vue +1 -1
- package/src/components/EmptyState.vue +1 -1
- package/src/components/ExperimentPopover.story.vue +165 -53
- package/src/components/ExperimentPopover.vue +169 -187
- package/src/components/ExperimentSelectorModal.story.vue +73 -31
- package/src/components/ExperimentSelectorModal.vue +144 -111
- package/src/components/FormField.story.vue +8 -48
- package/src/components/GeneratedPluginView.vue +11 -10
- package/src/components/GeneratedResultRenderer.vue +3 -4
- package/src/components/InstrumentStateBadge.vue +1 -1
- package/src/components/JobsStatusTray.story.vue +97 -43
- package/src/components/JobsStatusTray.vue +287 -290
- package/src/components/LayoutResizeHandle.story.vue +65 -4
- package/src/components/LoadingSpinner.vue +1 -1
- package/src/components/NumberInput.vue +3 -6
- package/src/components/PluginIcon.story.vue +2 -10
- package/src/components/PluginIcon.vue +2 -2
- package/src/components/PluginWorkspaceView.props.ts +3 -0
- package/src/components/PluginWorkspaceView.story.vue +1 -1
- package/src/components/PluginWorkspaceView.vue +17 -0
- package/src/components/RuntimeUpdateNotice.vue +1 -1
- package/src/components/SampleSelector.story.vue +22 -7
- package/src/components/SampleSelector.vue +34 -37
- package/src/components/SampleSelectorGroupNode.vue +1 -1
- package/src/components/SectionCard.story.vue +35 -2
- package/src/components/SequenceProgressBar.story.vue +9 -0
- package/src/components/SequenceProgressBar.vue +6 -1
- package/src/components/SettingsModal.schema.ts +1 -1
- package/src/components/SettingsModal.vue +9 -14
- package/src/components/SmartGroupFieldRecipe.story.vue +1 -1
- package/src/components/SmartGroupManual.story.vue +1 -1
- package/src/components/StepWizard.story.vue +33 -0
- package/src/components/StepWizard.vue +8 -1
- package/src/components/WellPlate.story.vue +3 -1
- package/src/components/WellPlate.vue +7 -0
- package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
- package/src/components/internal/AppTopBarPillNavInternal.vue +33 -2
- package/src/components/internal/DatePickerDateInternal.vue +16 -40
- package/src/components/internal/DatePickerDateTimeInternal.vue +3 -13
- package/src/components/internal/DatePickerTimeInternal.vue +5 -8
- package/src/components/internal/OnboardingLayerInternal.vue +173 -0
- package/src/components/internal/ResourcePickerListInternal.vue +45 -85
- package/src/components/internal/SelectMultipleInternal.vue +182 -65
- package/src/components/internal/SelectSearchableInternal.vue +2 -3
- package/src/components/internal/WorkspaceShellInternal.vue +12 -0
- package/src/composables/createClient.ts +2 -0
- package/src/composables/index.ts +1 -0
- package/src/composables/pluginIdentity.ts +31 -0
- package/src/composables/pluginWorkspaceModel.ts +2 -2
- package/src/composables/useAppExperiment.ts +20 -0
- package/src/composables/useCalendarGrid.ts +4 -3
- package/src/composables/useExperimentSelector.ts +77 -31
- package/src/composables/useJobCenter.ts +188 -6
- package/src/composables/useOnboarding.ts +465 -0
- package/src/composables/usePluginWorkspace.ts +1 -1
- package/src/runtime.ts +2 -1
- package/src/shell.ts +17 -0
- package/src/stores/index.ts +0 -2
- package/src/stores/settings.ts +20 -50
- package/src/styles/components/adduct-text.css +13 -5
- package/src/styles/components/alert-box.css +39 -58
- package/src/styles/components/app-layout.css +7 -5
- package/src/styles/components/app-page-selector.css +121 -44
- package/src/styles/components/app-pill-nav.css +11 -12
- package/src/styles/components/app-sidebar.css +9 -18
- package/src/styles/components/app-top-bar.css +219 -55
- package/src/styles/components/artifact-save-dialog.css +153 -2
- package/src/styles/components/audit-trail.css +16 -19
- package/src/styles/components/avatar.css +6 -4
- package/src/styles/components/batch-progress-list.css +38 -36
- package/src/styles/components/button.css +36 -59
- package/src/styles/components/calendar.css +12 -12
- package/src/styles/components/chart-container.css +34 -23
- package/src/styles/components/checkbox.css +2 -12
- package/src/styles/components/collapsible-card.css +27 -29
- package/src/styles/components/confirm-dialog.css +13 -14
- package/src/styles/components/dataframe.css +13 -5
- package/src/styles/components/date-picker.css +80 -92
- package/src/styles/components/datetime-picker.css +31 -43
- package/src/styles/components/divider.css +20 -20
- package/src/styles/components/dose-calculator.css +3 -3
- package/src/styles/components/empty-state.css +20 -17
- package/src/styles/components/experiment-code-badge.css +2 -0
- package/src/styles/components/experiment-popover.css +174 -329
- package/src/styles/components/experiment-selector-modal.css +88 -56
- package/src/styles/components/file-picker.css +3 -3
- package/src/styles/components/file-uploader.css +38 -49
- package/src/styles/components/form-builder.css +3 -3
- package/src/styles/components/formula-input.css +1 -1
- package/src/styles/components/icon-button.css +18 -24
- package/src/styles/components/input.css +5 -4
- package/src/styles/components/instrument-monitor.css +13 -15
- package/src/styles/components/jobs-status-tray.css +140 -296
- package/src/styles/components/layout-resize-handle.css +59 -16
- package/src/styles/components/modal.css +4 -6
- package/src/styles/components/molecule-input.css +2 -2
- package/src/styles/components/multi-select.css +65 -117
- package/src/styles/components/number-input.css +26 -19
- package/src/styles/components/onboarding.css +368 -0
- package/src/styles/components/pill.css +3 -2
- package/src/styles/components/plate-editor.css +0 -1
- package/src/styles/components/plugin-icon.css +26 -23
- package/src/styles/components/popover.css +2 -2
- package/src/styles/components/presence-avatars.css +1 -1
- package/src/styles/components/progress-bar.css +3 -3
- package/src/styles/components/protocol-step-editor.css +1 -3
- package/src/styles/components/resource-card.css +2 -2
- package/src/styles/components/resource-picker-list.css +6 -57
- package/src/styles/components/sample-hierarchy-tree.css +4 -4
- package/src/styles/components/sample-selector.css +138 -79
- package/src/styles/components/schedule-calendar.css +8 -8
- package/src/styles/components/searchable-select.css +12 -12
- package/src/styles/components/section-card.css +54 -49
- package/src/styles/components/segmented-control.css +18 -15
- package/src/styles/components/select.css +3 -3
- package/src/styles/components/sequence-input.css +2 -2
- package/src/styles/components/sequence-progress-bar.css +17 -8
- package/src/styles/components/settings-modal.css +7 -2
- package/src/styles/components/smart-group.css +18 -18
- package/src/styles/components/step-wizard.css +52 -16
- package/src/styles/components/tabs.css +2 -2
- package/src/styles/components/textarea.css +3 -3
- package/src/styles/components/time-picker.css +36 -21
- package/src/styles/components/toast.css +12 -10
- package/src/styles/components/toggle.css +1 -11
- package/src/styles/components/tooltip.css +10 -9
- package/src/styles/components/unit-input.css +8 -7
- package/src/styles/components/well-plate.css +9 -2
- package/src/styles/index.css +1 -0
- package/src/styles/variables.css +241 -78
- package/src/types/componentWorkflowTypes.ts +2 -0
- package/src/types/components.ts +2 -0
- package/src/types/generated/platformContext.ts +1 -0
- package/src/types/generated-ui.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/jobs.ts +10 -0
- package/src/types/platform.ts +1 -1
- package/src/utils/time.ts +21 -0
- package/dist/ActionMenu-CScINahU.js.map +0 -1
- package/dist/AppSidebar-BmiiPfz9.js.map +0 -1
- package/dist/BaseModal-DfRIuVoj.js.map +0 -1
- package/dist/ExperimentPopover-C4sGw-is.js +0 -359
- package/dist/ExperimentPopover-C4sGw-is.js.map +0 -1
- package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +0 -1
- package/dist/SettingsModal-CSLE31yg.js.map +0 -1
- package/dist/data-C2PwI_dn.js.map +0 -1
- package/dist/experiment-43OJtH7R.js.map +0 -1
- package/dist/lab-DLwRl_Ql.js.map +0 -1
- package/dist/records-BzTcxekG.js.map +0 -1
- package/dist/runtime-D6gVat6r.js.map +0 -1
- package/dist/useListReorder-CcbEYxX-.js.map +0 -1
- package/dist/useRackEditor-BD5NIo5s.js.map +0 -1
- package/dist/useRealtime-PalKue84.js +0 -696
- package/dist/useRealtime-PalKue84.js.map +0 -1
- package/dist/useRequest-D5JDfsgZ.js +0 -76
- package/dist/useRequest-D5JDfsgZ.js.map +0 -1
package/README.md
CHANGED
|
@@ -415,19 +415,30 @@ derives its groups from the same jobs ref and does not mirror it with a watcher:
|
|
|
415
415
|
|
|
416
416
|
```vue
|
|
417
417
|
<script setup lang="ts">
|
|
418
|
+
import { AppTopBar } from '@morscherlab/mint-sdk/shell'
|
|
418
419
|
import { JobsStatusTray } from '@morscherlab/mint-sdk/data'
|
|
420
|
+
import { useJobCenter } from '@morscherlab/mint-sdk/runtime'
|
|
421
|
+
import type { JobState } from '@morscherlab/mint-sdk/types'
|
|
419
422
|
import { useJobs } from './generated/mint-plugin'
|
|
420
423
|
|
|
421
424
|
const jobs = useJobs('analyze')
|
|
425
|
+
const center = useJobCenter({ source: jobs })
|
|
426
|
+
function openResult(job: JobState) { /* show the job's result */ }
|
|
422
427
|
</script>
|
|
423
428
|
|
|
424
429
|
<template>
|
|
425
|
-
<
|
|
430
|
+
<AppTopBar
|
|
431
|
+
:job="center.topBarJob.value"
|
|
432
|
+
:jobs-done="center.completedCount.value"
|
|
433
|
+
@job-click="center.handleTopBarClick(openResult)"
|
|
434
|
+
/>
|
|
435
|
+
<JobsStatusTray :center="center" @select="openResult" />
|
|
426
436
|
</template>
|
|
427
437
|
```
|
|
428
438
|
|
|
429
|
-
|
|
430
|
-
actions therefore have exactly one state owner.
|
|
439
|
+
The job center reads only the runtime source. Polling, SSE updates, and job
|
|
440
|
+
actions therefore have exactly one state owner. `PluginWorkspaceView` does this
|
|
441
|
+
wiring when its spec sets `jobs: jobs` and emits `job-select`.
|
|
431
442
|
|
|
432
443
|
When an incremental migration temporarily has more than one owner, use
|
|
433
444
|
`combinePluginJobSources([sdkJobs, legacyJobs])`. It preserves each source's
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { Fragment,
|
|
4
|
-
import { computePosition, flip, offset, shift } from "@floating-ui/dom";
|
|
5
|
-
import { Check, Ellipsis } from "lucide-vue-next";
|
|
1
|
+
import { a as BaseButton_default } from "./useDropdownState-Bb2N4m40.js";
|
|
2
|
+
import { L as EmptyState_default } from "./records-CR_pYzIP.js";
|
|
3
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, toValue, useSlots, withCtx } from "vue";
|
|
6
4
|
//#region src/composables/useTextSearch.ts
|
|
7
5
|
/** Shared text-search filtering for tables, lists, selectors, and chip inputs. */
|
|
8
6
|
function useTextSearch(options) {
|
|
@@ -36,7 +34,7 @@ function candidateMatchesSearch(candidate, query) {
|
|
|
36
34
|
}
|
|
37
35
|
//#endregion
|
|
38
36
|
//#region src/components/LoadingSpinner.vue?vue&type=script&setup=true&lang.ts
|
|
39
|
-
var _hoisted_1$
|
|
37
|
+
var _hoisted_1$2 = { class: "mint-spinner__label" };
|
|
40
38
|
//#endregion
|
|
41
39
|
//#region src/components/LoadingSpinner.vue
|
|
42
40
|
var LoadingSpinner_default = /* @__PURE__ */ defineComponent({
|
|
@@ -70,15 +68,15 @@ var LoadingSpinner_default = /* @__PURE__ */ defineComponent({
|
|
|
70
68
|
}), createElementVNode("path", {
|
|
71
69
|
style: { "opacity": "0.75" },
|
|
72
70
|
fill: "currentColor",
|
|
73
|
-
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0
|
|
74
|
-
})], -1)), createElementVNode("span", _hoisted_1$
|
|
71
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
|
|
72
|
+
})], -1)), createElementVNode("span", _hoisted_1$2, toDisplayString(__props.label), 1)], 2);
|
|
75
73
|
};
|
|
76
74
|
}
|
|
77
75
|
});
|
|
78
76
|
//#endregion
|
|
79
77
|
//#region src/components/internal/DataStateInternal.vue?vue&type=script&setup=true&lang.ts
|
|
80
|
-
var _hoisted_1$
|
|
81
|
-
var _hoisted_2$
|
|
78
|
+
var _hoisted_1$1 = ["data-state"];
|
|
79
|
+
var _hoisted_2$1 = {
|
|
82
80
|
class: "mint-data-state__loading-text",
|
|
83
81
|
"aria-hidden": "true"
|
|
84
82
|
};
|
|
@@ -121,7 +119,7 @@ var DataStateInternal_default = /* @__PURE__ */ defineComponent({
|
|
|
121
119
|
}, [__props.state === "loading" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createVNode(LoadingSpinner_default, {
|
|
122
120
|
size: spinnerSize.value,
|
|
123
121
|
label: __props.loadingLabel
|
|
124
|
-
}, null, 8, ["size", "label"]), createElementVNode("p", _hoisted_2$
|
|
122
|
+
}, null, 8, ["size", "label"]), createElementVNode("p", _hoisted_2$1, toDisplayString(__props.loadingLabel), 1)], 64)) : (openBlock(), createBlock(EmptyState_default, {
|
|
125
123
|
key: 1,
|
|
126
124
|
title: __props.title,
|
|
127
125
|
description: __props.description,
|
|
@@ -142,50 +140,56 @@ var DataStateInternal_default = /* @__PURE__ */ defineComponent({
|
|
|
142
140
|
"size",
|
|
143
141
|
"variant",
|
|
144
142
|
"action-label"
|
|
145
|
-
]))], 10, _hoisted_1$
|
|
143
|
+
]))], 10, _hoisted_1$1);
|
|
146
144
|
};
|
|
147
145
|
}
|
|
148
146
|
});
|
|
149
147
|
//#endregion
|
|
150
148
|
//#region src/components/AlertBox.vue?vue&type=script&setup=true&lang.ts
|
|
151
|
-
var _hoisted_1
|
|
149
|
+
var _hoisted_1 = {
|
|
152
150
|
key: 0,
|
|
153
|
-
class: "mint-alert__icon mint-alert__icon--success",
|
|
154
151
|
viewBox: "0 0 24 24",
|
|
155
152
|
fill: "none",
|
|
156
153
|
stroke: "currentColor",
|
|
157
|
-
"stroke-width": "2",
|
|
154
|
+
"stroke-width": "2.25",
|
|
158
155
|
"stroke-linecap": "round",
|
|
159
156
|
"stroke-linejoin": "round"
|
|
160
157
|
};
|
|
161
|
-
var _hoisted_2
|
|
158
|
+
var _hoisted_2 = {
|
|
162
159
|
key: 1,
|
|
163
|
-
class: "mint-alert__icon mint-alert__icon--error",
|
|
164
160
|
viewBox: "0 0 24 24",
|
|
165
161
|
fill: "none",
|
|
166
162
|
stroke: "currentColor",
|
|
167
|
-
"stroke-width": "2",
|
|
163
|
+
"stroke-width": "2.25",
|
|
168
164
|
"stroke-linecap": "round",
|
|
169
165
|
"stroke-linejoin": "round"
|
|
170
166
|
};
|
|
171
|
-
var _hoisted_3
|
|
167
|
+
var _hoisted_3 = {
|
|
172
168
|
key: 2,
|
|
173
|
-
class: "mint-alert__icon mint-alert__icon--warning",
|
|
174
169
|
viewBox: "0 0 24 24",
|
|
175
170
|
fill: "none",
|
|
176
171
|
stroke: "currentColor",
|
|
177
|
-
"stroke-width": "2",
|
|
172
|
+
"stroke-width": "2.25",
|
|
173
|
+
"stroke-linecap": "round",
|
|
174
|
+
"stroke-linejoin": "round"
|
|
175
|
+
};
|
|
176
|
+
var _hoisted_4 = {
|
|
177
|
+
key: 3,
|
|
178
|
+
viewBox: "0 0 24 24",
|
|
179
|
+
fill: "none",
|
|
180
|
+
stroke: "currentColor",
|
|
181
|
+
"stroke-width": "2.25",
|
|
178
182
|
"stroke-linecap": "round",
|
|
179
183
|
"stroke-linejoin": "round"
|
|
180
184
|
};
|
|
181
|
-
var
|
|
182
|
-
var
|
|
185
|
+
var _hoisted_5 = { class: "mint-alert__content" };
|
|
186
|
+
var _hoisted_6 = {
|
|
183
187
|
key: 0,
|
|
184
188
|
class: "mint-alert__title"
|
|
185
189
|
};
|
|
186
|
-
var
|
|
187
|
-
var
|
|
188
|
-
key:
|
|
190
|
+
var _hoisted_7 = { class: "mint-alert__message" };
|
|
191
|
+
var _hoisted_8 = {
|
|
192
|
+
key: 0,
|
|
189
193
|
class: "mint-alert__actions"
|
|
190
194
|
};
|
|
191
195
|
//#endregion
|
|
@@ -213,11 +217,11 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
|
|
|
213
217
|
class: normalizeClass(["mint-alert", `mint-alert--${props.tone}`]),
|
|
214
218
|
role: "alert"
|
|
215
219
|
}, [
|
|
216
|
-
props.tone === "success" ? (openBlock(), createElementBlock("svg", _hoisted_1
|
|
220
|
+
createElementVNode("span", { class: normalizeClass(["mint-alert__icon", `mint-alert__icon--${props.tone}`]) }, [props.tone === "success" ? (openBlock(), createElementBlock("svg", _hoisted_1, [..._cache[2] || (_cache[2] = [createElementVNode("circle", {
|
|
217
221
|
cx: "12",
|
|
218
222
|
cy: "12",
|
|
219
223
|
r: "10"
|
|
220
|
-
}, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : props.tone === "error" ? (openBlock(), createElementBlock("svg", _hoisted_2
|
|
224
|
+
}, null, -1), createElementVNode("path", { d: "m9 12 2 2 4-4" }, null, -1)])])) : props.tone === "error" ? (openBlock(), createElementBlock("svg", _hoisted_2, [..._cache[3] || (_cache[3] = [
|
|
221
225
|
createElementVNode("circle", {
|
|
222
226
|
cx: "12",
|
|
223
227
|
cy: "12",
|
|
@@ -225,20 +229,11 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
|
|
|
225
229
|
}, null, -1),
|
|
226
230
|
createElementVNode("path", { d: "m15 9-6 6" }, null, -1),
|
|
227
231
|
createElementVNode("path", { d: "m9 9 6 6" }, null, -1)
|
|
228
|
-
])])) : props.tone === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_3
|
|
232
|
+
])])) : props.tone === "warning" ? (openBlock(), createElementBlock("svg", _hoisted_3, [..._cache[4] || (_cache[4] = [
|
|
229
233
|
createElementVNode("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }, null, -1),
|
|
230
234
|
createElementVNode("path", { d: "M12 9v4" }, null, -1),
|
|
231
235
|
createElementVNode("path", { d: "M12 17h.01" }, null, -1)
|
|
232
|
-
])])) : (openBlock(), createElementBlock("svg",
|
|
233
|
-
key: 3,
|
|
234
|
-
class: normalizeClass(["mint-alert__icon", `mint-alert__icon--${props.tone}`]),
|
|
235
|
-
viewBox: "0 0 24 24",
|
|
236
|
-
fill: "none",
|
|
237
|
-
stroke: "currentColor",
|
|
238
|
-
"stroke-width": "2",
|
|
239
|
-
"stroke-linecap": "round",
|
|
240
|
-
"stroke-linejoin": "round"
|
|
241
|
-
}, [..._cache[5] || (_cache[5] = [
|
|
236
|
+
])])) : (openBlock(), createElementBlock("svg", _hoisted_4, [..._cache[5] || (_cache[5] = [
|
|
242
237
|
createElementVNode("circle", {
|
|
243
238
|
cx: "12",
|
|
244
239
|
cy: "12",
|
|
@@ -246,9 +241,9 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
|
|
|
246
241
|
}, null, -1),
|
|
247
242
|
createElementVNode("path", { d: "M12 16v-4" }, null, -1),
|
|
248
243
|
createElementVNode("path", { d: "M12 8h.01" }, null, -1)
|
|
249
|
-
])], 2)
|
|
250
|
-
createElementVNode("div",
|
|
251
|
-
hasActions() ? (openBlock(), createElementBlock("div",
|
|
244
|
+
])]))], 2),
|
|
245
|
+
createElementVNode("div", _hoisted_5, [props.title ? (openBlock(), createElementBlock("h4", _hoisted_6, toDisplayString(props.title), 1)) : createCommentVNode("", true), createElementVNode("div", _hoisted_7, [renderSlot(_ctx.$slots, "default")])]),
|
|
246
|
+
hasActions() ? (openBlock(), createElementBlock("div", _hoisted_8, [renderSlot(_ctx.$slots, "actions", {}, () => [createVNode(BaseButton_default, {
|
|
252
247
|
variant: "secondary",
|
|
253
248
|
size: "sm",
|
|
254
249
|
onClick: _cache[0] || (_cache[0] = ($event) => emit("action"))
|
|
@@ -257,7 +252,7 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
|
|
|
257
252
|
_: 1
|
|
258
253
|
})])])) : createCommentVNode("", true),
|
|
259
254
|
props.dismissible ? (openBlock(), createElementBlock("button", {
|
|
260
|
-
key:
|
|
255
|
+
key: 1,
|
|
261
256
|
type: "button",
|
|
262
257
|
class: "mint-alert__dismiss",
|
|
263
258
|
"aria-label": "Dismiss",
|
|
@@ -276,170 +271,6 @@ var AlertBox_default = /* @__PURE__ */ defineComponent({
|
|
|
276
271
|
}
|
|
277
272
|
});
|
|
278
273
|
//#endregion
|
|
279
|
-
|
|
280
|
-
var _hoisted_1 = {
|
|
281
|
-
key: 0,
|
|
282
|
-
class: "mint-menu-separator",
|
|
283
|
-
role: "separator"
|
|
284
|
-
};
|
|
285
|
-
var _hoisted_2 = [
|
|
286
|
-
"href",
|
|
287
|
-
"target",
|
|
288
|
-
"rel",
|
|
289
|
-
"onClick"
|
|
290
|
-
];
|
|
291
|
-
var _hoisted_3 = [
|
|
292
|
-
"role",
|
|
293
|
-
"aria-checked",
|
|
294
|
-
"disabled",
|
|
295
|
-
"onClick"
|
|
296
|
-
];
|
|
297
|
-
//#endregion
|
|
298
|
-
//#region src/components/ActionMenu.vue
|
|
299
|
-
var ActionMenu_default = /* @__PURE__ */ defineComponent({
|
|
300
|
-
__name: "ActionMenu",
|
|
301
|
-
props: {
|
|
302
|
-
label: {},
|
|
303
|
-
items: {},
|
|
304
|
-
disabled: {
|
|
305
|
-
type: Boolean,
|
|
306
|
-
default: false
|
|
307
|
-
}
|
|
308
|
-
},
|
|
309
|
-
emits: [
|
|
310
|
-
"select",
|
|
311
|
-
"open",
|
|
312
|
-
"close"
|
|
313
|
-
],
|
|
314
|
-
setup(__props, { emit: __emit }) {
|
|
315
|
-
/** Compact overflow actions with an icon-only BaseButton trigger and a viewport-safe teleported menu. */
|
|
316
|
-
const props = __props;
|
|
317
|
-
const emit = __emit;
|
|
318
|
-
const panelRef = ref(null);
|
|
319
|
-
const panelStyle = ref({ visibility: "hidden" });
|
|
320
|
-
const { isOpen, rootRef, triggerRef, open, close } = useDropdownState({
|
|
321
|
-
closeOnScroll: true,
|
|
322
|
-
insideRefs: [panelRef],
|
|
323
|
-
onOpen: () => {
|
|
324
|
-
panelStyle.value = { visibility: "hidden" };
|
|
325
|
-
emit("open");
|
|
326
|
-
},
|
|
327
|
-
onClose: () => emit("close")
|
|
328
|
-
});
|
|
329
|
-
onMounted(() => {
|
|
330
|
-
triggerRef.value = rootRef.value?.querySelector("button") ?? null;
|
|
331
|
-
});
|
|
332
|
-
function menuItems() {
|
|
333
|
-
if (!panelRef.value) return [];
|
|
334
|
-
return Array.from(panelRef.value.querySelectorAll(".mint-action-menu__item:not(:disabled)"));
|
|
335
|
-
}
|
|
336
|
-
async function positionPanel() {
|
|
337
|
-
const trigger = triggerRef.value;
|
|
338
|
-
const panel = panelRef.value;
|
|
339
|
-
if (!trigger || !panel) return;
|
|
340
|
-
const position = await computePosition(trigger, panel, {
|
|
341
|
-
placement: "bottom-end",
|
|
342
|
-
strategy: "fixed",
|
|
343
|
-
middleware: [
|
|
344
|
-
offset(4),
|
|
345
|
-
flip(),
|
|
346
|
-
shift({ padding: 8 })
|
|
347
|
-
]
|
|
348
|
-
});
|
|
349
|
-
panelStyle.value = {
|
|
350
|
-
left: `${position.x}px`,
|
|
351
|
-
top: `${position.y}px`,
|
|
352
|
-
visibility: "visible"
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
/** `focusFirst` is false when the keyboard composable owns the initial focus. */
|
|
356
|
-
function openMenu(focusFirst = true) {
|
|
357
|
-
if (props.disabled || isOpen.value) return;
|
|
358
|
-
open();
|
|
359
|
-
if (focusFirst) nextTick(() => menuItems()[0]?.focus());
|
|
360
|
-
}
|
|
361
|
-
function toggleMenu() {
|
|
362
|
-
if (props.disabled) return;
|
|
363
|
-
if (isOpen.value) close();
|
|
364
|
-
else openMenu();
|
|
365
|
-
}
|
|
366
|
-
const { handleTriggerKeydown, handlePanelKeydown } = useMenuKeyboard({
|
|
367
|
-
items: menuItems,
|
|
368
|
-
isOpen: () => isOpen.value,
|
|
369
|
-
open: () => openMenu(false),
|
|
370
|
-
close
|
|
371
|
-
});
|
|
372
|
-
function handleSelect(item) {
|
|
373
|
-
if (item.disabled) return;
|
|
374
|
-
emit("select", item);
|
|
375
|
-
close();
|
|
376
|
-
}
|
|
377
|
-
watch(isOpen, async (opened) => {
|
|
378
|
-
if (!opened) return;
|
|
379
|
-
await nextTick();
|
|
380
|
-
await positionPanel();
|
|
381
|
-
});
|
|
382
|
-
return (_ctx, _cache) => {
|
|
383
|
-
return openBlock(), createElementBlock(Fragment, null, [createElementVNode("span", {
|
|
384
|
-
ref_key: "rootRef",
|
|
385
|
-
ref: rootRef,
|
|
386
|
-
class: "mint-action-menu"
|
|
387
|
-
}, [renderSlot(_ctx.$slots, "trigger", {
|
|
388
|
-
open: unref(isOpen),
|
|
389
|
-
toggle: toggleMenu,
|
|
390
|
-
keydown: unref(handleTriggerKeydown)
|
|
391
|
-
}, () => [createVNode(BaseButton_default, {
|
|
392
|
-
variant: "secondary",
|
|
393
|
-
size: "sm",
|
|
394
|
-
icon: unref(Ellipsis),
|
|
395
|
-
label: __props.label,
|
|
396
|
-
disabled: __props.disabled,
|
|
397
|
-
"aria-haspopup": "menu",
|
|
398
|
-
"aria-expanded": unref(isOpen),
|
|
399
|
-
onClick: toggleMenu,
|
|
400
|
-
onKeydown: unref(handleTriggerKeydown)
|
|
401
|
-
}, null, 8, [
|
|
402
|
-
"icon",
|
|
403
|
-
"label",
|
|
404
|
-
"disabled",
|
|
405
|
-
"aria-expanded",
|
|
406
|
-
"onKeydown"
|
|
407
|
-
])])], 512), (openBlock(), createBlock(Teleport, { to: "body" }, [unref(isOpen) ? (openBlock(), createElementBlock("div", {
|
|
408
|
-
key: 0,
|
|
409
|
-
ref_key: "panelRef",
|
|
410
|
-
ref: panelRef,
|
|
411
|
-
class: "mint-popover mint-action-menu__panel",
|
|
412
|
-
style: normalizeStyle(panelStyle.value),
|
|
413
|
-
role: "menu",
|
|
414
|
-
onKeydown: _cache[0] || (_cache[0] = (...args) => unref(handlePanelKeydown) && unref(handlePanelKeydown)(...args))
|
|
415
|
-
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
|
|
416
|
-
return openBlock(), createElementBlock(Fragment, { key: item.id }, [item.danger && index > 0 && !__props.items[index - 1].danger ? (openBlock(), createElementBlock("div", _hoisted_1)) : createCommentVNode("", true), item.href !== void 0 && !item.disabled ? (openBlock(), createElementBlock("a", {
|
|
417
|
-
key: 1,
|
|
418
|
-
href: item.href,
|
|
419
|
-
target: item.target,
|
|
420
|
-
rel: item.target === "_blank" ? "noopener noreferrer" : void 0,
|
|
421
|
-
class: normalizeClass(["mint-menu-item mint-action-menu__item", { "mint-menu-item--danger mint-action-menu__item--danger": item.danger }]),
|
|
422
|
-
role: "menuitem",
|
|
423
|
-
onClick: ($event) => handleSelect(item)
|
|
424
|
-
}, toDisplayString(item.label), 11, _hoisted_2)) : (openBlock(), createElementBlock("button", {
|
|
425
|
-
key: 2,
|
|
426
|
-
type: "button",
|
|
427
|
-
class: normalizeClass(["mint-menu-item mint-action-menu__item", { "mint-menu-item--danger mint-action-menu__item--danger": item.danger }]),
|
|
428
|
-
role: item.checked === void 0 ? "menuitem" : "menuitemradio",
|
|
429
|
-
"aria-checked": item.checked,
|
|
430
|
-
disabled: item.disabled,
|
|
431
|
-
onClick: ($event) => handleSelect(item)
|
|
432
|
-
}, [item.checked !== void 0 ? (openBlock(), createBlock(unref(Check), {
|
|
433
|
-
key: 0,
|
|
434
|
-
class: normalizeClass(["mint-action-menu__check", { "mint-action-menu__check--off": !item.checked }]),
|
|
435
|
-
size: 14,
|
|
436
|
-
"aria-hidden": "true"
|
|
437
|
-
}, null, 8, ["class"])) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(item.label), 1)], 10, _hoisted_3))], 64);
|
|
438
|
-
}), 128))], 36)) : createCommentVNode("", true)]))], 64);
|
|
439
|
-
};
|
|
440
|
-
}
|
|
441
|
-
});
|
|
442
|
-
//#endregion
|
|
443
|
-
export { candidateMatchesSearch as a, LoadingSpinner_default as i, AlertBox_default as n, normalizeSearchQuery as o, DataStateInternal_default as r, useTextSearch as s, ActionMenu_default as t };
|
|
274
|
+
export { normalizeSearchQuery as a, candidateMatchesSearch as i, DataStateInternal_default as n, useTextSearch as o, LoadingSpinner_default as r, AlertBox_default as t };
|
|
444
275
|
|
|
445
|
-
//# sourceMappingURL=
|
|
276
|
+
//# sourceMappingURL=AlertBox-CzLg0UaL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertBox-CzLg0UaL.js","names":[],"sources":["../src/composables/useTextSearch.ts","../src/components/LoadingSpinner.vue","../src/components/LoadingSpinner.vue","../src/components/internal/DataStateInternal.vue","../src/components/internal/DataStateInternal.vue","../src/components/AlertBox.vue","../src/components/AlertBox.vue"],"sourcesContent":["import { computed, toValue, type ComputedRef, type Ref } from 'vue'\n\nexport type TextSearchSource<T> =\n | T\n | Ref<T>\n | ComputedRef<T>\n | (() => T)\n\nexport type TextSearchCandidate = unknown | readonly unknown[]\n\nexport interface UseTextSearchOptions<TItem> {\n items: TextSearchSource<readonly TItem[]>\n query: TextSearchSource<string | null | undefined>\n enabled?: TextSearchSource<boolean | null | undefined>\n getText: (item: TItem) => TextSearchCandidate\n}\n\nexport interface UseTextSearchReturn<TItem> {\n query: ComputedRef<string>\n filteredItems: ComputedRef<TItem[]>\n matches: (item: TItem, query?: string | null | undefined) => boolean\n}\n\n/** Shared text-search filtering for tables, lists, selectors, and chip inputs. */\nexport function useTextSearch<TItem>(options: UseTextSearchOptions<TItem>): UseTextSearchReturn<TItem> {\n const query = computed(() => normalizeSearchQuery(toValue(options.query)))\n const enabled = computed(() => toValue(options.enabled) ?? true)\n\n function matches(item: TItem, overrideQuery?: string | null | undefined): boolean {\n const activeQuery = overrideQuery === undefined ? query.value : normalizeSearchQuery(overrideQuery)\n if (!activeQuery) return true\n return candidateMatchesSearch(options.getText(item), activeQuery)\n }\n\n const filteredItems = computed(() => {\n const items = [...toValue(options.items)]\n if (!enabled.value || !query.value) return items\n return items.filter(item => matches(item))\n })\n\n return {\n query,\n filteredItems,\n matches,\n }\n}\n\nexport function normalizeSearchQuery(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase()\n}\n\nexport function candidateMatchesSearch(candidate: TextSearchCandidate, query: string): boolean {\n const normalizedQuery = normalizeSearchQuery(query)\n if (!normalizedQuery) return true\n const values = Array.isArray(candidate) ? candidate : [candidate]\n return values.some((value) => {\n if (value === null || value === undefined) return false\n return String(value).toLowerCase().includes(normalizedQuery)\n })\n}\n","<script setup lang=\"ts\">\n/** Animated SVG spinner with size and tone, and a visually hidden status label for screen readers. `tone=\"inherit\"` takes the parent's text color. */\nimport type { Tone } from '../types'\n\ninterface Props {\n size?: 'xs' | 'sm' | 'md' | 'lg'\n tone?: Tone | 'inherit'\n label?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 'md',\n tone: 'primary',\n label: 'Loading',\n})\n</script>\n\n<template>\n <div\n :class=\"[\n 'mint-spinner',\n `mint-spinner--${size}`,\n `mint-spinner--${tone}`,\n ]\"\n role=\"status\"\n >\n <svg\n class=\"mint-spinner__svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n style=\"opacity: 0.25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n />\n <path\n style=\"opacity: 0.75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span class=\"mint-spinner__label\">{{ label }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Animated SVG spinner with size and tone, and a visually hidden status label for screen readers. `tone=\"inherit\"` takes the parent's text color. */\nimport type { Tone } from '../types'\n\ninterface Props {\n size?: 'xs' | 'sm' | 'md' | 'lg'\n tone?: Tone | 'inherit'\n label?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 'md',\n tone: 'primary',\n label: 'Loading',\n})\n</script>\n\n<template>\n <div\n :class=\"[\n 'mint-spinner',\n `mint-spinner--${size}`,\n `mint-spinner--${tone}`,\n ]\"\n role=\"status\"\n >\n <svg\n class=\"mint-spinner__svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n style=\"opacity: 0.25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n />\n <path\n style=\"opacity: 0.75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span class=\"mint-spinner__label\">{{ label }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Shared loading / error / empty presentation for the SDK data components.\n *\n * Internal: not exported from the package entrypoints. Data components render\n * this instead of hand-rolling their own placeholder markup so that the\n * loading, error and empty states look the same everywhere.\n */\nimport { computed } from 'vue'\nimport EmptyState from '../EmptyState.vue'\nimport LoadingSpinner from '../LoadingSpinner.vue'\n\n/** Single-path warning triangle used for the error state. */\nconst ERROR_ICON_PATH\n = 'M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'\n + 'M12 9v4M12 17h.01'\n\ninterface Props {\n /** Which of the three placeholder states to render. */\n state: 'loading' | 'error' | 'empty'\n /** Headline for the empty/error state. */\n title?: string\n /** Supporting copy for the empty/error state. */\n description?: string\n /** Custom `<path d>` for the empty state icon (the error state has its own). */\n iconPath?: string\n /** Placeholder scale; also drives the loading spinner size. */\n size?: 'sm' | 'md' | 'lg'\n /** `EmptyState` layout variant. */\n variant?: 'illustrated' | 'inline'\n /** Accessible label (and visible caption) for the loading state. */\n loadingLabel?: string\n /** Optional call-to-action rendered under the empty/error copy. */\n actionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'illustrated',\n loadingLabel: 'Loading',\n})\n\nconst emit = defineEmits<{\n action: []\n}>()\n\nconst spinnerSize = computed(() => (props.size === 'sm' ? 'sm' : props.size === 'lg' ? 'lg' : 'md'))\n</script>\n\n<template>\n <div\n :class=\"['mint-data-state', `mint-data-state--${state}`, `mint-data-state--${size}`]\"\n :data-state=\"state\"\n >\n <template v-if=\"state === 'loading'\">\n <LoadingSpinner :size=\"spinnerSize\" :label=\"loadingLabel\" />\n <p class=\"mint-data-state__loading-text\" aria-hidden=\"true\">{{ loadingLabel }}</p>\n </template>\n <EmptyState\n v-else\n :title=\"title\"\n :description=\"description\"\n :icon-path=\"state === 'error' ? ERROR_ICON_PATH : iconPath\"\n :tone=\"state === 'error' ? 'error' : 'neutral'\"\n :size=\"size\"\n :variant=\"variant\"\n :action-label=\"actionLabel\"\n @action=\"emit('action')\"\n >\n <slot />\n </EmptyState>\n </div>\n</template>\n\n","<script setup lang=\"ts\">\n/**\n * Shared loading / error / empty presentation for the SDK data components.\n *\n * Internal: not exported from the package entrypoints. Data components render\n * this instead of hand-rolling their own placeholder markup so that the\n * loading, error and empty states look the same everywhere.\n */\nimport { computed } from 'vue'\nimport EmptyState from '../EmptyState.vue'\nimport LoadingSpinner from '../LoadingSpinner.vue'\n\n/** Single-path warning triangle used for the error state. */\nconst ERROR_ICON_PATH\n = 'M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'\n + 'M12 9v4M12 17h.01'\n\ninterface Props {\n /** Which of the three placeholder states to render. */\n state: 'loading' | 'error' | 'empty'\n /** Headline for the empty/error state. */\n title?: string\n /** Supporting copy for the empty/error state. */\n description?: string\n /** Custom `<path d>` for the empty state icon (the error state has its own). */\n iconPath?: string\n /** Placeholder scale; also drives the loading spinner size. */\n size?: 'sm' | 'md' | 'lg'\n /** `EmptyState` layout variant. */\n variant?: 'illustrated' | 'inline'\n /** Accessible label (and visible caption) for the loading state. */\n loadingLabel?: string\n /** Optional call-to-action rendered under the empty/error copy. */\n actionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'illustrated',\n loadingLabel: 'Loading',\n})\n\nconst emit = defineEmits<{\n action: []\n}>()\n\nconst spinnerSize = computed(() => (props.size === 'sm' ? 'sm' : props.size === 'lg' ? 'lg' : 'md'))\n</script>\n\n<template>\n <div\n :class=\"['mint-data-state', `mint-data-state--${state}`, `mint-data-state--${size}`]\"\n :data-state=\"state\"\n >\n <template v-if=\"state === 'loading'\">\n <LoadingSpinner :size=\"spinnerSize\" :label=\"loadingLabel\" />\n <p class=\"mint-data-state__loading-text\" aria-hidden=\"true\">{{ loadingLabel }}</p>\n </template>\n <EmptyState\n v-else\n :title=\"title\"\n :description=\"description\"\n :icon-path=\"state === 'error' ? ERROR_ICON_PATH : iconPath\"\n :tone=\"state === 'error' ? 'error' : 'neutral'\"\n :size=\"size\"\n :variant=\"variant\"\n :action-label=\"actionLabel\"\n @action=\"emit('action')\"\n >\n <slot />\n </EmptyState>\n </div>\n</template>\n\n","<script setup lang=\"ts\">\n/** Inline alert banner with semantic icon, title, message slot, optional action button, and optional dismiss button. */\nimport { useSlots } from 'vue'\nimport type { Tone } from '../types'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n tone?: Tone\n title?: string\n dismissible?: boolean\n actionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n tone: 'info',\n dismissible: false,\n})\n\nconst emit = defineEmits<{\n dismiss: []\n action: []\n}>()\n\nconst slots = useSlots()\nconst hasActions = () => !!props.actionLabel || !!slots.actions\n</script>\n\n<template>\n <div\n class=\"mint-alert\"\n :class=\"`mint-alert--${props.tone}`\"\n role=\"alert\"\n >\n <span :class=\"['mint-alert__icon', `mint-alert__icon--${props.tone}`]\">\n <!-- Lucide circle-check -->\n <svg v-if=\"props.tone === 'success'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m9 12 2 2 4-4\" />\n </svg>\n <!-- Lucide circle-x -->\n <svg v-else-if=\"props.tone === 'error'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m15 9-6 6\" /><path d=\"m9 9 6 6\" />\n </svg>\n <!-- Lucide triangle-alert -->\n <svg v-else-if=\"props.tone === 'warning'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" /><path d=\"M12 9v4\" /><path d=\"M12 17h.01\" />\n </svg>\n <!-- Lucide info -->\n <svg v-else viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M12 16v-4\" /><path d=\"M12 8h.01\" />\n </svg>\n </span>\n\n <div class=\"mint-alert__content\">\n <h4 v-if=\"props.title\" class=\"mint-alert__title\">\n {{ props.title }}\n </h4>\n <div class=\"mint-alert__message\">\n <slot />\n </div>\n </div>\n\n <div v-if=\"hasActions()\" class=\"mint-alert__actions\">\n <slot name=\"actions\">\n <BaseButton variant=\"secondary\" size=\"sm\" @click=\"emit('action')\">\n {{ props.actionLabel }}\n </BaseButton>\n </slot>\n </div>\n\n <button\n v-if=\"props.dismissible\"\n type=\"button\"\n class=\"mint-alert__dismiss\"\n aria-label=\"Dismiss\"\n @click=\"emit('dismiss')\"\n >\n <svg class=\"mint-alert__dismiss-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Inline alert banner with semantic icon, title, message slot, optional action button, and optional dismiss button. */\nimport { useSlots } from 'vue'\nimport type { Tone } from '../types'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n tone?: Tone\n title?: string\n dismissible?: boolean\n actionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n tone: 'info',\n dismissible: false,\n})\n\nconst emit = defineEmits<{\n dismiss: []\n action: []\n}>()\n\nconst slots = useSlots()\nconst hasActions = () => !!props.actionLabel || !!slots.actions\n</script>\n\n<template>\n <div\n class=\"mint-alert\"\n :class=\"`mint-alert--${props.tone}`\"\n role=\"alert\"\n >\n <span :class=\"['mint-alert__icon', `mint-alert__icon--${props.tone}`]\">\n <!-- Lucide circle-check -->\n <svg v-if=\"props.tone === 'success'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m9 12 2 2 4-4\" />\n </svg>\n <!-- Lucide circle-x -->\n <svg v-else-if=\"props.tone === 'error'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"m15 9-6 6\" /><path d=\"m9 9 6 6\" />\n </svg>\n <!-- Lucide triangle-alert -->\n <svg v-else-if=\"props.tone === 'warning'\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" /><path d=\"M12 9v4\" /><path d=\"M12 17h.01\" />\n </svg>\n <!-- Lucide info -->\n <svg v-else viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M12 16v-4\" /><path d=\"M12 8h.01\" />\n </svg>\n </span>\n\n <div class=\"mint-alert__content\">\n <h4 v-if=\"props.title\" class=\"mint-alert__title\">\n {{ props.title }}\n </h4>\n <div class=\"mint-alert__message\">\n <slot />\n </div>\n </div>\n\n <div v-if=\"hasActions()\" class=\"mint-alert__actions\">\n <slot name=\"actions\">\n <BaseButton variant=\"secondary\" size=\"sm\" @click=\"emit('action')\">\n {{ props.actionLabel }}\n </BaseButton>\n </slot>\n </div>\n\n <button\n v-if=\"props.dismissible\"\n type=\"button\"\n class=\"mint-alert__dismiss\"\n aria-label=\"Dismiss\"\n @click=\"emit('dismiss')\"\n >\n <svg class=\"mint-alert__dismiss-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n</template>\n"],"mappings":"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"}
|