@morscherlab/mld-sdk 0.9.3 → 0.9.5

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/dist/styles.css CHANGED
@@ -12654,19 +12654,82 @@ html.dark .mld-settings-modal__option-btn--active {
12654
12654
  flex-direction: column;
12655
12655
  gap: 0.75rem;
12656
12656
  }
12657
- /* Filter bar */
12657
+ /* Shared filter row layout */
12658
+ .mld-experiment-selector__filters-row,
12659
+ .mld-experiment-selector__filters-advanced {
12660
+ display: flex;
12661
+ align-items: center;
12662
+ gap: 0.5rem;
12663
+ flex-wrap: wrap;
12664
+ }
12665
+ /* Keep old class name working for backwards compat */
12658
12666
  .mld-experiment-selector__filters {
12659
12667
  display: flex;
12660
12668
  gap: 0.5rem;
12661
12669
  }
12662
12670
  .mld-experiment-selector__search {
12663
12671
  flex: 1;
12664
- min-width: 0;
12672
+ min-width: 10rem;
12665
12673
  }
12666
- .mld-experiment-selector__status-filter {
12674
+ .mld-experiment-selector__status-filter,
12675
+ .mld-experiment-selector__filter-select {
12667
12676
  flex-shrink: 0;
12668
12677
  width: 10rem;
12669
12678
  }
12679
+ /* "Filters" toggle button */
12680
+ .mld-experiment-selector__filters-toggle {
12681
+ display: inline-flex;
12682
+ align-items: center;
12683
+ gap: 0.375rem;
12684
+ padding: 0.375rem 0.625rem;
12685
+ border: 1px solid var(--border-color);
12686
+ border-radius: var(--mld-radius-sm);
12687
+ background: var(--bg-primary);
12688
+ color: var(--text-secondary);
12689
+ font-size: 0.8125rem;
12690
+ cursor: pointer;
12691
+ white-space: nowrap;
12692
+ position: relative;
12693
+ transition: border-color 0.15s ease, color 0.15s ease;
12694
+ }
12695
+ .mld-experiment-selector__filters-toggle:hover {
12696
+ border-color: var(--color-primary);
12697
+ color: var(--text-primary);
12698
+ }
12699
+ .mld-experiment-selector__filters-toggle--active {
12700
+ color: var(--color-primary);
12701
+ border-color: var(--color-primary);
12702
+ }
12703
+ /* Active filter badge dot */
12704
+ .mld-experiment-selector__filters-dot {
12705
+ width: 6px;
12706
+ height: 6px;
12707
+ border-radius: 50%;
12708
+ background-color: var(--color-primary, #3b82f6);
12709
+ flex-shrink: 0;
12710
+ }
12711
+ /* Advanced filters row */
12712
+ .mld-experiment-selector__filters-advanced {
12713
+ padding-top: 0.25rem;
12714
+ }
12715
+ /* Group toggle checkbox label */
12716
+ .mld-experiment-selector__group-toggle {
12717
+ display: inline-flex;
12718
+ align-items: center;
12719
+ gap: 0.375rem;
12720
+ font-size: 0.8125rem;
12721
+ color: var(--text-secondary);
12722
+ cursor: pointer;
12723
+ white-space: nowrap;
12724
+ user-select: none;
12725
+ margin-left: auto;
12726
+ }
12727
+ .mld-experiment-selector__group-checkbox {
12728
+ width: 14px;
12729
+ height: 14px;
12730
+ accent-color: var(--color-primary, #3b82f6);
12731
+ cursor: pointer;
12732
+ }
12670
12733
  /* Loading skeleton */
12671
12734
  .mld-experiment-selector__skeleton {
12672
12735
  display: flex;
@@ -12706,6 +12769,54 @@ html.dark .mld-settings-modal__option-btn--active {
12706
12769
  border: 1px solid var(--border-color);
12707
12770
  border-radius: var(--mld-radius);
12708
12771
  }
12772
+ /* Project group header */
12773
+ .mld-experiment-selector__group-header {
12774
+ display: flex;
12775
+ align-items: center;
12776
+ gap: 0.5rem;
12777
+ padding: 0.5rem 1rem;
12778
+ background-color: var(--bg-secondary, var(--bg-primary));
12779
+ border: none;
12780
+ cursor: pointer;
12781
+ width: 100%;
12782
+ text-align: left;
12783
+ font-size: 0.75rem;
12784
+ font-weight: 600;
12785
+ color: var(--text-secondary);
12786
+ text-transform: uppercase;
12787
+ letter-spacing: 0.03em;
12788
+ transition: background-color 0.15s ease;
12789
+ }
12790
+ .mld-experiment-selector__group-header:hover {
12791
+ background-color: var(--bg-hover);
12792
+ }
12793
+ .mld-experiment-selector__group-chevron {
12794
+ flex-shrink: 0;
12795
+ transition: transform 0.15s ease;
12796
+ }
12797
+ .mld-experiment-selector__group-chevron--collapsed {
12798
+ transform: rotate(-90deg);
12799
+ }
12800
+ .mld-experiment-selector__group-name {
12801
+ flex: 1;
12802
+ min-width: 0;
12803
+ overflow: hidden;
12804
+ text-overflow: ellipsis;
12805
+ white-space: nowrap;
12806
+ }
12807
+ .mld-experiment-selector__group-count {
12808
+ display: inline-flex;
12809
+ align-items: center;
12810
+ justify-content: center;
12811
+ min-width: 1.25rem;
12812
+ height: 1.25rem;
12813
+ padding: 0 0.375rem;
12814
+ border-radius: 999px;
12815
+ background-color: var(--bg-tertiary, var(--border-color));
12816
+ font-size: 0.6875rem;
12817
+ font-weight: 500;
12818
+ color: var(--text-muted);
12819
+ }
12709
12820
  /* Row */
12710
12821
  .mld-experiment-selector__row {
12711
12822
  display: flex;
@@ -12765,6 +12876,27 @@ html.dark .mld-settings-modal__option-btn--active {
12765
12876
  color: var(--text-muted);
12766
12877
  margin-top: 0.125rem;
12767
12878
  }
12879
+ /* Footer with clear selection */
12880
+ .mld-experiment-selector__footer {
12881
+ display: flex;
12882
+ justify-content: flex-start;
12883
+ padding-top: 0.25rem;
12884
+ }
12885
+ .mld-experiment-selector__clear-btn {
12886
+ padding: 0.25rem 0;
12887
+ border: none;
12888
+ background: none;
12889
+ color: var(--text-muted);
12890
+ font-size: 0.8125rem;
12891
+ cursor: pointer;
12892
+ text-decoration: underline;
12893
+ text-decoration-color: transparent;
12894
+ transition: color 0.15s ease, text-decoration-color 0.15s ease;
12895
+ }
12896
+ .mld-experiment-selector__clear-btn:hover {
12897
+ color: var(--color-primary);
12898
+ text-decoration-color: var(--color-primary);
12899
+ }
12768
12900
  /* ExperimentPopover - BEM-style naming */
12769
12901
  /* Trigger button */
12770
12902
  .mld-experiment-popover {
@@ -25276,20 +25408,88 @@ to { transform: rotate(360deg);
25276
25408
  gap: 0.75rem;
25277
25409
  }
25278
25410
 
25279
- /* Filter bar */
25411
+ /* Shared filter row layout */
25412
+ .mld-experiment-selector__filters-row,
25413
+ .mld-experiment-selector__filters-advanced {
25414
+ display: flex;
25415
+ align-items: center;
25416
+ gap: 0.5rem;
25417
+ flex-wrap: wrap;
25418
+ }
25419
+
25420
+ /* Keep old class name working for backwards compat */
25280
25421
  .mld-experiment-selector__filters {
25281
25422
  display: flex;
25282
25423
  gap: 0.5rem;
25283
25424
  }
25284
25425
  .mld-experiment-selector__search {
25285
25426
  flex: 1;
25286
- min-width: 0;
25427
+ min-width: 10rem;
25287
25428
  }
25288
- .mld-experiment-selector__status-filter {
25429
+ .mld-experiment-selector__status-filter,
25430
+ .mld-experiment-selector__filter-select {
25289
25431
  flex-shrink: 0;
25290
25432
  width: 10rem;
25291
25433
  }
25292
25434
 
25435
+ /* "Filters" toggle button */
25436
+ .mld-experiment-selector__filters-toggle {
25437
+ display: inline-flex;
25438
+ align-items: center;
25439
+ gap: 0.375rem;
25440
+ padding: 0.375rem 0.625rem;
25441
+ border: 1px solid var(--border-color);
25442
+ border-radius: var(--mld-radius-sm);
25443
+ background: var(--bg-primary);
25444
+ color: var(--text-secondary);
25445
+ font-size: 0.8125rem;
25446
+ cursor: pointer;
25447
+ white-space: nowrap;
25448
+ position: relative;
25449
+ transition: border-color 0.15s ease, color 0.15s ease;
25450
+ }
25451
+ .mld-experiment-selector__filters-toggle:hover {
25452
+ border-color: var(--color-primary);
25453
+ color: var(--text-primary);
25454
+ }
25455
+ .mld-experiment-selector__filters-toggle--active {
25456
+ color: var(--color-primary);
25457
+ border-color: var(--color-primary);
25458
+ }
25459
+
25460
+ /* Active filter badge dot */
25461
+ .mld-experiment-selector__filters-dot {
25462
+ width: 6px;
25463
+ height: 6px;
25464
+ border-radius: 50%;
25465
+ background-color: var(--color-primary, #3b82f6);
25466
+ flex-shrink: 0;
25467
+ }
25468
+
25469
+ /* Advanced filters row */
25470
+ .mld-experiment-selector__filters-advanced {
25471
+ padding-top: 0.25rem;
25472
+ }
25473
+
25474
+ /* Group toggle checkbox label */
25475
+ .mld-experiment-selector__group-toggle {
25476
+ display: inline-flex;
25477
+ align-items: center;
25478
+ gap: 0.375rem;
25479
+ font-size: 0.8125rem;
25480
+ color: var(--text-secondary);
25481
+ cursor: pointer;
25482
+ white-space: nowrap;
25483
+ user-select: none;
25484
+ margin-left: auto;
25485
+ }
25486
+ .mld-experiment-selector__group-checkbox {
25487
+ width: 14px;
25488
+ height: 14px;
25489
+ accent-color: var(--color-primary, #3b82f6);
25490
+ cursor: pointer;
25491
+ }
25492
+
25293
25493
  /* Loading skeleton */
25294
25494
  .mld-experiment-selector__skeleton {
25295
25495
  display: flex;
@@ -25332,6 +25532,55 @@ to { transform: rotate(360deg);
25332
25532
  border-radius: var(--mld-radius);
25333
25533
  }
25334
25534
 
25535
+ /* Project group header */
25536
+ .mld-experiment-selector__group-header {
25537
+ display: flex;
25538
+ align-items: center;
25539
+ gap: 0.5rem;
25540
+ padding: 0.5rem 1rem;
25541
+ background-color: var(--bg-secondary, var(--bg-primary));
25542
+ border: none;
25543
+ cursor: pointer;
25544
+ width: 100%;
25545
+ text-align: left;
25546
+ font-size: 0.75rem;
25547
+ font-weight: 600;
25548
+ color: var(--text-secondary);
25549
+ text-transform: uppercase;
25550
+ letter-spacing: 0.03em;
25551
+ transition: background-color 0.15s ease;
25552
+ }
25553
+ .mld-experiment-selector__group-header:hover {
25554
+ background-color: var(--bg-hover);
25555
+ }
25556
+ .mld-experiment-selector__group-chevron {
25557
+ flex-shrink: 0;
25558
+ transition: transform 0.15s ease;
25559
+ }
25560
+ .mld-experiment-selector__group-chevron--collapsed {
25561
+ transform: rotate(-90deg);
25562
+ }
25563
+ .mld-experiment-selector__group-name {
25564
+ flex: 1;
25565
+ min-width: 0;
25566
+ overflow: hidden;
25567
+ text-overflow: ellipsis;
25568
+ white-space: nowrap;
25569
+ }
25570
+ .mld-experiment-selector__group-count {
25571
+ display: inline-flex;
25572
+ align-items: center;
25573
+ justify-content: center;
25574
+ min-width: 1.25rem;
25575
+ height: 1.25rem;
25576
+ padding: 0 0.375rem;
25577
+ border-radius: 999px;
25578
+ background-color: var(--bg-tertiary, var(--border-color));
25579
+ font-size: 0.6875rem;
25580
+ font-weight: 500;
25581
+ color: var(--text-muted);
25582
+ }
25583
+
25335
25584
  /* Row */
25336
25585
  .mld-experiment-selector__row {
25337
25586
  display: flex;
@@ -25393,6 +25642,28 @@ to { transform: rotate(360deg);
25393
25642
  color: var(--text-muted);
25394
25643
  margin-top: 0.125rem;
25395
25644
  }
25645
+
25646
+ /* Footer with clear selection */
25647
+ .mld-experiment-selector__footer {
25648
+ display: flex;
25649
+ justify-content: flex-start;
25650
+ padding-top: 0.25rem;
25651
+ }
25652
+ .mld-experiment-selector__clear-btn {
25653
+ padding: 0.25rem 0;
25654
+ border: none;
25655
+ background: none;
25656
+ color: var(--text-muted);
25657
+ font-size: 0.8125rem;
25658
+ cursor: pointer;
25659
+ text-decoration: underline;
25660
+ text-decoration-color: transparent;
25661
+ transition: color 0.15s ease, text-decoration-color 0.15s ease;
25662
+ }
25663
+ .mld-experiment-selector__clear-btn:hover {
25664
+ color: var(--color-primary);
25665
+ text-decoration-color: var(--color-primary);
25666
+ }
25396
25667
  /* ExperimentPopover - BEM-style naming */
25397
25668
 
25398
25669
  /* Trigger button */
@@ -439,6 +439,13 @@ export interface ResourceSpec {
439
439
  value: string;
440
440
  }
441
441
  export type ExperimentStatus = 'planned' | 'ongoing' | 'completed';
442
+ export type DatePreset = 'last_7_days' | 'last_30_days' | 'last_90_days';
443
+ export type ExperimentSortField = 'created_at' | 'updated_at' | 'name' | 'status';
444
+ export interface ExperimentTypeOption {
445
+ value: string;
446
+ label: string;
447
+ color?: string;
448
+ }
442
449
  export interface ExperimentSummary {
443
450
  id: number;
444
451
  experiment_code?: string;
@@ -447,6 +454,7 @@ export interface ExperimentSummary {
447
454
  experiment_type: string;
448
455
  project?: string;
449
456
  project_id?: number;
457
+ project_name?: string;
450
458
  notes?: string;
451
459
  tags?: Record<string, unknown>;
452
460
  created_at: string;
@@ -461,6 +469,8 @@ export interface ExperimentFilters {
461
469
  search?: string;
462
470
  status?: ExperimentStatus | null;
463
471
  project?: string | null;
472
+ experimentType?: string | null;
473
+ datePreset?: DatePreset | null;
464
474
  }
465
475
  export type FitState = 'idle' | 'running' | 'completed' | 'error';
466
476
  export interface FitResultSummary {
@@ -1,4 +1,4 @@
1
- export type { ContainerDirection, ButtonVariant, ButtonSize, InputType, ModalSize, AlertType, Toast, TabItem, SelectOption, RadioOption, FormFieldProps, SidebarToolSection, CollapsibleState, TopBarVariant, TopBarPage, TopBarTab, TopBarTabOption, TopBarSettingsConfig, WellPlateFormat, WellState, WellPlateSelectionMode, WellPlateSize, WellShape, Well, HeatmapColorScale, HeatmapConfig, SlotPosition, WellExtendedData, WellEditData, WellEditField, WellLegendItem, PlateCondition, ColumnCondition, RowCondition, Rack, SampleType, PlateMap, PlateMapEditorState, ProtocolStepType, ProtocolStepStatus, ProtocolStep, SampleGroup, GroupItem, FileUploaderMode, SegmentedOption, SegmentedControlVariant, SegmentedControlSize, MultiSelectOption, MultiSelectSize, PillVariant, PillSize, CalendarSelectionMode, CalendarMarker, CalendarDayContext, SortDirection, SortState, DataFrameColumn, PaginationState, SpinnerSize, SpinnerVariant, DividerSpacing, StatusType, ProgressVariant, ProgressSize, AvatarSize, EmptyStateColor, EmptyStateSize, BreadcrumbItem, TooltipPosition, ConfirmVariant, SettingsTab, NumberNotation, UnitOption, WizardStep, WizardStepState, AuditEntryType, AuditEntry, BatchItemStatus, BatchItem, BatchSummary, TimePickerFormat, TimeRange, ScheduleView, ScheduleEventStatus, ScheduleEvent, ScheduleBlockedSlot, ScheduleSlotContext, ScheduleEventCreateContext, ScheduleEventUpdateContext, SummarySectionItem, SummarySection, SummaryData, ResourceStatus, ResourceSpec, MoleculeData, ExperimentStatus, ExperimentSummary, ExperimentListResponse, ExperimentFilters, FitState, FitResultSummary, StorageCondition, ReagentColumn, Reagent, TreeNodeType, BadgeVariant, TreeNode, } from './components';
1
+ export type { ContainerDirection, ButtonVariant, ButtonSize, InputType, ModalSize, AlertType, Toast, TabItem, SelectOption, RadioOption, FormFieldProps, SidebarToolSection, CollapsibleState, TopBarVariant, TopBarPage, TopBarTab, TopBarTabOption, TopBarSettingsConfig, WellPlateFormat, WellState, WellPlateSelectionMode, WellPlateSize, WellShape, Well, HeatmapColorScale, HeatmapConfig, SlotPosition, WellExtendedData, WellEditData, WellEditField, WellLegendItem, PlateCondition, ColumnCondition, RowCondition, Rack, SampleType, PlateMap, PlateMapEditorState, ProtocolStepType, ProtocolStepStatus, ProtocolStep, SampleGroup, GroupItem, FileUploaderMode, SegmentedOption, SegmentedControlVariant, SegmentedControlSize, MultiSelectOption, MultiSelectSize, PillVariant, PillSize, CalendarSelectionMode, CalendarMarker, CalendarDayContext, SortDirection, SortState, DataFrameColumn, PaginationState, SpinnerSize, SpinnerVariant, DividerSpacing, StatusType, ProgressVariant, ProgressSize, AvatarSize, EmptyStateColor, EmptyStateSize, BreadcrumbItem, TooltipPosition, ConfirmVariant, SettingsTab, NumberNotation, UnitOption, WizardStep, WizardStepState, AuditEntryType, AuditEntry, BatchItemStatus, BatchItem, BatchSummary, TimePickerFormat, TimeRange, ScheduleView, ScheduleEventStatus, ScheduleEvent, ScheduleBlockedSlot, ScheduleSlotContext, ScheduleEventCreateContext, ScheduleEventUpdateContext, SummarySectionItem, SummarySection, SummaryData, ResourceStatus, ResourceSpec, MoleculeData, ExperimentStatus, DatePreset, ExperimentSortField, ExperimentTypeOption, ExperimentSummary, ExperimentListResponse, ExperimentFilters, FitState, FitResultSummary, StorageCondition, ReagentColumn, Reagent, TreeNodeType, BadgeVariant, TreeNode, } from './components';
2
2
  export type { FormFieldType, FieldCondition, FieldValidation, FormFieldSchema, FormSectionSchema, FormStepSchema, FormSchema, FieldEnhancement, FormEnhancements, UseFormBuilderReturn, } from './form-builder';
3
3
  export type { OutlierAction, InputMode, OutlierInfo, ColumnInfo, MetadataRow, AutoGroupResult, ParsedCsvData, } from './auto-group';
4
4
  export type { AuthConfig, UserInfo, LoginResponse, TokenVerifyResponse, RegisterRequest, UpdateProfileRequest, CredentialInfo, } from './auth';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morscherlab/mld-sdk",
3
- "version": "0.9.3",
3
+ "version": "0.9.5",
4
4
  "description": "MLD Platform SDK - Vue 3 components, composables, and types for plugin development",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",