@morscherlab/mint-sdk 1.1.0 → 1.1.2

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 (99) hide show
  1. package/dist/{EmptyState-DgBRoYAy.js → EmptyState-LMPS3keb.js} +3 -193
  2. package/dist/EmptyState-LMPS3keb.js.map +1 -0
  3. package/dist/{ExperimentPopover-BFw3QX8L.js → ExperimentPopover-D6_RGzTY.js} +113 -35
  4. package/dist/ExperimentPopover-D6_RGzTY.js.map +1 -0
  5. package/dist/{ExperimentSelectorModal-BBWXC7KW.js → ExperimentSelectorModal-DcQ38zua.js} +9 -11
  6. package/dist/ExperimentSelectorModal-DcQ38zua.js.map +1 -0
  7. package/dist/{SettingsModal-Dpg-X1OM.js → SettingsModal-Ccq2z-Ms.js} +9 -6
  8. package/dist/SettingsModal-Ccq2z-Ms.js.map +1 -0
  9. package/dist/__stories__/experiment-helpers.d.ts +3 -0
  10. package/dist/__tests__/stores/experiment.test.d.ts +1 -0
  11. package/dist/{analysisArtifactTypes-ejqR8MX3.js → analysisArtifactTypes-DQ0MjwHZ.js} +1 -1
  12. package/dist/{analysisArtifactTypes-ejqR8MX3.js.map → analysisArtifactTypes-DQ0MjwHZ.js.map} +1 -1
  13. package/dist/components/ExperimentPopover.vue.d.ts +5 -0
  14. package/dist/components/ExperimentSelectorModal.vue.d.ts +1 -5
  15. package/dist/components/PluginWorkspaceView.props.d.ts +1 -4
  16. package/dist/components/PluginWorkspaceView.vue.d.ts +0 -1
  17. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -2
  18. package/dist/components/index.js +7 -7
  19. package/dist/{components-Ci_BTx00.js → components-CV5zuWa8.js} +24 -29
  20. package/dist/components-CV5zuWa8.js.map +1 -0
  21. package/dist/composables/experiment-utils.d.ts +10 -0
  22. package/dist/composables/index.d.ts +2 -2
  23. package/dist/composables/index.js +11 -10
  24. package/dist/composables/useAppExperiment.d.ts +29 -17
  25. package/dist/composables/usePlatformContext.d.ts +3 -3
  26. package/dist/{composables-C0VEJ73O.js → composables-CW8NRXLB.js} +5 -5
  27. package/dist/{composables-C0VEJ73O.js.map → composables-CW8NRXLB.js.map} +1 -1
  28. package/dist/experiment-Y9Iz7KYi.js +95 -0
  29. package/dist/experiment-Y9Iz7KYi.js.map +1 -0
  30. package/dist/{experiment-utils-CxkruZ3G.js → experiment-utils-7Yw-h0tD.js} +16 -2
  31. package/dist/{experiment-utils-CxkruZ3G.js.map → experiment-utils-7Yw-h0tD.js.map} +1 -1
  32. package/dist/index.js +16 -15
  33. package/dist/index.js.map +1 -1
  34. package/dist/install.js +7 -7
  35. package/dist/{plotly.min-BR53hja4.js → plotly.min-c2Sez60c.js} +1 -1
  36. package/dist/{plotly.min-BR53hja4.js.map → plotly.min-c2Sez60c.js.map} +1 -1
  37. package/dist/stores/auth.d.ts +6 -6
  38. package/dist/stores/experiment.d.ts +166 -0
  39. package/dist/stores/index.d.ts +1 -0
  40. package/dist/stores/index.js +3 -2
  41. package/dist/styles.css +188 -0
  42. package/dist/templates/index.js +4 -4
  43. package/dist/{templates-Cdj93S9C.js → templates-CJRFiWUX.js} +2 -2
  44. package/dist/{templates-Cdj93S9C.js.map → templates-CJRFiWUX.js.map} +1 -1
  45. package/dist/types/auth.d.ts +1 -1
  46. package/dist/types/index.js +1 -1
  47. package/dist/types/platform.d.ts +1 -1
  48. package/dist/{auth-B87xM--s.js → useApi-CDBq6z23.js} +191 -2
  49. package/dist/useApi-CDBq6z23.js.map +1 -0
  50. package/dist/{useControlSchema-B_qgU4rW.js → useControlSchema-BEAgLyyx.js} +5 -4
  51. package/dist/{useControlSchema-B_qgU4rW.js.map → useControlSchema-BEAgLyyx.js.map} +1 -1
  52. package/dist/{useDropdownState-gVaMXtwW.js → useDropdownState-Be-ug_ci.js} +2 -2
  53. package/dist/{useDropdownState-gVaMXtwW.js.map → useDropdownState-Be-ug_ci.js.map} +1 -1
  54. package/dist/{useExperimentSelector-BuQZRgMt.js → useExperimentSelector-DFg_iEHI.js} +36 -16
  55. package/dist/useExperimentSelector-DFg_iEHI.js.map +1 -0
  56. package/dist/{useFormBuilder-D1G5J5Z5.js → useFormBuilder-CR9pBApW.js} +2 -2
  57. package/dist/{useFormBuilder-D1G5J5Z5.js.map → useFormBuilder-CR9pBApW.js.map} +1 -1
  58. package/dist/{useProtocolTemplates-DeaOmMaw.js → useProtocolTemplates-DXeIHMwV.js} +38 -42
  59. package/dist/useProtocolTemplates-DXeIHMwV.js.map +1 -0
  60. package/package.json +1 -1
  61. package/src/__stories__/experiment-helpers.ts +12 -9
  62. package/src/__tests__/components/AppTopBar.test.ts +10 -6
  63. package/src/__tests__/components/ExperimentPopover.test.ts +64 -0
  64. package/src/__tests__/components/ExperimentSelectorModal.test.ts +86 -41
  65. package/src/__tests__/components/PluginWorkspaceView.test.ts +103 -19
  66. package/src/__tests__/components/SettingsModal.test.ts +29 -1
  67. package/src/__tests__/composables/experiment-utils.test.ts +33 -0
  68. package/src/__tests__/composables/useAppExperiment.test.ts +331 -92
  69. package/src/__tests__/composables/useAuth.test.ts +2 -2
  70. package/src/__tests__/composables/useExperimentSelector.test.ts +71 -0
  71. package/src/__tests__/composables/usePlatformContext.test.ts +5 -1
  72. package/src/__tests__/stores/experiment.test.ts +300 -0
  73. package/src/components/AppTopBar.vue +0 -2
  74. package/src/components/ExperimentPopover.story.vue +59 -0
  75. package/src/components/ExperimentPopover.vue +96 -6
  76. package/src/components/ExperimentSelectorModal.story.vue +6 -16
  77. package/src/components/ExperimentSelectorModal.vue +8 -4
  78. package/src/components/PluginWorkspaceView.props.ts +1 -4
  79. package/src/components/PluginWorkspaceView.story.vue +12 -5
  80. package/src/components/PluginWorkspaceView.vue +0 -2
  81. package/src/components/SettingsModal.vue +6 -1
  82. package/src/composables/experiment-utils.ts +22 -0
  83. package/src/composables/index.ts +1 -2
  84. package/src/composables/useAppExperiment.ts +57 -67
  85. package/src/composables/useAuth.ts +1 -1
  86. package/src/composables/useExperimentSelector.ts +45 -13
  87. package/src/stores/experiment.ts +120 -0
  88. package/src/stores/index.ts +1 -0
  89. package/src/styles/components/experiment-popover.css +105 -0
  90. package/src/types/auth.ts +1 -1
  91. package/src/types/platform.ts +1 -1
  92. package/dist/EmptyState-DgBRoYAy.js.map +0 -1
  93. package/dist/ExperimentPopover-BFw3QX8L.js.map +0 -1
  94. package/dist/ExperimentSelectorModal-BBWXC7KW.js.map +0 -1
  95. package/dist/SettingsModal-Dpg-X1OM.js.map +0 -1
  96. package/dist/auth-B87xM--s.js.map +0 -1
  97. package/dist/components-Ci_BTx00.js.map +0 -1
  98. package/dist/useExperimentSelector-BuQZRgMt.js.map +0 -1
  99. package/dist/useProtocolTemplates-DeaOmMaw.js.map +0 -1
