@morscherlab/mint-sdk 1.0.0-alpha.8 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +15 -15
  2. package/dist/{auth-BYmxZdJl.js → auth-DsI0rQ7_.js} +6 -6
  3. package/dist/auth-DsI0rQ7_.js.map +1 -0
  4. package/dist/components/index.js +2 -2
  5. package/dist/{components-CKf-UpGi.js → components-CzbQQPCb.js} +1429 -1429
  6. package/dist/components-CzbQQPCb.js.map +1 -0
  7. package/dist/composables/index.js +2 -2
  8. package/dist/composables/usePlatformContext.d.ts +3 -3
  9. package/dist/{composables-D0QfFzq1.js → composables-BXklV5ii.js} +3 -3
  10. package/dist/{composables-D0QfFzq1.js.map → composables-BXklV5ii.js.map} +1 -1
  11. package/dist/index.js +4 -4
  12. package/dist/install.d.ts +3 -3
  13. package/dist/install.js +5 -5
  14. package/dist/install.js.map +1 -1
  15. package/dist/stores/auth.d.ts +1 -1
  16. package/dist/stores/index.js +1 -1
  17. package/dist/stores/settings.d.ts +1 -1
  18. package/dist/styles.css +5388 -5388
  19. package/dist/types/platform.d.ts +1 -1
  20. package/dist/{useScheduleDrag-DAJueTbK.js → useScheduleDrag-CxBeqYcu.js} +331 -331
  21. package/dist/useScheduleDrag-CxBeqYcu.js.map +1 -0
  22. package/package.json +2 -2
  23. package/src/__tests__/components/AppLayout.test.ts +23 -23
  24. package/src/__tests__/components/AppSidebar.test.ts +29 -29
  25. package/src/__tests__/components/AppTopBar.test.ts +45 -45
  26. package/src/__tests__/components/BaseInput.test.ts +2 -2
  27. package/src/__tests__/components/BasePill.test.ts +37 -37
  28. package/src/__tests__/components/Calendar.test.ts +52 -52
  29. package/src/__tests__/components/CollapsibleCard.test.ts +81 -81
  30. package/src/__tests__/components/DataFrame.test.ts +80 -80
  31. package/src/__tests__/components/DropdownButton.test.ts +80 -80
  32. package/src/__tests__/composables/usePlatformContext.test.ts +1 -1
  33. package/src/components/AlertBox.story.vue +1 -1
  34. package/src/components/AlertBox.vue +14 -14
  35. package/src/components/AppAvatarMenu.vue +26 -26
  36. package/src/components/AppContainer.vue +3 -3
  37. package/src/components/AppLayout.vue +7 -7
  38. package/src/components/AppPageSelector.vue +30 -30
  39. package/src/components/AppPillNav.vue +10 -10
  40. package/src/components/AppPluginSwitcher.vue +31 -31
  41. package/src/components/AppSidebar.vue +8 -8
  42. package/src/components/AppTopBar.story.vue +7 -7
  43. package/src/components/AppTopBar.vue +102 -102
  44. package/src/components/AuditTrail.vue +19 -19
  45. package/src/components/AutoGroupModal.vue +76 -76
  46. package/src/components/Avatar.vue +6 -6
  47. package/src/components/BaseButton.vue +6 -6
  48. package/src/components/BaseCheckbox.vue +9 -9
  49. package/src/components/BaseInput.vue +4 -4
  50. package/src/components/BaseModal.story.vue +1 -1
  51. package/src/components/BaseModal.vue +14 -14
  52. package/src/components/BasePill.vue +9 -9
  53. package/src/components/BaseRadioGroup.vue +21 -21
  54. package/src/components/BaseSelect.vue +6 -6
  55. package/src/components/BaseSlider.vue +8 -8
  56. package/src/components/BaseTabs.vue +7 -7
  57. package/src/components/BaseTextarea.vue +5 -5
  58. package/src/components/BaseToggle.vue +10 -10
  59. package/src/components/BatchProgressList.vue +25 -25
  60. package/src/components/Breadcrumb.vue +8 -8
  61. package/src/components/Calendar.vue +19 -19
  62. package/src/components/ChartContainer.vue +9 -9
  63. package/src/components/ChemicalFormula.vue +7 -7
  64. package/src/components/CollapsibleCard.vue +20 -20
  65. package/src/components/ColorSlider.vue +6 -6
  66. package/src/components/ConcentrationInput.vue +12 -12
  67. package/src/components/ConfirmDialog.story.vue +1 -1
  68. package/src/components/ConfirmDialog.vue +7 -7
  69. package/src/components/DataFrame.vue +40 -40
  70. package/src/components/DatePicker.vue +29 -29
  71. package/src/components/DateTimePicker.vue +41 -41
  72. package/src/components/Divider.vue +9 -9
  73. package/src/components/DoseCalculator.vue +66 -66
  74. package/src/components/DropdownButton.vue +19 -19
  75. package/src/components/EmptyState.vue +9 -9
  76. package/src/components/ExperimentCodeBadge.vue +3 -3
  77. package/src/components/ExperimentDataViewer.vue +25 -25
  78. package/src/components/ExperimentPopover.vue +35 -35
  79. package/src/components/ExperimentSelectorModal.vue +40 -40
  80. package/src/components/ExperimentTimeline.vue +48 -48
  81. package/src/components/FileUploader.vue +31 -31
  82. package/src/components/FitPanel.vue +9 -9
  83. package/src/components/FormActions.vue +1 -1
  84. package/src/components/FormBuilder.vue +2 -2
  85. package/src/components/FormField.vue +7 -7
  86. package/src/components/FormSection.vue +7 -7
  87. package/src/components/FormulaInput.vue +10 -10
  88. package/src/components/GroupAssigner.vue +40 -40
  89. package/src/components/GroupingModal.vue +45 -45
  90. package/src/components/IconButton.vue +6 -6
  91. package/src/components/LoadingSpinner.vue +5 -5
  92. package/src/components/MoleculeInput.vue +21 -21
  93. package/src/components/MultiSelect.vue +13 -13
  94. package/src/components/NumberInput.vue +13 -13
  95. package/src/components/PlateMapEditor.vue +63 -63
  96. package/src/components/ProgressBar.vue +18 -18
  97. package/src/components/ProtocolStepEditor.vue +57 -57
  98. package/src/components/RackEditor.vue +28 -28
  99. package/src/components/ReagentEditor.vue +61 -61
  100. package/src/components/ReagentList.vue +49 -49
  101. package/src/components/ResourceCard.vue +28 -28
  102. package/src/components/SampleHierarchyTree.vue +13 -13
  103. package/src/components/SampleLegend.vue +12 -12
  104. package/src/components/SampleSelector.vue +104 -104
  105. package/src/components/ScheduleCalendar.vue +42 -42
  106. package/src/components/ScientificNumber.vue +11 -11
  107. package/src/components/SegmentedControl.vue +12 -12
  108. package/src/components/SequenceInput.vue +32 -32
  109. package/src/components/SettingsButton.vue +5 -5
  110. package/src/components/SettingsModal.vue +17 -17
  111. package/src/components/StatusIndicator.vue +5 -5
  112. package/src/components/StepWizard.vue +16 -16
  113. package/src/components/TagsInput.vue +20 -20
  114. package/src/components/ThemeToggle.vue +3 -3
  115. package/src/components/TimePicker.vue +21 -21
  116. package/src/components/TimeRangeInput.vue +5 -5
  117. package/src/components/ToastNotification.vue +8 -8
  118. package/src/components/Tooltip.vue +7 -7
  119. package/src/components/UnitInput.vue +12 -12
  120. package/src/components/WellEditPopup.vue +28 -28
  121. package/src/components/WellPlate.vue +37 -37
  122. package/src/composables/useAppExperiment.ts +1 -1
  123. package/src/composables/usePlatformContext.ts +16 -16
  124. package/src/composables/useProtocolTemplates.ts +1 -1
  125. package/src/install.ts +3 -3
  126. package/src/stores/auth.ts +3 -3
  127. package/src/stores/settings.ts +2 -2
  128. package/src/styles/components/alert-box.css +30 -30
  129. package/src/styles/components/app-avatar-menu.css +23 -23
  130. package/src/styles/components/app-container.css +6 -6
  131. package/src/styles/components/app-layout.css +15 -15
  132. package/src/styles/components/app-page-selector.css +26 -26
  133. package/src/styles/components/app-pill-nav.css +7 -7
  134. package/src/styles/components/app-plugin-switcher.css +27 -27
  135. package/src/styles/components/app-sidebar.css +24 -24
  136. package/src/styles/components/app-top-bar.css +65 -65
  137. package/src/styles/components/audit-trail.css +29 -29
  138. package/src/styles/components/auto-group-modal.css +91 -91
  139. package/src/styles/components/avatar.css +15 -15
  140. package/src/styles/components/batch-progress-list.css +40 -40
  141. package/src/styles/components/breadcrumb.css +8 -8
  142. package/src/styles/components/button.css +31 -31
  143. package/src/styles/components/calendar.css +27 -27
  144. package/src/styles/components/chart-container.css +9 -9
  145. package/src/styles/components/checkbox.css +20 -20
  146. package/src/styles/components/chemical-formula.css +8 -8
  147. package/src/styles/components/collapsible-card.css +35 -35
  148. package/src/styles/components/color-slider.css +8 -8
  149. package/src/styles/components/concentration-input.css +27 -27
  150. package/src/styles/components/confirm-dialog.css +32 -32
  151. package/src/styles/components/dataframe.css +66 -66
  152. package/src/styles/components/date-picker.css +40 -40
  153. package/src/styles/components/datetime-picker.css +37 -37
  154. package/src/styles/components/divider.css +13 -13
  155. package/src/styles/components/dose-calculator.css +43 -43
  156. package/src/styles/components/dropdown-button.css +46 -46
  157. package/src/styles/components/empty-state.css +44 -44
  158. package/src/styles/components/experiment-code-badge.css +8 -8
  159. package/src/styles/components/experiment-data-viewer.css +23 -23
  160. package/src/styles/components/experiment-popover.css +97 -97
  161. package/src/styles/components/experiment-selector-modal.css +39 -39
  162. package/src/styles/components/experiment-timeline.css +98 -98
  163. package/src/styles/components/file-uploader.css +44 -44
  164. package/src/styles/components/fit-panel.css +12 -12
  165. package/src/styles/components/form-builder.css +11 -11
  166. package/src/styles/components/form-field.css +7 -7
  167. package/src/styles/components/formula-input.css +17 -17
  168. package/src/styles/components/group-assigner.css +26 -26
  169. package/src/styles/components/grouping-modal.css +51 -51
  170. package/src/styles/components/icon-button.css +41 -41
  171. package/src/styles/components/input.css +13 -13
  172. package/src/styles/components/loading-spinner.css +12 -12
  173. package/src/styles/components/modal.css +69 -69
  174. package/src/styles/components/molecule-input.css +27 -27
  175. package/src/styles/components/multi-select.css +23 -23
  176. package/src/styles/components/number-input.css +32 -32
  177. package/src/styles/components/pill.css +37 -37
  178. package/src/styles/components/plate-map-editor.css +67 -67
  179. package/src/styles/components/progress-bar.css +41 -41
  180. package/src/styles/components/protocol-step-editor.css +63 -63
  181. package/src/styles/components/rack-editor.css +34 -34
  182. package/src/styles/components/radio-group.css +41 -41
  183. package/src/styles/components/reagent-editor.css +70 -70
  184. package/src/styles/components/reagent-list.css +65 -65
  185. package/src/styles/components/resource-card.css +52 -52
  186. package/src/styles/components/sample-hierarchy-tree.css +56 -56
  187. package/src/styles/components/sample-legend.css +37 -37
  188. package/src/styles/components/sample-selector.css +121 -121
  189. package/src/styles/components/schedule-calendar.css +67 -67
  190. package/src/styles/components/scientific-number.css +11 -11
  191. package/src/styles/components/segmented-control.css +33 -33
  192. package/src/styles/components/select.css +11 -11
  193. package/src/styles/components/sequence-input.css +29 -29
  194. package/src/styles/components/settings-button.css +16 -16
  195. package/src/styles/components/settings-modal.css +14 -14
  196. package/src/styles/components/skeleton.css +2 -2
  197. package/src/styles/components/slider.css +10 -10
  198. package/src/styles/components/status-indicator.css +12 -12
  199. package/src/styles/components/step-wizard.css +32 -32
  200. package/src/styles/components/tabs.css +16 -16
  201. package/src/styles/components/tags-input.css +46 -46
  202. package/src/styles/components/textarea.css +17 -17
  203. package/src/styles/components/theme-toggle.css +13 -13
  204. package/src/styles/components/time-picker.css +28 -28
  205. package/src/styles/components/time-range-input.css +8 -8
  206. package/src/styles/components/toast.css +18 -18
  207. package/src/styles/components/toggle.css +27 -27
  208. package/src/styles/components/tooltip.css +18 -18
  209. package/src/styles/components/unit-input.css +25 -25
  210. package/src/styles/components/well-edit-popup.css +32 -32
  211. package/src/styles/components/well-plate.css +49 -49
  212. package/src/styles/index.css +1 -1
  213. package/src/styles/variables.css +3 -3
  214. package/src/types/platform.ts +6 -6
  215. package/dist/auth-BYmxZdJl.js.map +0 -1
  216. package/dist/components-CKf-UpGi.js.map +0 -1
  217. package/dist/useScheduleDrag-DAJueTbK.js.map +0 -1
