@allurereport/web-awesome 3.8.1 → 3.9.0

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 (207) hide show
  1. package/README.md +112 -0
  2. package/allurerc-dev.mjs +10 -0
  3. package/dist/multi/121.app-d36b0855e3e7a53eeee9.js +1 -0
  4. package/dist/multi/173.app-d36b0855e3e7a53eeee9.js +1 -0
  5. package/dist/multi/174.app-d36b0855e3e7a53eeee9.js +1 -0
  6. package/dist/multi/252.app-d36b0855e3e7a53eeee9.js +1 -0
  7. package/dist/multi/282.app-d36b0855e3e7a53eeee9.js +1 -0
  8. package/dist/multi/29.app-d36b0855e3e7a53eeee9.js +1 -0
  9. package/dist/multi/310.app-d36b0855e3e7a53eeee9.js +1 -0
  10. package/dist/multi/{416.app-200938be3feda27d7b80.js → 416.app-d36b0855e3e7a53eeee9.js} +1 -1
  11. package/dist/multi/{507.app-200938be3feda27d7b80.js → 507.app-d36b0855e3e7a53eeee9.js} +1 -1
  12. package/dist/multi/527.app-d36b0855e3e7a53eeee9.js +1 -0
  13. package/dist/multi/600.app-d36b0855e3e7a53eeee9.js +1 -0
  14. package/dist/multi/605.app-d36b0855e3e7a53eeee9.js +1 -0
  15. package/dist/multi/638.app-d36b0855e3e7a53eeee9.js +1 -0
  16. package/dist/multi/672.app-d36b0855e3e7a53eeee9.js +1 -0
  17. package/dist/multi/686.app-d36b0855e3e7a53eeee9.js +1 -0
  18. package/dist/multi/725.app-d36b0855e3e7a53eeee9.js +1 -0
  19. package/dist/multi/741.app-d36b0855e3e7a53eeee9.js +1 -0
  20. package/dist/multi/749.app-d36b0855e3e7a53eeee9.js +1 -0
  21. package/dist/multi/755.app-d36b0855e3e7a53eeee9.js +1 -0
  22. package/dist/multi/779.app-d36b0855e3e7a53eeee9.js +1 -0
  23. package/dist/multi/{894.app-200938be3feda27d7b80.js → 894.app-d36b0855e3e7a53eeee9.js} +1 -1
  24. package/dist/multi/943.app-d36b0855e3e7a53eeee9.js +1 -0
  25. package/dist/multi/980.app-d36b0855e3e7a53eeee9.js +1 -0
  26. package/dist/multi/app-d36b0855e3e7a53eeee9.js +2 -0
  27. package/dist/multi/manifest.json +26 -23
  28. package/dist/multi/styles-212da6c68fa0beb4c6c5.css +1 -0
  29. package/dist/multi/styles-468416ffee9a9dea6cae.css +58 -0
  30. package/dist/multi/styles-5c882b14b6f3112e40c4.css +1 -0
  31. package/dist/single/app-62171f5f51b5954a787c.js +2 -0
  32. package/dist/single/manifest.json +1 -1
  33. package/package.json +13 -8
  34. package/src/assets/scss/_common.scss +2 -2
  35. package/src/assets/scss/index.scss +8 -6
  36. package/src/components/BaseLayout/index.tsx +14 -2
  37. package/src/components/BaseLayout/styles.scss +5 -5
  38. package/src/components/Categories/CategoryHeaderItem/styles.scss +2 -2
  39. package/src/components/Categories/CategoryTreeItem/styles.scss +2 -2
  40. package/src/components/Categories/GroupTreeItem/styles.scss +4 -5
  41. package/src/components/Categories/HistoryTreeItem/styles.scss +2 -2
  42. package/src/components/Categories/LabelTreeItem/styles.scss +2 -2
  43. package/src/components/Categories/MessageTreeItem/index.tsx +1 -1
  44. package/src/components/Categories/MessageTreeItem/styles.scss +18 -18
  45. package/src/components/Categories/sticky.ts +1 -1
  46. package/src/components/Footer/styles.scss +2 -2
  47. package/src/components/Header/CiInfo/styles.scss +1 -1
  48. package/src/components/Header/styles.scss +2 -2
  49. package/src/components/HotkeysProvider/index.tsx +556 -0
  50. package/src/components/KeyboardShortcuts/index.tsx +73 -0
  51. package/src/components/KeyboardShortcuts/shortcutsConfig.ts +91 -0
  52. package/src/components/KeyboardShortcuts/styles.scss +69 -0
  53. package/src/components/MainReport/index.tsx +89 -72
  54. package/src/components/MainReport/styles.scss +40 -4
  55. package/src/components/Metadata/styles.scss +9 -9
  56. package/src/components/MetadataButton/index.tsx +2 -0
  57. package/src/components/MetadataButton/styles.scss +1 -1
  58. package/src/components/NavTabs/styles.scss +8 -8
  59. package/src/components/ReportBody/index.tsx +11 -2
  60. package/src/components/ReportBody/styles.scss +24 -4
  61. package/src/components/ReportCategories/styles.scss +1 -1
  62. package/src/components/ReportFilters/styles.scss +1 -1
  63. package/src/components/ReportGlobalAttachments/styles.scss +1 -1
  64. package/src/components/ReportGlobalErrors/styles.scss +1 -1
  65. package/src/components/ReportHeader/styles.scss +2 -2
  66. package/src/components/ReportMetadata/index.tsx +9 -11
  67. package/src/components/ReportMetadata/styles.scss +6 -6
  68. package/src/components/ReportQualityGateResults/styles.scss +2 -2
  69. package/src/components/ReportSearch/index.tsx +1 -5
  70. package/src/components/ReportTabs/styles.scss +9 -9
  71. package/src/components/SectionSwitcher/index.tsx +87 -10
  72. package/src/components/SideBySide/index.tsx +20 -2
  73. package/src/components/SideBySide/styles.scss +9 -1
  74. package/src/components/SplitLayout/index.tsx +10 -1
  75. package/src/components/SplitLayout/styles.scss +20 -4
  76. package/src/components/TestResult/TestStepsEmpty/styles.scss +1 -1
  77. package/src/components/TestResult/TrDescription/styles.scss +1 -1
  78. package/src/components/TestResult/TrDropdown/index.tsx +2 -2
  79. package/src/components/TestResult/TrDropdown/styles.scss +1 -1
  80. package/src/components/TestResult/TrEmpty/styles.scss +1 -1
  81. package/src/components/TestResult/TrEnvironmentItem/styles.scss +4 -4
  82. package/src/components/TestResult/TrError/index.tsx +32 -7
  83. package/src/components/TestResult/TrError/styles.scss +23 -23
  84. package/src/components/TestResult/TrHeader/styles.scss +2 -2
  85. package/src/components/TestResult/TrHistory/styles.scss +6 -6
  86. package/src/components/TestResult/TrInfo/styles.scss +8 -8
  87. package/src/components/TestResult/TrLinks/index.tsx +2 -2
  88. package/src/components/TestResult/TrLinks/styles.scss +2 -2
  89. package/src/components/TestResult/TrMetadata/index.tsx +1 -1
  90. package/src/components/TestResult/TrMetadata/styles.scss +1 -1
  91. package/src/components/TestResult/TrNavigation/index.tsx +1 -1
  92. package/src/components/TestResult/TrNavigation/styles.scss +2 -2
  93. package/src/components/TestResult/TrOverview.tsx +2 -0
  94. package/src/components/TestResult/TrParameters/index.tsx +1 -1
  95. package/src/components/TestResult/TrParameters/styles.scss +1 -1
  96. package/src/components/TestResult/TrPrevStatuses/styles.scss +8 -8
  97. package/src/components/TestResult/TrPwTraces/openPwTraceInNewTab.ts +2 -2
  98. package/src/components/TestResult/TrPwTraces/styles.scss +1 -1
  99. package/src/components/TestResult/TrRetriesView/styles.scss +3 -3
  100. package/src/components/TestResult/TrSetup/index.tsx +9 -3
  101. package/src/components/TestResult/TrSeverity/styles.scss +7 -7
  102. package/src/components/TestResult/TrStatus/styles.scss +2 -35
  103. package/src/components/TestResult/TrSteps/TrAttachment.tsx +79 -43
  104. package/src/components/TestResult/TrSteps/TrAttachmentInfo.tsx +44 -17
  105. package/src/components/TestResult/TrSteps/TrErrorStep.tsx +3 -0
  106. package/src/components/TestResult/TrSteps/TrStep.tsx +9 -4
  107. package/src/components/TestResult/TrSteps/TrStepHeader.tsx +8 -5
  108. package/src/components/TestResult/TrSteps/index.tsx +7 -4
  109. package/src/components/TestResult/TrSteps/stepTreeExpansion.ts +27 -9
  110. package/src/components/TestResult/TrSteps/styles.scss +80 -20
  111. package/src/components/TestResult/TrTeardown/index.tsx +9 -3
  112. package/src/components/TestResult/bodyItems.ts +1 -1
  113. package/src/components/TestResult/index.tsx +8 -2
  114. package/src/components/TestResult/styles.scss +10 -1
  115. package/src/components/TestResult/trOverviewFocus.scss +4 -0
  116. package/src/components/Timeline/styles.scss +6 -6
  117. package/src/components/Tree/index.tsx +54 -5
  118. package/src/components/Tree/styles.scss +55 -35
  119. package/src/hooks/useTestResultOverviewFocusScroll.ts +23 -0
  120. package/src/index.html +30 -33
  121. package/src/index.tsx +12 -6
  122. package/src/locales/ar.json +61 -1
  123. package/src/locales/az.json +61 -1
  124. package/src/locales/de.json +61 -1
  125. package/src/locales/en.json +61 -1
  126. package/src/locales/es.json +61 -1
  127. package/src/locales/fr.json +61 -1
  128. package/src/locales/he.json +61 -1
  129. package/src/locales/hy.json +61 -1
  130. package/src/locales/it.json +61 -1
  131. package/src/locales/ja.json +61 -1
  132. package/src/locales/ka.json +61 -1
  133. package/src/locales/kr.json +61 -1
  134. package/src/locales/nl.json +61 -1
  135. package/src/locales/pl.json +61 -1
  136. package/src/locales/pt.json +61 -1
  137. package/src/locales/ru.json +61 -1
  138. package/src/locales/sv.json +61 -1
  139. package/src/locales/tr.json +61 -1
  140. package/src/locales/uk.json +61 -1
  141. package/src/locales/zh-TW.json +61 -1
  142. package/src/locales/zh.json +61 -1
  143. package/src/stores/keyboard.ts +371 -0
  144. package/src/stores/keyboardActions.ts +769 -0
  145. package/src/stores/locale.ts +1 -0
  146. package/src/stores/reportEnvSections.ts +6 -0
  147. package/src/stores/reportRootTabs.ts +95 -0
  148. package/src/stores/search.ts +147 -0
  149. package/src/stores/testResultOverviewNav.ts +119 -0
  150. package/src/stores/testResultTabs.ts +62 -0
  151. package/src/stores/timeline.ts +1 -1
  152. package/src/stores/tree.ts +42 -4
  153. package/src/stores/treeFilters/store.ts +3 -36
  154. package/src/styles/_pane-active.scss +8 -0
  155. package/src/styles.scss +1 -1
  156. package/src/utils/flattenTestResultOverview.ts +182 -0
  157. package/src/utils/trOverviewFocus.ts +18 -0
  158. package/test/components/EnvironmentPicker.test.tsx +21 -3
  159. package/test/components/Header/CiInfo.test.tsx +8 -0
  160. package/test/components/Header.test.tsx +8 -0
  161. package/test/components/ReportGlobals.test.tsx +9 -1
  162. package/test/components/TestResult/PwTraceButton.test.tsx +8 -0
  163. package/test/components/TestResult/TrErrorStep.test.tsx +8 -0
  164. package/test/components/TestResult/TrOverview.test.tsx +30 -10
  165. package/test/components/TestResult/TrSteps.test.tsx +73 -0
  166. package/test/components/TestResult/bodyItems.test.ts +9 -1
  167. package/test/components/TestResult/openPwTraceInNewTab.test.ts +8 -0
  168. package/test/components/TestResult/stepTreeExpansion.test.ts +10 -2
  169. package/test/components/Timeline.test.tsx +15 -7
  170. package/test/stores/keyboard/keyboardActions.test.ts +615 -0
  171. package/test/stores/search.test.ts +143 -0
  172. package/test/stores/treeFilters/actions.test.ts +8 -0
  173. package/test/utils/flattenTestResultOverview.test.ts +57 -0
  174. package/test/utils/ownerAddress.test.ts +9 -1
  175. package/test/utils/treeFilters.test.ts +9 -1
  176. package/types.d.ts +17 -0
  177. package/webpack.config.js +3 -0
  178. package/CONTRIBUTING.md +0 -34
  179. package/dist/multi/173.app-200938be3feda27d7b80.js +0 -1
  180. package/dist/multi/174.app-200938be3feda27d7b80.js +0 -1
  181. package/dist/multi/252.app-200938be3feda27d7b80.js +0 -1
  182. package/dist/multi/282.app-200938be3feda27d7b80.js +0 -1
  183. package/dist/multi/29.app-200938be3feda27d7b80.js +0 -1
  184. package/dist/multi/310.app-200938be3feda27d7b80.js +0 -1
  185. package/dist/multi/527.app-200938be3feda27d7b80.js +0 -1
  186. package/dist/multi/600.app-200938be3feda27d7b80.js +0 -1
  187. package/dist/multi/605.app-200938be3feda27d7b80.js +0 -1
  188. package/dist/multi/638.app-200938be3feda27d7b80.js +0 -1
  189. package/dist/multi/672.app-200938be3feda27d7b80.js +0 -1
  190. package/dist/multi/686.app-200938be3feda27d7b80.js +0 -1
  191. package/dist/multi/725.app-200938be3feda27d7b80.js +0 -1
  192. package/dist/multi/741.app-200938be3feda27d7b80.js +0 -1
  193. package/dist/multi/749.app-200938be3feda27d7b80.js +0 -1
  194. package/dist/multi/755.app-200938be3feda27d7b80.js +0 -1
  195. package/dist/multi/943.app-200938be3feda27d7b80.js +0 -1
  196. package/dist/multi/980.app-200938be3feda27d7b80.js +0 -1
  197. package/dist/multi/app-200938be3feda27d7b80.js +0 -2
  198. package/dist/multi/styles-9f7a23a0c8b79fa76981.css +0 -58
  199. package/dist/single/app-17629d1b119f6c611d49.js +0 -2
  200. package/src/assets/scss/day.scss +0 -53
  201. package/src/assets/scss/fonts.scss +0 -3
  202. package/src/assets/scss/night.scss +0 -63
  203. package/src/assets/scss/palette.scss +0 -393
  204. package/src/assets/scss/theme.scss +0 -330
  205. package/src/assets/scss/vars.scss +0 -11
  206. /package/dist/multi/{app-200938be3feda27d7b80.js.LICENSE.txt → app-d36b0855e3e7a53eeee9.js.LICENSE.txt} +0 -0
  207. /package/dist/single/{app-17629d1b119f6c611d49.js.LICENSE.txt → app-62171f5f51b5954a787c.js.LICENSE.txt} +0 -0
