@morscherlab/mint-sdk 1.4.0-beta.9 → 1.4.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 (198) hide show
  1. package/README.md +14 -3
  2. package/dist/{AlertBox-B2Bgr3ei.js → AlertBox-DwgNTEqf.js} +3 -3
  3. package/dist/{AlertBox-B2Bgr3ei.js.map → AlertBox-DwgNTEqf.js.map} +1 -1
  4. package/dist/{AppSidebar-Dq9W1jE2.js → AppSidebar-CZZaxni0.js} +1103 -144
  5. package/dist/AppSidebar-CZZaxni0.js.map +1 -0
  6. package/dist/{ConfirmDialog-nbJj51is.js → ConfirmDialog-CjWoxAD1.js} +2 -2
  7. package/dist/{ConfirmDialog-nbJj51is.js.map → ConfirmDialog-CjWoxAD1.js.map} +1 -1
  8. package/dist/{ExperimentPopover-5T1fAq2L.js → ExperimentPopover-DujiuQIO.js} +5 -5
  9. package/dist/{ExperimentPopover-5T1fAq2L.js.map → ExperimentPopover-DujiuQIO.js.map} +1 -1
  10. package/dist/{ExperimentSelectorModal-65peG4Up.js → ExperimentSelectorModal-B4j4eUOJ.js} +114 -98
  11. package/dist/ExperimentSelectorModal-B4j4eUOJ.js.map +1 -0
  12. package/dist/{SegmentedControl-BtnnjWzs.js → SegmentedControl-DyUPH3I5.js} +2 -2
  13. package/dist/{SegmentedControl-BtnnjWzs.js.map → SegmentedControl-DyUPH3I5.js.map} +1 -1
  14. package/dist/{SettingsModal-483nyI6b.js → SettingsModal-D2MOOtuO.js} +26 -25
  15. package/dist/SettingsModal-D2MOOtuO.js.map +1 -0
  16. package/dist/__stories__/experiment-helpers.d.ts +10 -0
  17. package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
  18. package/dist/__tests__/components/FloatingPanelsInModal.test.d.ts +1 -0
  19. package/dist/__tests__/composables/useFloatingPanel.test.d.ts +1 -0
  20. package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
  21. package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
  22. package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
  23. package/dist/components/AppTopBar.vue.d.ts +20 -5
  24. package/dist/components/BaseButton.vue.d.ts +4 -2
  25. package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -1
  26. package/dist/components/JobsStatusTray.vue.d.ts +15 -4
  27. package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
  28. package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
  29. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  30. package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
  31. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
  32. package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +2 -2
  33. package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
  34. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
  35. package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
  36. package/dist/composables/useFileImport.d.ts +7 -0
  37. package/dist/composables/useFloatingPanel.d.ts +29 -0
  38. package/dist/composables/useJobCenter.d.ts +41 -3
  39. package/dist/composables/useOnboarding.d.ts +119 -0
  40. package/dist/{controlSchemaModel-B8CTXagP.js → controlSchemaModel-Bsg0t5Ab.js} +2 -2
  41. package/dist/{controlSchemaModel-B8CTXagP.js.map → controlSchemaModel-Bsg0t5Ab.js.map} +1 -1
  42. package/dist/{data-CgILxDLW.js → data-Boeh4uPI.js} +13 -12
  43. package/dist/{data-CgILxDLW.js.map → data-Boeh4uPI.js.map} +1 -1
  44. package/dist/data.d.ts +1 -1
  45. package/dist/data.js +9 -9
  46. package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
  47. package/dist/experiment-DyO54FQB.js.map +1 -0
  48. package/dist/{experimentStatus-Cqp6qNrR.js → experimentStatus-DCn2QKG7.js} +2 -2
  49. package/dist/{experimentStatus-Cqp6qNrR.js.map → experimentStatus-DCn2QKG7.js.map} +1 -1
  50. package/dist/index.js +20 -20
  51. package/dist/{install-BtLWTk6H.js → install-BEHp7Mo-.js} +15 -15
  52. package/dist/{install-BtLWTk6H.js.map → install-BEHp7Mo-.js.map} +1 -1
  53. package/dist/install.js +1 -1
  54. package/dist/{lab-MHzp-_J8.js → lab-D61eaX6f.js} +68 -61
  55. package/dist/{lab-MHzp-_J8.js.map → lab-D61eaX6f.js.map} +1 -1
  56. package/dist/lab.js +4 -4
  57. package/dist/{records-B6gpM_3e.js → records-D4aQXyZu.js} +193 -133
  58. package/dist/records-D4aQXyZu.js.map +1 -0
  59. package/dist/{runtime-7vfl_bI3.js → runtime-q-R0CNLh.js} +400 -33
  60. package/dist/runtime-q-R0CNLh.js.map +1 -0
  61. package/dist/runtime.d.ts +1 -1
  62. package/dist/runtime.js +7 -7
  63. package/dist/{shell-Cs9OJMnm.js → shell-6CGFvUUw.js} +10 -5
  64. package/dist/{shell-Cs9OJMnm.js.map → shell-6CGFvUUw.js.map} +1 -1
  65. package/dist/shell.d.ts +1 -0
  66. package/dist/shell.js +6 -6
  67. package/dist/stores/index.d.ts +1 -1
  68. package/dist/stores/index.js +2 -2
  69. package/dist/stores/settings.d.ts +4 -12
  70. package/dist/styles.css +1191 -479
  71. package/dist/types/components.d.ts +2 -0
  72. package/dist/types/index.d.ts +1 -1
  73. package/dist/types/jobs.d.ts +9 -0
  74. package/dist/types/platform.d.ts +1 -1
  75. package/dist/{useDropdownState-8yWMu-7_.js → useDropdownState-uFIz6Yv8.js} +16 -4
  76. package/dist/useDropdownState-uFIz6Yv8.js.map +1 -0
  77. package/dist/{useExperimentSamples-DHnxKFAF.js → useExperimentSamples-QEFoq4tf.js} +48 -6
  78. package/dist/useExperimentSamples-QEFoq4tf.js.map +1 -0
  79. package/dist/{useListReorder-BitdUhxn.js → useListReorder-DsuzwWGS.js} +122 -172
  80. package/dist/useListReorder-DsuzwWGS.js.map +1 -0
  81. package/dist/{useRackEditor-DiwCt77M.js → useRackEditor-KpZ4iJ6o.js} +22 -32
  82. package/dist/useRackEditor-KpZ4iJ6o.js.map +1 -0
  83. package/dist/useRealtime-B58Lo-Tm.js +508 -0
  84. package/dist/useRealtime-B58Lo-Tm.js.map +1 -0
  85. package/dist/{useRequest-D506eHi8.js → useRequest-BuDmW8Jc.js} +8 -37
  86. package/dist/useRequest-BuDmW8Jc.js.map +1 -0
  87. package/package.json +3 -2
  88. package/src/__stories__/experiment-helpers.ts +3 -3
  89. package/src/__tests__/components/ActionMenu.test.ts +2 -2
  90. package/src/__tests__/components/AppTopBar.test.ts +206 -1
  91. package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
  92. package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
  93. package/src/__tests__/components/BaseButton.test.ts +19 -0
  94. package/src/__tests__/components/BaseModal.test.ts +13 -0
  95. package/src/__tests__/components/ExperimentSelectorModal.test.ts +34 -1
  96. package/src/__tests__/components/FloatingPanelsInModal.test.ts +94 -0
  97. package/src/__tests__/components/GeneratedPluginView.test.ts +1 -1
  98. package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
  99. package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
  100. package/src/__tests__/components/SampleSelector.test.ts +20 -0
  101. package/src/__tests__/components/SettingsModal.test.ts +9 -2
  102. package/src/__tests__/composables/useFileImport.test.ts +36 -0
  103. package/src/__tests__/composables/useFloatingPanel.test.ts +68 -0
  104. package/src/__tests__/composables/useJobCenter.test.ts +262 -3
  105. package/src/__tests__/composables/useOnboarding.test.ts +317 -0
  106. package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
  107. package/src/__tests__/fixtures/table-import/cells.xlsx +0 -0
  108. package/src/__tests__/fixtures/table-import/samples.xlsx +0 -0
  109. package/src/__tests__/stores/settings.test.ts +21 -21
  110. package/src/__tests__/styles/cssTokens.test.ts +4 -1
  111. package/src/__tests__/styles/menusShellRefresh.test.ts +8 -2
  112. package/src/__tests__/styles/paletteTokens.test.ts +44 -0
  113. package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
  114. package/src/components/ActionMenu.vue +6 -37
  115. package/src/components/AppTopBar.onboarding.story.vue +69 -0
  116. package/src/components/AppTopBar.story.vue +59 -4
  117. package/src/components/AppTopBar.vue +132 -10
  118. package/src/components/BaseButton.vue +16 -2
  119. package/src/components/BaseModal.vue +2 -1
  120. package/src/components/ExperimentSelectorModal.story.vue +38 -0
  121. package/src/components/ExperimentSelectorModal.vue +20 -1
  122. package/src/components/GeneratedPluginView.vue +4 -9
  123. package/src/components/GeneratedResultRenderer.vue +3 -4
  124. package/src/components/JobsStatusTray.story.vue +97 -43
  125. package/src/components/JobsStatusTray.vue +287 -290
  126. package/src/components/LayoutResizeHandle.story.vue +65 -4
  127. package/src/components/PluginWorkspaceView.props.ts +3 -0
  128. package/src/components/PluginWorkspaceView.vue +17 -0
  129. package/src/components/SampleSelector.story.vue +21 -6
  130. package/src/components/SampleSelector.vue +10 -3
  131. package/src/components/SectionCard.story.vue +33 -0
  132. package/src/components/SettingsModal.vue +7 -12
  133. package/src/components/Tooltip.vue +9 -32
  134. package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
  135. package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
  136. package/src/components/internal/DatePickerDateInternal.vue +7 -45
  137. package/src/components/internal/DatePickerDateTimeInternal.vue +7 -1
  138. package/src/components/internal/DatePickerTimeInternal.vue +8 -1
  139. package/src/components/internal/NumberUnitInputInternal.vue +4 -18
  140. package/src/components/internal/OnboardingLayerInternal.vue +173 -0
  141. package/src/components/internal/SelectMultipleInternal.vue +6 -1
  142. package/src/components/internal/SelectSearchableInternal.vue +6 -1
  143. package/src/components/internal/WellEditPopupInternal.vue +11 -22
  144. package/src/components/internal/WorkspaceShellInternal.vue +12 -0
  145. package/src/composables/pluginWorkspaceModel.ts +2 -2
  146. package/src/composables/useFileImport.ts +51 -1
  147. package/src/composables/useFloatingPanel.ts +107 -0
  148. package/src/composables/useJobCenter.ts +188 -6
  149. package/src/composables/useOnboarding.ts +465 -0
  150. package/src/composables/usePluginWorkspace.ts +1 -1
  151. package/src/data.ts +1 -0
  152. package/src/runtime.ts +2 -1
  153. package/src/shell.ts +17 -0
  154. package/src/stores/index.ts +0 -2
  155. package/src/stores/settings.ts +20 -50
  156. package/src/styles/components/action-menu.css +1 -1
  157. package/src/styles/components/app-layout.css +6 -3
  158. package/src/styles/components/app-page-selector.css +120 -45
  159. package/src/styles/components/app-top-bar.css +165 -3
  160. package/src/styles/components/button.css +8 -0
  161. package/src/styles/components/dataframe.css +1 -1
  162. package/src/styles/components/date-picker.css +4 -2
  163. package/src/styles/components/datetime-picker.css +4 -4
  164. package/src/styles/components/experiment-selector-modal.css +13 -0
  165. package/src/styles/components/jobs-status-tray.css +134 -296
  166. package/src/styles/components/layout-resize-handle.css +59 -16
  167. package/src/styles/components/modal.css +3 -3
  168. package/src/styles/components/number-input.css +1 -1
  169. package/src/styles/components/onboarding.css +368 -0
  170. package/src/styles/components/progress-bar.css +3 -3
  171. package/src/styles/components/sample-selector.css +43 -0
  172. package/src/styles/components/searchable-select.css +3 -7
  173. package/src/styles/components/section-card.css +30 -6
  174. package/src/styles/components/settings-modal.css +7 -2
  175. package/src/styles/components/time-picker.css +3 -6
  176. package/src/styles/components/toast.css +1 -1
  177. package/src/styles/components/tooltip.css +2 -2
  178. package/src/styles/components/unit-input.css +1 -1
  179. package/src/styles/components/well-edit-popup.css +2 -2
  180. package/src/styles/index.css +1 -0
  181. package/src/styles/variables.css +153 -15
  182. package/src/types/components.ts +2 -0
  183. package/src/types/index.ts +1 -0
  184. package/src/types/jobs.ts +10 -0
  185. package/src/types/platform.ts +1 -1
  186. package/dist/AppSidebar-Dq9W1jE2.js.map +0 -1
  187. package/dist/ExperimentSelectorModal-65peG4Up.js.map +0 -1
  188. package/dist/SettingsModal-483nyI6b.js.map +0 -1
  189. package/dist/experiment-43OJtH7R.js.map +0 -1
  190. package/dist/records-B6gpM_3e.js.map +0 -1
  191. package/dist/runtime-7vfl_bI3.js.map +0 -1
  192. package/dist/useDropdownState-8yWMu-7_.js.map +0 -1
  193. package/dist/useExperimentSamples-DHnxKFAF.js.map +0 -1
  194. package/dist/useListReorder-BitdUhxn.js.map +0 -1
  195. package/dist/useRackEditor-DiwCt77M.js.map +0 -1
  196. package/dist/useRealtime-C3iy9QkU.js +0 -699
  197. package/dist/useRealtime-C3iy9QkU.js.map +0 -1
  198. package/dist/useRequest-D506eHi8.js.map +0 -1