@@ -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
- // Legacy title & breadcrumb
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
- // Legacy right cluster (still works; AvatarMenu takes precedence over Profile)
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
- 'mld-topbar',
215
- `mld-topbar--${props.variant}`,
214
+ 'mint-topbar',
215
+ `mint-topbar--${props.variant}`,
216
216
  ]"
217
217
  >
218
- <div class="mld-topbar__container">
218
+ <div class="mint-topbar__container">
219
219
  <!-- Left: brand -->
220
- <div class="mld-topbar__brand">
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="mld-topbar-home-link"
224
+ class="mint-topbar-home-link"
225
225
  >
226
226
  <slot name="icon">
227
- <div v-if="pluginIcon" class="mld-topbar__logo">
228
- <div class="mld-topbar__logo-icon">
229
- <svg class="mld-topbar__logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
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="mld-topbar__logo">
236
- <div class="mld-topbar__logo-icon">
237
- <span class="mld-topbar__logo-text">M</span>
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="mld-topbar-home-link"
246
+ class="mint-topbar-home-link"
247
247
  >
248
248
  <slot name="icon">
249
- <div v-if="pluginIcon" class="mld-topbar__logo">
250
- <div class="mld-topbar__logo-icon">
251
- <svg class="mld-topbar__logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
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="mld-topbar__logo">
258
- <div class="mld-topbar__logo-icon">
259
- <span class="mld-topbar__logo-text">M</span>
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="mld-topbar__logo">
268
- <div class="mld-topbar__logo-icon">
269
- <svg class="mld-topbar__logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
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="mld-topbar__logo">
276
- <div class="mld-topbar__logo-icon">
277
- <span class="mld-topbar__logo-text">M</span>
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: legacy title / breadcrumb (backward compat) -->
310
- <div v-if="hasTitleGroup" class="mld-topbar-title-group">
311
- <span class="mld-topbar-title">{{ title }}</span>
312
- <span class="mld-topbar-subtitle">{{ subtitle }}</span>
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="mld-topbar-breadcrumb">
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="mld-topbar-plugin-name"
319
+ class="mint-topbar-plugin-name"
320
320
  @click.stop="togglePagesDropdown"
