plum-e2e 2.5.14 → 2.6.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 (734) hide show
  1. package/README.md +1 -1
  2. package/backend/app.js +4 -1
  3. package/backend/constants/triggers.js +3 -1
  4. package/backend/lib/retryRunner.js +61 -0
  5. package/backend/lib/screenshotPoller.js +43 -0
  6. package/backend/mcp/server.js +8 -1
  7. package/backend/prisma/migrations/20260713090000_add_report_duration/migration.sql +2 -0
  8. package/backend/prisma/migrations/20260714070000_add_project_max_retries/migration.sql +2 -0
  9. package/backend/prisma/schema.prisma +2 -0
  10. package/backend/routes/node.routes.js +20 -0
  11. package/backend/routes/runners.routes.js +19 -10
  12. package/backend/routes/settings.routes.js +2 -2
  13. package/backend/routes/trigger.routes.js +124 -29
  14. package/backend/server.js +22 -2
  15. package/backend/services/cronService.js +253 -48
  16. package/backend/services/reportService.js +81 -7
  17. package/backend/services/runnerService.js +25 -0
  18. package/backend/services/settingsService.js +3 -2
  19. package/backend/websockets/socketHandler.js +202 -111
  20. package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +312 -37
  21. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
  22. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
  23. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
  24. package/frontend/.svelte-kit/{output/client/_app/immutable/chunks/rVEKg0Ak.js → adapter-node/_app/immutable/assets/EmptyState.BdO1q9cJ.css} +1 -1
  25. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
  26. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
  27. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
  28. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +18 -0
  29. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
  30. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
  31. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
  32. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
  33. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
  34. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
  35. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
  36. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
  37. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
  38. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page._h2o67kg.css +18 -0
  39. package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +29 -0
  40. package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +3 -3
  41. package/frontend/.svelte-kit/adapter-node/chunks/Button.js +4 -3
  42. package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +74 -0
  43. package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +34 -0
  44. package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +36 -0
  45. package/frontend/.svelte-kit/adapter-node/chunks/auth.js +61 -0
  46. package/frontend/.svelte-kit/adapter-node/chunks/client.js +9 -2
  47. package/frontend/.svelte-kit/adapter-node/chunks/constants.js +41 -0
  48. package/frontend/.svelte-kit/adapter-node/chunks/exports.js +7 -65
  49. package/frontend/.svelte-kit/adapter-node/chunks/format.js +51 -0
  50. package/frontend/.svelte-kit/adapter-node/chunks/index-server.js +31 -0
  51. package/frontend/.svelte-kit/adapter-node/chunks/index.js +71 -50
  52. package/frontend/.svelte-kit/adapter-node/chunks/index2.js +76 -0
  53. package/frontend/.svelte-kit/adapter-node/chunks/internal.js +3 -4
  54. package/frontend/.svelte-kit/adapter-node/chunks/reports.js +16 -33
  55. package/frontend/.svelte-kit/adapter-node/chunks/runner.js +45 -0
  56. package/frontend/.svelte-kit/adapter-node/chunks/stores.js +43 -0
  57. package/frontend/{build/client/_app/immutable/chunks/rVEKg0Ak.js → .svelte-kit/adapter-node/chunks/theme.js} +9 -1
  58. package/frontend/.svelte-kit/{output/client/_app/immutable/entry/start.GiBry-lw.js → adapter-node/entries/pages/_layout.js} +4 -1
  59. package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +10 -154
  60. package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +46 -28
  61. package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +40 -0
  62. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +62 -0
  63. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +167 -89
  64. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +257 -0
  65. package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +91 -52
  66. package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +562 -0
  67. package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +40 -0
  68. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/_page.svelte.js +421 -0
  69. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +62 -0
  70. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +198 -0
  71. package/frontend/.svelte-kit/adapter-node/index.js +2 -1
  72. package/frontend/.svelte-kit/adapter-node/manifest-full.js +64 -8
  73. package/frontend/.svelte-kit/adapter-node/manifest.js +64 -8
  74. package/frontend/.svelte-kit/adapter-node/nodes/0.js +5 -3
  75. package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -1
  76. package/frontend/.svelte-kit/adapter-node/nodes/10.js +25 -0
  77. package/frontend/.svelte-kit/adapter-node/nodes/11.js +25 -0
  78. package/frontend/.svelte-kit/adapter-node/nodes/12.js +25 -0
  79. package/frontend/.svelte-kit/adapter-node/nodes/2.js +2 -2
  80. package/frontend/.svelte-kit/adapter-node/nodes/3.js +3 -3
  81. package/frontend/.svelte-kit/adapter-node/nodes/4.js +3 -3
  82. package/frontend/.svelte-kit/adapter-node/nodes/5.js +3 -3
  83. package/frontend/.svelte-kit/adapter-node/nodes/6.js +25 -0
  84. package/frontend/.svelte-kit/adapter-node/nodes/7.js +25 -0
  85. package/frontend/.svelte-kit/adapter-node/nodes/8.js +25 -0
  86. package/frontend/.svelte-kit/adapter-node/nodes/9.js +25 -0
  87. package/frontend/.svelte-kit/ambient.d.ts +4 -0
  88. package/frontend/.svelte-kit/generated/client-optimized/app.js +18 -4
  89. package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +2 -0
  90. package/frontend/.svelte-kit/generated/client-optimized/nodes/10.js +18 -0
  91. package/frontend/.svelte-kit/generated/client-optimized/nodes/11.js +18 -0
  92. package/frontend/.svelte-kit/generated/client-optimized/nodes/12.js +18 -0
  93. package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +1 -1
  94. package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +1 -1
  95. package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +1 -1
  96. package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +18 -0
  97. package/frontend/.svelte-kit/generated/client-optimized/nodes/7.js +18 -0
  98. package/frontend/.svelte-kit/generated/client-optimized/nodes/8.js +18 -0
  99. package/frontend/.svelte-kit/generated/client-optimized/nodes/9.js +18 -0
  100. package/frontend/.svelte-kit/generated/server/internal.js +1 -1
  101. package/frontend/.svelte-kit/output/client/.vite/manifest.json +486 -155
  102. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +18 -0
  103. package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.CdaQUS6U.css +18 -0
  104. package/frontend/.svelte-kit/output/client/_app/immutable/assets/11.BJ-I1gHO.css +18 -0
  105. package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +18 -0
  106. package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CrXpMrqh.css +18 -0
  107. package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BR3wgXcZ.css +18 -0
  108. package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +18 -0
  109. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +18 -0
  110. package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +18 -0
  111. package/frontend/.svelte-kit/output/client/_app/immutable/assets/7.CBHi6pzT.css +18 -0
  112. package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.Bhof07Eg.css +18 -0
  113. package/frontend/.svelte-kit/output/client/_app/immutable/assets/9._h2o67kg.css +18 -0
  114. package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
  115. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
  116. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.FOWXxvc7.css +18 -0
  117. package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
  118. package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css +18 -0
  119. package/frontend/.svelte-kit/output/client/_app/immutable/assets/EmptyState.BdO1q9cJ.css +18 -0
  120. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
  121. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
  122. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
  123. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +18 -0
  124. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
  125. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
  126. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
  127. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
  128. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
  129. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
  130. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
  131. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
  132. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
  133. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page._h2o67kg.css +18 -0
  134. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0pefNHY.js +18 -0
  135. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BFEiffAL.js +18 -0
  136. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CJ8q7g9Y.js → BFgtfHj2.js} +1 -1
  137. package/frontend/.svelte-kit/{adapter-node/chunks/equality.js → output/client/_app/immutable/chunks/BIRVeCLU.js} +1 -14
  138. package/frontend/.svelte-kit/output/{server/chunks/equality.js → client/_app/immutable/chunks/BKCNyxZ2.js} +1 -14
  139. package/frontend/{build/client/_app/immutable/chunks/CHV2KnPr.js → .svelte-kit/output/client/_app/immutable/chunks/BLAiBE__.js} +1 -1
  140. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BVMec-1T.js +18 -0
  141. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BeO8veBd.js +18 -0
  142. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bfc47y5P.js +18 -0
  143. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BgNaeXAp.js +18 -0
  144. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BkKmeUbA.js +18 -0
  145. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C3SY6-sX.js +19 -0
  146. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C4eeChIU.js +18 -0
  147. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C67QNx7Z.js +18 -0
  148. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CVV6HrFb.js +18 -0
  149. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CstKKb9b.js +18 -0
  150. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CxTX_lpP.js +18 -0
  151. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CyQ_oBw2.js +18 -0
  152. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CwBTqcbj.js → DGryW1Vp.js} +1 -1
  153. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{BKz6FZdB.js → DIx44H9N.js} +1 -1
  154. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DP6QP4L6.js +18 -0
  155. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DmRbbcS3.js +23 -0
  156. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/IFIFk6zi.js +18 -0
  157. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/KJdjlibc.js +20 -0
  158. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/ll-VsEGv.js +18 -0
  159. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/raHbXn_9.js +18 -0
  160. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/uFRI_bmR.js +18 -0
  161. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.Dz_CBZcR.js +19 -0
  162. package/frontend/{build/client/_app/immutable/entry/start.GiBry-lw.js → .svelte-kit/output/client/_app/immutable/entry/start.MMlC62np.js} +1 -1
  163. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.CKD9Qja6.js +23 -0
  164. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{1.N4gjrCnX.js → 1.Dbck5ct8.js} +1 -1
  165. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/10.BfmGpmC1.js +19 -0
  166. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/11.C7l9HPom.js +18 -0
  167. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.Iu9bcGdC.js +19 -0
  168. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.BqQhRvYh.js +18 -0
  169. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.BZRTKadS.js +18 -0
  170. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.BfKoPKdM.js +18 -0
  171. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.B4a2uCWn.js +18 -0
  172. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.CI508CMS.js +18 -0
  173. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.3x_eiof1.js +18 -0
  174. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.BfUuob4H.js +29 -0
  175. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/9.BZhCKRJe.js +18 -0
  176. package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
  177. package/frontend/.svelte-kit/output/client/favicon-32x32.png +0 -0
  178. package/frontend/.svelte-kit/output/client/favicon.ico +0 -0
  179. package/frontend/.svelte-kit/output/server/.vite/manifest.json +312 -37
  180. package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
  181. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
  182. package/frontend/.svelte-kit/output/server/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
  183. package/frontend/.svelte-kit/output/server/_app/immutable/assets/EmptyState.BdO1q9cJ.css +18 -0
  184. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
  185. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
  186. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
  187. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +18 -0
  188. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
  189. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
  190. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
  191. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
  192. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
  193. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
  194. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
  195. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
  196. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
  197. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page._h2o67kg.css +18 -0
  198. package/frontend/.svelte-kit/output/server/chunks/BackLink.js +29 -0
  199. package/frontend/.svelte-kit/output/server/chunks/Badge.js +3 -3
  200. package/frontend/.svelte-kit/output/server/chunks/Button.js +4 -3
  201. package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +74 -0
  202. package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +34 -0
  203. package/frontend/.svelte-kit/output/server/chunks/Toast.js +36 -0
  204. package/frontend/.svelte-kit/output/server/chunks/auth.js +61 -0
  205. package/frontend/.svelte-kit/output/server/chunks/client.js +9 -2
  206. package/frontend/.svelte-kit/output/server/chunks/constants.js +41 -0
  207. package/frontend/.svelte-kit/output/server/chunks/exports.js +7 -65
  208. package/frontend/.svelte-kit/output/server/chunks/format.js +51 -0
  209. package/frontend/.svelte-kit/output/server/chunks/index-server.js +31 -0
  210. package/frontend/.svelte-kit/output/server/chunks/index.js +71 -50
  211. package/frontend/.svelte-kit/output/server/chunks/index2.js +76 -0
  212. package/frontend/.svelte-kit/output/server/chunks/internal.js +3 -4
  213. package/frontend/.svelte-kit/output/server/chunks/reports.js +16 -33
  214. package/frontend/.svelte-kit/output/server/chunks/runner.js +45 -0
  215. package/frontend/.svelte-kit/output/server/chunks/stores.js +43 -0
  216. package/frontend/.svelte-kit/output/server/chunks/theme.js +26 -0
  217. package/frontend/.svelte-kit/output/server/entries/pages/_layout.js +21 -0
  218. package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +10 -154
  219. package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +46 -28
  220. package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +40 -0
  221. package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +62 -0
  222. package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +167 -89
  223. package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +257 -0
  224. package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +91 -52
  225. package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +562 -0
  226. package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +40 -0
  227. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/_page.svelte.js +421 -0
  228. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +62 -0
  229. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +198 -0
  230. package/frontend/.svelte-kit/output/server/index.js +2 -1
  231. package/frontend/.svelte-kit/output/server/manifest-full.js +64 -8
  232. package/frontend/.svelte-kit/output/server/manifest.js +64 -8
  233. package/frontend/.svelte-kit/output/server/nodes/0.js +5 -3
  234. package/frontend/.svelte-kit/output/server/nodes/1.js +1 -1
  235. package/frontend/.svelte-kit/output/server/nodes/10.js +25 -0
  236. package/frontend/.svelte-kit/output/server/nodes/11.js +25 -0
  237. package/frontend/.svelte-kit/output/server/nodes/12.js +25 -0
  238. package/frontend/.svelte-kit/output/server/nodes/2.js +2 -2
  239. package/frontend/.svelte-kit/output/server/nodes/3.js +3 -3
  240. package/frontend/.svelte-kit/output/server/nodes/4.js +3 -3
  241. package/frontend/.svelte-kit/output/server/nodes/5.js +3 -3
  242. package/frontend/.svelte-kit/output/server/nodes/6.js +25 -0
  243. package/frontend/.svelte-kit/output/server/nodes/7.js +25 -0
  244. package/frontend/.svelte-kit/output/server/nodes/8.js +25 -0
  245. package/frontend/.svelte-kit/output/server/nodes/9.js +25 -0
  246. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +18 -0
  247. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.br +0 -0
  248. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.gz +0 -0
  249. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css +18 -0
  250. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.br +0 -0
  251. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.gz +0 -0
  252. package/frontend/build/client/_app/immutable/assets/11.BJ-I1gHO.css +18 -0
  253. package/frontend/build/client/_app/immutable/assets/11.BJ-I1gHO.css.br +0 -0
  254. package/frontend/build/client/_app/immutable/assets/11.BJ-I1gHO.css.gz +0 -0
  255. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css +18 -0
  256. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.br +0 -0
  257. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.gz +0 -0
  258. package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css +18 -0
  259. package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.br +0 -0
  260. package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.gz +0 -0
  261. package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css +18 -0
  262. package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.br +0 -0
  263. package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.gz +0 -0
  264. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css +18 -0
  265. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.br +0 -0
  266. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.gz +0 -0
  267. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css +18 -0
  268. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.br +0 -0
  269. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.gz +0 -0
  270. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css +18 -0
  271. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.br +0 -0
  272. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.gz +0 -0
  273. package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css +18 -0
  274. package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.br +0 -0
  275. package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.gz +0 -0
  276. package/frontend/build/client/_app/immutable/assets/8.Bhof07Eg.css +18 -0
  277. package/frontend/build/client/_app/immutable/assets/8.Bhof07Eg.css.br +0 -0
  278. package/frontend/build/client/_app/immutable/assets/8.Bhof07Eg.css.gz +0 -0
  279. package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css +18 -0
  280. package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.br +0 -0
  281. package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.gz +0 -0
  282. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
  283. package/frontend/build/client/_app/immutable/{chunks/rVEKg0Ak.js.br → assets/BackLink.CvWWuO3h.css.br} +0 -0
  284. package/frontend/build/client/_app/immutable/{chunks/rVEKg0Ak.js.gz → assets/BackLink.CvWWuO3h.css.gz} +0 -0
  285. package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
  286. package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.br +0 -0
  287. package/frontend/build/client/_app/immutable/assets/{Badge.DLLowvEA.css.gz → Badge.D1SV0Gv7.css.gz} +0 -0
  288. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css +18 -0
  289. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.br +0 -0
  290. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.gz +0 -0
  291. package/frontend/build/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
  292. package/frontend/build/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css.br +0 -0
  293. package/frontend/build/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css.gz +0 -0
  294. package/frontend/build/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css +18 -0
  295. package/frontend/build/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css.br +0 -0
  296. package/frontend/build/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css.gz +0 -0
  297. package/frontend/build/client/_app/immutable/assets/EmptyState.BdO1q9cJ.css +18 -0
  298. package/frontend/build/client/_app/immutable/{chunks/CJ8q7g9Y.js.br → assets/EmptyState.BdO1q9cJ.css.br} +0 -0
  299. package/frontend/build/client/_app/immutable/assets/EmptyState.BdO1q9cJ.css.gz +0 -0
  300. package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
  301. package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.br +0 -0
  302. package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.gz +0 -0
  303. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
  304. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.br +0 -0
  305. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.gz +0 -0
  306. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
  307. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.br +0 -0
  308. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.gz +0 -0
  309. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css +18 -0
  310. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.br +0 -0
  311. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.gz +0 -0
  312. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
  313. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.br +0 -0
  314. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.gz +0 -0
  315. package/frontend/build/client/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
  316. package/frontend/build/client/_app/immutable/assets/_page.BJ-I1gHO.css.br +0 -0
  317. package/frontend/build/client/_app/immutable/assets/_page.BJ-I1gHO.css.gz +0 -0
  318. package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
  319. package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.br +0 -0
  320. package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.gz +0 -0
  321. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
  322. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.br +0 -0
  323. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.gz +0 -0
  324. package/frontend/build/client/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
  325. package/frontend/build/client/_app/immutable/assets/_page.Bhof07Eg.css.br +0 -0
  326. package/frontend/build/client/_app/immutable/assets/_page.Bhof07Eg.css.gz +0 -0
  327. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
  328. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.br +0 -0
  329. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.gz +0 -0
  330. package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
  331. package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.br +0 -0
  332. package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.gz +0 -0
  333. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
  334. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.br +0 -0
  335. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.gz +0 -0
  336. package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
  337. package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.br +0 -0
  338. package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.gz +0 -0
  339. package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css +18 -0
  340. package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.br +0 -0
  341. package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.gz +0 -0
  342. package/frontend/build/client/_app/immutable/chunks/B0pefNHY.js +18 -0
  343. package/frontend/build/client/_app/immutable/chunks/B0pefNHY.js.br +0 -0
  344. package/frontend/build/client/_app/immutable/chunks/B0pefNHY.js.gz +0 -0
  345. package/frontend/build/client/_app/immutable/chunks/BFEiffAL.js +18 -0
  346. package/frontend/build/client/_app/immutable/chunks/BFEiffAL.js.br +0 -0
  347. package/frontend/build/client/_app/immutable/chunks/BFEiffAL.js.gz +0 -0
  348. package/frontend/build/client/_app/immutable/chunks/{CJ8q7g9Y.js → BFgtfHj2.js} +1 -1
  349. package/frontend/build/client/_app/immutable/chunks/BFgtfHj2.js.br +0 -0
  350. package/frontend/build/client/_app/immutable/chunks/{CJ8q7g9Y.js.gz → BFgtfHj2.js.gz} +0 -0
  351. package/frontend/build/client/_app/immutable/chunks/BIRVeCLU.js +18 -0
  352. package/frontend/build/client/_app/immutable/chunks/{CHV2KnPr.js.gz → BIRVeCLU.js.br} +0 -0
  353. package/frontend/build/client/_app/immutable/chunks/BIRVeCLU.js.gz +0 -0
  354. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/oc0we5Us.js → build/client/_app/immutable/chunks/BKCNyxZ2.js} +1 -1
  355. package/frontend/build/client/_app/immutable/chunks/BKCNyxZ2.js.br +0 -0
  356. package/frontend/build/client/_app/immutable/chunks/BKCNyxZ2.js.gz +0 -0
  357. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CHV2KnPr.js → build/client/_app/immutable/chunks/BLAiBE__.js} +1 -1
  358. package/frontend/build/client/_app/immutable/chunks/{CHV2KnPr.js.br → BLAiBE__.js.br} +2 -2
  359. package/frontend/build/client/_app/immutable/{assets/Badge.DLLowvEA.css.br → chunks/BLAiBE__.js.gz} +0 -0
  360. package/frontend/build/client/_app/immutable/chunks/BVMec-1T.js +18 -0
  361. package/frontend/build/client/_app/immutable/chunks/BVMec-1T.js.br +0 -0
  362. package/frontend/build/client/_app/immutable/chunks/BVMec-1T.js.gz +0 -0
  363. package/frontend/build/client/_app/immutable/chunks/BeO8veBd.js +18 -0
  364. package/frontend/build/client/_app/immutable/chunks/BeO8veBd.js.br +0 -0
  365. package/frontend/build/client/_app/immutable/chunks/BeO8veBd.js.gz +0 -0
  366. package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js +18 -0
  367. package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.br +0 -0
  368. package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.gz +0 -0
  369. package/frontend/build/client/_app/immutable/chunks/BgNaeXAp.js +18 -0
  370. package/frontend/build/client/_app/immutable/chunks/BgNaeXAp.js.br +0 -0
  371. package/frontend/build/client/_app/immutable/chunks/BgNaeXAp.js.gz +0 -0
  372. package/frontend/build/client/_app/immutable/chunks/BkKmeUbA.js +18 -0
  373. package/frontend/build/client/_app/immutable/chunks/BkKmeUbA.js.br +0 -0
  374. package/frontend/build/client/_app/immutable/chunks/BkKmeUbA.js.gz +0 -0
  375. package/frontend/build/client/_app/immutable/chunks/C3SY6-sX.js +19 -0
  376. package/frontend/build/client/_app/immutable/chunks/C3SY6-sX.js.br +0 -0
  377. package/frontend/build/client/_app/immutable/chunks/C3SY6-sX.js.gz +0 -0
  378. package/frontend/build/client/_app/immutable/chunks/C4eeChIU.js +18 -0
  379. package/frontend/build/client/_app/immutable/chunks/C4eeChIU.js.br +0 -0
  380. package/frontend/build/client/_app/immutable/chunks/C4eeChIU.js.gz +0 -0
  381. package/frontend/build/client/_app/immutable/chunks/C67QNx7Z.js +18 -0
  382. package/frontend/build/client/_app/immutable/chunks/C67QNx7Z.js.br +0 -0
  383. package/frontend/build/client/_app/immutable/chunks/C67QNx7Z.js.gz +0 -0
  384. package/frontend/build/client/_app/immutable/chunks/CVV6HrFb.js +18 -0
  385. package/frontend/build/client/_app/immutable/chunks/CVV6HrFb.js.br +0 -0
  386. package/frontend/build/client/_app/immutable/chunks/CVV6HrFb.js.gz +0 -0
  387. package/frontend/build/client/_app/immutable/chunks/CstKKb9b.js +18 -0
  388. package/frontend/build/client/_app/immutable/chunks/CstKKb9b.js.br +0 -0
  389. package/frontend/build/client/_app/immutable/chunks/CstKKb9b.js.gz +0 -0
  390. package/frontend/build/client/_app/immutable/chunks/CxTX_lpP.js +18 -0
  391. package/frontend/build/client/_app/immutable/chunks/CxTX_lpP.js.br +0 -0
  392. package/frontend/build/client/_app/immutable/chunks/CxTX_lpP.js.gz +0 -0
  393. package/frontend/build/client/_app/immutable/chunks/CyQ_oBw2.js +18 -0
  394. package/frontend/build/client/_app/immutable/chunks/CyQ_oBw2.js.br +0 -0
  395. package/frontend/build/client/_app/immutable/chunks/CyQ_oBw2.js.gz +0 -0
  396. package/frontend/build/client/_app/immutable/chunks/DGryW1Vp.js +18 -0
  397. package/frontend/build/client/_app/immutable/chunks/DGryW1Vp.js.br +0 -0
  398. package/frontend/build/client/_app/immutable/chunks/DGryW1Vp.js.gz +0 -0
  399. package/frontend/build/client/_app/immutable/chunks/DIx44H9N.js +18 -0
  400. package/frontend/build/client/_app/immutable/chunks/DIx44H9N.js.br +0 -0
  401. package/frontend/build/client/_app/immutable/chunks/DIx44H9N.js.gz +0 -0
  402. package/frontend/build/client/_app/immutable/chunks/DP6QP4L6.js +18 -0
  403. package/frontend/build/client/_app/immutable/chunks/DP6QP4L6.js.br +0 -0
  404. package/frontend/build/client/_app/immutable/chunks/DP6QP4L6.js.gz +0 -0
  405. package/frontend/build/client/_app/immutable/chunks/DmRbbcS3.js +23 -0
  406. package/frontend/build/client/_app/immutable/chunks/DmRbbcS3.js.br +0 -0
  407. package/frontend/build/client/_app/immutable/chunks/DmRbbcS3.js.gz +0 -0
  408. package/frontend/build/client/_app/immutable/chunks/IFIFk6zi.js +18 -0
  409. package/frontend/build/client/_app/immutable/chunks/IFIFk6zi.js.br +0 -0
  410. package/frontend/build/client/_app/immutable/chunks/IFIFk6zi.js.gz +0 -0
  411. package/frontend/build/client/_app/immutable/chunks/KJdjlibc.js +20 -0
  412. package/frontend/build/client/_app/immutable/chunks/KJdjlibc.js.br +0 -0
  413. package/frontend/build/client/_app/immutable/chunks/KJdjlibc.js.gz +0 -0
  414. package/frontend/build/client/_app/immutable/chunks/ll-VsEGv.js +18 -0
  415. package/frontend/build/client/_app/immutable/chunks/ll-VsEGv.js.br +0 -0
  416. package/frontend/build/client/_app/immutable/chunks/ll-VsEGv.js.gz +0 -0
  417. package/frontend/build/client/_app/immutable/chunks/raHbXn_9.js +18 -0
  418. package/frontend/build/client/_app/immutable/chunks/raHbXn_9.js.br +0 -0
  419. package/frontend/build/client/_app/immutable/chunks/raHbXn_9.js.gz +0 -0
  420. package/frontend/build/client/_app/immutable/chunks/uFRI_bmR.js +18 -0
  421. package/frontend/build/client/_app/immutable/chunks/uFRI_bmR.js.br +0 -0
  422. package/frontend/build/client/_app/immutable/chunks/uFRI_bmR.js.gz +0 -0
  423. package/frontend/build/client/_app/immutable/entry/app.Dz_CBZcR.js +19 -0
  424. package/frontend/build/client/_app/immutable/entry/app.Dz_CBZcR.js.br +0 -0
  425. package/frontend/build/client/_app/immutable/entry/app.Dz_CBZcR.js.gz +0 -0
  426. package/frontend/build/client/_app/immutable/entry/start.MMlC62np.js +18 -0
  427. package/frontend/build/client/_app/immutable/entry/{start.GiBry-lw.js.br → start.MMlC62np.js.br} +1 -1
  428. package/frontend/build/client/_app/immutable/entry/{start.GiBry-lw.js.gz → start.MMlC62np.js.gz} +0 -0
  429. package/frontend/build/client/_app/immutable/nodes/0.CKD9Qja6.js +23 -0
  430. package/frontend/build/client/_app/immutable/nodes/0.CKD9Qja6.js.br +0 -0
  431. package/frontend/build/client/_app/immutable/nodes/0.CKD9Qja6.js.gz +0 -0
  432. package/frontend/build/client/_app/immutable/nodes/{1.N4gjrCnX.js → 1.Dbck5ct8.js} +1 -1
  433. package/frontend/build/client/_app/immutable/nodes/1.Dbck5ct8.js.br +0 -0
  434. package/frontend/build/client/_app/immutable/nodes/1.Dbck5ct8.js.gz +0 -0
  435. package/frontend/build/client/_app/immutable/nodes/10.BfmGpmC1.js +19 -0
  436. package/frontend/build/client/_app/immutable/nodes/10.BfmGpmC1.js.br +0 -0
  437. package/frontend/build/client/_app/immutable/nodes/10.BfmGpmC1.js.gz +0 -0
  438. package/frontend/build/client/_app/immutable/nodes/11.C7l9HPom.js +18 -0
  439. package/frontend/build/client/_app/immutable/nodes/11.C7l9HPom.js.br +0 -0
  440. package/frontend/build/client/_app/immutable/nodes/11.C7l9HPom.js.gz +0 -0
  441. package/frontend/build/client/_app/immutable/nodes/12.Iu9bcGdC.js +19 -0
  442. package/frontend/build/client/_app/immutable/nodes/12.Iu9bcGdC.js.br +0 -0
  443. package/frontend/build/client/_app/immutable/nodes/12.Iu9bcGdC.js.gz +0 -0
  444. package/frontend/build/client/_app/immutable/nodes/2.BqQhRvYh.js +18 -0
  445. package/frontend/build/client/_app/immutable/nodes/2.BqQhRvYh.js.br +0 -0
  446. package/frontend/build/client/_app/immutable/nodes/2.BqQhRvYh.js.gz +0 -0
  447. package/frontend/build/client/_app/immutable/nodes/3.BZRTKadS.js +18 -0
  448. package/frontend/build/client/_app/immutable/nodes/3.BZRTKadS.js.br +0 -0
  449. package/frontend/build/client/_app/immutable/nodes/3.BZRTKadS.js.gz +0 -0
  450. package/frontend/build/client/_app/immutable/nodes/4.BfKoPKdM.js +18 -0
  451. package/frontend/build/client/_app/immutable/nodes/4.BfKoPKdM.js.br +0 -0
  452. package/frontend/build/client/_app/immutable/nodes/4.BfKoPKdM.js.gz +0 -0
  453. package/frontend/build/client/_app/immutable/nodes/5.B4a2uCWn.js +18 -0
  454. package/frontend/build/client/_app/immutable/nodes/5.B4a2uCWn.js.br +0 -0
  455. package/frontend/build/client/_app/immutable/nodes/5.B4a2uCWn.js.gz +0 -0
  456. package/frontend/build/client/_app/immutable/nodes/6.CI508CMS.js +18 -0
  457. package/frontend/build/client/_app/immutable/nodes/6.CI508CMS.js.br +0 -0
  458. package/frontend/build/client/_app/immutable/nodes/6.CI508CMS.js.gz +0 -0
  459. package/frontend/build/client/_app/immutable/nodes/7.3x_eiof1.js +18 -0
  460. package/frontend/build/client/_app/immutable/nodes/7.3x_eiof1.js.br +0 -0
  461. package/frontend/build/client/_app/immutable/nodes/7.3x_eiof1.js.gz +0 -0
  462. package/frontend/build/client/_app/immutable/nodes/8.BfUuob4H.js +29 -0
  463. package/frontend/build/client/_app/immutable/nodes/8.BfUuob4H.js.br +0 -0
  464. package/frontend/build/client/_app/immutable/nodes/8.BfUuob4H.js.gz +0 -0
  465. package/frontend/build/client/_app/immutable/nodes/9.BZhCKRJe.js +18 -0
  466. package/frontend/build/client/_app/immutable/nodes/9.BZhCKRJe.js.br +0 -0
  467. package/frontend/build/client/_app/immutable/nodes/9.BZhCKRJe.js.gz +0 -0
  468. package/frontend/build/client/_app/version.json +1 -1
  469. package/frontend/build/client/_app/version.json.br +0 -0
  470. package/frontend/build/client/_app/version.json.gz +0 -0
  471. package/frontend/build/client/favicon-32x32.png +0 -0
  472. package/frontend/build/client/favicon.ico +0 -0
  473. package/frontend/build/server/chunks/0-Dzas6zkl.js +34 -0
  474. package/frontend/build/server/chunks/0-Dzas6zkl.js.map +17 -0
  475. package/frontend/build/server/chunks/{1-hso3H4Ax.js → 1-B4EsP8yr.js} +3 -3
  476. package/frontend/build/server/chunks/{1-hso3H4Ax.js.map → 1-B4EsP8yr.js.map} +1 -1
  477. package/frontend/build/server/chunks/10-UhDQZ5BY.js +26 -0
  478. package/frontend/build/server/chunks/10-UhDQZ5BY.js.map +17 -0
  479. package/frontend/build/server/chunks/11-mTH3nQlX.js +26 -0
  480. package/frontend/build/server/chunks/11-mTH3nQlX.js.map +17 -0
  481. package/frontend/build/server/chunks/12-9mg6kp53.js +26 -0
  482. package/frontend/build/server/chunks/12-9mg6kp53.js.map +17 -0
  483. package/frontend/build/server/chunks/{4-2UUrCVtM.js → 2-Bkz8H7CT.js} +5 -5
  484. package/frontend/build/server/chunks/2-Bkz8H7CT.js.map +17 -0
  485. package/frontend/build/server/chunks/{3-BYumY9dv.js → 3-DDtaiqu7.js} +4 -4
  486. package/frontend/build/server/chunks/3-DDtaiqu7.js.map +17 -0
  487. package/frontend/build/server/chunks/4-DbdkTAvS.js +26 -0
  488. package/frontend/build/server/chunks/4-DbdkTAvS.js.map +17 -0
  489. package/frontend/build/server/chunks/{5-C2_y_fwT.js → 5-CK5hY2WF.js} +4 -4
  490. package/frontend/build/server/chunks/5-CK5hY2WF.js.map +17 -0
  491. package/frontend/build/server/chunks/6-Cps9fL3Z.js +26 -0
  492. package/frontend/build/server/chunks/6-Cps9fL3Z.js.map +17 -0
  493. package/frontend/build/server/chunks/7-CgUpbaJD.js +26 -0
  494. package/frontend/build/server/chunks/7-CgUpbaJD.js.map +17 -0
  495. package/frontend/build/server/chunks/8-dilaVKYo.js +26 -0
  496. package/frontend/build/server/chunks/8-dilaVKYo.js.map +17 -0
  497. package/frontend/build/server/chunks/{2-BSZWXCWp.js → 9-CUJxgoIN.js} +5 -5
  498. package/frontend/build/server/chunks/9-CUJxgoIN.js.map +17 -0
  499. package/frontend/build/server/chunks/BackLink-KxZNqsaq.js +30 -0
  500. package/frontend/build/server/chunks/BackLink-KxZNqsaq.js.map +17 -0
  501. package/frontend/build/server/chunks/{Badge-CC4U7C0c.js → Badge-B5V-z6pI.js} +4 -4
  502. package/frontend/build/server/chunks/Badge-B5V-z6pI.js.map +17 -0
  503. package/frontend/build/server/chunks/{Button-BLkPicwS.js → Button-CuacyA7Y.js} +4 -4
  504. package/frontend/build/server/chunks/Button-CuacyA7Y.js.map +17 -0
  505. package/frontend/build/server/chunks/ConfirmModal-DBtnLLsU.js +73 -0
  506. package/frontend/build/server/chunks/ConfirmModal-DBtnLLsU.js.map +17 -0
  507. package/frontend/build/server/chunks/EmptyState-B74-VZ15.js +34 -0
  508. package/frontend/build/server/chunks/EmptyState-B74-VZ15.js.map +17 -0
  509. package/frontend/build/server/chunks/Toast-DDF2wi_5.js +37 -0
  510. package/frontend/build/server/chunks/Toast-DDF2wi_5.js.map +17 -0
  511. package/frontend/build/server/chunks/_layout.svelte-DoJXDbP1.js +39 -0
  512. package/frontend/build/server/chunks/_layout.svelte-DoJXDbP1.js.map +17 -0
  513. package/frontend/build/server/chunks/_page.svelte-BETENC2e.js +67 -0
  514. package/frontend/build/server/chunks/_page.svelte-BETENC2e.js.map +17 -0
  515. package/frontend/build/server/chunks/_page.svelte-C0vstY93.js +219 -0
  516. package/frontend/build/server/chunks/_page.svelte-C0vstY93.js.map +17 -0
  517. package/frontend/build/server/chunks/_page.svelte-CC27sZag.js +421 -0
  518. package/frontend/build/server/chunks/_page.svelte-CC27sZag.js.map +17 -0
  519. package/frontend/build/server/chunks/{_page.svelte-s6ZIOitT.js → _page.svelte-CYkOPxn2.js} +47 -29
  520. package/frontend/build/server/chunks/_page.svelte-CYkOPxn2.js.map +17 -0
  521. package/frontend/build/server/chunks/_page.svelte-CperUuP9.js +564 -0
  522. package/frontend/build/server/chunks/_page.svelte-CperUuP9.js.map +17 -0
  523. package/frontend/build/server/chunks/_page.svelte-CwrCf0C8.js +65 -0
  524. package/frontend/build/server/chunks/_page.svelte-CwrCf0C8.js.map +17 -0
  525. package/frontend/build/server/chunks/_page.svelte-DALHRFEX.js +43 -0
  526. package/frontend/build/server/chunks/_page.svelte-DALHRFEX.js.map +17 -0
  527. package/frontend/build/server/chunks/_page.svelte-DNNyBx4y.js +43 -0
  528. package/frontend/build/server/chunks/_page.svelte-DNNyBx4y.js.map +17 -0
  529. package/frontend/build/server/chunks/_page.svelte-DqWsUJRp.js +199 -0
  530. package/frontend/build/server/chunks/_page.svelte-DqWsUJRp.js.map +17 -0
  531. package/frontend/build/server/chunks/_page.svelte-LcJmR5du.js +219 -0
  532. package/frontend/build/server/chunks/_page.svelte-LcJmR5du.js.map +17 -0
  533. package/frontend/build/server/chunks/_page.svelte-gnktnXKP.js +259 -0
  534. package/frontend/build/server/chunks/_page.svelte-gnktnXKP.js.map +17 -0
  535. package/frontend/build/server/chunks/auth-rlH-cIzn.js +62 -0
  536. package/frontend/build/server/chunks/auth-rlH-cIzn.js.map +17 -0
  537. package/frontend/build/server/chunks/{client-C9IaEwNo.js → client-DyII78e0.js} +9 -4
  538. package/frontend/build/server/chunks/client-DyII78e0.js.map +17 -0
  539. package/frontend/build/server/chunks/constants-Drz-Vo39.js +35 -0
  540. package/frontend/build/server/chunks/constants-Drz-Vo39.js.map +17 -0
  541. package/frontend/build/server/chunks/{error.svelte-HKBv5sQT.js → error.svelte-BDW3iP1O.js} +4 -4
  542. package/frontend/build/server/chunks/{error.svelte-HKBv5sQT.js.map → error.svelte-BDW3iP1O.js.map} +1 -1
  543. package/frontend/build/server/chunks/{exports-OxlCJ8yE.js → exports-D0QHgeSL.js} +2 -67
  544. package/frontend/build/server/chunks/exports-D0QHgeSL.js.map +17 -0
  545. package/frontend/build/server/chunks/format-D26ZQccb.js +49 -0
  546. package/frontend/build/server/chunks/format-D26ZQccb.js.map +17 -0
  547. package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js +31 -0
  548. package/frontend/build/{client/_app/immutable/chunks/BKz6FZdB.js.br → server/chunks/index-server-Dr2Nvcmu.js.map} +0 -0
  549. package/frontend/build/server/chunks/{index-CjHlq1kt.js → index2-DG8XHU5D.js} +81 -10
  550. package/frontend/build/server/chunks/index2-DG8XHU5D.js.map +17 -0
  551. package/frontend/build/server/chunks/reports-Bgi7V5N7.js +40 -0
  552. package/frontend/build/server/chunks/reports-Bgi7V5N7.js.map +17 -0
  553. package/frontend/build/server/chunks/runner-D18Ml_vF.js +42 -0
  554. package/frontend/build/server/chunks/runner-D18Ml_vF.js.map +17 -0
  555. package/frontend/build/server/chunks/{reports-D3ZeYSmi.js → stores-DlkXV308.js} +4 -16
  556. package/frontend/build/server/chunks/stores-DlkXV308.js.map +17 -0
  557. package/frontend/build/server/chunks/theme-D_NKm6iI.js +27 -0
  558. package/frontend/build/server/chunks/theme-D_NKm6iI.js.map +17 -0
  559. package/frontend/build/server/index.js +4 -4
  560. package/frontend/build/server/index.js.map +1 -1
  561. package/frontend/build/server/manifest.js +69 -13
  562. package/frontend/build/server/manifest.js.map +1 -1
  563. package/frontend/src/lib/api/runners.js +10 -0
  564. package/frontend/src/lib/api/settings.js +3 -3
  565. package/frontend/src/lib/components/layout/RunnerPanel.svelte +108 -21
  566. package/frontend/src/lib/components/ui/Badge.svelte +6 -1
  567. package/frontend/src/lib/constants.js +3 -1
  568. package/frontend/src/lib/stores/runner.js +5 -2
  569. package/frontend/src/lib/styles/tokens.css +4 -0
  570. package/frontend/src/lib/utils/format.js +3 -0
  571. package/frontend/src/routes/reports/[id]/+page.svelte +13 -1
  572. package/frontend/src/routes/reports/live/+page.svelte +38 -17
  573. package/frontend/src/routes/scheduled-tests/+page.svelte +2 -2
  574. package/frontend/src/routes/settings/+page.svelte +134 -3
  575. package/package.json +1 -1
  576. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
  577. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Button.cBruH0aD.css +0 -34
  578. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
  579. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BVnUajEa.css +0 -34
  580. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
  581. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
  582. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
  583. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_slug_/_page.svelte.js +0 -42
  584. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.CnXRuPt4.css +0 -34
  585. package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CGnCsn5q.css +0 -34
  586. package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BVnUajEa.css +0 -34
  587. package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.DBhBrHFz.css +0 -34
  588. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.D93VAB-w.css +0 -34
  589. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
  590. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.cBruH0aD.css +0 -34
  591. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
  592. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BVnUajEa.css +0 -34
  593. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
  594. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
  595. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
  596. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0bn91RF.js +0 -18
  597. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B1kE5jmt.js +0 -23
  598. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Be4iUAB0.js +0 -18
  599. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BpaMqo9O.js +0 -18
  600. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bt3-Z7H1.js +0 -18
  601. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cit9MuSg.js +0 -20
  602. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DBk3zeq4.js +0 -18
  603. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DFJLQFic.js +0 -18
  604. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DTUE7kkY.js +0 -18
  605. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/IYPwzKs_.js +0 -20
  606. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.C2MbX06K.js +0 -19
  607. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BsCYK-Tn.js +0 -21
  608. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.D9yQNzK8.js +0 -18
  609. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.CBC5WvNb.js +0 -18
  610. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.BU6UZHSE.js +0 -19
  611. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.Dzzfrntl.js +0 -18
  612. package/frontend/.svelte-kit/output/client/favicon.png +0 -0
  613. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
  614. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Button.cBruH0aD.css +0 -34
  615. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
  616. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BVnUajEa.css +0 -34
  617. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
  618. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
  619. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
  620. package/frontend/.svelte-kit/output/server/entries/pages/reports/_slug_/_page.svelte.js +0 -42
  621. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css +0 -34
  622. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.br +0 -0
  623. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.gz +0 -0
  624. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css +0 -34
  625. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.br +0 -0
  626. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.gz +0 -0
  627. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css +0 -34
  628. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.br +0 -0
  629. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.gz +0 -0
  630. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css +0 -34
  631. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.br +0 -0
  632. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.gz +0 -0
  633. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css +0 -34
  634. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.br +0 -0
  635. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.gz +0 -0
  636. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
  637. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css +0 -34
  638. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.br +0 -0
  639. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.gz +0 -0
  640. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
  641. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.br +0 -0
  642. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.gz +0 -0
  643. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css +0 -34
  644. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.br +0 -0
  645. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.gz +0 -0
  646. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
  647. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.br +0 -0
  648. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.gz +0 -0
  649. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
  650. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.br +0 -0
  651. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.gz +0 -0
  652. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
  653. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.br +0 -0
  654. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.gz +0 -0
  655. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js +0 -18
  656. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.br +0 -0
  657. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.gz +0 -0
  658. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js +0 -23
  659. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.br +0 -0
  660. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.gz +0 -0
  661. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js +0 -18
  662. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js.gz +0 -0
  663. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js +0 -18
  664. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.br +0 -0
  665. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.gz +0 -0
  666. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js +0 -18
  667. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.br +0 -0
  668. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.gz +0 -0
  669. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js +0 -18
  670. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.br +0 -0
  671. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.gz +0 -0
  672. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js +0 -20
  673. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.br +0 -0
  674. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.gz +0 -0
  675. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js +0 -18
  676. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.br +0 -0
  677. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.gz +0 -0
  678. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js +0 -18
  679. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.br +0 -0
  680. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.gz +0 -0
  681. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js +0 -18
  682. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.br +0 -0
  683. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.gz +0 -0
  684. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js +0 -18
  685. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.br +0 -0
  686. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.gz +0 -0
  687. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js +0 -20
  688. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.br +0 -0
  689. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.gz +0 -0
  690. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js +0 -18
  691. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.br +0 -0
  692. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.gz +0 -0
  693. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js +0 -19
  694. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.br +0 -0
  695. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.gz +0 -0
  696. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js +0 -21
  697. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.br +0 -0
  698. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.gz +0 -0
  699. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.br +0 -0
  700. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.gz +0 -0
  701. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js +0 -18
  702. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.br +0 -0
  703. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.gz +0 -0
  704. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js +0 -18
  705. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.br +0 -0
  706. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.gz +0 -0
  707. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js +0 -19
  708. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.br +0 -0
  709. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.gz +0 -0
  710. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js +0 -18
  711. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.br +0 -0
  712. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.gz +0 -0
  713. package/frontend/build/client/favicon.png +0 -0
  714. package/frontend/build/server/chunks/0-BFfqmlsS.js +0 -26
  715. package/frontend/build/server/chunks/0-BFfqmlsS.js.map +0 -17
  716. package/frontend/build/server/chunks/2-BSZWXCWp.js.map +0 -17
  717. package/frontend/build/server/chunks/3-BYumY9dv.js.map +0 -17
  718. package/frontend/build/server/chunks/4-2UUrCVtM.js.map +0 -17
  719. package/frontend/build/server/chunks/5-C2_y_fwT.js.map +0 -17
  720. package/frontend/build/server/chunks/Badge-CC4U7C0c.js.map +0 -17
  721. package/frontend/build/server/chunks/Button-BLkPicwS.js.map +0 -17
  722. package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js +0 -183
  723. package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js.map +0 -17
  724. package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js +0 -45
  725. package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js.map +0 -17
  726. package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js +0 -142
  727. package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js.map +0 -17
  728. package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js +0 -180
  729. package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js.map +0 -17
  730. package/frontend/build/server/chunks/_page.svelte-s6ZIOitT.js.map +0 -17
  731. package/frontend/build/server/chunks/client-C9IaEwNo.js.map +0 -17
  732. package/frontend/build/server/chunks/exports-OxlCJ8yE.js.map +0 -17
  733. package/frontend/build/server/chunks/index-CjHlq1kt.js.map +0 -17
  734. package/frontend/build/server/chunks/reports-D3ZeYSmi.js.map +0 -17
