@morscherlab/mint-sdk 1.0.0-alpha.8 → 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
|
@@ -27,7 +27,7 @@ import { APP_EXPERIMENT_KEY } from '../composables/useAppExperiment'
|
|
|
27
27
|
const SVG_PATH_PREFIX = 'M'
|
|
28
28
|
|
|
29
29
|
interface Props {
|
|
30
|
-
//
|
|
30
|
+
// Classic title & breadcrumb
|
|
31
31
|
title?: string
|
|
32
32
|
subtitle?: string
|
|
33
33
|
showLogo?: boolean
|
|
@@ -53,7 +53,7 @@ interface Props {
|
|
|
53
53
|
showNotifications?: boolean
|
|
54
54
|
hasNotificationDot?: boolean
|
|
55
55
|
|
|
56
|
-
//
|
|
56
|
+
// Classic right cluster (still works; AvatarMenu takes precedence over Profile)
|
|
57
57
|
showThemeToggle?: boolean
|
|
58
58
|
showSettings?: boolean
|
|
59
59
|
settingsConfig?: TopBarSettingsConfig
|
|
@@ -211,30 +211,30 @@ onUnmounted(() => {
|
|
|
211
211
|
<template>
|
|
212
212
|
<header
|
|
213
213
|
:class="[
|
|
214
|
-
'
|
|
215
|
-
`
|
|
214
|
+
'mint-topbar',
|
|
215
|
+
`mint-topbar--${props.variant}`,
|
|
216
216
|
]"
|
|
217
217
|
>
|
|
218
|
-
<div class="
|
|
218
|
+
<div class="mint-topbar__container">
|
|
219
219
|
<!-- Left: brand -->
|
|
220
|
-
<div class="
|
|
220
|
+
<div class="mint-topbar__brand">
|
|
221
221
|
<a
|
|
222
222
|
v-if="homePath && (homePath.startsWith('http') || homePath.startsWith('/'))"
|
|
223
223
|
:href="homePath"
|
|
224
|
-
class="
|
|
224
|
+
class="mint-topbar-home-link"
|
|
225
225
|
>
|
|
226
226
|
<slot name="icon">
|
|
227
|
-
<div v-if="pluginIcon" class="
|
|
228
|
-
<div class="
|
|
229
|
-
<svg class="
|
|
227
|
+
<div v-if="pluginIcon" class="mint-topbar__logo">
|
|
228
|
+
<div class="mint-topbar__logo-icon">
|
|
229
|
+
<svg class="mint-topbar__logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
230
230
|
<path :d="pluginIcon" />
|
|
231
231
|
</svg>
|
|
232
232
|
</div>
|
|
233
233
|
</div>
|
|
234
234
|
<slot v-else name="logo">
|
|
235
|
-
<div v-if="showLogo" class="
|
|
236
|
-
<div class="
|
|
237
|
-
<span class="
|
|
235
|
+
<div v-if="showLogo" class="mint-topbar__logo">
|
|
236
|
+
<div class="mint-topbar__logo-icon">
|
|
237
|
+
<span class="mint-topbar__logo-text">M</span>
|
|
238
238
|
</div>
|
|
239
239
|
</div>
|
|
240
240
|
</slot>
|
|
@@ -243,20 +243,20 @@ onUnmounted(() => {
|
|
|
243
243
|
<router-link
|
|
244
244
|
v-else-if="homePath"
|
|
245
245
|
:to="homePath"
|
|
246
|
-
class="
|
|
246
|
+
class="mint-topbar-home-link"
|
|
247
247
|
>
|
|
248
248
|
<slot name="icon">
|
|
249
|
-
<div v-if="pluginIcon" class="
|
|
250
|
-
<div class="
|
|
251
|
-
<svg class="
|
|
249
|
+
<div v-if="pluginIcon" class="mint-topbar__logo">
|
|
250
|
+
<div class="mint-topbar__logo-icon">
|
|
251
|
+
<svg class="mint-topbar__logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
252
252
|
<path :d="pluginIcon" />
|
|
253
253
|
</svg>
|
|
254
254
|
</div>
|
|
255
255
|
</div>
|
|
256
256
|
<slot v-else name="logo">
|
|
257
|
-
<div v-if="showLogo" class="
|
|
258
|
-
<div class="
|
|
259
|
-
<span class="
|
|
257
|
+
<div v-if="showLogo" class="mint-topbar__logo">
|
|
258
|
+
<div class="mint-topbar__logo-icon">
|
|
259
|
+
<span class="mint-topbar__logo-text">M</span>
|
|
260
260
|
</div>
|
|
261
261
|
</div>
|
|
262
262
|
</slot>
|
|
@@ -264,17 +264,17 @@ onUnmounted(() => {
|
|
|
264
264
|
</router-link>
|
|
265
265
|
<template v-else>
|
|
266
266
|
<slot name="icon">
|
|
267
|
-
<div v-if="pluginIcon" class="
|
|
268
|
-
<div class="
|
|
269
|
-
<svg class="
|
|
267
|
+
<div v-if="pluginIcon" class="mint-topbar__logo">
|
|
268
|
+
<div class="mint-topbar__logo-icon">
|
|
269
|
+
<svg class="mint-topbar__logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
270
270
|
<path :d="pluginIcon" />
|
|
271
271
|
</svg>
|
|
272
272
|
</div>
|
|
273
273
|
</div>
|
|
274
274
|
<slot v-else name="logo">
|
|
275
|
-
<div v-if="showLogo" class="
|
|
276
|
-
<div class="
|
|
277
|
-
<span class="
|
|
275
|
+
<div v-if="showLogo" class="mint-topbar__logo">
|
|
276
|
+
<div class="mint-topbar__logo-icon">
|
|
277
|
+
<span class="mint-topbar__logo-text">M</span>
|
|
278
278
|
</div>
|
|
279
279
|
</div>
|
|
280
280
|
</slot>
|
|
@@ -306,23 +306,23 @@ onUnmounted(() => {
|
|
|
306
306
|
</template>
|
|
307
307
|
</AppPageSelector>
|
|
308
308
|
|
|
309
|
-
<!-- Left:
|
|
310
|
-
<div v-if="hasTitleGroup" class="
|
|
311
|
-
<span class="
|
|
312
|
-
<span class="
|
|
309
|
+
<!-- Left: classic title / breadcrumb (classic prop surface) -->
|
|
310
|
+
<div v-if="hasTitleGroup" class="mint-topbar-title-group">
|
|
311
|
+
<span class="mint-topbar-title">{{ title }}</span>
|
|
312
|
+
<span class="mint-topbar-subtitle">{{ subtitle }}</span>
|
|
313
313
|
</div>
|
|
314
314
|
|
|
315
|
-
<div v-else-if="hasLegacyBreadcrumb" ref="dropdownRef" class="
|
|
315
|
+
<div v-else-if="hasLegacyBreadcrumb" ref="dropdownRef" class="mint-topbar-breadcrumb">
|
|
316
316
|
<button
|
|
317
317
|
v-if="pages?.length"
|
|
318
318
|
type="button"
|
|
319
|
-
class="
|
|
319
|
+
class="mint-topbar-plugin-name"
|
|
320
320
|
@click.stop="togglePagesDropdown"
|
|
321
321
|
>
|
|
322
322
|
{{ pluginName }}
|
|
323
323
|
<svg
|
|
324
|
-
class="
|
|
325
|
-
:class="{ '
|
|
324
|
+
class="mint-topbar-chevron"
|
|
325
|
+
:class="{ 'mint-topbar-chevron--open': showPagesDropdown }"
|
|
326
326
|
width="16"
|
|
327
327
|
height="16"
|
|
328
328
|
viewBox="0 0 24 24"
|
|
@@ -335,11 +335,11 @@ onUnmounted(() => {
|
|
|
335
335
|
<path d="m6 9 6 6 6-6" />
|
|
336
336
|
</svg>
|
|
337
337
|
</button>
|
|
338
|
-
<span v-else class="
|
|
338
|
+
<span v-else class="mint-topbar-plugin-name--static">{{ pluginName }}</span>
|
|
339
339
|
|
|
340
340
|
<svg
|
|
341
341
|
v-if="title"
|
|
342
|
-
class="
|
|
342
|
+
class="mint-topbar-separator"
|
|
343
343
|
width="16"
|
|
344
344
|
height="16"
|
|
345
345
|
viewBox="0 0 24 24"
|
|
@@ -351,48 +351,48 @@ onUnmounted(() => {
|
|
|
351
351
|
>
|
|
352
352
|
<path d="m9 18 6-6-6-6" />
|
|
353
353
|
</svg>
|
|
354
|
-
<span v-if="title" class="
|
|
354
|
+
<span v-if="title" class="mint-topbar-current-page">{{ title }}</span>
|
|
355
355
|
|
|
356
|
-
<div v-show="showPagesDropdown" class="
|
|
356
|
+
<div v-show="showPagesDropdown" class="mint-topbar-dropdown">
|
|
357
357
|
<template v-for="page in pages" :key="page.id">
|
|
358
358
|
<a
|
|
359
359
|
v-if="page.href"
|
|
360
360
|
:href="page.href"
|
|
361
|
-
:class="['
|
|
361
|
+
:class="['mint-topbar-dropdown-item', { 'mint-topbar-dropdown-item--active': page.id === currentPageId, 'mint-topbar-dropdown-item--disabled': page.disabled }]"
|
|
362
362
|
@click="showPagesDropdown = false"
|
|
363
363
|
>
|
|
364
|
-
<span class="
|
|
365
|
-
<span v-if="page.description" class="
|
|
364
|
+
<span class="mint-topbar-dropdown-item__label">{{ page.label }}</span>
|
|
365
|
+
<span v-if="page.description" class="mint-topbar-dropdown-item__description">{{ page.description }}</span>
|
|
366
366
|
</a>
|
|
367
367
|
<router-link
|
|
368
368
|
v-else-if="page.to"
|
|
369
369
|
:to="page.to"
|
|
370
|
-
:class="['
|
|
370
|
+
:class="['mint-topbar-dropdown-item', { 'mint-topbar-dropdown-item--active': page.id === currentPageId, 'mint-topbar-dropdown-item--disabled': page.disabled }]"
|
|
371
371
|
@click="showPagesDropdown = false"
|
|
372
372
|
>
|
|
373
|
-
<span class="
|
|
374
|
-
<span v-if="page.description" class="
|
|
373
|
+
<span class="mint-topbar-dropdown-item__label">{{ page.label }}</span>
|
|
374
|
+
<span v-if="page.description" class="mint-topbar-dropdown-item__description">{{ page.description }}</span>
|
|
375
375
|
</router-link>
|
|
376
376
|
<button
|
|
377
377
|
v-else
|
|
378
378
|
type="button"
|
|
379
|
-
:class="['
|
|
379
|
+
:class="['mint-topbar-dropdown-item', { 'mint-topbar-dropdown-item--active': page.id === currentPageId, 'mint-topbar-dropdown-item--disabled': page.disabled }]"
|
|
380
380
|
@click="handlePageClick(page)"
|
|
381
381
|
>
|
|
382
|
-
<span class="
|
|
383
|
-
<span v-if="page.description" class="
|
|
382
|
+
<span class="mint-topbar-dropdown-item__label">{{ page.label }}</span>
|
|
383
|
+
<span v-if="page.description" class="mint-topbar-dropdown-item__description">{{ page.description }}</span>
|
|
384
384
|
</button>
|
|
385
385
|
</template>
|
|
386
386
|
</div>
|
|
387
387
|
</div>
|
|
388
388
|
|
|
389
|
-
<span v-else-if="hasTitleOnly" class="
|
|
389
|
+
<span v-else-if="hasTitleOnly" class="mint-topbar__title-only">{{ title }}</span>
|
|
390
390
|
|
|
391
391
|
<!-- Nav slot (inline, after brand/selector) -->
|
|
392
392
|
<slot name="nav" />
|
|
393
393
|
|
|
394
394
|
<!-- Center: pill nav (new) -->
|
|
395
|
-
<div v-if="hasPillNav || $slots.center" class="
|
|
395
|
+
<div v-if="hasPillNav || $slots.center" class="mint-topbar__center">
|
|
396
396
|
<slot name="center">
|
|
397
397
|
<AppPillNav
|
|
398
398
|
v-if="hasPillNav && pillNav"
|
|
@@ -403,30 +403,30 @@ onUnmounted(() => {
|
|
|
403
403
|
</slot>
|
|
404
404
|
</div>
|
|
405
405
|
|
|
406
|
-
<!-- Center:
|
|
407
|
-
container as AppPillNav so
|
|
406
|
+
<!-- Center: classic tabs (when no pillNav) — wrapped in the same centered
|
|
407
|
+
container as AppPillNav so classic :tabs consumers get centered pill
|
|
408
408
|
layout without migrating to :pill-nav. -->
|
|
409
|
-
<div v-if="!hasPillNav && tabs?.length" class="
|
|
410
|
-
<div class="
|
|
409
|
+
<div v-if="!hasPillNav && tabs?.length" class="mint-topbar__center">
|
|
410
|
+
<div class="mint-topbar__tabs">
|
|
411
411
|
<template v-for="tab in tabs" :key="tab.id">
|
|
412
412
|
<div
|
|
413
413
|
:ref="(el) => tab.children?.length ? setTabDropdownRef(el as HTMLElement, tab.id) : null"
|
|
414
|
-
class="
|
|
414
|
+
class="mint-topbar-tab-wrapper"
|
|
415
415
|
>
|
|
416
416
|
<button
|
|
417
417
|
v-if="tab.children?.length"
|
|
418
418
|
type="button"
|
|
419
419
|
:class="[
|
|
420
|
-
'
|
|
421
|
-
{ '
|
|
422
|
-
{ '
|
|
420
|
+
'mint-topbar-tab',
|
|
421
|
+
{ 'mint-topbar-tab--active': tab.id === currentTabId || tab.children.some(c => c.id === currentTabId) },
|
|
422
|
+
{ 'mint-topbar-tab--disabled': tab.disabled }
|
|
423
423
|
]"
|
|
424
424
|
@click.stop="handleTabClick(tab)"
|
|
425
425
|
>
|
|
426
426
|
{{ tab.label }}
|
|
427
427
|
<svg
|
|
428
|
-
class="
|
|
429
|
-
:class="{ '
|
|
428
|
+
class="mint-topbar-tab-chevron"
|
|
429
|
+
:class="{ 'mint-topbar-tab-chevron--open': openTabDropdown === tab.id }"
|
|
430
430
|
width="14"
|
|
431
431
|
height="14"
|
|
432
432
|
viewBox="0 0 24 24"
|
|
@@ -444,9 +444,9 @@ onUnmounted(() => {
|
|
|
444
444
|
v-else-if="tab.href"
|
|
445
445
|
:href="tab.href"
|
|
446
446
|
:class="[
|
|
447
|
-
'
|
|
448
|
-
{ '
|
|
449
|
-
{ '
|
|
447
|
+
'mint-topbar-tab',
|
|
448
|
+
{ 'mint-topbar-tab--active': tab.id === currentTabId },
|
|
449
|
+
{ 'mint-topbar-tab--disabled': tab.disabled }
|
|
450
450
|
]"
|
|
451
451
|
>
|
|
452
452
|
{{ tab.label }}
|
|
@@ -455,9 +455,9 @@ onUnmounted(() => {
|
|
|
455
455
|
v-else-if="tab.to"
|
|
456
456
|
:to="tab.to"
|
|
457
457
|
:class="[
|
|
458
|
-
'
|
|
459
|
-
{ '
|
|
460
|
-
{ '
|
|
458
|
+
'mint-topbar-tab',
|
|
459
|
+
{ 'mint-topbar-tab--active': tab.id === currentTabId },
|
|
460
|
+
{ 'mint-topbar-tab--disabled': tab.disabled }
|
|
461
461
|
]"
|
|
462
462
|
>
|
|
463
463
|
{{ tab.label }}
|
|
@@ -466,55 +466,55 @@ onUnmounted(() => {
|
|
|
466
466
|
v-else
|
|
467
467
|
type="button"
|
|
468
468
|
:class="[
|
|
469
|
-
'
|
|
470
|
-
{ '
|
|
471
|
-
{ '
|
|
469
|
+
'mint-topbar-tab',
|
|
470
|
+
{ 'mint-topbar-tab--active': tab.id === currentTabId },
|
|
471
|
+
{ 'mint-topbar-tab--disabled': tab.disabled }
|
|
472
472
|
]"
|
|
473
473
|
@click="handleTabClick(tab)"
|
|
474
474
|
>
|
|
475
475
|
{{ tab.label }}
|
|
476
476
|
</button>
|
|
477
477
|
|
|
478
|
-
<div v-if="tab.children?.length" v-show="openTabDropdown === tab.id" class="
|
|
478
|
+
<div v-if="tab.children?.length" v-show="openTabDropdown === tab.id" class="mint-topbar-tab-dropdown">
|
|
479
479
|
<template v-for="option in tab.children" :key="option.id">
|
|
480
480
|
<a
|
|
481
481
|
v-if="option.href"
|
|
482
482
|
:href="option.href"
|
|
483
483
|
:class="[
|
|
484
|
-
'
|
|
485
|
-
{ '
|
|
486
|
-
{ '
|
|
484
|
+
'mint-topbar-dropdown-item',
|
|
485
|
+
{ 'mint-topbar-dropdown-item--active': option.id === currentTabId },
|
|
486
|
+
{ 'mint-topbar-dropdown-item--disabled': option.disabled }
|
|
487
487
|
]"
|
|
488
488
|
@click="openTabDropdown = null"
|
|
489
489
|
>
|
|
490
|
-
<span class="
|
|
491
|
-
<span v-if="option.description" class="
|
|
490
|
+
<span class="mint-topbar-dropdown-item__label">{{ option.label }}</span>
|
|
491
|
+
<span v-if="option.description" class="mint-topbar-dropdown-item__description">{{ option.description }}</span>
|
|
492
492
|
</a>
|
|
493
493
|
<router-link
|
|
494
494
|
v-else-if="option.to"
|
|
495
495
|
:to="option.to"
|
|
496
496
|
:class="[
|
|
497
|
-
'
|
|
498
|
-
{ '
|
|
499
|
-
{ '
|
|
497
|
+
'mint-topbar-dropdown-item',
|
|
498
|
+
{ 'mint-topbar-dropdown-item--active': option.id === currentTabId },
|
|
499
|
+
{ 'mint-topbar-dropdown-item--disabled': option.disabled }
|
|
500
500
|
]"
|
|
501
501
|
@click="openTabDropdown = null"
|
|
502
502
|
>
|
|
503
|
-
<span class="
|
|
504
|
-
<span v-if="option.description" class="
|
|
503
|
+
<span class="mint-topbar-dropdown-item__label">{{ option.label }}</span>
|
|
504
|
+
<span v-if="option.description" class="mint-topbar-dropdown-item__description">{{ option.description }}</span>
|
|
505
505
|
</router-link>
|
|
506
506
|
<button
|
|
507
507
|
v-else
|
|
508
508
|
type="button"
|
|
509
509
|
:class="[
|
|
510
|
-
'
|
|
511
|
-
{ '
|
|
512
|
-
{ '
|
|
510
|
+
'mint-topbar-dropdown-item',
|
|
511
|
+
{ 'mint-topbar-dropdown-item--active': option.id === currentTabId },
|
|
512
|
+
{ 'mint-topbar-dropdown-item--disabled': option.disabled }
|
|
513
513
|
]"
|
|
514
514
|
@click="handleTabOptionClick(option, tab)"
|
|
515
515
|
>
|
|
516
|
-
<span class="
|
|
517
|
-
<span v-if="option.description" class="
|
|
516
|
+
<span class="mint-topbar-dropdown-item__label">{{ option.label }}</span>
|
|
517
|
+
<span v-if="option.description" class="mint-topbar-dropdown-item__description">{{ option.description }}</span>
|
|
518
518
|
</button>
|
|
519
519
|
</template>
|
|
520
520
|
</div>
|
|
@@ -524,8 +524,8 @@ onUnmounted(() => {
|
|
|
524
524
|
</div>
|
|
525
525
|
|
|
526
526
|
<!-- Right section -->
|
|
527
|
-
<div class="
|
|
528
|
-
<span v-if="showStandaloneLabel && isStandalone && !appExperiment" class="
|
|
527
|
+
<div class="mint-topbar__right">
|
|
528
|
+
<span v-if="showStandaloneLabel && isStandalone && !appExperiment" class="mint-topbar__standalone-badge">
|
|
529
529
|
{{ standaloneLabel }}
|
|
530
530
|
</span>
|
|
531
531
|
|
|
@@ -545,7 +545,7 @@ onUnmounted(() => {
|
|
|
545
545
|
@detach="appExperiment.handleDetach()"
|
|
546
546
|
/>
|
|
547
547
|
|
|
548
|
-
<span v-if="appExperiment && isStandalone" class="
|
|
548
|
+
<span v-if="appExperiment && isStandalone" class="mint-topbar__standalone-badge">
|
|
549
549
|
{{ standaloneLabel }}
|
|
550
550
|
</span>
|
|
551
551
|
|
|
@@ -555,47 +555,47 @@ onUnmounted(() => {
|
|
|
555
555
|
<button
|
|
556
556
|
v-if="showNotifications"
|
|
557
557
|
type="button"
|
|
558
|
-
class="
|
|
558
|
+
class="mint-topbar__icon-btn"
|
|
559
559
|
aria-label="Notifications"
|
|
560
560
|
@click="emit('notifications-click')"
|
|
561
561
|
>
|
|
562
|
-
<svg class="
|
|
562
|
+
<svg class="mint-topbar__icon-btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
563
563
|
<path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" />
|
|
564
564
|
<path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" />
|
|
565
565
|
</svg>
|
|
566
|
-
<span v-if="hasNotificationDot" class="
|
|
566
|
+
<span v-if="hasNotificationDot" class="mint-topbar__icon-btn-dot" aria-hidden="true" />
|
|
567
567
|
</button>
|
|
568
568
|
|
|
569
|
-
<!--
|
|
569
|
+
<!-- Classic: theme toggle -->
|
|
570
570
|
<ThemeToggle v-if="showThemeToggle" size="sm" />
|
|
571
571
|
|
|
572
|
-
<!--
|
|
572
|
+
<!-- Classic: settings gear -->
|
|
573
573
|
<button
|
|
574
574
|
v-if="showSettings"
|
|
575
575
|
type="button"
|
|
576
|
-
class="
|
|
576
|
+
class="mint-topbar__settings-btn"
|
|
577
577
|
aria-label="Open settings"
|
|
578
578
|
@click="settingsOpen = true"
|
|
579
579
|
>
|
|
580
|
-
<svg class="
|
|
580
|
+
<svg class="mint-topbar__settings-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
581
581
|
<path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" /><circle cx="12" cy="12" r="3" />
|
|
582
582
|
</svg>
|
|
583
583
|
</button>
|
|
584
584
|
|
|
585
|
-
<!--
|
|
585
|
+
<!-- Classic: admin link -->
|
|
586
586
|
<router-link
|
|
587
587
|
v-if="showAdmin"
|
|
588
588
|
:to="adminPath"
|
|
589
|
-
class="
|
|
589
|
+
class="mint-topbar__admin-btn"
|
|
590
590
|
aria-label="Admin Dashboard"
|
|
591
591
|
@click="emit('admin-click')"
|
|
592
592
|
>
|
|
593
|
-
<svg class="
|
|
593
|
+
<svg class="mint-topbar__admin-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
594
594
|
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" /><path d="m9 12 2 2 4-4" />
|
|
595
595
|
</svg>
|
|
596
596
|
</router-link>
|
|
597
597
|
|
|
598
|
-
<!-- New: avatar menu (takes precedence over
|
|
598
|
+
<!-- New: avatar menu (takes precedence over classic profile button) -->
|
|
599
599
|
<AppAvatarMenu
|
|
600
600
|
v-if="hasAccountMenu || $slots['account-menu-items']"
|
|
601
601
|
:user-name="userName"
|
|
@@ -613,18 +613,18 @@ onUnmounted(() => {
|
|
|
613
613
|
</template>
|
|
614
614
|
</AppAvatarMenu>
|
|
615
615
|
|
|
616
|
-
<!--
|
|
616
|
+
<!-- Classic: profile button (only when avatar menu not provided) -->
|
|
617
617
|
<button
|
|
618
618
|
v-else-if="showProfile"
|
|
619
619
|
type="button"
|
|
620
|
-
class="
|
|
620
|
+
class="mint-topbar__profile-btn"
|
|
621
621
|
aria-label="Edit profile"
|
|
622
622
|
@click="emit('profile-click')"
|
|
623
623
|
>
|
|
624
|
-
<div class="
|
|
624
|
+
<div class="mint-topbar__profile-avatar">
|
|
625
625
|
{{ profileInitial }}
|
|
626
626
|
</div>
|
|
627
|
-
<span v-if="userName" class="
|
|
627
|
+
<span v-if="userName" class="mint-topbar__profile-name">{{ userName }}</span>
|
|
628
628
|
</button>
|
|
629
629
|
</div>
|
|
630
630
|
</div>
|
|
@@ -91,13 +91,13 @@ function handleEntryClick(entry: AuditEntry) {
|
|
|
91
91
|
</script>
|
|
92
92
|
|
|
93
93
|
<template>
|
|
94
|
-
<div :class="['
|
|
95
|
-
<div v-if="showFilters" class="
|
|
96
|
-
<select v-model="filterType" class="
|
|
94
|
+
<div :class="['mint-audit-trail', `mint-audit-trail--${size}`]">
|
|
95
|
+
<div v-if="showFilters" class="mint-audit-trail__filters">
|
|
96
|
+
<select v-model="filterType" class="mint-audit-trail__filter-select">
|
|
97
97
|
<option value="">All types</option>
|
|
98
98
|
<option v-for="t in uniqueTypes" :key="t" :value="t">{{ t }}</option>
|
|
99
99
|
</select>
|
|
100
|
-
<select v-model="filterUser" class="
|
|
100
|
+
<select v-model="filterUser" class="mint-audit-trail__filter-select">
|
|
101
101
|
<option value="">All users</option>
|
|
102
102
|
<option v-for="u in uniqueUsers" :key="u" :value="u">{{ u }}</option>
|
|
103
103
|
</select>
|
|
@@ -105,33 +105,33 @@ function handleEntryClick(entry: AuditEntry) {
|
|
|
105
105
|
|
|
106
106
|
<div
|
|
107
107
|
v-if="sortedEntries.length"
|
|
108
|
-
class="
|
|
108
|
+
class="mint-audit-trail__list"
|
|
109
109
|
:style="maxHeight ? { maxHeight, overflowY: 'auto' } : {}"
|
|
110
110
|
>
|
|
111
|
-
<div class="
|
|
111
|
+
<div class="mint-audit-trail__line" />
|
|
112
112
|
<div
|
|
113
113
|
v-for="entry in sortedEntries"
|
|
114
114
|
:key="entry.id"
|
|
115
|
-
:class="['
|
|
115
|
+
:class="['mint-audit-trail__entry', `mint-audit-trail__entry--${entry.type}`]"
|
|
116
116
|
@click="handleEntryClick(entry)"
|
|
117
117
|
>
|
|
118
118
|
<slot name="entry" :entry="entry">
|
|
119
|
-
<div class="
|
|
120
|
-
<div class="
|
|
121
|
-
<div class="
|
|
122
|
-
<div v-if="entry.user" class="
|
|
123
|
-
<span v-if="entry.user" class="
|
|
124
|
-
<span class="
|
|
119
|
+
<div class="mint-audit-trail__dot" />
|
|
120
|
+
<div class="mint-audit-trail__content">
|
|
121
|
+
<div class="mint-audit-trail__header">
|
|
122
|
+
<div v-if="entry.user" class="mint-audit-trail__avatar">{{ getInitials(entry.user) }}</div>
|
|
123
|
+
<span v-if="entry.user" class="mint-audit-trail__user">{{ entry.user }}</span>
|
|
124
|
+
<span class="mint-audit-trail__timestamp">{{ formatTimestamp(entry.timestamp) }}</span>
|
|
125
125
|
</div>
|
|
126
|
-
<div class="
|
|
127
|
-
<div v-if="entry.detail" class="
|
|
128
|
-
<div v-if="entry.metadata && Object.keys(entry.metadata).length" class="
|
|
126
|
+
<div class="mint-audit-trail__action">{{ entry.action }}</div>
|
|
127
|
+
<div v-if="entry.detail" class="mint-audit-trail__detail">{{ entry.detail }}</div>
|
|
128
|
+
<div v-if="entry.metadata && Object.keys(entry.metadata).length" class="mint-audit-trail__metadata">
|
|
129
129
|
<span
|
|
130
130
|
v-for="(value, key) in entry.metadata"
|
|
131
131
|
:key="String(key)"
|
|
132
|
-
class="
|
|
132
|
+
class="mint-audit-trail__metadata-item"
|
|
133
133
|
>
|
|
134
|
-
<span class="
|
|
134
|
+
<span class="mint-audit-trail__metadata-key">{{ key }}:</span>
|
|
135
135
|
{{ value }}
|
|
136
136
|
</span>
|
|
137
137
|
</div>
|
|
@@ -140,7 +140,7 @@ function handleEntryClick(entry: AuditEntry) {
|
|
|
140
140
|
</div>
|
|
141
141
|
</div>
|
|
142
142
|
|
|
143
|
-
<div v-if="!sortedEntries.length" class="
|
|
143
|
+
<div v-if="!sortedEntries.length" class="mint-audit-trail__empty">
|
|
144
144
|
<slot name="empty">{{ emptyMessage }}</slot>
|
|
145
145
|
</div>
|
|
146
146
|
</div>
|