@@ -121,7 +121,7 @@
121
121
  /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
122
122
  12px label indent aligns with the numeric text across all input types. */
123
123
  .mint-number-input__input--sm { padding: 0.25rem 0.625rem; font-size: 0.8125rem; }
124
- .mint-number-input__input--md { padding: 0.375rem 0.75rem; font-size: 0.75rem; }
124
+ .mint-number-input__input--md { padding: 0.375rem 0.75rem; font-size: 0.875rem; }
125
125
  .mint-number-input__input--lg { padding: 0.5rem 1rem; font-size: 1rem; }
126
126
 
127
127
  /* ---------- Unit suffix ---------- */
@@ -0,0 +1,368 @@
1
+ /* Onboarding: the top-bar Help button and checklist chip, the Help panel,
2
+ * the tour layer (scrim, hole, card) and the what's-new dots. */
3
+
4
+ :root {
5
+ --mint-onboarding-scrim: rgba(15, 23, 42, 0.45);
6
+ }
7
+
8
+ html.dark {
9
+ --mint-onboarding-scrim: rgba(2, 6, 23, 0.62);
10
+ }
11
+
12
+ /* ---- Top bar ---- */
13
+
14
+ .mint-onboarding-help {
15
+ position: relative;
16
+ display: inline-flex;
17
+ align-items: center;
18
+ gap: 0.375rem;
19
+ }
20
+
21
+ .mint-topbar__settings-btn--open {
22
+ background: var(--color-primary-soft);
23
+ color: var(--_ink-primary);
24
+ }
25
+
26
+ .mint-onboarding-help__chip {
27
+ display: inline-flex;
28
+ align-items: center;
29
+ gap: 0.375rem;
30
+ height: 2rem;
31
+ padding: 0 0.625rem;
32
+ border: 1px solid var(--border-color);
33
+ border-radius: var(--radius-md);
34
+ background: transparent;
35
+ color: var(--text-primary);
36
+ font: 500 0.8125rem/1 var(--font-sans);
37
+ white-space: nowrap;
38
+ cursor: pointer;
39
+ transition: background-color var(--mint-transition), border-color var(--mint-transition);
40
+ }
41
+
42
+ .mint-onboarding-help__chip:hover {
43
+ background: var(--bg-hover);
44
+ }
45
+
46
+ .mint-onboarding-help__chip--open {
47
+ border-color: var(--color-primary);
48
+ background: var(--color-primary-soft);
49
+ color: var(--_ink-primary);
50
+ }
51
+
52
+ .mint-onboarding-help__chip:focus-visible {
53
+ outline: none;
54
+ box-shadow: var(--focus-ring-offset);
55
+ }
56
+
57
+ .mint-onboarding-help__count {
58
+ color: var(--text-muted);
59
+ font: 500 0.75rem/1 var(--font-mono);
60
+ }
61
+
62
+ .mint-onboarding-help__bar {
63
+ width: 1.75rem;
64
+ height: 3px;
65
+ border-radius: 2px;
66
+ background: var(--bg-tertiary);
67
+ overflow: hidden;
68
+ }
69
+
70
+ .mint-onboarding-help__bar > span {
71
+ display: block;
72
+ height: 100%;
73
+ background: var(--color-primary);
74
+ transition: width var(--mint-transition);
75
+ }
76
+
77
+ .mint-onboarding-help__badge {
78
+ position: absolute;
79
+ top: -4px;
80
+ right: -4px;
81
+ min-width: 16px;
82
+ height: 16px;
83
+ padding: 0 4px;
84
+ box-sizing: border-box;
85
+ border-radius: 8px;
86
+ background: var(--color-primary);
87
+ color: var(--text-on-accent);
88
+ font: 600 11px/16px var(--font-sans);
89
+ text-align: center;
90
+ box-shadow: 0 0 0 2px var(--bg-card);
91
+ }
92
+
93
+ /* ---- Help panel ---- */
94
+
95
+ .mint-onboarding-help__panel {
96
+ position: fixed;
97
+ z-index: var(--mint-z-tray);
98
+ width: 18rem;
99
+ padding: 0 0 4px;
100
+ overflow: hidden;
101
+ }
102
+
103
+ .mint-onboarding-help__header {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+ padding: 0.75rem 0.75rem 0.5rem;
108
+ }
109
+
110
+ .mint-onboarding-help__heading {
111
+ color: var(--text-secondary);
112
+ font-size: 0.6875rem;
113
+ font-weight: 600;
114
+ }
115
+
116
+ .mint-onboarding-help__progress {
117
+ height: 3px;
118
+ margin: 0 0.75rem 0.25rem;
119
+ border-radius: 2px;
120
+ background: var(--bg-tertiary);
121
+ overflow: hidden;
122
+ }
123
+
124
+ .mint-onboarding-help__progress > span {
125
+ display: block;
126
+ height: 100%;
127
+ background: var(--color-primary);
128
+ transition: width var(--mint-transition);
129
+ }
130
+
131
+ .mint-onboarding-help__todos {
132
+ margin: 0;
133
+ padding: 0;
134
+ list-style: none;
135
+ }
136
+
137
+ .mint-onboarding-help__todo {
138
+ display: grid;
139
+ grid-template-columns: 1rem 1fr auto;
140
+ align-items: center;
141
+ gap: 0.5rem;
142
+ min-height: 1.875rem;
143
+ padding: 0 0.75rem;
144
+ color: var(--text-primary);
145
+ font-size: 0.8125rem;
146
+ }
147
+
148
+ .mint-onboarding-help__check {
149
+ display: grid;
150
+ place-items: center;
151
+ width: 1rem;
152
+ height: 1rem;
153
+ box-sizing: border-box;
154
+ border: 1.5px solid var(--border-color);
155
+ border-radius: 50%;
156
+ }
157
+
158
+ .mint-onboarding-help__todo--done .mint-onboarding-help__check {
159
+ border: 0;
160
+ background: var(--color-primary);
161
+ color: var(--text-on-accent);
162
+ }
163
+
164
+ .mint-onboarding-help__todo--done .mint-onboarding-help__todo-title {
165
+ color: var(--text-muted);
166
+ }
167
+
168
+ .mint-onboarding-help__link {
169
+ padding: 0;
170
+ border: 0;
171
+ background: transparent;
172
+ color: var(--_ink-primary);
173
+ font-size: 0.75rem;
174
+ font-weight: 500;
175
+ white-space: nowrap;
176
+ cursor: pointer;
177
+ }
178
+
179
+ .mint-onboarding-help__link:hover {
180
+ text-decoration: underline;
181
+ }
182
+
183
+ .mint-onboarding-help__link:focus-visible {
184
+ outline: none;
185
+ border-radius: var(--radius-sm);
186
+ box-shadow: var(--focus-ring-offset);
187
+ }
188
+
189
+ .mint-onboarding-help__hide {
190
+ display: block;
191
+ text-align: left;
192
+ margin: 0.25rem 0.75rem 0.5rem;
193
+ color: var(--text-secondary);
194
+ }
195
+
196
+ .mint-onboarding-help__section {
197
+ padding: 0.625rem 0.75rem 0.25rem;
198
+ border-top: 1px solid var(--border-color);
199
+ color: var(--text-secondary);
200
+ font-size: 0.6875rem;
201
+ font-weight: 600;
202
+ }
203
+
204
+ .mint-onboarding-help__icon {
205
+ width: 0.8125rem;
206
+ height: 0.8125rem;
207
+ flex-shrink: 0;
208
+ color: var(--text-muted);
209
+ }
210
+
211
+ .mint-onboarding-help__panel > .mint-menu-item {
212
+ width: calc(100% - 8px);
213
+ margin: 0 4px;
214
+ }
215
+
216
+ .mint-onboarding-help__new {
217
+ margin-left: auto;
218
+ padding: 3px 4px;
219
+ border-radius: var(--radius-sm);
220
+ background: var(--color-primary);
221
+ color: var(--text-on-accent);
222
+ font-size: 0.6875rem;
223
+ font-weight: 600;
224
+ line-height: 1;
225
+ }
226
+
227
+ /* ---- Tour layer ---- */
228
+
229
+ .mint-onboarding {
230
+ position: fixed;
231
+ inset: 0;
232
+ z-index: var(--mint-z-tour);
233
+ pointer-events: none;
234
+ }
235
+
236
+ /* Takes every click outside the card. An advanceOn 'click' step cuts the hole out of it. */
237
+ .mint-onboarding__blocker {
238
+ position: absolute;
239
+ inset: 0;
240
+ pointer-events: auto;
241
+ }
242
+
243
+ .mint-onboarding__hole {
244
+ position: fixed;
245
+ border-radius: var(--radius-lg);
246
+ box-shadow: 0 0 0 2px var(--color-primary), 0 0 0 9999px var(--mint-onboarding-scrim);
247
+ pointer-events: none;
248
+ transition: left 200ms ease, top 200ms ease, width 200ms ease, height 200ms ease;
249
+ }
250
+
251
+ .mint-onboarding__card {
252
+ position: fixed;
253
+ display: grid;
254
+ gap: 0.5rem;
255
+ box-sizing: border-box;
256
+ width: 17rem;
257
+ max-width: calc(100vw - 24px);
258
+ padding: 0.875rem;
259
+ border: 1px solid var(--border-color);
260
+ border-radius: var(--radius-lg);
261
+ background: var(--bg-card);
262
+ box-shadow: var(--shadow-lg);
263
+ color: var(--text-primary);
264
+ pointer-events: auto;
265
+ }
266
+
267
+ .mint-onboarding__card:focus {
268
+ outline: none;
269
+ }
270
+
271
+ .mint-onboarding__close {
272
+ position: absolute;
273
+ top: 0.5rem;
274
+ right: 0.5rem;
275
+ display: grid;
276
+ place-items: center;
277
+ width: 1.5rem;
278
+ height: 1.5rem;
279
+ padding: 0;
280
+ border: 0;
281
+ border-radius: var(--radius);
282
+ background: transparent;
283
+ color: var(--text-muted);
284
+ cursor: pointer;
285
+ }
286
+
287
+ .mint-onboarding__close:hover {
288
+ background: var(--bg-hover);
289
+ color: var(--text-primary);
290
+ }
291
+
292
+ .mint-onboarding__close:focus-visible {
293
+ outline: none;
294
+ box-shadow: var(--focus-ring-offset);
295
+ }
296
+
297
+ .mint-onboarding__title {
298
+ margin: 0;
299
+ padding-right: 1.5rem;
300
+ font-size: 0.875rem;
301
+ font-weight: 600;
302
+ }
303
+
304
+ .mint-onboarding__body {
305
+ margin: 0;
306
+ color: var(--text-secondary);
307
+ font-size: 0.8125rem;
308
+ line-height: 1.45;
309
+ }
310
+
311
+ .mint-onboarding__footer {
312
+ display: flex;
313
+ align-items: center;
314
+ justify-content: flex-end;
315
+ gap: 0.375rem;
316
+ margin-top: 0.25rem;
317
+ }
318
+
319
+ .mint-onboarding__count {
320
+ color: var(--text-muted);
321
+ font: 500 0.75rem/1.5rem var(--font-mono);
322
+ margin-top: -0.375rem;
323
+ }
324
+
325
+ /* Read by screen readers only. */
326
+ .mint-onboarding__sr {
327
+ position: absolute;
328
+ width: 1px;
329
+ height: 1px;
330
+ overflow: hidden;
331
+ clip-path: inset(50%);
332
+ white-space: nowrap;
333
+ }
334
+
335
+ .mint-onboarding__hint {
336
+ margin-right: auto;
337
+ color: var(--text-muted);
338
+ font-size: 0.75rem;
339
+ }
340
+
341
+ /* A dot at the top-right corner of an element with unseen news. */
342
+ .mint-onboarding__dot {
343
+ position: fixed;
344
+ z-index: 40;
345
+ width: 8px;
346
+ height: 8px;
347
+ padding: 0;
348
+ border: 0;
349
+ border-radius: 50%;
350
+ background: var(--color-primary);
351
+ box-shadow: 0 0 0 2px var(--bg-card);
352
+ transform: translate(-50%, -50%);
353
+ cursor: pointer;
354
+ }
355
+
356
+ .mint-onboarding__dot:focus-visible {
357
+ outline: none;
358
+ box-shadow: var(--focus-ring-offset);
359
+ }
360
+
361
+ @media (prefers-reduced-motion: reduce) {
362
+ .mint-onboarding-help__chip,
363
+ .mint-onboarding-help__bar > span,
364
+ .mint-onboarding-help__progress > span,
365
+ .mint-onboarding__hole {
366
+ transition: none;
367
+ }
368
+ }
@@ -22,13 +22,13 @@
22
22
  }
