@mulmoclaude/mulmoscript-plugin 4.1.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css CHANGED
@@ -984,6 +984,10 @@
984
984
  background-color: var(--color-gray-100);
985
985
  }
986
986
 
987
+ .bg-gray-700 {
988
+ background-color: var(--color-gray-700);
989
+ }
990
+
987
991
  .bg-green-600 {
988
992
  background-color: var(--color-green-600);
989
993
  }
@@ -1136,6 +1140,10 @@
1136
1140
  font-family: var(--font-mono);
1137
1141
  }
1138
1142
 
1143
+ .font-sans {
1144
+ font-family: var(--font-sans);
1145
+ }
1146
+
1139
1147
  .text-3xl {
1140
1148
  font-size: var(--text-3xl);
1141
1149
  line-height: var(--tw-leading, var(--text-3xl--line-height));
@@ -1176,6 +1184,10 @@
1176
1184
  line-height: var(--tw-leading, var(--text-xs--line-height));
1177
1185
  }
1178
1186
 
1187
+ .text-\[11px\] {
1188
+ font-size: 11px;
1189
+ }
1190
+
1179
1191
  .text-\[clamp\(0\.8rem\,1\.76vw\,1\.6rem\)\] {
1180
1192
  font-size: clamp(.8rem, 1.76vw, 1.6rem);
1181
1193
  }
@@ -1418,6 +1430,10 @@
1418
1430
  background-color: var(--color-gray-100);
1419
1431
  }
1420
1432
 
1433
+ .hover\:bg-gray-200:hover {
1434
+ background-color: var(--color-gray-200);
1435
+ }
1436
+
1421
1437
  .hover\:bg-green-50:hover {
1422
1438
  background-color: var(--color-green-50);
1423
1439
  }
@@ -1730,18 +1746,18 @@
1730
1746
  }
