creevey 0.10.0-beta.8 → 0.10.0-rc.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 (350) hide show
  1. package/AUTHORS +2 -0
  2. package/CHANGELOG.md +281 -0
  3. package/README.md +19 -41
  4. package/dist/client/addon/components/Addon.js +18 -8
  5. package/dist/client/addon/components/Addon.js.map +1 -1
  6. package/dist/client/addon/components/Panel.js +4 -4
  7. package/dist/client/addon/components/Panel.js.map +1 -1
  8. package/dist/client/addon/components/TestSelect.js +2 -2
  9. package/dist/client/addon/components/TestSelect.js.map +1 -1
  10. package/dist/client/addon/components/Tools.js +19 -9
  11. package/dist/client/addon/components/Tools.js.map +1 -1
  12. package/dist/client/addon/controller.d.ts +1 -1
  13. package/dist/client/addon/controller.js +3 -3
  14. package/dist/client/addon/controller.js.map +1 -1
  15. package/dist/client/addon/decorator.d.ts +1 -1
  16. package/dist/client/addon/makeDecorator.d.ts +9 -0
  17. package/dist/client/addon/makeDecorator.js +48 -0
  18. package/dist/client/addon/makeDecorator.js.map +1 -0
  19. package/dist/client/addon/manager.js +38 -39
  20. package/dist/client/addon/manager.js.map +1 -1
  21. package/dist/client/addon/preset.d.ts +0 -1
  22. package/dist/client/addon/preset.js +3 -2
  23. package/dist/client/addon/preset.js.map +1 -1
  24. package/dist/client/addon/preview.d.ts +1 -1
  25. package/dist/client/addon/withCreevey.d.ts +5 -3
  26. package/dist/client/addon/withCreevey.js +14 -21
  27. package/dist/client/addon/withCreevey.js.map +1 -1
  28. package/dist/client/shared/components/ImagesView/BlendView.d.ts +2 -2
  29. package/dist/client/shared/components/ImagesView/BlendView.js +18 -8
  30. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  31. package/dist/client/shared/components/ImagesView/ImagesView.js +1 -1
  32. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
  33. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
  34. package/dist/client/shared/components/ImagesView/SideBySideView.js +19 -9
  35. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  36. package/dist/client/shared/components/ImagesView/SlideView.d.ts +2 -2
  37. package/dist/client/shared/components/ImagesView/SlideView.js +19 -9
  38. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  39. package/dist/client/shared/components/ImagesView/SwapView.d.ts +2 -2
  40. package/dist/client/shared/components/ImagesView/SwapView.js +31 -9
  41. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  42. package/dist/client/shared/components/ImagesView/common.d.ts +1 -1
  43. package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
  44. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
  45. package/dist/client/shared/components/PageFooter/Paging.js +1 -1
  46. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
  47. package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +2 -2
  48. package/dist/client/shared/components/PageHeader/ImagePreview.js +2 -1
  49. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  50. package/dist/client/shared/components/PageHeader/PageHeader.js +34 -13
  51. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  52. package/dist/client/shared/components/ResultsPage.d.ts +2 -2
  53. package/dist/client/shared/components/ResultsPage.js +45 -15
  54. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  55. package/dist/client/shared/creeveyClientApi.js +18 -1
  56. package/dist/client/shared/creeveyClientApi.js.map +1 -1
  57. package/dist/client/shared/helpers.d.ts +1 -3
  58. package/dist/client/shared/helpers.js +4 -19
  59. package/dist/client/shared/helpers.js.map +1 -1
  60. package/dist/client/web/CreeveyApp.d.ts +1 -0
  61. package/dist/client/web/CreeveyApp.js +44 -15
  62. package/dist/client/web/CreeveyApp.js.map +1 -1
  63. package/dist/client/web/CreeveyContext.d.ts +6 -0
  64. package/dist/client/web/CreeveyContext.js +21 -7
  65. package/dist/client/web/CreeveyContext.js.map +1 -1
  66. package/dist/client/web/CreeveyLoader.d.ts +1 -1
  67. package/dist/client/web/CreeveyLoader.js +3 -3
  68. package/dist/client/web/CreeveyLoader.js.map +1 -1
  69. package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -4
  70. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +36 -6
  71. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
  72. package/dist/client/web/CreeveyView/SideBar/Search.js +20 -10
  73. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  74. package/dist/client/web/CreeveyView/SideBar/SideBar.js +26 -12
  75. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  76. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +67 -13
  77. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  78. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +32 -12
  79. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  80. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
  81. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +20 -13
  82. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  83. package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -13
  84. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  85. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
  86. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +2 -2
  87. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
  88. package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +2 -2
  89. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +3 -2
  90. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  91. package/dist/client/web/CreeveyView/SideBar/Toggle.js +1 -1
  92. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
  93. package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
  94. package/dist/client/web/KeyboardEventsContext.js +79 -64
  95. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  96. package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
  97. package/dist/client/web/index.html +1 -1
  98. package/dist/client/web/index.js +26 -11
  99. package/dist/client/web/index.js.map +1 -1
  100. package/dist/client/web/themes.d.ts +2 -0
  101. package/dist/client/web/themes.js +22 -0
  102. package/dist/client/web/themes.js.map +1 -0
  103. package/dist/creevey.d.ts +1 -1
  104. package/dist/creevey.js +122 -41
  105. package/dist/creevey.js.map +1 -1
  106. package/dist/index.d.ts +1 -0
  107. package/dist/playwright/generator.d.ts +25 -0
  108. package/dist/playwright/generator.js +243 -0
  109. package/dist/playwright/generator.js.map +1 -0
  110. package/dist/playwright/helpers.d.ts +2 -0
  111. package/dist/playwright/helpers.js +29 -0
  112. package/dist/playwright/helpers.js.map +1 -0
  113. package/dist/playwright/reporter.d.ts +83 -0
  114. package/dist/playwright/reporter.js +334 -0
  115. package/dist/playwright/reporter.js.map +1 -0
  116. package/dist/playwright/setup.d.ts +3 -0
  117. package/dist/playwright/setup.js +72 -0
  118. package/dist/playwright/setup.js.map +1 -0
  119. package/dist/playwright.d.ts +1 -0
  120. package/dist/playwright.js +3 -1
  121. package/dist/playwright.js.map +1 -1
  122. package/dist/server/compare.d.ts +18 -0
  123. package/dist/server/compare.js +182 -0
  124. package/dist/server/compare.js.map +1 -0
  125. package/dist/server/config.d.ts +3 -3
  126. package/dist/server/config.js +75 -8
  127. package/dist/server/config.js.map +1 -1
  128. package/dist/server/connection.d.ts +3 -0
  129. package/dist/server/connection.js +28 -0
  130. package/dist/server/connection.js.map +1 -0
  131. package/dist/server/docker.d.ts +1 -1
  132. package/dist/server/docker.js +54 -32
  133. package/dist/server/docker.js.map +1 -1
  134. package/dist/server/index.d.ts +2 -2
  135. package/dist/server/index.js +165 -64
  136. package/dist/server/index.js.map +1 -1
  137. package/dist/server/master/api.d.ts +11 -6
  138. package/dist/server/master/api.js +88 -25
  139. package/dist/server/master/api.js.map +1 -1
  140. package/dist/server/master/handlers/capture-handler.d.ts +5 -0
  141. package/dist/server/master/handlers/capture-handler.js +25 -0
  142. package/dist/server/master/handlers/capture-handler.js.map +1 -0
  143. package/dist/server/master/handlers/index.d.ts +4 -0
  144. package/dist/server/master/handlers/index.js +21 -0
  145. package/dist/server/master/handlers/index.js.map +1 -0
  146. package/dist/server/master/handlers/ping-handler.d.ts +2 -0
  147. package/dist/server/master/handlers/ping-handler.js +8 -0
  148. package/dist/server/master/handlers/ping-handler.js.map +1 -0
  149. package/dist/server/master/handlers/static-handler.d.ts +1 -0
  150. package/dist/server/master/handlers/static-handler.js +20 -0
  151. package/dist/server/master/handlers/static-handler.js.map +1 -0
  152. package/dist/server/master/handlers/stories-handler.d.ts +4 -0
  153. package/dist/server/master/handlers/stories-handler.js +24 -0
  154. package/dist/server/master/handlers/stories-handler.js.map +1 -0
  155. package/dist/server/master/master.js +7 -24
  156. package/dist/server/master/master.js.map +1 -1
  157. package/dist/server/master/pool.d.ts +1 -0
  158. package/dist/server/master/pool.js +5 -3
  159. package/dist/server/master/pool.js.map +1 -1
  160. package/dist/server/master/queue.d.ts +1 -1
  161. package/dist/server/master/queue.js +14 -6
  162. package/dist/server/master/queue.js.map +1 -1
  163. package/dist/server/master/runner.d.ts +6 -6
  164. package/dist/server/master/runner.js +98 -130
  165. package/dist/server/master/runner.js.map +1 -1
  166. package/dist/server/master/server.d.ts +1 -1
  167. package/dist/server/master/server.js +193 -88
  168. package/dist/server/master/server.js.map +1 -1
  169. package/dist/server/master/start.d.ts +1 -2
  170. package/dist/server/master/start.js +13 -29
  171. package/dist/server/master/start.js.map +1 -1
  172. package/dist/server/master/testsManager.d.ts +81 -0
  173. package/dist/server/master/testsManager.js +282 -0
  174. package/dist/server/master/testsManager.js.map +1 -0
  175. package/dist/server/playwright/docker-file.d.ts +1 -1
  176. package/dist/server/playwright/docker-file.js +17 -8
  177. package/dist/server/playwright/docker-file.js.map +1 -1
  178. package/dist/server/playwright/docker.d.ts +2 -1
  179. package/dist/server/playwright/docker.js +10 -2
  180. package/dist/server/playwright/docker.js.map +1 -1
  181. package/dist/server/playwright/index-source.mjs +16 -0
  182. package/dist/server/playwright/internal.d.ts +7 -7
  183. package/dist/server/playwright/internal.js +144 -84
  184. package/dist/server/playwright/internal.js.map +1 -1
  185. package/dist/server/playwright/webdriver.d.ts +3 -3
  186. package/dist/server/playwright/webdriver.js +0 -6
  187. package/dist/server/playwright/webdriver.js.map +1 -1
  188. package/dist/server/providers/browser.js +4 -3
  189. package/dist/server/providers/browser.js.map +1 -1
  190. package/dist/server/providers/hybrid.js +2 -2
  191. package/dist/server/providers/hybrid.js.map +1 -1
  192. package/dist/server/report.d.ts +10 -0
  193. package/dist/server/report.js +45 -0
  194. package/dist/server/report.js.map +1 -0
  195. package/dist/server/reporters/creevey.d.ts +7 -0
  196. package/dist/server/reporters/creevey.js +63 -0
  197. package/dist/server/reporters/creevey.js.map +1 -0
  198. package/dist/server/reporters/index.d.ts +2 -0
  199. package/dist/server/reporters/index.js +16 -0
  200. package/dist/server/reporters/index.js.map +1 -0
  201. package/dist/server/reporters/junit.d.ts +16 -0
  202. package/dist/server/reporters/junit.js +167 -0
  203. package/dist/server/reporters/junit.js.map +1 -0
  204. package/dist/server/reporters/teamcity.d.ts +7 -0
  205. package/dist/server/reporters/teamcity.js +60 -0
  206. package/dist/server/reporters/teamcity.js.map +1 -0
  207. package/dist/server/selenium/internal.d.ts +4 -4
  208. package/dist/server/selenium/internal.js +56 -40
  209. package/dist/server/selenium/internal.js.map +1 -1
  210. package/dist/server/selenium/selenoid.js +12 -6
  211. package/dist/server/selenium/selenoid.js.map +1 -1
  212. package/dist/server/selenium/webdriver.d.ts +3 -3
  213. package/dist/server/selenium/webdriver.js +4 -8
  214. package/dist/server/selenium/webdriver.js.map +1 -1
  215. package/dist/server/shutdown.d.ts +1 -0
  216. package/dist/server/shutdown.js +23 -0
  217. package/dist/server/shutdown.js.map +1 -0
  218. package/dist/server/stories.d.ts +0 -1
  219. package/dist/server/stories.js +0 -12
  220. package/dist/server/stories.js.map +1 -1
  221. package/dist/server/telemetry.js +3 -3
  222. package/dist/server/telemetry.js.map +1 -1
  223. package/dist/server/testsFiles/parser.js +45 -5
  224. package/dist/server/testsFiles/parser.js.map +1 -1
  225. package/dist/server/utils.d.ts +23 -0
  226. package/dist/server/utils.js +114 -15
  227. package/dist/server/utils.js.map +1 -1
  228. package/dist/server/webdriver.d.ts +1 -1
  229. package/dist/server/worker/context.d.ts +3 -0
  230. package/dist/server/worker/context.js +15 -0
  231. package/dist/server/worker/context.js.map +1 -0
  232. package/dist/server/worker/match-image.d.ts +8 -12
  233. package/dist/server/worker/match-image.js +11 -178
  234. package/dist/server/worker/match-image.js.map +1 -1
  235. package/dist/server/worker/start.d.ts +2 -2
  236. package/dist/server/worker/start.js +41 -64
  237. package/dist/server/worker/start.js.map +1 -1
  238. package/dist/shared/index.d.ts +1 -1
  239. package/dist/shared/index.js +9 -7
  240. package/dist/shared/index.js.map +1 -1
  241. package/dist/types.d.ts +84 -43
  242. package/dist/types.js +65 -1
  243. package/dist/types.js.map +1 -1
  244. package/docs/cli.md +80 -0
  245. package/docs/config.md +179 -165
  246. package/docs/examples/playwright-reporer/playwright.config.ts +37 -0
  247. package/docs/migration-0.9-to-0.10.md +144 -0
  248. package/docs/playwright-reporter.md +357 -0
  249. package/docs/storybook.md +60 -0
  250. package/docs/tests.md +50 -45
  251. package/package.json +78 -83
  252. package/playwright.config.mts +46 -0
  253. package/src/client/addon/components/Addon.tsx +1 -1
  254. package/src/client/addon/components/Panel.tsx +4 -4
  255. package/src/client/addon/components/TestSelect.tsx +2 -2
  256. package/src/client/addon/components/Tools.tsx +2 -2
  257. package/src/client/addon/controller.ts +4 -4
  258. package/src/client/addon/makeDecorator.ts +69 -0
  259. package/src/client/addon/manager.ts +38 -37
  260. package/src/client/addon/preset.ts +2 -1
  261. package/src/client/addon/withCreevey.ts +16 -19
  262. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  263. package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
  264. package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
  265. package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
  266. package/src/client/shared/components/ImagesView/SwapView.tsx +20 -2
  267. package/src/client/shared/components/ImagesView/common.ts +1 -1
  268. package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
  269. package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
  270. package/src/client/shared/components/PageHeader/ImagePreview.tsx +2 -1
  271. package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
  272. package/src/client/shared/components/ResultsPage.tsx +33 -10
  273. package/src/client/shared/creeveyClientApi.ts +19 -1
  274. package/src/client/shared/helpers.ts +4 -24
  275. package/src/client/web/CreeveyApp.tsx +30 -9
  276. package/src/client/web/CreeveyContext.tsx +11 -0
  277. package/src/client/web/CreeveyLoader.tsx +2 -2
  278. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
  279. package/src/client/web/CreeveyView/SideBar/Search.tsx +4 -4
  280. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
  281. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +48 -15
  282. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
  283. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +12 -12
  284. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +10 -10
  285. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
  286. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
  287. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
  288. package/src/client/web/KeyboardEventsContext.tsx +61 -73
  289. package/src/client/web/index.tsx +10 -5
  290. package/src/client/web/themes.ts +24 -0
  291. package/src/creevey.ts +92 -38
  292. package/src/playwright/generator.ts +322 -0
  293. package/src/playwright/helpers.ts +31 -0
  294. package/src/playwright/reporter.ts +381 -0
  295. package/src/playwright/setup.ts +84 -0
  296. package/src/playwright.ts +1 -0
  297. package/src/server/compare.ts +260 -0
  298. package/src/server/config.ts +52 -9
  299. package/src/server/connection.ts +26 -0
  300. package/src/server/docker.ts +62 -34
  301. package/src/server/index.ts +166 -79
  302. package/src/server/master/api.ts +94 -28
  303. package/src/server/master/handlers/capture-handler.ts +20 -0
  304. package/src/server/master/handlers/index.ts +4 -0
  305. package/src/server/master/handlers/ping-handler.ts +6 -0
  306. package/src/server/master/handlers/static-handler.ts +16 -0
  307. package/src/server/master/handlers/stories-handler.ts +20 -0
  308. package/src/server/master/master.ts +10 -27
  309. package/src/server/master/pool.ts +7 -3
  310. package/src/server/master/queue.ts +21 -7
  311. package/src/server/master/runner.ts +123 -134
  312. package/src/server/master/server.ts +214 -101
  313. package/src/server/master/start.ts +19 -41
  314. package/src/server/master/testsManager.ts +316 -0
  315. package/src/server/playwright/docker-file.ts +20 -8
  316. package/src/server/playwright/docker.ts +16 -3
  317. package/src/server/playwright/index-source.mjs +16 -0
  318. package/src/server/playwright/internal.ts +176 -103
  319. package/src/server/playwright/webdriver.ts +4 -10
  320. package/src/server/providers/browser.ts +4 -3
  321. package/src/server/providers/hybrid.ts +2 -3
  322. package/src/server/report.ts +51 -0
  323. package/src/server/reporters/creevey.ts +71 -0
  324. package/src/server/reporters/index.ts +11 -0
  325. package/src/server/reporters/junit.ts +207 -0
  326. package/src/server/reporters/teamcity.ts +74 -0
  327. package/src/server/selenium/internal.ts +70 -53
  328. package/src/server/selenium/selenoid.ts +13 -6
  329. package/src/server/selenium/webdriver.ts +8 -12
  330. package/src/server/shutdown.ts +19 -0
  331. package/src/server/stories.ts +1 -12
  332. package/src/server/telemetry.ts +3 -3
  333. package/src/server/testsFiles/parser.ts +52 -4
  334. package/src/server/utils.ts +124 -16
  335. package/src/server/webdriver.ts +1 -1
  336. package/src/server/worker/context.ts +14 -0
  337. package/src/server/worker/match-image.ts +16 -248
  338. package/src/server/worker/start.ts +49 -79
  339. package/src/shared/index.ts +10 -8
  340. package/src/types.ts +91 -58
  341. package/types/global.d.ts +1 -0
  342. package/dist/client/web/assets/index-DB8lHlJw.js +0 -591
  343. package/dist/server/reporter.d.ts +0 -26
  344. package/dist/server/reporter.js +0 -108
  345. package/dist/server/reporter.js.map +0 -1
  346. package/dist/server/update.d.ts +0 -2
  347. package/dist/server/update.js +0 -53
  348. package/dist/server/update.js.map +0 -1
  349. package/src/server/reporter.ts +0 -139
  350. package/src/server/update.ts +0 -74