321
321
  >
322
322
  {{ pluginName }}
323
323
  <svg
324
- class="mld-topbar-chevron"
325
- :class="{ 'mld-topbar-chevron--open': showPagesDropdown }"
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="mld-topbar-plugin-name--static">{{ pluginName }}</span>
338
+ <span v-else class="mint-topbar-plugin-name--static">{{ pluginName }}</span>
339
339
 
340
340
  <svg
341
341
  v-if="title"
342
- class="mld-topbar-separator"
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="mld-topbar-current-page">{{ title }}</span>
354
+ <span v-if="title" class="mint-topbar-current-page">{{ title }}</span>
355
355
 
356
- <div v-show="showPagesDropdown" class="mld-topbar-dropdown">
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="['mld-topbar-dropdown-item', { 'mld-topbar-dropdown-item--active': page.id === currentPageId, 'mld-topbar-dropdown-item--disabled': page.disabled }]"
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="mld-topbar-dropdown-item__label">{{ page.label }}</span>
365
- <span v-if="page.description" class="mld-topbar-dropdown-item__description">{{ page.description }}</span>
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="['mld-topbar-dropdown-item', { 'mld-topbar-dropdown-item--active': page.id === currentPageId, 'mld-topbar-dropdown-item--disabled': page.disabled }]"
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="mld-topbar-dropdown-item__label">{{ page.label }}</span>
374
- <span v-if="page.description" class="mld-topbar-dropdown-item__description">{{ page.description }}</span>
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="['mld-topbar-dropdown-item', { 'mld-topbar-dropdown-item--active': page.id === currentPageId, 'mld-topbar-dropdown-item--disabled': page.disabled }]"
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="mld-topbar-dropdown-item__label">{{ page.label }}</span>
383
- <span v-if="page.description" class="mld-topbar-dropdown-item__description">{{ page.description }}</span>
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="mld-topbar__title-only">{{ title }}</span>
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="mld-topbar__center">
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: legacy tabs (when no pillNav) — wrapped in the same centered
407
- container as AppPillNav so legacy :tabs consumers get centered pill
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="mld-topbar__center">
410
- <div class="mld-topbar__tabs">
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="mld-topbar-tab-wrapper"
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
- 'mld-topbar-tab',
421
- { 'mld-topbar-tab--active': tab.id === currentTabId || tab.children.some(c => c.id === currentTabId) },
422
- { 'mld-topbar-tab--disabled': tab.disabled }
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="mld-topbar-tab-chevron"
429
- :class="{ 'mld-topbar-tab-chevron--open': openTabDropdown === tab.id }"
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
- 'mld-topbar-tab',
448
- { 'mld-topbar-tab--active': tab.id === currentTabId },
449
- { 'mld-topbar-tab--disabled': tab.disabled }
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
- 'mld-topbar-tab',
459
- { 'mld-topbar-tab--active': tab.id === currentTabId },
460
- { 'mld-topbar-tab--disabled': tab.disabled }
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
- 'mld-topbar-tab',
470
- { 'mld-topbar-tab--active': tab.id === currentTabId },
471
- { 'mld-topbar-tab--disabled': tab.disabled }
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="mld-topbar-tab-dropdown">
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
- 'mld-topbar-dropdown-item',
485
- { 'mld-topbar-dropdown-item--active': option.id === currentTabId },
486
- { 'mld-topbar-dropdown-item--disabled': option.disabled }
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="mld-topbar-dropdown-item__label">{{ option.label }}</span>
491
- <span v-if="option.description" class="mld-topbar-dropdown-item__description">{{ option.description }}</span>
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
- 'mld-topbar-dropdown-item',
498
- { 'mld-topbar-dropdown-item--active': option.id === currentTabId },
499
- { 'mld-topbar-dropdown-item--disabled': option.disabled }
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="mld-topbar-dropdown-item__label">{{ option.label }}</span>
504
- <span v-if="option.description" class="mld-topbar-dropdown-item__description">{{ option.description }}</span>
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
- 'mld-topbar-dropdown-item',
511
- { 'mld-topbar-dropdown-item--active': option.id === currentTabId },
512
- { 'mld-topbar-dropdown-item--disabled': option.disabled }
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="mld-topbar-dropdown-item__label">{{ option.label }}</span>
517
- <span v-if="option.description" class="mld-topbar-dropdown-item__description">{{ option.description }}</span>
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="mld-topbar__right">
528
- <span v-if="showStandaloneLabel && isStandalone && !appExperiment" class="mld-topbar__standalone-badge">
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="mld-topbar__standalone-badge">
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="mld-topbar__icon-btn"
558
+ class="mint-topbar__icon-btn"
559
559
  aria-label="Notifications"