@@ -4,7 +4,7 @@
4
4
  padding-right: 24px;
5
5
 
6
6
  &:not(:first-child) {
7
- border-top: 1px solid var(--on-border-muted);
7
+ border-top: 1px solid var(--color-border-subtle);
8
8
  }
9
9
  }
10
10
 
@@ -14,14 +14,14 @@
14
14
 
15
15
  .test-result-step {
16
16
  &:not(:first-child) {
17
- border-top: 1px solid var(--on-border-muted);
17
+ border-top: 1px solid var(--color-border-subtle);
18
18
  }
19
19
  }
20
20
 
21
21
  .test-result-step-content {
22
22
  padding-left: 24px;
23
23
  margin-bottom: 12px;
24
- border-top: 1px solid var(--on-border-muted);
24
+ border-top: 1px solid var(--color-border-subtle);
25
25
  min-width: 0;
26
26
  }
27
27
 
@@ -30,7 +30,20 @@
30
30
  }
31
31
 
32
32
  .test-result-attachment-content {
33
+ border-top: 1px solid var(--color-border-subtle);
34
+ }
35
+
36
+ button.test-result-attachment-content {
37
+ appearance: none;
38
+ background: transparent;
39
+ border: 0;
33
40
  border-top: 1px solid var(--on-border-muted);
41
+ color: inherit;
42
+ cursor: pointer;
43
+ display: block;
44
+ padding: 0;
45
+ text-align: inherit;
46
+ width: 100%;
34
47
  }