@@ -39,7 +39,9 @@
39
39
  updateRunner,
40
40
  deleteRunner,
41
41
  pingRunner,
42
- probeRunner
42
+ probeRunner,
43
+ stopRunner,
44
+ restartRunner
43
45
  } from '$lib/api/runners';
44
46
  import { fetchPrefixes, savePrefixes, migratePrefixes } from '$lib/api/repository';
45
47
  import { updateProfile, changePassword } from '$lib/api/auth';
@@ -51,10 +53,11 @@
51
53
  import { builtInEnabled } from '$lib/stores/runner';
52
54
  import { auth } from '$lib/stores/auth';
53
55
  import { theme } from '$lib/stores/theme';
54
- import { BROWSERS, TOAST_TIMEOUT_MS } from '$lib/constants';
56
+ import { API_BASE, BROWSERS, TOAST_TIMEOUT_MS, MAX_TEST_RETRIES } from '$lib/constants';
55
57
  import Button from '$lib/components/ui/Button.svelte';
56
58
  import Toast from '$lib/components/ui/Toast.svelte';
57
59
  import ConfirmModal from '$lib/components/ui/ConfirmModal.svelte';
60
+ import Badge from '$lib/components/ui/Badge.svelte';
58
61
 
59
62
  /** @type {'project' | 'runners' | 'repository' | 'integrations' | 'mcp' | 'account' | 'users' | 'backup'} */