560
560
  @click="emit('notifications-click')"
561
561
  >
562
- <svg class="mld-topbar__icon-btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
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="mld-topbar__icon-btn-dot" aria-hidden="true" />
566
+ <span v-if="hasNotificationDot" class="mint-topbar__icon-btn-dot" aria-hidden="true" />
567
567
  </button>
568
568
 
569
- <!-- Legacy: theme toggle -->
569
+ <!-- Classic: theme toggle -->
570
570
  <ThemeToggle v-if="showThemeToggle" size="sm" />
571
571
 
572
- <!-- Legacy: settings gear -->
572
+ <!-- Classic: settings gear -->
573
573
  <button
574
574
  v-if="showSettings"
575
575
  type="button"
576
- class="mld-topbar__settings-btn"
576
+ class="mint-topbar__settings-btn"
577
577
  aria-label="Open settings"
578
578
  @click="settingsOpen = true"
579
579
  >
580
- <svg class="mld-topbar__settings-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
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
- <!-- Legacy: admin link -->
585
+ <!-- Classic: admin link -->
586
586
  <router-link
587
587
  v-if="showAdmin"
588
588
  :to="adminPath"
589
- class="mld-topbar__admin-btn"
589
+ class="mint-topbar__admin-btn"
590
590
  aria-label="Admin Dashboard"
