@morscherlab/mint-sdk 1.1.0-beta.9 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) 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-CDNsNudn.js} +9 -11
  6. package/dist/ExperimentSelectorModal-CDNsNudn.js.map +1 -0
  7. package/dist/{SettingsModal-Dpg-X1OM.js → SettingsModal-BGBimSIA.js} +5 -5
  8. package/dist/{SettingsModal-Dpg-X1OM.js.map → SettingsModal-BGBimSIA.js.map} +1 -1
  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-BbOyjE2T.js} +24 -29
  20. package/dist/components-BbOyjE2T.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 +190 -6
  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/generated-ui.d.ts +7 -0
  47. package/dist/types/index.js +1 -1
  48. package/dist/types/platform.d.ts +1 -1
  49. package/dist/{auth-B87xM--s.js → useApi-CDBq6z23.js} +191 -2
  50. package/dist/useApi-CDBq6z23.js.map +1 -0
  51. package/dist/{useControlSchema-B_qgU4rW.js → useControlSchema-BEAgLyyx.js} +5 -4
  52. package/dist/{useControlSchema-B_qgU4rW.js.map → useControlSchema-BEAgLyyx.js.map} +1 -1
  53. package/dist/{useDropdownState-gVaMXtwW.js → useDropdownState-Be-ug_ci.js} +2 -2
  54. package/dist/{useDropdownState-gVaMXtwW.js.map → useDropdownState-Be-ug_ci.js.map} +1 -1
  55. package/dist/{useExperimentSelector-BuQZRgMt.js → useExperimentSelector-Dld4841S.js} +4 -3
  56. package/dist/{useExperimentSelector-BuQZRgMt.js.map → useExperimentSelector-Dld4841S.js.map} +1 -1
  57. package/dist/{useFormBuilder-D1G5J5Z5.js → useFormBuilder-CR9pBApW.js} +2 -2
  58. package/dist/{useFormBuilder-D1G5J5Z5.js.map → useFormBuilder-CR9pBApW.js.map} +1 -1
  59. package/dist/{useProtocolTemplates-DeaOmMaw.js → useProtocolTemplates-DXeIHMwV.js} +38 -42
  60. package/dist/useProtocolTemplates-DXeIHMwV.js.map +1 -0
  61. package/package.json +1 -1
  62. package/src/__stories__/experiment-helpers.ts +12 -9
  63. package/src/__tests__/components/AppTopBar.test.ts +10 -6
  64. package/src/__tests__/components/ExperimentPopover.test.ts +64 -0
  65. package/src/__tests__/components/ExperimentSelectorModal.test.ts +86 -41
  66. package/src/__tests__/components/PluginWorkspaceView.test.ts +103 -19
  67. package/src/__tests__/components/SettingsModal.test.ts +1 -1
  68. package/src/__tests__/composables/experiment-utils.test.ts +33 -0
  69. package/src/__tests__/composables/useAppExperiment.test.ts +331 -92
  70. package/src/__tests__/composables/useAuth.test.ts +2 -2
  71. package/src/__tests__/composables/usePlatformContext.test.ts +5 -1
  72. package/src/__tests__/stores/experiment.test.ts +300 -0
  73. package/src/__tests__/types/GeneratedJsonSchema.test.ts +31 -0
  74. package/src/components/AppTopBar.vue +0 -2
  75. package/src/components/ExperimentPopover.story.vue +59 -0
  76. package/src/components/ExperimentPopover.vue +96 -6
  77. package/src/components/ExperimentSelectorModal.story.vue +6 -16
  78. package/src/components/ExperimentSelectorModal.vue +8 -4
  79. package/src/components/PluginWorkspaceView.props.ts +1 -4
  80. package/src/components/PluginWorkspaceView.story.vue +12 -5
  81. package/src/components/PluginWorkspaceView.vue +0 -2
  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/stores/experiment.ts +120 -0
  87. package/src/stores/index.ts +1 -0
  88. package/src/styles/components/button.css +1 -3
  89. package/src/styles/components/experiment-popover.css +105 -0
  90. package/src/types/auth.ts +1 -1
  91. package/src/types/generated-ui.ts +7 -0
  92. package/src/types/platform.ts +1 -1
  93. package/dist/EmptyState-DgBRoYAy.js.map +0 -1
  94. package/dist/ExperimentPopover-BFw3QX8L.js.map +0 -1
  95. package/dist/ExperimentSelectorModal-BBWXC7KW.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/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
