@qaick/runner 0.2.0-alpha.10

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 (69) hide show
  1. package/README.md +72 -0
  2. package/package-dist/fixtures/action-catalog-v1.qaick.json +8 -0
  3. package/package-dist/fixtures/checkout-nested.qaick.json +24 -0
  4. package/package-dist/fixtures/checkout-project.qaick.json +30 -0
  5. package/package-dist/fixtures/checkout-regression.qaick.json +16 -0
  6. package/package-dist/fixtures/invalid-binding.qaick.json +13 -0
  7. package/package-dist/fixtures/parallel-project.qaick.json +41 -0
  8. package/package-dist/fixtures/studio-flow-v7.qaick.json +23 -0
  9. package/package-dist/fixtures/studio-project-v7.qaick.json +47 -0
  10. package/package-dist/package.json +80 -0
  11. package/package-dist/src/build-info.d.ts +4 -0
  12. package/package-dist/src/build-info.d.ts.map +1 -0
  13. package/package-dist/src/build-info.js +5 -0
  14. package/package-dist/src/build-info.js.map +1 -0
  15. package/package-dist/src/demo/RunnerWalkthrough.d.ts +3 -0
  16. package/package-dist/src/demo/RunnerWalkthrough.d.ts.map +1 -0
  17. package/package-dist/src/demo/RunnerWalkthrough.js +23 -0
  18. package/package-dist/src/demo/RunnerWalkthrough.js.map +1 -0
  19. package/package-dist/src/demo/runner-walkthrough.css +31 -0
  20. package/package-dist/src/runner/RunnerModule.d.ts +8 -0
  21. package/package-dist/src/runner/RunnerModule.d.ts.map +1 -0
  22. package/package-dist/src/runner/RunnerModule.js +267 -0
  23. package/package-dist/src/runner/RunnerModule.js.map +1 -0
  24. package/package-dist/src/runner/catalog.d.ts +15 -0
  25. package/package-dist/src/runner/catalog.d.ts.map +1 -0
  26. package/package-dist/src/runner/catalog.js +16 -0
  27. package/package-dist/src/runner/catalog.js.map +1 -0
  28. package/package-dist/src/runner/fixture.d.ts +5 -0
  29. package/package-dist/src/runner/fixture.d.ts.map +1 -0
  30. package/package-dist/src/runner/fixture.js +28 -0
  31. package/package-dist/src/runner/fixture.js.map +1 -0
  32. package/package-dist/src/runner/history.d.ts +15 -0
  33. package/package-dist/src/runner/history.d.ts.map +1 -0
  34. package/package-dist/src/runner/history.js +7 -0
  35. package/package-dist/src/runner/history.js.map +1 -0
  36. package/package-dist/src/runner/package-load-error.d.ts +11 -0
  37. package/package-dist/src/runner/package-load-error.d.ts.map +1 -0
  38. package/package-dist/src/runner/package-load-error.js +10 -0
  39. package/package-dist/src/runner/package-load-error.js.map +1 -0
  40. package/package-dist/src/runner/package-loader.d.ts +4 -0
  41. package/package-dist/src/runner/package-loader.d.ts.map +1 -0
  42. package/package-dist/src/runner/package-loader.js +114 -0
  43. package/package-dist/src/runner/package-loader.js.map +1 -0
  44. package/package-dist/src/runner/redaction.d.ts +7 -0
  45. package/package-dist/src/runner/redaction.d.ts.map +1 -0
  46. package/package-dist/src/runner/redaction.js +38 -0
  47. package/package-dist/src/runner/redaction.js.map +1 -0
  48. package/package-dist/src/runner/result-export.d.ts +12 -0
  49. package/package-dist/src/runner/result-export.d.ts.map +1 -0
  50. package/package-dist/src/runner/result-export.js +9 -0
  51. package/package-dist/src/runner/result-export.js.map +1 -0
  52. package/package-dist/src/runner/runtime-client-adapter.d.ts +21 -0
  53. package/package-dist/src/runner/runtime-client-adapter.d.ts.map +1 -0
  54. package/package-dist/src/runner/runtime-client-adapter.js +40 -0
  55. package/package-dist/src/runner/runtime-client-adapter.js.map +1 -0
  56. package/package-dist/src/runner/runtime-client.d.ts +24 -0
  57. package/package-dist/src/runner/runtime-client.d.ts.map +1 -0
  58. package/package-dist/src/runner/runtime-client.js +5 -0
  59. package/package-dist/src/runner/runtime-client.js.map +1 -0
  60. package/package-dist/src/runner/studio-artifact-loader.d.ts +6 -0
  61. package/package-dist/src/runner/studio-artifact-loader.d.ts.map +1 -0
  62. package/package-dist/src/runner/studio-artifact-loader.js +331 -0
  63. package/package-dist/src/runner/studio-artifact-loader.js.map +1 -0
  64. package/package-dist/src/runner/types.d.ts +81 -0
  65. package/package-dist/src/runner/types.d.ts.map +1 -0
  66. package/package-dist/src/runner/types.js +5 -0
  67. package/package-dist/src/runner/types.js.map +1 -0
  68. package/package-dist/styles.css +262 -0
  69. package/package.json +80 -0