@@ -1,6 +1,6 @@
1
1
  import React, { JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
2
- import { Loader } from '@storybook/components';
3
- import { styled, withTheme } from '@storybook/theming';
2
+ import { Loader } from 'storybook/internal/components';
3
+ import { styled, withTheme } from 'storybook/theming';
4
4
  import { ViewPropsWithTheme, getBorderColor, themeBorderColors } from './common.js';
5
5
  import { useApplyScale, useLoadImages, useResizeObserver, getBorderSize } from '../../helpers.js';
6
6
  import { readyForCapture } from '../../../addon/readyForCapture.js';
@@ -1,6 +1,6 @@
1
1
  import React, { JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
2
- import { Loader } from '@storybook/components';
3
- import { styled, withTheme } from '@storybook/theming';
2
+ import { Loader } from 'storybook/internal/components';
3
+ import { styled, withTheme } from 'storybook/theming';
4
4
  import { getBorderColor, themeBorderColors, ViewPropsWithTheme } from './common.js';
5
5
  import { useApplyScale, useCalcScale, useLoadImages } from '../../helpers.js';
6
6
  import { readyForCapture } from '../../../addon/readyForCapture.js';
@@ -1,6 +1,6 @@
1
1
  import React, { JSX, useCallback, useEffect, useRef, useState } from 'react';
2
- import { Loader } from '@storybook/components';
3
- import { styled, withTheme } from '@storybook/theming';
2
+ import { Loader } from 'storybook/internal/components';
3
+ import { styled, withTheme } from 'storybook/theming';
4
4
  import { ViewPropsWithTheme, getBorderColor, themeBorderColors } from './common.js';
5
5
  import { useApplyScale, useCalcScale, useLoadImages } from '../../helpers.js';
6
6
  import { readyForCapture } from '../../../addon/readyForCapture.js';
@@ -46,6 +46,24 @@ export const SwapView = withTheme(({ theme, expect, actual, diff }: ViewPropsWit
46
46
  setImage((prevImage) => (prevImage == 'actual' ? 'expect' : 'actual'));
47
47
  }, []);
48
48
 
49
+ const handleKeyDown = useCallback(
50
+ (e: KeyboardEvent) => {
51
+ if (e.code === 'Space' && e.altKey) {
52
+ e.preventDefault();
53
+ handleChangeView();
54
+ }
55
+ },
56
+ [handleChangeView],
57
+ );
58
+
59
+ useEffect(() => {
60
+ document.addEventListener('keydown', handleKeyDown, false);
61
+
62
+ return () => {
63
+ document.removeEventListener('keydown', handleKeyDown, false);
64
+ };
65
+ }, [handleKeyDown]);
66
+
49
67
  useEffect(() => {
50
68
  if (loaded) readyForCapture();
51
69
  }, [loaded]);
@@ -1,4 +1,4 @@
1
- import { Color, Theme } from '@storybook/theming';
1
+ import { Color, Theme } from 'storybook/theming';
2
2
 
3
3
  export const themeBorderColors = {
4
4
  actual: 'negative',
@@ -1,5 +1,5 @@
1
1
  import React, { JSX } from 'react';
2
- import { styled, withTheme } from '@storybook/theming';
2
+ import { styled, withTheme } from 'storybook/theming';
3
3
  import { Paging } from './Paging.js';
4
4
 
5
5
  export interface PageFooterProps {
@@ -1,5 +1,5 @@
1
1
  import React, { JSX } from 'react';
2
- import { TabButton } from '@storybook/components';
2
+ import { TabButton } from 'storybook/internal/components';
3
3
 
4
4
  export interface PagingProps {
5
5
  activePage: string;
@@ -1,5 +1,5 @@
1
1
  import React, { JSX } from 'react';
2
- import { styled, withTheme, Theme } from '@storybook/theming';
2
+ import { styled, withTheme, Theme } from 'storybook/theming';
3
3
 
4
4
  const IMG_SIZE = 64;
5
5
  const DIAG_LENGTH = (2 * (IMG_SIZE - 8) ** 2) ** (1 / 2);
@@ -70,6 +70,7 @@ export const ImagePreview = withTheme(
70
70
  onClick(imageName);
71
71
  };
72
72
 
73
+ // TODO Add image name as a title
73
74
  return (
74
75
  <Button
75
76
  onClick={handleClick}
@@ -1,11 +1,12 @@
1
- import React, { JSX, useEffect } from 'react';
2
- import { Tabs } from '@storybook/components';
1
+ import React, { JSX, useContext, useEffect } from 'react';
2
+ import { Tabs } from 'storybook/internal/components';
3
3
  import { CloseAltIcon } from '@storybook/icons';
4
- import { styled, withTheme, Theme } from '@storybook/theming';
4
+ import { styled, withTheme, Theme } from 'storybook/theming';
5
5
  import { ImagesViewMode, Images } from '../../../../types.js';
6
6
  import { getImageUrl } from '../../helpers.js';
7
7
  import { ImagePreview } from './ImagePreview.js';
8
8
  import { viewModes } from '../../viewMode.js';
9
+ import { CreeveyContext } from '../../../web/CreeveyContext.js';
9
10
 
10
11
  interface PageHeaderProps {
11
12
  title: string[];
@@ -20,14 +21,14 @@ interface PageHeaderProps {
20
21
  }
21
22
 
22
23
  const Container = styled.div({
23
- margin: '24px 44px 0',
24
+ marginTop: '24px',
24
25
  });
25
26
 
26
27
  const ErrorContainer = withTheme(
27
28
  styled.div<{ theme: Theme }>(({ theme }) => ({
28
29
  marginTop: '8px',
29
30
  padding: '8px',
30
- background: theme.background.negative,
31
+ background: `${theme.background.negative}20`,
31
32
  color: theme.color.negative,
32
33
  borderRadius: '2px',
33
34
  display: 'flex',
@@ -47,8 +48,19 @@ const ErrorContainer = withTheme(
47
48
  })),
48
49
  );
49
50
 
51
+ const UpdateModeBanner = withTheme(
52
+ styled.div(({ theme }) => ({
53
+ padding: '8px 32px',
54
+ backgroundColor: `${theme.color.positive}20`,
55
+ color: theme.color.positive,
56
+ fontSize: '12px',
57
+ textAlign: 'center',
58
+ fontWeight: 'bold',
59
+ })),
60
+ );
61
+
50
62
  const H1 = styled.h1({
51
- margin: 0,
63
+ marginLeft: '44px',
52
64
  marginBottom: '8px',
53
65
  });
54
66
 
@@ -76,6 +88,7 @@ export function PageHeader({
76
88
  onImageChange,
77
89
  onViewModeChange,
78
90
  }: PageHeaderProps): JSX.Element | null {
91
+ const { isReport, isUpdateMode } = useContext(CreeveyContext);
79
92
  const imageEntires = Object.entries(images) as [string, Images][];
80
93
 
81
94
  const handleViewModeChange = (mode: string): void => {
@@ -110,7 +123,7 @@ export function PageHeader({
110
123
  <ImagePreview
111
124
  key={name}
112
125
  imageName={name}
113
- url={`${getImageUrl(title, name)}/${image.actual}`}
126
+ url={`${getImageUrl(title, name, isReport)}/${image.actual}`}
114
127
  isActive={name === imageName}
115
128
  onClick={onImageChange}
116
129
  error={imagesWithError.includes(name)}
@@ -118,6 +131,9 @@ export function PageHeader({
118
131
  ))}
119
132
  </ImagesEntriesContainer>
120
133
  ) : null}
134
+ {isUpdateMode && (
135
+ <UpdateModeBanner>Update Mode: Review and approve screenshots from previous test runs</UpdateModeBanner>
136
+ )}
121
137
  {showViewModes && (
122
138
  <Tabs selected={viewMode} actions={{ onSelect: handleViewModeChange }}>
123
139
  {viewModes.map((x) => (
@@ -1,12 +1,13 @@
1
- import React, { JSX, useState } from 'react';
2
- import { Placeholder, ScrollArea } from '@storybook/components';
3
- import { styled, withTheme, Theme } from '@storybook/theming';
1
+ import React, { JSX, useCallback, useContext, useEffect, useState } from 'react';
2
+ import { Placeholder, ScrollArea } from 'storybook/internal/components';
3
+ import { styled, withTheme, Theme } from 'storybook/theming';
4
4
  import { ImagesView } from './ImagesView/ImagesView.js';
5
5
  import { PageHeader } from './PageHeader/PageHeader.js';
6
6
  import { PageFooter } from './PageFooter/PageFooter.js';
7
7
  import { getImageUrl } from '../helpers.js';
8
- import { getViewMode, VIEW_MODE_KEY } from '../viewMode.js';
8
+ import { getViewMode, VIEW_MODE_KEY, viewModes } from '../viewMode.js';
9
9
  import { ImagesViewMode, TestResult } from '../../../types.js';
10
+ import { CreeveyContext } from '../../web/CreeveyContext.js';
10
11
 
11
12
  interface ResultsPageProps {
12
13
  path: string[];
@@ -65,8 +66,9 @@ export function ResultsPageInternal({
65
66
  onRetryChange,
66
67
  }: ResultsPageProps): JSX.Element {
67
68
  const result = results[retry - 1] ?? {};
69
+ const { isReport } = useContext(CreeveyContext);
68
70
  const [viewMode, setViewMode] = useState<ImagesViewMode>(getViewMode());
69
- const url = getImageUrl(path, imageName);
71
+ const url = getImageUrl(path, imageName, isReport);
70
72
  const image = result.images?.[imageName];
71
73
  const canApprove = Boolean(image && approved?.[imageName] != retry - 1 && result.status != 'success');
72
74
  const hasDiffAndExpect = canApprove && Boolean(image?.diff && image.expect);
@@ -77,10 +79,31 @@ export function ResultsPageInternal({
77
79
  )
78
80
  : [];
79
81
 
80
- const handleChangeViewMode = (mode: ImagesViewMode): void => {
81
- localStorage.setItem(VIEW_MODE_KEY, mode);
82
- setViewMode(mode);
83
- };
82
+ const handleKeyDown = useCallback(
83
+ (e: KeyboardEvent) => {
84
+ if (!canApprove) return;
85
+ if (e.code === 'Tab') {
86
+ e.preventDefault();
87
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
88
+ if (e.shiftKey) setViewMode((mode) => viewModes.at((viewModes.indexOf(mode) - 1) % viewModes.length)!);
89
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
90
+ else setViewMode((mode) => viewModes.at((viewModes.indexOf(mode) + 1) % viewModes.length)!);
91
+ }
92
+ },
93
+ [canApprove],
94
+ );
95
+
96
+ useEffect(() => {
97
+ localStorage.setItem(VIEW_MODE_KEY, viewMode);
98
+ }, [viewMode]);
99
+
100
+ useEffect(() => {
101
+ document.addEventListener('keydown', handleKeyDown, false);
102
+
103
+ return () => {
104
+ document.removeEventListener('keydown', handleKeyDown, false);
105
+ };
106
+ }, [handleKeyDown]);
84
107
 
85
108
  return (
86
109
  <Container height={height}>
@@ -92,7 +115,7 @@ export function ResultsPageInternal({
92
115
  errorMessage={result.error}
93
116
  showViewModes={hasDiffAndExpect}
94
117
  viewMode={viewMode}
95
- onViewModeChange={handleChangeViewMode}
118
+ onViewModeChange={setViewMode}
96
119
  onImageChange={onImageChange}
97
120
  imagesWithError={imagesWithError}
98
121
  />
@@ -12,9 +12,11 @@ export interface CreeveyClientApi {
12
12
 
13
13
  export async function initCreeveyClientApi(): Promise<CreeveyClientApi> {
14
14
  let clientApiResolver: (api: CreeveyClientApi) => void = noop;
15
+ let clientApiRejecter: (error: Error | Event) => void = noop;
15
16
  const updateListeners = new Set<(update: CreeveyUpdate) => void>();
16
17
  let statusRequest: Promise<CreeveyStatus> | null = null;
17
18
  let statusResolver: (status: CreeveyStatus) => void = noop;
19
+ let isUpdateMode = false;
18
20
 
19
21
  const ws = new WebSocket(`ws://${getConnectionUrl()}`);
20
22
 
@@ -22,12 +24,24 @@ export async function initCreeveyClientApi(): Promise<CreeveyClientApi> {
22
24
  ws.send(JSON.stringify(request));
23
25
  }
24
26
 
27
+ ws.addEventListener('error', (event) => {
28
+ clientApiRejecter(event);
29
+ });
30
+
25
31
  ws.addEventListener('open', () => {
26
32
  clientApiResolver({
27
33
  start(ids: string[]) {
34
+ if (isUpdateMode) {
35
+ console.warn('Tests cannot be started in Update Mode. This mode is for approving screenshots only.');
36
+ return;
37
+ }
28
38
  send({ type: 'start', payload: ids });
29
39
  },
30
40
  stop() {
41
+ if (isUpdateMode) {
42
+ console.warn('Tests cannot be stopped in Update Mode. This mode is for approving screenshots only.');
43
+ return;
44
+ }
31
45
  send({ type: 'stop' });
32
46
  },
33
47
  approve(id: string, retry: number, image: string) {
@@ -57,6 +71,7 @@ export async function initCreeveyClientApi(): Promise<CreeveyClientApi> {
57
71
  fn(data.payload);
58
72
  });
59
73
  if (data.type == 'status') {
74
+ isUpdateMode = data.payload.isUpdateMode;
60
75
  statusResolver(data.payload);
61
76
  statusResolver = noop;
62
77
  statusRequest = null;
@@ -64,5 +79,8 @@ export async function initCreeveyClientApi(): Promise<CreeveyClientApi> {
64
79
  });
65
80
  // TODO Reconnect
66
81
 
67
- return new Promise((resolve) => (clientApiResolver = resolve));
82
+ return new Promise((resolve, reject) => {
83
+ clientApiResolver = resolve;
84
+ clientApiRejecter = reject;
85
+ });
68
86
  }
@@ -1,4 +1,3 @@
1
- import { themes, ThemeVars } from '@storybook/theming';
2
1
  import { parse, stringify } from 'qs';
3
2
  import { RefObject, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
4
3
  import { TestData, isTest, isDefined, TestStatus, CreeveySuite, CreeveyTest, CreeveyStatus } from '../../types.js';
@@ -300,12 +299,14 @@ export function getConnectionUrl(): string {
300
299
  .join(':');
301
300
  }
302
301
 
303
- export function getImageUrl(path: string[], imageName: string): string {
302
+ export function getImageUrl(path: string[], imageName: string, isReport?: boolean): string {
304
303
  // path => [title, story, test, browser]
305
304
  const browser = path.slice(-1)[0];
306
305
  const imagesUrl = window.location.host
307
306
  ? `${window.location.protocol}//${getConnectionUrl()}${
308
- window.location.pathname == '/' ? '/report' : window.location.pathname.split('/').slice(0, -1).join('/')
307
+ window.location.pathname == '/' && !isReport
308
+ ? '/report'
309
+ : window.location.pathname.split('/').slice(0, -1).join('/')
309
310
  }/${encodeURI(path.slice(0, -1).join('/'))}`
310
311
  : encodeURI(path.slice(0, -1).join('/'));
311
312
 
@@ -393,27 +394,6 @@ export function useCalcScale(diffImageRef: RefObject<HTMLImageElement>, loaded:
393
394
  return scale;
394
395
  }
395
396
 
396
- const CREEVEY_THEME = 'Creevey_theme';
397
-
398
- function isTheme(theme?: string | null): theme is ThemeVars['base'] {
399
- return isDefined(theme) && Object.prototype.hasOwnProperty.call(themes, theme);
400
- }
401
-
402
- function initialTheme(): ThemeVars['base'] {
403
- const theme = localStorage.getItem(CREEVEY_THEME);
404
- return isTheme(theme) ? theme : 'light';
405
- }
406
-
407
- export function useTheme(): [ThemeVars['base'], (theme: ThemeVars['base']) => void] {
408
- const [theme, setTheme] = useState<ThemeVars['base']>(initialTheme());
409
-
410
- useEffect(() => {
411
- localStorage.setItem(CREEVEY_THEME, theme);
412
- }, [theme]);
413
-
414
- return [theme, setTheme];
415
- }
416
-
417
397
  export function setSearchParams(testPath: string[]): void {
418
398
  const pageUrl = `?${stringify({ testPath })}`;
419
399
  window.history.pushState({ testPath }, '', pageUrl);
@@ -1,6 +1,6 @@
1
1
  import React, { JSX, useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import { useImmer } from 'use-immer';
3
- import { ensure, styled, ThemeProvider, themes, withTheme } from '@storybook/theming';
3
+ import { ensure, styled, ThemeProvider, themes, withTheme } from 'storybook/theming';
4
4
  import { CreeveyUpdate, CreeveySuite, isDefined, CreeveyTest } from '../../types.js';
5
5
  import { CreeveyClientApi } from '../shared/creeveyClientApi.js';
6
6
  import {
@@ -11,17 +11,17 @@ import {
11
11
  getTestByPath,
12
12
  removeTests,
13
13
  getTestPath,
14
- useTheme,
15
14
  setSearchParams,
16
15
  getTestPathFromSearch,
17
16
  CreeveyViewFilter,
18
17
  getFailedTests,
19
18
  } from '../shared/helpers.js';
20
- import { CreeveyContext } from './CreeveyContext.js';
19
+ import { CreeveyContext, FocusableItem } from './CreeveyContext.js';
21
20
  import { KeyboardEvents } from './KeyboardEventsContext.js';
22
21
  import { SideBar } from './CreeveyView/SideBar/index.js';
23
22
  import { ResultsPage } from '../shared/components/ResultsPage.js';
24
23
  import { Toggle } from './CreeveyView/SideBar/Toggle.js';
24
+ import { useTheme } from './themes.js';
25
25
 
26
26
  export interface CreeveyAppProps {
27
27
  api?: CreeveyClientApi;
@@ -29,6 +29,7 @@ export interface CreeveyAppProps {
29
29
  tests: CreeveySuite;
30
30
  isRunning: boolean;
31
31
  isReport: boolean;
32
+ isUpdateMode: boolean;
32
33
  };
33
34
  }
34
35
 
@@ -59,8 +60,9 @@ export function CreeveyApp({ api, initialState }: CreeveyAppProps): JSX.Element
59
60
  const failedTests = useMemo(() => getFailedTests(tests), [tests]);
60
61
 
61
62
  const [retry, setRetry] = useState(openedTest?.results?.length ?? 0);
62
- const result = openedTest?.results?.[retry - 1] ?? { images: {} };
63
- const [imageName, setImageName] = useState(Object.keys(result.images ?? {})[0] ?? '');
63
+ const result = useMemo(() => openedTest?.results?.[retry - 1], [openedTest, retry]);
64
+ const [imageName, setImageName] = useState(Object.keys(result?.images ?? {})[0] ?? '');
65
+ const [sidebarFocusedItem, setSidebarFocusedItem] = useState<FocusableItem>([]);
64
66
  const canApprove = useMemo(
65
67
  () =>
66
68
  Boolean(
@@ -94,6 +96,7 @@ export function CreeveyApp({ api, initialState }: CreeveyAppProps): JSX.Element
94
96
  (test: CreeveyTest): void => {
95
97
  const testPath = getTestPath(test);
96
98
  setSearchParams(testPath);
99
+ setSidebarFocusedItem(testPath);
97
100
  updateTests((draft) => {
98
101
  openSuite(draft, testPath, true);
99
102
  openTest(testPath);
@@ -103,11 +106,24 @@ export function CreeveyApp({ api, initialState }: CreeveyAppProps): JSX.Element
103
106
  );
104
107
 
105
108
  const handleGoToNextFailedTest = useCallback(() => {
106
- if (failedTests.length <= 1) return;
109
+ if (failedTests.length == 0) return;
107
110
  const currentTest = failedTests.findIndex((t) => t.id === openedTest?.id);
108
- const nextFailedTest = failedTests[currentTest + 1] || failedTests[0];
109
- handleOpenTest(nextFailedTest);
110
- }, [failedTests, handleOpenTest, openedTest?.id]);
111
+ const failedImages = Object.entries(result?.images ?? {})
112
+ .filter(([name, image]) =>
113
+ // TODO Move to helpers, it duplicates in a few places
114
+ Boolean(image?.error != null && openedTest?.approved?.[name] != retry - 1 && result?.status != 'success'),
115
+ )
116
+ .map(([name]) => name);
117
+ if (
118
+ failedImages.length > 1 &&
119
+ (failedTests.length == 1 || failedImages.indexOf(imageName) < failedImages.length - 1)
120
+ ) {
121
+ setImageName((name) => failedImages[failedImages.indexOf(name) + 1] ?? failedImages[0]);
122
+ } else {
123
+ const nextFailedTest = failedTests[currentTest + 1] ?? failedTests[0];
124
+ handleOpenTest(nextFailedTest);
125
+ }
126
+ }, [failedTests, handleOpenTest, openedTest, retry, result, imageName]);
111
127
 
112
128
  const handleImageApproveNew = useCallback((): void => {
113
129
  const id = openedTest?.id;
@@ -122,6 +138,7 @@ export function CreeveyApp({ api, initialState }: CreeveyAppProps): JSX.Element
122
138
  }, [handleImageApproveNew, handleGoToNextFailedTest]);
123
139
 
124
140
  const handleApproveAll = useCallback(() => {
141
+ // TODO Update handled incorrectly
125
142
  api?.approveAll();
126
143
  }, [api]);
127
144
 
@@ -189,12 +206,16 @@ export function CreeveyApp({ api, initialState }: CreeveyAppProps): JSX.Element
189
206
  value={{
190
207
  isReport: initialState.isReport,
191
208
  isRunning,
209
+ onImageNext: canApprove ? handleGoToNextFailedTest : undefined,
192
210
  onImageApprove: canApprove ? handleImageApproveAndGoNext : undefined,
193
211
  onApproveAll: handleApproveAll,
194
212
  onStart: handleStart,
195
213
  onStop: handleStop,
196
214
  onSuiteOpen: handleSuiteOpen,
197
215
  onSuiteToggle: handleSuiteToggle,
216
+ sidebarFocusedItem,
217
+ setSidebarFocusedItem,
218
+ isUpdateMode: initialState.isUpdateMode,
198
219
  }}
199
220
  >
200
221
  <ThemeProvider theme={ensure(themes[theme])}>
@@ -1,26 +1,37 @@
1
1
  import React, { useContext } from 'react';
2
2
  import { CreeveySuite, noop } from '../../types.js';
3
3
 
4
+ export type SuitePath = string[];
5
+ export type FocusableItem = null | SuitePath;
6
+
4
7
  export interface CreeveyContextType {
5
8
  isReport: boolean;
6
9
  isRunning: boolean;
10
+ isUpdateMode: boolean;
7
11
  onStop: () => void;
12
+ onImageNext?: () => void;
8
13
  onImageApprove?: () => void;
9
14
  onApproveAll: () => void;
10
15
  onStart: (rootSuite: CreeveySuite) => void;
11
16
  onSuiteOpen: (path: string[], opened: boolean) => void;
12
17
  onSuiteToggle: (path: string[], checked: boolean) => void;
18
+ sidebarFocusedItem: FocusableItem;
19
+ setSidebarFocusedItem: (item: FocusableItem) => void;
13
20
  }
14
21
 
15
22
  export const CreeveyContext = React.createContext<CreeveyContextType>({
16
23
  isReport: true,
17
24
  isRunning: false,
25
+ isUpdateMode: false,
26
+ onImageNext: noop,
18
27
  onImageApprove: noop,
19
28
  onApproveAll: noop,
20
29
  onStop: noop,
21
30
  onStart: noop,
22
31
  onSuiteOpen: noop,
23
32
  onSuiteToggle: noop,
33
+ sidebarFocusedItem: [],
34
+ setSidebarFocusedItem: noop,
24
35
  });
25
36
 
26
37
  export const useCreeveyContext = () => useContext(CreeveyContext);
@@ -1,6 +1,6 @@
1
1
  import React, { JSX } from 'react';
2
- import { styled, withTheme, Theme, keyframes, ensure, ThemeProvider, themes, Keyframes } from '@storybook/theming';
3
- import { useTheme } from '../shared/helpers.js';
2
+ import { styled, withTheme, Theme, keyframes, ensure, ThemeProvider, themes, Keyframes } from 'storybook/theming';
3
+ import { useTheme } from './themes.js';
4
4
 
5
5
  const Container = withTheme(
6
6
  styled.div(({ theme }) => ({
@@ -1,5 +1,5 @@
1
- import React, { JSX } from 'react';
2
- import { styled, Theme, withTheme } from '@storybook/theming';
1
+ import React, { Component, JSX } from 'react';
2
+ import { styled, Theme, withTheme } from 'storybook/theming';
3
3
  import { CircleIcon, CheckIcon } from '@storybook/icons';
4
4
  import { transparentize } from 'polished';
5
5
 
@@ -76,7 +76,7 @@ export const CheckboxContainer = styled.span({
76
76
  lineHeight: '18px',
77
77
  });
78
78
 
79
- export class Checkbox extends React.Component<CheckboxProps, CheckboxState> {
79
+ export class Checkbox extends Component<CheckboxProps, CheckboxState> {
80
80
  state: CheckboxState = { indeterminate: false };
81
81
 
82
82
  handleIndeterminateChange = (value: boolean): void => {
@@ -1,7 +1,7 @@
1
- import React, { JSX, ChangeEvent, useContext, useRef, useState } from 'react';
1
+ import React, { JSX, ChangeEvent, useRef, useState } from 'react';
2
2
  import { SearchIcon, CloseAltIcon } from '@storybook/icons';
3
- import { styled, Theme, withTheme } from '@storybook/theming';
4
- import { KeyboardEventsContext } from '../../KeyboardEventsContext.js';
3
+ import { styled, Theme, withTheme } from 'storybook/theming';
4
+ import { useCreeveyContext } from '../../CreeveyContext.js';
5
5
 
6
6
  interface SearchProps {
7
7
  onChange: (arg: string) => void;
@@ -100,7 +100,7 @@ const FilterForm = withTheme(
100
100
  );
101
101
 
102
102
  export const Search = ({ onChange, value }: SearchProps): JSX.Element => {
103
- const { setSidebarFocusedItem } = useContext(KeyboardEventsContext);
103
+ const { setSidebarFocusedItem } = useCreeveyContext();
104
104
  const [focussed, onSetFocussed] = useState(false);
105
105
  const searchRef = useRef<HTMLInputElement>(null);
106
106
 
@@ -1,7 +1,7 @@
1
1
  import React, { JSX, createContext } from 'react';
2
2
  import { transparentize } from 'polished';
3
- import { ScrollArea } from '@storybook/components';
4
- import { styled, Theme, withTheme } from '@storybook/theming';
3
+ import { ScrollArea } from 'storybook/internal/components';
4
+ import { styled, Theme, withTheme } from 'storybook/theming';
5
5
  import { SideBarHeader } from './SideBarHeader.js';
6
6
  import { CreeveySuite, CreeveyTest, noop, isTest } from '../../../../types.js';
7
7
  import {
@@ -47,6 +47,12 @@ const ScrollContainer = styled.div({
47
47
  left: '0',
48
48
  });
49
49
 
50
+ const StyledScrollArea = styled(ScrollArea)({
51
+ '& > [data-state="visible"]': {
52
+ zIndex: 5,
53
+ },
54
+ });
55
+
50
56
  const Shadow = withTheme(
51
57
  styled.div<{ theme: Theme; position: 'top' | 'bottom' }>(({ theme, position }) => ({
52
58
  [position]: '0px',
@@ -62,14 +68,13 @@ const SelectAllContainer = styled.div({
62
68
  });
63
69
 
64
70
  const TestsContainer = styled.div({
65
- marginBottom: '8px',
66
71
  position: 'relative',
67
72
  height: '100%',
68
73
  });
69
74
 
70
75
  const Divider = withTheme(
71
76
  styled.div<{ theme: Theme; position: 'top' | 'bottom' }>(({ theme, position }) => ({
72
- ...(position === 'top' ? { position: 'absolute' } : { position: 'relative', bottom: '8px', marginBottom: '-8px' }),
77
+ ...(position === 'top' ? { position: 'absolute' } : { position: 'relative', bottom: '8px' }),
73
78
  height: '8px',
74
79
  width: '100%',
75
80
  zIndex: 4,
@@ -102,7 +107,7 @@ export function SideBar({ rootSuite, testId, onOpenTest, filter, setFilter }: Si
102
107
  canStart={countCheckedTests !== 0}
103
108
  />
104
109
  <ScrollContainer>
105
- <ScrollArea vertical>
110
+ <StyledScrollArea vertical>
106
111
  <Shadow position="top" />
107
112
  <TestsContainer>
108
113
  <Divider position="top" />
@@ -120,7 +125,7 @@ export function SideBar({ rootSuite, testId, onOpenTest, filter, setFilter }: Si
120
125
  )}
121
126
  </TestsContainer>
122
127
  <Divider position="bottom" />
123
- </ScrollArea>
128
+ </StyledScrollArea>
124
129
  <Shadow position="bottom" />
125
130
  </ScrollContainer>
126
131
  <SideBarFooter />