23
23
 
24
24
  /* ========================================================================
25
- Rail variant (default) — single filled track, pill ends
25
+ Rail variant (default) — single filled track, square-ish ends (v2: no capsules)
26
26
  ======================================================================== */
27
27
 
28
28
  .mint-progress__track {
29
29
  width: 100%;
30
30
  background-color: var(--bg-tertiary);
31
- border-radius: 9999px; /* pill ends — spec */
31
+ border-radius: var(--radius-sm);
32
32
  overflow: hidden;
33
33
  }
34
34
 
@@ -38,7 +38,7 @@
38
38
 
39
39
  .mint-progress__bar {
40
40
  height: 100%;
41
- border-radius: 9999px;
41
+ border-radius: var(--radius-sm);
42
42
  transition: width 0.3s ease;
43
43
  }
44
44
 
@@ -23,26 +23,69 @@
23
23
  box-sizing: border-box;
24
24
  border-bottom: 1px solid var(--border-light);
25
25
  font-size: 0.8125rem;
26
+ /* The header compacts when it is narrow (sidebars); see the query below. */
27
+ container-type: inline-size;
26
28
  }
27
29
 
28
30
  .mint-sample-selector__title {
31
+ flex-shrink: 0;
32
+ white-space: nowrap;
29
33
  font-weight: 600;
30
34
  color: var(--text-primary);
31
35
  }