591
591
  @click="emit('admin-click')"
592
592
  >
593
- <svg class="mld-topbar__admin-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
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 legacy profile button) -->
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
- <!-- Legacy: profile button (only when avatar menu not provided) -->
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="mld-topbar__profile-btn"
620
+ class="mint-topbar__profile-btn"
621
621
  aria-label="Edit profile"
622
622
  @click="emit('profile-click')"
623
623
  >
624
- <div class="mld-topbar__profile-avatar">
624
+ <div class="mint-topbar__profile-avatar">
625
625
  {{ profileInitial }}
626
626
  </div>
627
- <span v-if="userName" class="mld-topbar__profile-name">{{ userName }}</span>
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="['mld-audit-trail', `mld-audit-trail--${size}`]">
95
- <div v-if="showFilters" class="mld-audit-trail__filters">
96
- <select v-model="filterType" class="mld-audit-trail__filter-select">
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="mld-audit-trail__filter-select">
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="mld-audit-trail__list"
108
+ class="mint-audit-trail__list"
109
109
  :style="maxHeight ? { maxHeight, overflowY: 'auto' } : {}"
110
110
  >
111
- <div class="mld-audit-trail__line" />
111
+ <div class="mint-audit-trail__line" />
112
112
  <div
113
113
  v-for="entry in sortedEntries"
