react-grab 0.0.71 → 0.0.73

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.
@@ -578,6 +578,61 @@ function mapArray(list, mapFn, options = {}) {
578
578
  }
579
579
  };
580
580
  }
581
+ function indexArray(list, mapFn, options = {}) {
582
+ let items = [], mapped = [], disposers = [], signals = [], len = 0, i2;
583
+ onCleanup(() => dispose(disposers));
584
+ return () => {
585
+ const newItems = list() || [], newLen = newItems.length;
586
+ newItems[$TRACK];
587
+ return untrack(() => {
588
+ if (newLen === 0) {
589
+ if (len !== 0) {
590
+ dispose(disposers);
591
+ disposers = [];
592
+ items = [];
593
+ mapped = [];
594
+ len = 0;
595
+ signals = [];
596
+ }
597
+ if (options.fallback) {
598
+ items = [FALLBACK];
599
+ mapped[0] = createRoot((disposer) => {
600
+ disposers[0] = disposer;
601
+ return options.fallback();
602
+ });
603
+ len = 1;
604
+ }
605
+ return mapped;
606
+ }
607
+ if (items[0] === FALLBACK) {
608
+ disposers[0]();
609
+ disposers = [];
610
+ items = [];
611
+ mapped = [];
612
+ len = 0;
613
+ }
614
+ for (i2 = 0; i2 < newLen; i2++) {
615
+ if (i2 < items.length && items[i2] !== newItems[i2]) {
616
+ signals[i2](() => newItems[i2]);
617
+ } else if (i2 >= items.length) {
618
+ mapped[i2] = createRoot(mapper);
619
+ }
620
+ }
621
+ for (; i2 < items.length; i2++) {
622
+ disposers[i2]();
623
+ }
624
+ len = signals.length = disposers.length = newLen;
625
+ items = newItems.slice(0);
626
+ return mapped = mapped.slice(0, len);
627
+ });
628
+ function mapper(disposer) {
629
+ disposers[i2] = disposer;
630
+ const [s3, set] = createSignal(newItems[i2]);
631
+ signals[i2] = set;
632
+ return mapFn(s3, i2);
633
+ }
634
+ };
635
+ }
581
636
  function createComponent(Comp, props) {
582
637
  return untrack(() => Comp(props || {}));
583
638
  }
@@ -588,6 +643,12 @@ function For(props) {
588
643
  };
589
644
  return createMemo(mapArray(() => props.each, props.children, fallback || void 0));
590
645
  }
646
+ function Index(props) {
647
+ const fallback = "fallback" in props && {
648
+ fallback: () => props.fallback
649
+ };
650
+ return createMemo(indexArray(() => props.each, props.children, fallback || void 0));
651
+ }
591
652
  function Show(props) {
592
653
  const keyed = props.keyed;
593
654
  const conditionValue = createMemo(() => props.when, void 0, void 0);
@@ -890,7 +951,7 @@ function cleanChildren(parent, current, marker, replacement) {
890
951
 
891
952
  // dist/styles.css
892
953
  var styles_default = `/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
893
- @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-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--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-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-ease:initial;--tw-contain-size:initial;--tw-contain-layout:initial;--tw-contain-paint:initial;--tw-contain-style:initial}}}@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;--font-weight-medium:500;--radius-xs:.125rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--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-grab-pink:#b21c8e;--color-grab-purple:#d239c0;--color-label-tag-border:#730079;--color-label-muted:#767676}}@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%;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;-webkit-text-decoration: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]){appearance:button}::file-selector-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-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.top-0{top:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-2147483645{z-index:2147483645}.z-2147483646{z-index:2147483646}.z-2147483647{z-index:2147483647}.z-\\[2147483645\\]{z-index:2147483645}.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}}.m-0{margin:calc(var(--spacing)*0)}.-ml-\\[2px\\]{margin-left:-2px}.ml-1{margin-left:calc(var(--spacing)*1)}.box-border{box-sizing:border-box}.flex{display:flex}.grid{display:grid}.hidden{display:none}.size-fit{width:fit-content;height:fit-content}.h-0{height:calc(var(--spacing)*0)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-5\\.5{height:calc(var(--spacing)*5.5)}.h-\\[7px\\]{height:7px}.h-\\[9px\\]{height:9px}.h-\\[17px\\]{height:17px}.h-\\[18px\\]{height:18px}.h-fit{height:fit-content}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-4{min-height:calc(var(--spacing)*4)}.w-0{width:calc(var(--spacing)*0)}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-1{width:calc(var(--spacing)*1)}.w-2\\.5{width:calc(var(--spacing)*2.5)}.w-\\[7px\\]{width:7px}.w-\\[17px\\]{width:17px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\\[280px\\]{max-width:280px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-crosshair{cursor:crosshair}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.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-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-\\[3px\\]{gap:3px}.gap-\\[5px\\]{gap:5px}.gap-px{gap:1px}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\\[1\\.5px\\]{border-radius:1.5px}.rounded-\\[1px\\]{border-radius:1px}.rounded-full{border-radius:3.40282e38px}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-b-xs{border-bottom-right-radius:var(--radius-xs);border-bottom-left-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.\\[border-width\\:0\\.5px\\]{border-width:.5px}.\\[border-top-width\\:0\\.5px\\]{border-top-width:.5px}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\\[\\#B3B3B3\\]{border-color:#b3b3b3}.border-grab-purple{border-color:var(--color-grab-purple)}.border-grab-purple\\/40{border-color:#d239c066}@supports (color:color-mix(in lab, red, red)){.border-grab-purple\\/40{border-color:color-mix(in oklab,var(--color-grab-purple)40%,transparent)}}.border-grab-purple\\/50{border-color:#d239c080}@supports (color:color-mix(in lab, red, red)){.border-grab-purple\\/50{border-color:color-mix(in oklab,var(--color-grab-purple)50%,transparent)}}.border-label-tag-border{border-color:var(--color-label-tag-border)}.border-white{border-color:var(--color-white)}.border-t-\\[\\#D9D9D9\\]{border-top-color:#d9d9d9}.bg-\\[\\#F7F7F7\\]{background-color:#f7f7f7}.bg-black{background-color:var(--color-black)}.bg-grab-pink{background-color:var(--color-grab-pink)}.bg-grab-purple{background-color:var(--color-grab-purple)}.bg-grab-purple\\/5{background-color:#d239c00d}@supports (color:color-mix(in lab, red, red)){.bg-grab-purple\\/5{background-color:color-mix(in oklab,var(--color-grab-purple)5%,transparent)}}.bg-grab-purple\\/8{background-color:#d239c014}@supports (color:color-mix(in lab, red, red)){.bg-grab-purple\\/8{background-color:color-mix(in oklab,var(--color-grab-purple)8%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-cover{background-size:cover}.bg-center{background-position:50%}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-\\[2px\\]{padding-inline:2px}.px-\\[3px\\]{padding-inline:3px}.py-0{padding-block:calc(var(--spacing)*0)}.py-1{padding-block:calc(var(--spacing)*1)}.py-\\[2px\\]{padding-block:2px}.py-\\[3px\\]{padding-block:3px}.py-\\[5px\\]{padding-block:5px}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing)*1)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pl-1\\.5{padding-left:calc(var(--spacing)*1.5)}.align-middle{vertical-align:middle}.font-\\[ui-monospace\\,\\'SFMono-Regular\\'\\,\\'SF_Mono\\'\\,\\'Menlo\\'\\,\\'Consolas\\'\\,\\'Liberation_Mono\\'\\,monospace\\]{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-\\[11\\.5px\\]{font-size:11.5px}.text-\\[12px\\]{font-size:12px}.leading-3\\.5{--tw-leading:calc(var(--spacing)*3.5);line-height:calc(var(--spacing)*3.5)}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-\\[-0\\.04em\\]{--tw-tracking:-.04em;letter-spacing:-.04em}.tracking-\\[-0\\.08em\\]{--tw-tracking:-.08em;letter-spacing:-.08em}.wrap-break-word{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.text-\\[\\#0C0C0C\\]{color:#0c0c0c}.text-\\[\\#47004A\\]{color:#47004a}.text-black{color:var(--color-black)}.text-label-muted{color:var(--color-label-muted)}.text-label-tag-border{color:var(--color-label-tag-border)}.text-white{color:var(--color-white)}.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,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.opacity-\\[0\\.99\\]{opacity:.99}.brightness-125{--tw-brightness:brightness(125%);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,)}.filter-\\[drop-shadow\\(0px_0px_4px_\\#51515180\\)\\]{filter:drop-shadow(0 0 4px #51515180)}.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-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\,height\\]{transition-property:width,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;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-none{transition-property:none}.duration-30{--tw-duration:30ms;transition-duration:30ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-\\[transform\\,width\\,height\\]{will-change:transform,width,height}.contain-layout{--tw-contain-layout:layout;contain:var(--tw-contain-size,)var(--tw-contain-layout,)var(--tw-contain-paint,)var(--tw-contain-style,)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[font-synthesis\\:none\\]{font-synthesis:none}@media (hover:hover){.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\\:opacity-100:hover{opacity:1}}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes flash{0%{opacity:1;background-color:#d239c040;border-color:#d239c0}50%{opacity:1;background-color:#d239c073;border-color:#e650d2}to{opacity:1;background-color:#d239c014;border-color:#d239c080}}.react-grab-flash{animation:.4s ease-out forwards flash}.react-grab-shimmer{position:relative;overflow:hidden}.react-grab-shimmer:after{content:"";border-radius:inherit;pointer-events:none;background:linear-gradient(90deg,#0000 0%,#fff6 50%,#0000 100%) 0 0/200% 100%;animation:1.5s ease-in-out infinite shimmer;position:absolute;inset:0}@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-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}@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-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-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-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-ease{syntax:"*";inherits:false}@property --tw-contain-size{syntax:"*";inherits:false}@property --tw-contain-layout{syntax:"*";inherits:false}@property --tw-contain-paint{syntax:"*";inherits:false}@property --tw-contain-style{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}`;
954
+ @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-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--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-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-ease:initial;--tw-contain-size:initial;--tw-contain-layout:initial;--tw-contain-paint:initial;--tw-contain-style:initial}}}@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;--font-weight-medium:500;--radius-xs:.125rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--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-grab-pink:#b21c8e;--color-grab-purple:#d239c0;--color-label-tag-border:#730079;--color-label-muted:#767676}}@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%;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;-webkit-text-decoration: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]){appearance:button}::file-selector-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-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.top-0{top:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-2147483645{z-index:2147483645}.z-2147483646{z-index:2147483646}.z-2147483647{z-index:2147483647}.z-\\[2147483645\\]{z-index:2147483645}.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}}.m-0{margin:calc(var(--spacing)*0)}.-mt-px{margin-top:-1px}.-ml-\\[2px\\]{margin-left:-2px}.ml-1{margin-left:calc(var(--spacing)*1)}.box-border{box-sizing:border-box}.flex{display:flex}.grid{display:grid}.hidden{display:none}.size-fit{width:fit-content;height:fit-content}.h-0{height:calc(var(--spacing)*0)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-5\\.5{height:calc(var(--spacing)*5.5)}.h-\\[7px\\]{height:7px}.h-\\[17px\\]{height:17px}.h-\\[18px\\]{height:18px}.h-fit{height:fit-content}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-4{min-height:calc(var(--spacing)*4)}.w-0{width:calc(var(--spacing)*0)}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-1{width:calc(var(--spacing)*1)}.w-\\[7px\\]{width:7px}.w-\\[17px\\]{width:17px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\\[280px\\]{max-width:280px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-crosshair{cursor:crosshair}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.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-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-\\[3px\\]{gap:3px}.gap-\\[5px\\]{gap:5px}.gap-px{gap:1px}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\\[1\\.5px\\]{border-radius:1.5px}.rounded-\\[1px\\]{border-radius:1px}.rounded-full{border-radius:3.40282e38px}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-b-xs{border-bottom-right-radius:var(--radius-xs);border-bottom-left-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.\\[border-width\\:0\\.5px\\]{border-width:.5px}.\\[border-top-width\\:0\\.5px\\]{border-top-width:.5px}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\\[\\#7e0002\\]{border-color:#7e0002}.border-\\[\\#B3B3B3\\]{border-color:#b3b3b3}.border-grab-purple{border-color:var(--color-grab-purple)}.border-grab-purple\\/40{border-color:#d239c066}@supports (color:color-mix(in lab, red, red)){.border-grab-purple\\/40{border-color:color-mix(in oklab,var(--color-grab-purple)40%,transparent)}}.border-grab-purple\\/50{border-color:#d239c080}@supports (color:color-mix(in lab, red, red)){.border-grab-purple\\/50{border-color:color-mix(in oklab,var(--color-grab-purple)50%,transparent)}}.border-label-tag-border{border-color:var(--color-label-tag-border)}.border-white{border-color:var(--color-white)}.border-t-\\[\\#D9D9D9\\]{border-top-color:#d9d9d9}.bg-\\[\\#F7F7F7\\]{background-color:#f7f7f7}.bg-black{background-color:var(--color-black)}.bg-grab-pink{background-color:var(--color-grab-pink)}.bg-grab-purple{background-color:var(--color-grab-purple)}.bg-grab-purple\\/5{background-color:#d239c00d}@supports (color:color-mix(in lab, red, red)){.bg-grab-purple\\/5{background-color:color-mix(in oklab,var(--color-grab-purple)5%,transparent)}}.bg-grab-purple\\/8{background-color:#d239c014}@supports (color:color-mix(in lab, red, red)){.bg-grab-purple\\/8{background-color:color-mix(in oklab,var(--color-grab-purple)8%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-\\[2px\\]{padding-inline:2px}.px-\\[3px\\]{padding-inline:3px}.py-0{padding-block:calc(var(--spacing)*0)}.py-\\[2px\\]{padding-block:2px}.py-\\[3px\\]{padding-block:3px}.py-\\[5px\\]{padding-block:5px}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\\.5{padding-top:calc(var(--spacing)*1.5)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pl-1\\.5{padding-left:calc(var(--spacing)*1.5)}.align-middle{vertical-align:middle}.font-\\[ui-monospace\\,\\'SFMono-Regular\\'\\,\\'SF_Mono\\'\\,\\'Menlo\\'\\,\\'Consolas\\'\\,\\'Liberation_Mono\\'\\,monospace\\]{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-\\[11\\.5px\\]{font-size:11.5px}.text-\\[11px\\]{font-size:11px}.text-\\[12px\\]{font-size:12px}.leading-3\\.5{--tw-leading:calc(var(--spacing)*3.5);line-height:calc(var(--spacing)*3.5)}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-\\[-0\\.04em\\]{--tw-tracking:-.04em;letter-spacing:-.04em}.tracking-\\[-0\\.08em\\]{--tw-tracking:-.08em;letter-spacing:-.08em}.wrap-break-word{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.text-\\[\\#0C0C0C\\]{color:#0c0c0c}.text-\\[\\#47004A\\]{color:#47004a}.text-\\[\\#71717a\\]{color:#71717a}.text-\\[\\#B91C1C\\]{color:#b91c1c}.text-\\[\\#c00002\\]{color:#c00002}.text-black{color:var(--color-black)}.text-label-muted{color:var(--color-label-muted)}.text-label-tag-border{color:var(--color-label-tag-border)}.text-white{color:var(--color-white)}.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,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.opacity-\\[0\\.99\\]{opacity:.99}.brightness-125{--tw-brightness:brightness(125%);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,)}.filter-\\[drop-shadow\\(0px_0px_4px_\\#51515180\\)\\]{filter:drop-shadow(0 0 4px #51515180)}.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-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\,height\\]{transition-property:width,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;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-none{transition-property:none}.duration-30{--tw-duration:30ms;transition-duration:30ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-\\[transform\\,width\\,height\\]{will-change:transform,width,height}.contain-layout{--tw-contain-layout:layout;contain:var(--tw-contain-size,)var(--tw-contain-layout,)var(--tw-contain-paint,)var(--tw-contain-style,)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[font-synthesis\\:none\\]{font-synthesis:none}@media (hover:hover){.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-\\[\\#F5F5F5\\]:hover{background-color:#f5f5f5}.hover\\:bg-\\[\\#FEF2F2\\]:hover{background-color:#fef2f2}.hover\\:opacity-100:hover{opacity:1}}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@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-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}@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-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-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-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-ease{syntax:"*";inherits:false}@property --tw-contain-size{syntax:"*";inherits:false}@property --tw-contain-layout{syntax:"*";inherits:false}@property --tw-contain-paint{syntax:"*";inherits:false}@property --tw-contain-style{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}`;
894
955
 