32
36
 
33
37
  .mint-sample-selector__selected {
38
+ /* Without the query (or with a long count) the count gives way, never the row. */
39
+ min-width: 0;
40
+ overflow: hidden;
41
+ text-overflow: ellipsis;
42
+ white-space: nowrap;
34
43
  font-size: 0.75rem;
35
44
  font-weight: 500;
36
45
  color: var(--text-muted);
37
46
  }
38
47
 
39
48
  .mint-sample-selector__header-actions {
49
+ flex-shrink: 0;
40
50
  display: flex;
41
51
  align-items: center;
42
52
  gap: 0.125rem;
43
53
  margin-left: auto;
44
54
  }
45
55
 
56
+ .mint-sample-selector__selected-short {
57
+ display: none;
58
+ }
59
+
60
+ /* Narrow selector: the header stays one row and keeps its height. The grouping
61
+ button shows only its icon (the label stays its accessible name and tooltip)
62
+ and the count shortens to "N sel." (screen readers keep "N selected"). */
63
+ /* Measured: the full row (title, "N selected", Smart group, Clear groups) needs
64
+ about 17.55rem of header content width with Fira Sans. */
65
+ @container (max-width: 17.625rem) {
66
+ .mint-sample-selector__group-btn .mint-button__label,
67
+ .mint-sample-selector__selected-full {
68
+ position: absolute;
69
+ width: 1px;
70
+ height: 1px;
71
+ margin: -1px;
72
+ padding: 0;
73
+ overflow: hidden;
74
+ clip: rect(0, 0, 0, 0);
75
+ white-space: nowrap;
76
+ border: 0;
77
+ }
78
+
79
+ .mint-sample-selector__selected-short {
80
+ display: inline;
81
+ }
82
+
83
+ .mint-sample-selector__group-btn {
84
+ min-width: var(--form-height-sm);
85
+ padding-inline: 0.25rem;
86
+ }
87
+ }
88
+
46
89
  .mint-sample-selector__grouped,
