@morscherlab/mint-sdk 1.0.0-rc.1 → 1.0.0-rc.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 (143) hide show
  1. package/README.md +9 -1
  2. package/dist/__tests__/components/LcmsSequenceTable.test.d.ts +1 -0
  3. package/dist/__tests__/components/ProgressBar.test.d.ts +1 -0
  4. package/dist/__tests__/components/RackEditor.test.d.ts +1 -0
  5. package/dist/__tests__/components/SequenceProgressBar.test.d.ts +1 -0
  6. package/dist/__tests__/composables/useExperimentSamples.test.d.ts +1 -0
  7. package/dist/__tests__/utils/instrument.test.d.ts +1 -0
  8. package/dist/__tests__/utils/lcms.test.d.ts +1 -0
  9. package/dist/__tests__/utils/permissions.test.d.ts +1 -0
  10. package/dist/__tests__/utils/rack.test.d.ts +1 -0
  11. package/dist/{auth-CBG3bWEc.js → auth-B7g4J4ZF.js} +99 -5
  12. package/dist/auth-B7g4J4ZF.js.map +1 -0
  13. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  14. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  15. package/dist/components/BaseToggle.vue.d.ts +2 -2
  16. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +1 -1
  17. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  18. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +1 -1
  19. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +1 -1
  20. package/dist/components/FormulaInput.vue.d.ts +1 -1
  21. package/dist/components/InstrumentAlertLog.vue.d.ts +22 -0
  22. package/dist/components/InstrumentStateBadge.vue.d.ts +11 -0
  23. package/dist/components/InstrumentStatusCard.vue.d.ts +13 -0
  24. package/dist/components/LcmsSequenceTable.vue.d.ts +26 -0
  25. package/dist/components/ProgressBar.vue.d.ts +1 -0
  26. package/dist/components/RackEditor.vue.d.ts +41 -3
  27. package/dist/components/ReagentList.vue.d.ts +1 -1
  28. package/dist/components/SampleSelector.vue.d.ts +5 -2
  29. package/dist/components/SegmentedControl.vue.d.ts +2 -0
  30. package/dist/components/SequenceInput.vue.d.ts +1 -1
  31. package/dist/components/SequenceProgressBar.vue.d.ts +15 -0
  32. package/dist/components/SettingsModal.vue.d.ts +3 -1
  33. package/dist/components/TagsInput.vue.d.ts +1 -1
  34. package/dist/components/WellPlate.vue.d.ts +42 -3
  35. package/dist/components/index.d.ts +5 -0
  36. package/dist/components/index.js +3 -3
  37. package/dist/{components-5KSfsVqf.js → components-BhK-dW99.js} +2091 -1051
  38. package/dist/components-BhK-dW99.js.map +1 -0
  39. package/dist/composables/experimentDesignData.d.ts +17 -0
  40. package/dist/composables/index.d.ts +2 -0
  41. package/dist/composables/index.js +4 -4
  42. package/dist/composables/useControlSchema.d.ts +11 -0
  43. package/dist/composables/useExperimentData.d.ts +11 -3
  44. package/dist/composables/useExperimentSamples.d.ts +42 -0
  45. package/dist/composables/usePlatformContext.d.ts +54 -0
  46. package/dist/{composables-D4Myb30a.js → composables-Bg7CFuNz.js} +5 -3
  47. package/dist/composables-Bg7CFuNz.js.map +1 -0
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.js +168 -6
  50. package/dist/index.js.map +1 -0
  51. package/dist/install.js +2 -2
  52. package/dist/instrument.d.ts +7 -0
  53. package/dist/lcms.d.ts +27 -0
  54. package/dist/permissions.d.ts +46 -0
  55. package/dist/stores/auth.d.ts +74 -2
  56. package/dist/stores/index.js +1 -1
  57. package/dist/styles.css +3316 -1216
  58. package/dist/templates/builders.d.ts +7 -3
  59. package/dist/templates/index.d.ts +2 -2
  60. package/dist/templates/index.js +2 -2
  61. package/dist/templates/presets.d.ts +12 -0
  62. package/dist/templates/types.d.ts +16 -1
  63. package/dist/{templates-BSlxwV2c.js → templates-BorLR_7p.js} +313 -3
  64. package/dist/templates-BorLR_7p.js.map +1 -0
  65. package/dist/types/auth.d.ts +2 -0
  66. package/dist/types/components.d.ts +32 -3
  67. package/dist/types/form-builder.d.ts +2 -1
  68. package/dist/types/index.d.ts +4 -1
  69. package/dist/types/instrument.d.ts +56 -0
  70. package/dist/types/platform.d.ts +3 -0
  71. package/dist/{useExperimentData-BbbdI5xT.js → useProtocolTemplates-n6AJqSqv.js} +534 -359
  72. package/dist/useProtocolTemplates-n6AJqSqv.js.map +1 -0
  73. package/dist/utils/rack.d.ts +47 -0
  74. package/package.json +1 -1
  75. package/src/__tests__/components/AppTopBar.test.ts +15 -0
  76. package/src/__tests__/components/BaseTabs.test.ts +15 -0
  77. package/src/__tests__/components/LcmsSequenceTable.test.ts +57 -0
  78. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  79. package/src/__tests__/components/RackEditor.test.ts +125 -0
  80. package/src/__tests__/components/SampleSelector.test.ts +25 -0
  81. package/src/__tests__/components/SegmentedControl.test.ts +45 -0
  82. package/src/__tests__/components/SequenceProgressBar.test.ts +39 -0
  83. package/src/__tests__/components/SettingsModal.test.ts +83 -2
  84. package/src/__tests__/composables/useControlSchema.test.ts +4 -0
  85. package/src/__tests__/composables/useExperimentData.test.ts +23 -0
  86. package/src/__tests__/composables/useExperimentSamples.test.ts +91 -0
  87. package/src/__tests__/templates/templates.test.ts +86 -0
  88. package/src/__tests__/utils/instrument.test.ts +47 -0
  89. package/src/__tests__/utils/lcms.test.ts +73 -0
  90. package/src/__tests__/utils/permissions.test.ts +50 -0
  91. package/src/__tests__/utils/rack.test.ts +120 -0
  92. package/src/components/AppTopBar.vue +1 -0
  93. package/src/components/BaseTabs.vue +22 -1
  94. package/src/components/InstrumentAlertLog.vue +191 -0
  95. package/src/components/InstrumentStateBadge.vue +50 -0
  96. package/src/components/InstrumentStatusCard.vue +188 -0
  97. package/src/components/LcmsSequenceTable.vue +191 -0
  98. package/src/components/ProgressBar.vue +3 -0
  99. package/src/components/RackEditor.vue +73 -2
  100. package/src/components/SampleSelector.vue +28 -9
  101. package/src/components/SegmentedControl.story.vue +17 -0
  102. package/src/components/SegmentedControl.vue +14 -3
  103. package/src/components/SequenceProgressBar.vue +71 -0
  104. package/src/components/SettingsModal.vue +42 -2
  105. package/src/components/WellPlate.vue +142 -21
  106. package/src/components/index.ts +5 -0
  107. package/src/components/internal/WellEditPopupInternal.vue +1 -0
  108. package/src/composables/experimentDesignData.ts +182 -0
  109. package/src/composables/index.ts +14 -0
  110. package/src/composables/useAuth.ts +4 -0
  111. package/src/composables/useAutoGroup.ts +5 -1
  112. package/src/composables/useControlSchema.ts +21 -0
  113. package/src/composables/useExperimentData.ts +57 -16
  114. package/src/composables/useExperimentSamples.ts +142 -0
  115. package/src/index.ts +27 -0
  116. package/src/instrument.ts +90 -0
  117. package/src/lcms.ts +108 -0
  118. package/src/permissions.ts +143 -0
  119. package/src/stores/auth.ts +31 -3
  120. package/src/styles/components/instrument-monitor.css +478 -0
  121. package/src/styles/components/lcms-sequence-table.css +189 -0
  122. package/src/styles/components/sequence-progress-bar.css +63 -0
  123. package/src/styles/components/tabs.css +9 -0
  124. package/src/styles/components/well-edit-popup.css +7 -1
  125. package/src/styles/components/well-plate.css +5 -0
  126. package/src/styles/index.css +3 -0
  127. package/src/templates/builders.ts +201 -0
  128. package/src/templates/controlSchemas.ts +68 -0
  129. package/src/templates/index.ts +2 -0
  130. package/src/templates/presets.ts +23 -0
  131. package/src/templates/types.ts +17 -0
  132. package/src/types/auth.ts +3 -0
  133. package/src/types/components.ts +45 -3
  134. package/src/types/form-builder.ts +2 -1
  135. package/src/types/index.ts +35 -0
  136. package/src/types/instrument.ts +61 -0
  137. package/src/types/platform.ts +4 -0
  138. package/src/utils/rack.ts +209 -0
  139. package/dist/auth-CBG3bWEc.js.map +0 -1
  140. package/dist/components-5KSfsVqf.js.map +0 -1
  141. package/dist/composables-D4Myb30a.js.map +0 -1
  142. package/dist/templates-BSlxwV2c.js.map +0 -1
  143. package/dist/useExperimentData-BbbdI5xT.js.map +0 -1