114
114
  :key="entry.id"
115
- :class="['mld-audit-trail__entry', `mld-audit-trail__entry--${entry.type}`]"
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="mld-audit-trail__dot" />
120
- <div class="mld-audit-trail__content">
121
- <div class="mld-audit-trail__header">
122
- <div v-if="entry.user" class="mld-audit-trail__avatar">{{ getInitials(entry.user) }}</div>
123
- <span v-if="entry.user" class="mld-audit-trail__user">{{ entry.user }}</span>
124
- <span class="mld-audit-trail__timestamp">{{ formatTimestamp(entry.timestamp) }}</span>
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="mld-audit-trail__action">{{ entry.action }}</div>
127
- <div v-if="entry.detail" class="mld-audit-trail__detail">{{ entry.detail }}</div>
128
- <div v-if="entry.metadata && Object.keys(entry.metadata).length" class="mld-audit-trail__metadata">
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="mld-audit-trail__metadata-item"
132
+ class="mint-audit-trail__metadata-item"
133
133
  >
134
- <span class="mld-audit-trail__metadata-key">{{ key }}:</span>
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="mld-audit-trail__empty">
143
+ <div v-if="!sortedEntries.length" class="mint-audit-trail__empty">
144
144
  <slot name="empty">{{ emptyMessage }}</slot>
145
145
  </div>
146
146
  </div>