47
90
  .mint-sample-selector__flat,
48
91
  .mint-sample-selector__state {
@@ -30,14 +30,10 @@
30
30
  .mint-searchable-select__value { flex: 1; min-width: 0; overflow: hidden; text-align: left; text-overflow: ellipsis; white-space: nowrap; }
31
31
  .mint-searchable-select__value--placeholder { color: var(--text-muted); }
32
32
 
33
- /* Surface = .mint-popover (2d); this alias keeps only placement. */
33
+ /* Surface = .mint-popover (2d). useFloatingPanel sets the fixed position and width. */
34
34
  .mint-searchable-select__panel {
35
- position: absolute;
36
- top: calc(100% + 0.25rem);
37
- right: 0;
38
- left: 0;
39
- z-index: 30;
40
- max-height: min(38rem, 80vh);
35
+ z-index: var(--mint-z-popover);
36
+ max-height: min(38rem, 80vh, var(--mint-floating-available-height, 100vh));
41
37
  overflow: hidden;
42
38
  }
43
39
 
@@ -6,6 +6,11 @@
6
6
  */
7
7
 
8
8
  .mint-section-card {
9
+ /* The left grid that the header and the rows share: header icon (or row
10
+ lead) width, then this gap. Set --mint-section-card-gap on the card to
11
+ change both. */
12
+ --mint-section-card-lead-width: 1rem;
13
+ --mint-section-card-gap: 0.625rem;
9
14
  display: flex;
10
15
  flex-direction: column;
11
16
  border-radius: var(--radius-lg);
@@ -31,10 +36,12 @@
31
36
  .mint-section-card__header {
32
37
  display: flex;
33
38
  align-items: center;
34
- gap: 0.625rem;
39
+ gap: var(--mint-section-card-gap);
35
40
  box-sizing: border-box;
36
41
  min-height: 2.5rem;
37
- padding: 0.375rem 0.625rem 0.375rem 0.75rem;
42
+ /* 4px block padding: a 28px header control plus padding plus the 1px rule
43
+ stays inside the 40px strip (6px made it 41px). */
44
+ padding: 0.25rem 0.625rem 0.25rem 0.75rem;
38
45
  border-bottom: 1px solid var(--border-color);
39
46
  flex-shrink: 0;
40
47
  }
@@ -49,8 +56,8 @@
49
56
  align-items: center;
50
57
  justify-content: center;
51
58
  flex-shrink: 0;
52
- width: 1rem;
53
- height: 1rem;
59
+ width: var(--mint-section-card-lead-width);
60
+ height: var(--mint-section-card-lead-width);
54
61
  color: var(--text-muted);
55
62
  }
56
63
 
@@ -110,12 +117,27 @@
110
117
  .mint-section-card__row {
111
118
  display: flex;
112
119
  align-items: center;
113
- gap: 0.625rem;
120
+ gap: var(--mint-section-card-gap);
114
121
  padding: 0.375rem 0.75rem;
115
122
  background: var(--bg-secondary);
116
123
  transition: background-color var(--mint-transition);
117
124
  }
118
125
 
126
+ /* Leading glyph slot of a row: as wide as the header icon, so the glyph
127
+ * centres under it and the row text starts at the header title. Leave it
128
+ * empty to keep the text on the grid. It is one title line high (1lh at the
129
+ * title size), so a two-line row keeps its glyph on the first line. */
130
+ .mint-section-card__row-lead {
131
+ display: inline-flex;
132
+ align-items: center;
133
+ justify-content: center;
134
+ flex-shrink: 0;
135
+ align-self: flex-start;
136
+ width: var(--mint-section-card-lead-width);
137
+ height: 1lh;
138
+ font-size: 0.8125rem;
139
+ }
140
+
119
141
  a.mint-section-card__row,
120
142
  button.mint-section-card__row {
121
143
  cursor: pointer;
@@ -131,10 +153,12 @@ button.mint-section-card__row:hover {
131
153
  /* Comfortable density gives the header and rows back their height. */
132
154
  [data-density="comfortable"] .mint-section-card__header {
133
155
  min-height: 2.75rem;
134
- padding: 0.5rem 0.75rem 0.5rem 0.875rem;
156
+ padding: 0.25rem 0.75rem 0.25rem 0.875rem;
135
157
  }
136
158
 
137
159
  [data-density="comfortable"] .mint-section-card__row {
138
160
  padding-top: 0.5rem;
139
161
  padding-bottom: 0.5rem;
162
+ /* Same left inset as the header, so row content lines up under the header. */
163
+ padding-left: 0.875rem;
140
164
  }
@@ -37,6 +37,12 @@
37
37
  border-bottom-color: var(--border-color);
38
38
  }
39
39
 
40
+ /* The pane ends after the last group's last row: no closing hairline there,
41
+ it would sit on the footer rule with nothing between them. */
42
+ .mint-settings-modal__group:last-of-type > .mint-settings-modal__group-grid > .mint-settings-modal__row:last-child {
43
+ border-bottom: none;
44
+ }
45
+
40
46
  /* The field cell anchors the ↺ reset, which sits just left of the control (5d).
41
47
  --_settings-control-w is the control's width; stacked fields (text, custom slots)
42
48
  keep 0 and put the reset at the right end of their label line. */
@@ -655,10 +661,9 @@
655
661
  .mint-settings-modal__density-preview {
656
662
  --_density-row: 2.125rem;
657
663
 
664
+ /* A hairline table in the setting row, not a bordered box inside the modal. */
658
665
  grid-column: 1 / -1;
659
666
  overflow: hidden;
660
- border: 1px solid var(--border-color);
661
- border-radius: var(--radius-md);
662
667
  font-size: 0.75rem;
663
668
  }
664
669
 
@@ -124,13 +124,10 @@
124
124
  height: 0.875rem;
125
125
  }
126
126
 
127
- /* Dropdown — placement only; the look is .mint-popover. Spans the field width. */
127
+ /* Dropdown — the look is .mint-popover; useFloatingPanel sets the fixed position and the field width. */
128
128
  .mint-time-picker__dropdown {
129
- position: absolute;
130
- z-index: 50;
131
- margin-top: 0.25rem;
132
- width: 100%;
133
- min-width: 100%;
129
+ z-index: var(--mint-z-popover);
130
+ max-height: var(--mint-floating-available-height, none);
134
131
  overflow: hidden;
135
132
  }
136
133
 
@@ -5,7 +5,7 @@
5
5
  /* AppTopBar publishes its bottom edge + 1rem so toasts clear its controls. */
6
6
  top: var(--mint-toast-offset-top, 1rem);
7
7
  right: 1rem;
8
- z-index: 9999;
8
+ z-index: var(--mint-z-toast);
9
9
  display: flex;
10
10
  flex-direction: column;
11
11
  gap: 0.5rem;
@@ -5,8 +5,8 @@
5
5
  }