@@ -124,9 +124,7 @@
124
124
  .mint-button--sm {
125
125
  padding: 0.375rem 0.75rem;
126
126
  font-size: 0.875rem;
127
- /* Small buttons live in dense/secondary contexts — regular (400) weight
128
- keeps the compact label from reading too heavy. Applies to all variants. */
129
- font-weight: 400;
127
+ font-weight: 500;
130
128
  min-height: var(--form-height-sm);
131
129
  }
132
130
  .mint-button--secondary.mint-button--sm {
@@ -4177,6 +4175,44 @@ html.dark .mint-pill__remove:hover {
4177
4175
  .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-code {
4178
4176
  color: var(--color-primary);
4179
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
+ }
4180
4216
  .mint-experiment-popover__trigger-chevron {
4181
4217
  width: 0.8125rem;
4182
4218
  height: 0.8125rem;
@@ -4431,6 +4467,53 @@ html.dark .mint-pill__remove:hover {
4431
4467
  line-height: 1.3;
4432
4468
  }
4433
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
+
4434
4517
  /* Action row sits BELOW the card (was inside) so the buttons have
4435
4518
  room to breathe and don't compete with the info stack. */
4436
4519
  .mint-experiment-popover__card-actions {
@@ -4561,6 +4644,12 @@ html.dark .mint-pill__remove:hover {
4561
4644
  to { transform: rotate(360deg);
4562
4645
  }
4563
4646
  }
4647
+ @keyframes mint-experiment-popover-shimmer {
4648
+ 0% { background-position: 100% 0;
4649
+ }
4650
+ 100% { background-position: -100% 0;
4651
+ }
4652
+ }
4564
4653
 
4565
4654
  /* Respect motion preferences */
4566
4655
  @media (prefers-reduced-motion: reduce) {
@@ -4586,6 +4675,12 @@ to { transform: rotate(360deg);
4586
4675
  }
4587
4676
  .mint-experiment-popover__trigger-chevron {
4588
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;
4589
4684
  }
4590
4685
  }
4591
4686
  .mint-exp-code {
@@ -21922,9 +22017,7 @@ code, pre {
21922
22017
  .mint-button--sm {
21923
22018
  padding: 0.375rem 0.75rem;
21924
22019
  font-size: 0.875rem;
21925
- /* Small buttons live in dense/secondary contexts — regular (400) weight
21926
- keeps the compact label from reading too heavy. Applies to all variants. */
21927
- font-weight: 400;
22020
+ font-weight: 500;
21928
22021
  min-height: var(--form-height-sm);
21929
22022
  }
21930
22023
  .mint-button--secondary.mint-button--sm {
@@ -35621,6 +35714,42 @@ html.dark .mint-experiment-selector__filters-toggle--active {
35621
35714
  .mint-experiment-popover__trigger--active .mint-experiment-popover__trigger-code {
35622
35715
  color: var(--color-primary);
35623
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
+ }
35624
35753
  .mint-experiment-popover__trigger-chevron {
35625
35754
  width: 0.8125rem;
35626
35755
  height: 0.8125rem;
@@ -35862,6 +35991,51 @@ html.dark .mint-experiment-selector__filters-toggle--active {
35862
35991
  color: var(--text-muted);
35863
35992
  line-height: 1.3;
35864
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
+ }
35865
36039
  /* Action row sits BELOW the card (was inside) so the buttons have
35866
36040
  room to breathe and don't compete with the info stack. */
35867
36041
  .mint-experiment-popover__card-actions {
@@ -35989,6 +36163,10 @@ html.dark .mint-experiment-selector__filters-toggle--active {
35989
36163
  @keyframes mint-experiment-popover-spin {
35990
36164
  to { transform: rotate(360deg); }
35991
36165
  }
36166
+ @keyframes mint-experiment-popover-shimmer {
36167
+ 0% { background-position: 100% 0; }
36168
+ 100% { background-position: -100% 0; }
36169
+ }
35992
36170
  /* Respect motion preferences */
35993
36171
  @media (prefers-reduced-motion: reduce) {
35994
36172
  .mint-experiment-popover__trigger,
@@ -36014,6 +36192,12 @@ html.dark .mint-experiment-selector__filters-toggle--active {
36014
36192
  .mint-experiment-popover__trigger-chevron {
36015
36193
  transition: none;
36016
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
+ }
36017
36201
  }
36018
36202
  /* FitPanel Component Styles */
36019
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