35
48
 
36
49
  .test-result-attachment-content-wrapper {
@@ -51,7 +64,7 @@
51
64
  min-height: 32px;
52
65
 
53
66
  &:hover {
54
- background: var(--bg-control-flat-medium);
67
+ background: var(--color-row-bg-hover);
55
68
  }
56
69
  }
57
70
 
@@ -81,7 +94,7 @@
81
94
  }
82
95
 
83
96
  .test-result-step-number {
84
- color: var(--on-text-hint);
97
+ color: var(--color-text-muted);
85
98
  min-width: 16px;
86
99
  text-align: center;
87
100
  box-sizing: content-box;
@@ -90,7 +103,7 @@
90
103
  .item-time {
91
104
  flex: none;
92
105
  margin-left: auto;
93
- color: var(--on-text-hint);
106
+ color: var(--color-text-muted);
94
107
  line-height: 20px;
95
108
  min-width: 56px;
96
109
  text-align: right;
@@ -99,7 +112,7 @@
99
112
  .item-info {
100
113
  display: flex;
101
114
  gap: 8px;
102
- color: var(--on-text-secondary);
115
+ color: var(--color-text-secondary);
103
116
  align-items: center;
104
117
  flex: 0 0 auto;
105
118
  }
@@ -108,7 +121,7 @@
108
121
  display: flex;
109
122
  align-items: center;
110
123
  gap: 4px;
111
- color: var(--on-icon-secondary);
124
+ color: var(--color-icon-secondary);
112
125
  min-width: 56px;
113
126
  justify-content: flex-end;
114
127
  }
@@ -120,7 +133,7 @@
120
133
  }
