@morscherlab/mint-sdk 1.3.0-beta.1 → 1.3.0-beta.10
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 +23 -140
- package/dist/{ResourcePickerListInternal-c3IT8PIu.js → ResourcePickerListInternal-CFAw4vTZ.js} +26 -19
- package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
- package/dist/components/FilePicker.vue.d.ts +4 -1
- package/dist/components/SettingsModal.schema.d.ts +1 -1
- package/dist/components/SettingsModal.vue.d.ts +2 -0
- package/dist/components/WellPlate.colors.d.ts +1 -5
- package/dist/components/WellPlate.rendering.d.ts +5 -2
- package/dist/components/index.d.ts +32 -17
- package/dist/components/index.js +3 -3
- package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -0
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +9 -3
- package/dist/{components-CvY105kJ.js → components-GDDvof8D.js} +414 -368
- package/dist/components-GDDvof8D.js.map +1 -0
- package/dist/composables/createFilePickerAdapter.d.ts +5 -1
- package/dist/composables/filePicker/usePickerNavigation.d.ts +3 -2
- package/dist/composables/index.d.ts +0 -3
- package/dist/composables/index.js +4 -4
- package/dist/composables/useAutoGroup.d.ts +1 -1
- package/dist/composables/useBioTemplateComponents.d.ts +15 -3
- package/dist/composables/useBioTemplateControls.d.ts +5 -1
- package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
- package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
- package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
- package/dist/composables/useExperimentSave.d.ts +5 -1
- package/dist/composables/useFilePicker.d.ts +4 -1
- package/dist/composables/useGroupAssignment.d.ts +5 -1
- package/dist/composables/usePlatformContext.d.ts +3 -0
- package/dist/composables/useTemplateCollection.d.ts +5 -1
- package/dist/composables-D6uqp0UF.js +591 -0
- package/dist/composables-D6uqp0UF.js.map +1 -0
- package/dist/index.js +24 -24
- package/dist/index.js.map +1 -1
- package/dist/install.js +1 -1
- package/dist/lcms.d.ts +11 -11
- package/dist/styles.css +170 -200
- package/dist/templates/index.js +1 -1
- package/dist/{templates-Bj9hZ7iV.js → templates-BU1pet28.js} +31 -44
- package/dist/templates-BU1pet28.js.map +1 -0
- package/dist/types/auth.d.ts +0 -27
- package/dist/types/components.d.ts +8 -0
- package/dist/types/fileBrowserTypes.d.ts +13 -0
- package/dist/types/filePicker.d.ts +8 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/platform.d.ts +2 -0
- package/dist/utils/rack.d.ts +16 -16
- package/dist/{validation-B4Y8_eEe.js → validation-Dmp9Q5W0.js} +50 -12
- package/dist/validation-Dmp9Q5W0.js.map +1 -0
- package/package.json +1 -6
- package/src/__tests__/components/ActionMenu.test.ts +10 -0
- package/src/__tests__/components/AppTopBar.test.ts +24 -8
- package/src/__tests__/components/EmptyState.test.ts +15 -0
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +12 -5
- package/src/__tests__/components/FilePicker.test.ts +65 -1
- package/src/__tests__/components/FileUploader.test.ts +6 -9
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +23 -4
- package/src/__tests__/components/SettingsModal.test.ts +22 -0
- package/src/__tests__/components/WellPlate.decoration.test.ts +4 -28
- package/src/__tests__/components/WellPlate.rendering.test.ts +20 -33
- package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +7 -7
- package/src/__tests__/composables/createFilePickerAdapter.test.ts +92 -1
- package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
- package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +2 -2
- package/src/__tests__/styles/controlRefreshRules.test.ts +21 -8
- package/src/__tests__/styles/menusShellRefresh.test.ts +20 -5
- package/src/__tests__/templates/templatesDeprecation.test.ts +58 -11
- package/src/components/ActionMenu.vue +10 -2
- package/src/components/AppTopBar.vue +6 -4
- package/src/components/EmptyState.vue +3 -1
- package/src/components/ExperimentSelectorModal.vue +4 -1
- package/src/components/FilePicker.vue +42 -0
- package/src/components/FileUploader.vue +30 -46
- package/src/components/SettingsModal.schema.ts +4 -2
- package/src/components/SettingsModal.vue +4 -2
- package/src/components/WellPlate.colors.ts +6 -10
- package/src/components/WellPlate.legend.ts +4 -4
- package/src/components/WellPlate.rendering.ts +9 -8
- package/src/components/WellPlate.vue +5 -22
- package/src/components/index.ts +32 -17
- package/src/components/internal/FilePickerListInternal.vue +11 -2
- package/src/components/internal/ResourcePickerListInternal.vue +21 -27
- package/src/composables/autoGroup/index.ts +1 -1
- package/src/composables/createFilePickerAdapter.ts +82 -22
- package/src/composables/filePicker/usePickerNavigation.ts +29 -2
- package/src/composables/index.ts +0 -7
- package/src/composables/useAutoGroup.ts +1 -1
- package/src/composables/useBioTemplateComponents.ts +15 -3
- package/src/composables/useBioTemplateControls.ts +5 -1
- package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
- package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
- package/src/composables/useBioTemplateWorkspace.ts +5 -1
- package/src/composables/useExperimentSave.ts +5 -1
- package/src/composables/useFilePicker.ts +8 -1
- package/src/composables/useGroupAssignment.ts +5 -1
- package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
- package/src/composables/useTemplateCollection.ts +5 -1
- package/src/index.ts +1 -1
- package/src/lcms.ts +11 -11
- package/src/styles/components/action-menu.css +10 -0
- package/src/styles/components/app-page-selector.css +3 -3
- package/src/styles/components/app-pill-nav.css +1 -1
- package/src/styles/components/app-top-bar.css +18 -38
- package/src/styles/components/empty-state.css +3 -2
- package/src/styles/components/experiment-selector-modal.css +3 -9
- package/src/styles/components/file-picker.css +23 -1
- package/src/styles/components/file-uploader.css +22 -55
- package/src/styles/components/resource-picker-list.css +70 -36
- package/src/styles/components/well-plate.css +18 -55
- package/src/types/auth.ts +0 -37
- package/src/types/components.ts +8 -0
- package/src/types/fileBrowserTypes.ts +15 -0
- package/src/types/filePicker.ts +8 -1
- package/src/types/index.ts +2 -5
- package/src/types/platform.ts +2 -0
- package/src/utils/rack.ts +16 -16
- package/dist/ResourcePickerListInternal-c3IT8PIu.js.map +0 -1
- package/dist/__tests__/composables/useAuth.test.d.ts +0 -1
- package/dist/__tests__/composables/usePasskey.test.d.ts +0 -1
- package/dist/components-CvY105kJ.js.map +0 -1
- package/dist/composables/useAuth.d.ts +0 -47
- package/dist/composables/usePasskey.d.ts +0 -10
- package/dist/composables/useWellPlateEditor.d.ts +0 -33
- package/dist/composables-DL4Vca7L.js +0 -1193
- package/dist/composables-DL4Vca7L.js.map +0 -1
- package/dist/plotly.min-D6Ge6qgX.js +0 -168582
- package/dist/plotly.min-D6Ge6qgX.js.map +0 -1
- package/dist/templates-Bj9hZ7iV.js.map +0 -1
- package/dist/validation-B4Y8_eEe.js.map +0 -1
- package/src/__tests__/composables/useAuth.test.ts +0 -290
- package/src/__tests__/composables/usePasskey.test.ts +0 -38
- package/src/composables/useAuth.ts +0 -470
- package/src/composables/usePasskey.ts +0 -216
- package/src/composables/useWellPlateEditor.ts +0 -415
package/README.md
CHANGED
|
@@ -59,17 +59,13 @@ export default {
|
|
|
59
59
|
```vue
|
|
60
60
|
<script setup lang="ts">
|
|
61
61
|
import { BaseButton, BaseInput, FormField } from '@morscherlab/mint-sdk'
|
|
62
|
-
import { useToast
|
|
62
|
+
import { useToast } from '@morscherlab/mint-sdk'
|
|
63
63
|
import type { ButtonVariant } from '@morscherlab/mint-sdk'
|
|
64
64
|
|
|
65
65
|
const { success } = useToast()
|
|
66
|
-
const { login } = useAuth()
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (result) {
|
|
71
|
-
success('Login successful!')
|
|
72
|
-
}
|
|
67
|
+
function handleSubmit() {
|
|
68
|
+
success('Saved!')
|
|
73
69
|
}
|
|
74
70
|
</script>
|
|
75
71
|
|
|
@@ -79,7 +75,7 @@ async function handleSubmit() {
|
|
|
79
75
|
</FormField>
|
|
80
76
|
|
|
81
77
|
<BaseButton variant="primary" @click="handleSubmit">
|
|
82
|
-
|
|
78
|
+
Save
|
|
83
79
|
</BaseButton>
|
|
84
80
|
</template>
|
|
85
81
|
```
|
|
@@ -198,76 +194,16 @@ async function saveCurrentExperiment() {
|
|
|
198
194
|
}
|
|
199
195
|
```
|
|
200
196
|
|
|
201
|
-
### 5.
|
|
197
|
+
### 5. Biology Data Templates (deprecated)
|
|
202
198
|
|
|
203
|
-
> Deprecated
|
|
204
|
-
>
|
|
199
|
+
> Deprecated in MINT 1.3 and removed in 1.4, with no SDK replacement: the
|
|
200
|
+
> biology data templates (`@morscherlab/mint-sdk/templates`, `mint_sdk.templates`,
|
|
201
|
+
> `mint add data-template*`), the `BioTemplate*` views, the `useBioTemplate*`
|
|
202
|
+
> composables, `useTemplateCollection()`, `useExperimentSave()`, and the
|
|
203
|
+
> template-only components `ReagentList`, `ReagentEditor`, `ExperimentTimeline`,
|
|
204
|
+
> `SampleLegend` and `FitPanel`.
|
|
205
205
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
```typescript
|
|
209
|
-
import {
|
|
210
|
-
createWellPlateScreenCollection,
|
|
211
|
-
createTemplateCollection,
|
|
212
|
-
createPlateMapTemplate,
|
|
213
|
-
createSampleSheetTemplate,
|
|
214
|
-
ensureTemplateFromCollection,
|
|
215
|
-
listBioTemplateCatalog,
|
|
216
|
-
listBioTemplatePresets,
|
|
217
|
-
toPlateMapEditorState,
|
|
218
|
-
toTemplateDataFrame,
|
|
219
|
-
} from '@morscherlab/mint-sdk/templates'
|
|
220
|
-
|
|
221
|
-
const catalog = listBioTemplateCatalog()
|
|
222
|
-
const presets = listBioTemplatePresets()
|
|
223
|
-
const template = createPlateMapTemplate({
|
|
224
|
-
samples: ['Control', 'Treatment'],
|
|
225
|
-
})
|
|
226
|
-
const plateEditorState = toPlateMapEditorState(template)
|
|
227
|
-
|
|
228
|
-
const sampleFrame = toTemplateDataFrame(createSampleSheetTemplate({
|
|
229
|
-
samples: [{ sampleId: 'S001', name: 'Control 1' }],
|
|
230
|
-
}))
|
|
231
|
-
// <DataFrame v-bind="sampleFrame" />
|
|
232
|
-
|
|
233
|
-
const collection = createTemplateCollection([template])
|
|
234
|
-
const loadedPlate = ensureTemplateFromCollection(collection, 'plate-map')
|
|
235
|
-
|
|
236
|
-
const screenCollection = createWellPlateScreenCollection({
|
|
237
|
-
samples: ['Control', 'Treatment'],
|
|
238
|
-
compounds: { 'Drug A': [10, 1, 0.1] },
|
|
239
|
-
unit: 'uM',
|
|
240
|
-
})
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
For frontend wiring, `useBioTemplateWorkspace()` combines the generated
|
|
244
|
-
controls, sidebar/forms, renderer props, and SDK component bindings:
|
|
245
|
-
|
|
246
|
-
```typescript
|
|
247
|
-
import { useBioTemplateWorkspace } from '@morscherlab/mint-sdk'
|
|
248
|
-
import { createWellPlateScreenCollection } from '@morscherlab/mint-sdk/templates'
|
|
249
|
-
|
|
250
|
-
const collection = createWellPlateScreenCollection({
|
|
251
|
-
samples: ['Control', 'Treatment'],
|
|
252
|
-
compounds: { 'Drug A': [10, 1, 0.1] },
|
|
253
|
-
})
|
|
254
|
-
const workspace = useBioTemplateWorkspace(collection)
|
|
255
|
-
|
|
256
|
-
// <AppSidebar v-bind="workspace.sidebar" />
|
|
257
|
-
// <FormBuilder v-bind="workspace.form" />
|
|
258
|
-
// <BioTemplateRenderer v-if="workspace.renderer" v-bind="workspace.renderer" />
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
For editable built-in presets, `useBioTemplatePresetWorkspace()` also manages
|
|
262
|
-
the generated control values, collection updates, and current-experiment save:
|
|
263
|
-
|
|
264
|
-
```typescript
|
|
265
|
-
import { BioTemplatePresetWorkspaceView, useBioTemplatePresetWorkspace } from '@morscherlab/mint-sdk'
|
|
266
|
-
|
|
267
|
-
const workspace = useBioTemplatePresetWorkspace('wellplate-screen')
|
|
268
|
-
|
|
269
|
-
// <BioTemplatePresetWorkspaceView :workspace="workspace" />
|
|
270
|
-
```
|
|
206
|
+
### 6. Build Control Workspaces
|
|
271
207
|
|
|
272
208
|
For custom plugin tools, pass one workspace model to `ControlWorkspaceView` to
|
|
273
209
|
generate `AppTopBar`, `AppSidebar`, `FormBuilder`, component prop bindings, and
|
|
@@ -328,26 +264,6 @@ const workspaceModel = defineDoseDesignControlModel({
|
|
|
328
264
|
</template>
|
|
329
265
|
```
|
|
330
266
|
|
|
331
|
-
Built-in templates include `plate-map`, `sample-sheet`, `sample-prep`,
|
|
332
|
-
`dose-response`, `calibration-curve`, `time-course`, `protocol-steps`, `assay-matrix`,
|
|
333
|
-
`reagent-list`, `flow-cytometry-panel`, `instrument-run`, and `qpcr-plate`. In
|
|
334
|
-
plugin projects, `mint add data-template <name> --page` generates the
|
|
335
|
-
matching backend route, typed frontend composable, and starter view.
|
|
336
|
-
Generated composables use `ensureTemplateEnvelope()` to validate backend
|
|
337
|
-
template payloads before assigning typed frontend state. Use
|
|
338
|
-
`createTemplateCollection()`, `extractTemplateCollection()`, and
|
|
339
|
-
`ensureTemplateFromCollection()` when a plugin view reads or writes the shared
|
|
340
|
-
`design_data.templates` layout. `mint add data-template-pack <name> --page`
|
|
341
|
-
generates a pack-level composable that uses these helpers for curated
|
|
342
|
-
experiment scaffolds.
|
|
343
|
-
Use `mint add data-template-pack <name> --page` for curated sets such as
|
|
344
|
-
`cell-culture-screen`, `omics-assay`, `longitudinal-study`, and
|
|
345
|
-
`molecular-assay`.
|
|
346
|
-
For no-scaffold defaults that can be saved directly to `design_data`, use
|
|
347
|
-
template presets such as `createWellPlateScreenCollection()`,
|
|
348
|
-
`createQpcrExpressionCollection()`, `createLcmsBatchCollection()`, and
|
|
349
|
-
`createWesternBlotAssayCollection()`.
|
|
350
|
-
|
|
351
267
|
## Components
|
|
352
268
|
|
|
353
269
|
### Base Components
|
|
@@ -379,19 +295,15 @@ not define its own input, select, textarea, unit or button looks.
|
|
|
379
295
|
- `AppTopBar` - Application header with slots
|
|
380
296
|
- `AppSidebar` - Context sidebar that accepts panels/forms or a compact `controls` schema
|
|
381
297
|
|
|
382
|
-
### Biological Template Components
|
|
383
|
-
- `BioTemplateRenderer` - Render template envelopes or collections with matching SDK components
|
|
384
|
-
- `BioTemplateExperimentWorkspaceView` - Current-experiment load/save/reset workspace for one template or collection
|
|
385
|
-
- `BioTemplatePresetWorkspaceView` - Full editable preset workspace from `useBioTemplatePresetWorkspace()`
|
|
386
|
-
|
|
387
298
|
### File & Data Components
|
|
388
299
|
- `FileUploader` - Drag-and-drop file upload with file/folder mode support
|
|
389
300
|
|
|
390
301
|
### Sample Management Components
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
302
|
+
|
|
303
|
+
Deprecated in MINT 1.3 and removed in 1.4, with no SDK replacement: sample
|
|
304
|
+
grouping as a whole (`SampleSelector`, `SmartGroupModal`,
|
|
305
|
+
`SmartGroupFieldRecipe`, `SmartGroupManual`, `AutoGroupModal`,
|
|
306
|
+
`useAutoGroup`, `GroupAssigner`, `useGroupAssignment`).
|
|
395
307
|
|
|
396
308
|
### Removed Compatibility APIs
|
|
397
309
|
|
|
@@ -399,7 +311,7 @@ The public SDK no longer exports `ToastNotification`, `GroupingModal`,
|
|
|
399
311
|
`SettingsButton`, `FormSection`, `FormFieldRenderer`, `usePluginApi()`, or
|
|
400
312
|
`usePluginConfig()`. The identity-only `usePluginClient()` and the legacy
|
|
401
313
|
`useJobsStatusTray()` job adapter API remain deprecated until MINT 1.4.
|
|
402
|
-
Use `AppToastContainer`, `
|
|
314
|
+
Use `AppToastContainer`, `AppTopBar` settings or
|
|
403
315
|
`SettingsModal`, `FormBuilder`, `usePluginSettings()`, generated
|
|
404
316
|
`useGeneratedPluginClient()` helpers, and source-driven `usePluginJobCenter()`
|
|
405
317
|
instead.
|
|
@@ -409,10 +321,11 @@ MINT 1.3 also removed `ColorSlider` (pass `colorStops`, `thresholds`,
|
|
|
409
321
|
(`BaseSelect` or `SearchableSelect` for values, `ActionMenu` for actions),
|
|
410
322
|
`InstrumentAlertLog`, `InstrumentStatusCard`, `LcmsSequenceTable`, `useAsync()`,
|
|
411
323
|
`useOptimisticMutation()` (use `useRequestSyncState()`), `useResourceCrud()`
|
|
412
|
-
(use `useGeneratedPluginClient()`), `useCommandHistory()`,
|
|
413
|
-
`useWellPlateAdapter()
|
|
414
|
-
`
|
|
415
|
-
|
|
324
|
+
(use `useGeneratedPluginClient()`), `useCommandHistory()`,
|
|
325
|
+
`useWellPlateAdapter()`, `useWellPlateValidation()` (no SDK replacement; keep
|
|
326
|
+
them in the plugin), `useWellPainting()` and `useWellPlateEditor()` (use
|
|
327
|
+
`useRackEditor()` with `PlateEditor`). `mint doctor` still detects old imports
|
|
328
|
+
and reports the replacement path.
|
|
416
329
|
|
|
417
330
|
MINT 1.3 removed `AppPluginSwitcher` and its `PluginSwitcherPlugin` /
|
|
418
331
|
`PluginSwitcherInfo` types, with the `pluginSwitcher` prop and
|
|
@@ -545,35 +458,6 @@ callers can present a single sign-in prompt without risking duplicate writes.
|
|
|
545
458
|
Clients created with `withAuth: false` retain their existing auth state and
|
|
546
459
|
receive the original HTTP error.
|
|
547
460
|
|
|
548
|
-
### `useAuth()`
|
|
549
|
-
Authentication methods.
|
|
550
|
-
|
|
551
|
-
```typescript
|
|
552
|
-
const { login, logout, initializeAuth, getCurrentUser } = useAuth()
|
|
553
|
-
|
|
554
|
-
// Initialize on app mount
|
|
555
|
-
await initializeAuth()
|
|
556
|
-
|
|
557
|
-
// Login
|
|
558
|
-
const success = await login(username, password)
|
|
559
|
-
|
|
560
|
-
// Get current user
|
|
561
|
-
const user = await getCurrentUser()
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
### `usePasskey()`
|
|
565
|
-
WebAuthn/FIDO2 passkey support.
|
|
566
|
-
|
|
567
|
-
```typescript
|
|
568
|
-
const { isSupported, registerPasskey, loginWithPasskey } = usePasskey()
|
|
569
|
-
|
|
570
|
-
if (isSupported()) {
|
|
571
|
-
await registerPasskey('My Device')
|
|
572
|
-
// or
|
|
573
|
-
await loginWithPasskey()
|
|
574
|
-
}
|
|
575
|
-
```
|
|
576
|
-
|
|
577
461
|
### `useTheme()`
|
|
578
462
|
Theme switching.
|
|
579
463
|
|
|
@@ -676,7 +560,6 @@ import type {
|
|
|
676
560
|
// Auth
|
|
677
561
|
AuthConfig,
|
|
678
562
|
UserInfo,
|
|
679
|
-
LoginResponse,
|
|
680
563
|
|
|
681
564
|
// Platform
|
|
682
565
|
PluginInfo,
|
package/dist/{ResourcePickerListInternal-c3IT8PIu.js → ResourcePickerListInternal-CFAw4vTZ.js}
RENAMED
|
@@ -272,6 +272,10 @@ var _hoisted_5$1 = {
|
|
|
272
272
|
class: "mint-empty-state__description"
|
|
273
273
|
};
|
|
274
274
|
var _hoisted_6$1 = {
|
|
275
|
+
key: 2,
|
|
276
|
+
class: "mint-empty-state__content"
|
|
277
|
+
};
|
|
278
|
+
var _hoisted_7$1 = {
|
|
275
279
|
key: 0,
|
|
276
280
|
class: "mint-empty-state__action"
|
|
277
281
|
};
|
|
@@ -324,9 +328,9 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
|
|
|
324
328
|
createElementVNode("div", _hoisted_3$1, [
|
|
325
329
|
__props.title ? (openBlock(), createElementBlock("h3", _hoisted_4$1, toDisplayString(__props.title), 1)) : createCommentVNode("", true),
|
|
326
330
|
__props.description ? (openBlock(), createElementBlock("p", _hoisted_5$1, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
|
|
327
|
-
renderSlot(_ctx.$slots, "default")
|
|
331
|
+
_ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_6$1, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
|
|
328
332
|
]),
|
|
329
|
-
__props.actionLabel ? (openBlock(), createElementBlock("div",
|
|
333
|
+
__props.actionLabel ? (openBlock(), createElementBlock("div", _hoisted_7$1, [createVNode(BaseButton_default, {
|
|
330
334
|
variant: "secondary",
|
|
331
335
|
onClick: _cache[0] || (_cache[0] = ($event) => emit("action"))
|
|
332
336
|
}, {
|
|
@@ -394,23 +398,22 @@ var _hoisted_8 = [
|
|
|
394
398
|
];
|
|
395
399
|
var _hoisted_9 = { class: "mint-resource-picker__text" };
|
|
396
400
|
var _hoisted_10 = { class: "mint-resource-picker__title" };
|
|
397
|
-
var _hoisted_11 = {
|
|
398
|
-
var _hoisted_12 = {
|
|
401
|
+
var _hoisted_11 = {
|
|
399
402
|
key: 0,
|
|
400
403
|
class: "mint-resource-picker__meta"
|
|
401
404
|
};
|
|
402
|
-
var
|
|
405
|
+
var _hoisted_12 = {
|
|
406
|
+
key: 0,
|
|
407
|
+
class: "mint-resource-picker__code mint-exp-code mint-exp-code--sm"
|
|
408
|
+
};
|
|
409
|
+
var _hoisted_13 = { key: 1 };
|
|
403
410
|
var _hoisted_14 = {
|
|
404
|
-
|
|
405
|
-
|
|
411
|
+
key: 0,
|
|
412
|
+
class: "mint-resource-picker__aside"
|
|
406
413
|
};
|
|
407
414
|
var _hoisted_15 = {
|
|
408
|
-
key:
|
|
409
|
-
class: "mint-resource-
|
|
410
|
-
viewBox: "0 0 16 16",
|
|
411
|
-
fill: "none",
|
|
412
|
-
stroke: "currentColor",
|
|
413
|
-
"stroke-width": "2"
|
|
415
|
+
key: 1,
|
|
416
|
+
class: "mint-resource-picker__date"
|
|
414
417
|
};
|
|
415
418
|
//#endregion
|
|
416
419
|
//#region src/components/internal/ResourcePickerListInternal.vue
|
|
@@ -437,7 +440,8 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
|
|
|
437
440
|
setup(__props, { emit: __emit }) {
|
|
438
441
|
/**
|
|
439
442
|
* Searchable, optionally grouped single-select list shared by the experiment and
|
|
440
|
-
* artifact selector modals
|
|
443
|
+
* artifact selector modals: two-line rows (title, then code + meta) with status and date
|
|
444
|
+
* in a right-hand column, a filled selected row, skeleton,
|
|
441
445
|
* error and empty states, and the combobox keyboard model (↑ ↓ Enter).
|
|
442
446
|
*/
|
|
443
447
|
const props = __props;
|
|
@@ -578,13 +582,16 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
|
|
|
578
582
|
onClick: ($event) => emit("select", item),
|
|
579
583
|
onMouseenter: ($event) => activeIndex.value = indexOf(item)
|
|
580
584
|
}, [
|
|
581
|
-
createElementVNode("span", _hoisted_9, [createElementVNode("span", _hoisted_10,
|
|
582
|
-
|
|
585
|
+
createElementVNode("span", _hoisted_9, [createElementVNode("span", _hoisted_10, toDisplayString(__props.describe(item).title), 1), __props.describe(item).code || __props.describe(item).meta?.length ? (openBlock(), createElementBlock("span", _hoisted_11, [__props.describe(item).code ? (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(__props.describe(item).code), 1)) : createCommentVNode("", true), __props.describe(item).meta?.length ? (openBlock(), createElementBlock("span", _hoisted_13, toDisplayString(__props.describe(item).meta.join(" · ")), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]),
|
|
586
|
+
__props.describe(item).status || __props.describe(item).date ? (openBlock(), createElementBlock("span", _hoisted_14, [__props.describe(item).status ? (openBlock(), createElementBlock("span", {
|
|
583
587
|
key: 0,
|
|
588
|
+
class: normalizeClass(["mint-resource-picker__status", `mint-resource-picker__status--${__props.describe(item).status.variant}`])
|
|
589
|
+
}, toDisplayString(__props.describe(item).status.label), 3)) : createCommentVNode("", true), __props.describe(item).date ? (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString(__props.describe(item).date), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
|
|
590
|
+
_ctx.$slots.actions ? (openBlock(), createElementBlock("span", {
|
|
591
|
+
key: 1,
|
|
584
592
|
class: "mint-resource-picker__actions",
|
|
585
593
|
onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
|
|
586
|
-
}, [renderSlot(_ctx.$slots, "actions", { item })])) : createCommentVNode("", true)
|
|
587
|
-
createElementVNode("span", _hoisted_14, [__props.itemKey(item) === __props.selectedKey ? (openBlock(), createElementBlock("svg", _hoisted_15, [..._cache[5] || (_cache[5] = [createElementVNode("path", { d: "M3.5 8.5l3 3 6-7" }, null, -1)])])) : createCommentVNode("", true)])
|
|
594
|
+
}, [renderSlot(_ctx.$slots, "actions", { item })])) : createCommentVNode("", true)
|
|
588
595
|
], 42, _hoisted_8);
|
|
589
596
|
}), 128))], 64);
|
|
590
597
|
}), 128))], 8, _hoisted_4))
|
|
@@ -595,4 +602,4 @@ var ResourcePickerListInternal_default = /* @__PURE__ */ defineComponent({
|
|
|
595
602
|
//#endregion
|
|
596
603
|
export { normalizeOptionInput as a, BaseSelect_default as i, Skeleton_default as n, BaseInput_default as o, EmptyState_default as r, ResourcePickerListInternal_default as t };
|
|
597
604
|
|
|
598
|
-
//# sourceMappingURL=ResourcePickerListInternal-
|
|
605
|
+
//# sourceMappingURL=ResourcePickerListInternal-CFAw4vTZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePickerListInternal-CFAw4vTZ.js","names":["$slots","$slots"],"sources":["../src/components/BaseInput.vue","../src/components/BaseInput.vue","../src/utils/options.ts","../src/components/BaseSelect.vue","../src/components/BaseSelect.vue","../src/components/EmptyState.vue","../src/components/EmptyState.vue","../src/components/Skeleton.vue","../src/components/Skeleton.vue","../src/components/internal/ResourcePickerListInternal.vue","../src/components/internal/ResourcePickerListInternal.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Renders a styled `<input>` supporting text/number/email types, size, error, and readonly states.\n * Optional `#prefix` (bare leading glyph, e.g. a search icon) and `#suffix` (neutral unit segment) slots sit inside the field border.\n */\nimport { computed, useAttrs, useSlots, type StyleValue } from 'vue'\nimport type { InputType } from '../types'\n\ndefineOptions({ inheritAttrs: false })\n\ninterface Props {\n modelValue?: string | number\n type?: InputType\n placeholder?: string\n disabled?: boolean\n readonly?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n autocomplete?: string\n autofocus?: boolean\n min?: number\n max?: number\n step?: number\n list?: string\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n keydown: [event: KeyboardEvent]\n}>()\n\ndefineSlots<{\n /** Leading glyph inside the field border (search icon, currency, …), no segment background. */\n prefix?: () => unknown\n /** Trailing segment inside the field border, e.g. a unit (mono 12px on `--bg-primary`). */\n suffix?: () => unknown\n}>()\n\nconst attrs = useAttrs()\nconst slots = useSlots()\nconst wrapped = computed(() => Boolean(slots.prefix || slots.suffix))\n\n/** Wrapped: class/style style the group, every other attribute (id, name, aria-*) stays on the input. */\nconst inputAttrs = computed(() => {\n if (!wrapped.value) return attrs\n const { class: _class, style: _style, ...rest } = attrs\n return rest\n})\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number'\n ? (target.value === '' ? null : Number(target.value))\n : target.value\n emit('update:modelValue', value as string | number)\n}\n</script>\n\n<template>\n <div\n v-if=\"wrapped\"\n :class=\"[\n 'mint-input-group',\n `mint-input-group--${size}`,\n error ? 'mint-input-group--error' : '',\n disabled ? 'mint-input-group--disabled' : '',\n attrs.class,\n ]\"\n :style=\"attrs.style as StyleValue\"\n >\n <span v-if=\"slots.prefix\" class=\"mint-input-group__prefix\"><slot name=\"prefix\" /></span>\n <input\n v-bind=\"inputAttrs\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :autocomplete=\"autocomplete\"\n :autofocus=\"autofocus\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :list=\"list\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"['mint-input', `mint-input--${size}`, 'mint-input-group__control']\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n @keydown=\"emit('keydown', $event)\"\n />\n <span v-if=\"slots.suffix\" class=\"mint-input-group__suffix\"><slot name=\"suffix\" /></span>\n </div>\n <input\n v-else\n v-bind=\"inputAttrs\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :autocomplete=\"autocomplete\"\n :autofocus=\"autofocus\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :list=\"list\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"[\n 'mint-input',\n `mint-input--${size}`,\n error ? 'mint-input--error' : '',\n disabled ? 'mint-input--disabled' : '',\n ]\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n @keydown=\"emit('keydown', $event)\"\n />\n</template>\n","<script setup lang=\"ts\">\n/**\n * Renders a styled `<input>` supporting text/number/email types, size, error, and readonly states.\n * Optional `#prefix` (bare leading glyph, e.g. a search icon) and `#suffix` (neutral unit segment) slots sit inside the field border.\n */\nimport { computed, useAttrs, useSlots, type StyleValue } from 'vue'\nimport type { InputType } from '../types'\n\ndefineOptions({ inheritAttrs: false })\n\ninterface Props {\n modelValue?: string | number\n type?: InputType\n placeholder?: string\n disabled?: boolean\n readonly?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n autocomplete?: string\n autofocus?: boolean\n min?: number\n max?: number\n step?: number\n list?: string\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n keydown: [event: KeyboardEvent]\n}>()\n\ndefineSlots<{\n /** Leading glyph inside the field border (search icon, currency, …), no segment background. */\n prefix?: () => unknown\n /** Trailing segment inside the field border, e.g. a unit (mono 12px on `--bg-primary`). */\n suffix?: () => unknown\n}>()\n\nconst attrs = useAttrs()\nconst slots = useSlots()\nconst wrapped = computed(() => Boolean(slots.prefix || slots.suffix))\n\n/** Wrapped: class/style style the group, every other attribute (id, name, aria-*) stays on the input. */\nconst inputAttrs = computed(() => {\n if (!wrapped.value) return attrs\n const { class: _class, style: _style, ...rest } = attrs\n return rest\n})\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number'\n ? (target.value === '' ? null : Number(target.value))\n : target.value\n emit('update:modelValue', value as string | number)\n}\n</script>\n\n<template>\n <div\n v-if=\"wrapped\"\n :class=\"[\n 'mint-input-group',\n `mint-input-group--${size}`,\n error ? 'mint-input-group--error' : '',\n disabled ? 'mint-input-group--disabled' : '',\n attrs.class,\n ]\"\n :style=\"attrs.style as StyleValue\"\n >\n <span v-if=\"slots.prefix\" class=\"mint-input-group__prefix\"><slot name=\"prefix\" /></span>\n <input\n v-bind=\"inputAttrs\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :autocomplete=\"autocomplete\"\n :autofocus=\"autofocus\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :list=\"list\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"['mint-input', `mint-input--${size}`, 'mint-input-group__control']\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n @keydown=\"emit('keydown', $event)\"\n />\n <span v-if=\"slots.suffix\" class=\"mint-input-group__suffix\"><slot name=\"suffix\" /></span>\n </div>\n <input\n v-else\n v-bind=\"inputAttrs\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :autocomplete=\"autocomplete\"\n :autofocus=\"autofocus\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :list=\"list\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"[\n 'mint-input',\n `mint-input--${size}`,\n error ? 'mint-input--error' : '',\n disabled ? 'mint-input--disabled' : '',\n ]\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n @keydown=\"emit('keydown', $event)\"\n />\n</template>\n","export type OptionLike<TValue extends string | number> = {\n value: TValue\n label: string\n}\n\nexport function normalizeOptionInput<\n TValue extends string | number,\n TOption extends OptionLike<TValue>,\n>(option: TOption | TValue): TOption {\n if (typeof option === 'object') return option\n\n return {\n value: option,\n label: String(option),\n } as TOption\n}\n\nexport function findOptionByDomValue<\n TValue extends string | number,\n TOption extends OptionLike<TValue>,\n>(options: TOption[], value: string): TOption | undefined {\n return options.find(option => String(option.value) === value)\n}\n","<script setup lang=\"ts\">\n/** Renders a native `<select>` element with size, error, and disabled states. */\nimport { computed, useAttrs } from 'vue'\nimport type { HTMLAttributes } from 'vue'\nimport type { SelectOption, SelectOptionInput } from '../types'\nimport { findOptionByDomValue, normalizeOptionInput } from '../utils/options'\n\ndefineOptions({ inheritAttrs: false })\n\ninterface Props {\n modelValue?: string | number\n options: SelectOptionInput<string | number>[]\n placeholder?: string\n disabled?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n error: false,\n size: 'md',\n})\nconst attrs = useAttrs()\n\nconst controlAttrs = computed(() => {\n const { class: _class, style: _style, ...nativeAttrs } = attrs\n return nativeAttrs\n})\nconst wrapperAttrs = computed<Pick<HTMLAttributes, 'class' | 'style'>>(() => ({\n class: attrs.class as HTMLAttributes['class'],\n style: attrs.style as HTMLAttributes['style'],\n}))\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number]\n}>()\n\nconst normalizedOptions = computed<SelectOption<string | number>[]>(() =>\n props.options.map(normalizeOptionInput)\n)\n\nfunction handleChange(event: Event) {\n const target = event.target as HTMLSelectElement\n const option = findOptionByDomValue(normalizedOptions.value, target.value)\n emit('update:modelValue', option?.value ?? target.value)\n}\n</script>\n\n<template>\n <div v-bind=\"wrapperAttrs\" class=\"mint-select\">\n <select\n v-bind=\"controlAttrs\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"[\n 'mint-select__control',\n `mint-select__control--${size}`,\n error ? 'mint-select__control--error' : '',\n disabled ? 'mint-select__control--disabled' : '',\n ]\"\n @change=\"handleChange\"\n >\n <option v-if=\"placeholder\" value=\"\" disabled>\n {{ placeholder }}\n </option>\n <option\n v-for=\"option in normalizedOptions\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n <div class=\"mint-select__icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 24 24\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a native `<select>` element with size, error, and disabled states. */\nimport { computed, useAttrs } from 'vue'\nimport type { HTMLAttributes } from 'vue'\nimport type { SelectOption, SelectOptionInput } from '../types'\nimport { findOptionByDomValue, normalizeOptionInput } from '../utils/options'\n\ndefineOptions({ inheritAttrs: false })\n\ninterface Props {\n modelValue?: string | number\n options: SelectOptionInput<string | number>[]\n placeholder?: string\n disabled?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n error: false,\n size: 'md',\n})\nconst attrs = useAttrs()\n\nconst controlAttrs = computed(() => {\n const { class: _class, style: _style, ...nativeAttrs } = attrs\n return nativeAttrs\n})\nconst wrapperAttrs = computed<Pick<HTMLAttributes, 'class' | 'style'>>(() => ({\n class: attrs.class as HTMLAttributes['class'],\n style: attrs.style as HTMLAttributes['style'],\n}))\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number]\n}>()\n\nconst normalizedOptions = computed<SelectOption<string | number>[]>(() =>\n props.options.map(normalizeOptionInput)\n)\n\nfunction handleChange(event: Event) {\n const target = event.target as HTMLSelectElement\n const option = findOptionByDomValue(normalizedOptions.value, target.value)\n emit('update:modelValue', option?.value ?? target.value)\n}\n</script>\n\n<template>\n <div v-bind=\"wrapperAttrs\" class=\"mint-select\">\n <select\n v-bind=\"controlAttrs\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"[\n 'mint-select__control',\n `mint-select__control--${size}`,\n error ? 'mint-select__control--error' : '',\n disabled ? 'mint-select__control--disabled' : '',\n ]\"\n @change=\"handleChange\"\n >\n <option v-if=\"placeholder\" value=\"\" disabled>\n {{ placeholder }}\n </option>\n <option\n v-for=\"option in normalizedOptions\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n <div class=\"mint-select__icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 24 24\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Empty-state placeholder with icon badge, headline, description, default slot, and optional CTA button. */\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n title?: string\n description?: string\n iconPath?: string\n color?: 'primary' | 'cta' | 'success' | 'warning' | 'error' | 'muted'\n size?: 'sm' | 'md' | 'lg'\n variant?: 'illustrated' | 'inline'\n actionLabel?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n color: 'primary',\n size: 'md',\n variant: 'illustrated',\n})\n\nconst emit = defineEmits<{\n action: []\n}>()\n\nconst defaultIconPaths = [\n 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n 'M7 11h10',\n 'M7 15h6',\n 'M7 7h8',\n]\n</script>\n\n<template>\n <div :class=\"['mint-empty-state', `mint-empty-state--${variant}`, `mint-empty-state--${size}`]\">\n <div :class=\"['mint-empty-state__icon-wrapper', `mint-empty-state__icon-wrapper--${color}`]\">\n <slot name=\"icon\">\n <svg\n class=\"mint-empty-state__icon\"\n :class=\"`mint-empty-state__icon--${color}`\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <template v-if=\"iconPath\">\n <path :d=\"iconPath\" />\n </template>\n <template v-else>\n <path v-for=\"(d, i) in defaultIconPaths\" :key=\"i\" :d=\"d\" />\n </template>\n </svg>\n </slot>\n </div>\n <div class=\"mint-empty-state__body\">\n <h3 v-if=\"title\" class=\"mint-empty-state__title\">{{ title }}</h3>\n <p v-if=\"description\" class=\"mint-empty-state__description\">{{ description }}</p>\n <div v-if=\"$slots.default\" class=\"mint-empty-state__content\">\n <slot />\n </div>\n </div>\n <div v-if=\"actionLabel\" class=\"mint-empty-state__action\">\n <BaseButton variant=\"secondary\" @click=\"emit('action')\">\n {{ actionLabel }}\n </BaseButton>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Empty-state placeholder with icon badge, headline, description, default slot, and optional CTA button. */\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n title?: string\n description?: string\n iconPath?: string\n color?: 'primary' | 'cta' | 'success' | 'warning' | 'error' | 'muted'\n size?: 'sm' | 'md' | 'lg'\n variant?: 'illustrated' | 'inline'\n actionLabel?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n color: 'primary',\n size: 'md',\n variant: 'illustrated',\n})\n\nconst emit = defineEmits<{\n action: []\n}>()\n\nconst defaultIconPaths = [\n 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n 'M7 11h10',\n 'M7 15h6',\n 'M7 7h8',\n]\n</script>\n\n<template>\n <div :class=\"['mint-empty-state', `mint-empty-state--${variant}`, `mint-empty-state--${size}`]\">\n <div :class=\"['mint-empty-state__icon-wrapper', `mint-empty-state__icon-wrapper--${color}`]\">\n <slot name=\"icon\">\n <svg\n class=\"mint-empty-state__icon\"\n :class=\"`mint-empty-state__icon--${color}`\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <template v-if=\"iconPath\">\n <path :d=\"iconPath\" />\n </template>\n <template v-else>\n <path v-for=\"(d, i) in defaultIconPaths\" :key=\"i\" :d=\"d\" />\n </template>\n </svg>\n </slot>\n </div>\n <div class=\"mint-empty-state__body\">\n <h3 v-if=\"title\" class=\"mint-empty-state__title\">{{ title }}</h3>\n <p v-if=\"description\" class=\"mint-empty-state__description\">{{ description }}</p>\n <div v-if=\"$slots.default\" class=\"mint-empty-state__content\">\n <slot />\n </div>\n </div>\n <div v-if=\"actionLabel\" class=\"mint-empty-state__action\">\n <BaseButton variant=\"secondary\" @click=\"emit('action')\">\n {{ actionLabel }}\n </BaseButton>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Animated loading placeholder in text, circular, rectangular, or rounded variants with pulse or wave animation. */\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\n width?: string | number\n height?: string | number\n animation?: 'pulse' | 'wave' | 'none'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'text',\n animation: 'wave',\n})\n\nconst style = computed(() => {\n const s: Record<string, string> = {}\n\n if (props.width) {\n s.width = typeof props.width === 'number' ? `${props.width}px` : props.width\n }\n\n if (props.height) {\n s.height = typeof props.height === 'number' ? `${props.height}px` : props.height\n }\n\n return s\n})\n\nconst classes = computed(() => [\n 'mint-skeleton',\n `mint-skeleton--${props.variant}`,\n // pulse and wave both breathe (3e); the shimmer is gone.\n props.animation === 'none' ? '' : 'skeleton-wave',\n])\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"style\" />\n</template>\n","<script setup lang=\"ts\">\n/** Animated loading placeholder in text, circular, rectangular, or rounded variants with pulse or wave animation. */\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\n width?: string | number\n height?: string | number\n animation?: 'pulse' | 'wave' | 'none'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'text',\n animation: 'wave',\n})\n\nconst style = computed(() => {\n const s: Record<string, string> = {}\n\n if (props.width) {\n s.width = typeof props.width === 'number' ? `${props.width}px` : props.width\n }\n\n if (props.height) {\n s.height = typeof props.height === 'number' ? `${props.height}px` : props.height\n }\n\n return s\n})\n\nconst classes = computed(() => [\n 'mint-skeleton',\n `mint-skeleton--${props.variant}`,\n // pulse and wave both breathe (3e); the shimmer is gone.\n props.animation === 'none' ? '' : 'skeleton-wave',\n])\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"style\" />\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\n/**\n * Searchable, optionally grouped single-select list shared by the experiment and\n * artifact selector modals: two-line rows (title, then code + meta) with status and date\n * in a right-hand column, a filled selected row, skeleton,\n * error and empty states, and the combobox keyboard model (↑ ↓ Enter).\n */\nimport { computed, nextTick, reactive, ref, useId, watch } from 'vue'\nimport BaseInput from '../BaseInput.vue'\nimport Skeleton from '../Skeleton.vue'\nimport EmptyState from '../EmptyState.vue'\nimport type { PillVariant } from '../../types'\n\nexport interface ResourcePickerRow {\n /** Identifier shown as a gray pill at the start of the second line, e.g. an experiment code. */\n code?: string\n title: string\n /** Second-line facts after the code, joined with \" · \". */\n meta?: string[]\n /** Right column, above the date, tinted by its variant. */\n status?: { label: string; variant: PillVariant }\n /** Right column, in mono. */\n date?: string\n}\n\nconst props = withDefaults(\n defineProps<{\n items: T[]\n /** When set, rows render under collapsible group headers in this order. */\n groups?: { label: string; items: T[] }[] | null\n itemKey: (item: T) => string | number\n describe: (item: T) => ResourcePickerRow\n selectedKey?: string | number | null\n search: string\n /** Accessible name of the list; the search field is labelled \"Search {label}\". */\n label: string\n placeholder?: string\n loading?: boolean\n error?: string | null\n emptyTitle?: string\n emptyDescription?: string\n }>(),\n {\n groups: null,\n selectedKey: null,\n placeholder: 'Search…',\n loading: false,\n error: null,\n emptyTitle: 'Nothing found',\n emptyDescription: 'Try adjusting your search or filters.',\n },\n)\nconst emit = defineEmits<{\n select: [item: T]\n 'update:search': [value: string]\n}>()\ndefineSlots<{\n /** Extra filters on the search row. */\n filters?: () => unknown\n /** A second filter row under the search. */\n advanced?: () => unknown\n /** Row controls before the check; keys pressed inside them never select the row. */\n actions?: (props: { item: T }) => unknown\n}>()\n\nconst listId = `mint-resource-picker-${useId().replace(/:/g, '')}`\nconst collapsed = reactive(new Set<string>())\nconst activeIndex = ref(-1)\nconst listRef = ref<HTMLElement | null>(null)\n\nconst visibleGroups = computed(() =>\n props.groups?.map((group) => ({\n ...group,\n rows: collapsed.has(group.label) ? [] : group.items,\n })),\n)\n/** Keyboard order: the rows on screen, top to bottom. */\nconst flat = computed(() =>\n visibleGroups.value ? visibleGroups.value.flatMap((group) => group.rows) : props.items,\n)\nconst indexByKey = computed(() => new Map(flat.value.map((item, i) => [props.itemKey(item), i])))\nconst showList = computed(() => !props.loading && !props.error && props.items.length > 0)\n\nfunction optionId(item: T): string {\n return `${listId}-${props.itemKey(item)}`\n}\nconst activeDescendant = computed(() => {\n const item = flat.value[activeIndex.value]\n return item === undefined ? undefined : optionId(item)\n})\n\nfunction indexOf(item: T): number {\n return indexByKey.value.get(props.itemKey(item)) ?? -1\n}\nfunction toggleGroup(label: string) {\n if (collapsed.has(label)) collapsed.delete(label)\n else collapsed.add(label)\n}\nfunction keydown(event: KeyboardEvent) {\n // Keys belong to the search combobox; a focused header, filter or row action keeps its own Enter.\n const target = event.target as HTMLElement | null\n if (target !== event.currentTarget && !target?.closest('.mint-resource-picker__search')) return\n const rows = flat.value\n if (!rows.length) return\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n activeIndex.value =\n event.key === 'ArrowDown'\n ? Math.min(activeIndex.value + 1, rows.length - 1)\n : Math.max(activeIndex.value - 1, 0)\n nextTick(() =>\n listRef.value\n ?.querySelector('.mint-resource-picker__row--active')\n ?.scrollIntoView({ block: 'nearest' }),\n )\n } else if (event.key === 'Enter' && rows[activeIndex.value] !== undefined) {\n event.preventDefault()\n emit('select', rows[activeIndex.value]!)\n }\n}\n\nwatch(\n () => [props.items, props.groups],\n () => {\n activeIndex.value = -1\n },\n)\n</script>\n\n<template>\n <div class=\"mint-resource-picker\" @keydown=\"keydown\">\n <div class=\"mint-resource-picker__toolbar\">\n <BaseInput\n class=\"mint-resource-picker__search\"\n :model-value=\"search\"\n :placeholder=\"placeholder\"\n size=\"sm\"\n type=\"search\"\n role=\"combobox\"\n :aria-label=\"`Search ${label.toLowerCase()}`\"\n :aria-expanded=\"showList\"\n :aria-controls=\"listId\"\n :aria-activedescendant=\"activeDescendant\"\n @update:model-value=\"emit('update:search', String($event ?? ''))\"\n >\n <template #prefix>\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\n <path d=\"M7 11.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zM10.5 10.5L14 14\" />\n </svg>\n </template>\n </BaseInput>\n <slot name=\"filters\" />\n </div>\n <slot name=\"advanced\" />\n\n <div v-if=\"loading\" class=\"mint-resource-picker__frame\" aria-busy=\"true\">\n <div v-for=\"n in 4\" :key=\"n\" class=\"mint-resource-picker__skeleton-row\">\n <Skeleton :width=\"`${40 + n * 10}%`\" height=\"0.75rem\" />\n <Skeleton width=\"30%\" height=\"0.625rem\" />\n </div>\n </div>\n <div v-else-if=\"error\" class=\"mint-resource-picker__error\" role=\"alert\">{{ error }}</div>\n <EmptyState\n v-else-if=\"!items.length\"\n :title=\"emptyTitle\"\n :description=\"emptyDescription\"\n size=\"sm\"\n />\n <div\n v-else\n :id=\"listId\"\n ref=\"listRef\"\n class=\"mint-resource-picker__frame mint-resource-picker__list\"\n role=\"listbox\"\n :aria-label=\"label\"\n >\n <template v-for=\"group in visibleGroups ?? [{ label: '', items, rows: items }]\" :key=\"group.label\">\n <button\n v-if=\"visibleGroups\"\n type=\"button\"\n class=\"mint-resource-picker__group\"\n :aria-expanded=\"!collapsed.has(group.label)\"\n @click=\"toggleGroup(group.label)\"\n >\n <svg\n class=\"mint-resource-picker__chevron\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6l4 4 4-4\" />\n </svg>\n <span class=\"mint-resource-picker__group-label\">{{ group.label }}</span>\n <span class=\"mint-resource-picker__group-count\">{{ group.items.length }}</span>\n </button>\n <div\n v-for=\"item in group.rows\"\n :id=\"optionId(item)\"\n :key=\"itemKey(item)\"\n role=\"option\"\n :aria-selected=\"itemKey(item) === selectedKey\"\n class=\"mint-resource-picker__row\"\n :class=\"{\n 'mint-resource-picker__row--selected': itemKey(item) === selectedKey,\n 'mint-resource-picker__row--active': indexOf(item) === activeIndex,\n }\"\n @click=\"emit('select', item)\"\n @mouseenter=\"activeIndex = indexOf(item)\"\n >\n <span class=\"mint-resource-picker__text\">\n <span class=\"mint-resource-picker__title\">{{ describe(item).title }}</span>\n <span v-if=\"describe(item).code || describe(item).meta?.length\" class=\"mint-resource-picker__meta\"\n ><span v-if=\"describe(item).code\" class=\"mint-resource-picker__code mint-exp-code mint-exp-code--sm\">{{\n describe(item).code\n }}</span\n ><span v-if=\"describe(item).meta?.length\">{{ describe(item).meta!.join(' · ') }}</span></span\n >\n </span>\n <span v-if=\"describe(item).status || describe(item).date\" class=\"mint-resource-picker__aside\">\n <span\n v-if=\"describe(item).status\"\n class=\"mint-resource-picker__status\"\n :class=\"`mint-resource-picker__status--${describe(item).status!.variant}`\"\n >{{ describe(item).status!.label }}</span\n >\n <span v-if=\"describe(item).date\" class=\"mint-resource-picker__date\">{{ describe(item).date }}</span>\n </span>\n <span v-if=\"$slots.actions\" class=\"mint-resource-picker__actions\" @click.stop>\n <slot name=\"actions\" :item=\"item\" />\n </span>\n </div>\n </template>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\n/**\n * Searchable, optionally grouped single-select list shared by the experiment and\n * artifact selector modals: two-line rows (title, then code + meta) with status and date\n * in a right-hand column, a filled selected row, skeleton,\n * error and empty states, and the combobox keyboard model (↑ ↓ Enter).\n */\nimport { computed, nextTick, reactive, ref, useId, watch } from 'vue'\nimport BaseInput from '../BaseInput.vue'\nimport Skeleton from '../Skeleton.vue'\nimport EmptyState from '../EmptyState.vue'\nimport type { PillVariant } from '../../types'\n\nexport interface ResourcePickerRow {\n /** Identifier shown as a gray pill at the start of the second line, e.g. an experiment code. */\n code?: string\n title: string\n /** Second-line facts after the code, joined with \" · \". */\n meta?: string[]\n /** Right column, above the date, tinted by its variant. */\n status?: { label: string; variant: PillVariant }\n /** Right column, in mono. */\n date?: string\n}\n\nconst props = withDefaults(\n defineProps<{\n items: T[]\n /** When set, rows render under collapsible group headers in this order. */\n groups?: { label: string; items: T[] }[] | null\n itemKey: (item: T) => string | number\n describe: (item: T) => ResourcePickerRow\n selectedKey?: string | number | null\n search: string\n /** Accessible name of the list; the search field is labelled \"Search {label}\". */\n label: string\n placeholder?: string\n loading?: boolean\n error?: string | null\n emptyTitle?: string\n emptyDescription?: string\n }>(),\n {\n groups: null,\n selectedKey: null,\n placeholder: 'Search…',\n loading: false,\n error: null,\n emptyTitle: 'Nothing found',\n emptyDescription: 'Try adjusting your search or filters.',\n },\n)\nconst emit = defineEmits<{\n select: [item: T]\n 'update:search': [value: string]\n}>()\ndefineSlots<{\n /** Extra filters on the search row. */\n filters?: () => unknown\n /** A second filter row under the search. */\n advanced?: () => unknown\n /** Row controls before the check; keys pressed inside them never select the row. */\n actions?: (props: { item: T }) => unknown\n}>()\n\nconst listId = `mint-resource-picker-${useId().replace(/:/g, '')}`\nconst collapsed = reactive(new Set<string>())\nconst activeIndex = ref(-1)\nconst listRef = ref<HTMLElement | null>(null)\n\nconst visibleGroups = computed(() =>\n props.groups?.map((group) => ({\n ...group,\n rows: collapsed.has(group.label) ? [] : group.items,\n })),\n)\n/** Keyboard order: the rows on screen, top to bottom. */\nconst flat = computed(() =>\n visibleGroups.value ? visibleGroups.value.flatMap((group) => group.rows) : props.items,\n)\nconst indexByKey = computed(() => new Map(flat.value.map((item, i) => [props.itemKey(item), i])))\nconst showList = computed(() => !props.loading && !props.error && props.items.length > 0)\n\nfunction optionId(item: T): string {\n return `${listId}-${props.itemKey(item)}`\n}\nconst activeDescendant = computed(() => {\n const item = flat.value[activeIndex.value]\n return item === undefined ? undefined : optionId(item)\n})\n\nfunction indexOf(item: T): number {\n return indexByKey.value.get(props.itemKey(item)) ?? -1\n}\nfunction toggleGroup(label: string) {\n if (collapsed.has(label)) collapsed.delete(label)\n else collapsed.add(label)\n}\nfunction keydown(event: KeyboardEvent) {\n // Keys belong to the search combobox; a focused header, filter or row action keeps its own Enter.\n const target = event.target as HTMLElement | null\n if (target !== event.currentTarget && !target?.closest('.mint-resource-picker__search')) return\n const rows = flat.value\n if (!rows.length) return\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n activeIndex.value =\n event.key === 'ArrowDown'\n ? Math.min(activeIndex.value + 1, rows.length - 1)\n : Math.max(activeIndex.value - 1, 0)\n nextTick(() =>\n listRef.value\n ?.querySelector('.mint-resource-picker__row--active')\n ?.scrollIntoView({ block: 'nearest' }),\n )\n } else if (event.key === 'Enter' && rows[activeIndex.value] !== undefined) {\n event.preventDefault()\n emit('select', rows[activeIndex.value]!)\n }\n}\n\nwatch(\n () => [props.items, props.groups],\n () => {\n activeIndex.value = -1\n },\n)\n</script>\n\n<template>\n <div class=\"mint-resource-picker\" @keydown=\"keydown\">\n <div class=\"mint-resource-picker__toolbar\">\n <BaseInput\n class=\"mint-resource-picker__search\"\n :model-value=\"search\"\n :placeholder=\"placeholder\"\n size=\"sm\"\n type=\"search\"\n role=\"combobox\"\n :aria-label=\"`Search ${label.toLowerCase()}`\"\n :aria-expanded=\"showList\"\n :aria-controls=\"listId\"\n :aria-activedescendant=\"activeDescendant\"\n @update:model-value=\"emit('update:search', String($event ?? ''))\"\n >\n <template #prefix>\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\n <path d=\"M7 11.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zM10.5 10.5L14 14\" />\n </svg>\n </template>\n </BaseInput>\n <slot name=\"filters\" />\n </div>\n <slot name=\"advanced\" />\n\n <div v-if=\"loading\" class=\"mint-resource-picker__frame\" aria-busy=\"true\">\n <div v-for=\"n in 4\" :key=\"n\" class=\"mint-resource-picker__skeleton-row\">\n <Skeleton :width=\"`${40 + n * 10}%`\" height=\"0.75rem\" />\n <Skeleton width=\"30%\" height=\"0.625rem\" />\n </div>\n </div>\n <div v-else-if=\"error\" class=\"mint-resource-picker__error\" role=\"alert\">{{ error }}</div>\n <EmptyState\n v-else-if=\"!items.length\"\n :title=\"emptyTitle\"\n :description=\"emptyDescription\"\n size=\"sm\"\n />\n <div\n v-else\n :id=\"listId\"\n ref=\"listRef\"\n class=\"mint-resource-picker__frame mint-resource-picker__list\"\n role=\"listbox\"\n :aria-label=\"label\"\n >\n <template v-for=\"group in visibleGroups ?? [{ label: '', items, rows: items }]\" :key=\"group.label\">\n <button\n v-if=\"visibleGroups\"\n type=\"button\"\n class=\"mint-resource-picker__group\"\n :aria-expanded=\"!collapsed.has(group.label)\"\n @click=\"toggleGroup(group.label)\"\n >\n <svg\n class=\"mint-resource-picker__chevron\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6l4 4 4-4\" />\n </svg>\n <span class=\"mint-resource-picker__group-label\">{{ group.label }}</span>\n <span class=\"mint-resource-picker__group-count\">{{ group.items.length }}</span>\n </button>\n <div\n v-for=\"item in group.rows\"\n :id=\"optionId(item)\"\n :key=\"itemKey(item)\"\n role=\"option\"\n :aria-selected=\"itemKey(item) === selectedKey\"\n class=\"mint-resource-picker__row\"\n :class=\"{\n 'mint-resource-picker__row--selected': itemKey(item) === selectedKey,\n 'mint-resource-picker__row--active': indexOf(item) === activeIndex,\n }\"\n @click=\"emit('select', item)\"\n @mouseenter=\"activeIndex = indexOf(item)\"\n >\n <span class=\"mint-resource-picker__text\">\n <span class=\"mint-resource-picker__title\">{{ describe(item).title }}</span>\n <span v-if=\"describe(item).code || describe(item).meta?.length\" class=\"mint-resource-picker__meta\"\n ><span v-if=\"describe(item).code\" class=\"mint-resource-picker__code mint-exp-code mint-exp-code--sm\">{{\n describe(item).code\n }}</span\n ><span v-if=\"describe(item).meta?.length\">{{ describe(item).meta!.join(' · ') }}</span></span\n >\n </span>\n <span v-if=\"describe(item).status || describe(item).date\" class=\"mint-resource-picker__aside\">\n <span\n v-if=\"describe(item).status\"\n class=\"mint-resource-picker__status\"\n :class=\"`mint-resource-picker__status--${describe(item).status!.variant}`\"\n >{{ describe(item).status!.label }}</span\n >\n <span v-if=\"describe(item).date\" class=\"mint-resource-picker__date\">{{ describe(item).date }}</span>\n </span>\n <span v-if=\"$slots.actions\" class=\"mint-resource-picker__actions\" @click.stop>\n <slot name=\"actions\" :item=\"item\" />\n </span>\n </div>\n </template>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PickerAdapter, PickerCapabilities, PickerNode, PickerSelection, PickerSelectionMode, PickerSource, PickerView } from '../types/filePicker';
|
|
1
|
+
import { PickerAdapter, PickerCapabilities, PickerNode, PickerSelection, PickerSelectionMode, PickerSort, PickerSource, PickerView } from '../types/filePicker';
|
|
2
2
|
interface Props {
|
|
3
3
|
open: boolean;
|
|
4
4
|
adapter: PickerAdapter;
|
|
@@ -10,6 +10,8 @@ interface Props {
|
|
|
10
10
|
title?: string;
|
|
11
11
|
/** `list` shows one folder at a time; `tree` adds disclosure triangles. */
|
|
12
12
|
view?: PickerView;
|
|
13
|
+
/** Row order on each open; the user can change it from the path bar until closing. */
|
|
14
|
+
defaultSort?: PickerSort;
|
|
13
15
|
/** Host-owned visibility/selection filter; backend must still enforce access. */
|
|
14
16
|
systemFilter?: (node: PickerNode, source: PickerSource) => boolean;
|
|
15
17
|
}
|
|
@@ -29,6 +31,7 @@ declare const __VLS_export: import('vue').DefineComponent<Props, {}, {}, {}, {},
|
|
|
29
31
|
capabilities: PickerCapabilities;
|
|
30
32
|
initialPath: string;
|
|
31
33
|
initialSelection: PickerSelection | null;
|
|
34
|
+
defaultSort: PickerSort;
|
|
32
35
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
33
36
|
declare const _default: typeof __VLS_export;
|
|
34
37
|
export default _default;
|
|
@@ -6,4 +6,4 @@ export declare function buildFlatSettingsSchema(schema: SettingsModalSchema): Fo
|
|
|
6
6
|
export declare function filterSettingsSchemaByAccess(schema: SettingsModalSchema, canShow: (item: AccessControlled) => boolean): SettingsModalSchema;
|
|
7
7
|
export declare function settingsGroupToTab(group: SettingsGroup): SettingsTab;
|
|
8
8
|
export declare function normalizeVisibleSettingsTabs(tabs: SettingsTabInput[], canShow: (item: AccessControlled) => boolean): SettingsTab[];
|
|
9
|
-
export declare function buildSettingsTabs(baseTabs: SettingsTab[], showAppearance: boolean): SettingsTab[];
|
|
9
|
+
export declare function buildSettingsTabs(baseTabs: SettingsTab[], showAppearance: boolean, appearanceFirst?: boolean): SettingsTab[];
|
|
@@ -6,6 +6,8 @@ interface Props {
|
|
|
6
6
|
/** Manual tab descriptors. Ignored when `schema` is set (groups become tabs). */
|
|
7
7
|
tabs?: SettingsTabInput[];
|
|
8
8
|
showAppearance?: boolean;
|
|
9
|
+
/** List Appearance before the other tabs and open on it. */
|
|
10
|
+
appearanceFirst?: boolean;
|
|
9
11
|
size?: 'md' | 'lg' | 'xl';
|
|
10
12
|
layout?: SettingsModalLayout;
|
|
11
13
|
/** Declarative schema — fields auto-render via SDK form components. */
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { HeatmapConfig } from '../types';
|
|
2
|
-
/**
|
|
3
|
-
* Group color for the built-in sample types when `sampleColors` has no entry.
|
|
4
|
-
* Color encodes the group and shape encodes the type (3a): blank and QC render
|
|
5
|
-
* neutral markers and ignore it; iQC takes it like a sample.
|
|
6
|
-
*/
|
|
2
|
+
/** Color for the built-in sample types when `sampleColors` has no entry. */
|
|
7
3
|
export declare const DEFAULT_SAMPLE_TYPE_COLORS: Record<string, string>;
|
|
8
4
|
export declare const HEATMAP_COLORS: Record<string, string[]>;
|
|
9
5
|
export declare function conditionGradientStyle(color: string, concentration: number, concentrations: number[]): Record<string, string>;
|
|
@@ -16,8 +16,11 @@ export interface WellStyleState {
|
|
|
16
16
|
}
|
|
17
17
|
export declare function wellClasses(well: Well, state: WellClassState): string[];
|
|
18
18
|
export declare function wellStyle(well: Well, state: WellStyleState): Record<string, string>;
|
|
19
|
-
/**
|
|
20
|
-
export declare function
|
|
19
|
+
/** 15% fill and 40% outline of a sample color; color-mix accepts hex and `var()` tokens alike. */
|
|
20
|
+
export declare function sampleTint(color: string): {
|
|
21
|
+
backgroundColor: string;
|
|
22
|
+
border: string;
|
|
23
|
+
};
|
|
21
24
|
/** One dev-only warning per page for the no-op `showSampleTypeIndicator` prop. */
|
|
22
25
|
export declare function warnSampleTypeIndicatorDeprecated(): void;
|
|
23
26
|
export declare function wellLabel(well: Well, showWellLabels: boolean): string | undefined;
|
|
@@ -39,7 +39,8 @@ export { default as GeneratedResultRenderer } from './GeneratedResultRenderer.vu
|
|
|
39
39
|
export { default as GeneratedPlotlyResult } from './GeneratedPlotlyResult.vue';
|
|
40
40
|
export { default as ComponentBindingRenderer } from './ComponentBindingRenderer.vue';
|
|
41
41
|
export { default as ControlWorkspaceView } from './ControlWorkspaceView.vue';
|
|
42
|
-
|
|
42
|
+
/** Complete ControlWorkspaceView page shell for WellPlate + DoseCalculator dose design. @deprecated Scheduled for removal in MINT 1.4; use `ControlWorkspaceView` instead, with `defineDoseDesignControlModel()`. */
|
|
43
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as DoseDesignWorkspaceView } from './DoseDesignWorkspaceView.vue';
|
|
43
44
|
export { default as AppContainer } from './AppContainer.vue';
|
|
44
45
|
export { default as PluginIcon } from './PluginIcon.vue';
|
|
45
46
|
export { default as LayoutResizeHandle } from './LayoutResizeHandle.vue';
|
|
@@ -56,32 +57,45 @@ export { default as ConfirmDialog } from './ConfirmDialog.vue';
|
|
|
56
57
|
export { default as ChartContainer } from './ChartContainer.vue';
|
|
57
58
|
export { default as AdductText } from './AdductText.vue';
|
|
58
59
|
export { default as SettingsModal } from './SettingsModal.vue';
|
|
59
|
-
|
|
60
|
-
export { default as
|
|
61
|
-
|
|
62
|
-
export { default as
|
|
60
|
+
/** Render biology template envelopes with matching SDK components such as WellPlate, DoseCalculator, and DataFrame. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
61
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as BioTemplateRenderer } from './BioTemplateRenderer.vue';
|
|
62
|
+
/** Current-experiment template workspace with load/save/reset controls and WellPlate/DataFrame/DoseCalculator previews. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
63
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as BioTemplateExperimentWorkspaceView } from './BioTemplateExperimentWorkspaceView.vue';
|
|
64
|
+
/** Complete current-experiment workspace for a curated biology template pack with save/load controls and component-prop slots. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
65
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as BioTemplatePackWorkspaceView } from './BioTemplatePackWorkspaceView.vue';
|
|
66
|
+
/** Complete editable biology template preset workspace for WellPlate/DoseCalculator, LC-MS, qPCR, generated controls, preview components, and current-experiment save wiring. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
67
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as BioTemplatePresetWorkspaceView } from './BioTemplatePresetWorkspaceView.vue';
|
|
63
68
|
export { default as WellPlate } from './WellPlate.vue';
|
|
64
69
|
export { default as PlateEditor } from './PlateEditor.vue';
|
|
65
|
-
|
|
66
|
-
export { default as
|
|
70
|
+
/** Clickable color-swatch legend for plate sample types, supporting selection, count display, add/remove, and custom color assignment. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
71
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as SampleLegend } from './SampleLegend.vue';
|
|
72
|
+
/** Horizontal or vertical timeline of ordered protocol steps with status indicators, drag-to-reorder, and step-type iconography. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
73
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as ExperimentTimeline } from './ExperimentTimeline.vue';
|
|
74
|
+
/** Interactive sample list with drag-and-drop group assignment, color labeling, and smart-group support. */
|
|
67
75
|
export { default as SampleSelector } from './SampleSelector.vue';
|
|
68
|
-
/** Smart Group modal wired to the `useAutoGroup` engine. @deprecated Scheduled for removal in MINT 1.4;
|
|
69
|
-
export { default as AutoGroupModal } from './AutoGroupModal.vue';
|
|
70
|
-
|
|
71
|
-
export { default as
|
|
72
|
-
|
|
73
|
-
export { default as
|
|
76
|
+
/** Smart Group modal wired to the `useAutoGroup` engine. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
77
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as AutoGroupModal } from './AutoGroupModal.vue';
|
|
78
|
+
/** Drag-and-drop two-zone assigner for splitting sample groups into control and treatment arms. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
79
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as GroupAssigner } from './GroupAssigner.vue';
|
|
80
|
+
/** Smart Group modal with the auto Field Recipe and the manual cohort builder. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
81
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as SmartGroupModal } from './SmartGroupModal.vue';
|
|
82
|
+
/** Smart Group auto mode: groups samples by a field recipe. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
83
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as SmartGroupFieldRecipe } from './SmartGroupFieldRecipe.vue';
|
|
84
|
+
/** Smart Group manual mode: builds cohorts from selected samples. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
85
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as SmartGroupManual } from './SmartGroupManual.vue';
|
|
74
86
|
export { default as MoleculeInput } from './MoleculeInput.vue';
|
|
75
87
|
export { default as ConcentrationInput } from './ConcentrationInput.vue';
|
|
76
88
|
export { default as DoseCalculator } from './DoseCalculator.vue';
|
|
77
|
-
|
|
78
|
-
export { default as
|
|
89
|
+
/** Editor for a single reagent definition with axis orientation, dilution-series generator, and position-count validation for 96/384-well plates. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
90
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as ReagentEditor, type ReagentDefinition } from './ReagentEditor.vue';
|
|
91
|
+
/** Sortable, searchable table of experiment reagents showing lot number, expiry, storage conditions, and stock level with low-stock warnings. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
92
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as ReagentList } from './ReagentList.vue';
|
|
79
93
|
export { default as SampleHierarchyTree } from './SampleHierarchyTree.vue';
|
|
80
94
|
export { default as ProtocolStepEditor } from './ProtocolStepEditor.vue';
|
|
81
95
|
export { default as PlotlyChart } from './PlotlyChart.vue';
|
|
82
96
|
export { default as ScientificNumber } from './ScientificNumber.vue';
|
|
83
97
|
export { default as ChemicalFormula } from './ChemicalFormula.vue';
|
|
84
|
-
/** Displays LC/MS or GC/MS acquisition sequence progress with ETA and remaining-time labels.
|
|
98
|
+
/** Displays LC/MS or GC/MS acquisition sequence progress with ETA and remaining-time labels. */
|
|
85
99
|
export { default as SequenceProgressBar } from './SequenceProgressBar.vue';
|
|
86
100
|
/** Status badge for instrument states: a tone dot (or dash / hollow shape for offline, never-reported and inactive) plus a label. */
|
|
87
101
|
export { default as InstrumentStateBadge } from './InstrumentStateBadge.vue';
|
|
@@ -107,5 +121,6 @@ export { default as ArtifactSelectorModal } from './ArtifactSelectorModal.vue';
|
|
|
107
121
|
export { default as GeneratedPathInput } from './GeneratedPathInput.vue';
|
|
108
122
|
export { default as ArtifactSaveDialog } from './ArtifactSaveDialog.vue';
|
|
109
123
|
export { default as ExperimentPopover } from './ExperimentPopover.vue';
|
|
110
|
-
|
|
124
|
+
/** Control panel for running a curve-fit job with progress bar, results table, and error display. @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
|
|
125
|
+
export { /** @deprecated Removed in MINT 1.4. */ default as FitPanel } from './FitPanel.vue';
|
|
111
126
|
export { default as FilePicker } from './FilePicker.vue';
|