@@ -0,0 +1,262 @@
1
+ :root { font-family: Inter, ui-sans-serif, system-ui, sans-serif; color: #182234; background: #f7f9fc; font-size: 13px; color-scheme: light; }
2
+ :root[data-theme='dark'] { color: #e6edf7; background: #111827; color-scheme: dark; }
3
+ * { box-sizing: border-box; } body { margin: 0; min-width: 1120px; } button, select { font: inherit; }
4
+ .runner-shell { height: 100vh; min-height: 100vh; display: grid; grid-template-rows: 44px minmax(0, 1fr); } .runner-header { display: flex; align-items: center; gap: 18px; padding: 0 12px 0 16px; border-bottom: 1px solid #dfe4ec; background: #fff; font-size: 13px; }
5
+ .runner-brand { display: flex; align-items: baseline; gap: 6px; flex: none; } .runner-brand-mark { color: #3569d4; font-size: 13px; font-weight: 700; letter-spacing: .04em; } .runner-brand-product { color: #182234; font-size: 13px; font-weight: 500; } .runner-brand .about-button { height: 25px; margin-left: 6px; padding: 0 9px; border: 0; border-radius: 4px; background: transparent; color: #40516c; font-size: 12px; font-weight: 650; } .runner-brand .about-button:hover { background: #f0f3f8; color: #182234; } .runner-logo { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 8px; color: white; background: #3569d4; font-size: 13px; } .alpha-label { color: #70809a; font-size: 13px; } .header-spacer, .panel-spacer { flex: 1; }
6
+ .engine-status { display: flex; align-items: center; gap: 7px; color: #14804a; font-size: 12px; font-weight: 700; } .engine-status i { width: 8px; height: 8px; border-radius: 50%; background: #19a463; }
7
+ .theme-picker { display: flex; align-items: center; gap: 7px; color: #596a82; font-size: 12px; font-weight: 700; } .theme-picker select { min-width: 82px; height: 30px; padding: 0 8px; border: 1px solid #cdd7e5; border-radius: 6px; background: white; color: #182234; }
8
+ .runner-main { display: grid; grid-template-columns: 218px minmax(560px, 1fr) 350px; min-height: 0; overflow: hidden; } .runner-nav, .inspector { min-height: 0; overflow-y: auto; background: #fff; } .runner-nav { padding: 18px 12px; border-right: 1px solid #dfe4ec; }
9
+ .nav-label, .eyebrow { color: #8794a8; font-size: 11px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; } .nav-label { margin: 4px 12px 10px; }
10
+ .nav-item { display: flex; align-items: center; gap: 10px; padding: 11px 12px; border-radius: 7px; color: #40516c; font-size: 14px; text-decoration: none; cursor: pointer; } .nav-item span { width: 20px; text-align: center; } .nav-item.active { color: #2458c4; background: #e9f0ff; font-weight: 700; }
11
+ .package-card { margin: 24px 8px 0; padding: 12px; border: 1px solid #dce4f0; border-radius: 8px; background: #f8faff; } .package-card small { display: block; color: #77869b; } .package-card strong { display: block; margin: 5px 0; font-size: 12px; overflow-wrap: anywhere; }
12
+ .runner-workspace { min-height: 0; overflow-y: auto; padding: 26px 30px; background: #f7f9fc; } .eyebrow { color: #687a95; } h1 { margin: 5px 0 4px; font-size: 25px; letter-spacing: -.02em; } .description { margin: 0; color: #66758c; }
13
+ .run-controls { display: flex; align-items: end; flex-wrap: wrap; gap: 10px 14px; margin-top: 25px; } label { display: grid; gap: 6px; color: #596a82; font-size: 12px; font-weight: 700; } select { min-width: 145px; height: 36px; padding: 0 10px; border: 1px solid #cdd7e5; border-radius: 6px; background: white; color: #182234; }
14
+ .button { height: 36px; padding: 0 15px; border: 1px solid #cdd7e5; border-radius: 6px; background: white; color: #334560; font-weight: 700; cursor: pointer; } .button.primary { border-color: #3569d4; background: #3569d4; color: white; } .button.dry-run { border-color: #8a9fc4; color: #315da9; background: #eef3fc; } .button.stop { color: #b33a30; }
15
+ .file-button { position: relative; display: inline-grid; height: 36px; padding: 0 15px; place-items: center; border: 1px solid #cdd7e5; border-radius: 6px; background: white; color: #334560; cursor: pointer; } .file-button input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } .load-error { margin: 12px 0 -8px; color: #b33a30; font-size: 12px; font-weight: 700; }
16
+ .inputs-panel { margin-top: 18px; } .input-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; padding: 16px; } .input-field { color: #596a82; } .input-field input { width: 100%; height: 34px; padding: 0 9px; border: 1px solid #cdd7e5; border-radius: 6px; color: #182234; background: #fff; font: inherit; font-weight: 500; } .input-hint { color: #7a899d; font-size: 11px; }
17
+ .history-view-banner { margin-top: 12px; padding: 9px 12px; border: 1px solid #b9cbed; border-radius: 6px; color: #315da9; background: #eaf2ff; font-size: 12px; font-weight: 700; }
18
+ .panel { margin-top: 24px; border: 1px solid #dce4ed; border-radius: 8px; background: white; overflow: hidden; } .panel-heading { display: flex; align-items: center; gap: 10px; padding: 14px 16px; border-bottom: 1px solid #e6ebf2; } h2 { margin: 0; font-size: 16px; } .running { color: #14804a; font-size: 12px; font-weight: 750; } .stopped { color: #b33a30; font-size: 12px; font-weight: 750; }
19
+ table { width: 100%; border-collapse: collapse; font-size: 13px; } th { padding: 10px 14px; color: #7b899d; background: #fafbfd; font-size: 11px; text-align: left; text-transform: uppercase; letter-spacing: .04em; } td { padding: 13px 14px; border-top: 1px solid #edf0f5; } tr.parent-row td { background: #fbfdff; } tr.nested-row td { background: #f3f7fd; } tr.selected td { background: #dce8ff !important; border-top-color: #9db9ed; } tr.selected td:first-child { border-left: 4px solid #3569d4; } tr.selected .hierarchy-name { color: #173e91; font-weight: 700; } tbody tr { cursor: pointer; }
20
+ .hierarchy-hint { display: flex; align-items: center; gap: 10px; padding: 9px 16px; border-bottom: 1px solid #dbe6fa; color: #315da9; background: #f2f6ff; font-size: 11px; } .hierarchy-hint span { color: #637897; } .hierarchy-action { padding: 4px 7px; border: 1px solid #b9cbed; border-radius: 4px; color: #315da9; background: #fff; font-size: 10px; font-weight: 700; cursor: pointer; } .hierarchy-action:first-of-type { margin-left: auto; } .hierarchy-name { display: inline-flex; align-items: center; gap: 7px; min-height: 22px; } .collapse-toggle { display: inline-grid; width: 18px; height: 18px; place-items: center; padding: 0; border: 1px solid #9eb5df; border-radius: 4px; color: #315da9; background: #eaf1ff; font-size: 14px; line-height: 1; cursor: pointer; } .branch-marker { color: #5d82ca; font-size: 18px; font-weight: 400; } .kind-label { display: inline-flex; padding: 3px 5px; border-radius: 4px; color: #6c7890; background: #edf1f7; font-size: 9px; font-weight: 800; letter-spacing: .05em; } .nested-label { color: #315da9; background: #e5efff; } .nested-row td:first-child { border-left: 3px solid #8eaded; } .parent-row td:first-child { border-left: 3px solid transparent; }
21
+ .step-icon { display: inline-grid; width: 20px; height: 20px; margin-right: 7px; place-items: center; border-radius: 50%; color: white; background: #18a15d; font-size: 11px; } .nested-row .step-icon { margin-left: 18px; } .nested-row .hierarchy-name { padding-left: 0 !important; } .step-icon.waiting { background: #efaa18; } .step-icon.skipped { color: #62738c; background: #edf1f6; } .step-icon.failed, .step-icon.cancelled { background: #c94b42; } .step-icon.pending { border: 2px solid #aab6c7; background: transparent; }
22
+ .selected-label { display: inline-flex; margin-left: 8px; padding: 3px 5px; border-radius: 4px; color: #2458c4; background: #c4d7ff; font-size: 9px; font-weight: 800; letter-spacing: .05em; }
23
+ .status { display: inline-flex; padding: 4px 8px; border-radius: 5px; font-size: 10px; font-weight: 800; letter-spacing: .03em; } .status.finished { color: #14804a; background: #e7f6ed; } .status.waiting { color: #98660b; background: #fff2d5; } .status.pending, .status.skipped { color: #62738c; background: #edf1f6; } .status.failed, .status.cancelled { color: #a33a32; background: #ffebe8; }
24
+ .loop-row td { background: #f5f8fe; border-top: 1px solid #c8d7f0; border-bottom: 1px solid #dce6f6; } .loop-row td:first-child { border-left: 3px solid #668bd2; border-radius: 9px 0 0 0; } .loop-row td:last-child { border-right: 1px solid #c8d7f0; border-radius: 0 9px 0 0; } .loop-icon { color: #fff; background: #668bd2; font-size: 15px; } .loop-label { color: #315da9; background: #e7efff; } .loop-progress { display: flex; align-items: center; flex-wrap: wrap; gap: 5px 8px; min-width: 220px; margin-bottom: 4px; color: #315da9; font-size: 10px; letter-spacing: .02em; } .loop-progress small { flex-basis: 100%; color: #71839c; font-size: 10px; } .loop-bar { width: 92px; height: 6px; overflow: hidden; border-radius: 99px; background: #dce6f6; } .loop-bar i { display: block; height: 100%; border-radius: inherit; background: #668bd2; transition: width .2s ease; } .loop-content td { border-top: 0; border-bottom: 0; background: #fbfdff; } .loop-content td:first-child { border-left: 3px solid #c8d7f0; } .loop-content td:last-child { border-right: 1px solid #c8d7f0; } .loop-end td { border-bottom: 1px solid #c8d7f0; } .loop-end td:first-child { border-radius: 0 0 0 9px; } .loop-end td:last-child { border-radius: 0 0 9px 0; }
25
+ .event-panel { margin-top: 18px; } .event-row td { padding: 9px 14px; font-size: 12px; } code { color: #294d9c; font-family: ui-monospace, monospace; font-size: 11px; }
26
+ .inspector { padding: 22px 18px; border-left: 1px solid #dfe4ec; } .inspector h2 { font-size: 17px; } .selected-detail-name { margin: 6px 0 0; color: #2458c4; font-size: 13px; } .run-id { margin: 5px 0 20px; color: #7a899d; font-family: ui-monospace, monospace; font-size: 10px; } .inspector-section { padding: 17px 0; border-top: 1px solid #e6ebf2; } .inspector-section h3 { margin: 0 0 11px; font-size: 13px; }
27
+ .selection-nav { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 10px; } .selection-nav .button { padding: 5px 8px; font-size: 11px; }
28
+ .parallel-event { color: #66758c; font-size: 10px; }
29
+ .event-filter { min-width: 120px; padding: 6px 8px; font-size: 11px; }
30
+ .key-values { display: grid; grid-template-columns: 1fr 1fr; border: 1px solid #e0e6ef; border-radius: 6px; overflow: hidden; font-size: 12px; } .key-values span { padding: 9px 10px; border-bottom: 1px solid #e9edf3; } .key-values span:nth-child(odd) { color: #63738a; background: #fafbfd; } .key-values span:nth-last-child(-n+2) { border-bottom: 0; }
31
+ .iteration-history { display: grid; gap: 7px; } .iteration-entry { display: grid; gap: 3px; padding: 9px 10px; border: 1px solid #dce4ed; border-radius: 6px; background: #fbfdff; font-size: 11px; } .iteration-entry span { color: #637897; font-size: 10px; } .iteration-entry small { color: #71839c; line-height: 1.35; } .timing-details { display: grid; gap: 4px; margin-top: 8px; padding: 9px 10px; border: 1px solid #dce4ed; border-radius: 6px; color: #637897; background: #fbfdff; font-size: 10px; } .timing-details strong { color: #40516c; font-size: 11px; }
32
+ .notice { padding: 12px; border-radius: 6px; color: #59708e; background: #f3f6fa; font-size: 12px; line-height: 1.5; } .draft-badge { position: fixed; right: 18px; bottom: 14px; padding: 7px 10px; border: 1px solid #e5c987; border-radius: 5px; color: #85600e; background: #fff7df; font-size: 11px; font-weight: 750; }
33
+ .about-button { height: 30px; padding: 0 10px; border: 1px solid #cdd7e5; border-radius: 6px; background: white; color: #40516c; font-size: 12px; font-weight: 700; cursor: pointer; }
34
+ .about-backdrop { position: fixed; inset: 0; z-index: 20; display: grid; place-items: center; background: rgb(7 12 24 / 48%); }
35
+ .about-dialog { position: relative; width: min(360px, calc(100vw - 40px)); padding: 28px; border: 1px solid #dce4ed; border-radius: 12px; background: white; color: #40516c; box-shadow: 0 20px 60px rgb(0 0 0 / 24%); text-align: center; }
36
+ .about-dialog .runner-logo { margin: 0 auto 14px; }.about-dialog h2 { margin: 0 0 8px; color: #182234; }.about-dialog p { margin: 0 0 8px; color: #66758c; line-height: 1.5; }.about-dialog small { color: #8794a8; }.about-dialog footer { margin-top: 24px; color: #7a899d; font-size: 11px; }.about-close { position: absolute; top: 10px; right: 12px; border: 0; background: transparent; color: #7a899d; font-size: 22px; cursor: pointer; }
37
+ .error-notice { padding: 12px; border: 1px solid #f0c5c1; border-radius: 6px; color: #9d332b; background: #fff1ef; font-size: 12px; line-height: 1.5; } .dry-run-issues { display: grid; gap: 8px; } .dry-run-issues .error-notice { font-size: 11px; } .dry-run-issues small { display: block; margin-top: 5px; color: inherit; opacity: .8; }
38
+ .validation-panel { display: flex; gap: 11px; align-items: flex-start; margin-top: 18px; padding: 13px 16px; border: 1px solid; border-radius: 8px; font-size: 12px; } .validation-panel strong { display: block; } .validation-panel small { display: block; margin-top: 3px; color: inherit; opacity: .8; } .validation-pass { border-color: #b9dfca; color: #176d41; background: #effaf3; } .validation-failed { display: grid; gap: 11px; border-color: #edc2bd; color: #963b33; background: #fff5f3; } .validation-heading { display: flex; gap: 11px; align-items: flex-start; } .validation-icon, .issue-icon { display: inline-grid; flex: 0 0 auto; width: 22px; height: 22px; place-items: center; border-radius: 50%; color: white; background: #1b9a5b; font-size: 14px; font-weight: 800; } .validation-failed .validation-icon, .issue-icon { background: #c94b42; } .validation-issues { display: grid; gap: 6px; padding-left: 33px; } .validation-issue { display: flex; gap: 8px; align-items: flex-start; padding: 8px 9px; border: 1px solid #f0d1cd; border-radius: 5px; background: rgba(255,255,255,.55); } .validation-issue .issue-icon { width: 16px; height: 16px; font-size: 12px; } .validation-issue span, .validation-issue small { display: block; } .validation-issue strong { font-size: 10px; letter-spacing: .04em; } .validation-issue span { margin-top: 2px; font-size: 11px; } .validation-issue small { margin-top: 3px; opacity: .75; }
39
+
40
+ :root[data-theme='dark'] .runner-header, :root[data-theme='dark'] .runner-nav, :root[data-theme='dark'] .inspector, :root[data-theme='dark'] .panel, :root[data-theme='dark'] .key-values, :root[data-theme='dark'] .button, :root[data-theme='dark'] select, :root[data-theme='dark'] .input-field input { border-color: #334155; background: #182235; color: #e6edf7; }
41
+ :root[data-theme='dark'] .runner-workspace { background: #111827; } :root[data-theme='dark'] .runner-header { border-color: #334155; } :root[data-theme='dark'] .runner-nav { border-color: #334155; } :root[data-theme='dark'] .inspector { border-color: #334155; }
42
+ :root[data-theme='dark'] .description, :root[data-theme='dark'] .nav-item, :root[data-theme='dark'] .run-id, :root[data-theme='dark'] .input-hint, :root[data-theme='dark'] .theme-picker, :root[data-theme='dark'] label { color: #a8b6ca; }
43
+ :root[data-theme='dark'] .nav-item.active { color: #b8d0ff; background: #243b68; } :root[data-theme='dark'] .package-card, :root[data-theme='dark'] .notice { border-color: #334155; background: #202c40; color: #b9c8dc; }
44
+ :root[data-theme='dark'] th { color: #9aaac0; background: #1c293d; } :root[data-theme='dark'] td { border-color: #2b3a50; } :root[data-theme='dark'] tr.parent-row td { background: #182235; } :root[data-theme='dark'] tr.nested-row td { background: #202c40; } :root[data-theme='dark'] tr.selected td { background: #243b68 !important; border-top-color: #496da8; } :root[data-theme='dark'] tr.selected .hierarchy-name { color: #d4e2ff; } :root[data-theme='dark'] .selected-detail-name { color: #a9c5ff; }
45
+ :root[data-theme='dark'] .hierarchy-hint { border-color: #314d80; color: #b8d0ff; background: #1b3159; } :root[data-theme='dark'] .hierarchy-hint span { color: #b0bfd5; } :root[data-theme='dark'] .hierarchy-action { border-color: #496da8; color: #c5d9ff; background: #202c40; } :root[data-theme='dark'] .collapse-toggle { border-color: #496da8; color: #c5d9ff; background: #294b80; } :root[data-theme='dark'] .kind-label { color: #b5c2d4; background: #334155; } :root[data-theme='dark'] .nested-label { color: #c5d9ff; background: #294b80; } :root[data-theme='dark'] .nested-row td:first-child { border-color: #6f96e5; } :root[data-theme='dark'] .branch-marker { color: #9ab9ff; }
46
+ :root[data-theme='dark'] .panel-heading, :root[data-theme='dark'] .inspector-section { border-color: #334155; } :root[data-theme='dark'] .key-values span { border-color: #334155; } :root[data-theme='dark'] .key-values span:nth-child(odd) { background: #1c293d; color: #a8b6ca; }
47
+ :root[data-theme='dark'] .iteration-entry { border-color: #334155; background: #1c293d; } :root[data-theme='dark'] .iteration-entry span, :root[data-theme='dark'] .iteration-entry small { color: #a8b6ca; }
48
+ :root[data-theme='dark'] .status.pending { color: #b5c2d4; background: #334155; } :root[data-theme='dark'] .file-button { border-color: #334155; background: #182235; color: #e6edf7; } :root[data-theme='dark'] .error-notice { border-color: #7f3434; background: #3a2025; color: #ffb4ad; }
49
+ :root[data-theme='dark'] body { background: #111827; } :root[data-theme='dark'] .runner-header strong, :root[data-theme='dark'] h1, :root[data-theme='dark'] h2, :root[data-theme='dark'] h3, :root[data-theme='dark'] td, :root[data-theme='dark'] .package-card strong { color: #e6edf7; }
50
+ :root[data-theme='dark'] .alpha-label, :root[data-theme='dark'] .nav-label, :root[data-theme='dark'] .eyebrow, :root[data-theme='dark'] .package-card small { color: #9aaac0; } :root[data-theme='dark'] code { color: #a9c7ff; }
51
+ :root[data-theme='dark'] .step-icon.pending { border-color: #718096; } :root[data-theme='dark'] .status.finished { color: #8ee0b1; background: #173b2d; } :root[data-theme='dark'] .status.waiting { color: #ffd27a; background: #4a3511; } :root[data-theme='dark'] .status.skipped { color: #b5c2d4; background: #334155; } :root[data-theme='dark'] .status.failed, :root[data-theme='dark'] .status.cancelled { color: #ffaaa2; background: #4a2428; }
52
+ :root[data-theme='dark'] .running { color: #8ee0b1; } :root[data-theme='dark'] .stopped, :root[data-theme='dark'] .load-error { color: #ffaaa2; } :root[data-theme='dark'] .draft-badge { border-color: #806a2e; color: #f4d477; background: #322b17; }
53
+ :root[data-theme='dark'] .loop-row td { background: #1c2b47; border-color: #405b8b; } :root[data-theme='dark'] .loop-row td:first-child { border-color: #79a1ff; } :root[data-theme='dark'] .loop-icon { color: #fff; background: #668bd2; } :root[data-theme='dark'] .loop-label { color: #d2e0ff; background: #294b80; } :root[data-theme='dark'] .loop-progress { color: #c5d9ff; } :root[data-theme='dark'] .loop-progress small { color: #b0bfd5; } :root[data-theme='dark'] .loop-bar { background: #334155; } :root[data-theme='dark'] .loop-bar i { background: #79a1ff; } :root[data-theme='dark'] .loop-content td { border-color: #405b8b; background: #151f31; } :root[data-theme='dark'] .loop-content td:first-child { border-color: #405b8b; } :root[data-theme='dark'] .loop-end td { border-color: #405b8b; }
54
+ :root[data-theme='dark'] .button:hover, :root[data-theme='dark'] .file-button:hover { border-color: #6289d9; background: #22324d; } :root[data-theme='dark'] .button.primary { border-color: #4d7fe0; background: #3f70d2; color: #fff; } :root[data-theme='dark'] .button.stop { color: #ffaaa2; }
55
+ :root[data-theme='dark'] .button.dry-run { border-color: #496da8; color: #c5d9ff; background: #202c40; }
56
+ :root[data-theme='dark'] .about-button, :root[data-theme='dark'] .about-dialog { border-color: #334155; background: #182235; color: #e6edf7; } :root[data-theme='dark'] .about-dialog h2 { color: #e6edf7; } :root[data-theme='dark'] .about-dialog p, :root[data-theme='dark'] .about-dialog footer { color: #a8b6ca; }
57
+ :root[data-theme='dark'] .validation-pass { border-color: #2d7653; color: #9be5b9; background: #173b2d; } :root[data-theme='dark'] .validation-failed { border-color: #7f3434; color: #ffb4ad; background: #3a2025; } :root[data-theme='dark'] .validation-issue { border-color: #6c3b3c; background: rgba(24, 20, 28, .45); }
58
+ .event-search { min-width: 180px; }
59
+ .empty-state { margin: 0; padding: 18px; color: var(--muted-text); }
60
+ .history-panel { margin-top: 16px; }
61
+ .history-panel table { width: 100%; }
62
+ .history-meta { display: block; margin-top: 3px; color: #71839c; font-size: 10px; }
63
+ .history-retention { display: flex; align-items: center; gap: 6px; font-size: 11px; }
64
+ .history-retention select { min-width: 92px; height: 30px; font-size: 11px; }
65
+ .history-delete { margin-left: 6px; color: #a33a32; }
66
+ .validation-issue[data-step-id] { cursor: pointer; }
67
+ .branch-path { display: grid; gap: 6px; margin-top: 8px; padding: 9px 10px; border: 1px solid #dce4ed; border-radius: 6px; background: #fbfdff; font-size: 11px; }
68
+ .branch-path-row { display: grid; grid-template-columns: auto 1fr auto; gap: 7px; align-items: center; }
69
+ .branch-path-row small { color: #71839c; font-size: 10px; }
70
+ .parallel-details { color: #637897; }
71
+ .parallel-details > span { font-size: 10px; }
72
+ .result-summary { display: grid; gap: 4px; margin-top: 8px; padding: 9px 10px; border: 1px solid #dce4ed; border-radius: 6px; color: #637897; background: #fbfdff; font-size: 10px; }
73
+ .result-summary strong { color: #40516c; font-size: 11px; }
74
+ .demo-entry { padding: 7px 10px; border: 1px solid var(--border); border-radius: 5px; background: var(--panel); color: var(--accent); font-size: 12px; font-weight: 650; text-decoration: none; }
75
+
76
+ .breakpoint-toggle { border: 0; background: transparent; color: var(--muted, #718096); cursor: pointer; margin-left: .4rem; padding: 0 .2rem; }
77
+ .breakpoint-toggle.active { color: #d64545; font-weight: 700; }
78
+ .inspector-actions { display: flex; gap: .5rem; flex-wrap: wrap; margin-top: .75rem; }
79
+ .attempt-history { display: grid; gap: .35rem; }
80
+ .debug-session-badge { height: 36px; display: inline-flex; align-items: center; padding: 0 .65rem; border: 1px solid #e5a4a4; border-radius: 6px; color: #a83232; background: #fff4f4; font-size: 11px; font-weight: 800; }
81
+ .execution-menu-label { color: #637897; font-size: 11px; font-weight: 700; }
82
+ .local-control { height: 30px; padding: 0 9px; font-size: 11px; }
83
+ .local-control.active { border-color: #d78383; color: #a83232; background: #fff4f4; }
84
+ .runner-context-menu { position: fixed; z-index: 20; min-width: 170px; padding: 6px; border: 1px solid #cbd6e6; border-radius: 7px; background: #fff; box-shadow: 0 8px 24px rgba(28, 47, 76, .18); }
85
+ .runner-context-menu strong { display: block; padding: 7px 9px 5px; color: #637897; font-size: 10px; text-transform: uppercase; letter-spacing: .05em; }
86
+ .runner-context-menu button { display: block; width: 100%; padding: 8px 9px; border: 0; border-radius: 4px; color: #243753; background: transparent; text-align: left; font: inherit; font-size: 12px; cursor: pointer; }
87
+ .runner-context-menu button:hover { background: #edf3ff; color: #173e91; }
88
+ .breakpoint-marker { display: inline-grid; width: 22px; height: 22px; place-items: center; color: #fff; background: #b93645; clip-path: polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%); filter: drop-shadow(0 1px 1px rgba(62, 20, 27, .25)); font-family: Arial, sans-serif; font-size: 4.5px; font-weight: 900; letter-spacing: .06em; line-height: 1; }
89
+
90
+ .button.resume-highlight { border-color: #3569d4; background: #3569d4; color: #fff; box-shadow: 0 0 0 3px rgba(53, 105, 212, .18); }
91
+
92
+ /* Match Studio's compact toolbar rhythm and quiet menu controls. */
93
+ .runner-header { border-color: var(--runner-line); background: var(--runner-surface); }
94
+ .runner-brand { align-items: baseline; gap: 6px; }
95
+ .runner-brand-mark { color: var(--runner-blue); font-size: 13px; letter-spacing: .04em; }
96
+ .runner-brand-product { color: var(--runner-ink); font-size: 13px; font-weight: 500; }
97
+ .alpha-label { padding-left: 2px; color: var(--runner-faint); font-family: ui-monospace, monospace; font-size: 9.5px; }
98
+ .runner-header .about-button,
99
+ .runner-header .demo-entry { height: 25px; padding: 0 9px; border: 0; border-radius: 4px; background: transparent; color: var(--runner-ink-2); font-size: 12px; font-weight: 400; }
100
+ .runner-header .about-button:hover,
101
+ .runner-header .demo-entry:hover { background: var(--runner-surface-3); color: var(--runner-ink); }
102
+ .runner-header .demo-entry { display: inline-flex; align-items: center; text-decoration: none; }
103
+ .theme-picker { gap: 7px; color: var(--runner-ink-2); font-size: 12px; font-weight: 700; white-space: nowrap; }
104
+ .theme-picker select { min-width: 82px; height: 30px; padding: 0 8px; border-color: var(--runner-line); border-radius: 6px; background: var(--runner-surface); color: var(--runner-ink); font: inherit; font-weight: 400; }
105
+
106
+ /* Keep Runner aligned with the shared QAICK Studio design tokens. These are
107
+ Runner-scoped names so the integrated stylesheet does not overwrite Studio's
108
+ own variables. Execution statuses retain their semantic colours below. */
109
+ :root {
110
+ --runner-blue: #4f46d8;
111
+ --runner-blue-strong: #3f37b8;
112
+ --runner-blue-soft: #e8eeff;
113
+ --runner-blue-line: #c8d5fa;
114
+ --runner-ink: #182234;
115
+ --runner-ink-2: #34435b;
116
+ --runner-muted: #617089;
117
+ --runner-faint: #7c8aa0;
118
+ --runner-surface: #fff;
119
+ --runner-surface-2: #f7f8fc;
120
+ --runner-surface-3: #edf0f7;
121
+ --runner-pane: #eef0f2;
122
+ --runner-heading: #e1e4e8;
123
+ --runner-divider: #cbd1d8;
124
+ --runner-line: #e5e7eb;
125
+ --runner-line-strong: #cfd5dd;
126
+ --runner-ok: #14804a;
127
+ --runner-ok-soft: #e6f5ec;
128
+ --runner-warn: #92620a;
129
+ --runner-warn-soft: #fdf3e2;
130
+ --runner-fail: #bc3327;
131
+ --runner-fail-soft: #fdecea;
132
+ }
133
+
134
+ :root[data-theme='dark'] {
135
+ --runner-blue: #8b9cff;
136
+ --runner-blue-strong: #aab5ff;
137
+ --runner-blue-soft: #252c4b;
138
+ --runner-blue-line: #4a5684;
139
+ --runner-ink: #edf1f8;
140
+ --runner-ink-2: #c8d1e2;
141
+ --runner-muted: #9da9bd;
142
+ --runner-faint: #7d899e;
143
+ --runner-surface: #171b24;
144
+ --runner-surface-2: #1d2230;
145
+ --runner-surface-3: #282f3e;
146
+ --runner-pane: #1b202a;
147
+ --runner-heading: #252c37;
148
+ --runner-divider: #3b4555;
149
+ --runner-line: #303949;
150
+ --runner-line-strong: #465267;
151
+ --runner-ok: #67d39a;
152
+ --runner-ok-soft: #1b382b;
153
+ --runner-warn: #e8bd66;
154
+ --runner-warn-soft: #3a301d;
155
+ --runner-fail: #ff8d83;
156
+ --runner-fail-soft: #402522;
157
+ }
158
+
159
+ :root,
160
+ :root[data-theme='dark'] {
161
+ color: var(--runner-ink);
162
+ background: var(--runner-surface);
163
+ }
164
+
165
+ body { background: var(--runner-surface-2); }
166
+ .runner-header,
167
+ .runner-nav,
168
+ .inspector,
169
+ .panel,
170
+ .button,
171
+ .file-button,
172
+ select,
173
+ .input-field input,
174
+ .about-button,
175
+ .about-dialog,
176
+ .hierarchy-action,
177
+ .runner-context-menu { border-color: var(--runner-line-strong); background: var(--runner-surface); color: var(--runner-ink-2); }
178
+ .runner-header { border-color: var(--runner-divider); }
179
+ .runner-brand-mark,
180
+ .runner-logo,
181
+ .button.primary,
182
+ .button.resume-highlight { background: var(--runner-blue); color: #fff; }
183
+ .runner-brand-mark { background: transparent; color: var(--runner-blue); }
184
+ .runner-brand-product,
185
+ .runner-header strong,
186
+ h1,
187
+ h2,
188
+ h3,
189
+ td,
190
+ .package-card strong,
191
+ .about-dialog h2 { color: var(--runner-ink); }
192
+ .alpha-label,
193
+ .nav-label,
194
+ .eyebrow,
195
+ .package-card small,
196
+ .run-id,
197
+ .input-hint,
198
+ .theme-picker,
199
+ label { color: var(--runner-muted); }
200
+ .runner-workspace { background: var(--runner-surface-2); }
201
+ .runner-nav { border-color: var(--runner-divider); }
202
+ .inspector { border-color: var(--runner-divider); }
203
+ .nav-item { color: var(--runner-muted); }
204
+ .nav-item.active { color: var(--runner-blue-strong); background: var(--runner-blue-soft); }
205
+ .package-card,
206
+ .notice { border-color: var(--runner-line); background: var(--runner-surface-3); color: var(--runner-muted); }
207
+ .button:hover,
208
+ .file-button:hover,
209
+ .about-button:hover { border-color: var(--runner-blue-line); background: var(--runner-blue-soft); }
210
+ .button.primary:hover,
211
+ .button.resume-highlight:hover { border-color: var(--runner-blue-strong); background: var(--runner-blue-strong); }
212
+ .panel-heading,
213
+ .inspector-section { border-color: var(--runner-line); }
214
+ th { color: var(--runner-faint); background: var(--runner-surface-2); }
215
+ td { border-color: var(--runner-line); }
216
+ tr.parent-row td,
217
+ .loop-content td { background: var(--runner-surface); }
218
+ tr.nested-row td { background: var(--runner-surface-3); }
219
+ tr.selected td { background: var(--runner-blue-soft) !important; border-top-color: var(--runner-blue-line); }
220
+ tr.selected td:first-child { border-left-color: var(--runner-blue); }
221
+ tr.selected .hierarchy-name,
222
+ .selected-detail-name,
223
+ code { color: var(--runner-blue-strong); }
224
+ .hierarchy-hint { border-color: var(--runner-blue-line); color: var(--runner-blue-strong); background: var(--runner-blue-soft); }
225
+ .hierarchy-hint span,
226
+ .parallel-details { color: var(--runner-muted); }
227
+ .hierarchy-action,
228
+ .collapse-toggle { border-color: var(--runner-blue-line); color: var(--runner-blue-strong); background: var(--runner-surface); }
229
+ .kind-label { color: var(--runner-muted); background: var(--runner-surface-3); }
230
+ .nested-label,
231
+ .loop-label { color: var(--runner-blue-strong); background: var(--runner-blue-soft); }
232
+ .key-values,
233
+ .iteration-entry,
234
+ .timing-details,
235
+ .branch-path,
236
+ .result-summary { border-color: var(--runner-line); background: var(--runner-surface); }
237
+ .key-values span:nth-child(odd) { color: var(--runner-muted); background: var(--runner-surface-2); }
238
+ .iteration-entry span,
239
+ .iteration-entry small,
240
+ .timing-details,
241
+ .branch-path-row small,
242
+ .result-summary { color: var(--runner-muted); }
243
+ .status.finished,
244
+ .validation-pass { color: var(--runner-ok); background: var(--runner-ok-soft); }
245
+ .status.waiting { color: var(--runner-warn); background: var(--runner-warn-soft); }
246
+ .status.failed,
247
+ .status.cancelled,
248
+ .validation-failed { color: var(--runner-fail); background: var(--runner-fail-soft); }
249
+ .error-notice { border-color: color-mix(in srgb, var(--runner-fail) 35%, var(--runner-surface)); color: var(--runner-fail); background: var(--runner-fail-soft); }
250
+ :root[data-theme='dark'] .runner-header,
251
+ :root[data-theme='dark'] .runner-nav,
252
+ :root[data-theme='dark'] .inspector,
253
+ :root[data-theme='dark'] .panel,
254
+ :root[data-theme='dark'] .button,
255
+ :root[data-theme='dark'] select,
256
+ :root[data-theme='dark'] .input-field input,
257
+ :root[data-theme='dark'] .about-button,
258
+ :root[data-theme='dark'] .about-dialog { background: var(--runner-surface); color: var(--runner-ink); }
259
+ :root[data-theme='dark'] .runner-workspace { background: var(--runner-surface-2); }
260
+ :root[data-theme='dark'] .package-card,
261
+ :root[data-theme='dark'] .notice,
262
+ :root[data-theme='dark'] .kind-label { background: var(--runner-surface-3); color: var(--runner-ink-2); }
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@qaick/runner",
3
+ "description": "Reusable QAick Runner module and standalone execution application.",
4
+ "version": "0.2.0-alpha.10",
5
+ "type": "module",
6
+ "files": [
7
+ "package-dist",
8
+ "README.md"
9
+ ],
10
+ "main": "./package-dist/src/runner/RunnerModule.js",
11
+ "types": "./package-dist/src/runner/RunnerModule.d.ts",
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "tag": "alpha"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./package-dist/src/runner/RunnerModule.d.ts",
19
+ "import": "./package-dist/src/runner/RunnerModule.js"
20
+ },
21
+ "./runner-module": {
22
+ "types": "./package-dist/src/runner/RunnerModule.d.ts",
23
+ "import": "./package-dist/src/runner/RunnerModule.js"
24
+ },
25
+ "./runtime-client-adapter": {
26
+ "types": "./package-dist/src/runner/runtime-client-adapter.d.ts",
27
+ "import": "./package-dist/src/runner/runtime-client-adapter.js"
28
+ },
29
+ "./styles.css": "./package-dist/styles.css",
30
+ "./package.json": "./package.json"
31
+ },
32
+ "scripts": {
33
+ "dev": "vite",
34
+ "build": "tsc -b && vite build",
35
+ "build:package": "node scripts/build-package.mjs",
36
+ "check:package": "npm run build:package && node scripts/check-package.mjs",
37
+ "pack:check": "npm run build:package && npm pack --dry-run",
38
+ "pack:tarball": "npm run build:package && npm pack",
39
+ "publish:alpha": "npm run check:package && npm publish --tag alpha",
40
+ "package:standalone": "npm run build && node scripts/package-standalone.mjs",
41
+ "smoke": "node scripts/smoke-check.mjs",
42
+ "smoke:deployment": "node scripts/smoke-check.mjs --deployment",
43
+ "lint": "oxlint",
44
+ "verify": "npm test && npm run build && npm run smoke && npm run lint",
45
+ "verify:clean": "npm ci && npm run verify",
46
+ "build:cloudflare": "npm run build",
47
+ "deploy:cloudflare": "npx wrangler deploy",
48
+ "deploy:cloudflare:preview": "npx wrangler versions upload",
49
+ "deploy": "npm run deploy:cloudflare",
50
+ "preview": "vite preview",
51
+ "test": "vitest run",
52
+ "typecheck": "tsc -b"
53
+ },
54
+ "dependencies": {
55
+ "@qaick/contract": "0.2.10",
56
+ "@qaick/executor": "0.1.0-alpha.1",
57
+ "@qaick/http-executor": "0.1.0-alpha.1",
58
+ "@qaick/runtime": "0.1.0-alpha.2",
59
+ "zustand": "^5.0.15"
60
+ },
61
+ "peerDependencies": {
62
+ "react": ">=19.0.0",
63
+ "react-dom": ">=19.0.0"
64
+ },
65
+ "devDependencies": {
66
+ "@vitejs/plugin-react": "^6.1.1",
67
+ "@testing-library/dom": "^10.4.2",
68
+ "@testing-library/react": "^16.3.3",
69
+ "@types/node": "^24.13.3",
70
+ "@types/react": "^19.2.18",
71
+ "@types/react-dom": "^19.2.7",
72
+ "jsdom": "^30.0.1",
73
+ "oxlint": "^1.81.0",
74
+ "react": "^19.2.8",
75
+ "react-dom": "^19.2.8",
76
+ "typescript": "~6.0.2",
77
+ "vite": "^8.3.0",
78
+ "vitest": "^5.0.0"
79
+ }
80
+ }