6
6
 
7
7
  .mint-tooltip__content {
8
- position: absolute;
9
- z-index: 9999;
8
+ position: fixed;
9
+ z-index: var(--mint-z-toast);
10
10
  display: inline-flex;
11
11
  align-items: center;
12
12
  gap: 0.5rem;
@@ -140,7 +140,7 @@ button.mint-unit-input__unit:focus-visible {
140
140
 
141
141
  .mint-unit-input__menu {
142
142
  position: fixed;
143
- z-index: 1000;
143
+ z-index: var(--mint-z-popover);
144
144
  width: 148px;
145
145
  }
146
146
 
@@ -5,12 +5,12 @@
5
5
  .mint-well-edit-popup__backdrop {
6
6
  position: fixed;
7
7
  inset: 0;
8
- z-index: 40;
8
+ z-index: calc(var(--mint-z-popover) - 1);
9
9
  }
10
10
 
11
11
  .mint-well-edit-popup {
12
12
  position: fixed;
13
- z-index: 50;
13
+ z-index: var(--mint-z-popover);
14
14
  width: 300px;
15
15
  padding: 0;
16
16
  overflow: hidden;
@@ -29,6 +29,7 @@
29
29
  @import './components/input.css';
30
30
  @import './components/modal.css';
31
31
  @import './components/number-input.css';
32
+ @import './components/onboarding.css';
32
33
  @import './components/plate-editor.css';
33
34
  @import './components/radio-group.css';
34
35
  @import './components/section-card.css';