60
63
  let section =
@@ -68,7 +71,7 @@
68
71
  } catch {}
69
72
  }
70
73
 
71
- let project = { name: '', logoUrl: '', timezone: 'UTC' };
74
+ let project = { name: '', logoUrl: '', timezone: 'UTC', maxRetries: 0 };
72
75
  let projectSaving = false;
73
76
  let toast = null;
74
77
 
@@ -114,6 +117,7 @@
114
117
  let mcpGenerating = false;
115
118
  let mcpKeyCopied = false;
116
119
  let mcpSnippetCopied = false;
120
+ let ciSnippetCopied = false;
117
121
 
118
122
  let backupConfig = {
119
123
  backupEnabled: false,
@@ -140,6 +144,8 @@
140
144
  let runnerFormSaving = false;
141
145
  let runnerFormOpen = false;
142
146
  let pingResults = {};
147
+ let stoppingId = null;
148
+ let restartingId = null;
143
149
  let editingId = null;
144
150
  let editForm = { name: '', url: '', token: '', browser: 'chromium' };
145
151
  let editFormError = '';
@@ -278,6 +284,51 @@
278
284
  }
279
285
  }
280
286
 
287
+ async function refreshPing(id) {
288
+ pingResults = { ...pingResults, [id]: { loading: true } };
289
+ try {
290
+ const result = await pingRunner(id);
291
+ pingResults = { ...pingResults, [id]: { ...result, loading: false } };
292
+ } catch {
293
+ pingResults = { ...pingResults, [id]: { ok: false, error: 'Network error', loading: false } };
294
+ }
295
+ }
296
+
297
+ async function handleStopRunner(id, name) {
298
+ stoppingId = id;
299
+ try {
300
+ const result = await stopRunner(id);
301
+ if (result.ok) {
302
+ showToast('success', `Runner "${name}" stopped.`);
303
+ } else {
304
+ showToast('error', `Could not stop "${name}": ${result.error ?? 'unknown error'}`);
305
+ }
306
+ } catch {
307
+ showToast('error', `Could not stop "${name}".`);
308
+ } finally {
309
+ stoppingId = null;
310
+ refreshPing(id);
311
+ }
312
+ }
313
+
314
+ async function handleRestartRunner(id, name) {
315
+ restartingId = id;
316
+ try {
317
+ const result = await restartRunner(id);
318
+ if (result.ok) {
319
+ showToast('success', `Runner "${name}" restarting…`);
320
+ } else {
321
+ showToast('error', `Could not restart "${name}": ${result.error ?? 'unknown error'}`);
322
+ }
323
+ } catch {
324
+ showToast('error', `Could not restart "${name}".`);
325
+ } finally {
326
+ restartingId = null;
327
+ // Give the replacement process a moment to bind before checking on it.
328
+ setTimeout(() => refreshPing(id), 2000);
329
+ }
330
+ }
331
+
281
332
  function startEdit(r) {
282
333
  editingId = r.id;
283
334
  editForm = { name: r.name, url: r.url, token: r.token, browser: r.browser };
@@ -497,6 +548,13 @@
497
548
  });