121
134
 
122
135
  .item-info-step-icon {
123
- color: var(--on-icon-secondary);
136
+ color: var(--color-icon-secondary);
124
137
  }
125
138
 
126
139
  .test-result-step-chevron {
@@ -146,7 +159,26 @@
146
159
  }
147
160
 
148
161
  &:hover {
149
- background: var(--bg-control-flat-medium);
162
+ background: var(--color-row-bg-hover);
163
+ }
164
+ }
165
+
166
+ .test-result-attachment-toggle {
167
+ appearance: none;
168
+ border: 0;
169
+ background: transparent;
170
+ color: inherit;
171
+ display: flex;
172
+ align-items: center;
173
+ gap: 4px;
174
+ flex: 1 1 auto;
175
+ min-width: 0;
176
+ padding: 0;
177
+ font: inherit;
178
+ text-align: left;
179
+
180
+ &:not(:disabled) {
181
+ cursor: pointer;
150
182
  }
151
183
  }
152
184
 
@@ -160,7 +192,7 @@
160
192
  }
161
193
 
162
194
  .test-result-attachment-icon {
163
- color: var(--on-icon-secondary);
195
+ color: var(--color-icon-secondary);
164
196
  padding: 2px 4px;
165
197
  height: max-content;
166
198
  }
@@ -210,11 +242,39 @@
210
242
  }
211
243
 
212
244
  .item-button {
213
- color: var(--bg-control-flat);
245
+ flex: none;
246
+ color: var(--color-control-bg-ghost);
214
247
  }
215
248
 
