@scenar/cli 0.8.0 → 0.9.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 (78) hide show
  1. package/example-bundle/assets/index-DlmG1Uh7.js +388 -0
  2. package/example-bundle/assets/style-BjquDnTE.css +1 -0
  3. package/example-bundle/index.html +2 -2
  4. package/example-bundle/pack-manifest.json +9 -9
  5. package/example-bundle/scenario.json +6 -2
  6. package/package.json +9 -5
  7. package/src/__tests__/collect-pack-shots.test.ts +97 -0
  8. package/src/__tests__/pack-generate-embed-entry.test.ts +68 -3
  9. package/src/__tests__/pack-manifest.test.ts +17 -0
  10. package/src/__tests__/read-shots.test.ts +57 -0
  11. package/src/__tests__/run-shoot.test.ts +319 -0
  12. package/src/api.d.ts +3 -0
  13. package/src/api.d.ts.map +1 -1
  14. package/src/api.js +2 -0
  15. package/src/api.js.map +1 -1
  16. package/src/api.ts +5 -0
  17. package/src/bundle/read-shots.d.ts +28 -0
  18. package/src/bundle/read-shots.d.ts.map +1 -0
  19. package/src/bundle/read-shots.js +28 -0
  20. package/src/bundle/read-shots.js.map +1 -0
  21. package/src/bundle/read-shots.ts +38 -0
  22. package/src/commands/shoot.d.ts +3 -0
  23. package/src/commands/shoot.d.ts.map +1 -0
  24. package/src/commands/shoot.js +52 -0
  25. package/src/commands/shoot.js.map +1 -0
  26. package/src/commands/shoot.ts +72 -0
  27. package/src/index.d.ts.map +1 -1
  28. package/src/index.js +2 -0
  29. package/src/index.js.map +1 -1
  30. package/src/index.ts +2 -0
  31. package/src/pack/build.d.ts +33 -1
  32. package/src/pack/build.d.ts.map +1 -1
  33. package/src/pack/build.js +35 -10
  34. package/src/pack/build.js.map +1 -1
  35. package/src/pack/build.ts +63 -17
  36. package/src/pack/collect-pack-shots.d.ts +40 -0
  37. package/src/pack/collect-pack-shots.d.ts.map +1 -0
  38. package/src/pack/collect-pack-shots.js +59 -0
  39. package/src/pack/collect-pack-shots.js.map +1 -0
  40. package/src/pack/collect-pack-shots.ts +76 -0
  41. package/src/pack/generate-embed-entry.d.ts +18 -0
  42. package/src/pack/generate-embed-entry.d.ts.map +1 -1
  43. package/src/pack/generate-embed-entry.js +92 -3
  44. package/src/pack/generate-embed-entry.js.map +1 -1
  45. package/src/pack/generate-embed-entry.ts +94 -3
  46. package/src/pack/pack-manifest.d.ts +12 -3
  47. package/src/pack/pack-manifest.d.ts.map +1 -1
  48. package/src/pack/pack-manifest.js +13 -3
  49. package/src/pack/pack-manifest.js.map +1 -1
  50. package/src/pack/pack-manifest.ts +13 -2
  51. package/src/pack/run-pack.d.ts +6 -0
  52. package/src/pack/run-pack.d.ts.map +1 -1
  53. package/src/pack/run-pack.js +41 -14
  54. package/src/pack/run-pack.js.map +1 -1
  55. package/src/pack/run-pack.ts +55 -14
  56. package/src/shoot/playwright-browser.d.ts +9 -0
  57. package/src/shoot/playwright-browser.d.ts.map +1 -0
  58. package/src/shoot/playwright-browser.js +92 -0
  59. package/src/shoot/playwright-browser.js.map +1 -0
  60. package/src/shoot/playwright-browser.ts +121 -0
  61. package/src/shoot/run-shoot.d.ts +58 -0
  62. package/src/shoot/run-shoot.d.ts.map +1 -0
  63. package/src/shoot/run-shoot.js +190 -0
  64. package/src/shoot/run-shoot.js.map +1 -0
  65. package/src/shoot/run-shoot.ts +270 -0
  66. package/src/shoot/types.d.ts +40 -0
  67. package/src/shoot/types.d.ts.map +1 -0
  68. package/src/shoot/types.js +2 -0
  69. package/src/shoot/types.js.map +1 -0
  70. package/src/shoot/types.ts +40 -0
  71. package/src/util/load-ts.d.ts +12 -2
  72. package/src/util/load-ts.d.ts.map +1 -1
  73. package/src/util/load-ts.js +25 -10
  74. package/src/util/load-ts.js.map +1 -1
  75. package/src/util/load-ts.ts +25 -11
  76. package/tsconfig.tsbuildinfo +1 -1
  77. package/example-bundle/assets/index-CBaiZ4ek.js +0 -147
  78. package/example-bundle/assets/style-Ci-h7jik.css +0 -1