895
956
  // src/utils/is-keyboard-event-triggered-by-input.ts
896
957
  var FORM_TAGS_AND_ROLES = [
@@ -1019,7 +1080,7 @@ var buildOpenFileUrl = (filePath, lineNumber) => {
1019
1080
  };
1020
1081
 
1021
1082
  // src/constants.ts
1022
- var VERSION = "0.0.71";
1083
+ var VERSION = "0.0.73";
1023
1084
  var VIEWPORT_MARGIN_PX = 8;
1024
1085
  var OFFSCREEN_POSITION = -1e3;
1025
1086
  var SELECTION_LERP_FACTOR = 0.95;
@@ -1027,6 +1088,7 @@ var SUCCESS_LABEL_DURATION_MS = 1700;
1027
1088
  var COPIED_LABEL_DURATION_MS = 1500;
1028
1089
  var SELECTION_CURSOR_SETTLE_DELAY_MS = 500;
1029
1090
  var BLUR_DEACTIVATION_THRESHOLD_MS = 500;
1091
+ var INPUT_FOCUS_ACTIVATION_DELAY_MS = 150;
1030
1092
  var DRAG_THRESHOLD_PX = 2;
1031
1093
  var ELEMENT_DETECTION_THROTTLE_MS = 32;
1032
1094
  var BOUNDS_RECALC_INTERVAL_MS = 100;
@@ -3601,7 +3663,7 @@ var SelectionBox = (props) => {
3601
3663
  get children() {
3602
3664
  var _el$ = _tmpl$();
3603
3665
  createRenderEffect((_p$) => {
3604
- var _v$ = cn("fixed box-border", props.variant === "drag" && "pointer-events-none", props.variant !== "drag" && "pointer-events-auto", props.variant === "grabbed" && "z-2147483645", props.variant !== "grabbed" && "z-2147483646", props.variant === "drag" && "border border-solid border-grab-purple/40 bg-grab-purple/5 will-change-[transform,width,height] cursor-crosshair", props.variant === "selection" && "border border-solid border-grab-purple/50 bg-grab-purple/8 transition-opacity duration-100 ease-out", props.variant === "grabbed" && "border border-solid react-grab-flash", props.variant === "processing" && !props.isCompleted && "border border-solid border-grab-purple/50 bg-grab-purple/8", props.variant === "processing" && props.isCompleted && "border border-solid react-grab-flash"), _v$2 = `${currentY()}px`, _v$3 = `${currentX()}px`, _v$4 = `${currentWidth()}px`, _v$5 = `${currentHeight()}px`, _v$6 = props.bounds.borderRadius, _v$7 = props.bounds.transform, _v$8 = props.isFading ? 0 : opacity(), _v$9 = props.variant === "drag" ? "layout paint size" : void 0;
3666
+ var _v$ = cn("fixed box-border", props.variant === "drag" && "pointer-events-none", props.variant !== "drag" && "pointer-events-auto", props.variant === "grabbed" && "z-2147483645", props.variant !== "grabbed" && "z-2147483646", props.variant === "drag" && "border border-solid border-grab-purple/40 bg-grab-purple/5 will-change-[transform,width,height] cursor-crosshair", props.variant === "selection" && "border border-solid border-grab-purple/50 bg-grab-purple/8 transition-opacity duration-100 ease-out", props.variant === "grabbed" && "border border-solid border-grab-purple/50 bg-grab-purple/8", props.variant === "processing" && !props.isCompleted && "border border-solid border-grab-purple/50 bg-grab-purple/8", props.variant === "processing" && props.isCompleted && "border border-solid border-grab-purple/50 bg-grab-purple/8"), _v$2 = `${currentY()}px`, _v$3 = `${currentX()}px`, _v$4 = `${currentWidth()}px`, _v$5 = `${currentHeight()}px`, _v$6 = props.bounds.borderRadius, _v$7 = props.bounds.transform, _v$8 = props.isFading ? 0 : opacity(), _v$9 = props.variant === "drag" ? "layout paint size" : void 0;
3605
3667
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
3606
3668
  _v$2 !== _p$.t && setStyleProperty(_el$, "top", _p$.t = _v$2);
3607
3669
  _v$3 !== _p$.a && setStyleProperty(_el$, "left", _p$.a = _v$3);
@@ -3763,7 +3825,7 @@ var useSpeechRecognition = (options) => {
3763
3825
  let baseValue;
3764
3826
  if (lastInterimText && currentValue.endsWith(lastInterimText)) {
3765
3827
  baseValue = currentValue.slice(0, -lastInterimText.length);
3766
- } else if (currentValue === lastValueWeSet) {
3828
+ } else if (currentValue === lastValueWeSet && lastInterimText) {
3767
3829
  baseValue = currentValue.slice(0, -lastInterimText.length);
3768
3830
  } else {
3769
3831
  baseValue = currentValue;
@@ -3860,25 +3922,51 @@ var IconMic = (props) => {
3860
3922
  })();
3861
3923
  };
3862
3924
 
3925
+ // src/components/icon-return.tsx
3926
+ var _tmpl$5 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 22 19"fill=none><path d="M6.76263 18.6626C7.48251 18.6626 7.95474 18.1682 7.95474 17.4895C7.95474 17.1207 7.80474 16.8576 7.58683 16.6361L5.3018 14.4137L2.84621 12.3589L2.44374 13.0037L5.92137 13.1622H17.9232C20.4842 13.1622 21.593 12.021 21.593 9.47237V3.66983C21.593 1.10875 20.4842 0 17.9232 0H12.5414C11.8179 0 11.3018 0.545895 11.3018 1.21695C11.3018 1.888 11.8179 2.43389 12.5414 2.43389H17.8424C18.7937 2.43389 19.1897 2.83653 19.1897 3.78784V9.35747C19.1897 10.3257 18.7937 10.7314 17.8424 10.7314H5.92137L2.44374 10.8832L2.84621 11.5281L5.3018 9.47993L7.58683 7.2606C7.80474 7.03914 7.95474 6.7693 7.95474 6.40049C7.95474 5.72854 7.48251 5.22747 6.76263 5.22747C6.46129 5.22747 6.12975 5.36905 5.89231 5.6096L0.376815 11.0425C0.134921 11.2777 0 11.6141 0 11.9452C0 12.2728 0.134921 12.6158 0.376815 12.848L5.89231 18.2871C6.12975 18.5276 6.46129 18.6626 6.76263 18.6626Z"fill=currentColor>`);
3927
+ var IconReturn = (props) => {
3928
+ const size = () => props.size ?? 12;
3929
+ return (() => {
3930
+ var _el$ = _tmpl$5();
3931
+ createRenderEffect((_p$) => {
3932
+ var _v$ = size(), _v$2 = size() * 19 / 22, _v$3 = props.class;
3933
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
3934
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
3935
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
3936
+ return _p$;
3937
+ }, {
3938
+ e: void 0,
3939
+ t: void 0,
3940
+ a: void 0
3941
+ });
3942
+ return _el$;
3943
+ })();
3944
+ };
3945
+
3863
3946
  // src/components/selection-label.tsx
3864
- var _tmpl$5 = /* @__PURE__ */ template(`<div style="background-image:linear-gradient(in oklab 180deg, oklab(88.7% 0.086 -0.058) 0%, oklab(83.2% 0.132 -0.089) 100%)"><span>`);
3947
+ var _tmpl$6 = /* @__PURE__ */ template(`<div style="background-image:linear-gradient(in oklab 180deg, oklab(88.7% 0.086 -0.058) 0%, oklab(83.2% 0.132 -0.089) 100%)"><span>`);
3865
3948
  var _tmpl$22 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center w-fit h-4 rounded-[1px] gap-1 px-[3px] [border-width:0.5px] border-solid border-[#B3B3B3] py-0 bg-[#F7F7F7]"><span class="text-[#0C0C0C] text-[11.5px] leading-3.5 shrink-0 tracking-[-0.08em] font-[ui-monospace,'SFMono-Regular','SF_Mono','Menlo','Consolas','Liberation_Mono',monospace] w-fit h-fit">`);
3866
3949
  var _tmpl$32 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center w-fit h-4 rounded-[1px] gap-1 px-[3px] [border-width:0.5px] border-solid border-white py-0"><span class="text-[#0C0C0C] text-[11.5px] leading-3.5 shrink-0 tracking-[-0.08em] font-[ui-monospace,'SFMono-Regular','SF_Mono','Menlo','Consolas','Liberation_Mono',monospace] w-fit h-fit">&gt;`);
3867
3950
  var _tmpl$42 = /* @__PURE__ */ template(`<div class="absolute w-0 h-0"style="border-left:8px solid transparent;border-right:8px solid transparent">`);
3868
3951
  var _tmpl$52 = /* @__PURE__ */ template(`<div role=button><div class="text-black text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">`);
3869
- var _tmpl$6 = /* @__PURE__ */ template(`<div class="[font-synthesis:none] contain-layout shrink-0 flex flex-col items-start px-2 py-[5px] w-auto h-fit self-stretch [border-top-width:0.5px] border-t-solid border-t-[#D9D9D9] antialiased rounded-t-none rounded-b-xs"style="background-image:linear-gradient(in oklab 180deg, oklab(100% 0 0) 0%, oklab(96.1% 0 0) 5.92%)">`);
3870
- var _tmpl$7 = /* @__PURE__ */ template(`<div class="[font-synthesis:none] contain-layout shrink-0 flex items-center gap-1 rounded-xs bg-white antialiased w-fit h-fit py-1 px-1.5"><div class="contain-layout shrink-0 flex items-center px-0 py-px w-fit h-[18px] rounded-[1.5px] gap-[3px]"><div class="text-black text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">`);
3871
- var _tmpl$8 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events class="contain-layout shrink-0 flex flex-col items-start rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] p-1 size-fit cursor-pointer ml-1 transition-none hover:scale-105"><div data-react-grab-ignore-events class="shrink-0 w-[7px] h-[7px] rounded-[1px] bg-black pointer-events-none">`);
3872
- var _tmpl$9 = /* @__PURE__ */ template(`<div class="shrink-0 flex justify-between items-end w-full min-h-4"><textarea class="text-black text-[12px] leading-4 tracking-[-0.04em] font-medium bg-transparent border-none outline-none resize-none flex-1 p-0 m-0 opacity-50 wrap-break-word overflow-y-auto"placeholder="type to edit"rows=1 disabled style=field-sizing:content;min-height:16px;max-height:95px;scrollbar-width:none>`);
3873
- var _tmpl$0 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start gap-1 w-fit h-fit max-w-[280px]"><div class="contain-layout shrink-0 flex items-center gap-1 pt-1 px-1.5 w-auto h-fit"><div class="contain-layout flex items-center px-0 py-px w-auto h-fit rounded-[1.5px] gap-[3px]"><div class="text-black text-[12px] leading-4 tracking-[-0.04em] font-sans font-medium w-auto h-fit whitespace-normal react-grab-shimmer">`);
3874
- var _tmpl$1 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-px w-fit h-fit">`);
3875
- var _tmpl$10 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-1 w-fit h-fit"><span class="text-label-muted text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">Press</span><div class="contain-layout shrink-0 flex flex-col items-start px-[3px] py-[3px] rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] size-fit"><div class="w-2.5 h-[9px] shrink-0 opacity-[0.99] bg-cover bg-center"style=background-image:url(https://workers.paper.design/file-assets/01K8D51Q7E2ESJTN18XN2MT96X/01KBEJ7N5GQ0ZZ7K456R42AP4V.svg)></div></div><span class="text-label-muted text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">to edit`);
3876
- var _tmpl$11 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start gap-1 w-fit h-fit"><div></div><div class="grid transition-[grid-template-rows] duration-30 ease-out"><div>`);
3877
- var _tmpl$12 = /* @__PURE__ */ template(`<button>`);
3878
- var _tmpl$13 = /* @__PURE__ */ template(`<button class="contain-layout shrink-0 flex flex-col items-start px-[3px] py-[3px] rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] size-fit cursor-pointer transition-all hover:scale-105"><div class="w-2.5 h-[9px] shrink-0 bg-cover bg-center opacity-[0.99]"style=background-image:url(https://workers.paper.design/file-assets/01K8D51Q7E2ESJTN18XN2MT96X/01KBEJ7N5GQ0ZZ7K456R42AP4V.svg)>`);
3879
- var _tmpl$14 = /* @__PURE__ */ template(`<div class="shrink-0 flex justify-between items-end w-full min-h-4"><textarea class="text-black text-[12px] leading-4 tracking-[-0.04em] font-medium bg-transparent border-none outline-none resize-none flex-1 p-0 m-0 wrap-break-word overflow-y-auto"rows=1 style=field-sizing:content;min-height:16px;max-height:95px;scrollbar-width:none></textarea><div class="flex items-center gap-0.5 ml-1 w-[17px] h-[17px] justify-end">`);
3880
- var _tmpl$15 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start gap-1 w-fit h-fit max-w-[280px]"><div>`);
3881
- var _tmpl$16 = /* @__PURE__ */ template(`<div data-react-grab-ignore-events class="fixed font-sans antialiased transition-opacity duration-300 ease-out filter-[drop-shadow(0px_0px_4px_#51515180)] select-none"style=z-index:2147483647><div class="[font-synthesis:none] contain-layout flex items-center gap-[5px] rounded-xs bg-white antialiased w-fit h-fit p-0">`);
3952
+ var _tmpl$62 = /* @__PURE__ */ template(`<div class="[font-synthesis:none] contain-layout shrink-0 flex flex-col items-start px-2 py-[5px] w-auto h-fit self-stretch [border-top-width:0.5px] border-t-solid border-t-[#D9D9D9] antialiased rounded-t-none rounded-b-xs -mt-px"style="background-image:linear-gradient(in oklab 180deg, oklab(100% 0 0) 0%, oklab(96.1% 0 0) 5.92%)">`);
3953
+ var _tmpl$7 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center justify-end gap-[5px] w-full h-fit"><button class="contain-layout shrink-0 flex items-center justify-center px-[3px] py-px rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] cursor-pointer transition-all hover:bg-[#F5F5F5] h-[17px]"><span class="text-black text-[11px] leading-3.5 tracking-[-0.04em] font-sans font-medium">No</span></button><button class="contain-layout shrink-0 flex items-center justify-center gap-1 px-[3px] py-px rounded-xs bg-white [border-width:0.5px] border-solid border-[#7e0002] cursor-pointer transition-all hover:bg-[#FEF2F2] h-[17px]"><span class="text-[#B91C1C] text-[11px] leading-3.5 tracking-[-0.04em] font-sans font-medium">Yes`);
3954
+ var _tmpl$8 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-end gap-1 w-fit h-fit"><div class="contain-layout shrink-0 flex items-center gap-1 pt-1 px-1.5 w-full h-fit"><span class="text-black text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">Discard prompt?`);
3955
+ var _tmpl$9 = /* @__PURE__ */ template(`<button class="contain-layout shrink-0 flex items-center justify-center px-[3px] py-px rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] cursor-pointer transition-all hover:bg-[#F5F5F5] h-[17px]"><span class="text-black text-[11px] leading-3.5 tracking-[-0.04em] font-sans font-medium">Undo`);
3956
+ var _tmpl$0 = /* @__PURE__ */ template(`<button class="contain-layout shrink-0 flex items-center justify-center px-[3px] py-px rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] cursor-pointer transition-all hover:bg-[#F5F5F5] h-[17px]"><span class="text-black text-[11px] leading-3.5 tracking-[-0.04em] font-sans font-medium">Ok`);
3957
+ var _tmpl$1 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center justify-end gap-[5px] w-full h-fit">`);
3958
+ var _tmpl$10 = /* @__PURE__ */ template(`<div class="[font-synthesis:none] contain-layout shrink-0 flex flex-col justify-center items-end rounded-xs bg-white antialiased w-fit h-fit"><div class="contain-layout shrink-0 flex items-center gap-1 pt-1.5 pb-1 px-1.5 w-full h-fit"><span class="text-black text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit tabular-nums">`);
3959
+ var _tmpl$11 = /* @__PURE__ */ template(`<button data-react-grab-ignore-events class="contain-layout shrink-0 flex flex-col items-start rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] p-1 size-fit cursor-pointer ml-1 transition-none hover:scale-105"><div data-react-grab-ignore-events class="shrink-0 w-[7px] h-[7px] rounded-[1px] bg-black pointer-events-none">`);
3960
+ var _tmpl$12 = /* @__PURE__ */ template(`<div class="shrink-0 flex justify-between items-end w-full min-h-4"><textarea data-react-grab-ignore-events class="text-black text-[12px] leading-4 tracking-[-0.04em] font-medium bg-transparent border-none outline-none resize-none flex-1 p-0 m-0 opacity-50 wrap-break-word overflow-y-auto"placeholder="type to edit"rows=1 disabled style=field-sizing:content;min-height:16px;max-height:95px;scrollbar-width:none>`);
3961
+ var _tmpl$13 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start gap-1 w-fit h-fit max-w-[280px]"><div class="contain-layout shrink-0 flex items-center gap-1 pt-1 px-1.5 w-auto h-fit"><div class="contain-layout flex items-center px-0 py-px w-auto h-fit rounded-[1.5px] gap-[3px]"><span class="text-[12px] leading-4 tracking-[-0.04em] font-sans font-medium w-auto h-fit whitespace-normal text-[#71717a] animate-pulse tabular-nums">`);
3962
+ var _tmpl$14 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-px w-fit h-fit">`);
3963
+ var _tmpl$15 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-1 w-fit h-fit"><span class="text-label-muted text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">Press</span><div class="contain-layout shrink-0 flex flex-col items-start px-[3px] py-[3px] rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] size-fit"></div><span class="text-label-muted text-[12px] leading-4 shrink-0 tracking-[-0.04em] font-sans font-medium w-fit h-fit">to edit`);
3964
+ var _tmpl$16 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start gap-1 w-fit h-fit"><div></div><div class="grid transition-[grid-template-rows] duration-30 ease-out self-stretch"><div>`);
3965
+ var _tmpl$17 = /* @__PURE__ */ template(`<button>`);
3966
+ var _tmpl$18 = /* @__PURE__ */ template(`<button class="contain-layout shrink-0 flex flex-col items-start px-[3px] py-[3px] rounded-xs bg-white [border-width:0.5px] border-solid border-[#B3B3B3] size-fit cursor-pointer transition-all hover:scale-105">`);
3967
+ var _tmpl$19 = /* @__PURE__ */ template(`<div class="shrink-0 flex justify-between items-end w-full min-h-4"><textarea data-react-grab-ignore-events class="text-black text-[12px] leading-4 tracking-[-0.04em] font-medium bg-transparent border-none outline-none resize-none flex-1 p-0 m-0 wrap-break-word overflow-y-auto"rows=1 style=field-sizing:content;min-height:16px;max-height:95px;scrollbar-width:none></textarea><div class="flex items-center gap-0.5 ml-1 w-[17px] h-[17px] justify-end">`);
3968
+ var _tmpl$20 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex flex-col justify-center items-start gap-1 w-fit h-fit max-w-[280px]"><div>`);
3969
+ var _tmpl$21 = /* @__PURE__ */ template(`<div data-react-grab-ignore-events class="fixed font-sans antialiased transition-opacity duration-300 ease-out filter-[drop-shadow(0px_0px_4px_#51515180)] select-none"style=z-index:2147483647><div class="[font-synthesis:none] contain-layout flex items-center gap-[5px] rounded-xs bg-white antialiased w-fit h-fit p-0">`);
3882
3970
  var ARROW_HEIGHT = 8;
3883
3971
  var LABEL_GAP = 4;
3884
3972
  var IDLE_TIMEOUT_MS = 400;
@@ -3893,7 +3981,7 @@ var TagBadge = (props) => {
3893
3981
  props.onHoverChange?.(false);
3894
3982
  };
3895
3983
  return (() => {
3896
- var _el$ = _tmpl$5(), _el$2 = _el$.firstChild;
3984
+ var _el$ = _tmpl$6(), _el$2 = _el$.firstChild;
3897
3985
  addEventListener(_el$, "click", props.onClick);
3898
3986
  _el$.addEventListener("mouseleave", handleMouseLeave);
3899
3987
  _el$.addEventListener("mouseenter", handleMouseEnter);
@@ -3966,19 +4054,61 @@ var ClickToCopyPill = (props) => {
3966
4054
  })();
3967
4055
  };
3968
4056
  var BottomSection = (props) => (() => {
3969
- var _el$9 = _tmpl$6();
4057
+ var _el$9 = _tmpl$62();
3970
4058
  insert(_el$9, () => props.children);
3971
4059
  return _el$9;
3972
4060
  })();
4061
+ var DismissConfirmation = (props) => {
4062
+ const handleKeyDown = (event) => {
4063
+ if (event.code === "Enter") {
4064
+ event.preventDefault();
4065
+ event.stopPropagation();
4066
+ props.onConfirm?.();
4067
+ } else if (event.code === "Escape") {
4068
+ event.preventDefault();
4069
+ event.stopPropagation();
4070
+ props.onCancel?.();
4071
+ }
4072
+ };
4073
+ onMount(() => {
4074
+ window.addEventListener("keydown", handleKeyDown, {
4075
+ capture: true
4076
+ });
4077
+ });
4078
+ onCleanup(() => {
4079
+ window.removeEventListener("keydown", handleKeyDown, {
4080
+ capture: true
4081
+ });
4082
+ });
4083
+ return (() => {
4084
+ var _el$0 = _tmpl$8(); _el$0.firstChild;
4085
+ insert(_el$0, createComponent(BottomSection, {
4086
+ get children() {
4087
+ var _el$10 = _tmpl$7(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling; _el$12.firstChild;
4088
+ addEventListener(_el$11, "click", props.onCancel);
4089
+ addEventListener(_el$12, "click", props.onConfirm);
4090
+ insert(_el$12, createComponent(IconReturn, {
4091
+ size: 10,
4092
+ "class": "text-[#c00002]"
4093
+ }), null);
4094
+ return _el$10;
4095
+ }
4096
+ }), null);
4097
+ return _el$0;
4098
+ })();
4099
+ };
3973
4100
  var SelectionLabel = (props) => {
3974
4101
  let containerRef;
3975
4102
  let inputRef;
3976
4103
  let isTagCurrentlyHovered = false;
4104
+ let lastValidPosition = null;
4105
+ let lastElementIdentity = null;
3977
4106
  const [measuredWidth, setMeasuredWidth] = createSignal(0);
3978
4107
  const [measuredHeight, setMeasuredHeight] = createSignal(0);
3979
4108
  const [arrowPosition, setArrowPosition] = createSignal("bottom");
3980
4109
  const [viewportVersion, setViewportVersion] = createSignal(0);
3981
4110
  const [isIdle, setIsIdle] = createSignal(false);
4111
+ const [hadValidBounds, setHadValidBounds] = createSignal(false);
3982
4112
  const speechRecognition = useSpeechRecognition({
3983
4113
  onTranscript: (transcript) => props.onInputChange?.(transcript),
3984
4114
  getCurrentValue: () => props.inputValue ?? ""
@@ -4035,8 +4165,11 @@ var SelectionLabel = (props) => {
4035
4165
  }
4036
4166
  });
4037
4167
  createEffect(() => {
4038
- void props.selectionBounds;
4039
- resetIdleTimer();
4168
+ const elementIdentity = `${props.tagName ?? ""}:${props.componentName ?? ""}`;
4169
+ if (elementIdentity !== lastElementIdentity) {
4170
+ lastElementIdentity = elementIdentity;
4171
+ resetIdleTimer();
4172
+ }
4040
4173
  });
4041
4174
  createEffect(() => {
4042
4175
  if (props.visible) {
@@ -4061,8 +4194,10 @@ var SelectionLabel = (props) => {
4061
4194
  const bounds = props.selectionBounds;
4062
4195
  const labelWidth = measuredWidth();
4063
4196
  const labelHeight = measuredHeight();
4064
- if (!bounds || labelWidth === 0 || labelHeight === 0) {
4065
- return {
4197
+ const hasMeasurements = labelWidth > 0 && labelHeight > 0;
4198
+ const hasValidBounds = bounds && bounds.width > 0 && bounds.height > 0;
4199
+ if (!hasMeasurements || !hasValidBounds) {
4200
+ return lastValidPosition ?? {
4066
4201
  left: -9999,
4067
4202
  top: -9999,
4068
4203
  arrowLeft: 0
@@ -4094,11 +4229,14 @@ var SelectionLabel = (props) => {
4094
4229
  positionTop = VIEWPORT_MARGIN_PX;
4095
4230
  }
4096
4231
  const arrowLeft = Math.max(12, Math.min(cursorX - positionLeft, labelWidth - 12));
4097
- return {
4232
+ const position = {
4098
4233
  left: positionLeft,
4099
4234
  top: positionTop,
4100
4235
  arrowLeft
4101
4236
  };
4237
+ lastValidPosition = position;
4238
+ setHadValidBounds(true);
4239
+ return position;
4102
4240
  };
4103
4241
  const handleKeyDown = (event) => {
4104
4242
  event.stopPropagation();
@@ -4131,85 +4269,129 @@ var SelectionLabel = (props) => {
4131
4269
  event.stopPropagation();
4132
4270
  event.stopImmediatePropagation();
4133
4271
  };
4272
+ const handleContainerPointerDown = (event) => {
4273
+ stopPropagation(event);
4274
+ const isEditableInputVisible = isNotProcessing() && props.isInputExpanded && !props.isPendingDismiss;
4275
+ if (isEditableInputVisible && inputRef) {
4276
+ inputRef.focus();
4277
+ }
4278
+ };
4134
4279
  const handleSubmit = () => {
4135
4280
  if (props.isInputExpanded && !props.inputValue?.trim()) return;
4136
4281
  speechRecognition.stop();
4137
4282
  props.onSubmit?.();
4138
4283
  };
4284
+ const shouldShowWithoutBounds = () => hadValidBounds() && (props.status === "copied" || props.status === "fading");
4139
4285
  return createComponent(Show, {
4140
4286
  get when() {
4141
- return memo(() => props.visible !== false)() && props.selectionBounds;
4287
+ return memo(() => props.visible !== false)() && (props.selectionBounds || shouldShowWithoutBounds());
4142
4288
  },
4143
4289
  get children() {
4144
- var _el$0 = _tmpl$16(), _el$12 = _el$0.firstChild;
4145
- _el$0.$$click = stopPropagation;
4146
- _el$0.$$mousedown = stopPropagation;
4147
- _el$0.$$pointerdown = stopPropagation;
4290
+ var _el$14 = _tmpl$21(), _el$21 = _el$14.firstChild;
4291
+ _el$14.$$click = stopPropagation;
4292
+ _el$14.$$mousedown = stopPropagation;
4293
+ _el$14.$$pointerdown = handleContainerPointerDown;
4148
4294
  var _ref$ = containerRef;
4149
- typeof _ref$ === "function" ? use(_ref$, _el$0) : containerRef = _el$0;
4150
- insert(_el$0, createComponent(Arrow, {
4295
+ typeof _ref$ === "function" ? use(_ref$, _el$14) : containerRef = _el$14;
4296
+ insert(_el$14, createComponent(Arrow, {
4151
4297
  get position() {
4152
4298
  return arrowPosition();
4153
4299
  },
4154
4300
  get leftPx() {
4155
4301
  return computedPosition().arrowLeft;
4156
4302
  }
4157
- }), _el$12);
4158
- insert(_el$0, createComponent(Show, {
4303
+ }), _el$21);
4304
+ insert(_el$14, createComponent(Show, {
4159
4305
  get when() {
4160
4306
  return props.status === "copied" || props.status === "fading";
4161
4307
  },
4162
4308
  get children() {
4163
- var _el$1 = _tmpl$7(), _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild;
4164
- insert(_el$11, () => props.hasAgent ? "Completed" : "Copied");
4165
- return _el$1;
4309
+ var _el$15 = _tmpl$10(), _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild;
4310
+ insert(_el$17, (() => {
4311
+ var _c$ = memo(() => !!props.hasAgent);
4312
+ return () => _c$() ? props.statusText ?? "Completed" : "Copied";
4313
+ })());
4314
+ insert(_el$15, createComponent(Show, {
4315
+ get when() {
4316
+ return props.onDismiss || props.onUndo;
4317
+ },
4318
+ get children() {
4319
+ return createComponent(BottomSection, {
4320
+ get children() {
4321
+ var _el$18 = _tmpl$1();
4322
+ insert(_el$18, createComponent(Show, {
4323
+ get when() {
4324
+ return props.onUndo;
4325
+ },
4326
+ get children() {
4327
+ var _el$19 = _tmpl$9();
4328
+ _el$19.$$click = () => props.onUndo?.();
4329
+ return _el$19;
4330
+ }
4331
+ }), null);
4332
+ insert(_el$18, createComponent(Show, {
4333
+ get when() {
4334
+ return props.onDismiss;
4335
+ },
4336
+ get children() {
4337
+ var _el$20 = _tmpl$0();
4338
+ _el$20.$$click = () => props.onDismiss?.();
4339
+ return _el$20;
4340
+ }
4341
+ }), null);
4342
+ return _el$18;
4343
+ }
4344
+ });
4345
+ }
4346
+ }), null);
4347
+ return _el$15;
4166
4348
  }
4167
- }), _el$12);
4168
- insert(_el$12, createComponent(Show, {
4349
+ }), _el$21);
4350
+ insert(_el$21, createComponent(Show, {
4169
4351
  get when() {
4170
4352
  return props.status === "copying";
4171
4353
  },
4172
4354
  get children() {
4173
- var _el$13 = _tmpl$0(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
4174
- insert(_el$16, () => props.statusText ?? "Grabbing\u2026");
4175
- insert(_el$13, createComponent(BottomSection, {
4355
+ var _el$22 = _tmpl$13(), _el$23 = _el$22.firstChild, _el$24 = _el$23.firstChild, _el$25 = _el$24.firstChild;
4356
+ insert(_el$25, () => props.statusText ?? "Grabbing\u2026");
4357
+ insert(_el$22, createComponent(BottomSection, {
4176
4358
  get children() {
4177
- var _el$17 = _tmpl$9(), _el$18 = _el$17.firstChild;
4359
+ var _el$26 = _tmpl$12(), _el$27 = _el$26.firstChild;
4178
4360
  var _ref$2 = inputRef;
4179
- typeof _ref$2 === "function" ? use(_ref$2, _el$18) : inputRef = _el$18;
4180
- insert(_el$17, createComponent(Show, {
4361
+ typeof _ref$2 === "function" ? use(_ref$2, _el$27) : inputRef = _el$27;
4362
+ insert(_el$26, createComponent(Show, {
4181
4363
  get when() {
4182
4364
  return props.onAbort;
4183
4365
  },
4184
4366
  get children() {
4185
- var _el$19 = _tmpl$8();
4186
- _el$19.$$click = (event) => {
4367
+ var _el$28 = _tmpl$11();
4368
+ _el$28.$$click = (event) => {
4187
4369
  event.stopPropagation();
4188
4370
  props.onAbort?.();
4189
4371
  };
4190
- _el$19.$$pointerup = (event) => {
4372
+ _el$28.$$pointerup = (event) => {
4191
4373
  event.stopPropagation();
4192
4374
  props.onAbort?.();
4193
4375
  };
4194
- _el$19.$$mousedown = (event) => event.stopPropagation();
4195
- _el$19.$$pointerdown = (event) => event.stopPropagation();
4196
- return _el$19;
4376
+ _el$28.$$mousedown = (event) => event.stopPropagation();
4377
+ _el$28.$$pointerdown = (event) => event.stopPropagation();
4378
+ return _el$28;
4197
4379
  }
4198
4380
  }), null);
4199
- createRenderEffect(() => _el$18.value = props.inputValue ?? "");
4200
- return _el$17;
4381
+ createRenderEffect(() => _el$27.value = props.inputValue ?? "");
4382
+ return _el$26;
4201
4383
  }
4202
4384
  }), null);
4203
- return _el$13;
4385
+ return _el$22;
4204
4386
  }
4205
4387
  }), null);
4206
- insert(_el$12, createComponent(Show, {
4388
+ insert(_el$21, createComponent(Show, {
4207
4389
  get when() {
4208
4390
  return memo(() => !!isNotProcessing())() && !props.isInputExpanded;
4209
4391
  },
4210
4392
  get children() {
4211
- var _el$20 = _tmpl$11(), _el$21 = _el$20.firstChild, _el$23 = _el$21.nextSibling, _el$24 = _el$23.firstChild;
4212
- insert(_el$21, createComponent(ClickToCopyPill, {
4393
+ var _el$29 = _tmpl$16(), _el$30 = _el$29.firstChild, _el$32 = _el$30.nextSibling, _el$33 = _el$32.firstChild;
4394
+ insert(_el$30, createComponent(ClickToCopyPill, {
4213
4395
  onClick: handleSubmit,
4214
4396
  shrink: true,
4215
4397
  get hasParent() {
@@ -4219,19 +4401,19 @@ var SelectionLabel = (props) => {
4219
4401
  return props.hasAgent;
4220
4402
  }
4221
4403
  }), null);
4222
- insert(_el$21, createComponent(Show, {
4404
+ insert(_el$30, createComponent(Show, {
4223
4405
  get when() {
4224
4406
  return props.componentName;
4225
4407
  },
4226
4408
  get children() {
4227
- var _el$22 = _tmpl$1();
4228
- insert(_el$22, createComponent(ParentBadge, {
4409
+ var _el$31 = _tmpl$14();
4410
+ insert(_el$31, createComponent(ParentBadge, {
4229
4411
  get name() {
4230
4412
  return props.componentName;
4231
4413
  }
4232
4414
  }), null);
4233
- insert(_el$22, createComponent(ChevronSeparator, {}), null);
4234
- insert(_el$22, createComponent(TagBadge, {
4415
+ insert(_el$31, createComponent(ChevronSeparator, {}), null);
4416
+ insert(_el$31, createComponent(TagBadge, {
4235
4417
  get tagName() {
4236
4418
  return tagDisplay();
4237
4419
  },
@@ -4243,10 +4425,10 @@ var SelectionLabel = (props) => {
4243
4425
  showMono: true,
4244
4426
  shrink: true
4245
4427
  }), null);
4246
- return _el$22;
4428
+ return _el$31;
4247
4429
  }
4248
4430
  }), null);
4249
- insert(_el$21, createComponent(Show, {
4431
+ insert(_el$30, createComponent(Show, {
4250
4432
  get when() {
4251
4433
  return !props.componentName;
4252
4434
  },
@@ -4265,33 +4447,37 @@ var SelectionLabel = (props) => {
4265
4447
  });
4266
4448
  }
4267
4449
  }), null);
4268
- insert(_el$24, createComponent(BottomSection, {
4450
+ insert(_el$33, createComponent(BottomSection, {
4269
4451
  get children() {
4270
- var _el$25 = _tmpl$10(), _el$26 = _el$25.firstChild, _el$27 = _el$26.nextSibling; _el$27.firstChild;
4271
- return _el$25;
4452
+ var _el$34 = _tmpl$15(), _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling;
4453
+ insert(_el$36, createComponent(IconReturn, {
4454
+ size: 10,
4455
+ "class": "opacity-[0.99] text-black"
4456
+ }));
4457
+ return _el$34;
4272
4458
  }
4273
4459
  }));
4274
4460
  createRenderEffect((_p$) => {
4275
4461
  var _v$3 = cn("contain-layout shrink-0 flex items-center gap-1 pt-1 w-fit h-fit pl-1.5", props.componentName ? "pr-1.5" : "pr-1"), _v$4 = isIdle() ? "1fr" : "0fr", _v$5 = cn("overflow-hidden min-h-0", !isIdle() && "w-0");
4276
- _v$3 !== _p$.e && className(_el$21, _p$.e = _v$3);
4277
- _v$4 !== _p$.t && setStyleProperty(_el$23, "grid-template-rows", _p$.t = _v$4);
4278
- _v$5 !== _p$.a && className(_el$24, _p$.a = _v$5);
4462
+ _v$3 !== _p$.e && className(_el$30, _p$.e = _v$3);
4463
+ _v$4 !== _p$.t && setStyleProperty(_el$32, "grid-template-rows", _p$.t = _v$4);
4464
+ _v$5 !== _p$.a && className(_el$33, _p$.a = _v$5);
4279
4465
  return _p$;
4280
4466
  }, {
4281
4467
  e: void 0,
4282
4468
  t: void 0,
4283
4469
  a: void 0
4284
4470
  });
4285
- return _el$20;
4471
+ return _el$29;
4286
4472
  }
4287
4473
  }), null);
4288
- insert(_el$12, createComponent(Show, {
4474
+ insert(_el$21, createComponent(Show, {
4289
4475
  get when() {
4290
- return memo(() => !!isNotProcessing())() && props.isInputExpanded;
4476
+ return memo(() => !!(isNotProcessing() && props.isInputExpanded))() && !props.isPendingDismiss;
4291
4477
  },
4292
4478
  get children() {
4293
- var _el$29 = _tmpl$15(), _el$30 = _el$29.firstChild;
4294
- insert(_el$30, createComponent(ClickToCopyPill, {
4479
+ var _el$37 = _tmpl$20(), _el$38 = _el$37.firstChild;
4480
+ insert(_el$38, createComponent(ClickToCopyPill, {
4295
4481
  onClick: handleSubmit,
4296
4482
  dimmed: true,
4297
4483
  shrink: true,
@@ -4302,19 +4488,19 @@ var SelectionLabel = (props) => {
4302
4488
  return props.hasAgent;
4303
4489
  }
4304
4490
  }), null);
4305
- insert(_el$30, createComponent(Show, {
4491
+ insert(_el$38, createComponent(Show, {
4306
4492
  get when() {
4307
4493
  return props.componentName;
4308
4494
  },
4309
4495
  get children() {
4310
- var _el$31 = _tmpl$1();
4311
- insert(_el$31, createComponent(ParentBadge, {
4496
+ var _el$39 = _tmpl$14();
4497
+ insert(_el$39, createComponent(ParentBadge, {
4312
4498
  get name() {
4313
4499
  return props.componentName;
4314
4500
  }
4315
4501
  }), null);
4316
- insert(_el$31, createComponent(ChevronSeparator, {}), null);
4317
- insert(_el$31, createComponent(TagBadge, {
4502
+ insert(_el$39, createComponent(ChevronSeparator, {}), null);
4503
+ insert(_el$39, createComponent(TagBadge, {
4318
4504
  get tagName() {
4319
4505
  return tagDisplay();
4320
4506
  },
@@ -4327,10 +4513,10 @@ var SelectionLabel = (props) => {
4327
4513
  shrink: true,
4328
4514
  forceShowIcon: true
4329
4515
  }), null);
4330
- return _el$31;
4516
+ return _el$39;
4331
4517
  }
4332
4518
  }), null);
4333
- insert(_el$30, createComponent(Show, {
4519
+ insert(_el$38, createComponent(Show, {
4334
4520
  get when() {
4335
4521
  return !props.componentName;
4336
4522
  },
@@ -4350,21 +4536,21 @@ var SelectionLabel = (props) => {
4350
4536
  });
4351
4537
  }
4352
4538
  }), null);
4353
- insert(_el$29, createComponent(BottomSection, {
4539
+ insert(_el$37, createComponent(BottomSection, {
4354
4540
  get children() {
4355
- var _el$32 = _tmpl$14(), _el$33 = _el$32.firstChild, _el$34 = _el$33.nextSibling;
4356
- _el$33.$$keydown = handleKeyDown;
4357
- _el$33.$$input = handleInput;
4541
+ var _el$40 = _tmpl$19(), _el$41 = _el$40.firstChild, _el$42 = _el$41.nextSibling;
4542
+ _el$41.$$keydown = handleKeyDown;
4543
+ _el$41.$$input = handleInput;
4358
4544
  var _ref$3 = inputRef;
4359
- typeof _ref$3 === "function" ? use(_ref$3, _el$33) : inputRef = _el$33;
4360
- insert(_el$34, createComponent(Show, {
4545
+ typeof _ref$3 === "function" ? use(_ref$3, _el$41) : inputRef = _el$41;
4546
+ insert(_el$42, createComponent(Show, {
4361
4547
  get when() {
4362
4548
  return memo(() => !!(props.hasAgent && speechRecognition.isSupported()))() && !props.inputValue;
4363
4549
  },
4364
4550
  get children() {
4365
- var _el$35 = _tmpl$12();
4366
- addEventListener(_el$35, "click", speechRecognition.toggle);
4367
- insert(_el$35, createComponent(IconMic, {
4551
+ var _el$43 = _tmpl$17();
4552
+ addEventListener(_el$43, "click", speechRecognition.toggle);
4553
+ insert(_el$43, createComponent(IconMic, {
4368
4554
  size: 11,
4369
4555
  get ["class"]() {
4370
4556
  return speechRecognition.isListening() ? "animate-pulse" : "";
@@ -4372,42 +4558,61 @@ var SelectionLabel = (props) => {
4372
4558
  }));
4373
4559
  createRenderEffect((_p$) => {
4374
4560
  var _v$6 = cn("contain-layout shrink-0 flex items-center justify-center px-[2px] py-[2px] rounded-xs [border-width:0.5px] border-solid size-fit cursor-pointer transition-all hover:scale-105", speechRecognition.isListening() ? "bg-grab-purple border-grab-purple text-white" : "bg-white border-[#B3B3B3] text-black"), _v$7 = speechRecognition.isListening() ? "Stop listening" : "Start voice input";
4375
- _v$6 !== _p$.e && className(_el$35, _p$.e = _v$6);
4376
- _v$7 !== _p$.t && setAttribute(_el$35, "title", _p$.t = _v$7);
4561
+ _v$6 !== _p$.e && className(_el$43, _p$.e = _v$6);
4562
+ _v$7 !== _p$.t && setAttribute(_el$43, "title", _p$.t = _v$7);
4377
4563
  return _p$;
4378
4564
  }, {
4379
4565
  e: void 0,
4380
4566
  t: void 0
4381
4567
  });
4382
- return _el$35;
4568
+ return _el$43;
4383
4569
  }
4384
4570
  }), null);
4385
- insert(_el$34, createComponent(Show, {
4571
+ insert(_el$42, createComponent(Show, {
4386
4572
  get when() {
4387
4573
  return props.inputValue;
4388
4574
  },
4389
4575
  get children() {
4390
- var _el$36 = _tmpl$13(); _el$36.firstChild;
4391
- _el$36.$$click = handleSubmit;
4392
- return _el$36;
4576
+ var _el$44 = _tmpl$18();
4577
+ _el$44.$$click = handleSubmit;
4578
+ insert(_el$44, createComponent(IconReturn, {
4579
+ size: 10,
4580
+ "class": "opacity-[0.99] text-black"
4581
+ }));
4582
+ return _el$44;
4393
4583
  }
4394
4584
  }), null);
4395
- createRenderEffect(() => setAttribute(_el$33, "placeholder", speechRecognition.isListening() ? "listening..." : props.hasAgent ? "type to edit" : "type prompt"));
4396
- createRenderEffect(() => _el$33.value = props.inputValue ?? "");
4397
- return _el$32;
4585
+ createRenderEffect(() => setAttribute(_el$41, "placeholder", speechRecognition.isListening() ? "listening..." : props.hasAgent && props.isAgentConnected ? "type to edit" : "type prompt"));
4586
+ createRenderEffect(() => _el$41.value = props.inputValue ?? "");
4587
+ return _el$40;
4398
4588
  }
4399
4589
  }), null);
4400
- createRenderEffect(() => className(_el$30, cn("contain-layout shrink-0 flex items-center gap-1 pt-1 w-fit h-fit pl-1.5", props.componentName ? "pr-1.5" : "pr-1")));
4401
- return _el$29;
4590
+ createRenderEffect(() => className(_el$38, cn("contain-layout shrink-0 flex items-center gap-1 pt-1 w-fit h-fit pl-1.5", props.componentName ? "pr-1.5" : "pr-1")));
4591
+ return _el$37;
4592
+ }
4593
+ }), null);
4594
+ insert(_el$21, createComponent(Show, {
4595
+ get when() {
4596
+ return props.isPendingDismiss;
4597
+ },
4598
+ get children() {
4599
+ return createComponent(DismissConfirmation, {
4600
+ get onConfirm() {
4601
+ return props.onConfirmDismiss;
4602
+ },
4603
+ get onCancel() {
4604
+ return props.onCancelDismiss;
4605
+ }
4606
+ });
4402
4607
  }
4403
4608
  }), null);
4404
4609
  createRenderEffect((_p$) => {
4405
- var _v$8 = `${computedPosition().top}px`, _v$9 = `${computedPosition().left}px`, _v$0 = props.isInputExpanded ? "auto" : "none", _v$1 = props.status === "fading" ? 0 : 1, _v$10 = props.status === "copied" || props.status === "fading" ? "none" : void 0;
4406
- _v$8 !== _p$.e && setStyleProperty(_el$0, "top", _p$.e = _v$8);
4407
- _v$9 !== _p$.t && setStyleProperty(_el$0, "left", _p$.t = _v$9);
4408
- _v$0 !== _p$.a && setStyleProperty(_el$0, "pointer-events", _p$.a = _v$0);
4409
- _v$1 !== _p$.o && setStyleProperty(_el$0, "opacity", _p$.o = _v$1);
4410
- _v$10 !== _p$.i && setStyleProperty(_el$12, "display", _p$.i = _v$10);
4610
+ var _v$8 = `${computedPosition().top}px`, _v$9 = `${computedPosition().left}px`, _v$0 = props.isInputExpanded || props.status === "copied" && props.onDismiss || props.status === "copying" && props.onAbort ? "auto" : "none", _v$1 = props.status === "fading" ? 0 : 1, _v$10 = props.status === "copied" || props.status === "fading" ? "none" : void 0;
4611
+ _v$8 !== _p$.e && setStyleProperty(_el$14, "top", _p$.e = _v$8);
4612
+ _v$9 !== _p$.t && setStyleProperty(_el$14, "left", _p$.t = _v$9);
4613
+ _v$0 !== _p$.a && setStyleProperty(_el$14, "pointer-events", _p$.a = _v$0);
4614
+ _v$1 !== _p$.o && setStyleProperty(_el$14, "opacity", _p$.o = _v$1);
4615
+ _v$10 !== _p$.i && setStyleProperty(_el$21, "display", _p$.i = _v$10);
4411
4616
  return _p$;
4412
4617
  }, {
4413
4618
  e: void 0,
@@ -4416,14 +4621,14 @@ var SelectionLabel = (props) => {
4416
4621
  o: void 0,
4417
4622
  i: void 0
4418
4623
  });
4419
- return _el$0;
4624
+ return _el$14;
4420
4625
  }
4421
4626
  });
4422
4627
  };
4423
4628
  delegateEvents(["click", "pointerdown", "mousedown", "pointerup", "input", "keydown"]);
4424
4629
 
4425
4630
  // src/components/selection-cursor.tsx
4426
- var _tmpl$17 = /* @__PURE__ */ template(`<div class="fixed z-2147483647"><button data-react-grab-selection-cursor>`);
4631
+ var _tmpl$23 = /* @__PURE__ */ template(`<div class="fixed z-2147483647"><button data-react-grab-selection-cursor>`);
4427
4632
  var SelectionCursor = (props) => {
4428
4633
  const [isHovered, setIsHovered] = createSignal(false);
4429
4634
  const [debouncedVisible, setDebouncedVisible] = createSignal(false);
@@ -4460,7 +4665,7 @@ var SelectionCursor = (props) => {
4460
4665
  });
4461
4666
  }
4462
4667
  }), (() => {
4463
- var _el$ = _tmpl$17(), _el$2 = _el$.firstChild;
4668
+ var _el$ = _tmpl$23(), _el$2 = _el$.firstChild;
4464
4669
  _el$.addEventListener("mouseleave", () => setIsHovered(false));
4465
4670
  _el$.addEventListener("mouseenter", () => setIsHovered(true));
4466
4671
  _el$2.$$click = handleClick;
@@ -4505,6 +4710,7 @@ delegateEvents(["click"]);
4505
4710
 
4506
4711
  // src/components/renderer.tsx
4507
4712
  var ReactGrabRenderer = (props) => {
4713
+ const agentSessionsList = createMemo(() => props.agentSessions ? Array.from(props.agentSessions.values()) : []);
4508
4714
  return [createComponent(Show, {
4509
4715
  get when() {
4510
4716
  return memo(() => !!props.selectionVisible)() && props.selectionBounds;
@@ -4566,51 +4772,58 @@ var ReactGrabRenderer = (props) => {
4566
4772
  return box.createdAt;
4567
4773
  }
4568
4774
  })
4569
- }), createComponent(For, {
4775
+ }), createComponent(Index, {
4570
4776
  get each() {
4571
- return memo(() => !!props.agentSessions)() ? Array.from(props.agentSessions.values()) : [];
4777
+ return agentSessionsList();
4572
4778
  },
4573
4779
  children: (session) => [createComponent(Show, {
4574
4780
  get when() {
4575
- return session.selectionBounds;
4781
+ return session().selectionBounds;
4576
4782
  },
4577
4783
  get children() {
4578
4784
  return createComponent(SelectionBox, {
4579
4785
  variant: "processing",
4580
4786
  get bounds() {
4581
- return session.selectionBounds;
4787
+ return session().selectionBounds;
4582
4788
  },
4583
4789
  visible: true,
4584
4790
  get isCompleted() {
4585
- return !session.isStreaming;
4791
+ return !session().isStreaming;
4586
4792
  }
4587
4793
  });
4588
4794
  }
4589
4795
  }), createComponent(SelectionLabel, {
4590
4796
  get tagName() {
4591
- return session.tagName;
4797
+ return session().tagName;
4592
4798
  },
4593
4799
  get componentName() {
4594
- return session.componentName;
4800
+ return session().componentName;
4595
4801
  },
4596
4802
  get selectionBounds() {
4597
- return session.selectionBounds;
4803
+ return session().selectionBounds;
4598
4804
  },
4599
4805
  get mouseX() {
4600
- return session.position.x;
4806
+ return session().position.x;
4601
4807
  },
4602
4808
  visible: true,
4603
4809
  hasAgent: true,
4810
+ isAgentConnected: true,
4604
4811
  get status() {
4605
- return session.isStreaming ? "copying" : "copied";
4812
+ return session().isStreaming ? "copying" : "copied";
4606
4813
  },
4607
4814
  get statusText() {
4608
- return session.lastStatus || "Thinking\u2026";
4815
+ return session().lastStatus || "Thinking\u2026";
4609
4816
  },
4610
4817
  get inputValue() {
4611
- return session.context.prompt;
4818
+ return session().context.prompt;
4819
+ },
4820
+ onAbort: () => props.onAbortSession?.(session().id),
4821
+ get onDismiss() {
4822
+ return session().isStreaming ? void 0 : () => props.onDismissSession?.(session().id);
4612
4823
  },
4613
- onAbort: () => props.onAbortSession?.(session.id)
4824
+ get onUndo() {
4825
+ return session().isStreaming ? void 0 : () => props.onUndoSession?.(session().id);
4826
+ }
4614
4827
  })]
4615
4828
  }), createComponent(Show, {
4616
4829
  get when() {
@@ -4642,6 +4855,9 @@ var ReactGrabRenderer = (props) => {
4642
4855
  get hasAgent() {
4643
4856
  return props.hasAgent;
4644
4857
  },
4858
+ get isAgentConnected() {
4859
+ return props.isAgentConnected;
4860
+ },
4645
4861
  get status() {
4646
4862
  return props.selectionLabelStatus;
4647
4863
  },
@@ -4663,6 +4879,15 @@ var ReactGrabRenderer = (props) => {
4663
4879
  get onToggleExpand() {
4664
4880
  return props.onToggleExpand;
4665
4881
  },
4882
+ get isPendingDismiss() {
4883
+ return props.isPendingDismiss;
4884
+ },
4885
+ get onConfirmDismiss() {
4886
+ return props.onConfirmDismiss;
4887
+ },
4888
+ get onCancelDismiss() {
4889
+ return props.onCancelDismiss;
4890
+ },
4666
4891
  onOpen: () => {
4667
4892
  if (props.selectionFilePath) {
4668
4893
  const openFileUrl = buildOpenFileUrl(props.selectionFilePath, props.selectionLineNumber);
@@ -4728,7 +4953,7 @@ var ReactGrabRenderer = (props) => {
4728
4953
  })];
4729
4954
  };
4730
4955
 
4731
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/rdt-hook-7WClMTWh.js
4956
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/rdt-hook-7WClMTWh.js
4732
4957
  var e = `0.5.25`;
4733
4958
  var t = `bippy-${e}`;
4734
4959
  var n = Object.defineProperty;
@@ -4816,7 +5041,7 @@ var _ = () => {
4816
5041
  }
4817
5042
  };
4818
5043
 
4819
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/core-CoV0JPOT.js
5044
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/core-CoV0JPOT.js
4820
5045
  var a2 = 0;
4821
5046
  var o2 = 1;
4822
5047
  var c2 = 5;
@@ -4904,7 +5129,7 @@ var Pe = (e2) => {
4904
5129
  return null;
4905
5130
  };
4906
5131
 
4907
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/source.js
5132
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/source.js
4908
5133
  var g2 = Object.create;
4909
5134
  var _2 = Object.defineProperty;
4910
5135
  var v = Object.getOwnPropertyDescriptor;
@@ -5546,7 +5771,7 @@ var je = (e2) => {
5546
5771
  // src/utils/is-capitalized.ts
5547
5772
  var isCapitalized = (value) => value.length > 0 && /^[A-Z]/.test(value);
5548
5773
 
5549
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/install-hook-only-CTBENLgG.js
5774
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/install-hook-only-CTBENLgG.js
5550
5775
  _();
5551
5776
 
5552
5777
  // src/context.ts
@@ -5709,11 +5934,12 @@ var getHTMLPreview = (element) => {
5709
5934
 
5710
5935
  // src/utils/copy-content.ts
5711
5936
  var REACT_GRAB_MIME_TYPE = "application/x-react-grab";
5712
- var copyContent = (content, onSuccess) => {
5937
+ var copyContent = (content, options) => {
5713
5938
  const metadata = JSON.stringify({
5714
5939
  version: VERSION,
5715
5940
  content,
5716
- timestamp: Date.now()
5941
+ timestamp: Date.now(),
5942
+ ...options?.prompt && { prompt: options.prompt }
5717
5943
  });
5718
5944
  const copyHandler = (event) => {
5719
5945
  event.preventDefault();
@@ -5731,7 +5957,7 @@ var copyContent = (content, onSuccess) => {
5731
5957
  try {
5732
5958
  const didCopySucceed = document.execCommand("copy");
5733
5959
  if (didCopySucceed) {
5734
- onSuccess?.();
5960
+ options?.onSuccess?.();
5735
5961
  }
5736
5962
  return didCopySucceed;
5737
5963
  } finally {
@@ -6185,9 +6411,7 @@ var createAgentManager = (initialAgentOptions) => {
6185
6411
  const isProcessing = () => sessions().size > 0;
6186
6412
  const executeSessionStream = async (session, streamIterator) => {
6187
6413
  const storage = agentOptions?.storage;
6188
- let didComplete = false;
6189
6414
  let wasAborted = false;
6190
- let hadError = false;
6191
6415
  try {
6192
6416
  for await (const status of streamIterator) {
6193
6417
  const currentSessions = sessions();
@@ -6201,17 +6425,21 @@ var createAgentManager = (initialAgentOptions) => {
6201
6425
  setSessions((prev) => new Map(prev).set(session.id, updatedSession));
6202
6426
  agentOptions?.onStatus?.(status, updatedSession);
6203
6427
  }
6204
- didComplete = true;
6205
6428
  const finalSessions = sessions();
6206
6429
  const finalSession = finalSessions.get(session.id);
6207
6430
  if (finalSession) {
6431
+ const completionMessage = agentOptions?.provider?.getCompletionMessage?.();
6208
6432
  const completedSession = updateSession(
6209
6433
  finalSession,
6210
- { isStreaming: false },
6434
+ {
6435
+ isStreaming: false,
6436
+ ...completionMessage ? { lastStatus: completionMessage } : {}
6437
+ },
6211
6438
  storage
6212
6439
  );
6213
6440
  setSessions((prev) => new Map(prev).set(session.id, completedSession));
6214
- agentOptions?.onComplete?.(completedSession);
6441
+ const element = sessionElements.get(session.id);
6442
+ agentOptions?.onComplete?.(completedSession, element);
6215
6443
  }
6216
6444
  } catch (error) {
6217
6445
  const currentSessions = sessions();
@@ -6238,7 +6466,6 @@ var createAgentManager = (initialAgentOptions) => {
6238
6466
  setSessions((prev) => new Map(prev).set(session.id, errorSession));
6239
6467
  }
6240
6468
  } else {
6241
- hadError = true;
6242
6469
  if (currentSession) {
6243
6470
  const errorSession = updateSession(
6244
6471
  currentSession,
@@ -6257,7 +6484,7 @@ var createAgentManager = (initialAgentOptions) => {
6257
6484
  }
6258
6485
  } finally {
6259
6486
  abortControllers.delete(session.id);
6260
- const removeSession = () => {
6487
+ if (wasAborted) {
6261
6488
  sessionElements.delete(session.id);
6262
6489
  clearSessionById(session.id, storage);
6263
6490
  setSessions((prev) => {
@@ -6265,11 +6492,6 @@ var createAgentManager = (initialAgentOptions) => {
6265
6492
  next.delete(session.id);
6266
6493
  return next;
6267
6494
  });
6268
- };
6269
- if (wasAborted) {
6270
- removeSession();
6271
- } else if (didComplete || hadError) {
6272
- setTimeout(removeSession, 1500);
6273
6495
  }
6274
6496
  }
6275
6497
  };
@@ -6344,7 +6566,7 @@ var createAgentManager = (initialAgentOptions) => {
6344
6566
  return;
6345
6567
  }
6346
6568
  const elements = [element];
6347
- const content = await generateSnippet(elements);
6569
+ const content = await generateSnippet(elements, { maxLines: Infinity });
6348
6570
  const context = {
6349
6571
  content,
6350
6572
  prompt,
@@ -6363,7 +6585,7 @@ var createAgentManager = (initialAgentOptions) => {
6363
6585
  sessionElements.set(session.id, element);
6364
6586
  setSessions((prev) => new Map(prev).set(session.id, session));
6365
6587
  saveSessionById(session, storage);
6366
- agentOptions.onStart?.(session);
6588
+ agentOptions.onStart?.(session, element);
6367
6589
  const abortController = new AbortController();
6368
6590
  abortControllers.set(session.id, abortController);
6369
6591
  const streamIterator = agentOptions.provider.send(
@@ -6384,20 +6606,33 @@ var createAgentManager = (initialAgentOptions) => {
6384
6606
  setSessions(/* @__PURE__ */ new Map());
6385
6607
  clearSessions(agentOptions?.storage);
6386
6608
  };
6609
+ const dismissSession = (sessionId) => {
6610
+ const storage = agentOptions?.storage;
6611
+ sessionElements.delete(sessionId);
6612
+ clearSessionById(sessionId, storage);
6613
+ setSessions((prev) => {
6614
+ const next = new Map(prev);
6615
+ next.delete(sessionId);
6616
+ return next;
6617
+ });
6618
+ };
6619
+ const undoSession = (sessionId) => {
6620
+ const currentSessions = sessions();
6621
+ const session = currentSessions.get(sessionId);
6622
+ if (session) {
6623
+ const element = sessionElements.get(sessionId);
6624
+ agentOptions?.onUndo?.(session, element);
6625
+ void agentOptions?.provider?.undo?.();
6626
+ }
6627
+ dismissSession(sessionId);
6628
+ };
6387
6629
  const updateSessionBoundsOnViewportChange = () => {
6388
6630
  const currentSessions = sessions();
6389
6631
  if (currentSessions.size === 0) return;
6390
6632
  const updatedSessions = new Map(currentSessions);
6391
6633
  let didUpdate = false;
6392
6634
  for (const [sessionId, session] of currentSessions) {
6393
- let element = sessionElements.get(sessionId);
6394
- if (!element || !document.contains(element)) {
6395
- const reacquiredElement = tryReacquireElement(session);
6396
- if (reacquiredElement) {
6397
- sessionElements.set(sessionId, reacquiredElement);
6398
- element = reacquiredElement;
6399
- }
6400
- }
6635
+ const element = sessionElements.get(sessionId);
6401
6636
  if (element && document.contains(element)) {
6402
6637
  const newBounds = createElementBounds(element);
6403
6638
  if (newBounds) {
@@ -6432,6 +6667,8 @@ var createAgentManager = (initialAgentOptions) => {
6432
6667
  startSession,
6433
6668
  abortSession,
6434
6669
  abortAllSessions,
6670
+ dismissSession,
6671
+ undoSession,
6435
6672
  updateSessionBoundsOnViewportChange,
6436
6673
  getSessionElement,
6437
6674
  setOptions,
@@ -6440,8 +6677,8 @@ var createAgentManager = (initialAgentOptions) => {
6440
6677
  };
6441
6678
 
6442
6679
  // src/core.tsx
6443
- var _tmpl$18 = /* @__PURE__ */ template(`<span class="tabular-nums align-middle">`);
6444
- var _tmpl$23 = /* @__PURE__ */ template(`<span class="font-mono tabular-nums align-middle">&lt;<!>>`);
6680
+ var _tmpl$24 = /* @__PURE__ */ template(`<span class="tabular-nums align-middle">`);
6681
+ var _tmpl$25 = /* @__PURE__ */ template(`<span class="font-mono tabular-nums align-middle">&lt;<!>>`);
6445
6682
  var _tmpl$33 = /* @__PURE__ */ template(`<span class="tabular-nums ml-1 align-middle"> in `);
6446
6683
  var onIdle = (callback) => {
6447
6684
  if ("scheduler" in globalThis) {
@@ -6534,7 +6771,7 @@ var init = (rawOptions) => {
6534
6771
  hasInited = true;
6535
6772
  const logIntro = () => {
6536
6773
  try {
6537
- const version = "0.0.71";
6774
+ const version = "0.0.73";
6538
6775
  const logoDataUri = `data:image/svg+xml;base64,${btoa(LOGO_SVG)}`;
6539
6776
  console.log(`%cReact Grab${version ? ` v${version}` : ""}%c
6540
6777
  https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid #d75fcb; padding: 4px 4px 4px 24px; border-radius: 4px; background-image: url("${logoDataUri}"); background-size: 16px 16px; background-repeat: no-repeat; background-position: 4px center; display: inline-block; margin-bottom: 4px;`, "");
@@ -6568,6 +6805,7 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6568
6805
  const [selectionLabelStatus, setSelectionLabelStatus] = createSignal("idle");
6569
6806
  const [labelInstances, setLabelInstances] = createSignal([]);
6570
6807
  const [lastGrabbedElement, setLastGrabbedElement] = createSignal(null);
6808
+ const [lastCopiedElement, setLastCopiedElement] = createSignal(null);
6571
6809
  const [progressStartTime, setProgressStartTime] = createSignal(null);
6572
6810
  const [grabbedBoxes, setGrabbedBoxes] = createSignal([]);
6573
6811
  const [isActivated, setIsActivated] = createSignal(false);
@@ -6587,6 +6825,8 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6587
6825
  const [isInputExpanded, setIsInputExpanded] = createSignal(false);
6588
6826
  const [frozenElement, setFrozenElement] = createSignal(null);
6589
6827
  const [hasAgentProvider, setHasAgentProvider] = createSignal(Boolean(options.agent?.provider));
6828
+ const [isAgentConnected, setIsAgentConnected] = createSignal(false);
6829
+ const [isPendingDismiss, setIsPendingDismiss] = createSignal(false);
6590
6830
  const elementInputCache = /* @__PURE__ */ new WeakMap();
6591
6831
  const [nativeSelectionCursorX, setNativeSelectionCursorX] = createSignal(OFFSCREEN_POSITION);
6592
6832
  const [nativeSelectionCursorY, setNativeSelectionCursorY] = createSignal(OFFSCREEN_POSITION);
@@ -6607,6 +6847,7 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6607
6847
  return await getNearestComponentName(element) || void 0;
6608
6848
  });
6609
6849
  const clearNativeSelectionState = () => {
6850
+ setHasNativeSelection(false);
6610
6851
  setNativeSelectionCursorX(OFFSCREEN_POSITION);
6611
6852
  setNativeSelectionCursorY(OFFSCREEN_POSITION);
6612
6853
  setNativeSelectionElements([]);
@@ -6722,6 +6963,9 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6722
6963
  await operation().finally(() => {
6723
6964
  setIsCopying(false);
6724
6965
  setDidJustCopy(true);
6966
+ if (element) {
6967
+ setLastCopiedElement(element);
6968
+ }
6725
6969
  stopProgressAnimation();
6726
6970
  if (instanceId) {
6727
6971
  updateLabelInstance(instanceId, "copied");
@@ -6765,7 +7009,9 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6765
7009
 
6766
7010
  ${combinedSnippets}` : combinedSnippets;
6767
7011
  copiedContent = plainTextContent;
6768
- didCopy = copyContent(plainTextContent);
7012
+ didCopy = copyContent(plainTextContent, {
7013
+ prompt: extraPrompt
7014
+ });
6769
7015
  }
6770
7016
  if (!didCopy) {
6771
7017
  const plainTextContentOnly = createCombinedTextContent(elements);
@@ -6774,7 +7020,9 @@ ${combinedSnippets}` : combinedSnippets;
6774
7020
 
6775
7021
  ${plainTextContentOnly}` : plainTextContentOnly;
6776
7022
  copiedContent = contentWithPrompt;
6777
- didCopy = copyContent(contentWithPrompt);
7023
+ didCopy = copyContent(contentWithPrompt, {
7024
+ prompt: extraPrompt
7025
+ });
6778
7026
  }
6779
7027
  }
6780
7028
  if (didCopy) {
@@ -6788,7 +7036,9 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6788
7036
 
6789
7037
  ${plainTextContentOnly}` : plainTextContentOnly;
6790
7038
  copiedContent = contentWithPrompt;
6791
- didCopy = copyContent(contentWithPrompt);
7039
+ didCopy = copyContent(contentWithPrompt, {
7040
+ prompt: extraPrompt
7041
+ });
6792
7042
  }
6793
7043
  }
6794
7044
  options.onAfterCopy?.(elements, didCopy);
@@ -6823,6 +7073,12 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6823
7073
  if (element && !document.contains(element)) return null;
6824
7074
  return element;
6825
7075
  });
7076
+ const effectiveElement = createMemo(() => {
7077
+ if (isToggleFrozen()) {
7078
+ return frozenElement();
7079
+ }
7080
+ return targetElement();
7081
+ });
6826
7082
  createEffect(() => {
6827
7083
  const element = detectedElement();
6828
7084
  if (!element) return;
@@ -6834,6 +7090,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6834
7090
  onCleanup(() => clearInterval(intervalId));
6835
7091
  });
6836
7092
  createEffect(() => {
7093
+ if (isToggleFrozen()) return;
6837
7094
  const element = targetElement();
6838
7095
  if (element) {
6839
7096
  setFrozenElement(element);
@@ -6841,7 +7098,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6841
7098
  });
6842
7099
  const selectionBounds = createMemo(() => {
6843
7100
  viewportVersion();
6844
- const element = targetElement();
7101
+ const element = effectiveElement();
6845
7102
  if (!element) return void 0;
6846
7103
  return createElementBounds(element);
6847
7104
  });
@@ -6893,7 +7150,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6893
7150
  const copying = isCopying();
6894
7151
  if (!element) {
6895
7152
  return (() => {
6896
- var _el$ = _tmpl$18();
7153
+ var _el$ = _tmpl$24();
6897
7154
  insert(_el$, copying ? "Processing\u2026" : "1 element");
6898
7155
  return _el$;
6899
7156
  })();
@@ -6902,7 +7159,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6902
7159
  const componentName = labelComponentName();
6903
7160
  if (tagName && componentName) {
6904
7161
  return [(() => {
6905
- var _el$2 = _tmpl$23(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling; _el$5.nextSibling;
7162
+ var _el$2 = _tmpl$25(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling; _el$5.nextSibling;
6906
7163
  insert(_el$2, tagName, _el$5);
6907
7164
  return _el$2;
6908
7165
  })(), (() => {
@@ -6913,13 +7170,13 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6913
7170
  }
6914
7171
  if (tagName) {
6915
7172
  return (() => {
6916
- var _el$8 = _tmpl$23(), _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling; _el$1.nextSibling;
7173
+ var _el$8 = _tmpl$25(), _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling; _el$1.nextSibling;
6917
7174
  insert(_el$8, tagName, _el$1);
6918
7175
  return _el$8;
6919
7176
  })();
6920
7177
  }
6921
7178
  return (() => {
6922
- var _el$10 = _tmpl$18();
7179
+ var _el$10 = _tmpl$24();
6923
7180
  insert(_el$10, copying ? "Processing\u2026" : "1 element");
6924
7181
  return _el$10;
6925
7182
  })();
@@ -7112,6 +7369,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7112
7369
  setInputText("");
7113
7370
  setIsToggleFrozen(false);
7114
7371
  setIsInputExpanded(false);
7372
+ setIsPendingDismiss(false);
7115
7373
  setFrozenElement(null);
7116
7374
  setSelectionLabelStatus("idle");
7117
7375
  setDidJustCopy(false);
@@ -7130,25 +7388,32 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7130
7388
  previouslyFocusedElement = null;
7131
7389
  options.onDeactivate?.();
7132
7390
  };
7391
+ const restoreInputFromSession = (session, element) => {
7392
+ if (element && document.contains(element)) {
7393
+ const rect = element.getBoundingClientRect();
7394
+ const centerY = rect.top + rect.height / 2;
7395
+ setMouseX(session.position.x);
7396
+ setMouseY(centerY);
7397
+ setFrozenElement(element);
7398
+ setInputText(session.context.prompt);
7399
+ setIsInputExpanded(true);
7400
+ setIsInputMode(true);
7401
+ setIsToggleMode(true);
7402
+ setIsToggleFrozen(true);
7403
+ if (!isActivated()) {
7404
+ activateRenderer();
7405
+ }
7406
+ }
7407
+ };
7133
7408
  const agentOptions = options.agent ? {
7134
7409
  ...options.agent,
7135
7410
  onAbort: (session, element) => {
7136
7411
  options.agent?.onAbort?.(session, element);
7137
- if (element && document.contains(element)) {
7138
- const rect = element.getBoundingClientRect();
7139
- const centerY = rect.top + rect.height / 2;
7140
- setMouseX(session.position.x);
7141
- setMouseY(centerY);
7142
- setFrozenElement(element);
7143
- setInputText(session.context.prompt);
7144
- setIsInputExpanded(true);
7145
- setIsInputMode(true);
7146
- setIsToggleMode(true);
7147
- setIsToggleFrozen(true);
7148
- if (!isActivated()) {
7149
- activateRenderer();
7150
- }
7151
- }
7412
+ restoreInputFromSession(session, element);
7413
+ },
7414
+ onUndo: (session, element) => {
7415
+ options.agent?.onUndo?.(session, element);
7416
+ restoreInputFromSession(session, element);
7152
7417
  }
7153
7418
  } : void 0;
7154
7419
  const agentManager = createAgentManager(agentOptions);
@@ -7156,6 +7421,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7156
7421
  setInputText(value);
7157
7422
  };
7158
7423
  const handleInputSubmit = () => {
7424
+ setLastCopiedElement(null);
7159
7425
  const element = frozenElement() || targetElement();
7160
7426
  const prompt = isInputMode() ? inputText().trim() : "";
7161
7427
  if (!element) {
@@ -7184,7 +7450,11 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7184
7450
  }
7185
7451
  setIsInputMode(false);
7186
7452
  setInputText("");
7187
- elementInputCache.delete(element);
7453
+ if (prompt) {
7454
+ elementInputCache.set(element, prompt);
7455
+ } else {
7456
+ elementInputCache.delete(element);
7457
+ }
7188
7458
  const tagName = extractElementTagName(element);
7189
7459
  void getNearestComponentName(element).then((componentName) => {
7190
7460
  void executeCopyOperation(currentX, currentY, () => copySingleElementToClipboard(element, prompt || void 0), bounds, tagName, componentName ?? void 0, element).then(() => {
@@ -7193,14 +7463,27 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7193
7463
  });
7194
7464
  };
7195
7465
  const handleInputCancel = () => {
7466
+ setLastCopiedElement(null);
7196
7467
  if (!isInputMode()) return;
7197
- const element = frozenElement() || targetElement();
7198
7468
  const currentInput = inputText().trim();
7469
+ if (currentInput && !isPendingDismiss()) {
7470
+ setIsPendingDismiss(true);
7471
+ return;
7472
+ }
7473
+ const element = frozenElement() || targetElement();
7199
7474
  if (element && currentInput) {
7200
7475
  elementInputCache.set(element, currentInput);
7201
7476
  }
7477
+ setIsPendingDismiss(false);
7478
+ deactivateRenderer();
7479
+ };
7480
+ const handleConfirmDismiss = () => {
7481
+ setIsPendingDismiss(false);
7202
7482
  deactivateRenderer();
7203
7483
  };
7484
+ const handleCancelDismiss = () => {
7485
+ setIsPendingDismiss(false);
7486
+ };
7204
7487
  const handleToggleExpand = () => {
7205
7488
  const element = frozenElement() || targetElement();
7206
7489
  if (element) {
@@ -7312,19 +7595,22 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7312
7595
  transform: stripTranslateFromTransform(firstElement)
7313
7596
  };
7314
7597
  const tagName = extractElementTagName(firstElement);
7598
+ const centerX = bounds.x + bounds.width / 2;
7599
+ const centerY = bounds.y + bounds.height / 2;
7315
7600
  if (hasAgentProvider()) {
7316
- const centerX = bounds.x + bounds.width / 2;
7317
- const centerY = bounds.y + bounds.height / 2;
7318
7601
  setMouseX(centerX);
7319
7602
  setMouseY(centerY);
7320
7603
  setFrozenElement(firstElement);
7321
7604
  setIsToggleMode(true);
7322
7605
  setIsToggleFrozen(true);
7323
7606
  setIsInputExpanded(true);
7607
+ if (!isActivated()) {
7608
+ activateRenderer();
7609
+ }
7324
7610
  setIsInputMode(true);
7325
7611
  } else {
7326
7612
  void getNearestComponentName(firstElement).then((componentName) => {
7327
- void executeCopyOperation(clientX, clientY, () => copyMultipleElementsToClipboard(selectedElements), bounds, tagName, componentName ?? void 0, firstElement, true);
7613
+ void executeCopyOperation(centerX, centerY, () => copyMultipleElementsToClipboard(selectedElements), bounds, tagName, componentName ?? void 0, firstElement, true);
7328
7614
  });
7329
7615
  }
7330
7616
  }
@@ -7364,7 +7650,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7364
7650
  const originalKey = originalKeyDescriptor?.get ? originalKeyDescriptor.get.call(event) : event.key;
7365
7651
  const isEnterKey = originalKey === "Enter" || isEnterCode(event.code);
7366
7652
  const isOverlayActive = isActivated() || isHoldingKeys();
7367
- const shouldBlockEnter = isEnterKey && isOverlayActive && !isInputMode();
7653
+ const shouldBlockEnter = isEnterKey && isOverlayActive && !isInputMode() && !isToggleMode();
7368
7654
  if (shouldBlockEnter) {
7369
7655
  claimedEvents.add(event);
7370
7656
  event.preventDefault();
@@ -7389,13 +7675,14 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7389
7675
  window.addEventListener("keydown", (event) => {
7390
7676
  blockEnterIfNeeded(event);
7391
7677
  const isEnterToActivateInput = isEnterCode(event.code) && isHoldingKeys() && !isInputMode();
7392
- if (isInputMode() && isTargetKeyCombination(event, options)) {
7678
+ if (isInputMode() && isTargetKeyCombination(event, options) && !event.repeat) {
7393
7679
  event.preventDefault();
7394
7680
  event.stopPropagation();
7395
7681
  setIsInputMode(false);
7396
7682
  setInputText("");
7397
7683
  setIsToggleFrozen(false);
7398
7684
  setIsInputExpanded(false);
7685
+ setIsPendingDismiss(false);
7399
7686
  return;
7400
7687
  }
7401
7688
  if (isInputMode() || isEventFromOverlay(event, "data-react-grab-ignore-events") && !isEnterToActivateInput) {
@@ -7414,6 +7701,33 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7414
7701
  return;
7415
7702
  }
7416
7703
  }
7704
+ const copiedElement = lastCopiedElement();
7705
+ if (isEnterCode(event.code) && !isHoldingKeys() && !isInputMode() && !isActivated() && copiedElement && document.contains(copiedElement) && !labelInstances().some((instance) => instance.status === "copied" || instance.status === "fading")) {
7706
+ event.preventDefault();
7707
+ event.stopPropagation();
7708
+ event.stopImmediatePropagation();
7709
+ const bounds = createElementBounds(copiedElement);
7710
+ const selectionCenterX = bounds.x + bounds.width / 2;
7711
+ const centerY = bounds.y + bounds.height / 2;
7712
+ setMouseX(selectionCenterX);
7713
+ setMouseY(centerY);
7714
+ setCopyStartX(selectionCenterX);
7715
+ setCopyStartY(centerY);
7716
+ setCopyOffsetFromCenterX(0);
7717
+ setFrozenElement(copiedElement);
7718
+ setLastCopiedElement(null);
7719
+ setLabelInstances([]);
7720
+ const cachedInput = elementInputCache.get(copiedElement);
7721
+ if (cachedInput) {
7722
+ setInputText(cachedInput);
7723
+ }
7724
+ setIsToggleMode(true);
7725
+ setIsToggleFrozen(true);
7726
+ setIsInputExpanded(true);
7727
+ activateRenderer();
7728
+ setIsInputMode(true);
7729
+ return;
7730
+ }
7417
7731
  if (isEnterCode(event.code) && isHoldingKeys() && !isInputMode()) {
7418
7732
  event.preventDefault();
7419
7733
  event.stopPropagation();
@@ -7499,9 +7813,10 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7499
7813
  if (!isHoldingKeys()) {
7500
7814
  setIsHoldingKeys(true);
7501
7815
  }
7816
+ const activationDuration = isKeyboardEventTriggeredByInput(event) ? options.keyHoldDuration + INPUT_FOCUS_ACTIVATION_DELAY_MS : options.keyHoldDuration;
7502
7817
  holdTimerId = window.setTimeout(() => {
7503
7818
  activateRenderer();
7504
- }, options.keyHoldDuration);
7819
+ }, activationDuration);
7505
7820
  }, {
7506
7821
  signal: eventListenerSignal,
7507
7822
  capture: true
@@ -7636,7 +7951,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7636
7951
  if (hadDrag) {
7637
7952
  setDidJustDrag(false);
7638
7953
  }
7639
- if (isToggleMode() && !isCopying()) {
7954
+ if (isToggleMode() && !isCopying() && !isInputMode()) {
7640
7955
  if (!isHoldingKeys()) {
7641
7956
  deactivateRenderer();
7642
7957
  } else {
@@ -7700,6 +8015,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7700
8015
  selectionDebounceTimerId = null;
7701
8016
  const currentSelection = window.getSelection();
7702
8017
  if (!currentSelection || currentSelection.isCollapsed || currentSelection.rangeCount === 0) {
8018
+ clearNativeSelectionState();
7703
8019
  return;
7704
8020
  }
7705
8021
  const range = currentSelection.getRangeAt(0);
@@ -7708,6 +8024,11 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7708
8024
  clearNativeSelectionState();
7709
8025
  return;
7710
8026
  }
8027
+ const selectedText = currentSelection.toString().trim();
8028
+ if (!selectedText) {
8029
+ clearNativeSelectionState();
8030
+ return;
8031
+ }
7711
8032
  const isBackward = (() => {
7712
8033
  if (!currentSelection.anchorNode || !currentSelection.focusNode) return false;
7713
8034
  const position = currentSelection.anchorNode.compareDocumentPosition(currentSelection.focusNode);
@@ -7757,14 +8078,14 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7757
8078
  const selectionVisible = createMemo(() => {
7758
8079
  if (!theme().selectionBox.enabled) return false;
7759
8080
  if (didJustCopy()) return false;
7760
- return isRendererActive() && !isDragging() && Boolean(targetElement());
8081
+ return isRendererActive() && !isDragging() && Boolean(effectiveElement());
7761
8082
  });
7762
8083
  const selectionTagName = createMemo(() => {
7763
- const element = targetElement();
8084
+ const element = effectiveElement();
7764
8085
  if (!element) return void 0;
7765
8086
  return extractElementTagName(element) || void 0;
7766
8087
  });
7767
- const [selectionComponentName] = createResource(() => targetElement(), async (element) => {
8088
+ const [selectionComponentName] = createResource(() => effectiveElement(), async (element) => {
7768
8089
  if (!element) return void 0;
7769
8090
  const name = await getNearestComponentName(element);
7770
8091
  return name ?? void 0;
@@ -7772,7 +8093,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7772
8093
  const selectionLabelVisible = createMemo(() => {
7773
8094
  if (!theme().elementLabel.enabled) return false;
7774
8095
  if (didJustCopy()) return false;
7775
- return isRendererActive() && !isDragging() && Boolean(targetElement());
8096
+ return isRendererActive() && !isDragging() && Boolean(effectiveElement());
7776
8097
  });
7777
8098
  const computedLabelInstances = createMemo(() => {
7778
8099
  viewportVersion();
@@ -7786,13 +8107,25 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7786
8107
  };
7787
8108
  });
7788
8109
  });
8110
+ const computedGrabbedBoxes = createMemo(() => {
8111
+ viewportVersion();
8112
+ return grabbedBoxes().map((box) => {
8113
+ if (!box.element || !document.body.contains(box.element)) {
8114
+ return box;
8115
+ }
8116
+ return {
8117
+ ...box,
8118
+ bounds: createElementBounds(box.element)
8119
+ };
8120
+ });
8121
+ });
7789
8122
  const dragVisible = createMemo(() => theme().dragBox.enabled && isRendererActive() && isDraggingBeyondThreshold());
7790
8123
  const labelVariant = createMemo(() => isCopying() ? "processing" : "hover");
7791
8124
  const labelVisible = createMemo(() => {
7792
8125
  if (!theme().elementLabel.enabled) return false;
7793
8126
  if (isInputMode()) return false;
7794
8127
  if (isCopying()) return true;
7795
- return isRendererActive() && !isDragging() && Boolean(targetElement());
8128
+ return isRendererActive() && !isDragging() && Boolean(effectiveElement());
7796
8129
  });
7797
8130
  const crosshairVisible = createMemo(() => theme().crosshair.enabled && isRendererActive() && !isDragging() && !isTouchMode() && !isToggleFrozen());
7798
8131
  const shouldShowGrabbedBoxes = createMemo(() => theme().grabbedBoxes.enabled);
@@ -7839,7 +8172,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7839
8172
  return dragBounds();
7840
8173
  },
7841
8174
  get grabbedBoxes() {
7842
- return memo(() => !!shouldShowGrabbedBoxes())() ? grabbedBoxes() : [];
8175
+ return memo(() => !!shouldShowGrabbedBoxes())() ? computedGrabbedBoxes() : [];
7843
8176
  },
7844
8177
  labelZIndex: Z_INDEX_LABEL,
7845
8178
  get mouseX() {
@@ -7860,14 +8193,24 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7860
8193
  get hasAgent() {
7861
8194
  return hasAgentProvider();
7862
8195
  },
8196
+ get isAgentConnected() {
8197
+ return isAgentConnected();
8198
+ },
7863
8199
  get agentSessions() {
7864
8200
  return agentManager.sessions();
7865
8201
  },
7866
8202
  onAbortSession: (sessionId) => agentManager.abortSession(sessionId),
8203
+ onDismissSession: (sessionId) => agentManager.dismissSession(sessionId),
8204
+ onUndoSession: (sessionId) => agentManager.undoSession(sessionId),
7867
8205
  onInputChange: handleInputChange,
7868
8206
  onInputSubmit: () => void handleInputSubmit(),
7869
8207
  onInputCancel: handleInputCancel,
7870
8208
  onToggleExpand: handleToggleExpand,
8209
+ get isPendingDismiss() {
8210
+ return isPendingDismiss();
8211
+ },
8212
+ onConfirmDismiss: handleConfirmDismiss,
8213
+ onCancelDismiss: handleCancelDismiss,
7871
8214
  get nativeSelectionCursorVisible() {
7872
8215
  return hasNativeSelection();
7873
8216
  },
@@ -7958,25 +8301,20 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7958
8301
  provider: newAgentOptions.provider ?? existingOptions?.provider,
7959
8302
  onAbort: (session, element) => {
7960
8303
  newAgentOptions?.onAbort?.(session, element);
7961
- if (element && document.contains(element)) {
7962
- const rect = element.getBoundingClientRect();
7963
- const centerY = rect.top + rect.height / 2;
7964
- setMouseX(session.position.x);
7965
- setMouseY(centerY);
7966
- setFrozenElement(element);
7967
- setInputText(session.context.prompt);
7968
- setIsInputExpanded(true);
7969
- setIsInputMode(true);
7970
- setIsToggleMode(true);
7971
- setIsToggleFrozen(true);
7972
- if (!isActivated()) {
7973
- activateRenderer();
7974
- }
7975
- }
8304
+ restoreInputFromSession(session, element);
8305
+ },
8306
+ onUndo: (session, element) => {
8307
+ newAgentOptions?.onUndo?.(session, element);
8308
+ restoreInputFromSession(session, element);
7976
8309
  }
7977
8310
  };
7978
8311
  agentManager.setOptions(mergedOptions);
7979
8312
  setHasAgentProvider(Boolean(mergedOptions.provider));
8313
+ if (mergedOptions.provider?.checkConnection) {
8314
+ void mergedOptions.provider.checkConnection().then((connected) => {
8315
+ setIsAgentConnected(connected);
8316
+ });
8317
+ }
7980
8318
  agentManager.tryResumeSessions();
7981
8319
  }
7982
8320
  };