216
- .item-button-syntax-off {
217
- opacity: 0.5;
249
+ .item-buttons {
250
+ :global(button),
251
+ :global(a) {
252
+ --allure-btn-icon-color: var(--color-icon-primary);
253
+ --allure-btn-trailing-icon-color: var(--color-icon-primary);
254
+ color: var(--color-icon-primary);
255
+ }
256
+
257
+ :global(button) :global(svg),
258
+ :global(a) :global(svg) {
259
+ opacity: 1;
260
+ }
261
+
262
+ :global(button) :global(path),
263
+ :global(a) :global(path) {
264
+ stroke-opacity: 1;
265
+ fill-opacity: 1;
266
+ }
267
+
268
+ .item-button-active {
269
+ --allure-btn-bg-color: var(--color-control-bg-ghost-hover);
270
+ background-color: var(--color-control-bg-ghost-hover);
271
+ border-radius: 4px;
272
+ }
273
+
274
+ .item-button-syntax-off {
275
+ --allure-btn-bg-color: var(--color-control-bg-ghost);
276
+ opacity: 0.5;
277
+ }
218
278
  }
219
279
 
220
280
  .wrong-attachment-sign {
@@ -224,7 +284,7 @@
224
284
  }
225
285
 
226
286
  .test-result-attachment-missed {
227
- color: var(--on-text-secondary);
287
+ color: var(--color-text-secondary);
228
288
  line-height: 20px;
229
289
  margin-right: auto;
230
290
  padding-top: 2px;
@@ -255,23 +315,23 @@
255
315
 
256
316
  .item-status-icon {
257
317
  &.status-passed {
258
- color: var(--bg-support-castor);
318
+ color: var(--color-status-passed-chart);
259
319
  }
260
320
 
261
321
  &.status-failed {
262
- color: var(--bg-support-capella);
322
+ color: var(--color-status-failed-chart);
263
323
  }
264
324
 
265
325
  &.status-broken {
266
- color: var(--bg-support-atlas);
326
+ color: var(--color-status-broken-chart);
267
327
  }
268
328
 
269
329
  &.status-skipped {
270
- color: var(--bg-support-rau);
330
+ color: var(--color-status-skipped-chart);
271
331
  }
272
332
 
273
333
  &.status-unknown {
274
- color: var(--bg-support-skat);
334
+ color: var(--color-status-unknown-chart);
275
335
  }
276
336
  }
277
337
 
@@ -8,6 +8,7 @@ import { TrDropdown } from "@/components/TestResult/TrDropdown";
8
8
  import { TrStep } from "@/components/TestResult/TrSteps/TrStep";
9
9
  import { useI18n } from "@/stores/locale";
10
10
  import { collapsedTrees, toggleTree } from "@/stores/tree";
11
+ import { trOverviewFocusAttrs, trOverviewHeaderFocusClass } from "@/utils/trOverviewFocus";
11
12
 
12
13
  import * as styles from "@/components/TestResult/TrSteps/styles.scss";
13
14
 
@@ -17,13 +18,16 @@ export type TrTeardownProps = {
17
18
  };
18
19
 
19
20
  export const TrTeardown: FunctionalComponent<TrTeardownProps> = ({ teardown, id }) => {
20
- const teardownId = `${id}-teardown`;
21
- const isEarlyCollapsed = !collapsedTrees.value.has(teardownId);
21
+ const teardownId = id ? `${id}-teardown` : null;
22
+ const isEarlyCollapsed = teardownId ? !collapsedTrees.value.has(teardownId) : true;
22
23
  const [isOpened, setIsOpen] = useState<boolean>(isEarlyCollapsed);
23
24
 
24
25
  const handleClick = () => {
25
26
  setIsOpen(!isOpened);
26
- toggleTree(teardownId);
27
+
28
+ if (teardownId) {
29
+ toggleTree(teardownId);
30
+ }
27
31
  };
28
32
 
29
33
  const { t } = useI18n("execution");
@@ -31,6 +35,8 @@ export const TrTeardown: FunctionalComponent<TrTeardownProps> = ({ teardown, id
31
35
  return (
32
36
  <div className={styles["test-result-steps"]}>
33
37
  <TrDropdown
38
+ className={trOverviewHeaderFocusClass(teardownId)}
39
+ {...trOverviewFocusAttrs(teardownId)}
34
40
  icon={allureIcons.lineHelpersFlag}
35
41
  isOpened={isOpened}
36
42
  setIsOpen={handleClick}
@@ -55,7 +55,7 @@ export const hasErrorDiff = (error?: TestErrorLike) =>
55
55
  export const hasTestLevelErrorContent = (error?: TestErrorLike) =>
56
56
  Boolean(normalizeErrorText(error?.trace).length) || hasErrorDiff(error);
57
57
 
58
- const isDisplayableTestError = (error?: TestErrorLike) => {
58
+ export const isDisplayableTestError = (error?: TestErrorLike) => {
59
59
  return (
60
60
  Boolean(normalizeErrorText(error?.message).length) ||
61
61
  Boolean(normalizeErrorText(error?.trace).length) ||
@@ -13,6 +13,7 @@ import { TrOverview } from "@/components/TestResult/TrOverview";
13
13
  import { TrRetriesView } from "@/components/TestResult/TrRetriesView";
14
14
  import { TrTabs } from "@/components/TestResult/TrTabs";
15
15
  import { fetchTestEnvGroup } from "@/stores/env";
16
+ import { activePane, focusTestResultPane } from "@/stores/keyboard";
16
17
  import { isSplitMode } from "@/stores/layout";
17
18
  import { trCurrentTab } from "@/stores/testResult";
18
19
 
@@ -57,7 +58,8 @@ const TrContent: FunctionalComponent<TrContentProps> = ({ testResult }) => {
57
58
  };
58
59
 
59
60
  const TestResult: FunctionComponent<TrProps> = ({ testResult }) => {
60
- const splitModeClass = isSplitMode.value ? styles["scroll-inside"] : "";
61
+ const split = isSplitMode.value;
62
+ const trPaneActive = split && activePane.value === "testResult";
61
63
 
62
64
  useEffect(() => {
63
65
  const testCaseId = testResult?.testCase?.id;
@@ -69,7 +71,11 @@ const TestResult: FunctionComponent<TrProps> = ({ testResult }) => {
69
71
 
70
72
  return (
71
73
  <>
72
- <div className={clsx(styles.content, splitModeClass)}>
74
+ <div
75
+ className={clsx(styles.content, split && styles["scroll-inside"], trPaneActive && styles["pane-active"])}
76
+ data-tr-scroll-container
77
+ onMouseDown={() => focusTestResultPane()}
78
+ >
73
79
  {testResult ? <TrContent testResult={testResult} /> : <TrEmpty />}
74
80
  </div>
75
81
  </>
@@ -1,6 +1,9 @@
1
+ @use "../../styles/pane-active" as paneActive;
2
+
1
3
  .content {
4
+ position: relative;
2
5
  box-shadow: var(--shadow-small);
3
- background: var(--bg-base-primary);
6
+ background: var(--color-bg-primary);
4
7
  border-radius: 12px;
5
8
  width: 100%;
6
9
  }
@@ -10,4 +13,10 @@
10
13
  height: 100%;
11
14
  border-radius: 0;
12
15
  scrollbar-width: thin;
16
+ @include paneActive.split-pane-indicator;
17
+
18
+ &.pane-active {
19
+ @include paneActive.split-pane-indicator-active;
20
+ }
13
21
  }
22
+
@@ -0,0 +1,4 @@
1
+ // Keyboard focus: no visual indicator — step focus is internal only.
2
+ .tr-overview-focused {
3
+ outline: none;
4
+ }
@@ -5,11 +5,11 @@
5
5
  overflow-y: auto;
6
6
 
7
7
  --timeline-font-family: var(--font-family);
8
- --timeline-grid: var(--on-border-control);
9
- --timeline-border-primary: var(--on-border-primary);
10
- --timeline-axis-text: var(--on-text-secondary);
11
- --timeline-bg: var(--bg-base-primary);
12
- --timeline-selection-bg: var(--bg-control-flat-medium);
8
+ --timeline-grid: var(--color-border-control);
9
+ --timeline-border-primary: var(--color-border-default);
10
+ --timeline-axis-text: var(--color-text-secondary);
11
+ --timeline-bg: var(--color-bg-primary);
12
+ --timeline-selection-bg: var(--color-control-bg-ghost-hover);
13
13
  }
14
14
 
15
15
  .overview-grid {
@@ -41,5 +41,5 @@
41
41
  align-items: center;
42
42
  width: 100%;
43
43
  min-height: 320px;
44
- color: var(--on-text-hint);
44
+ color: var(--color-text-muted);
45
45
  }
@@ -1,20 +1,34 @@
1
+ import { scrollFocusIntoView, scrollTreePaneToTop } from "@allurereport/web-commons";
1
2
  import { Button, Loadable, PageLoader, Text, Tree, TreeStatusBar } from "@allurereport/web-components";
2
- import { useMemo } from "preact/hooks";
3
+ import clsx from "clsx";
4
+ import { useLayoutEffect, useMemo } from "preact/hooks";
3
5
 
4
6
  import { MetadataButton } from "@/components/MetadataButton";
5
7
  import { reportStatsStore, statsByEnvStore } from "@/stores";
6
8
  import { collapsedEnvironments, currentEnvironment, environmentNameById, environmentsStore } from "@/stores/env";
9
+ import { flatTree, getFlatTreeNode, setTreeFocusId, treeFocusId, treeScrollPaneToTopPending } from "@/stores/keyboard";
7
10
  import { useI18n } from "@/stores/locale";
8
11
  import { navigateToTestResult } from "@/stores/router";
9
12
  import { currentTrId } from "@/stores/testResult";
10
- import { collapsedTrees, filteredTree, noTests, noTestsFound, toggleTree, treeStore } from "@/stores/tree";
13
+ import {
14
+ collapsedTrees,
15
+ filteredTree,
16
+ isTreeOpened,
17
+ noTests,
18
+ noTestsFound,
19
+ toggleTree,
20
+ treeStore,
21
+ } from "@/stores/tree";
11
22
  import { clearTreeFilters, treeStatus } from "@/stores/treeFilters/store";
12
23
  import { createTreeLocalizer } from "@/utils/tree";
13
24
 
14
25
  import * as styles from "./styles.scss";
15
26
 
16
- const treeNavigateTo = (id: string) => {
17
- navigateToTestResult({ testResultId: id });
27
+ const treeNavigateTo = (testResultId: string) => {
28
+ const flatNode = flatTree.value.find((node) => node.testResultId === testResultId || node.id === testResultId);
29
+
30
+ setTreeFocusId(flatNode?.id ?? testResultId);
31
+ navigateToTestResult({ testResultId });
18
32
  };
19
33
 
20
34
  export const TreeList = () => {
@@ -22,9 +36,31 @@ export const TreeList = () => {
22
36
  const { t: tEnvironments } = useI18n("environments");
23
37
  const { t: tooltip } = useI18n("transitions");
24
38
  const trId = currentTrId.value;
39
+ const focusedId = treeFocusId.value;
25
40
 
26
41
  const currentTreeStatus = treeStatus.value;
27
42
 
43
+ useLayoutEffect(() => {
44
+ if (!focusedId) {
45
+ return;
46
+ }
47
+
48
+ const node = document.querySelector(`[data-tree-node-id="${focusedId}"]`);
49
+
50
+ if (!node) {
51
+ return;
52
+ }
53
+
54
+ if (treeScrollPaneToTopPending.value) {
55
+ treeScrollPaneToTopPending.value = false;
56
+ scrollTreePaneToTop(node);
57
+ return;
58
+ }
59
+
60
+ const flatNode = getFlatTreeNode(focusedId);
61
+ scrollFocusIntoView(node, { kind: flatNode?.kind });
62
+ }, [focusedId]);
63
+
28
64
  const localizers = useMemo(
29
65
  () => ({
30
66
  tooltip: (key: string, options: Record<string, string>) => tooltip(`description.${key}`, options),
@@ -84,10 +120,12 @@ export const TreeList = () => {
84
120
  statistic={soleStatistic}
85
121
  collapsedTrees={collapsedTrees.value}
86
122
  toggleTree={toggleTree}
123
+ isGroupOpened={isTreeOpened}
87
124
  navigateTo={treeNavigateTo}
88
125
  tree={treeLocalizer(filteredTree.value[soleId])}
89
126
  statusFilter={currentTreeStatus}
90
127
  routeId={trId}
128
+ focusedId={focusedId}
91
129
  root
92
130
  />
93
131
  </div>
@@ -104,10 +142,12 @@ export const TreeList = () => {
104
142
  statistic={statsByEnvStore.value.data[currentEnvironment.value]}
105
143
  collapsedTrees={collapsedTrees.value}
106
144
  toggleTree={toggleTree}
145
+ isGroupOpened={isTreeOpened}
107
146
  navigateTo={treeNavigateTo}
108
147
  tree={treeLocalizer(currentTree)}
109
148
  statusFilter={currentTreeStatus}
110
149
  routeId={trId}
150
+ focusedId={focusedId}
111
151
  root
112
152
  />
113
153
  </div>
@@ -132,9 +172,15 @@ export const TreeList = () => {
132
172
  };
133
173
  const stats = statsByEnvStore.value.data[key];
134
174
 
175
+ const envFocusId = `env:${key}`;
176
+
135
177
  return (
136
178
  <div key={key} className={styles["tree-section"]} data-testid={"tree-section"}>
137
- <div className={styles["tree-env-button"]}>
179
+ <div
180
+ className={clsx(styles["tree-env-button"], focusedId === envFocusId && styles["tree-env-focused"])}
181
+ data-tree-node-id={envFocusId}
182
+ id={envFocusId}
183
+ >
138
184
  <MetadataButton
139
185
  isOpened={isOpened}
140
186
  setIsOpen={toggleEnv}
@@ -157,10 +203,13 @@ export const TreeList = () => {
157
203
  reportStatistic={reportStatsStore.value.data}
158
204
  collapsedTrees={collapsedTrees.value}
159
205
  toggleTree={toggleTree}
206
+ isGroupOpened={isTreeOpened}
160
207
  statusFilter={currentTreeStatus}
161
208
  navigateTo={treeNavigateTo}
162
209
  tree={treeLocalizer(value)}
163
210
  routeId={trId}
211
+ focusedId={focusedId}
212
+ focusIdPrefix={`${key}:`}
164
213
  root
165
214
  />
166
215
  </div>
@@ -2,7 +2,7 @@
2
2
  position: relative;
3
3
 
4
4
  &:not(:first-child) {
5
- border-top: 1px solid var(--on-border-muted);
5
+ border-top: 1px solid var(--color-border-subtle);
6
6
  }
7
7
  }
8
8
 
@@ -15,7 +15,7 @@
15
15
  padding: 4px 8px 4px 6px;
16
16
 
17
17
  &:hover {
18
- background: var(--bg-control-flat-medium);
18
+ background: var(--color-row-bg-hover);
19
19
  }
20
20
  }
21
21
 
@@ -49,11 +49,11 @@
49
49
  position: relative;
50
50
 
51
51
  &:hover {
52
- background: var(--bg-control-flat-medium);
52
+ background: var(--color-row-bg-hover);
53
53
  }
54
54
 
55
55
  &:not(:first-child) {
56
- border-top: 1px solid var(--on-border-muted);
56
+ border-top: 1px solid var(--color-border-subtle);
57
57
  }
58
58
  }
59
59
 
@@ -64,7 +64,7 @@
64
64
  .item-time {
65
65
  flex: none;
66
66
  margin-left: auto;
67
- color: var(--on-text-hint);
67
+ color: var(--color-text-muted);
68
68
  }
69
69
 
70
70
  .test-count {
@@ -76,7 +76,7 @@
76
76
  display: block;
77
77
  padding-left: 24px;
78
78
  margin-bottom: 12px;
79
- border-top: 1px solid var(--on-border-muted);
79
+ border-top: 1px solid var(--color-border-subtle);
80
80
  }
81
81
 
82
82
  .tree-item-icon {
@@ -85,71 +85,76 @@
85
85
  }
86
86
 
87
87
  .status-passed {
88
- color: var(--bg-support-castor);
88
+ color: var(--color-status-passed-chart);
89
89
  }
90
90
 
91
91
  .status-failed {
92
- color: var(--bg-support-capella);
92
+ color: var(--color-status-failed-chart);
93
93
  }
94
94
 
95
95
  .status-broken {
96
- color: var(--bg-support-atlas);
96
+ color: var(--color-status-broken-chart);
97
97
  }
98
98
 
99
99
  .status-skipped {
100
- color: var(--bg-support-rau);
100
+ color: var(--color-status-skipped-chart);
101
101
  }
102
102
 
103
103
  .status-unknown {
104
- color: var(--bg-support-skat);
104
+ color: var(--color-status-unknown-chart);
105
105
  }
106
106
 
107
107
  .tree-header-bar {
108
108
  display: inline-flex;
109
+ align-items: center;
110
+ gap: var(--space-0-25);
109
111
  font-family: var(--font-family);
110
112
  max-width: 140px;
111
113
  min-width: 46px;
112
- border-radius: 4px;
113
- height: 12px;
114
- background: var(--on-text-hint);
114
+ height: var(--space-2);
115
+ background: transparent;
115
116
  margin-left: auto;
116
- font-size: 10px;
117
- font-weight: var(--font-weight-extra-bold);
118
- line-height: 12px;
119
- overflow: hidden;
117
+ font-size: var(--font-size-xs);
118
+ font-weight: var(--font-weight-bold);
119
+ line-height: var(--line-height-s);
120
+ overflow: visible;
120
121
  }
121
122
 
122
123
  .tree-header-bar-item {
123
124
  display: flex;
124
- min-width: 16px;
125
+ align-items: center;
125
126
  justify-content: center;
127
+ box-sizing: border-box;
128
+ min-width: var(--space-2);
129
+ height: var(--space-2);
130
+ border-radius: var(--radius-pill);
126
131
  text-align: center;
127
- padding: 0 6px;
132
+ padding: 0 var(--space-0-75);
128
133
  flex-grow: 1;
129
134
 
130
135
  &.passed {
131
- background-color: var(--bg-support-castor);
132
- color: var(--constant-on-text-primary);
136
+ background-color: var(--color-status-passed-bg);
137
+ color: var(--color-status-passed-on-bg);
133
138
  }
134
139
 
135
140
  &.failed {
136
- background-color: var(--bg-support-capella);
137
- color: var(--constant-on-text-primary);
141
+ background-color: var(--color-status-failed-bg);
142
+ color: var(--color-status-failed-on-bg);
138
143
  }
139
144
 
140
145
  &.broken {
141
- background-color: var(--bg-support-atlas);
142
- color: var(--constant-on-text-primary);
146
+ background-color: var(--color-status-broken-bg);
147
+ color: var(--color-status-broken-on-bg);
143
148
  }
144
149
 
145
150
  &.skipped {
146
- background-color: var(--bg-support-rau);
147
- color: var(--constant-on-text-primary);
151
+ background-color: var(--color-status-skipped-bg);
152
+ color: var(--color-status-skipped-on-bg);
148
153
  }
149
154
 
150
155
  &.unknown {
151
- background-color: var(--bg-support-skat);
152
- color: var(--constant-on-text-primary);
156
+ background-color: var(--color-status-unknown-bg);
157
+ color: var(--color-status-unknown-on-bg);
153
158
  }
154
159
  }
155
160
 
@@ -159,7 +164,7 @@
159
164
  }
160
165
 
161
166
  .tree-empty-results-title {
162
- color: var(--on-text-secondary);
167
+ color: var(--color-text-secondary);
163
168
  }
164
169
 
165
170
  .tree-empty-results-clear-button {
@@ -168,7 +173,7 @@
168
173
 
169
174
  .order {
170
175
  user-select: none;
171
- color: var(--on-text-hint);
176
+ color: var(--color-text-muted);
172
177
  min-width: 16px;
173
178
  text-align: center;
174
179
  box-sizing: content-box;
@@ -177,22 +182,37 @@
177
182
  }
178
183
 
179
184
  .tree-item-marked {
180
- background: var(--bg-base-secondary);
185
+ background: var(--color-row-bg-selected);
181
186
  }
182
187
 
183
188
  .tree-item-marked {
184
- background: var(--bg-base-secondary);
189
+ background: var(--color-row-bg-selected);
190
+ }
191
+
192
+ .tree-env-focused {
193
+ outline: none;
194
+ background: var(--bg-control-flat-medium);
195
+
196
+ &::before {
197
+ content: "";
198
+ position: absolute;
199
+ inset: 0 auto 0 0;
200
+ width: 3px;
201
+ background: var(--bg-support-aldebaran);
202
+ pointer-events: none;
203
+ }
185
204
  }
186
205
 
187
206
  .tree-section {
188
207
  &:not(:last-child) {
189
208
  padding-bottom: 8px;
190
209
  margin-bottom: 14px;
191
- border-bottom: 1px solid var(--on-border-muted);
210
+ border-bottom: 1px solid var(--color-border-subtle);
192
211
  }
193
212
  }
194
213
 
195
214
  .tree-env-button {
215
+ position: relative;
196
216
  display: flex;
197
217
  align-items: center;
198
218
  justify-content: space-between;