@@ -1,6 +1,15 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { ref, computed } from 'vue'
3
3
  import type { AuthConfig, UserInfo } from '../types'
4
+ import {
5
+ canAccessAdmin as canUserAccessAdmin,
6
+ canAccessPlugin as canUserAccessPlugin,
7
+ getAccessAudience,
8
+ getUserPermissions,
9
+ hasAllPermissions,
10
+ hasAnyPermission,
11
+ isAdminUser,
12
+ } from '../permissions'
4
13
 
5
14
  const AUTH_TOKEN_KEY = 'mint-auth-token'
6
15
  const AUTH_EXPIRES_KEY = 'mint-auth-expires'
@@ -73,9 +82,10 @@ export const useAuthStore = defineStore('mint-auth', () => {
73
82
  return authConfig.value.authRequired && !isAuthenticated.value
74
83
  })
75
84
 
76
- const isAdmin = computed(() => {
77
- return userInfo.value?.role === 'admin'
78
- })
85
+ const isAdmin = computed(() => isAdminUser(userInfo.value))
86
+ const userType = computed(() => getAccessAudience(userInfo.value))
87
+ const permissions = computed(() => getUserPermissions(userInfo.value))
88
+ const canAccessAdmin = computed(() => canUserAccessAdmin(userInfo.value))
79
89
 