@@ -0,0 +1 @@
1
+ @source "./**/*.js";@layer scenar{.scenar{--scenar-surface: #ffffff;--scenar-border: #e5e7eb;--scenar-foreground: #0f172a;--scenar-muted-foreground: #64748b;--scenar-card: #ffffff;--scenar-accent: #f1f5f9;--scenar-primary: #0f172a;--scenar-ring: #0f172a;--scenar-chrome: #202124;--scenar-chrome-raised: #35363a;--scenar-chrome-foreground: #bdc1c6;--scenar-cursor-stroke: #ffffff;--scenar-backdrop-glow-1: #b7d4f2;--scenar-backdrop-glow-2: #e3d0ec;--scenar-backdrop-glow-3: #b4c4ea;--scenar-backdrop-base-1: #e4ecf7;--scenar-backdrop-base-2: #e6e1f0;--scenar-backdrop: radial-gradient(120% 100% at 12% 8%, var(--scenar-backdrop-glow-1) 0%, transparent 55%), radial-gradient(110% 95% at 88% 12%, var(--scenar-backdrop-glow-2) 0%, transparent 55%), radial-gradient(130% 110% at 70% 100%, var(--scenar-backdrop-glow-3) 0%, transparent 60%), linear-gradient(135deg, var(--scenar-backdrop-base-1) 0%, var(--scenar-backdrop-base-2) 100%);--scenar-shadow-window: 0 24px 64px -16px rgb(15 23 42 / .35), 0 4px 16px -4px rgb(15 23 42 / .2);--scenar-radius-window: 10px}.scenar.dark{--scenar-surface: #0f172a;--scenar-border: #1e293b;--scenar-foreground: #f8fafc;--scenar-muted-foreground: #94a3b8;--scenar-card: #1e293b;--scenar-accent: #1e293b;--scenar-primary: #f8fafc;--scenar-ring: #f8fafc;--scenar-chrome: #202124;--scenar-chrome-raised: #35363a;--scenar-chrome-foreground: #bdc1c6;--scenar-cursor-stroke: #ffffff;--scenar-backdrop-glow-1: #1c3a63;--scenar-backdrop-glow-2: #372a5e;--scenar-backdrop-glow-3: #142647;--scenar-backdrop-base-1: #101828;--scenar-backdrop-base-2: #14122a;--scenar-shadow-window: 0 24px 64px -16px rgb(0 0 0 / .65), 0 4px 16px -4px rgb(0 0 0 / .4);--scenar-radius-window: 10px}}/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--drop-shadow-sm:0 1px 2px #00000026;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-foreground:var(--scenar-foreground);--color-border:var(--scenar-border)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.-right-px{right:-1px}.right-0{right:calc(var(--spacing) * 0)}.-bottom-px{bottom:-1px}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-1{bottom:calc(var(--spacing) * 1)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing) * 4)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[15\]{z-index:15}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-\[5px\]{height:5px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/3{width:33.3333%}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-16{width:calc(var(--spacing) * 16)}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[14px\]{width:14px}.w-\[15px\]{width:15px}.w-\[42px\]{width:42px}.w-\[160px\]{width:160px}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[80\%\]{max-width:80%}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[2\.5rem\]{min-width:2.5rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-2{--tw-translate-x:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-px{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[5px\]{gap:5px}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-\[\#1a1a1a\]{border-color:#1a1a1a}.border-\[\#1e1e1e\]{border-color:#1e1e1e}.border-\[\#2a2a2e\]{border-color:#2a2a2e}.border-\[\#2d2d2d\]{border-color:#2d2d2d}.border-\[\#3a3a3a\]{border-color:#3a3a3a}.border-\[\#3a3f47\]{border-color:#3a3f47}.border-\[\#3c4043\]{border-color:#3c4043}.border-\[\#007acc\]{border-color:#007acc}.border-\[\#ff6c37\]{border-color:#ff6c37}.border-\[var\(--scenar-border\)\],.border-border{border-color:var(--scenar-border)}.border-transparent{border-color:#0000}.bg-\[\#0b93f6\]{background-color:#0b93f6}.bg-\[\#1a1a1a\]{background-color:#1a1a1a}.bg-\[\#1a73e8\]{background-color:#1a73e8}.bg-\[\#1c1c1c\]{background-color:#1c1c1c}.bg-\[\#1e1e1e\]{background-color:#1e1e1e}.bg-\[\#2a2a2e\]{background-color:#2a2a2e}.bg-\[\#2c2c2c\]{background-color:#2c2c2c}.bg-\[\#2d2d2d\]{background-color:#2d2d2d}.bg-\[\#3b82f6\]{background-color:#3b82f6}.bg-\[\#3b82f6\]\/10{background-color:#3b82f61a}.bg-\[\#3b82f6\]\/15{background-color:#3b82f626}.bg-\[\#5f6368\]{background-color:#5f6368}.bg-\[\#007acc\]{background-color:#007acc}.bg-\[\#007acc\]\/10{background-color:#007acc1a}.bg-\[\#22c55e\]{background-color:#22c55e}.bg-\[\#22c55e\]\/15{background-color:#22c55e26}.bg-\[\#28c840\]{background-color:#28c840}.bg-\[\#94a3b8\]\/15{background-color:#94a3b826}.bg-\[\#181b1f\]{background-color:#181b1f}.bg-\[\#999\]{background-color:#999}.bg-\[\#3274d9\]{background-color:#3274d9}.bg-\[\#04395e\]{background-color:#04395e}.bg-\[\#6366f1\]{background-color:#6366f1}.bg-\[\#111217\]{background-color:#111217}.bg-\[\#202124\]{background-color:#202124}.bg-\[\#252526\]{background-color:#252526}.bg-\[\#323232\]{background-color:#323232}.bg-\[\#323233\]{background-color:#323233}.bg-\[\#333333\]{background-color:#333}.bg-\[\#404040\]{background-color:#404040}.bg-\[\#eab308\]\/15{background-color:#eab30826}.bg-\[\#ef4444\]\/15{background-color:#ef444426}.bg-\[\#febc2e\]{background-color:#febc2e}.bg-\[\#ff5f57\]{background-color:#ff5f57}.bg-\[var\(--scenar-accent\)\]{background-color:var(--scenar-accent)}.bg-\[var\(--scenar-card\)\]{background-color:var(--scenar-card)}.bg-\[var\(--scenar-chrome\)\]{background-color:var(--scenar-chrome)}.bg-\[var\(--scenar-chrome-raised\)\]{background-color:var(--scenar-chrome-raised)}.bg-\[var\(--scenar-surface\)\]{background-color:var(--scenar-surface)}.bg-black{background-color:var(--color-black)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-card{background-color:var(--scenar-card)}.bg-primary\/25{background-color:var(--scenar-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/25{background-color:color-mix(in oklab,var(--scenar-primary) 25%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[\#6366f1\]{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-\[\#ff6600\]{--tw-gradient-from:#f60;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-black\/70{--tw-gradient-from:#000000b3}@supports (color:color-mix(in lab,red,red)){.from-black\/70{--tw-gradient-from:color-mix(in oklab, var(--color-black) 70%, transparent)}}.from-black\/70{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-black\/30{--tw-gradient-via:#0000004d}@supports (color:color-mix(in lab,red,red)){.via-black\/30{--tw-gradient-via:color-mix(in oklab, var(--color-black) 30%, transparent)}}.via-black\/30{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-\[\#8b5cf6\]{--tw-gradient-to:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[\#f5a623\]{--tw-gradient-to:#f5a623;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-\[2px\]{padding-block:2px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-\[10px\]{padding-top:10px}.pt-\[14px\]{padding-top:14px}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[16px\]{font-size:16px}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#3b82f6\]{color:#3b82f6}.text-\[\#5f6368\]{color:#5f6368}.text-\[\#6e7681\]{color:#6e7681}.text-\[\#9aa0a6\]{color:#9aa0a6}.text-\[\#9d9d9d\]{color:#9d9d9d}.text-\[\#22c55e\]{color:#22c55e}.text-\[\#50fa7b\]{color:#50fa7b}.text-\[\#94a3b8\]{color:#94a3b8}.text-\[\#519aba\]{color:#519aba}.text-\[\#666\]{color:#666}.text-\[\#888\]{color:#888}.text-\[\#64748b\]{color:#64748b}.text-\[\#666666\]{color:#666}.text-\[\#858585\]{color:#858585}.text-\[\#a0a0a0\]{color:#a0a0a0}.text-\[\#bd93f9\]{color:#bd93f9}.text-\[\#bdc1c6\]{color:#bdc1c6}.text-\[\#c6c6c6\]{color:#c6c6c6}.text-\[\#cccccc\]{color:#ccc}.text-\[\#d4d4d4\]{color:#d4d4d4}.text-\[\#dcb67a\]{color:#dcb67a}.text-\[\#e8e8e8\]{color:#e8e8e8}.text-\[\#e8eaed\]{color:#e8eaed}.text-\[\#e6995b\]{color:#e6995b}.text-\[\#eab308\]{color:#eab308}.text-\[\#ef4444\]{color:#ef4444}.text-\[\#f8f8f2\]{color:#f8f8f2}.text-\[\#f8f8f2\]\/70{color:#f8f8f2b3}.text-\[\#ff5555\]{color:#f55}.text-\[\#ffffff\]{color:#fff}.text-\[var\(--scenar-chrome-foreground\)\]{color:var(--scenar-chrome-foreground)}.text-\[var\(--scenar-foreground\)\]{color:var(--scenar-foreground)}.text-\[var\(--scenar-muted-foreground\)\]{color:var(--scenar-muted-foreground)}.text-foreground{color:var(--scenar-foreground)}.text-muted-foreground{color:var(--scenar-muted-foreground)}.text-primary{color:var(--scenar-primary)}.text-white{color:var(--color-white)}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab,red,red)){.text-white\/40{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-white\/95{color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.text-white\/95{color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));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,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:h-2:hover{height:calc(var(--spacing) * 2)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:bg-accent:hover{background-color:var(--scenar-accent)}.hover\:text-white:hover{color:var(--color-white)}}}@layer scenar{.scenar{--scenar-surface:#fff;--scenar-border:#e5e7eb;--scenar-foreground:#0f172a;--scenar-muted-foreground:#64748b;--scenar-card:#fff;--scenar-accent:#f1f5f9;--scenar-primary:#0f172a;--scenar-ring:#0f172a;--scenar-chrome:#202124;--scenar-chrome-raised:#35363a;--scenar-chrome-foreground:#bdc1c6;--scenar-cursor-stroke:#fff;--scenar-backdrop-glow-1:#b7d4f2;--scenar-backdrop-glow-2:#e3d0ec;--scenar-backdrop-glow-3:#b4c4ea;--scenar-backdrop-base-1:#e4ecf7;--scenar-backdrop-base-2:#e6e1f0;--scenar-backdrop:radial-gradient(120% 100% at 12% 8%, var(--scenar-backdrop-glow-1) 0%, transparent 55%), radial-gradient(110% 95% at 88% 12%, var(--scenar-backdrop-glow-2) 0%, transparent 55%), radial-gradient(130% 110% at 70% 100%, var(--scenar-backdrop-glow-3) 0%, transparent 60%), linear-gradient(135deg, var(--scenar-backdrop-base-1) 0%, var(--scenar-backdrop-base-2) 100%);--scenar-shadow-window:0 24px 64px -16px #0f172a59, 0 4px 16px -4px #0f172a33;--scenar-radius-window:10px}.scenar.dark{--scenar-surface:#0f172a;--scenar-border:#1e293b;--scenar-foreground:#f8fafc;--scenar-muted-foreground:#94a3b8;--scenar-card:#1e293b;--scenar-accent:#1e293b;--scenar-primary:#f8fafc;--scenar-ring:#f8fafc;--scenar-chrome:#202124;--scenar-chrome-raised:#35363a;--scenar-chrome-foreground:#bdc1c6;--scenar-cursor-stroke:#fff;--scenar-backdrop-glow-1:#1c3a63;--scenar-backdrop-glow-2:#372a5e;--scenar-backdrop-glow-3:#142647;--scenar-backdrop-base-1:#101828;--scenar-backdrop-base-2:#14122a;--scenar-shadow-window:0 24px 64px -16px #000000a6, 0 4px 16px -4px #0006;--scenar-radius-window:10px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
@@ -8,8 +8,8 @@
8
8
  <style>
9
9
  html, body { margin: 0; background: transparent; }
10
10
  </style>
11
- <script type="module" crossorigin src="./assets/index-CBaiZ4ek.js"></script>
12
- <link rel="stylesheet" crossorigin href="./assets/style-Ci-h7jik.css">
11
+ <script type="module" crossorigin src="./assets/index-DlmG1Uh7.js"></script>
12
+ <link rel="stylesheet" crossorigin href="./assets/style-BjquDnTE.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -3,9 +3,9 @@
3
3
  "scenarioId": "welcome-tour",
4
4
  "files": [
5
5
  {
6
- "path": "assets/index-CBaiZ4ek.js",
7
- "sha256": "89eab73bf249e7c9dd4380ef7894db709d76e49d3cc592ad56eae0eb9221ef29",
8
- "sizeBytes": 378254,
6
+ "path": "assets/index-DlmG1Uh7.js",
7
+ "sha256": "15421a104b9def8109220de091a7f4221e414ac833b3cad07971ab0d40b1e916",
8
+ "sizeBytes": 596438,
9
9
  "contentType": "text/javascript"
10
10
  },
11
11
  {
@@ -15,9 +15,9 @@
15
15
  "contentType": "image/png"
16
16
  },
17
17
  {
18
- "path": "assets/style-Ci-h7jik.css",
19
- "sha256": "18e39dd57cc139dbacca7d32f870d9cf79c011b830e33a32ba936f76f8a4a1fe",
20
- "sizeBytes": 34986,
18
+ "path": "assets/style-BjquDnTE.css",
19
+ "sha256": "f74eb6dd3d21e3e259bc6f219302421239eb94559c3c759439a20f853d1ca036",
20
+ "sizeBytes": 33952,
21
21
  "contentType": "text/css"
22
22
  },
23
23
  {
@@ -28,14 +28,14 @@
28
28
  },
29
29
  {
30
30
  "path": "index.html",
31
- "sha256": "aa9c84a3a1b2cb1846b367176f1effa77a519e50c2f00848bfbbdb3b6044a2ca",
31
+ "sha256": "c071cd3ba669dbea4696065b14bdbd1ef8f91f639b7d253d3e348699f52f6795",
32
32
  "sizeBytes": 533,
33
33
  "contentType": "text/html"
34
34
  },
35
35
  {
36
36
  "path": "scenario.json",
37
- "sha256": "036d23cf0523958fc5b5b2da57318d9ad2ab8fb2f1eac0c264a52a7b15cbc001",
38
- "sizeBytes": 148,
37
+ "sha256": "b9f3c79b8c3dcbba4a89eba5700fd8fc99e10902642150ea29419438ac2b74a3",
38
+ "sizeBytes": 208,
39
39
  "contentType": "application/json"
40
40
  }
41
41
  ]
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "schemaVersion": "1",
3
3
  "id": "welcome-tour",
4
- "generator": "@scenar/cli pack 0.0.1",
4
+ "generator": "@scenar/cli pack 0.0.2",
5
5
  "viewport": {
6
6
  "width": 896,
7
7
  "height": 480
8
- }
8
+ },
9
+ "shots": [
10
+ "login-screen",
11
+ "settings-screen"
12
+ ]
9
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scenar/cli",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "Scenar CLI — validate scenarios, generate narration, and render videos.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -39,9 +39,9 @@
39
39
  }