498
549
  }
499
550
 
551
+ function handleCopyCiSnippet() {
552
+ navigator.clipboard.writeText(ciWorkflowSnippet).then(() => {
553
+ ciSnippetCopied = true;
554
+ setTimeout(() => (ciSnippetCopied = false), 1500);
555
+ });
556
+ }
557
+
500
558
  async function handleSaveIntegrations() {
501
559
  integrationsSaving = true;
502
560
  try {
@@ -586,6 +644,15 @@
586
644
  2
587
645
  );
588
646
 
647
+ $: ciWorkflowSnippet = [
648
+ '- name: Run Plum tests',
649
+ ' run: |',
650
+ ` curl -X POST ${API_BASE}/trigger \\`,
651
+ ' -H "Authorization: ApiKey ${{ secrets.PLUM_API_KEY }}" \\',
652
+ ' -H "Content-Type: application/json" \\',
653
+ ' -d \'{"tag": "@smoke", "baseUrl": "https://your-pr-preview-url"}\''
654
+ ].join('\n');
655
+
589
656
  const ADMIN_SECTIONS = new Set([
590
657
  'project',
591
658
  'runners',
@@ -699,6 +766,24 @@
699
766
  </select>
700
767
  </div>
701
768
 
769
+ <div class="field">
770
+ <label class="field-label" for="project-max-retries">
771
+ <span>Retry failed tests</span>
772
+ <span class="field-hint">
773
+ Automatically re-run failed scenarios up to this many times before finalizing the
774
+ report. 0 disables retries.
775
+ </span>
776
+ </label>
777
+ <input
778
+ id="project-max-retries"
779
+ type="number"
780
+ class="field-input"
781
+ min="0"
782
+ max={MAX_TEST_RETRIES}
783
+ bind:value={project.maxRetries}
784
+ />
785
+ </div>
786
+
702
787
  <!-- Dark mode toggle -->
703
788
  <div class="toggle-row">
704
789
  <div class="toggle-info">
@@ -860,6 +945,20 @@
860
945
  <p class="runner-card-url">{r.url}</p>
861
946
  <div class="runner-card-actions">
862
947
  <Button variant="ghost" size="sm" on:click={() => startEdit(r)}>Edit</Button>
948
+ <Button
949
+ variant="ghost"
950
+ size="sm"
951
+ disabled={restartingId === r.id}
952
+ on:click={() => handleRestartRunner(r.id, r.name)}
953
+ >{restartingId === r.id ? 'Restarting…' : 'Restart'}</Button
954
+ >
955
+ <Button
956
+ variant="ghost"
957
+ size="sm"
958
+ disabled={stoppingId === r.id}
959
+ on:click={() => handleStopRunner(r.id, r.name)}
960
+ >{stoppingId === r.id ? 'Stopping…' : 'Stop'}</Button
961
+ >
863
962
  <Button
864
963
  variant="danger"
865
964
  size="sm"
@@ -1096,6 +1195,27 @@
1096
1195
  {integrationsSaving ? 'Saving…' : 'Save Integrations'}
1097
1196
  </Button>
1098
1197
  </div>
1198
+
1199
+ <div class="card settings-card">
1200
+ <p class="card-title">CI / External Triggers</p>
1201
+ <p class="content-desc">
1202
+ Trigger a Plum run from GitHub Actions (e.g. on a pull request, against its preview
1203
+ deployment) or any other external script by calling <code class="code-sample"
1204
+ >POST {API_BASE}/trigger</code
1205
+ >
1206
+ with an
1207
+ <code class="code-sample">Authorization: ApiKey …</code> header. Generate a key on the
1208
+ <button class="link-btn" on:click={() => setSection('mcp')}>MCP tab</button>
1209
+ and store it as a repo secret — never commit it directly. Runs triggered this way show up
1210
+ in Reports tagged <Badge variant="external">External</Badge>.
1211
+ </p>
1212
+ <pre class="mcp-snippet">{ciWorkflowSnippet}</pre>
1213
+ <div class="card-footer">
1214
+ <Button variant="ghost" on:click={handleCopyCiSnippet}>
1215
+ {ciSnippetCopied ? 'Copied!' : 'Copy Workflow Step'}
1216
+ </Button>
1217
+ </div>
1218
+ </div>
1099
1219
  </div>
1100
1220
 
1101
1221
  <!-- MCP -->
@@ -1946,6 +2066,7 @@
1946
2066
  .runner-card-actions {
1947
2067
  display: flex;
1948
2068
  align-items: center;
2069
+ flex-wrap: wrap;
1949
2070
  gap: 0.375rem;
1950
2071
  padding-left: calc(13px + 0.5rem);
1951
2072
  margin-top: 0.125rem;
@@ -2201,6 +2322,16 @@
2201
2322
  border-radius: 3px;
2202
2323
  }
2203
2324
 
2325
+ .link-btn {
2326
+ font: inherit;
2327
+ color: var(--accent);
2328
+ background: none;
2329
+ border: none;
2330
+ padding: 0;
2331
+ cursor: pointer;
2332
+ text-decoration: underline;
2333
+ }
2334
+
2204
2335
  .account-info {
2205
2336
  display: flex;
2206
2337
  flex-direction: column;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plum-e2e",
3
- "version": "2.5.14",
3
+ "version": "2.6.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/silverlunah/plum.git"
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- .badge.svelte-imjoo5{display:inline-flex;align-items:center;font-size:.68rem;font-weight:500;letter-spacing:.05em;text-transform:uppercase;padding:.2rem .6rem;border-radius:100px;white-space:nowrap}.pass.svelte-imjoo5{background:var(--pass-soft);color:var(--pass)}.fail.svelte-imjoo5{background:var(--fail-soft);color:var(--fail)}.tag.svelte-imjoo5{background:var(--accent-soft);color:var(--accent)}.schedule.svelte-imjoo5{background:var(--warn-soft);color:var(--warn)}.neutral.svelte-imjoo5{background:var(--bg-subtle);color:var(--text-muted);border:1px solid var(--border)}
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- .btn.svelte-1mw9qtj{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font-family:var(--font-body);font-weight:400;border-radius:var(--radius-md);border:1px solid transparent;cursor:pointer;white-space:nowrap;text-decoration:none;transition:background var(--duration-fast) var(--ease-out),color var(--duration-fast) var(--ease-out),border-color var(--duration-fast) var(--ease-out),box-shadow var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out),opacity var(--duration-fast)}.btn.svelte-1mw9qtj:active:not(:disabled){transform:scale(.97)}.btn.svelte-1mw9qtj:disabled{opacity:.38;cursor:not-allowed}.sm.svelte-1mw9qtj{font-size:.75rem;padding:.3rem .75rem;border-radius:var(--radius-sm)}.md.svelte-1mw9qtj{font-size:.875rem;padding:.55rem 1.25rem}.primary.svelte-1mw9qtj{background:var(--accent);color:#fff;border-color:var(--accent)}.primary.svelte-1mw9qtj:hover:not(:disabled){filter:brightness(1.12);box-shadow:0 4px 14px color-mix(in srgb,var(--accent) 30%,transparent)}.ghost.svelte-1mw9qtj{background:transparent;color:var(--text-muted);border-color:var(--border)}.ghost.svelte-1mw9qtj:hover:not(:disabled){background:var(--bg-subtle);color:var(--text);border-color:var(--text-muted)}.danger.svelte-1mw9qtj{background:transparent;color:var(--fail);border-color:var(--fail)}.danger.svelte-1mw9qtj:hover:not(:disabled){background:var(--fail-soft)}.outline.svelte-1mw9qtj{background:transparent;color:var(--accent);border-color:var(--accent)}.outline.svelte-1mw9qtj:hover:not(:disabled){background:var(--accent-soft)}
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.block{display:block}.flex{display:flex}.table{display:table}.contents{display:contents}.hidden{display:none}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flex-wrap{flex-wrap:wrap}.border{border-width:1px}.uppercase{text-transform:uppercase}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--bg: #fdfcfb;--bg-subtle: #f7f6f4;--bg-elevated: #ffffff;--border: #e9e5df;--text: #18160f;--text-muted: #9c9185;--accent: #5c1b87;--accent-soft: #f3eaff;--pass: #16a34a;--pass-soft: #dcfce7;--fail: #dc2626;--fail-soft: #fee2e2;--warn: #d97706;--warn-soft: #fef3c7;--terminal-bg: #0d0c08;--terminal-text: #d6d0c8;--font-display: "Playfair Display", Georgia, serif;--font-body: "DM Sans", system-ui, -apple-system, sans-serif;--ease-out: cubic-bezier(.16, 1, .3, 1);--duration-fast: .14s;--duration-base: .24s;--duration-slow: .4s;--radius-sm: 6px;--radius-md: 10px;--radius-lg: 16px}[data-theme=dark]{--bg: #101009;--bg-subtle: #1a1910;--bg-elevated: #201f14;--border: #2e2c1e;--text: #f0ede6;--text-muted: #706a5e;--accent: #d0a5f5;--accent-soft: #1b0d30;--pass: #22c55e;--pass-soft: #0d2118;--fail: #f87171;--fail-soft: #2d1010;--warn: #fbbf24;--warn-soft: #2a1f06;--terminal-bg: #080807;--terminal-text: #cbc5bd}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{font-family:var(--font-body);font-weight:300;font-size:1rem;line-height:1.65;background-color:var(--bg);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)' opacity='0.07'/%3E%3C/svg%3E");background-size:200px 200px;color:var(--text);transition:background-color var(--duration-base) var(--ease-out),color var(--duration-base) var(--ease-out);-webkit-font-smoothing:antialiased}h1{font-family:var(--font-display);font-weight:400;line-height:1.1;letter-spacing:-.015em;color:var(--text)}h2,h3{font-family:var(--font-display);font-weight:400;line-height:1.2;color:var(--text)}a{color:inherit;text-decoration:none}button{font-family:var(--font-body)}.field{display:flex;flex-direction:column;gap:.375rem}.field-label{display:flex;justify-content:space-between;font-size:.8125rem;font-weight:400;color:var(--text-muted)}.field-hint{font-size:.75rem;color:var(--text-muted)}.field-input{width:100%;padding:.6rem .875rem;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-subtle);color:var(--text);font-family:var(--font-body);font-size:.875rem;font-weight:300;outline:none;transition:border-color var(--duration-fast),box-shadow var(--duration-fast);-webkit-appearance:none;-moz-appearance:none;appearance:none}.field-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.field-input:disabled{opacity:.5;cursor:not-allowed}.field-input::-moz-placeholder{color:var(--text-muted)}.field-input::placeholder{color:var(--text-muted)}.data-table{width:100%;border-collapse:collapse;font-size:.875rem}.data-table th{text-align:left;padding:.5rem 1rem;font-family:var(--font-body);font-weight:500;font-size:.7rem;letter-spacing:.07em;text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--border)}.data-table td{padding:.875rem 1rem;border-bottom:1px solid var(--border);color:var(--text);vertical-align:middle}.data-table tbody tr:last-child td{border-bottom:none}.card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-lg);padding:1.5rem;transition:background var(--duration-base) var(--ease-out),border-color var(--duration-base) var(--ease-out)}.card-title{font-family:var(--font-display);font-size:1.25rem;font-weight:400;color:var(--text);margin-bottom:.25rem}.card-subtitle{font-size:.8125rem;color:var(--text-muted);margin-bottom:1.25rem}.alert{display:flex;align-items:center;gap:.625rem;padding:.75rem 1rem;border-radius:var(--radius-md);font-size:.875rem;font-weight:400}.alert-success{background:var(--pass-soft);color:var(--pass)}.alert-error{background:var(--fail-soft);color:var(--fail)}@keyframes fadeUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.nav.svelte-6bgush{position:sticky;top:0;z-index:40;background:var(--bg);border-bottom:1px solid var(--border);transition:background var(--duration-base) var(--ease-out),border-color var(--duration-base) var(--ease-out)}.inner.svelte-6bgush{max-width:1200px;margin:0 auto;padding:0 1.5rem;height:56px;display:flex;align-items:center;gap:2rem}.brand.svelte-6bgush{font-size:1.2rem;letter-spacing:-.02em;flex-shrink:0;text-decoration:none}.brand-serif.svelte-6bgush{font-family:var(--font-display);font-weight:400;color:var(--accent)}.brand-sans.svelte-6bgush{font-family:var(--font-body);font-weight:400;color:var(--text)}.links.svelte-6bgush{display:flex;gap:.125rem;flex:1}.link.svelte-6bgush{font-size:.875rem;font-weight:400;color:var(--text-muted);text-decoration:none;padding:.35rem .75rem;border-radius:var(--radius-sm);transition:color var(--duration-fast),background var(--duration-fast)}.link.svelte-6bgush:hover{color:var(--text);background:var(--bg-subtle)}.link.active.svelte-6bgush{color:var(--accent);background:var(--accent-soft)}.actions.svelte-6bgush{display:flex;align-items:center;gap:.5rem;margin-left:auto}.theme-btn.svelte-6bgush{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast)}.theme-btn.svelte-6bgush:hover{background:var(--bg-subtle);color:var(--text);border-color:var(--text-muted)}.hamburger.svelte-6bgush{display:none;flex-direction:column;justify-content:center;gap:4px;width:34px;height:34px;background:none;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;padding:0 8px}.hamburger.svelte-6bgush span:where(.svelte-6bgush){display:block;width:100%;height:1.5px;background:var(--text-muted);border-radius:2px;transform-origin:center;transition:transform var(--duration-base) var(--ease-out),opacity var(--duration-fast)}.hamburger.svelte-6bgush span.rotated:where(.svelte-6bgush){transform:translateY(5.5px) rotate(45deg)}.hamburger.svelte-6bgush span.hidden:where(.svelte-6bgush){opacity:0}.hamburger.svelte-6bgush span.rotated-reverse:where(.svelte-6bgush){transform:translateY(-5.5px) rotate(-45deg)}.mobile-menu.svelte-6bgush{border-top:1px solid var(--border);padding:.75rem 1.5rem 1rem;display:flex;flex-direction:column;gap:.125rem}.mobile-link.svelte-6bgush{color:var(--text-muted);text-decoration:none;font-size:.9375rem;font-weight:400;padding:.5rem .75rem;border-radius:var(--radius-sm);transition:background var(--duration-fast),color var(--duration-fast)}.mobile-link.svelte-6bgush:hover,.mobile-link.active.svelte-6bgush{background:var(--bg-subtle);color:var(--text)}.mobile-link.active.svelte-6bgush{color:var(--accent);background:var(--accent-soft)}@media (max-width: 640px){.links.svelte-6bgush{display:none}.hamburger.svelte-6bgush{display:flex}}.shell.svelte-28zx1m{max-width:1200px;margin:0 auto;padding:2.5rem 1.5rem 5rem}.terminal-wrap.svelte-olniy1{border-radius:var(--radius-md);overflow:hidden;border:1px solid rgba(255,255,255,.06)}.terminal-bar.svelte-olniy1{display:flex;align-items:center;gap:6px;padding:.6rem .875rem;background:#0000004d}.dot.svelte-olniy1{display:block;width:10px;height:10px;border-radius:50%}.red.svelte-olniy1{background:#ff5f57}.yellow.svelte-olniy1{background:#febc2e}.green.svelte-olniy1{background:#28c840}.terminal.svelte-olniy1{font-family:JetBrains Mono,Fira Code,Cascadia Code,Courier New,monospace;font-size:.78rem;line-height:1.75;background:var(--terminal-bg);color:var(--terminal-text);padding:1rem;min-height:220px;max-height:280px;overflow-y:auto;white-space:pre-wrap;word-break:break-word;margin:0}.terminal.svelte-olniy1::-webkit-scrollbar{width:4px}.terminal.svelte-olniy1::-webkit-scrollbar-track{background:transparent}.terminal.svelte-olniy1::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:2px}.panel.svelte-ynu3lh{position:fixed;bottom:0;left:0;right:0;z-index:200;background:var(--bg-elevated);border-top:1px solid var(--border);box-shadow:0 -4px 24px #0000000f;transition:box-shadow var(--duration-base) var(--ease-out)}.panel.expanded.svelte-ynu3lh{box-shadow:0 -8px 40px #0000001a}.bar.svelte-ynu3lh{display:flex;align-items:center;gap:.75rem;padding:0 1.5rem;height:48px;cursor:default}.bar-left.svelte-ynu3lh{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.status-dot.svelte-ynu3lh{flex-shrink:0;width:8px;height:8px;border-radius:50%;transition:background var(--duration-base)}.status-dot.pulse.svelte-ynu3lh{animation:svelte-ynu3lh-statusPulse 1.6s ease-in-out infinite}@keyframes svelte-ynu3lh-statusPulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.7)}}.status-label.svelte-ynu3lh{font-size:.7rem;font-weight:500;letter-spacing:.07em;text-transform:uppercase;color:var(--text-muted);flex-shrink:0}.run-id.svelte-ynu3lh{font-size:.75rem;color:var(--text-muted);font-family:JetBrains Mono,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bar-dots.svelte-ynu3lh{display:flex;align-items:center;gap:4px;flex-shrink:0}.dot.svelte-ynu3lh{width:7px;height:7px;border-radius:50%;background:var(--border);transition:background var(--duration-base),transform var(--duration-fast)}.dot.running.svelte-ynu3lh{background:var(--pass);animation:svelte-ynu3lh-dotBeat 1.4s ease-in-out infinite}.dot.pass.svelte-ynu3lh{background:var(--pass)}.dot.fail.svelte-ynu3lh{background:var(--fail)}@keyframes svelte-ynu3lh-dotBeat{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.65)}}.expand-btn.svelte-ynu3lh{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--radius-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;flex-shrink:0;transition:background var(--duration-fast),color var(--duration-fast)}.expand-btn.svelte-ynu3lh:hover{background:var(--bg-subtle);color:var(--text)}.expand-btn.svelte-ynu3lh svg:where(.svelte-ynu3lh){transition:transform var(--duration-base) var(--ease-out)}.expand-btn.svelte-ynu3lh svg.rotated:where(.svelte-ynu3lh){transform:rotate(180deg)}.body.svelte-ynu3lh{padding:.875rem 1.5rem 1.125rem;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:.75rem}.controls.svelte-ynu3lh{display:flex;align-items:center;gap:.625rem}.run-input.svelte-ynu3lh{flex:1}.workers-control.svelte-ynu3lh{display:flex;gap:2px;background:var(--bg-subtle);border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px;flex-shrink:0}.worker-btn.svelte-ynu3lh{font-family:var(--font-body);font-size:.75rem;font-weight:400;min-width:2rem;padding:.2rem .5rem;border:none;border-radius:4px;background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast)}.worker-btn.svelte-ynu3lh:hover:not(.active){background:var(--bg-elevated);color:var(--text)}.worker-btn.active.svelte-ynu3lh{background:var(--bg-elevated);color:var(--accent);font-weight:500;box-shadow:0 1px 3px #00000014}.report-row.svelte-ynu3lh{display:flex}
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- .pagination.svelte-tsubiy{display:flex;align-items:center;justify-content:center;gap:.25rem}button.svelte-tsubiy{min-width:2rem;height:2rem;padding:0 .25rem;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text-muted);font-family:var(--font-body);font-size:.8125rem;cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast)}button.svelte-tsubiy:disabled{opacity:.3;cursor:not-allowed}button.active.svelte-tsubiy{background:var(--accent);color:#fff;border-color:var(--accent)}button.svelte-tsubiy:hover:not(:disabled):not(.active){background:var(--bg-subtle);color:var(--text)}.page-header.svelte-wxbf05{margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.header-top.svelte-wxbf05{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}h1.svelte-wxbf05{font-size:2.5rem;margin-bottom:.25rem}.subtitle.svelte-wxbf05{color:var(--text-muted);font-size:.875rem}.rate-display.svelte-wxbf05{display:flex;flex-direction:column;align-items:flex-end;gap:.1rem}.rate-number.svelte-wxbf05{font-family:var(--font-display);font-size:2.75rem;line-height:1;font-weight:400}.rate-number.pass.svelte-wxbf05{color:var(--pass)}.rate-number.warn.svelte-wxbf05{color:var(--warn)}.rate-number.fail.svelte-wxbf05{color:var(--fail)}.rate-label.svelte-wxbf05{font-size:.75rem;color:var(--text-muted);letter-spacing:.05em;text-transform:uppercase}.stats-bar.svelte-wxbf05{margin-bottom:1rem}.pass-bar-track.svelte-wxbf05{height:3px;background:var(--fail-soft);border-radius:100px;overflow:hidden;margin-bottom:.5rem}.pass-bar-fill.svelte-wxbf05{height:100%;background:var(--pass);border-radius:100px;transition:width .9s var(--ease-out) .1s}.bar-legend.svelte-wxbf05{display:flex;gap:1rem}.legend-pass.svelte-wxbf05{font-size:.75rem;color:var(--pass);font-weight:500}.legend-fail.svelte-wxbf05{font-size:.75rem;color:var(--fail);font-weight:500}.trend-row.svelte-wxbf05{display:flex;align-items:center;gap:.75rem}.trend-label.svelte-wxbf05{font-size:.7rem;font-weight:500;letter-spacing:.07em;text-transform:uppercase;color:var(--text-muted);flex-shrink:0}.trend-dots.svelte-wxbf05{display:flex;align-items:center;gap:5px}.trend-dot.svelte-wxbf05{width:9px;height:9px;border-radius:50%;transition:transform var(--duration-fast);animation:fadeUp .3s var(--ease-out) both}.trend-dot.svelte-wxbf05:hover{transform:scale(1.4)}.trend-dot.pass.svelte-wxbf05{background:var(--pass)}.trend-dot.fail.svelte-wxbf05{background:var(--fail)}.trend-hint.svelte-wxbf05{font-size:.68rem;color:var(--text-muted);opacity:.6}.report-list.svelte-wxbf05{display:flex;flex-direction:column;gap:.5rem}.report-item.svelte-wxbf05{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.875rem 1.25rem;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);text-decoration:none;color:inherit;border-left-width:3px;transition:background var(--duration-fast),transform var(--duration-fast) var(--ease-out),box-shadow var(--duration-fast);animation:fadeUp .32s var(--ease-out) both}.report-item.svelte-wxbf05:hover{background:var(--bg-subtle);transform:translate(2px);box-shadow:0 2px 12px #0000000a}.report-item.is-pass.svelte-wxbf05{border-left-color:var(--pass)}.report-item.is-fail.svelte-wxbf05{border-left-color:var(--fail)}.item-left.svelte-wxbf05{display:flex;align-items:center;gap:.875rem;min-width:0}.status-mark.svelte-wxbf05{font-size:.875rem;font-weight:600;flex-shrink:0;width:20px;text-align:center}.status-mark.pass.svelte-wxbf05{color:var(--pass)}.status-mark.fail.svelte-wxbf05{color:var(--fail)}.item-meta.svelte-wxbf05{display:flex;align-items:center;gap:.625rem;min-width:0}.item-tags.svelte-wxbf05{font-family:JetBrains Mono,monospace;font-size:.8rem;color:var(--text);white-space:nowrap}.item-badges.svelte-wxbf05{flex-shrink:0}.item-right.svelte-wxbf05{display:flex;align-items:center;gap:.75rem;flex-shrink:0}.item-date.svelte-wxbf05{font-size:.8rem;color:var(--text-muted);white-space:nowrap}.item-arrow.svelte-wxbf05{color:var(--text-muted);transition:transform var(--duration-fast) var(--ease-out),color var(--duration-fast)}.report-item.svelte-wxbf05:hover .item-arrow:where(.svelte-wxbf05){transform:translate(3px);color:var(--text)}.pagination-wrap.svelte-wxbf05{margin-top:1.25rem}.empty.svelte-wxbf05{color:var(--text-muted);font-size:.9375rem;padding:3rem 0;text-align:center}
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- .page-header.svelte-10529e9{margin-bottom:1.75rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.header-top.svelte-10529e9{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}h1.svelte-10529e9{font-size:2.5rem;margin-bottom:.25rem}.subtitle.svelte-10529e9{color:var(--text-muted);font-size:.875rem}.search-row.svelte-10529e9{display:flex;gap:.75rem}.search-wrap.svelte-10529e9{position:relative;flex:1;max-width:480px}.search-icon.svelte-10529e9{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}.search-input.svelte-10529e9{width:100%;padding:.55rem .875rem .55rem 2.25rem;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-subtle);color:var(--text);font-family:var(--font-body);font-size:.875rem;font-weight:300;outline:none;transition:border-color var(--duration-fast),box-shadow var(--duration-fast)}.search-input.svelte-10529e9:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);background:var(--bg-elevated)}.search-input.svelte-10529e9::-moz-placeholder{color:var(--text-muted)}.search-input.svelte-10529e9::placeholder{color:var(--text-muted)}.search-clear.svelte-10529e9{position:absolute;right:.625rem;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;border:none;background:var(--border);color:var(--text-muted);cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast)}.search-clear.svelte-10529e9:hover{background:var(--text-muted);color:var(--bg)}.suites.svelte-10529e9{display:flex;flex-direction:column;gap:1rem}.suite.svelte-10529e9{border:1px solid var(--border);border-radius:var(--radius-lg);overflow:visible;background:var(--bg-elevated);animation:fadeUp .35s var(--ease-out) both}.suite-header.svelte-10529e9{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.875rem 1.25rem;background:var(--bg-subtle);border-bottom:1px solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0}.suite-meta.svelte-10529e9{display:flex;align-items:center;gap:.625rem;flex:1;min-width:0}.suite-badges.svelte-10529e9{display:flex;gap:.25rem;flex-shrink:0}.suite-name.svelte-10529e9{font-size:.9rem;font-weight:400;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.suite-count.svelte-10529e9{font-size:.75rem;color:var(--text-muted);flex-shrink:0}.run-btn.svelte-10529e9{display:inline-flex;align-items:center;gap:.35rem;font-family:var(--font-body);font-size:.75rem;font-weight:400;padding:.3rem .75rem;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elevated);color:var(--text-muted);cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast)}.run-btn.svelte-10529e9:hover{background:var(--accent-soft);color:var(--accent);border-color:var(--accent)}.tests.svelte-10529e9{display:flex;flex-direction:column}.test-row.svelte-10529e9{border-bottom:1px solid var(--border);animation:fadeUp .3s var(--ease-out) both}.test-row.svelte-10529e9:last-child{border-bottom:none}.test-main.svelte-10529e9{display:flex;align-items:center;gap:.625rem;padding:.75rem 1.25rem}.run-icon-btn.svelte-10529e9{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;border:1px solid var(--border);background:transparent;color:var(--text-muted);cursor:pointer;flex-shrink:0;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast)}.run-icon-btn.svelte-10529e9:hover{background:var(--accent);color:#fff;border-color:var(--accent)}.test-ids.svelte-10529e9{display:flex;gap:.25rem;flex-shrink:0}.id-pill.svelte-10529e9{position:relative;font-size:.68rem;font-weight:500;letter-spacing:.04em;color:var(--accent);background:var(--accent-soft);border:none;border-radius:100px;padding:.15rem .55rem;cursor:pointer;font-family:JetBrains Mono,monospace;transition:background var(--duration-fast),color var(--duration-fast),filter var(--duration-fast)}.id-pill.svelte-10529e9:hover{filter:brightness(.92)}.id-pill.copied.svelte-10529e9{color:var(--pass);background:var(--pass-soft)}.id-pill.copied.svelte-10529e9:after{content:"Copied";position:absolute;left:50%;bottom:calc(100% + 6px);z-index:50;transform:translate(-50%);padding:.16rem .42rem;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elevated);color:var(--pass);box-shadow:0 4px 14px #00000014;font-family:var(--font-body);font-size:.65rem;font-weight:500;letter-spacing:0;pointer-events:none;animation:svelte-10529e9-copiedPop 1.4s var(--ease-out) both}.test-name.svelte-10529e9{flex:1;font-size:.875rem;color:var(--text);min-width:0}.outline-badge.svelte-10529e9{display:inline-block;font-size:.62rem;font-weight:500;letter-spacing:.06em;text-transform:uppercase;background:var(--warn-soft);color:var(--warn);padding:.1rem .4rem;border-radius:100px;margin-left:.4rem;vertical-align:middle}.steps-toggle.svelte-10529e9{display:inline-flex;align-items:center;gap:.2rem;font-family:var(--font-body);font-size:.72rem;font-weight:400;color:var(--text-muted);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);padding:.2rem .5rem;cursor:pointer;flex-shrink:0;transition:background var(--duration-fast),color var(--duration-fast)}.steps-toggle.svelte-10529e9:hover{background:var(--bg-subtle);color:var(--text)}.steps-toggle.svelte-10529e9 svg:where(.svelte-10529e9){transition:transform var(--duration-fast) var(--ease-out)}.steps-toggle.svelte-10529e9 svg.rotated:where(.svelte-10529e9){transform:rotate(90deg)}.steps.svelte-10529e9{padding:.75rem 1.25rem .875rem 3.75rem;background:var(--bg-subtle);border-top:1px solid var(--border)}.step-list.svelte-10529e9{list-style:none;display:flex;flex-direction:column;gap:.3rem}.step.svelte-10529e9{font-size:.8125rem;color:var(--text-muted);font-family:JetBrains Mono,monospace;line-height:1.5;padding-left:1rem;position:relative}.step.svelte-10529e9:before{content:"›";position:absolute;left:0;color:var(--accent);font-family:var(--font-body)}.examples.svelte-10529e9{margin-top:.75rem;padding-top:.75rem;border-top:1px dashed var(--border)}.examples-label.svelte-10529e9{display:block;font-size:.68rem;font-weight:500;letter-spacing:.07em;text-transform:uppercase;color:var(--text-muted);margin-bottom:.5rem}.examples-table-wrap.svelte-10529e9{overflow-x:auto}.examples-table.svelte-10529e9{border-collapse:collapse;font-size:.78rem;font-family:JetBrains Mono,monospace;width:auto}.examples-table.svelte-10529e9 th:where(.svelte-10529e9){text-align:left;padding:.3rem .75rem;font-size:.7rem;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--border);font-family:var(--font-body);font-weight:500}.examples-table.svelte-10529e9 td:where(.svelte-10529e9){padding:.3rem .75rem;color:var(--text-muted);border-bottom:1px solid var(--border)}.examples-table.svelte-10529e9 tbody:where(.svelte-10529e9) tr:where(.svelte-10529e9):last-child td:where(.svelte-10529e9){border-bottom:none}.empty.svelte-10529e9{color:var(--text-muted);font-size:.9375rem;padding:3rem 0;text-align:center}@keyframes svelte-10529e9-copiedPop{0%{opacity:0;transform:translate(-50%,4px) scale(.96)}12%,78%{opacity:1;transform:translate(-50%) scale(1)}to{opacity:0;transform:translate(-50%,-2px) scale(.98)}}
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- .back-row.svelte-pys2u{margin-bottom:1.5rem}.back-link.svelte-pys2u{display:inline-flex;align-items:center;gap:.35rem;font-size:.8125rem;color:var(--text-muted);text-decoration:none;transition:color var(--duration-fast)}.back-link.svelte-pys2u:hover{color:var(--text)}.report-header.svelte-pys2u{border-radius:var(--radius-lg);border:1px solid var(--border);border-left-width:4px;padding:1.5rem;margin-bottom:2rem;background:var(--bg-elevated);animation:fadeUp .35s var(--ease-out) both}.report-header.pass.svelte-pys2u{border-left-color:var(--pass)}.report-header.fail.svelte-pys2u{border-left-color:var(--fail)}.header-main.svelte-pys2u{display:flex;align-items:flex-start;justify-content:space-between;gap:1.5rem;flex-wrap:wrap}.header-status.svelte-pys2u{display:flex;align-items:center;gap:1rem}.status-icon.svelte-pys2u{font-size:2rem;line-height:1;font-weight:600}.report-header.pass.svelte-pys2u .status-icon:where(.svelte-pys2u){color:var(--pass)}.report-header.fail.svelte-pys2u .status-icon:where(.svelte-pys2u){color:var(--fail)}h1.svelte-pys2u{font-size:2rem;margin-bottom:.2rem}.header-meta.svelte-pys2u{font-size:.8125rem;color:var(--text-muted);display:flex;align-items:center;gap:.5rem}.mono.svelte-pys2u{font-family:JetBrains Mono,monospace;font-size:.78rem}.header-stats.svelte-pys2u{display:flex;gap:1.5rem;align-items:flex-start;flex-shrink:0}.stat.svelte-pys2u{display:flex;flex-direction:column;align-items:center;gap:.1rem}.stat-num.svelte-pys2u{font-family:var(--font-display);font-size:1.75rem;line-height:1;font-weight:400;color:var(--text)}.stat-label.svelte-pys2u{font-size:.68rem;color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase}.pass-color.svelte-pys2u{color:var(--pass)}.fail-color.svelte-pys2u{color:var(--fail)}.muted-color.svelte-pys2u{color:var(--text-muted)}.feature.svelte-pys2u{margin-bottom:1.5rem;animation:fadeUp .35s var(--ease-out) both}.feature-header.svelte-pys2u{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.feature-name.svelte-pys2u{font-size:1.1rem;font-family:var(--font-display);font-weight:400}.feature-file.svelte-pys2u{font-family:JetBrains Mono,monospace;font-size:.72rem;color:var(--text-muted);margin-left:auto}.scenarios.svelte-pys2u{display:flex;flex-direction:column;gap:.375rem}.scenario.svelte-pys2u{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);overflow:hidden;animation:fadeUp .3s var(--ease-out) both}.scenario-header.svelte-pys2u{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;width:100%;background:transparent;border:none;cursor:pointer;text-align:left;font-family:var(--font-body);transition:background var(--duration-fast)}.scenario-header.svelte-pys2u:hover{background:var(--bg-subtle)}.scenario-status-dot.svelte-pys2u{width:8px;height:8px;border-radius:50%;flex-shrink:0}.scenario-status-dot.pass.svelte-pys2u{background:var(--pass)}.scenario-status-dot.fail.svelte-pys2u{background:var(--fail)}.scenario-status-dot.skip.svelte-pys2u{background:var(--text-muted)}.scenario-name.svelte-pys2u{flex:1;font-size:.875rem;color:var(--text);font-weight:400;text-align:left;display:inline-flex;align-items:center;gap:.4rem;min-width:0}.scenario-count.svelte-pys2u{font-size:.65rem;font-weight:500;letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted);background:var(--bg-subtle);border:1px solid var(--border);border-radius:100px;padding:.05rem .4rem;white-space:nowrap}.scenario-tags.svelte-pys2u{display:flex;gap:.25rem;flex-shrink:0}.tag-chip.svelte-pys2u{font-size:.65rem;font-family:JetBrains Mono,monospace;background:var(--accent-soft);color:var(--accent);padding:.1rem .4rem;border-radius:100px}.scenario-duration.svelte-pys2u{font-size:.75rem;color:var(--text-muted);font-family:JetBrains Mono,monospace;flex-shrink:0}.chevron.svelte-pys2u{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-out)}.chevron.rotated.svelte-pys2u{transform:rotate(90deg)}.steps.svelte-pys2u{border-top:1px solid var(--border);background:var(--bg-subtle);padding:.5rem 0}.example-header.svelte-pys2u{display:flex;align-items:center;gap:.5rem;padding:.625rem 1rem .25rem 1.25rem;color:var(--text-muted);font-size:.72rem;font-weight:500;letter-spacing:.05em;text-transform:uppercase}.example-header.svelte-pys2u:not(:first-child){margin-top:.375rem;border-top:1px dashed var(--border)}.example-header.svelte-pys2u .scenario-duration:where(.svelte-pys2u){margin-left:auto}.step.svelte-pys2u{padding:.375rem 1rem .375rem 1.25rem}.step-fail.svelte-pys2u{background:color-mix(in srgb,var(--fail-soft) 40%,transparent)}.step-skip.svelte-pys2u{opacity:.5}.step-row.svelte-pys2u{display:flex;align-items:baseline;gap:.5rem}.step-status-icon.svelte-pys2u{font-size:.75rem;font-weight:600;width:14px;flex-shrink:0;color:var(--text-muted)}.step-fail.svelte-pys2u .step-status-icon:where(.svelte-pys2u){color:var(--fail)}.step.svelte-pys2u:not(.step-fail):not(.step-skip) .step-status-icon:where(.svelte-pys2u){color:var(--pass)}.kw.svelte-pys2u{font-size:.72rem;font-weight:500;letter-spacing:.04em;flex-shrink:0;padding:.05rem .4rem;border-radius:3px;font-family:JetBrains Mono,monospace}.kw-given.svelte-pys2u{background:var(--accent-soft);color:var(--accent)}.kw-when.svelte-pys2u{background:var(--warn-soft);color:var(--warn)}.kw-then.svelte-pys2u{background:var(--pass-soft);color:var(--pass)}.kw-and.svelte-pys2u{background:var(--bg-elevated);color:var(--text-muted);border:1px solid var(--border)}.step-name.svelte-pys2u{flex:1;font-size:.8125rem;color:var(--text);font-family:JetBrains Mono,monospace}.step-duration.svelte-pys2u{font-size:.7rem;color:var(--text-muted);font-family:JetBrains Mono,monospace;flex-shrink:0}.step-error.svelte-pys2u{margin:.375rem 0 .25rem 1.75rem;padding:.625rem .875rem;background:var(--fail-soft);color:var(--fail);border-radius:var(--radius-sm);font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;white-space:pre-wrap;word-break:break-word;border-left:2px solid var(--fail)}.screenshot-wrap.svelte-pys2u{margin:.5rem 0 .25rem 1.75rem}.screenshot-toggle.svelte-pys2u{font-size:.75rem;color:var(--text-muted);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.screenshot.svelte-pys2u{margin-top:.5rem;max-width:100%;border-radius:var(--radius-sm);border:1px solid var(--border)}.loading-state.svelte-pys2u{display:flex;justify-content:center;padding:4rem 0}.loading-dots.svelte-pys2u{display:flex;gap:6px;align-items:center}.loading-dots.svelte-pys2u span:where(.svelte-pys2u){width:8px;height:8px;border-radius:50%;background:var(--accent);animation:svelte-pys2u-dotBeat 1.2s ease-in-out infinite}.loading-dots.svelte-pys2u span:where(.svelte-pys2u):nth-child(2){animation-delay:.2s}.loading-dots.svelte-pys2u span:where(.svelte-pys2u):nth-child(3){animation-delay:.4s}@keyframes svelte-pys2u-dotBeat{0%,to{opacity:1;transform:scale(1)}50%{opacity:.3;transform:scale(.6)}}.error-state.svelte-pys2u{padding:3rem 0;color:var(--fail);text-align:center;font-size:.9375rem}
@@ -1,34 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- /*
19
- This file is part of Plum.
20
-
21
- Plum is free software: you can redistribute it and/or modify
22
- it under the terms of the GNU General Public License as published by
23
- the Free Software Foundation, either version 3 of the License, or
24
- (at your option) any later version.
25
-
26
- Plum is distributed in the hope that it will be useful,
27
- but WITHOUT ANY WARRANTY; without even the implied warranty of
28
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
- GNU General Public License for more details.
30
-
31
- You should have received a copy of the GNU General Public License
32
- along with Plum. If not, see https://www.gnu.org/licenses/.
33
- */
34
- .backdrop.svelte-aus6t7{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:50;padding:1rem;backdrop-filter:blur(2px)}.panel.svelte-aus6t7{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-lg);padding:1.75rem;width:100%;max-width:480px;box-shadow:0 4px 6px #0000000a,0 24px 64px #00000024}.header.svelte-aus6t7{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem}.title.svelte-aus6t7{font-family:var(--font-display);font-size:1.2rem;font-weight:400;color:var(--text)}.close-btn.svelte-aus6t7{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--radius-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast)}.close-btn.svelte-aus6t7:hover{background:var(--bg-subtle);color:var(--text)}.body.svelte-aus6t7{display:flex;flex-direction:column;gap:1rem}.page-header.svelte-1ugkbyh{margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.header-row.svelte-1ugkbyh{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem}.page-header.svelte-1ugkbyh h1:where(.svelte-1ugkbyh){font-size:2.5rem;margin-bottom:.375rem}.subtitle.svelte-1ugkbyh{color:var(--text-muted);font-size:.9375rem}.job-row.svelte-1ugkbyh{animation:fadeUp .32s var(--ease-out) both}.toast.svelte-1ugkbyh{margin-bottom:1.25rem;border-radius:var(--radius-md)}.table-wrap.svelte-1ugkbyh{overflow-x:auto}.job-name.svelte-1ugkbyh{font-weight:400;font-size:.875rem}.tag-text.svelte-1ugkbyh{font-family:JetBrains Mono,monospace;font-size:.78rem;color:var(--text-muted)}.actions-cell.svelte-1ugkbyh{display:flex;gap:.375rem}.empty.svelte-1ugkbyh{padding:3rem 1.5rem;color:var(--text-muted);font-size:.9375rem;text-align:center}.modal-form.svelte-1ugkbyh{display:flex;flex-direction:column;gap:1rem}.form-error.svelte-1ugkbyh{font-size:.8125rem;color:var(--fail)}.confirm-text.svelte-1ugkbyh{font-size:.9375rem;color:var(--text-muted);line-height:1.6}.confirm-text.svelte-1ugkbyh strong:where(.svelte-1ugkbyh){color:var(--text);font-weight:500}.confirm-actions.svelte-1ugkbyh{display:flex;gap:.625rem;padding-top:.25rem}
@@ -1,42 +0,0 @@
1
- /*
2
- * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
16
- */
17
-
18
- import { X as store_get, Y as unsubscribe_stores, p as pop, a as push } from "../../../../chunks/index.js";
19
- import { a as parseReport, p as page } from "../../../../chunks/reports.js";
20
- /* empty css */
21
- function _page($$payload, $$props) {
22
- push();
23
- var $$store_subs;
24
- const fileName = decodeURIComponent(store_get($$store_subs ??= {}, "$page", page).params.slug);
25
- const meta = parseReport(fileName);
26
- meta?.status === "PASS";
27
- $$payload.out += `<div class="back-row svelte-pys2u"><a href="/reports" class="back-link svelte-pys2u"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-pys2u"><line x1="19" y1="12" x2="5" y2="12" class="svelte-pys2u"></line><polyline points="12 19 5 12 12 5" class="svelte-pys2u"></polyline></svg> Reports</a></div> `;
28
- {
29
- $$payload.out += "<!--[!-->";
30
- {
31
- $$payload.out += "<!--[-->";
32
- $$payload.out += `<div class="loading-state svelte-pys2u"><div class="loading-dots svelte-pys2u"><span class="svelte-pys2u"></span><span class="svelte-pys2u"></span><span class="svelte-pys2u"></span></div></div>`;
33
- }
34
- $$payload.out += `<!--]-->`;
35
- }
36
- $$payload.out += `<!--]-->`;
37
- if ($$store_subs) unsubscribe_stores($$store_subs);
38
- pop();
39
- }
40
- export {
41
- _page as default
42
- };