80
90
  const canRegister = computed(() => {
81
91
  return authConfig.value.registrationEnabled
@@ -126,6 +136,18 @@ export const useAuthStore = defineStore('mint-auth', () => {
126
136
  username.value = info.username
127
137
  }
128
138
 
139
+ function hasPermission(...perms: string[]): boolean {
140
+ return hasAllPermissions(userInfo.value, perms)
141
+ }
142
+
143
+ function hasAnyPermissionForUser(...perms: string[]): boolean {
144
+ return hasAnyPermission(userInfo.value, perms)
145
+ }
146
+
147
+ function canAccessPlugin(pluginName: string): boolean {
148
+ return canUserAccessPlugin(userInfo.value, pluginName)
149
+ }
150
+
129
151
  function setAuthConfig(config: AuthConfig) {
130
152
  authConfig.value = config
131
153
  }
@@ -161,6 +183,9 @@ export const useAuthStore = defineStore('mint-auth', () => {
161
183
  isAuthenticated,
162
184
  needsAuth,
163
185
  isAdmin,
186
+ userType,
187
+ permissions,
188
+ canAccessAdmin,
164
189
  canRegister,
165
190
 
166
191
  // Actions
@@ -172,6 +197,9 @@ export const useAuthStore = defineStore('mint-auth', () => {
172
197
  setUserInfo,
173
198
  setError,
174
199
  setLoading,
200
+ hasPermission,
201
+ hasAnyPermission: hasAnyPermissionForUser,
202
+ canAccessPlugin,
175
203
  logout,
176
204
  }
177
205
  })
@@ -0,0 +1,478 @@
1
+ .mint-instrument-state {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: 0.3125rem;
5
+ border-radius: 999px;
6
+ font-size: 0.6875rem;
7
+ font-weight: 700;
8
+ letter-spacing: 0.04em;
9
+ line-height: 1.35;
10
+ padding: 0.125rem 0.625rem;
11
+ white-space: nowrap;
12
+ }
13
+
14
+ .mint-instrument-state--success {
15
+ background: color-mix(in srgb, var(--mint-success, #22c55e) 12%, transparent);
16
+ color: var(--mint-success, #22c55e);
17
+ }
18
+
19
+ .mint-instrument-state--warning {
20
+ background: color-mix(in srgb, var(--mint-warning, #eab308) 12%, transparent);
21
+ color: var(--mint-warning, #eab308);
22
+ }
23
+
24
+ .mint-instrument-state--error {
25
+ background: color-mix(in srgb, var(--mint-error, #ef4444) 12%, transparent);
26
+ color: var(--mint-error, #ef4444);
27
+ }
28
+
29
+ .mint-instrument-state--info {
30
+ background: color-mix(in srgb, var(--mint-info, #3b82f6) 12%, transparent);
31
+ color: var(--mint-info, #3b82f6);
32
+ }
33
+
34
+ .mint-instrument-state--muted {
35
+ background: var(--bg-secondary, #f1f5f9);
36
+ color: var(--text-muted, #64748b);
37
+ }
38
+
39
+ .mint-instrument-state--offline {
40
+ border: 1px dashed var(--border-color, #e2e8f0);
41
+ }
42
+
43
+ .mint-instrument-state__dot {
44
+ width: 0.375rem;
45
+ height: 0.375rem;
46
+ border-radius: 999px;
47
+ background: currentColor;
48
+ animation: mint-instrument-pulse 1.5s ease-in-out infinite;
49
+ }
50
+
51
+ .mint-instrument-card {
52
+ display: flex;
53
+ min-width: 0;
54
+ flex-direction: column;
55
+ gap: 0.75rem;
56
+ border: 1px solid var(--border-color, #e2e8f0);
57
+ border-radius: 0.75rem;
58
+ background: var(--bg-primary, #fff);
59
+ padding: 1.25rem;
60
+ transition: border-color 150ms ease-out, box-shadow 150ms ease-out;
61
+ }
62
+
63
+ .mint-instrument-card--running {
64
+ border-color: color-mix(in srgb, var(--mint-success, #22c55e) 30%, var(--border-color, #e2e8f0));
65
+ box-shadow: 0 0 12px rgba(34, 197, 94, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04);
66
+ }
67
+
68
+ .mint-instrument-card--error {
69
+ border-color: var(--mint-error, #ef4444);
70
+ box-shadow: 0 0 12px rgba(239, 68, 68, 0.12), 0 1px 3px rgba(0, 0, 0, 0.04);
71
+ }
72
+
73
+ .mint-instrument-card--connected {
74
+ border-color: color-mix(in srgb, var(--mint-info, #3b82f6) 25%, var(--border-color, #e2e8f0));
75
+ }
76
+
77
+ .mint-instrument-card--disconnected {
78
+ border-style: dashed;
79
+ opacity: 0.68;
80
+ }
81
+
82
+ .mint-instrument-card__header,
83
+ .mint-instrument-card__sample-row,
84
+ .mint-instrument-card__eta,
85
+ .mint-instrument-alert__header,
86
+ .mint-instrument-alert__footer {
87
+ display: flex;
88
+ align-items: center;
89
+ }
90
+
91
+ .mint-instrument-card__header {
92
+ gap: 0.625rem;
93
+ min-width: 0;
94
+ }
95
+
96
+ .mint-instrument-card__dot {
97
+ width: 0.75rem;
98
+ height: 0.75rem;
99
+ flex: 0 0 auto;
100
+ border-radius: 999px;
101
+ }
102
+
103
+ .mint-instrument-card__dot--success {
104
+ background: var(--mint-success, #22c55e);
105
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.5);
106
+ }
107
+
108
+ .mint-instrument-card__dot--warning {
109
+ background: var(--mint-warning, #eab308);
110
+ }
111
+
112
+ .mint-instrument-card__dot--error {
113
+ background: var(--mint-error, #ef4444);
114
+ box-shadow: 0 0 8px rgba(239, 68, 68, 0.45);
115
+ }
116
+
117
+ .mint-instrument-card__dot--info {
118
+ background: var(--mint-info, #3b82f6);
119
+ }
120
+
121
+ .mint-instrument-card__dot--muted {
122
+ background: var(--text-muted, #64748b);
123
+ opacity: 0.38;
124
+ }
125
+
126
+ .mint-instrument-card__name {
127
+ min-width: 0;
128
+ flex: 1 1 auto;
129
+ overflow: hidden;
130
+ color: var(--text-primary, #0f172a);
131
+ font-size: 1.0625rem;
132
+ font-weight: 700;
133
+ text-overflow: ellipsis;
134
+ white-space: nowrap;
135
+ }
136
+
137
+ .mint-instrument-card__sample {
138
+ display: flex;
139
+ flex-direction: column;
140
+ gap: 0.25rem;
141
+ border: 1px solid color-mix(in srgb, var(--mint-success, #22c55e) 20%, var(--border-color, #e2e8f0));
142
+ border-radius: 0.375rem;
143
+ background: color-mix(in srgb, var(--mint-success, #22c55e) 5%, transparent);
144
+ padding: 0.5rem 0.625rem;
145
+ }
146
+
147
+ .mint-instrument-card__sample-label {
148
+ color: var(--mint-success, #22c55e);
149
+ font-size: 0.625rem;
150
+ font-weight: 700;
151
+ letter-spacing: 0.05em;
152
+ text-transform: uppercase;
153
+ }
154
+
155
+ .mint-instrument-card__sample-row {
156
+ gap: 0.375rem;
157
+ min-width: 0;
158
+ }
159
+
160
+ .mint-instrument-card__sample-dot {
161
+ width: 0.375rem;
162
+ height: 0.375rem;
163
+ flex: 0 0 auto;
164
+ border-radius: 999px;
165
+ background: var(--mint-success, #22c55e);
166
+ }
167
+
168
+ .mint-instrument-card__sample-name,
169
+ .mint-instrument-card__method,
170
+ .mint-instrument-card__sequence {
171
+ min-width: 0;
172
+ overflow: hidden;
173
+ text-overflow: ellipsis;
174
+ white-space: nowrap;
175
+ }
176
+
177
+ .mint-instrument-card__sample-name {
178
+ flex: 1 1 auto;
179
+ color: var(--text-primary, #0f172a);
180
+ font-family: var(--font-mono, 'Fira Code', monospace);
181
+ font-size: 0.8125rem;
182
+ font-weight: 700;
183
+ }
184
+
185
+ .mint-instrument-card__sample-vial,
186
+ .mint-instrument-card__method,
187
+ .mint-instrument-card__sequence,
188
+ .mint-instrument-card__muted {
189
+ color: var(--text-muted, #64748b);
190
+ font-family: var(--font-mono, 'Fira Code', monospace);
191
+ font-size: 0.75rem;
192
+ }
193
+
194
+ .mint-instrument-card__sample-vial {
195
+ flex: 0 0 auto;
196
+ font-size: 0.6875rem;
197
+ }
198
+
199
+ .mint-instrument-card__eta {
200
+ gap: 0.5rem;
201
+ border-radius: 0.5rem;
202
+ background: var(--bg-secondary, #f1f5f9);
203
+ padding: 0.5rem 0.625rem;
204
+ }
205
+
206
+ .mint-instrument-card__eta-label {
207
+ color: var(--text-muted, #64748b);
208
+ font-size: 0.625rem;
209
+ font-weight: 700;
210
+ letter-spacing: 0.05em;
211
+ }
212
+
213
+ .mint-instrument-card__eta-time {
214
+ color: var(--text-primary, #0f172a);
215
+ font-family: var(--font-mono, 'Fira Code', monospace);
216
+ font-size: 0.875rem;
217
+ font-weight: 700;
218
+ }
219
+
220
+ .mint-instrument-card__eta-remaining {
221
+ margin-left: auto;
222
+ color: var(--text-muted, #64748b);
223
+ font-family: var(--font-mono, 'Fira Code', monospace);
224
+ font-size: 0.6875rem;
225
+ }
226
+
227
+ .mint-instrument-card__error {
228
+ border: 1px solid color-mix(in srgb, var(--mint-error, #ef4444) 22%, var(--border-color, #e2e8f0));
229
+ border-radius: 0.5rem;
230
+ background: color-mix(in srgb, var(--mint-error, #ef4444) 8%, transparent);
231
+ padding: 0.625rem 0.75rem;
232
+ }
233
+
234
+ .mint-instrument-card__error-message {
235
+ color: var(--mint-error, #ef4444);
236
+ font-size: 0.8125rem;
237
+ font-weight: 700;
238
+ }
239
+
240
+ .mint-instrument-card__error-detail {
241
+ margin-top: 0.25rem;
242
+ color: var(--text-muted, #64748b);
243
+ font-size: 0.75rem;
244
+ }
245
+
246
+ .mint-instrument-card__placeholder {
247
+ display: grid;
248
+ gap: 0.625rem;
249
+ }
250
+
251
+ .mint-instrument-alert-log {
252
+ display: flex;
253
+ min-height: 0;
254
+ flex-direction: column;
255
+ }
256
+
257
+ .mint-instrument-alert-log__header {
258
+ padding: 0.875rem 1rem 0.625rem;
259
+ }
260
+
261
+ .mint-instrument-alert-log__title {
262
+ color: var(--text-muted, #64748b);
263
+ font-size: 0.75rem;
264
+ font-weight: 700;
265
+ letter-spacing: 0.04em;
266
+ text-transform: uppercase;
267
+ }
268
+
269
+ .mint-instrument-alert-log__filters {
270
+ display: flex;
271
+ flex-direction: column;
272
+ gap: 0.375rem;
273
+ border-bottom: 1px solid var(--border-color, #e2e8f0);
274
+ padding: 0 0.75rem 0.625rem;
275
+ }
276
+
277
+ .mint-instrument-alert-log__filter-row {
278
+ display: flex;
279
+ flex-wrap: wrap;
280
+ gap: 0.3125rem;
281
+ }
282
+
283
+ .mint-instrument-alert-log__filter {
284
+ display: inline-flex;
285
+ align-items: center;
286
+ gap: 0.3125rem;
287
+ border: 1px solid var(--border-color, #e2e8f0);
288
+ border-radius: 999px;
289
+ background: var(--bg-secondary, #f1f5f9);
290
+ color: var(--text-muted, #64748b);
291
+ cursor: pointer;
292
+ font-size: 0.6875rem;
293
+ font-weight: 600;
294
+ opacity: 0.56;
295
+ padding: 0.1875rem 0.5rem;
296
+ transition: opacity 150ms ease-out, border-color 150ms ease-out, background 150ms ease-out;
297
+ }
298
+
299
+ .mint-instrument-alert-log__filter--active {
300
+ border-color: var(--filter-color, var(--border-color, #e2e8f0));
301
+ background: color-mix(in srgb, var(--filter-color, transparent) 8%, var(--bg-secondary, #f1f5f9));
302
+ color: var(--text-primary, #0f172a);
303
+ opacity: 1;
304
+ }
305
+
306
+ .mint-instrument-alert-log__filter:hover {
307
+ opacity: 0.86;
308
+ }
309
+
310
+ .mint-instrument-alert-log__filter--active:hover {
311
+ opacity: 1;
312
+ }
313
+
314
+ .mint-instrument-alert-log__filter-dot {
315
+ width: 0.375rem;
316
+ height: 0.375rem;
317
+ flex: 0 0 auto;
318
+ border-radius: 999px;
319
+ }
320
+
321
+ .mint-instrument-alert-log__filter-count {
322
+ min-width: 0.875rem;
323
+ color: var(--text-muted, #64748b);
324
+ font-family: var(--font-mono, 'Fira Code', monospace);
325
+ font-size: 0.625rem;
326
+ text-align: center;
327
+ }
328
+
329
+ .mint-instrument-alert-log__list {
330
+ display: flex;
331
+ min-height: 0;
332
+ flex: 1 1 auto;
333
+ flex-direction: column;
334
+ gap: 0.5rem;
335
+ overflow-y: auto;
336
+ padding: 0.5rem;
337
+ }
338
+
339
+ .mint-instrument-alert {
340
+ border-left: 3px solid transparent;
341
+ border-radius: 0.375rem;
342
+ font-size: 0.8125rem;
343
+ line-height: 1.4;
344
+ padding: 0.625rem 0.75rem;
345
+ transition: opacity 150ms ease-out;
346
+ }
347
+
348
+ .mint-instrument-alert--critical {
349
+ border-left-color: var(--mint-error, #ef4444);
350
+ background: color-mix(in srgb, var(--mint-error, #ef4444) 8%, transparent);
351
+ }
352
+
353
+ .mint-instrument-alert--warning {
354
+ border-left-color: var(--mint-warning, #eab308);
355
+ background: color-mix(in srgb, var(--mint-warning, #eab308) 8%, transparent);
356
+ }
357
+
358
+ .mint-instrument-alert--info {
359
+ border-left-color: var(--mint-info, #3b82f6);
360
+ background: color-mix(in srgb, var(--mint-info, #3b82f6) 6%, transparent);
361
+ }
362
+
363
+ .mint-instrument-alert--acknowledged {
364
+ opacity: 0.52;
365
+ }
366
+
367
+ .mint-instrument-alert__header {
368
+ gap: 0.375rem;
369
+ margin-bottom: 0.1875rem;
370
+ min-width: 0;
371
+ }
372
+
373
+ .mint-instrument-alert__instrument {
374
+ min-width: 0;
375
+ overflow: hidden;
376
+ color: var(--text-primary, #0f172a);
377
+ font-size: 0.8125rem;
378
+ font-weight: 700;
379
+ text-overflow: ellipsis;
380
+ white-space: nowrap;
381
+ }
382
+
383
+ .mint-instrument-alert__source {
384
+ border: 1px solid var(--border-color, #e2e8f0);
385
+ border-radius: 0.1875rem;
386
+ background: var(--bg-secondary, #f1f5f9);
387
+ color: var(--text-muted, #64748b);
388
+ flex: 0 0 auto;
389
+ font-size: 0.625rem;
390
+ font-weight: 700;
391
+ letter-spacing: 0.02em;
392
+ padding: 0 0.25rem;
393
+ }
394
+
395
+ .mint-instrument-alert__time {
396
+ flex: 0 0 auto;
397
+ margin-left: auto;
398
+ color: var(--text-muted, #64748b);
399
+ font-family: var(--font-mono, 'Fira Code', monospace);
400
+ font-size: 0.6875rem;
401
+ }
402
+
403
+ .mint-instrument-alert__detail {
404
+ color: var(--text-secondary, #475569);
405
+ font-size: 0.8125rem;
406
+ line-height: 1.5;
407
+ overflow-wrap: break-word;
408
+ }
409
+
410
+ .mint-instrument-alert__footer {
411
+ gap: 0.5rem;
412
+ margin-top: 0.375rem;
413
+ }
414
+
415
+ .mint-instrument-alert__code,
416
+ .mint-instrument-alert__ack {
417
+ border: 1px solid var(--border-color, #e2e8f0);
418
+ border-radius: 0.25rem;
419
+ background: var(--bg-secondary, #f1f5f9);
420
+ color: var(--text-muted, #64748b);
421
+ font-size: 0.6875rem;
422
+ padding: 0.25rem 0.5rem;
423
+ }
424
+
425
+ .mint-instrument-alert__code {
426
+ font-family: var(--font-mono, 'Fira Code', monospace);
427
+ font-weight: 700;
428
+ }
429
+
430
+ .mint-instrument-alert__ack {
431
+ cursor: pointer;
432
+ transition: background 150ms ease-out, color 150ms ease-out;
433
+ }
434
+
435
+ .mint-instrument-alert__ack:hover {
436
+ background: var(--bg-primary, #fff);
437
+ color: var(--text-primary, #0f172a);
438
+ }
439
+
440
+ .mint-instrument-alert-log__empty {
441
+ color: var(--text-muted, #64748b);
442
+ font-size: 0.8125rem;
443
+ padding: 2rem 1rem;
444
+ text-align: center;
445
+ }
446
+
447
+ .mint-instrument-alert-enter-active {
448
+ transition: opacity 0.2s ease-out;
449
+ }
450
+
451
+ .mint-instrument-alert-leave-active {
452
+ transition: opacity 0.15s ease-in;
453
+ }
454
+
455
+ .mint-instrument-alert-enter-from,
456
+ .mint-instrument-alert-leave-to {
457
+ opacity: 0;
458
+ }
459
+
460
+ @keyframes mint-instrument-pulse {
461
+ 0%, 100% {
462
+ opacity: 1;
463
+ box-shadow: 0 0 0 0 currentColor;
464
+ }
465
+ 50% {
466
+ opacity: 0.72;
467
+ box-shadow: 0 0 0 3px transparent;
468
+ }
469
+ }
470
+
471
+ @media (prefers-reduced-motion: reduce) {
472
+ .mint-instrument-state__dot,
473
+ .mint-instrument-alert-enter-active,
474
+ .mint-instrument-alert-leave-active {
475
+ animation: none;
476
+ transition: none;
477
+ }
478
+ }
@@ -0,0 +1,189 @@
1
+ .mint-lcms-sequence-table {
2
+ min-width: 0;
3
+ overflow: hidden;
4
+ }
5
+
6
+ .mint-lcms-sequence-table__scroller {
7
+ overflow-x: auto;
8
+ }
9
+
10
+ .mint-lcms-sequence-table__table {
11
+ width: 100%;
12
+ border-collapse: collapse;
13
+ font-size: 0.875rem;
14
+ }
15
+
16
+ .mint-lcms-sequence-table__th,
17
+ .mint-lcms-sequence-table__td,
18
+ .mint-lcms-sequence-table__drag-header,
19
+ .mint-lcms-sequence-table__drag-cell,
20
+ .mint-lcms-sequence-table__actions-header,
21
+ .mint-lcms-sequence-table__actions {
22
+ border-bottom: 1px solid var(--border-light, var(--border-color, #e2e8f0));
23
+ padding: 0.5rem 0.75rem;
24
+ vertical-align: middle;
25
+ }
26
+
27
+ .mint-lcms-sequence-table__th {
28
+ color: var(--text-secondary, #475569);
29
+ font-size: 0.8125rem;
30
+ font-weight: 700;
31
+ text-align: left;
32
+ white-space: nowrap;
33
+ }
34
+
35
+ .mint-lcms-sequence-table__th--right,
36
+ .mint-lcms-sequence-table__td--right {
37
+ text-align: right;
38
+ }
39
+
40
+ .mint-lcms-sequence-table__row {
41
+ transition: background 120ms ease-out, opacity 120ms ease-out, box-shadow 120ms ease-out;
42
+ }
43
+
44
+ .mint-lcms-sequence-table__row:hover {
45
+ background: color-mix(in srgb, var(--mint-info, #3b82f6) 4%, transparent);
46
+ }
47
+
48
+ .mint-lcms-sequence-table__row--dragging {
49
+ opacity: 0.35;
50
+ }
51
+
52
+ .mint-lcms-sequence-table__row--drop-above {
53
+ box-shadow: inset 0 2px 0 0 var(--mint-info, #3b82f6);
54
+ }
55
+
56
+ .mint-lcms-sequence-table__row--drop-below {
57
+ box-shadow: inset 0 -2px 0 0 var(--mint-info, #3b82f6);
58
+ }
59
+
60
+ .mint-lcms-sequence-table__drag-header,
61
+ .mint-lcms-sequence-table__drag-cell {
62
+ width: 1.5rem;
63
+ padding-left: 0.25rem;
64
+ padding-right: 0.25rem;
65
+ }
66
+
67
+ .mint-lcms-sequence-table__drag-handle {
68
+ color: var(--text-muted, #64748b);
69
+ cursor: grab;
70
+ font-family: var(--font-mono, 'Fira Code', monospace);
71
+ font-size: 0.875rem;
72
+ letter-spacing: -0.08em;
73
+ }
74
+
75
+ .mint-lcms-sequence-table__td {
76
+ min-width: 0;
77
+ color: var(--text-primary, #0f172a);
78
+ }
79
+
80
+ .mint-lcms-sequence-table__td--index,
81
+ .mint-lcms-sequence-table__td--file_name,
82
+ .mint-lcms-sequence-table__td--instrument_method,
83
+ .mint-lcms-sequence-table__td--injection_volume {
84
+ font-family: var(--font-mono, 'Fira Code', monospace);
85
+ }
86
+
87
+ .mint-lcms-sequence-table__td--index,
88
+ .mint-lcms-sequence-table__td--instrument_method {
89
+ color: var(--text-muted, #64748b);
90
+ }
91
+
92
+ .mint-lcms-sequence-table__td--file_name,
93
+ .mint-lcms-sequence-table__td--instrument_method {
94
+ max-width: 18rem;
95
+ overflow: hidden;
96
+ text-overflow: ellipsis;
97
+ white-space: nowrap;
98
+ }
99
+
100
+ .mint-lcms-sequence-table__type {
101
+ display: inline-flex;
102
+ align-items: center;
103
+ border-radius: 0.25rem;
104
+ font-size: 0.75rem;
105
+ font-weight: 700;
106
+ line-height: 1.2;
107
+ padding: 0.125rem 0.5rem;
108
+ white-space: nowrap;
109
+ }
110
+
111
+ .mint-lcms-sequence-table__type--blank {
112
+ background: color-mix(in srgb, var(--color-cta, #f97316) 15%, transparent);
113
+ color: var(--color-cta, #f97316);
114
+ }
115
+
116
+ .mint-lcms-sequence-table__type--qc {
117
+ background: color-mix(in srgb, var(--color-purple, #8b5cf6) 15%, transparent);
118
+ color: var(--color-purple, #8b5cf6);
119
+ }
120
+
121
+ .mint-lcms-sequence-table__type--sample {
122
+ background: var(--bg-tertiary, #e2e8f0);
123
+ color: var(--text-secondary, #475569);
124
+ }
125
+
126
+ .mint-lcms-sequence-table__actions-header,
127
+ .mint-lcms-sequence-table__actions {
128
+ width: 4rem;
129
+ padding-left: 0.25rem;
130
+ padding-right: 0.25rem;
131
+ }
132
+
133
+ .mint-lcms-sequence-table__actions {
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: flex-end;
137
+ gap: 0.25rem;
138
+ }
139
+
140
+ .mint-lcms-sequence-table__action {
141
+ display: inline-flex;
142
+ width: 1.375rem;
143
+ height: 1.375rem;
144
+ align-items: center;
145
+ justify-content: center;
146
+ border: 0;
147
+ border-radius: 0.25rem;
148
+ background: transparent;
149
+ color: var(--mint-info, #3b82f6);
150
+ cursor: pointer;
151
+ font-size: 0.875rem;
152
+ font-weight: 700;
153
+ line-height: 1;
154
+ opacity: 0.6;
155
+ transition: background 120ms ease-out, opacity 120ms ease-out;
156
+ }
157
+
158
+ .mint-lcms-sequence-table__action:hover {
159
+ background: color-mix(in srgb, var(--mint-info, #3b82f6) 10%, transparent);
160
+ opacity: 1;
161
+ }
162
+
163
+ .mint-lcms-sequence-table__action--danger {
164
+ color: var(--mint-error, #ef4444);
165
+ }
166
+
167
+ .mint-lcms-sequence-table__action--danger:hover {
168
+ background: color-mix(in srgb, var(--mint-error, #ef4444) 10%, transparent);
169
+ }
170
+
171
+ .mint-lcms-sequence-table__empty,
172
+ .mint-lcms-sequence-table__more {
173
+ color: var(--text-muted, #64748b);
174
+ font-size: 0.875rem;
175
+ padding: 1rem;
176
+ text-align: center;
177
+ }
178
+
179
+ .mint-lcms-sequence-table__more {
180
+ border-top: 1px solid var(--border-color, #e2e8f0);
181
+ padding: 0.625rem 1rem;
182
+ }
183
+
184
+ @media (prefers-reduced-motion: reduce) {
185
+ .mint-lcms-sequence-table__row,
186
+ .mint-lcms-sequence-table__action {
187
+ transition: none;
188
+ }
189
+ }