40
40
  },
41
41
  "dependencies": {
42
- "@scenar/core": "0.8.0",
43
- "@scenar/embed": "0.8.0",
44
- "@scenar/sdk": "0.8.0",
42
+ "@scenar/core": "0.9.1",
43
+ "@scenar/embed": "0.9.1",
44
+ "@scenar/sdk": "0.9.1",
45
45
  "commander": "^13.0.0",
46
46
  "yaml": "^2.7.0"
47
47
  },
@@ -52,7 +52,8 @@
52
52
  "@remotion/renderer": "4.0.448",
53
53
  "@remotion/bundler": "4.0.448",
54
54
  "vite": ">=6.0.0",
55
- "@vitejs/plugin-react": ">=4.3.0"
55
+ "@vitejs/plugin-react": ">=4.3.0",
56
+ "playwright": ">=1.50.0"
56
57
  },
57
58
  "peerDependenciesMeta": {
58
59
  "echogarden": {
@@ -75,6 +76,9 @@
75
76
  },
76
77
  "@vitejs/plugin-react": {
77
78
  "optional": true
79
+ },
80
+ "playwright": {
81
+ "optional": true
78
82
  }
79
83
  }
80
84
  }
@@ -0,0 +1,97 @@
1
+ // @vitest-environment node
2
+ //
3
+ // The workspace default is jsdom, but jsdom's TextEncoder returns a
4
+ // Uint8Array from its own realm, which trips esbuild's environment
5
+ // invariant when Vite loads. collectPackShots is a pure Node code path
6
+ // (it IS what `scenar pack` runs), so it is tested in a Node environment.
7
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
8
+ import { mkdtemp, writeFile, rm } from "node:fs/promises";
9
+ import { tmpdir } from "node:os";
10
+ import { join } from "node:path";
11
+ import { collectPackShots } from "../pack/collect-pack-shots.js";
12
+
13
+ /**
14
+ * These tests run the real Vite SSR pipeline against throwaway scenario
15
+ * directories — the same code path `scenar pack` uses — so they are slower
16
+ * than the pure-unit suites but prove the actual contract: what pack records
17
+ * is what the steps module really exports, not a source-text approximation.
18
+ */
19
+ describe("collectPackShots", () => {
20
+ let scenarioDir: string;
21
+
22
+ beforeEach(async () => {
23
+ scenarioDir = await mkdtemp(join(tmpdir(), "scenar-collect-shots-"));
24
+ });
25
+
26
+ afterEach(async () => {
27
+ await rm(scenarioDir, { recursive: true, force: true });
28
+ });
29
+
30
+ async function writeSteps(source: string): Promise<void> {
31
+ await writeFile(join(scenarioDir, "steps.ts"), source, "utf-8");
32
+ }
33
+
34
+ it("records declared shot names in step order", async () => {
35
+ await writeSteps(
36
+ `export const steps = [
37
+ { delayMs: 0, shot: "opening" },
38
+ { delayMs: 1200 },
39
+ { delayMs: 800, shot: "detail-open" },
40
+ ];`,
41
+ );
42
+ expect(await collectPackShots(scenarioDir)).toEqual({
43
+ recorded: true,
44
+ shots: ["opening", "detail-open"],
45
+ });
46
+ });
47
+
48
+ it("discovers a shot name built from a constant (runtime truth, not AST)", async () => {
49
+ await writeSteps(
50
+ `const SECTION = "detail";
51
+ export const steps = [{ delayMs: 0, shot: \`\${SECTION}-open\` }];`,
52
+ );
53
+ expect(await collectPackShots(scenarioDir)).toEqual({
54
+ recorded: true,
55
+ shots: ["detail-open"],
56
+ });
57
+ });
58
+
59
+ it("records an authoritatively empty list for a shot-less scenario", async () => {
60
+ await writeSteps(`export const steps = [{ delayMs: 0 }, { delayMs: 900 }];`);
61
+ expect(await collectPackShots(scenarioDir)).toEqual({ recorded: true, shots: [] });
62
+ });
63
+
64
+ it("degrades to recorded:false with the reason when the module cannot be imported", async () => {
65
+ await writeSteps(
66
+ `import { nope } from "./does-not-exist.js";
67
+ export const steps = [{ delayMs: 0, shot: String(nope) }];`,
68
+ );
69
+ const result = await collectPackShots(scenarioDir);
70
+ expect(result.recorded).toBe(false);
71
+ if (!result.recorded) {
72
+ expect(result.reason.length).toBeGreaterThan(0);
73
+ }
74
+ });
75
+
76
+ it("fails the pack when the module has no delayMs-bearing steps array", async () => {
77
+ await writeSteps(`export const notSteps = { delayMs: 0 };\nexport const nums = [1, 2, 3];`);
78
+ await expect(collectPackShots(scenarioDir)).rejects.toThrow(/No steps array found/);
79
+ });
80
+
81
+ it("fails the pack on a duplicate shot name, naming both steps", async () => {
82
+ await writeSteps(
83
+ `export const steps = [
84
+ { delayMs: 0, shot: "opening" },
85
+ { delayMs: 100, shot: "opening" },
86
+ ];`,
87
+ );
88
+ await expect(collectPackShots(scenarioDir)).rejects.toThrow(
89
+ /steps 0 and 1 both declare shot "opening"/,
90
+ );
91
+ });
92
+
93
+ it("fails the pack on a non-kebab-case shot name", async () => {
94
+ await writeSteps(`export const steps = [{ delayMs: 0, shot: "Not_Kebab" }];`);
95
+ await expect(collectPackShots(scenarioDir)).rejects.toThrow(/not kebab-case/);
96
+ });
97
+ });
@@ -48,9 +48,10 @@ describe("generateEmbedEntry", () => {
48
48
  const src = generateEmbedEntry({ ...BASE, hasNarration: false, providersPath: null });
49
49
  expect(src).toContain('import { useCallback, useRef, useState } from "react";');
50
50
  // ScenarioPlayer/DemoViewport/SCENAR_CLASS plus Cursor, useStepInteractions,
51
- // ViewportTransformLayer, VIEWPORT_TRANSFORM_IDENTITY all come from @scenar/react.
51
+ // ViewportTransformLayer, VIEWPORT_TRANSFORM_IDENTITY (playback) and
52
+ // ScenarioCaptureMount (the ?shot capture branch) all come from @scenar/react.
52
53
  expect(src).toContain(
53
- 'import { ScenarioPlayer, DemoViewport, SCENAR_CLASS, Cursor, useStepInteractions, ViewportTransformLayer, VIEWPORT_TRANSFORM_IDENTITY } from "@scenar/react";',
54
+ 'import { ScenarioPlayer, DemoViewport, SCENAR_CLASS, Cursor, useStepInteractions, ViewportTransformLayer, VIEWPORT_TRANSFORM_IDENTITY, ScenarioCaptureMount } from "@scenar/react";',
54
55
  );
55
56
  });