@@ -4,7 +4,7 @@ export declare const useAuthStore: import('pinia').StoreDefinition<"mint-auth",
4
4
  tokenExpires: import('vue').Ref<Date | null, Date | null>;
5
5
  username: import('vue').Ref<string | null, string | null>;
6
6
  userInfo: import('vue').Ref<{
7
- id: string;
7
+ id: number;
8
8
  username: string;
9
9
  shortname: string | null;
10
10
  email: string | null;
@@ -20,7 +20,7 @@ export declare const useAuthStore: import('pinia').StoreDefinition<"mint-auth",
20
20
  } | null | undefined;
21
21
  isActive: boolean;
22
22
  } | null, UserInfo | {
23
- id: string;
23
+ id: number;
24
24
  username: string;
25
25
  shortname: string | null;
26
26
  email: string | null;
@@ -78,7 +78,7 @@ export declare const useAuthStore: import('pinia').StoreDefinition<"mint-auth",
78
78
  tokenExpires: import('vue').Ref<Date | null, Date | null>;
79
79
  username: import('vue').Ref<string | null, string | null>;
80
80
  userInfo: import('vue').Ref<{
81
- id: string;
81
+ id: number;
82
82
  username: string;
83
83
  shortname: string | null;
84
84
  email: string | null;
@@ -94,7 +94,7 @@ export declare const useAuthStore: import('pinia').StoreDefinition<"mint-auth",
94
94
  } | null | undefined;
95
95
  isActive: boolean;
96
96
  } | null, UserInfo | {
97
- id: string;
97
+ id: number;
98
98
  username: string;
99
99
  shortname: string | null;
100
100
  email: string | null;
@@ -152,7 +152,7 @@ export declare const useAuthStore: import('pinia').StoreDefinition<"mint-auth",
152
152
  tokenExpires: import('vue').Ref<Date | null, Date | null>;
153
153
  username: import('vue').Ref<string | null, string | null>;
154
154
  userInfo: import('vue').Ref<{
155
- id: string;
155
+ id: number;
156
156
  username: string;
157
157
  shortname: string | null;
158
158
  email: string | null;
@@ -168,7 +168,7 @@ export declare const useAuthStore: import('pinia').StoreDefinition<"mint-auth",
168
168
  } | null | undefined;
169
169
  isActive: boolean;
170
170
  } | null, UserInfo | {
171
- id: string;
171
+ id: number;
172
172
  username: string;
173
173
  shortname: string | null;
174
174
  email: string | null;
@@ -0,0 +1,166 @@
1
+ import { ExperimentSummary } from '../types';
2
+ /**
3
+ * The single source of truth for the experiment a plugin is currently working on.
4
+ *
5
+ * Both entry points land here: `ExperimentSelectorModal` calls `select()` with a
6
+ * record the platform already returned, and deep links call `selectById()` with
7
+ * nothing but an id. Because a name can only ever arrive from the platform,
8
+ * there is no code path in which a caller can invent one.
9
+ */
10
+ export declare const useExperimentStore: import('pinia').StoreDefinition<"mint-experiment", Pick<{
11
+ current: import('vue').Ref<{
12
+ id: number;
13
+ experiment_code?: string | undefined;
14
+ name: string;
15
+ status: import('..').ExperimentStatus;
16
+ experiment_type: string;
17
+ project?: string | undefined;
18
+ project_id?: number | undefined;
19
+ project_name?: string | undefined;
20
+ notes?: string | undefined;
21
+ tags?: Record<string, unknown> | undefined;
22
+ created_at: string;
23
+ updated_at: string;
24
+ created_by?: number | undefined;
25
+ created_by_user?: {
26
+ id: number;
27
+ username: string;
28
+ shortname?: string | undefined;
29
+ first_name?: string | undefined;
30
+ last_name?: string | undefined;
31
+ } | undefined;
32
+ has_design_data: boolean;
33
+ } | null, ExperimentSummary | {
34
+ id: number;
35
+ experiment_code?: string | undefined;
36
+ name: string;
37
+ status: import('..').ExperimentStatus;
38
+ experiment_type: string;
39
+ project?: string | undefined;
40
+ project_id?: number | undefined;
41
+ project_name?: string | undefined;
42
+ notes?: string | undefined;
43
+ tags?: Record<string, unknown> | undefined;
44
+ created_at: string;
45
+ updated_at: string;
46
+ created_by?: number | undefined;
47
+ created_by_user?: {
48
+ id: number;
49
+ username: string;
50
+ shortname?: string | undefined;
51
+ first_name?: string | undefined;
52
+ last_name?: string | undefined;
53
+ } | undefined;
54
+ has_design_data: boolean;
55
+ } | null>;
56
+ currentId: import('vue').Ref<number | null, number | null>;
57
+ isResolving: import('vue').Ref<boolean, boolean>;
58
+ error: import('vue').Ref<string | null, string | null>;
59
+ select: (experiment: ExperimentSummary) => void;
60
+ selectById: (id: number) => Promise<ExperimentSummary | null>;
61
+ clear: () => void;
62
+ }, "error" | "current" | "currentId" | "isResolving">, Pick<{
63
+ current: import('vue').Ref<{
64
+ id: number;
65
+ experiment_code?: string | undefined;
66
+ name: string;
67
+ status: import('..').ExperimentStatus;
68
+ experiment_type: string;
69
+ project?: string | undefined;
70
+ project_id?: number | undefined;
71
+ project_name?: string | undefined;
72
+ notes?: string | undefined;
73
+ tags?: Record<string, unknown> | undefined;
74
+ created_at: string;
75
+ updated_at: string;
76
+ created_by?: number | undefined;
77
+ created_by_user?: {
78
+ id: number;
79
+ username: string;
80
+ shortname?: string | undefined;
81
+ first_name?: string | undefined;
82
+ last_name?: string | undefined;
83
+ } | undefined;
84
+ has_design_data: boolean;
85
+ } | null, ExperimentSummary | {
86
+ id: number;
87
+ experiment_code?: string | undefined;
88
+ name: string;
89
+ status: import('..').ExperimentStatus;
90
+ experiment_type: string;
91
+ project?: string | undefined;
92
+ project_id?: number | undefined;
93
+ project_name?: string | undefined;
94
+ notes?: string | undefined;
95
+ tags?: Record<string, unknown> | undefined;
96
+ created_at: string;
97
+ updated_at: string;
98
+ created_by?: number | undefined;
99
+ created_by_user?: {
100
+ id: number;
101
+ username: string;
102
+ shortname?: string | undefined;
103
+ first_name?: string | undefined;
104
+ last_name?: string | undefined;
105
+ } | undefined;
106
+ has_design_data: boolean;
107
+ } | null>;
108
+ currentId: import('vue').Ref<number | null, number | null>;
109
+ isResolving: import('vue').Ref<boolean, boolean>;
110
+ error: import('vue').Ref<string | null, string | null>;
111
+ select: (experiment: ExperimentSummary) => void;
112
+ selectById: (id: number) => Promise<ExperimentSummary | null>;
113
+ clear: () => void;
114
+ }, never>, Pick<{
115
+ current: import('vue').Ref<{
116
+ id: number;
117
+ experiment_code?: string | undefined;
118
+ name: string;
119
+ status: import('..').ExperimentStatus;
120
+ experiment_type: string;
121
+ project?: string | undefined;
122
+ project_id?: number | undefined;
123
+ project_name?: string | undefined;
124
+ notes?: string | undefined;
125
+ tags?: Record<string, unknown> | undefined;
126
+ created_at: string;
127
+ updated_at: string;
128
+ created_by?: number | undefined;
129
+ created_by_user?: {
130
+ id: number;
131
+ username: string;
132
+ shortname?: string | undefined;
133
+ first_name?: string | undefined;
134
+ last_name?: string | undefined;
135
+ } | undefined;
136
+ has_design_data: boolean;
137
+ } | null, ExperimentSummary | {
138
+ id: number;
139
+ experiment_code?: string | undefined;
140
+ name: string;
141
+ status: import('..').ExperimentStatus;
142
+ experiment_type: string;
143
+ project?: string | undefined;
144
+ project_id?: number | undefined;
145
+ project_name?: string | undefined;
146
+ notes?: string | undefined;
147
+ tags?: Record<string, unknown> | undefined;
148
+ created_at: string;
149
+ updated_at: string;
150
+ created_by?: number | undefined;
151
+ created_by_user?: {
152
+ id: number;
153
+ username: string;
154
+ shortname?: string | undefined;
155
+ first_name?: string | undefined;
156
+ last_name?: string | undefined;
157
+ } | undefined;
158
+ has_design_data: boolean;
159
+ } | null>;
160
+ currentId: import('vue').Ref<number | null, number | null>;
161
+ isResolving: import('vue').Ref<boolean, boolean>;
162
+ error: import('vue').Ref<string | null, string | null>;
163
+ select: (experiment: ExperimentSummary) => void;
164
+ selectById: (id: number) => Promise<ExperimentSummary | null>;
165
+ clear: () => void;
166
+ }, "select" | "clear" | "selectById">>;
@@ -1,2 +1,3 @@
1
1
  export { useAuthStore } from './auth';
2
2
  export { useSettingsStore, colorPalettes, type SettingsState } from './settings';
3
+ export { useExperimentStore } from './experiment';
@@ -1,2 +1,3 @@
1
- import { n as colorPalettes, r as useSettingsStore, t as useAuthStore } from "../auth-B87xM--s.js";
2
- export { colorPalettes, useAuthStore, useSettingsStore };
1
+ import { a as colorPalettes, i as useAuthStore, o as useSettingsStore } from "../useApi-CDBq6z23.js";
2
+ import { t as useExperimentStore } from "../experiment-Y9Iz7KYi.js";
3
+ export { colorPalettes, useAuthStore, useExperimentStore, useSettingsStore };
package/dist/styles.css CHANGED
@@ -4175,6 +4175,44 @@ html.dark .mint-pill__remove:hover {
4175
4175
  .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-code {
4176
4176
  color: var(--color-primary);
4177
4177
  }
4178
+
4179
+ /* ─── Unresolved states ───
4180
+ An experiment is bound but has no name yet. The chip must not read "No
4181
+ experiment", and it must never fall back to the numeric id — a name only
4182
+ ever comes from the platform. */
4183
+ .mint-experiment-popover__trigger--loading {
4184
+ cursor: progress;
4185
+ }
4186
+ .mint-experiment-popover__trigger--loading .mint-experiment-popover__trigger-icon {
4187
+ color: var(--text-muted);
4188
+ }
4189
+ .mint-experiment-popover__trigger--error {
4190
+ border-color: var(--mint-error-border);
4191
+ background: var(--mint-error-bg);
4192
+ color: var(--mint-error);
4193
+ }
4194
+ .mint-experiment-popover__trigger--error .mint-experiment-popover__trigger-icon,
4195
+ .mint-experiment-popover__trigger--error .mint-experiment-popover__trigger-chevron {
4196
+ color: var(--mint-error);
4197
+ }
4198
+
4199
+ /* Placeholder bar standing in for the name while it resolves. */
4200
+ .mint-experiment-popover__trigger-skeleton {
4201
+ flex: 1;
4202
+ min-width: 4.5rem;
4203
+ height: 0.625rem;
4204
+ border-radius: var(--radius-sm);
4205
+ background-color: var(--bg-tertiary);
4206
+ background-image: linear-gradient(
4207
+ 90deg,
4208
+ var(--bg-tertiary) 0%,
4209
+ var(--bg-hover) 40%,
4210
+ var(--bg-tertiary) 60%
4211
+ );
4212
+ background-size: 200% 100%;
4213
+ background-repeat: no-repeat;
4214
+ animation: mint-experiment-popover-shimmer 1.6s ease-in-out infinite;
4215
+ }
4178
4216
  .mint-experiment-popover__trigger-chevron {
4179
4217
  width: 0.8125rem;
4180
4218
  height: 0.8125rem;
@@ -4429,6 +4467,53 @@ html.dark .mint-pill__remove:hover {
4429
4467
  line-height: 1.3;
4430
4468
  }
4431
4469
 
4470
+ /* ─── Card: unresolved variants ─── */
4471
+ .mint-experiment-popover__card--error {
4472
+ background: var(--mint-error-bg);
4473
+ }
4474
+ .mint-experiment-popover__card-icon--error {
4475
+ background: transparent;
4476
+ }
4477
+ .mint-experiment-popover__card-icon--error svg {
4478
+ color: var(--mint-error);
4479
+ }
4480
+ .mint-experiment-popover__card-message {
4481
+ font-size: 0.6875rem;
4482
+ color: var(--text-secondary);
4483
+ line-height: 1.4;
4484
+ overflow-wrap: anywhere;
4485
+ }
4486
+
4487
+ /* Placeholder lines mirroring the code / name / status stack of a real card. */
4488
+ .mint-experiment-popover__skeleton-line {
4489
+ display: block;
4490
+ height: 0.625rem;
4491
+ border-radius: var(--radius-sm);
4492
+ background-color: var(--bg-hover);
4493
+ background-image: linear-gradient(
4494
+ 90deg,
4495
+ var(--bg-hover) 0%,
4496
+ var(--bg-secondary) 40%,
4497
+ var(--bg-hover) 60%
4498
+ );
4499
+ background-size: 200% 100%;
4500
+ background-repeat: no-repeat;
4501
+ animation: mint-experiment-popover-shimmer 1.6s ease-in-out infinite;
4502
+ }
4503
+ .mint-experiment-popover__skeleton-line--code {
4504
+ width: 3.5rem;
4505
+ height: 0.75rem;
4506
+ border-radius: 9999px;
4507
+ }
4508
+ .mint-experiment-popover__skeleton-line--name {
4509
+ width: 100%;
4510
+ margin-top: 0.25rem;
4511
+ }
4512
+ .mint-experiment-popover__skeleton-line--status {
4513
+ width: 45%;
4514
+ margin-top: 0.25rem;
4515
+ }
4516
+
4432
4517
  /* Action row sits BELOW the card (was inside) so the buttons have
4433
4518
  room to breathe and don't compete with the info stack. */
4434
4519
  .mint-experiment-popover__card-actions {
@@ -4559,6 +4644,12 @@ html.dark .mint-pill__remove:hover {
4559
4644
  to { transform: rotate(360deg);
4560
4645
  }
4561
4646
  }
4647
+ @keyframes mint-experiment-popover-shimmer {
4648
+ 0% { background-position: 100% 0;
4649
+ }
4650
+ 100% { background-position: -100% 0;
4651
+ }
4652
+ }
4562
4653
 
4563
4654
  /* Respect motion preferences */
4564
4655
  @media (prefers-reduced-motion: reduce) {
@@ -4584,6 +4675,12 @@ to { transform: rotate(360deg);
4584
4675
  }
4585
4676
  .mint-experiment-popover__trigger-chevron {
4586
4677
  transition: none;
4678
+ }
4679
+ /* Placeholders stay as flat blocks — still legible as "not loaded yet". */
4680
+ .mint-experiment-popover__trigger-skeleton,
4681
+ .mint-experiment-popover__skeleton-line {
4682
+ animation: none;
4683
+ background-image: none;
4587
4684
  }
4588
4685
  }
4589
4686
  .mint-exp-code {
@@ -35617,6 +35714,42 @@ html.dark .mint-experiment-selector__filters-toggle--active {
35617
35714
  .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-code {
35618
35715
  color: var(--color-primary);
35619
35716
  }
35717
+ /* ─── Unresolved states ───
35718
+ An experiment is bound but has no name yet. The chip must not read "No
35719
+ experiment", and it must never fall back to the numeric id — a name only
35720
+ ever comes from the platform. */
35721
+ .mint-experiment-popover__trigger--loading {
35722
+ cursor: progress;
35723
+ }
35724
+ .mint-experiment-popover__trigger--loading .mint-experiment-popover__trigger-icon {
35725
+ color: var(--text-muted);
35726
+ }
35727
+ .mint-experiment-popover__trigger--error {
35728
+ border-color: var(--mint-error-border);
35729
+ background: var(--mint-error-bg);
35730
+ color: var(--mint-error);
35731
+ }
35732
+ .mint-experiment-popover__trigger--error .mint-experiment-popover__trigger-icon,
35733
+ .mint-experiment-popover__trigger--error .mint-experiment-popover__trigger-chevron {
35734
+ color: var(--mint-error);
35735
+ }
35736
+ /* Placeholder bar standing in for the name while it resolves. */
35737
+ .mint-experiment-popover__trigger-skeleton {
35738
+ flex: 1;
35739
+ min-width: 4.5rem;
35740
+ height: 0.625rem;
35741
+ border-radius: var(--radius-sm);
35742
+ background-color: var(--bg-tertiary);
35743
+ background-image: linear-gradient(
35744
+ 90deg,
35745
+ var(--bg-tertiary) 0%,
35746
+ var(--bg-hover) 40%,
35747
+ var(--bg-tertiary) 60%
35748
+ );
35749
+ background-size: 200% 100%;
35750
+ background-repeat: no-repeat;
35751
+ animation: mint-experiment-popover-shimmer 1.6s ease-in-out infinite;
35752
+ }
35620
35753
  .mint-experiment-popover__trigger-chevron {
35621
35754
  width: 0.8125rem;
35622
35755
  height: 0.8125rem;
@@ -35858,6 +35991,51 @@ html.dark .mint-experiment-selector__filters-toggle--active {
35858
35991
  color: var(--text-muted);
35859
35992
  line-height: 1.3;
35860
35993
  }
35994
+ /* ─── Card: unresolved variants ─── */
35995
+ .mint-experiment-popover__card--error {
35996
+ background: var(--mint-error-bg);
35997
+ }
35998
+ .mint-experiment-popover__card-icon--error {
35999
+ background: transparent;
36000
+ }
36001
+ .mint-experiment-popover__card-icon--error svg {
36002
+ color: var(--mint-error);
36003
+ }
36004
+ .mint-experiment-popover__card-message {
36005
+ font-size: 0.6875rem;
36006
+ color: var(--text-secondary);
36007
+ line-height: 1.4;
36008
+ overflow-wrap: anywhere;
36009
+ }
36010
+ /* Placeholder lines mirroring the code / name / status stack of a real card. */
36011
+ .mint-experiment-popover__skeleton-line {
36012
+ display: block;
36013
+ height: 0.625rem;
36014
+ border-radius: var(--radius-sm);
36015
+ background-color: var(--bg-hover);
36016
+ background-image: linear-gradient(
36017
+ 90deg,
36018
+ var(--bg-hover) 0%,
36019
+ var(--bg-secondary) 40%,
36020
+ var(--bg-hover) 60%
36021
+ );
36022
+ background-size: 200% 100%;
36023
+ background-repeat: no-repeat;
36024
+ animation: mint-experiment-popover-shimmer 1.6s ease-in-out infinite;
36025
+ }
36026
+ .mint-experiment-popover__skeleton-line--code {
36027
+ width: 3.5rem;
36028
+ height: 0.75rem;
36029
+ border-radius: 9999px;
36030
+ }
36031
+ .mint-experiment-popover__skeleton-line--name {
36032
+ width: 100%;
36033
+ margin-top: 0.25rem;
36034
+ }
36035
+ .mint-experiment-popover__skeleton-line--status {
36036
+ width: 45%;
36037
+ margin-top: 0.25rem;
36038
+ }
35861
36039
  /* Action row sits BELOW the card (was inside) so the buttons have
35862
36040
  room to breathe and don't compete with the info stack. */
35863
36041
  .mint-experiment-popover__card-actions {
@@ -35985,6 +36163,10 @@ html.dark .mint-experiment-selector__filters-toggle--active {
35985
36163
  @keyframes mint-experiment-popover-spin {
35986
36164
  to { transform: rotate(360deg); }
35987
36165
  }
36166
+ @keyframes mint-experiment-popover-shimmer {
36167
+ 0% { background-position: 100% 0; }
36168
+ 100% { background-position: -100% 0; }
36169
+ }
35988
36170
  /* Respect motion preferences */
35989
36171
  @media (prefers-reduced-motion: reduce) {
35990
36172
  .mint-experiment-popover__trigger,
@@ -36010,6 +36192,12 @@ html.dark .mint-experiment-selector__filters-toggle--active {
36010
36192
  .mint-experiment-popover__trigger-chevron {
36011
36193
  transition: none;
36012
36194
  }
36195
+ /* Placeholders stay as flat blocks — still legible as "not loaded yet". */
36196
+ .mint-experiment-popover__trigger-skeleton,
36197
+ .mint-experiment-popover__skeleton-line {
36198
+ animation: none;
36199
+ background-image: none;
36200
+ }
36013
36201
  }
36014
36202
  /* FitPanel Component Styles */
36015
36203
  .mint-fit-panel {
@@ -1,5 +1,5 @@
1
- import "../experiment-utils-CxkruZ3G.js";
2
- import "../EmptyState-DgBRoYAy.js";
3
- import "../useControlSchema-B_qgU4rW.js";
4
- import { $ as toTimeCourseRows, $t as listBioTemplatePacks, A as createSamplePrepTemplate, At as toCalibrationCurveRows, B as toBioTemplateComponentProps, Bt as validatePlateMapData, C as createFlowCytometryPanelTemplate, Ct as toInstrumentRunScheduleEvents, D as createTimeCourseTemplate, Dt as toFlowPanelRows, E as createProtocolStepsTemplate, Et as toFlowPanelDataFrame, F as getBioTemplateComponentProps, Ft as validateAssayMatrixData, G as toTemplateDataFrame, Gt as validateSampleSheetData, H as toBioTemplateComponentPropsById, Ht as validateQpcrPlateData, I as listBioTemplateComponentBindings, It as validateCalibrationCurveData, J as toDoseLayoutState, Jt as getBioTemplatePresetInfo, K as toWellMapArray, Kt as validateTimeCourseData, L as toBioTemplateComponentBindings, Lt as validateDoseResponseData, M as createPlateMapTemplate, Mt as toAssayMatrixDataFrame, N as bioTemplatePresetControlValuesToOptions, Nt as toAssayMatrixRows, O as createCalibrationCurveTemplate, Ot as toCalibrationCurveColumns, P as getBioTemplateComponentBindings, Pt as toAssayMatrixSampleOptions, Q as toTimeCourseDataFrame, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, Rt as validateFlowCytometryPanelData, S as createInstrumentRunTemplate, St as toInstrumentRunRows, T as createAssayMatrixTemplate, Tt as toFlowPanelColumns, U as toBioTemplateComponentSnippets, Ut as validateReagentListData, V as toBioTemplateComponentPropsByComponent, Vt as validateProtocolStepsData, W as toBioTemplateComponentUsage, Wt as validateSamplePrepData, X as toWellPlateWells, Xt as searchBioTemplatePresets, Y as toPlateMapEditorState, Yt as listBioTemplatePresets, Z as toTimeCourseColumns, Zt as bioTemplatePacks, _ as createElisaAssayCollection, _t as toProtocolDataFrame, a as getBioTemplateControlDefaults, an as TEMPLATE_COLLECTION_KEY, at as toSamplePrepColumns, b as createQpcrExpressionCollection, bt as toInstrumentRunColumns, c as listBioTemplatePresetControlSchemas, cn as createTemplateEnvelope, ct as toReagentColumns, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, dt as toReagentRows, en as searchBioTemplatePacks, et as toTimeCourseSteps, f as createWellPlateScreenCollection, fn as getTemplateData, ft as toQpcrColumns, g as createFlowCytometryAssayCollection, gt as toProtocolColumns, h as createWesternBlotAssayCollection, ht as toQpcrWellPlateWells, i as createBioTemplateControlToolkit, in as searchBioTemplateCatalog, it as toSampleRows, j as createSampleSheetTemplate, jt as toAssayMatrixColumns, k as createDoseResponseTemplate, kt as toCalibrationCurveDataFrame, l as requireBioTemplateControlSchema, ln as ensureTemplateEnvelope, lt as toReagentDataFrame, m as createDefaultBioTemplate, mt as toQpcrRows, n as bioTemplateControlsToSectionFormSchemas, nn as getBioTemplateInfo, nt as toSampleDataFrame, o as getBioTemplateControlSchema, on as assertTemplateEnvelope, ot as toSamplePrepDataFrame, p as createBioTemplatePackCollection, pt as toQpcrDataFrame, q as toDoseConditions, qt as bioTemplatePresets, r as bioTemplateControlsToSidebarPanels, rn as listBioTemplateCatalog, rt as toSampleOptions, s as listBioTemplateControlSchemas, sn as createTemplateCollection, st as toSamplePrepRows, t as bioTemplateControlsToFormSchema, tn as bioTemplateCatalog, tt as toSampleColumns, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, ut as toReagentListItems, v as createTargetedMetabolomicsCollection, vt as toProtocolRows, w as createReagentListTemplate, wt as toInstrumentRunSteps, x as createQpcrPlateTemplate, xt as toInstrumentRunDataFrame, y as createLcmsBatchCollection, yt as toProtocolSteps, z as toBioTemplateComponentImports, zt as validateInstrumentRunData } from "../templates-Cdj93S9C.js";
1
+ import "../experiment-utils-7Yw-h0tD.js";
2
+ import "../EmptyState-LMPS3keb.js";
3
+ import "../useControlSchema-BEAgLyyx.js";
4
+ import { $ as toTimeCourseRows, $t as listBioTemplatePacks, A as createSamplePrepTemplate, At as toCalibrationCurveRows, B as toBioTemplateComponentProps, Bt as validatePlateMapData, C as createFlowCytometryPanelTemplate, Ct as toInstrumentRunScheduleEvents, D as createTimeCourseTemplate, Dt as toFlowPanelRows, E as createProtocolStepsTemplate, Et as toFlowPanelDataFrame, F as getBioTemplateComponentProps, Ft as validateAssayMatrixData, G as toTemplateDataFrame, Gt as validateSampleSheetData, H as toBioTemplateComponentPropsById, Ht as validateQpcrPlateData, I as listBioTemplateComponentBindings, It as validateCalibrationCurveData, J as toDoseLayoutState, Jt as getBioTemplatePresetInfo, K as toWellMapArray, Kt as validateTimeCourseData, L as toBioTemplateComponentBindings, Lt as validateDoseResponseData, M as createPlateMapTemplate, Mt as toAssayMatrixDataFrame, N as bioTemplatePresetControlValuesToOptions, Nt as toAssayMatrixRows, O as createCalibrationCurveTemplate, Ot as toCalibrationCurveColumns, P as getBioTemplateComponentBindings, Pt as toAssayMatrixSampleOptions, Q as toTimeCourseDataFrame, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, Rt as validateFlowCytometryPanelData, S as createInstrumentRunTemplate, St as toInstrumentRunRows, T as createAssayMatrixTemplate, Tt as toFlowPanelColumns, U as toBioTemplateComponentSnippets, Ut as validateReagentListData, V as toBioTemplateComponentPropsByComponent, Vt as validateProtocolStepsData, W as toBioTemplateComponentUsage, Wt as validateSamplePrepData, X as toWellPlateWells, Xt as searchBioTemplatePresets, Y as toPlateMapEditorState, Yt as listBioTemplatePresets, Z as toTimeCourseColumns, Zt as bioTemplatePacks, _ as createElisaAssayCollection, _t as toProtocolDataFrame, a as getBioTemplateControlDefaults, an as TEMPLATE_COLLECTION_KEY, at as toSamplePrepColumns, b as createQpcrExpressionCollection, bt as toInstrumentRunColumns, c as listBioTemplatePresetControlSchemas, cn as createTemplateEnvelope, ct as toReagentColumns, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, dt as toReagentRows, en as searchBioTemplatePacks, et as toTimeCourseSteps, f as createWellPlateScreenCollection, fn as getTemplateData, ft as toQpcrColumns, g as createFlowCytometryAssayCollection, gt as toProtocolColumns, h as createWesternBlotAssayCollection, ht as toQpcrWellPlateWells, i as createBioTemplateControlToolkit, in as searchBioTemplateCatalog, it as toSampleRows, j as createSampleSheetTemplate, jt as toAssayMatrixColumns, k as createDoseResponseTemplate, kt as toCalibrationCurveDataFrame, l as requireBioTemplateControlSchema, ln as ensureTemplateEnvelope, lt as toReagentDataFrame, m as createDefaultBioTemplate, mt as toQpcrRows, n as bioTemplateControlsToSectionFormSchemas, nn as getBioTemplateInfo, nt as toSampleDataFrame, o as getBioTemplateControlSchema, on as assertTemplateEnvelope, ot as toSamplePrepDataFrame, p as createBioTemplatePackCollection, pt as toQpcrDataFrame, q as toDoseConditions, qt as bioTemplatePresets, r as bioTemplateControlsToSidebarPanels, rn as listBioTemplateCatalog, rt as toSampleOptions, s as listBioTemplateControlSchemas, sn as createTemplateCollection, st as toSamplePrepRows, t as bioTemplateControlsToFormSchema, tn as bioTemplateCatalog, tt as toSampleColumns, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, ut as toReagentListItems, v as createTargetedMetabolomicsCollection, vt as toProtocolRows, w as createReagentListTemplate, wt as toInstrumentRunSteps, x as createQpcrPlateTemplate, xt as toInstrumentRunDataFrame, y as createLcmsBatchCollection, yt as toProtocolSteps, z as toBioTemplateComponentImports, zt as validateInstrumentRunData } from "../templates-CJRFiWUX.js";
5
5
  export { TEMPLATE_COLLECTION_KEY, assertTemplateEnvelope, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createInstrumentRunTemplate, createLcmsBatchCollection, createPlateMapTemplate, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWesternBlotAssayCollection, ensureTemplateEnvelope, ensureTemplateFromCollection, extractTemplateCollection, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getTemplateData, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, requireBioTemplateControlSchema, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData };
@@ -1,4 +1,4 @@
1
- import { _ as controlsToFormSchema, i as useControlSchema, r as getControlDefaults, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas } from "./useControlSchema-B_qgU4rW.js";
1
+ import { _ as controlsToFormSchema, i as useControlSchema, r as getControlDefaults, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas } from "./useControlSchema-BEAgLyyx.js";
2
2
  //#region src/templates/builderReadUtils.ts
3
3
  function isRecord$2(value) {
4
4
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -5060,4 +5060,4 @@ function getBioTemplateControlDefaults(target) {
5060
5060
  //#endregion
5061
5061
  export { toTimeCourseRows as $, listBioTemplatePacks as $t, createSamplePrepTemplate as A, toCalibrationCurveRows as At, toBioTemplateComponentProps as B, validatePlateMapData as Bt, createFlowCytometryPanelTemplate as C, toInstrumentRunScheduleEvents as Ct, createTimeCourseTemplate as D, toFlowPanelRows as Dt, createProtocolStepsTemplate as E, toFlowPanelDataFrame as Et, getBioTemplateComponentProps as F, validateAssayMatrixData as Ft, toTemplateDataFrame as G, validateSampleSheetData as Gt, toBioTemplateComponentPropsById as H, validateQpcrPlateData as Ht, listBioTemplateComponentBindings as I, validateCalibrationCurveData as It, toDoseLayoutState as J, getBioTemplatePresetInfo as Jt, toWellMapArray as K, validateTimeCourseData as Kt, toBioTemplateComponentBindings as L, validateDoseResponseData as Lt, createPlateMapTemplate as M, toAssayMatrixDataFrame as Mt, bioTemplatePresetControlValuesToOptions as N, toAssayMatrixRows as Nt, createCalibrationCurveTemplate as O, toCalibrationCurveColumns as Ot, getBioTemplateComponentBindings as P, toAssayMatrixSampleOptions as Pt, toTimeCourseDataFrame as Q, getBioTemplatePackInfo as Qt, toBioTemplateComponentBindingsById as R, validateFlowCytometryPanelData as Rt, createInstrumentRunTemplate as S, toInstrumentRunRows as St, createAssayMatrixTemplate as T, toFlowPanelColumns as Tt, toBioTemplateComponentSnippets as U, validateReagentListData as Ut, toBioTemplateComponentPropsByComponent as V, validateProtocolStepsData as Vt, toBioTemplateComponentUsage as W, validateSamplePrepData as Wt, toWellPlateWells as X, searchBioTemplatePresets as Xt, toPlateMapEditorState as Y, listBioTemplatePresets as Yt, toTimeCourseColumns as Z, bioTemplatePacks as Zt, createElisaAssayCollection as _, toProtocolDataFrame as _t, getBioTemplateControlDefaults as a, TEMPLATE_COLLECTION_KEY as an, toSamplePrepColumns as at, createQpcrExpressionCollection as b, toInstrumentRunColumns as bt, listBioTemplatePresetControlSchemas as c, createTemplateEnvelope as cn, toReagentColumns as ct, createBioTemplatePresetCollectionFromControls as d, extractTemplateCollection as dn, toReagentRows as dt, searchBioTemplatePacks as en, toTimeCourseSteps as et, createWellPlateScreenCollection as f, getTemplateData as fn, toQpcrColumns as ft, createFlowCytometryAssayCollection as g, toProtocolColumns as gt, createWesternBlotAssayCollection as h, toQpcrWellPlateWells as ht, createBioTemplateControlToolkit as i, searchBioTemplateCatalog as in, toSampleRows as it, createSampleSheetTemplate as j, toAssayMatrixColumns as jt, createDoseResponseTemplate as k, toCalibrationCurveDataFrame as kt, requireBioTemplateControlSchema as l, ensureTemplateEnvelope as ln, toReagentDataFrame as lt, createDefaultBioTemplate as m, toQpcrRows as mt, bioTemplateControlsToSectionFormSchemas as n, getBioTemplateInfo as nn, toSampleDataFrame as nt, getBioTemplateControlSchema as o, assertTemplateEnvelope as on, toSamplePrepDataFrame as ot, createBioTemplatePackCollection as p, toQpcrDataFrame as pt, toDoseConditions as q, bioTemplatePresets as qt, bioTemplateControlsToSidebarPanels as r, listBioTemplateCatalog as rn, toSampleOptions as rt, listBioTemplateControlSchemas as s, createTemplateCollection as sn, toSamplePrepRows as st, bioTemplateControlsToFormSchema as t, bioTemplateCatalog as tn, toSampleColumns as tt, createBioTemplatePresetCollection as u, ensureTemplateFromCollection as un, toReagentListItems as ut, createTargetedMetabolomicsCollection as v, toProtocolRows as vt, createReagentListTemplate as w, toInstrumentRunSteps as wt, createQpcrPlateTemplate as x, toInstrumentRunDataFrame as xt, createLcmsBatchCollection as y, toProtocolSteps as yt, toBioTemplateComponentImports as z, validateInstrumentRunData as zt };
5062
5062
 
5063
- //# sourceMappingURL=templates-Cdj93S9C.js.map
5063
+ //# sourceMappingURL=templates-CJRFiWUX.js.map