1731
1747
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
1732
1748
  @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-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-leading:initial;--tw-font-weight:initial;--tw-tracking: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-outline-style:solid;--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-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-400:oklch(70.4% .191 22.216);--color-red-600:oklch(57.7% .245 27.325);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-500:oklch(68.5% .169 237.323);--color-violet-500:oklch(60.6% .25 292.717);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-900:oklch(21.6% .006 56.043);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.\@container{container-type:inline-size}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.-top-20{top:calc(var(--spacing) * -20)}.top-0{top:0}.top-5{top:calc(var(--spacing) * 5)}.top-\[52px\]{top:52px}.-right-8{right:calc(var(--spacing) * -8)}.right-0{right:0}.right-1{right:var(--spacing)}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-16{left:calc(var(--spacing) * -16)}.left-0{left:0}.left-1{left:var(--spacing)}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.z-\[1\]{z-index:1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.row-2{grid-row:2}.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-1{margin-inline:var(--spacing)}.mx-12{margin-inline:calc(var(--spacing) * 12)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-video{aspect-ratio:var(--aspect-video)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-\[2px\]{height:2px}.h-\[3px\]{height:3px}.h-\[280px\]{height:280px}.h-\[360px\]{height:360px}.h-full{height:100%}.max-h-1\/2{max-height:50%}.min-h-0{min-height:0}.w-1{width:var(--spacing)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-56{width:calc(var(--spacing) * 56)}.w-\[48px\]{width:48px}.w-\[280px\]{width:280px}.w-\[360px\]{width:360px}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-\[80px\]{min-width:80px}.flex-1{flex:1}.flex-\[1\.5\]{flex:1.5}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * 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)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.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-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.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{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-gray-200{border-color:var(--color-gray-200)}.border-red-400{border-color:var(--color-red-400)}.border-stone-200{border-color:var(--color-stone-200)}.border-stone-300{border-color:var(--color-stone-300)}.border-stone-700{border-color:var(--color-stone-700)}.border-transparent{border-color:#0000}.bg-\[\#0D1117\]{background-color:#0d1117}.bg-amber-500{background-color:var(--color-amber-500)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-stone-50\/40{background-color:#fafaf966}@supports (color:color-mix(in lab, red, red)){.bg-stone-50\/40{background-color:color-mix(in oklab, var(--color-stone-50) 40%, transparent)}}.bg-stone-200{background-color:var(--color-stone-200)}.bg-stone-700{background-color:var(--color-stone-700)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-12{padding-inline:calc(var(--spacing) * 12)}.px-16{padding-inline:calc(var(--spacing) * 16)}.px-20{padding-inline:calc(var(--spacing) * 20)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.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-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[52px\]{font-size:52px}.text-\[60px\]{font-size:60px}.text-\[64px\]{font-size:64px}.text-\[68px\]{font-size:68px}.text-\[76px\]{font-size:76px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-700{color:var(--color-amber-700)}.text-red-600{color:var(--color-red-600)}.text-rose-600{color:var(--color-rose-600)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-700{color:var(--color-stone-700)}.text-white{color:var(--color-white)}.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)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.opacity-10{opacity:.1}.opacity-80{opacity:.8}.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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.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-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))}@media (hover:hover){.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-stone-300:hover{border-color:var(--color-stone-300)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-stone-100:hover{background-color:var(--color-stone-100)}.hover\:bg-stone-200:hover{background-color:var(--color-stone-200)}.hover\:text-stone-900:hover{color:var(--color-stone-900)}}.disabled\:opacity-30:disabled{opacity:.3}@media (min-width:40rem){.sm\:inline{display:inline}}@container (min-width:48rem){.\@3xl\:max-h-none{max-height:none}.\@3xl\:w-\[var\(--beat-editor-pane-width\,24rem\)\]{width:var(--beat-editor-pane-width,24rem)}.\@3xl\:flex-row{flex-direction:row}.\@3xl\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.\@3xl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}}}@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-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-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}
1733
- .bottom-bar-wrapper[data-v-87bf6e4c] {
1749
+ .bottom-bar-wrapper[data-v-f9957eaf] {
1734
1750
  position: relative;
1735
1751
  flex-shrink: 0;
1736
1752
  }
1737
- .script-source[data-v-87bf6e4c] {
1753
+ .script-source[data-v-f9957eaf] {
1738
1754
  padding: 0.5rem;
1739
1755
  background: #f5f5f5;
1740
1756
  border-top: 1px solid #e0e0e0;
1741
1757
  font-family: Consolas, "MS Gothic", "BIZ UDGothic", monospace;
1742
1758
  font-size: 0.85rem;
1743
1759
  }
1744
- .script-source summary[data-v-87bf6e4c] {
1760
+ .script-source summary[data-v-f9957eaf] {
1745
1761
  cursor: pointer;
1746
1762
  user-select: none;
1747
1763
  padding: 0.5rem;
@@ -1750,13 +1766,13 @@
1750
1766
  font-weight: 500;
1751
1767
  color: #333;
1752
1768
  }
1753
- .script-source[open] summary[data-v-87bf6e4c] {
1769
+ .script-source[open] summary[data-v-f9957eaf] {
1754
1770
  margin-bottom: 0.5rem;
1755
1771
  }
1756
- .script-source summary[data-v-87bf6e4c]:hover {
1772
+ .script-source summary[data-v-f9957eaf]:hover {
1757
1773
  background: #d8d8d8;
1758
1774
  }
1759
- .script-editor[data-v-87bf6e4c] {
1775
+ .script-editor[data-v-f9957eaf] {
1760
1776
  width: 100%;
1761
1777
  height: 40vh;
1762
1778
  padding: 1rem;
@@ -1770,23 +1786,23 @@
1770
1786
  margin-bottom: 0.5rem;
1771
1787
  line-height: 1.5;
1772
1788
  }
1773
- .script-editor[data-v-87bf6e4c]:focus {
1789
+ .script-editor[data-v-f9957eaf]:focus {
1774
1790
  outline: none;
1775
1791
  border-color: #4caf50;
1776
1792
  box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.1);
1777
1793
  }
1778
- .script-editor-invalid[data-v-87bf6e4c] {
1794
+ .script-editor-invalid[data-v-f9957eaf] {
1779
1795
  border-color: #ef4444;
1780
1796
  }
1781
- .script-editor-invalid[data-v-87bf6e4c]:focus {
1797
+ .script-editor-invalid[data-v-f9957eaf]:focus {
1782
1798
  border-color: #ef4444;
1783
1799
  box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.1);
1784
1800
  }
1785
- .editor-actions[data-v-87bf6e4c] {
1801
+ .editor-actions[data-v-f9957eaf] {
1786
1802
  display: flex;
1787
1803
  justify-content: space-between;
1788
1804
  }
1789
- .apply-btn[data-v-87bf6e4c] {
1805
+ .apply-btn[data-v-f9957eaf] {
1790
1806
  padding: 0.5rem 1rem;
1791
1807
  background: #4caf50;
1792
1808
  color: white;
@@ -1797,16 +1813,16 @@
1797
1813
  transition: background 0.2s;
1798
1814
  font-weight: 500;
1799
1815
  }
1800
- .apply-btn[data-v-87bf6e4c]:hover {
1816
+ .apply-btn[data-v-f9957eaf]:hover {
1801
1817
  background: #45a049;
1802
1818
  }
1803
- .apply-btn[data-v-87bf6e4c]:disabled {
1819
+ .apply-btn[data-v-f9957eaf]:disabled {
1804
1820
  background: #cccccc;
1805
1821
  color: #666666;
1806
1822
  cursor: not-allowed;
1807
1823
  opacity: 0.6;
1808
1824
  }
1809
- .cancel-btn[data-v-87bf6e4c] {
1825
+ .cancel-btn[data-v-f9957eaf] {
1810
1826
  padding: 0.5rem 1rem;
1811
1827
  background: #e0e0e0;
1812
1828
  color: #333;
@@ -1817,10 +1833,10 @@
1817
1833
  transition: background 0.2s;
1818
1834
  font-weight: 500;
1819
1835
  }
1820
- .cancel-btn[data-v-87bf6e4c]:hover {
1836
+ .cancel-btn[data-v-f9957eaf]:hover {
1821
1837
  background: #d0d0d0;
1822
1838
  }
1823
- .copy-btn[data-v-87bf6e4c] {
1839
+ .copy-btn[data-v-f9957eaf] {
1824
1840
  position: absolute;
1825
1841
  bottom: 0.3rem;
1826
1842
  right: 0.65rem;
@@ -1831,10 +1847,10 @@
1831
1847
  cursor: pointer;
1832
1848
  z-index: 1;
1833
1849
  }
1834
- .copy-btn[data-v-87bf6e4c]:hover {
1850
+ .copy-btn[data-v-f9957eaf]:hover {
1835
1851
  color: #000;
1836
1852
  }
1837
- .copy-btn .material-icons[data-v-87bf6e4c] {
1853
+ .copy-btn .material-icons[data-v-f9957eaf] {
1838
1854
  font-size: 1.15rem;
1839
1855
  }
1840
1856
  /*$vite$:1*/
@@ -1 +1 @@
1
- {"version":3,"file":"View.vue.d.ts","sourceRoot":"","sources":["../../src/vue/View.vue"],"names":[],"mappings":"AAk3CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA8CrD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;CACrD,CAAC;AAk8DF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"View.vue.d.ts","sourceRoot":"","sources":["../../src/vue/View.vue"],"names":[],"mappings":"AAy6CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA+CrD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;CACrD,CAAC;AA0gEF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -10,7 +10,7 @@ export interface UseDeckEditorOptions {
10
10
  commitScript: (next: MulmoScript) => void;
11
11
  }
12
12
  export declare function useDeckEditor({ api, filePath, effectiveScript, commitScript }: UseDeckEditorOptions): {
13
- isDeck: ComputedRef<boolean>;
13
+ canEditBeats: ComputedRef<boolean>;
14
14
  deckScriptInput: ComputedRef<DeckScriptShape>;
15
15
  onDeckUpdate: (next: DeckScriptShape) => void;
16
16
  flushPendingDeckSave: () => void;
@@ -69,14 +69,17 @@ export declare function isBeatImageReference(beat: {
69
69
  [key: string]: unknown;
70
70
  };
71
71
  }): boolean;
72
- /** Pure check: is every beat in the script a `slide`-typed beat?
73
- * When true, the View mounts `@mulmocast/beat-editor`'s
74
- * `BeatListEditor` instead of the per-beat list UI (#1575).
75
- * Empty / missing `beats[]` returns false there's nothing to edit
76
- * as a deck, fall through to the existing UI which renders an empty
77
- * state. Mixed scripts (any non-`slide` beat) also return false; that
78
- * case is deferred to a future phase. */
79
- export declare function isAllSlideDeck(script: unknown): boolean;
72
+ /** Whether the beat editor has anything to edit.
73
+ *
74
+ * Any beat type, not just `slide`: `@mulmocast/beat-editor` renders and edits all eight
75
+ * (`textSlide` / `markdown` / `chart` / `mermaid` / `image` / `movie` / `slide` /
76
+ * `html_tailwind`). The all-slide test this replaces was a limit of the OLD iframe deck
77
+ * editor, which only understood decks it stayed in place through the migration and kept a
78
+ * markdown script read-only for no reason.
79
+ *
80
+ * Empty / missing `beats[]` is false: there is nothing to edit, and the per-beat list already
81
+ * renders an empty state. */
82
+ export declare function hasEditableBeats(script: unknown): boolean;
80
83
  /** A single MulmoScript beat as the View consumes it — every field
81
84
  * optional so the empty-beat fallback (`effectiveBeat` on an
82
85
  * out-of-range index) is a valid instance without a cast. */
@@ -142,4 +145,16 @@ export declare function resolveSilentAdvanceSeconds(raw: unknown, defaultSec: nu
142
145
  * reactive proxies mutates them so the template re-renders empty. Replaces a
143
146
  * wall of hand-rolled `Object.keys(map).forEach(delete)` loops. */
144
147
  export declare function clearReactiveRecords(...records: object[]): void;
148
+ /**
149
+ * Whether a `focusout` means focus actually LEFT `container`, rather than moving between two
150
+ * fields inside it.
151
+ *
152
+ * The distinction decides whether pending edits are written: treating every focusout as a
153
+ * departure would write on each hop between inputs, and treating none as one would let the user
154
+ * walk away with the last keystroke unsaved.
155
+ *
156
+ * `null` is focus going nowhere the document can name — clicking the page chrome, or the window
157
+ * losing focus. That counts as leaving: the editor is no longer where the typing goes.
158
+ */
159
+ export declare function focusLeftContainer(container: Node | null, movedTo: EventTarget | null): boolean;
145
160
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/vue/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/vue/helpers.ts"],"names":[],"mappings":"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"}
package/dist/vue.cjs CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_plugin = require("./plugin-BLp8tSYt.cjs");
5
+ const require_plugin = require("./plugin-BOq5YkTl.cjs");
6
6
  const require_contract = require("./contract-BhN3yKJC.cjs");
7
7
  let _mulmocast_types = require("@mulmocast/types");
8
8
  let vue = require("vue");
@@ -119,22 +119,20 @@ function beatMayHaveMovie(beat) {
119
119
  function isBeatImageReference(beat) {
120
120
  return beat.image?.type === "beat";
121
121
  }
122
- /** Pure check: is every beat in the script a `slide`-typed beat?
123
- * When true, the View mounts `@mulmocast/beat-editor`'s
124
- * `BeatListEditor` instead of the per-beat list UI (#1575).
125
- * Empty / missing `beats[]` returns false there's nothing to edit
126
- * as a deck, fall through to the existing UI which renders an empty
127
- * state. Mixed scripts (any non-`slide` beat) also return false; that
128
- * case is deferred to a future phase. */
129
- function isAllSlideDeck(script) {
122
+ /** Whether the beat editor has anything to edit.
123
+ *
124
+ * Any beat type, not just `slide`: `@mulmocast/beat-editor` renders and edits all eight
125
+ * (`textSlide` / `markdown` / `chart` / `mermaid` / `image` / `movie` / `slide` /
126
+ * `html_tailwind`). The all-slide test this replaces was a limit of the OLD iframe deck
127
+ * editor, which only understood decks it stayed in place through the migration and kept a
128
+ * markdown script read-only for no reason.
129
+ *
130
+ * Empty / missing `beats[]` is false: there is nothing to edit, and the per-beat list already
131
+ * renders an empty state. */
132
+ function hasEditableBeats(script) {
130
133
  if (!isRecord(script)) return false;
131
134
  const { beats } = script;
132
- if (!Array.isArray(beats) || beats.length === 0) return false;
133
- return beats.every((beat) => {
134
- if (!isRecord(beat)) return false;
135
- const { image } = beat;
136
- return isRecord(image) && image.type === "slide";
137
- });
135
+ return Array.isArray(beats) && beats.length > 0;
138
136
  }
139
137
  /** Resolve the beat the View should render at `index`: the user's
140
138
  * in-place edit (`overrides`) wins over the on-disk beat, and an
@@ -204,6 +202,22 @@ function clearReactiveRecords(...records) {
204
202
  Object.keys(record).forEach((key) => Reflect.deleteProperty(record, key));
205
203
  });
206
204
  }
205
+ /**
206
+ * Whether a `focusout` means focus actually LEFT `container`, rather than moving between two
207
+ * fields inside it.
208
+ *
209
+ * The distinction decides whether pending edits are written: treating every focusout as a
210
+ * departure would write on each hop between inputs, and treating none as one would let the user
211
+ * walk away with the last keystroke unsaved.
212
+ *
213
+ * `null` is focus going nowhere the document can name — clicking the page chrome, or the window
214
+ * losing focus. That counts as leaving: the editor is no longer where the typing goes.
215
+ */
216
+ function focusLeftContainer(container, movedTo) {
217
+ if (!container) return false;
218
+ if (!(movedTo instanceof Node)) return true;
219
+ return !container.contains(movedTo);
220
+ }
207
221
  //#endregion
208
222
  //#region src/vue/transport.ts
209
223
  var GENERATION_EVENT_KINDS = /* @__PURE__ */ new Set([
@@ -592,7 +606,7 @@ var DECK_SAVE_DEBOUNCE_MS = 300;
592
606
  */
593
607
  var EDITOR_ORIGIN = `deck-editor-${Math.random().toString(36).slice(2)}`;
594
608
  function useDeckEditor({ api, filePath, effectiveScript, commitScript }) {
595
- const isDeck = (0, vue.computed)(() => isAllSlideDeck(effectiveScript.value));
609
+ const canEditBeats = (0, vue.computed)(() => hasEditableBeats(effectiveScript.value));
596
610
  const deckScriptInput = (0, vue.computed)(() => effectiveScript.value);
597
611
  let deckSaveTimer = null;
598
612
  let pendingDeckScript = null;
@@ -642,7 +656,7 @@ function useDeckEditor({ api, filePath, effectiveScript, commitScript }) {
642
656
  });
643
657
  }
644
658
  return {
645
- isDeck,
659
+ canEditBeats,
646
660
  deckScriptInput,
647
661
  onDeckUpdate,
648
662
  flushPendingDeckSave,
@@ -656,6 +670,8 @@ function useDeckEditor({ api, filePath, effectiveScript, commitScript }) {
656
670
  var useT = (0, gui_chat_protocol_vue.createUseT)({
657
671
  de: {
658
672
  beatCount: (count) => count === 1 ? `${count} Beat` : `${count} Beats`,
673
+ editTab: "Bearbeiten",
674
+ mediaTab: "Medien",
659
675
  movie: "Video",
660
676
  generating: "Wird generiert…",
661
677
  rendering: "Wird gerendert…",
@@ -688,6 +704,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
688
704
  },
689
705
  en: {
690
706
  beatCount: (count) => count === 1 ? `${count} beat` : `${count} beats`,
707
+ editTab: "Edit",
708
+ mediaTab: "Media",
691
709
  movie: "Movie",
692
710
  generating: "Generating…",
693
711
  rendering: "Rendering…",
@@ -720,6 +738,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
720
738
  },
721
739
  es: {
722
740
  beatCount: (count) => count === 1 ? `${count} beat` : `${count} beats`,
741
+ editTab: "Editar",
742
+ mediaTab: "Medios",
723
743
  movie: "Vídeo",
724
744
  generating: "Generando…",
725
745
  rendering: "Renderizando…",
@@ -752,6 +772,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
752
772
  },
753
773
  fr: {
754
774
  beatCount: (count) => count === 1 ? `${count} beat` : `${count} beats`,
775
+ editTab: "Éditer",
776
+ mediaTab: "Médias",
755
777
  movie: "Film",
756
778
  generating: "Génération…",
757
779
  rendering: "Rendu…",
@@ -784,6 +806,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
784
806
  },
785
807
  ja: {
786
808
  beatCount: (count) => `${count} ビート`,
809
+ editTab: "編集",
810
+ mediaTab: "メディア",
787
811
  movie: "動画",
788
812
  generating: "生成中…",
789
813
  rendering: "レンダリング中…",
@@ -816,6 +840,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
816
840
  },
817
841
  ko: {
818
842
  beatCount: (count) => `${count}개 비트`,
843
+ editTab: "편집",
844
+ mediaTab: "미디어",
819
845
  movie: "영상",
820
846
  generating: "생성 중…",
821
847
  rendering: "렌더링 중…",
@@ -848,6 +874,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
848
874
  },
849
875
  "pt-BR": {
850
876
  beatCount: (count) => count === 1 ? `${count} beat` : `${count} beats`,
877
+ editTab: "Editar",
878
+ mediaTab: "Mídia",
851
879
  movie: "Vídeo",
852
880
  generating: "Gerando…",
853
881
  rendering: "Renderizando…",
@@ -880,6 +908,8 @@ var useT = (0, gui_chat_protocol_vue.createUseT)({
880
908
  },
881
909
  zh: {
882
910
  beatCount: (count) => `${count} 个 beat`,
911
+ editTab: "编辑",
912
+ mediaTab: "媒体",
883
913
  movie: "视频",
884
914
  generating: "生成中…",
885
915
  rendering: "渲染中…",
@@ -1311,8 +1341,7 @@ var _hoisted_12 = { class: "break-words whitespace-pre-wrap mt-0.5" };
1311
1341
  var _hoisted_13 = ["disabled"];
1312
1342
  var _hoisted_14 = {
1313
1343
  key: 2,
1314
- class: "flex-1 overflow-hidden",
1315
- "data-testid": "mulmo-script-deck-editor"
1344
+ class: "flex shrink-0 gap-1 px-2 pt-1 text-[11px]"
1316
1345
  };
1317
1346
  var _hoisted_15 = { class: "flex gap-3 items-stretch" };
1318
1347
  var _hoisted_16 = [
@@ -1423,6 +1452,7 @@ var _hoisted_53 = ["title"];
1423
1452
  var _hoisted_54 = { class: "material-icons" };
1424
1453
  var SILENT_BEAT_DEFAULT_SEC = 3;
1425
1454
  var MS_PER_SECOND = 1e3;
1455
+ var BEAT_TAB_BASE = "rounded px-2 py-0.5 font-sans";
1426
1456
  var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.defineComponent)({
1427
1457
  __name: "View",
1428
1458
  props: { selectedResult: {} },
@@ -1589,12 +1619,27 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
1589
1619
  }
1590
1620
  });
1591
1621
  }
1592
- const { isDeck, deckScriptInput, onDeckUpdate, flushPendingDeckSave, watchForeignWrites } = useDeckEditor({
1622
+ const { canEditBeats, deckScriptInput, onDeckUpdate, flushPendingDeckSave, watchForeignWrites } = useDeckEditor({
1593
1623
  api,
1594
1624
  filePath,
1595
1625
  effectiveScript,
1596
1626
  commitScript
1597
1627
  });
1628
+ /**
1629
+ * Which pane the beats are shown in.
1630
+ *
1631
+ * `edit` is the beat editor — every beat type, edited in place. `media` is the per-beat list,
1632
+ * which is the only place audio / image / movie generation lives. A script with nothing to edit
1633
+ * has only the list, so the switch is hidden and this is ignored.
1634
+ *
1635
+ * `media` is the default because opening the script is what triggers rendering each beat's
1636
+ * image: the auto-render on mount lives in that list, so defaulting to `edit` silently stopped
1637
+ * thumbnails from being produced at all. Someone who wants to edit clicks once; nobody has to
1638
+ * click to get the previews they always got.
1639
+ */
1640
+ const beatPane = (0, vue.ref)("media");
1641
+ const showBeatEditor = (0, vue.computed)(() => canEditBeats.value && beatPane.value === "edit");
1642
+ const beatPaneTabClass = (active) => [BEAT_TAB_BASE, active ? "bg-gray-700 text-white" : "bg-gray-100 text-gray-600 hover:bg-gray-200"];
1598
1643
  const unsubscribeForeignWrites = watchForeignWrites(() => {
1599
1644
  refreshScriptFromDisk();
1600
1645
  });
@@ -1602,6 +1647,18 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
1602
1647
  function onDeckBeatsUpdate(beats) {
1603
1648
  onDeckUpdate((0, _mulmocast_beat_editor.withBeats)(deckScriptInput.value, beats));
1604
1649
  }
1650
+ /**
1651
+ * Leaving the editor writes whatever is still in the debounce.
1652
+ *
1653
+ * Asking the agent to change the script means moving focus out of here first, so this lands
1654
+ * ahead of every request without the host having to announce one — MulmoTerminal's agent is a
1655
+ * terminal, and there is no "sent" event to hook. The debounce is short enough that it has
1656
+ * usually fired already; this closes the case where it has not, which would otherwise have the
1657
+ * agent read a file missing the last thing the user typed.
1658
+ */
1659
+ function onDeckFocusOut(event) {
1660
+ if (focusLeftContainer(event.currentTarget instanceof Node ? event.currentTarget : null, event.relatedTarget)) flushPendingDeckSave();
1661
+ }
1605
1662
  (0, vue.onBeforeUnmount)(() => {
1606
1663
  flushPendingDeckSave();
1607
1664
  resetBeatMovies();
@@ -2039,7 +2096,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2039
2096
  "onDownloadPdf"
2040
2097
  ])]),
2041
2098
  (0, vue.unref)(movieError) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_9, [
2042
- _cache[3] || (_cache[3] = (0, vue.createElementVNode)("span", { class: "material-icons text-base shrink-0 mt-px" }, "error_outline", -1)),
2099
+ _cache[5] || (_cache[5] = (0, vue.createElementVNode)("span", { class: "material-icons text-base shrink-0 mt-px" }, "error_outline", -1)),
2043
2100
  (0, vue.createElementVNode)("div", _hoisted_10, [(0, vue.createElementVNode)("div", _hoisted_11, (0, vue.toDisplayString)((0, vue.unref)(m).movieGenerationFailed), 1), (0, vue.createElementVNode)("div", _hoisted_12, (0, vue.toDisplayString)((0, vue.unref)(movieError)), 1)]),
2044
2101
  (0, vue.createElementVNode)("button", {
2045
2102
  class: "shrink-0 h-7 px-2 text-xs rounded border border-red-300 text-red-700 hover:bg-red-100 disabled:opacity-50",
@@ -2079,11 +2136,27 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2079
2136
  "onCharDrop",
2080
2137
  "onRenderCharacter"
2081
2138
  ])) : (0, vue.createCommentVNode)("", true),
2082
- (0, vue.unref)(isDeck) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_14, [(0, vue.createVNode)((0, vue.unref)(BeatListEditor), {
2139
+ (0, vue.unref)(canEditBeats) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_14, [(0, vue.createElementVNode)("button", {
2140
+ type: "button",
2141
+ class: (0, vue.normalizeClass)(beatPaneTabClass(beatPane.value === "edit")),
2142
+ "data-testid": "mulmo-script-tab-edit",
2143
+ onClick: _cache[1] || (_cache[1] = ($event) => beatPane.value = "edit")
2144
+ }, (0, vue.toDisplayString)((0, vue.unref)(m).editTab), 3), (0, vue.createElementVNode)("button", {
2145
+ type: "button",
2146
+ class: (0, vue.normalizeClass)(beatPaneTabClass(beatPane.value === "media")),
2147
+ "data-testid": "mulmo-script-tab-media",
2148
+ onClick: _cache[2] || (_cache[2] = ($event) => beatPane.value = "media")
2149
+ }, (0, vue.toDisplayString)((0, vue.unref)(m).mediaTab), 3)])) : (0, vue.createCommentVNode)("", true),
2150
+ showBeatEditor.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
2151
+ key: 3,
2152
+ class: "flex-1 overflow-hidden",
2153
+ "data-testid": "mulmo-script-deck-editor",
2154
+ onFocusout: onDeckFocusOut
2155
+ }, [(0, vue.createVNode)((0, vue.unref)(BeatListEditor), {
2083
2156
  beats: deckBeats.value,
2084
2157
  "onUpdate:beats": onDeckBeatsUpdate
2085
- }, null, 8, ["beats"])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
2086
- key: 3,
2158
+ }, null, 8, ["beats"])], 32)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
2159
+ key: 4,
2087
2160
  ref_key: "beatListEl",
2088
2161
  ref: beatListEl,
2089
2162
  class: "flex-1 overflow-y-auto p-2 space-y-1.5"
@@ -2113,7 +2186,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2113
2186
  "aria-label": (0, vue.unref)(m).close,
2114
2187
  "data-testid": `mulmo-script-beat-movie-close-${index}`,
2115
2188
  onClick: (0, vue.withModifiers)(($event) => (0, vue.unref)(closeBeatMovie)(index), ["stop"])
2116
- }, [..._cache[4] || (_cache[4] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_19)], 64)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [
2189
+ }, [..._cache[6] || (_cache[6] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_19)], 64)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [
2117
2190
  renderedImages[index] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("img", {
2118
2191
  key: 0,
2119
2192
  src: renderedImages[index],
@@ -2128,7 +2201,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2128
2201
  "aria-label": (0, vue.unref)(m).play,
2129
2202
  "data-testid": `mulmo-script-beat-movie-play-${index}`,
2130
2203
  onClick: (0, vue.withModifiers)(($event) => (0, vue.unref)(playBeatMovie)(index), ["stop"])
2131
- }, [(0, vue.unref)(beatMovieLoading)[index] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_22, [..._cache[5] || (_cache[5] = [(0, vue.createElementVNode)("circle", {
2204
+ }, [(0, vue.unref)(beatMovieLoading)[index] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_22, [..._cache[7] || (_cache[7] = [(0, vue.createElementVNode)("circle", {
2132
2205
  class: "opacity-25",
2133
2206
  cx: "12",
2134
2207
  cy: "12",
@@ -2145,7 +2218,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2145
2218
  class: "absolute top-1.5 right-1.5 flex items-center gap-1 px-2 py-0.5 text-xs rounded border border-gray-400 text-gray-600 bg-white hover:bg-gray-50 disabled:opacity-60 disabled:cursor-not-allowed",
2146
2219
  disabled: (0, vue.unref)(movieGenerating),
2147
2220
  onClick: (0, vue.withModifiers)(($event) => regenerateBeat(index), ["stop"])
2148
- }, " ↺ ", 8, _hoisted_24)) : !renderedImages[index] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_25, [renderState[index] === "rendering" || (0, vue.unref)(movieGenerating) && !renderedImages[index] && effectiveBeat$1(index).imagePrompt ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [_cache[6] || (_cache[6] = (0, vue.createElementVNode)("svg", {
2221
+ }, " ↺ ", 8, _hoisted_24)) : !renderedImages[index] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_25, [renderState[index] === "rendering" || (0, vue.unref)(movieGenerating) && !renderedImages[index] && effectiveBeat$1(index).imagePrompt ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [_cache[8] || (_cache[8] = (0, vue.createElementVNode)("svg", {
2149
2222
  class: "animate-spin w-4 h-4 text-green-400",
2150
2223
  viewBox: "0 0 24 24",
2151
2224
  fill: "none"
@@ -2168,7 +2241,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2168
2241
  class: "absolute top-1.5 right-1.5 flex items-center gap-1 px-2 py-0.5 text-xs rounded border border-blue-400 text-blue-600 bg-white hover:bg-blue-50",
2169
2242
  onClick: ($event) => renderBeat(index)
2170
2243
  }, (0, vue.toDisplayString)((0, vue.unref)(m).generate), 9, _hoisted_33)) : (0, vue.createCommentVNode)("", true)
2171
- ], 42, _hoisted_16), (0, vue.createElementVNode)("div", _hoisted_34, [(0, vue.createElementVNode)("span", _hoisted_35, (0, vue.toDisplayString)(effectiveBeat$1(index).text), 1), (0, vue.createElementVNode)("div", _hoisted_36, [(0, vue.createElementVNode)("div", _hoisted_37, [audioState[index] === "generating" || (0, vue.unref)(movieGenerating) && !beatAudios[index] && effectiveBeat$1(index).text ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_38, [..._cache[7] || (_cache[7] = [(0, vue.createElementVNode)("circle", {
2244
+ ], 42, _hoisted_16), (0, vue.createElementVNode)("div", _hoisted_34, [(0, vue.createElementVNode)("span", _hoisted_35, (0, vue.toDisplayString)(effectiveBeat$1(index).text), 1), (0, vue.createElementVNode)("div", _hoisted_36, [(0, vue.createElementVNode)("div", _hoisted_37, [audioState[index] === "generating" || (0, vue.unref)(movieGenerating) && !beatAudios[index] && effectiveBeat$1(index).text ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_38, [..._cache[9] || (_cache[9] = [(0, vue.createElementVNode)("circle", {
2172
2245
  class: "opacity-25",
2173
2246
  cx: "12",
2174
2247
  cy: "12",
@@ -2200,7 +2273,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2200
2273
  title: sourceOpen[index] ? "Hide source" : "Show source",
2201
2274
  "data-testid": `mulmo-script-beat-source-toggle-${index}`,
2202
2275
  onClick: ($event) => toggleSource(index)
2203
- }, [..._cache[8] || (_cache[8] = [(0, vue.createElementVNode)("svg", {
2276
+ }, [..._cache[10] || (_cache[10] = [(0, vue.createElementVNode)("svg", {
2204
2277
  xmlns: "http://www.w3.org/2000/svg",
2205
2278
  class: "w-3.5 h-3.5",
2206
2279
  viewBox: "0 0 24 24",
@@ -2226,11 +2299,11 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2226
2299
  ref_key: "sourceDetails",
2227
2300
  ref: sourceDetails,
2228
2301
  class: "script-source",
2229
- onToggle: _cache[2] || (_cache[2] = ($event) => onSourceToggle($event.target.open))
2302
+ onToggle: _cache[4] || (_cache[4] = ($event) => onSourceToggle($event.target.open))
2230
2303
  }, [
2231
2304
  (0, vue.createElementVNode)("summary", null, (0, vue.toDisplayString)((0, vue.unref)(m).editSource), 1),
2232
2305
  (0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
2233
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => editableSource.value = $event),
2306
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => editableSource.value = $event),
2234
2307
  class: (0, vue.normalizeClass)(["script-editor", { "script-editor-invalid": sourceChanged.value && !sourceValid.value }]),
2235
2308
  spellcheck: "false"
2236
2309
  }, null, 2), [[vue.vModelText, editableSource.value]]),
@@ -2248,7 +2321,7 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2248
2321
  onClick: copyText
2249
2322
  }, [(0, vue.createElementVNode)("span", _hoisted_54, (0, vue.toDisplayString)((0, vue.unref)(copied) ? "check" : "content_copy"), 1)], 8, _hoisted_53), [[vue.vShow, !editing.value]])]),
2250
2323
  lightbox.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(BeatLightbox_default, {
2251
- key: 4,
2324
+ key: 5,
2252
2325
  lightbox: lightbox.value,
2253
2326
  "beat-count": beats.value.length,
2254
2327
  "beat-texts": beatTexts.value,
@@ -2284,7 +2357,7 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
2284
2357
  };
2285
2358
  //#endregion
2286
2359
  //#region src/vue/View.vue
2287
- var View_default = /*#__PURE__*/ _plugin_vue_export_helper_default(View_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-87bf6e4c"]]);
2360
+ var View_default = /*#__PURE__*/ _plugin_vue_export_helper_default(View_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f9957eaf"]]);
2288
2361
  //#endregion
2289
2362
  //#region src/vue/Preview.vue?vue&type=script&setup=true&lang.ts
2290
2363
  var _hoisted_1 = {