56
57
 
@@ -143,7 +144,7 @@ describe("generateEmbedEntry", () => {
143
144
  // the manifest from its own relative location, so clip src values resolve
144
145
  // against ./narration/ at runtime.
145
146
  expect(withNarration).toContain(
146
- 'import { ScenarioPlayer, DemoViewport, SCENAR_CLASS, Cursor, useStepInteractions, ViewportTransformLayer, VIEWPORT_TRANSFORM_IDENTITY, useNarrationManifest } from "@scenar/react";',
147
+ 'import { ScenarioPlayer, DemoViewport, SCENAR_CLASS, Cursor, useStepInteractions, ViewportTransformLayer, VIEWPORT_TRANSFORM_IDENTITY, ScenarioCaptureMount, useNarrationManifest } from "@scenar/react";',
147
148
  );
148
149
  expect(withNarration).toContain('const _resolveManifestUrl = () => "./narration/manifest.json";');
149
150
  expect(withNarration).toContain(
@@ -169,6 +170,70 @@ describe("generateEmbedEntry", () => {
169
170
  });
170
171
  });
171
172
 
173
+ describe("generateEmbedEntry capture branch (?shot)", () => {
174
+ it("branches on ?shot at module load and keeps the playback mount as the default", () => {
175
+ const src = generateEmbedEntry({ ...BASE, hasNarration: false, providersPath: null });
176
+ // Read once, outside React, exactly like ?theme.
177
+ expect(src).toContain('new URLSearchParams(window.location.search).get("shot")');
178
+ // Bare `?shot` (empty string) must still enter capture mode, so the
179
+ // guard is a null check, not truthiness.
180
+ expect(src).toContain("if (_shotParam !== null) {");
181
+ // The production embed path is untouched: no param means the exact
182
+ // playback mount that shipped before this branch existed.
183
+ expect(src).toContain("createRoot(_rootEl).render(<_App />);");
184
+ });
185
+
186
+ it("renders ScenarioCaptureMount with the same inputs as the playback tree", () => {
187
+ const src = generateEmbedEntry({
188
+ ...BASE,
189
+ hasNarration: false,
190
+ providersPath: "/proj/.scenar/providers.tsx",
191
+ stage: true,
192
+ });
193
+ expect(src).toContain("<ScenarioCaptureMount");
194
+ expect(src).toContain('scenarioId={"welcome-tour"}');
195
+ expect(src).toContain("steps={_steps}");
196
+ expect(src).toContain("renderStep={renderStep}");
197
+ expect(src).toContain("canonicalWidth={896}");
198
+ expect(src).toContain("shellHeight={480}");
199
+ expect(src).toContain("stage={true}");
200
+ expect(src).toContain("providers={_Providers}");
201
+ // The capture tree carries the theme-derived root class, same as playback.
202
+ expect(src).toContain('<div className={_rootClass}>');
203
+ });
204
+
205
+ it("omits providers and stage when the scenario has neither", () => {
206
+ const src = generateEmbedEntry({ ...BASE, hasNarration: false, providersPath: null });
207
+ expect(src).toContain("stage={false}");
208
+ expect(src).toContain("providers={undefined}");
209
+ });
210
+
211
+ it("wires the window contract scenar shoot consumes", () => {
212
+ const src = generateEmbedEntry({ ...BASE, hasNarration: false, providersPath: null });
213
+ expect(src).toContain("(window as any).__scenarShot = driver;");
214
+ expect(src).toContain("(window as any).__scenarShotError");
215
+ // ?shot=<name> deep-links auto-walk to the named shot; a bad name is a
216
+ // reported error listing what IS declared, not a silent no-op.
217
+ expect(src).toContain("driver.shots.find((s: any) => s.name === _shotParam)");
218
+ expect(src).toContain("void driver.walkTo(_target.timeMs);");
219
+ expect(src).toContain('no shot named');
220
+ });
221
+
222
+ it("fetches the narration manifest before mounting and fails loudly", () => {
223
+ // Shot times are narration-driven: capturing without the manifest would
224
+ // silently shoot every frame at the wrong time, so the capture branch
225
+ // must load it itself (never via useNarrationManifest, whose fetch
226
+ // failure is silent) and refuse to mount on failure.
227
+ const withNarration = generateEmbedEntry({ ...BASE, hasNarration: true, providersPath: null });
228
+ expect(withNarration).toContain('await fetch("./narration/manifest.json")');
229
+ expect(withNarration).toContain("refusing to capture without it");
230
+
231
+ const without = generateEmbedEntry({ ...BASE, hasNarration: false, providersPath: null });
232
+ expect(without).toContain("const _captureManifest = undefined;");
233
+ expect(without).not.toContain('await fetch("./narration/manifest.json")');
234
+ });
235
+ });
236
+
172
237
  describe("generateEmbedHtml", () => {
173
238
  it("references the entry as an external module script (CSP-safe, no inline code)", () => {
174
239
  const html = generateEmbedHtml("welcome-tour", "entry.tsx");
@@ -47,6 +47,23 @@ describe("writeScenarioJson", () => {
47
47
  expect(parsed.generator).toContain("@scenar/cli pack");
48
48
  // The baked canonical viewport flows downstream to the embed snippet (DD-004).
49
49
  expect(parsed.viewport).toEqual({ width: 1024, height: 576 });
50
+ // Shots not provided (unknown) — the key must be absent, not null/empty:
51
+ // absent means "boot a browser to find out", empty means "nothing to shoot".
52
+ expect("shots" in parsed).toBe(false);
53
+ });
54
+
55
+ it("records the declared shot names when provided — including an empty list", async () => {
56
+ await writeScenarioJson(dir, "welcome-tour", "0.0.1", DEFAULT_VIEWPORT, [
57
+ "opening",
58
+ "detail-open",
59
+ ]);
60
+ let parsed = JSON.parse(await readFile(join(dir, "scenario.json"), "utf-8"));
61
+ expect(parsed.shots).toEqual(["opening", "detail-open"]);
62
+
63
+ // Empty is authoritative — it is what lets `scenar shoot` skip the browser.
64
+ await writeScenarioJson(dir, "welcome-tour", "0.0.1", DEFAULT_VIEWPORT, []);
65
+ parsed = JSON.parse(await readFile(join(dir, "scenario.json"), "utf-8"));
66
+ expect(parsed.shots).toEqual([]);
50
67
  });
51
68
  });
52
69
 
@@ -0,0 +1,57 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtemp, writeFile, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { readBundleShots } from "../bundle/read-shots.js";
6
+
7
+ describe("readBundleShots", () => {
8
+ let dir: string;
9
+
10
+ beforeEach(async () => {
11
+ dir = await mkdtemp(join(tmpdir(), "scenar-shots-"));
12
+ });
13
+
14
+ afterEach(async () => {
15
+ await rm(dir, { recursive: true, force: true });
16
+ });
17
+
18
+ async function writeScenarioJson(content: unknown): Promise<void> {
19
+ await writeFile(
20
+ join(dir, "scenario.json"),
21
+ typeof content === "string" ? content : JSON.stringify(content),
22
+ "utf-8",
23
+ );
24
+ }
25
+
26
+ it("reads the recorded shot names from scenario.json", async () => {
27
+ await writeScenarioJson({ schemaVersion: "1", id: "x", shots: ["opening", "detail-open"] });
28
+ expect(await readBundleShots(dir)).toEqual({
29
+ recorded: true,
30
+ shots: ["opening", "detail-open"],
31
+ });
32
+ });
33
+
34
+ it("treats a recorded empty list as authoritative", async () => {
35
+ await writeScenarioJson({ schemaVersion: "1", id: "x", shots: [] });
36
+ expect(await readBundleShots(dir)).toEqual({ recorded: true, shots: [] });
37
+ });
38
+
39
+ it("reports unknown when scenario.json is absent", async () => {
40
+ expect(await readBundleShots(dir)).toEqual({ recorded: false });
41
+ });
42
+
43
+ it("reports unknown when the key is missing or malformed", async () => {
44
+ // A pre-shots bundle (generator < 0.0.2) simply has no key.
45
+ await writeScenarioJson({ schemaVersion: "1", id: "x" });
46
+ expect(await readBundleShots(dir)).toEqual({ recorded: false });
47
+
48
+ await writeScenarioJson({ schemaVersion: "1", id: "x", shots: "opening" });
49
+ expect(await readBundleShots(dir)).toEqual({ recorded: false });
50
+
51
+ await writeScenarioJson({ schemaVersion: "1", id: "x", shots: [1, 2] });
52
+ expect(await readBundleShots(dir)).toEqual({ recorded: false });
53
+
54
+ await writeScenarioJson("{ not json");
55
+ expect(await readBundleShots(dir)).toEqual({ recorded: false });
56
+ });
57
+ });