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.
@@ -576,6 +576,61 @@ function mapArray(list, mapFn, options = {}) {
576
576
  }
577
577
  };
578
578
  }
579
+ function indexArray(list, mapFn, options = {}) {
580
+ let items = [], mapped = [], disposers = [], signals = [], len = 0, i2;
581
+ onCleanup(() => dispose(disposers));
582
+ return () => {
583
+ const newItems = list() || [], newLen = newItems.length;
584
+ newItems[$TRACK];
585
+ return untrack(() => {
586
+ if (newLen === 0) {
587
+ if (len !== 0) {
588
+ dispose(disposers);
589
+ disposers = [];
590
+ items = [];
591
+ mapped = [];
592
+ len = 0;
593
+ signals = [];
594
+ }
595
+ if (options.fallback) {
596
+ items = [FALLBACK];
597
+ mapped[0] = createRoot((disposer) => {
598
+ disposers[0] = disposer;
599
+ return options.fallback();
600
+ });
601
+ len = 1;
602
+ }
603
+ return mapped;
604
+ }
605
+ if (items[0] === FALLBACK) {
606
+ disposers[0]();
607
+ disposers = [];
608
+ items = [];
609
+ mapped = [];
610
+ len = 0;
611
+ }
612
+ for (i2 = 0; i2 < newLen; i2++) {
613
+ if (i2 < items.length && items[i2] !== newItems[i2]) {
614
+ signals[i2](() => newItems[i2]);
615
+ } else if (i2 >= items.length) {
616
+ mapped[i2] = createRoot(mapper);
617
+ }
618
+ }
619
+ for (; i2 < items.length; i2++) {
620
+ disposers[i2]();
621
+ }
622
+ len = signals.length = disposers.length = newLen;
623
+ items = newItems.slice(0);
624
+ return mapped = mapped.slice(0, len);
625
+ });
626
+ function mapper(disposer) {
627
+ disposers[i2] = disposer;
628
+ const [s3, set] = createSignal(newItems[i2]);
629
+ signals[i2] = set;
630
+ return mapFn(s3, i2);
631
+ }
632
+ };
633
+ }
579
634
  function createComponent(Comp, props) {
580
635
  return untrack(() => Comp(props || {}));
581
636
  }
@@ -586,6 +641,12 @@ function For(props) {
586
641
  };
587
642
  return createMemo(mapArray(() => props.each, props.children, fallback || void 0));
588
643
  }
644
+ function Index(props) {
645
+ const fallback = "fallback" in props && {
646
+ fallback: () => props.fallback
647
+ };
648
+ return createMemo(indexArray(() => props.each, props.children, fallback || void 0));
649
+ }
589
650
  function Show(props) {
590
651
  const keyed = props.keyed;
591
652
  const conditionValue = createMemo(() => props.when, void 0, void 0);
@@ -888,7 +949,7 @@ function cleanChildren(parent, current, marker, replacement) {
888
949
 
889
950
  // dist/styles.css
890
951
  var styles_default = `/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
891
- @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}}`;
952
+ @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}}`;
892
953
 
893
954
  // src/utils/is-keyboard-event-triggered-by-input.ts
894
955
  var FORM_TAGS_AND_ROLES = [
@@ -1017,7 +1078,7 @@ var buildOpenFileUrl = (filePath, lineNumber) => {
1017
1078
  };
1018
1079
 
1019
1080
  // src/constants.ts
1020
- var VERSION = "0.0.71";
1081
+ var VERSION = "0.0.73";
1021
1082
  var VIEWPORT_MARGIN_PX = 8;
1022
1083
  var OFFSCREEN_POSITION = -1e3;
1023
1084
  var SELECTION_LERP_FACTOR = 0.95;
@@ -1025,6 +1086,7 @@ var SUCCESS_LABEL_DURATION_MS = 1700;
1025
1086
  var COPIED_LABEL_DURATION_MS = 1500;
1026
1087
  var SELECTION_CURSOR_SETTLE_DELAY_MS = 500;
1027
1088
  var BLUR_DEACTIVATION_THRESHOLD_MS = 500;
1089
+ var INPUT_FOCUS_ACTIVATION_DELAY_MS = 150;
1028
1090
  var DRAG_THRESHOLD_PX = 2;
1029
1091
  var ELEMENT_DETECTION_THROTTLE_MS = 32;
1030
1092
  var BOUNDS_RECALC_INTERVAL_MS = 100;
@@ -3599,7 +3661,7 @@ var SelectionBox = (props) => {
3599
3661
  get children() {
3600
3662
  var _el$ = _tmpl$();
3601
3663
  createRenderEffect((_p$) => {
3602
- 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;
3664
+ 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;
3603
3665
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
3604
3666
  _v$2 !== _p$.t && setStyleProperty(_el$, "top", _p$.t = _v$2);
3605
3667
  _v$3 !== _p$.a && setStyleProperty(_el$, "left", _p$.a = _v$3);
@@ -3761,7 +3823,7 @@ var useSpeechRecognition = (options) => {
3761
3823
  let baseValue;
3762
3824
  if (lastInterimText && currentValue.endsWith(lastInterimText)) {
3763
3825
  baseValue = currentValue.slice(0, -lastInterimText.length);
3764
- } else if (currentValue === lastValueWeSet) {
3826
+ } else if (currentValue === lastValueWeSet && lastInterimText) {
3765
3827
  baseValue = currentValue.slice(0, -lastInterimText.length);
3766
3828
  } else {
3767
3829
  baseValue = currentValue;
@@ -3858,25 +3920,51 @@ var IconMic = (props) => {
3858
3920
  })();
3859
3921
  };
3860
3922
 
3923
+ // src/components/icon-return.tsx
3924
+ 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>`);
3925
+ var IconReturn = (props) => {
3926
+ const size = () => props.size ?? 12;
3927
+ return (() => {
3928
+ var _el$ = _tmpl$5();
3929
+ createRenderEffect((_p$) => {
3930
+ var _v$ = size(), _v$2 = size() * 19 / 22, _v$3 = props.class;
3931
+ _v$ !== _p$.e && setAttribute(_el$, "width", _p$.e = _v$);
3932
+ _v$2 !== _p$.t && setAttribute(_el$, "height", _p$.t = _v$2);
3933
+ _v$3 !== _p$.a && setAttribute(_el$, "class", _p$.a = _v$3);
3934
+ return _p$;
3935
+ }, {
3936
+ e: void 0,
3937
+ t: void 0,
3938
+ a: void 0
3939
+ });
3940
+ return _el$;
3941
+ })();
3942
+ };
3943
+
3861
3944
  // src/components/selection-label.tsx
3862
- 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>`);
3945
+ 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>`);
3863
3946
  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">`);
3864
3947
  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;`);
3865
3948
  var _tmpl$42 = /* @__PURE__ */ template(`<div class="absolute w-0 h-0"style="border-left:8px solid transparent;border-right:8px solid transparent">`);
3866
3949
  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">`);
3867
- 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%)">`);
3868
- 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">`);
3869
- 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">`);
3870
- 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>`);
3871
- 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">`);
3872
- var _tmpl$1 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-px w-fit h-fit">`);
3873
- 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`);
3874
- 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>`);
3875
- var _tmpl$12 = /* @__PURE__ */ template(`<button>`);
3876
- 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)>`);
3877
- 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">`);
3878
- 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>`);
3879
- 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">`);
3950
+ 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%)">`);
3951
+ 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`);
3952
+ 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?`);
3953
+ 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`);
3954
+ 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`);
3955
+ var _tmpl$1 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center justify-end gap-[5px] w-full h-fit">`);
3956
+ 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">`);
3957
+ 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">`);
3958
+ 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>`);
3959
+ 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">`);
3960
+ var _tmpl$14 = /* @__PURE__ */ template(`<div class="contain-layout shrink-0 flex items-center gap-px w-fit h-fit">`);
3961
+ 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`);
3962
+ 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>`);
3963
+ var _tmpl$17 = /* @__PURE__ */ template(`<button>`);
3964
+ 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">`);
3965
+ 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">`);
3966
+ 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>`);
3967
+ 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">`);
3880
3968
  var ARROW_HEIGHT = 8;
3881
3969
  var LABEL_GAP = 4;
3882
3970
  var IDLE_TIMEOUT_MS = 400;
@@ -3891,7 +3979,7 @@ var TagBadge = (props) => {
3891
3979
  props.onHoverChange?.(false);
3892
3980
  };
3893
3981
  return (() => {
3894
- var _el$ = _tmpl$5(), _el$2 = _el$.firstChild;
3982
+ var _el$ = _tmpl$6(), _el$2 = _el$.firstChild;
3895
3983
  addEventListener(_el$, "click", props.onClick);
3896
3984
  _el$.addEventListener("mouseleave", handleMouseLeave);
3897
3985
  _el$.addEventListener("mouseenter", handleMouseEnter);
@@ -3964,19 +4052,61 @@ var ClickToCopyPill = (props) => {
3964
4052
  })();
3965
4053
  };
3966
4054
  var BottomSection = (props) => (() => {
3967
- var _el$9 = _tmpl$6();
4055
+ var _el$9 = _tmpl$62();
3968
4056
  insert(_el$9, () => props.children);
3969
4057
  return _el$9;
3970
4058
  })();
4059
+ var DismissConfirmation = (props) => {
4060
+ const handleKeyDown = (event) => {
4061
+ if (event.code === "Enter") {
4062
+ event.preventDefault();
4063
+ event.stopPropagation();
4064
+ props.onConfirm?.();
4065
+ } else if (event.code === "Escape") {
4066
+ event.preventDefault();
4067
+ event.stopPropagation();
4068
+ props.onCancel?.();
4069
+ }
4070
+ };
4071
+ onMount(() => {
4072
+ window.addEventListener("keydown", handleKeyDown, {
4073
+ capture: true
4074
+ });
4075
+ });
4076
+ onCleanup(() => {
4077
+ window.removeEventListener("keydown", handleKeyDown, {
4078
+ capture: true
4079
+ });
4080
+ });
4081
+ return (() => {
4082
+ var _el$0 = _tmpl$8(); _el$0.firstChild;
4083
+ insert(_el$0, createComponent(BottomSection, {
4084
+ get children() {
4085
+ var _el$10 = _tmpl$7(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling; _el$12.firstChild;
4086
+ addEventListener(_el$11, "click", props.onCancel);
4087
+ addEventListener(_el$12, "click", props.onConfirm);
4088
+ insert(_el$12, createComponent(IconReturn, {
4089
+ size: 10,
4090
+ "class": "text-[#c00002]"
4091
+ }), null);
4092
+ return _el$10;
4093
+ }
4094
+ }), null);
4095
+ return _el$0;
4096
+ })();
4097
+ };
3971
4098
  var SelectionLabel = (props) => {
3972
4099
  let containerRef;
3973
4100
  let inputRef;
3974
4101
  let isTagCurrentlyHovered = false;
4102
+ let lastValidPosition = null;
4103
+ let lastElementIdentity = null;
3975
4104
  const [measuredWidth, setMeasuredWidth] = createSignal(0);
3976
4105
  const [measuredHeight, setMeasuredHeight] = createSignal(0);
3977
4106
  const [arrowPosition, setArrowPosition] = createSignal("bottom");
3978
4107
  const [viewportVersion, setViewportVersion] = createSignal(0);
3979
4108
  const [isIdle, setIsIdle] = createSignal(false);
4109
+ const [hadValidBounds, setHadValidBounds] = createSignal(false);
3980
4110
  const speechRecognition = useSpeechRecognition({
3981
4111
  onTranscript: (transcript) => props.onInputChange?.(transcript),
3982
4112
  getCurrentValue: () => props.inputValue ?? ""
@@ -4033,8 +4163,11 @@ var SelectionLabel = (props) => {
4033
4163
  }
4034
4164
  });
4035
4165
  createEffect(() => {
4036
- void props.selectionBounds;
4037
- resetIdleTimer();
4166
+ const elementIdentity = `${props.tagName ?? ""}:${props.componentName ?? ""}`;
4167
+ if (elementIdentity !== lastElementIdentity) {
4168
+ lastElementIdentity = elementIdentity;
4169
+ resetIdleTimer();
4170
+ }
4038
4171
  });
4039
4172
  createEffect(() => {
4040
4173
  if (props.visible) {
@@ -4059,8 +4192,10 @@ var SelectionLabel = (props) => {
4059
4192
  const bounds = props.selectionBounds;
4060
4193
  const labelWidth = measuredWidth();
4061
4194
  const labelHeight = measuredHeight();
4062
- if (!bounds || labelWidth === 0 || labelHeight === 0) {
4063
- return {
4195
+ const hasMeasurements = labelWidth > 0 && labelHeight > 0;
4196
+ const hasValidBounds = bounds && bounds.width > 0 && bounds.height > 0;
4197
+ if (!hasMeasurements || !hasValidBounds) {
4198
+ return lastValidPosition ?? {
4064
4199
  left: -9999,
4065
4200
  top: -9999,
4066
4201
  arrowLeft: 0
@@ -4092,11 +4227,14 @@ var SelectionLabel = (props) => {
4092
4227
  positionTop = VIEWPORT_MARGIN_PX;
4093
4228
  }
4094
4229
  const arrowLeft = Math.max(12, Math.min(cursorX - positionLeft, labelWidth - 12));
4095
- return {
4230
+ const position = {
4096
4231
  left: positionLeft,
4097
4232
  top: positionTop,
4098
4233
  arrowLeft
4099
4234
  };
4235
+ lastValidPosition = position;
4236
+ setHadValidBounds(true);
4237
+ return position;
4100
4238
  };
4101
4239
  const handleKeyDown = (event) => {
4102
4240
  event.stopPropagation();
@@ -4129,85 +4267,129 @@ var SelectionLabel = (props) => {
4129
4267
  event.stopPropagation();
4130
4268
  event.stopImmediatePropagation();
4131
4269
  };
4270
+ const handleContainerPointerDown = (event) => {
4271
+ stopPropagation(event);
4272
+ const isEditableInputVisible = isNotProcessing() && props.isInputExpanded && !props.isPendingDismiss;
4273
+ if (isEditableInputVisible && inputRef) {
4274
+ inputRef.focus();
4275
+ }
4276
+ };
4132
4277
  const handleSubmit = () => {
4133
4278
  if (props.isInputExpanded && !props.inputValue?.trim()) return;
4134
4279
  speechRecognition.stop();
4135
4280
  props.onSubmit?.();
4136
4281
  };
4282
+ const shouldShowWithoutBounds = () => hadValidBounds() && (props.status === "copied" || props.status === "fading");
4137
4283
  return createComponent(Show, {
4138
4284
  get when() {
4139
- return memo(() => props.visible !== false)() && props.selectionBounds;
4285
+ return memo(() => props.visible !== false)() && (props.selectionBounds || shouldShowWithoutBounds());
4140
4286
  },
4141
4287
  get children() {
4142
- var _el$0 = _tmpl$16(), _el$12 = _el$0.firstChild;
4143
- _el$0.$$click = stopPropagation;
4144
- _el$0.$$mousedown = stopPropagation;
4145
- _el$0.$$pointerdown = stopPropagation;
4288
+ var _el$14 = _tmpl$21(), _el$21 = _el$14.firstChild;
4289
+ _el$14.$$click = stopPropagation;
4290
+ _el$14.$$mousedown = stopPropagation;
4291
+ _el$14.$$pointerdown = handleContainerPointerDown;
4146
4292
  var _ref$ = containerRef;
4147
- typeof _ref$ === "function" ? use(_ref$, _el$0) : containerRef = _el$0;
4148
- insert(_el$0, createComponent(Arrow, {
4293
+ typeof _ref$ === "function" ? use(_ref$, _el$14) : containerRef = _el$14;
4294
+ insert(_el$14, createComponent(Arrow, {
4149
4295
  get position() {
4150
4296
  return arrowPosition();
4151
4297
  },
4152
4298
  get leftPx() {
4153
4299
  return computedPosition().arrowLeft;
4154
4300
  }
4155
- }), _el$12);
4156
- insert(_el$0, createComponent(Show, {
4301
+ }), _el$21);
4302
+ insert(_el$14, createComponent(Show, {
4157
4303
  get when() {
4158
4304
  return props.status === "copied" || props.status === "fading";
4159
4305
  },
4160
4306
  get children() {
4161
- var _el$1 = _tmpl$7(), _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild;
4162
- insert(_el$11, () => props.hasAgent ? "Completed" : "Copied");
4163
- return _el$1;
4307
+ var _el$15 = _tmpl$10(), _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild;
4308
+ insert(_el$17, (() => {
4309
+ var _c$ = memo(() => !!props.hasAgent);
4310
+ return () => _c$() ? props.statusText ?? "Completed" : "Copied";
4311
+ })());
4312
+ insert(_el$15, createComponent(Show, {
4313
+ get when() {
4314
+ return props.onDismiss || props.onUndo;
4315
+ },
4316
+ get children() {
4317
+ return createComponent(BottomSection, {
4318
+ get children() {
4319
+ var _el$18 = _tmpl$1();
4320
+ insert(_el$18, createComponent(Show, {
4321
+ get when() {
4322
+ return props.onUndo;
4323
+ },
4324
+ get children() {
4325
+ var _el$19 = _tmpl$9();
4326
+ _el$19.$$click = () => props.onUndo?.();
4327
+ return _el$19;
4328
+ }
4329
+ }), null);
4330
+ insert(_el$18, createComponent(Show, {
4331
+ get when() {
4332
+ return props.onDismiss;
4333
+ },
4334
+ get children() {
4335
+ var _el$20 = _tmpl$0();
4336
+ _el$20.$$click = () => props.onDismiss?.();
4337
+ return _el$20;
4338
+ }
4339
+ }), null);
4340
+ return _el$18;
4341
+ }
4342
+ });
4343
+ }
4344
+ }), null);
4345
+ return _el$15;
4164
4346
  }
4165
- }), _el$12);
4166
- insert(_el$12, createComponent(Show, {
4347
+ }), _el$21);
4348
+ insert(_el$21, createComponent(Show, {
4167
4349
  get when() {
4168
4350
  return props.status === "copying";
4169
4351
  },
4170
4352
  get children() {
4171
- var _el$13 = _tmpl$0(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
4172
- insert(_el$16, () => props.statusText ?? "Grabbing\u2026");
4173
- insert(_el$13, createComponent(BottomSection, {
4353
+ var _el$22 = _tmpl$13(), _el$23 = _el$22.firstChild, _el$24 = _el$23.firstChild, _el$25 = _el$24.firstChild;
4354
+ insert(_el$25, () => props.statusText ?? "Grabbing\u2026");
4355
+ insert(_el$22, createComponent(BottomSection, {
4174
4356
  get children() {
4175
- var _el$17 = _tmpl$9(), _el$18 = _el$17.firstChild;
4357
+ var _el$26 = _tmpl$12(), _el$27 = _el$26.firstChild;
4176
4358
  var _ref$2 = inputRef;
4177
- typeof _ref$2 === "function" ? use(_ref$2, _el$18) : inputRef = _el$18;
4178
- insert(_el$17, createComponent(Show, {
4359
+ typeof _ref$2 === "function" ? use(_ref$2, _el$27) : inputRef = _el$27;
4360
+ insert(_el$26, createComponent(Show, {
4179
4361
  get when() {
4180
4362
  return props.onAbort;
4181
4363
  },
4182
4364
  get children() {
4183
- var _el$19 = _tmpl$8();
4184
- _el$19.$$click = (event) => {
4365
+ var _el$28 = _tmpl$11();
4366
+ _el$28.$$click = (event) => {
4185
4367
  event.stopPropagation();
4186
4368
  props.onAbort?.();
4187
4369
  };
4188
- _el$19.$$pointerup = (event) => {
4370
+ _el$28.$$pointerup = (event) => {
4189
4371
  event.stopPropagation();
4190
4372
  props.onAbort?.();
4191
4373
  };
4192
- _el$19.$$mousedown = (event) => event.stopPropagation();
4193
- _el$19.$$pointerdown = (event) => event.stopPropagation();
4194
- return _el$19;
4374
+ _el$28.$$mousedown = (event) => event.stopPropagation();
4375
+ _el$28.$$pointerdown = (event) => event.stopPropagation();
4376
+ return _el$28;
4195
4377
  }
4196
4378
  }), null);
4197
- createRenderEffect(() => _el$18.value = props.inputValue ?? "");
4198
- return _el$17;
4379
+ createRenderEffect(() => _el$27.value = props.inputValue ?? "");
4380
+ return _el$26;
4199
4381
  }
4200
4382
  }), null);
4201
- return _el$13;
4383
+ return _el$22;
4202
4384
  }
4203
4385
  }), null);
4204
- insert(_el$12, createComponent(Show, {
4386
+ insert(_el$21, createComponent(Show, {
4205
4387
  get when() {
4206
4388
  return memo(() => !!isNotProcessing())() && !props.isInputExpanded;
4207
4389
  },
4208
4390
  get children() {
4209
- var _el$20 = _tmpl$11(), _el$21 = _el$20.firstChild, _el$23 = _el$21.nextSibling, _el$24 = _el$23.firstChild;
4210
- insert(_el$21, createComponent(ClickToCopyPill, {
4391
+ var _el$29 = _tmpl$16(), _el$30 = _el$29.firstChild, _el$32 = _el$30.nextSibling, _el$33 = _el$32.firstChild;
4392
+ insert(_el$30, createComponent(ClickToCopyPill, {
4211
4393
  onClick: handleSubmit,
4212
4394
  shrink: true,
4213
4395
  get hasParent() {
@@ -4217,19 +4399,19 @@ var SelectionLabel = (props) => {
4217
4399
  return props.hasAgent;
4218
4400
  }
4219
4401
  }), null);
4220
- insert(_el$21, createComponent(Show, {
4402
+ insert(_el$30, createComponent(Show, {
4221
4403
  get when() {
4222
4404
  return props.componentName;
4223
4405
  },
4224
4406
  get children() {
4225
- var _el$22 = _tmpl$1();
4226
- insert(_el$22, createComponent(ParentBadge, {
4407
+ var _el$31 = _tmpl$14();
4408
+ insert(_el$31, createComponent(ParentBadge, {
4227
4409
  get name() {
4228
4410
  return props.componentName;
4229
4411
  }
4230
4412
  }), null);
4231
- insert(_el$22, createComponent(ChevronSeparator, {}), null);
4232
- insert(_el$22, createComponent(TagBadge, {
4413
+ insert(_el$31, createComponent(ChevronSeparator, {}), null);
4414
+ insert(_el$31, createComponent(TagBadge, {
4233
4415
  get tagName() {
4234
4416
  return tagDisplay();
4235
4417
  },
@@ -4241,10 +4423,10 @@ var SelectionLabel = (props) => {
4241
4423
  showMono: true,
4242
4424
  shrink: true
4243
4425
  }), null);
4244
- return _el$22;
4426
+ return _el$31;
4245
4427
  }
4246
4428
  }), null);
4247
- insert(_el$21, createComponent(Show, {
4429
+ insert(_el$30, createComponent(Show, {
4248
4430
  get when() {
4249
4431
  return !props.componentName;
4250
4432
  },
@@ -4263,33 +4445,37 @@ var SelectionLabel = (props) => {
4263
4445
  });
4264
4446
  }
4265
4447
  }), null);
4266
- insert(_el$24, createComponent(BottomSection, {
4448
+ insert(_el$33, createComponent(BottomSection, {
4267
4449
  get children() {
4268
- var _el$25 = _tmpl$10(), _el$26 = _el$25.firstChild, _el$27 = _el$26.nextSibling; _el$27.firstChild;
4269
- return _el$25;
4450
+ var _el$34 = _tmpl$15(), _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling;
4451
+ insert(_el$36, createComponent(IconReturn, {
4452
+ size: 10,
4453
+ "class": "opacity-[0.99] text-black"
4454
+ }));
4455
+ return _el$34;
4270
4456
  }
4271
4457
  }));
4272
4458
  createRenderEffect((_p$) => {
4273
4459
  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");
4274
- _v$3 !== _p$.e && className(_el$21, _p$.e = _v$3);
4275
- _v$4 !== _p$.t && setStyleProperty(_el$23, "grid-template-rows", _p$.t = _v$4);
4276
- _v$5 !== _p$.a && className(_el$24, _p$.a = _v$5);
4460
+ _v$3 !== _p$.e && className(_el$30, _p$.e = _v$3);
4461
+ _v$4 !== _p$.t && setStyleProperty(_el$32, "grid-template-rows", _p$.t = _v$4);
4462
+ _v$5 !== _p$.a && className(_el$33, _p$.a = _v$5);
4277
4463
  return _p$;
4278
4464
  }, {
4279
4465
  e: void 0,
4280
4466
  t: void 0,
4281
4467
  a: void 0
4282
4468
  });
4283
- return _el$20;
4469
+ return _el$29;
4284
4470
  }
4285
4471
  }), null);
4286
- insert(_el$12, createComponent(Show, {
4472
+ insert(_el$21, createComponent(Show, {
4287
4473
  get when() {
4288
- return memo(() => !!isNotProcessing())() && props.isInputExpanded;
4474
+ return memo(() => !!(isNotProcessing() && props.isInputExpanded))() && !props.isPendingDismiss;
4289
4475
  },
4290
4476
  get children() {
4291
- var _el$29 = _tmpl$15(), _el$30 = _el$29.firstChild;
4292
- insert(_el$30, createComponent(ClickToCopyPill, {
4477
+ var _el$37 = _tmpl$20(), _el$38 = _el$37.firstChild;
4478
+ insert(_el$38, createComponent(ClickToCopyPill, {
4293
4479
  onClick: handleSubmit,
4294
4480
  dimmed: true,
4295
4481
  shrink: true,
@@ -4300,19 +4486,19 @@ var SelectionLabel = (props) => {
4300
4486
  return props.hasAgent;
4301
4487
  }
4302
4488
  }), null);
4303
- insert(_el$30, createComponent(Show, {
4489
+ insert(_el$38, createComponent(Show, {
4304
4490
  get when() {
4305
4491
  return props.componentName;
4306
4492
  },
4307
4493
  get children() {
4308
- var _el$31 = _tmpl$1();
4309
- insert(_el$31, createComponent(ParentBadge, {
4494
+ var _el$39 = _tmpl$14();
4495
+ insert(_el$39, createComponent(ParentBadge, {
4310
4496
  get name() {
4311
4497
  return props.componentName;
4312
4498
  }
4313
4499
  }), null);
4314
- insert(_el$31, createComponent(ChevronSeparator, {}), null);
4315
- insert(_el$31, createComponent(TagBadge, {
4500
+ insert(_el$39, createComponent(ChevronSeparator, {}), null);
4501
+ insert(_el$39, createComponent(TagBadge, {
4316
4502
  get tagName() {
4317
4503
  return tagDisplay();
4318
4504
  },
@@ -4325,10 +4511,10 @@ var SelectionLabel = (props) => {
4325
4511
  shrink: true,
4326
4512
  forceShowIcon: true
4327
4513
  }), null);
4328
- return _el$31;
4514
+ return _el$39;
4329
4515
  }
4330
4516
  }), null);
4331
- insert(_el$30, createComponent(Show, {
4517
+ insert(_el$38, createComponent(Show, {
4332
4518
  get when() {
4333
4519
  return !props.componentName;
4334
4520
  },
@@ -4348,21 +4534,21 @@ var SelectionLabel = (props) => {
4348
4534
  });
4349
4535
  }
4350
4536
  }), null);
4351
- insert(_el$29, createComponent(BottomSection, {
4537
+ insert(_el$37, createComponent(BottomSection, {
4352
4538
  get children() {
4353
- var _el$32 = _tmpl$14(), _el$33 = _el$32.firstChild, _el$34 = _el$33.nextSibling;
4354
- _el$33.$$keydown = handleKeyDown;
4355
- _el$33.$$input = handleInput;
4539
+ var _el$40 = _tmpl$19(), _el$41 = _el$40.firstChild, _el$42 = _el$41.nextSibling;
4540
+ _el$41.$$keydown = handleKeyDown;
4541
+ _el$41.$$input = handleInput;
4356
4542
  var _ref$3 = inputRef;
4357
- typeof _ref$3 === "function" ? use(_ref$3, _el$33) : inputRef = _el$33;
4358
- insert(_el$34, createComponent(Show, {
4543
+ typeof _ref$3 === "function" ? use(_ref$3, _el$41) : inputRef = _el$41;
4544
+ insert(_el$42, createComponent(Show, {
4359
4545
  get when() {
4360
4546
  return memo(() => !!(props.hasAgent && speechRecognition.isSupported()))() && !props.inputValue;
4361
4547
  },
4362
4548
  get children() {
4363
- var _el$35 = _tmpl$12();
4364
- addEventListener(_el$35, "click", speechRecognition.toggle);
4365
- insert(_el$35, createComponent(IconMic, {
4549
+ var _el$43 = _tmpl$17();
4550
+ addEventListener(_el$43, "click", speechRecognition.toggle);
4551
+ insert(_el$43, createComponent(IconMic, {
4366
4552
  size: 11,
4367
4553
  get ["class"]() {
4368
4554
  return speechRecognition.isListening() ? "animate-pulse" : "";
@@ -4370,42 +4556,61 @@ var SelectionLabel = (props) => {
4370
4556
  }));
4371
4557
  createRenderEffect((_p$) => {
4372
4558
  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";
4373
- _v$6 !== _p$.e && className(_el$35, _p$.e = _v$6);
4374
- _v$7 !== _p$.t && setAttribute(_el$35, "title", _p$.t = _v$7);
4559
+ _v$6 !== _p$.e && className(_el$43, _p$.e = _v$6);
4560
+ _v$7 !== _p$.t && setAttribute(_el$43, "title", _p$.t = _v$7);
4375
4561
  return _p$;
4376
4562
  }, {
4377
4563
  e: void 0,
4378
4564
  t: void 0
4379
4565
  });
4380
- return _el$35;
4566
+ return _el$43;
4381
4567
  }
4382
4568
  }), null);
4383
- insert(_el$34, createComponent(Show, {
4569
+ insert(_el$42, createComponent(Show, {
4384
4570
  get when() {
4385
4571
  return props.inputValue;
4386
4572
  },
4387
4573
  get children() {
4388
- var _el$36 = _tmpl$13(); _el$36.firstChild;
4389
- _el$36.$$click = handleSubmit;
4390
- return _el$36;
4574
+ var _el$44 = _tmpl$18();
4575
+ _el$44.$$click = handleSubmit;
4576
+ insert(_el$44, createComponent(IconReturn, {
4577
+ size: 10,
4578
+ "class": "opacity-[0.99] text-black"
4579
+ }));
4580
+ return _el$44;
4391
4581
  }
4392
4582
  }), null);
4393
- createRenderEffect(() => setAttribute(_el$33, "placeholder", speechRecognition.isListening() ? "listening..." : props.hasAgent ? "type to edit" : "type prompt"));
4394
- createRenderEffect(() => _el$33.value = props.inputValue ?? "");
4395
- return _el$32;
4583
+ createRenderEffect(() => setAttribute(_el$41, "placeholder", speechRecognition.isListening() ? "listening..." : props.hasAgent && props.isAgentConnected ? "type to edit" : "type prompt"));
4584
+ createRenderEffect(() => _el$41.value = props.inputValue ?? "");
4585
+ return _el$40;
4396
4586
  }
4397
4587
  }), null);
4398
- 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")));
4399
- return _el$29;
4588
+ 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")));
4589
+ return _el$37;
4590
+ }
4591
+ }), null);
4592
+ insert(_el$21, createComponent(Show, {
4593
+ get when() {
4594
+ return props.isPendingDismiss;
4595
+ },
4596
+ get children() {
4597
+ return createComponent(DismissConfirmation, {
4598
+ get onConfirm() {
4599
+ return props.onConfirmDismiss;
4600
+ },
4601
+ get onCancel() {
4602
+ return props.onCancelDismiss;
4603
+ }
4604
+ });
4400
4605
  }
4401
4606
  }), null);
4402
4607
  createRenderEffect((_p$) => {
4403
- 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;
4404
- _v$8 !== _p$.e && setStyleProperty(_el$0, "top", _p$.e = _v$8);
4405
- _v$9 !== _p$.t && setStyleProperty(_el$0, "left", _p$.t = _v$9);
4406
- _v$0 !== _p$.a && setStyleProperty(_el$0, "pointer-events", _p$.a = _v$0);
4407
- _v$1 !== _p$.o && setStyleProperty(_el$0, "opacity", _p$.o = _v$1);
4408
- _v$10 !== _p$.i && setStyleProperty(_el$12, "display", _p$.i = _v$10);
4608
+ 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;
4609
+ _v$8 !== _p$.e && setStyleProperty(_el$14, "top", _p$.e = _v$8);
4610
+ _v$9 !== _p$.t && setStyleProperty(_el$14, "left", _p$.t = _v$9);
4611
+ _v$0 !== _p$.a && setStyleProperty(_el$14, "pointer-events", _p$.a = _v$0);
4612
+ _v$1 !== _p$.o && setStyleProperty(_el$14, "opacity", _p$.o = _v$1);
4613
+ _v$10 !== _p$.i && setStyleProperty(_el$21, "display", _p$.i = _v$10);
4409
4614
  return _p$;
4410
4615
  }, {
4411
4616
  e: void 0,
@@ -4414,14 +4619,14 @@ var SelectionLabel = (props) => {
4414
4619
  o: void 0,
4415
4620
  i: void 0
4416
4621
  });
4417
- return _el$0;
4622
+ return _el$14;
4418
4623
  }
4419
4624
  });
4420
4625
  };
4421
4626
  delegateEvents(["click", "pointerdown", "mousedown", "pointerup", "input", "keydown"]);
4422
4627
 
4423
4628
  // src/components/selection-cursor.tsx
4424
- var _tmpl$17 = /* @__PURE__ */ template(`<div class="fixed z-2147483647"><button data-react-grab-selection-cursor>`);
4629
+ var _tmpl$23 = /* @__PURE__ */ template(`<div class="fixed z-2147483647"><button data-react-grab-selection-cursor>`);
4425
4630
  var SelectionCursor = (props) => {
4426
4631
  const [isHovered, setIsHovered] = createSignal(false);
4427
4632
  const [debouncedVisible, setDebouncedVisible] = createSignal(false);
@@ -4458,7 +4663,7 @@ var SelectionCursor = (props) => {
4458
4663
  });
4459
4664
  }
4460
4665
  }), (() => {
4461
- var _el$ = _tmpl$17(), _el$2 = _el$.firstChild;
4666
+ var _el$ = _tmpl$23(), _el$2 = _el$.firstChild;
4462
4667
  _el$.addEventListener("mouseleave", () => setIsHovered(false));
4463
4668
  _el$.addEventListener("mouseenter", () => setIsHovered(true));
4464
4669
  _el$2.$$click = handleClick;
@@ -4503,6 +4708,7 @@ delegateEvents(["click"]);
4503
4708
 
4504
4709
  // src/components/renderer.tsx
4505
4710
  var ReactGrabRenderer = (props) => {
4711
+ const agentSessionsList = createMemo(() => props.agentSessions ? Array.from(props.agentSessions.values()) : []);
4506
4712
  return [createComponent(Show, {
4507
4713
  get when() {
4508
4714
  return memo(() => !!props.selectionVisible)() && props.selectionBounds;
@@ -4564,51 +4770,58 @@ var ReactGrabRenderer = (props) => {
4564
4770
  return box.createdAt;
4565
4771
  }
4566
4772
  })
4567
- }), createComponent(For, {
4773
+ }), createComponent(Index, {
4568
4774
  get each() {
4569
- return memo(() => !!props.agentSessions)() ? Array.from(props.agentSessions.values()) : [];
4775
+ return agentSessionsList();
4570
4776
  },
4571
4777
  children: (session) => [createComponent(Show, {
4572
4778
  get when() {
4573
- return session.selectionBounds;
4779
+ return session().selectionBounds;
4574
4780
  },
4575
4781
  get children() {
4576
4782
  return createComponent(SelectionBox, {
4577
4783
  variant: "processing",
4578
4784
  get bounds() {
4579
- return session.selectionBounds;
4785
+ return session().selectionBounds;
4580
4786
  },
4581
4787
  visible: true,
4582
4788
  get isCompleted() {
4583
- return !session.isStreaming;
4789
+ return !session().isStreaming;
4584
4790
  }
4585
4791
  });
4586
4792
  }
4587
4793
  }), createComponent(SelectionLabel, {
4588
4794
  get tagName() {
4589
- return session.tagName;
4795
+ return session().tagName;
4590
4796
  },
4591
4797
  get componentName() {
4592
- return session.componentName;
4798
+ return session().componentName;
4593
4799
  },
4594
4800
  get selectionBounds() {
4595
- return session.selectionBounds;
4801
+ return session().selectionBounds;
4596
4802
  },
4597
4803
  get mouseX() {
4598
- return session.position.x;
4804
+ return session().position.x;
4599
4805
  },
4600
4806
  visible: true,
4601
4807
  hasAgent: true,
4808
+ isAgentConnected: true,
4602
4809
  get status() {
4603
- return session.isStreaming ? "copying" : "copied";
4810
+ return session().isStreaming ? "copying" : "copied";
4604
4811
  },
4605
4812
  get statusText() {
4606
- return session.lastStatus || "Thinking\u2026";
4813
+ return session().lastStatus || "Thinking\u2026";
4607
4814
  },
4608
4815
  get inputValue() {
4609
- return session.context.prompt;
4816
+ return session().context.prompt;
4817
+ },
4818
+ onAbort: () => props.onAbortSession?.(session().id),
4819
+ get onDismiss() {
4820
+ return session().isStreaming ? void 0 : () => props.onDismissSession?.(session().id);
4610
4821
  },
4611
- onAbort: () => props.onAbortSession?.(session.id)
4822
+ get onUndo() {
4823
+ return session().isStreaming ? void 0 : () => props.onUndoSession?.(session().id);
4824
+ }
4612
4825
  })]
4613
4826
  }), createComponent(Show, {
4614
4827
  get when() {
@@ -4640,6 +4853,9 @@ var ReactGrabRenderer = (props) => {
4640
4853
  get hasAgent() {
4641
4854
  return props.hasAgent;
4642
4855
  },
4856
+ get isAgentConnected() {
4857
+ return props.isAgentConnected;
4858
+ },
4643
4859
  get status() {
4644
4860
  return props.selectionLabelStatus;
4645
4861
  },
@@ -4661,6 +4877,15 @@ var ReactGrabRenderer = (props) => {
4661
4877
  get onToggleExpand() {
4662
4878
  return props.onToggleExpand;
4663
4879
  },
4880
+ get isPendingDismiss() {
4881
+ return props.isPendingDismiss;
4882
+ },
4883
+ get onConfirmDismiss() {
4884
+ return props.onConfirmDismiss;
4885
+ },
4886
+ get onCancelDismiss() {
4887
+ return props.onCancelDismiss;
4888
+ },
4664
4889
  onOpen: () => {
4665
4890
  if (props.selectionFilePath) {
4666
4891
  const openFileUrl = buildOpenFileUrl(props.selectionFilePath, props.selectionLineNumber);
@@ -4726,7 +4951,7 @@ var ReactGrabRenderer = (props) => {
4726
4951
  })];
4727
4952
  };
4728
4953
 
4729
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/rdt-hook-7WClMTWh.js
4954
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/rdt-hook-7WClMTWh.js
4730
4955
  var e = `0.5.25`;
4731
4956
  var t = `bippy-${e}`;
4732
4957
  var n = Object.defineProperty;
@@ -4814,7 +5039,7 @@ var _ = () => {
4814
5039
  }
4815
5040
  };
4816
5041
 
4817
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/core-CoV0JPOT.js
5042
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/core-CoV0JPOT.js
4818
5043
  var a2 = 0;
4819
5044
  var o2 = 1;
4820
5045
  var c2 = 5;
@@ -4902,7 +5127,7 @@ var Pe = (e2) => {
4902
5127
  return null;
4903
5128
  };
4904
5129
 
4905
- // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.2_react@19.2.1/node_modules/bippy/dist/source.js
5130
+ // ../../node_modules/.pnpm/bippy@0.5.25_@types+react@19.2.7_react@19.2.1/node_modules/bippy/dist/source.js
4906
5131
  var g2 = Object.create;
4907
5132
  var _2 = Object.defineProperty;
4908
5133
  var v = Object.getOwnPropertyDescriptor;
@@ -5544,7 +5769,7 @@ var je = (e2) => {
5544
5769
  // src/utils/is-capitalized.ts
5545
5770
  var isCapitalized = (value) => value.length > 0 && /^[A-Z]/.test(value);
5546
5771
 
5547
- // ../../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
5772
+ // ../../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
5548
5773
  _();
5549
5774
 
5550
5775
  // src/context.ts
@@ -5707,11 +5932,12 @@ var getHTMLPreview = (element) => {
5707
5932
 
5708
5933
  // src/utils/copy-content.ts
5709
5934
  var REACT_GRAB_MIME_TYPE = "application/x-react-grab";
5710
- var copyContent = (content, onSuccess) => {
5935
+ var copyContent = (content, options) => {
5711
5936
  const metadata = JSON.stringify({
5712
5937
  version: VERSION,
5713
5938
  content,
5714
- timestamp: Date.now()
5939
+ timestamp: Date.now(),
5940
+ ...options?.prompt && { prompt: options.prompt }
5715
5941
  });
5716
5942
  const copyHandler = (event) => {
5717
5943
  event.preventDefault();
@@ -5729,7 +5955,7 @@ var copyContent = (content, onSuccess) => {
5729
5955
  try {
5730
5956
  const didCopySucceed = document.execCommand("copy");
5731
5957
  if (didCopySucceed) {
5732
- onSuccess?.();
5958
+ options?.onSuccess?.();
5733
5959
  }
5734
5960
  return didCopySucceed;
5735
5961
  } finally {
@@ -6183,9 +6409,7 @@ var createAgentManager = (initialAgentOptions) => {
6183
6409
  const isProcessing = () => sessions().size > 0;
6184
6410
  const executeSessionStream = async (session, streamIterator) => {
6185
6411
  const storage = agentOptions?.storage;
6186
- let didComplete = false;
6187
6412
  let wasAborted = false;
6188
- let hadError = false;
6189
6413
  try {
6190
6414
  for await (const status of streamIterator) {
6191
6415
  const currentSessions = sessions();
@@ -6199,17 +6423,21 @@ var createAgentManager = (initialAgentOptions) => {
6199
6423
  setSessions((prev) => new Map(prev).set(session.id, updatedSession));
6200
6424
  agentOptions?.onStatus?.(status, updatedSession);
6201
6425
  }
6202
- didComplete = true;
6203
6426
  const finalSessions = sessions();
6204
6427
  const finalSession = finalSessions.get(session.id);
6205
6428
  if (finalSession) {
6429
+ const completionMessage = agentOptions?.provider?.getCompletionMessage?.();
6206
6430
  const completedSession = updateSession(
6207
6431
  finalSession,
6208
- { isStreaming: false },
6432
+ {
6433
+ isStreaming: false,
6434
+ ...completionMessage ? { lastStatus: completionMessage } : {}
6435
+ },
6209
6436
  storage
6210
6437
  );
6211
6438
  setSessions((prev) => new Map(prev).set(session.id, completedSession));
6212
- agentOptions?.onComplete?.(completedSession);
6439
+ const element = sessionElements.get(session.id);
6440
+ agentOptions?.onComplete?.(completedSession, element);
6213
6441
  }
6214
6442
  } catch (error) {
6215
6443
  const currentSessions = sessions();
@@ -6236,7 +6464,6 @@ var createAgentManager = (initialAgentOptions) => {
6236
6464
  setSessions((prev) => new Map(prev).set(session.id, errorSession));
6237
6465
  }
6238
6466
  } else {
6239
- hadError = true;
6240
6467
  if (currentSession) {
6241
6468
  const errorSession = updateSession(
6242
6469
  currentSession,
@@ -6255,7 +6482,7 @@ var createAgentManager = (initialAgentOptions) => {
6255
6482
  }
6256
6483
  } finally {
6257
6484
  abortControllers.delete(session.id);
6258
- const removeSession = () => {
6485
+ if (wasAborted) {
6259
6486
  sessionElements.delete(session.id);
6260
6487
  clearSessionById(session.id, storage);
6261
6488
  setSessions((prev) => {
@@ -6263,11 +6490,6 @@ var createAgentManager = (initialAgentOptions) => {
6263
6490
  next.delete(session.id);
6264
6491
  return next;
6265
6492
  });
6266
- };
6267
- if (wasAborted) {
6268
- removeSession();
6269
- } else if (didComplete || hadError) {
6270
- setTimeout(removeSession, 1500);
6271
6493
  }
6272
6494
  }
6273
6495
  };
@@ -6342,7 +6564,7 @@ var createAgentManager = (initialAgentOptions) => {
6342
6564
  return;
6343
6565
  }
6344
6566
  const elements = [element];
6345
- const content = await generateSnippet(elements);
6567
+ const content = await generateSnippet(elements, { maxLines: Infinity });
6346
6568
  const context = {
6347
6569
  content,
6348
6570
  prompt,
@@ -6361,7 +6583,7 @@ var createAgentManager = (initialAgentOptions) => {
6361
6583
  sessionElements.set(session.id, element);
6362
6584
  setSessions((prev) => new Map(prev).set(session.id, session));
6363
6585
  saveSessionById(session, storage);
6364
- agentOptions.onStart?.(session);
6586
+ agentOptions.onStart?.(session, element);
6365
6587
  const abortController = new AbortController();
6366
6588
  abortControllers.set(session.id, abortController);
6367
6589
  const streamIterator = agentOptions.provider.send(
@@ -6382,20 +6604,33 @@ var createAgentManager = (initialAgentOptions) => {
6382
6604
  setSessions(/* @__PURE__ */ new Map());
6383
6605
  clearSessions(agentOptions?.storage);
6384
6606
  };
6607
+ const dismissSession = (sessionId) => {
6608
+ const storage = agentOptions?.storage;
6609
+ sessionElements.delete(sessionId);
6610
+ clearSessionById(sessionId, storage);
6611
+ setSessions((prev) => {
6612
+ const next = new Map(prev);
6613
+ next.delete(sessionId);
6614
+ return next;
6615
+ });
6616
+ };
6617
+ const undoSession = (sessionId) => {
6618
+ const currentSessions = sessions();
6619
+ const session = currentSessions.get(sessionId);
6620
+ if (session) {
6621
+ const element = sessionElements.get(sessionId);
6622
+ agentOptions?.onUndo?.(session, element);
6623
+ void agentOptions?.provider?.undo?.();
6624
+ }
6625
+ dismissSession(sessionId);
6626
+ };
6385
6627
  const updateSessionBoundsOnViewportChange = () => {
6386
6628
  const currentSessions = sessions();
6387
6629
  if (currentSessions.size === 0) return;
6388
6630
  const updatedSessions = new Map(currentSessions);
6389
6631
  let didUpdate = false;
6390
6632
  for (const [sessionId, session] of currentSessions) {
6391
- let element = sessionElements.get(sessionId);
6392
- if (!element || !document.contains(element)) {
6393
- const reacquiredElement = tryReacquireElement(session);
6394
- if (reacquiredElement) {
6395
- sessionElements.set(sessionId, reacquiredElement);
6396
- element = reacquiredElement;
6397
- }
6398
- }
6633
+ const element = sessionElements.get(sessionId);
6399
6634
  if (element && document.contains(element)) {
6400
6635
  const newBounds = createElementBounds(element);
6401
6636
  if (newBounds) {
@@ -6430,6 +6665,8 @@ var createAgentManager = (initialAgentOptions) => {
6430
6665
  startSession,
6431
6666
  abortSession,
6432
6667
  abortAllSessions,
6668
+ dismissSession,
6669
+ undoSession,
6433
6670
  updateSessionBoundsOnViewportChange,
6434
6671
  getSessionElement,
6435
6672
  setOptions,
@@ -6438,8 +6675,8 @@ var createAgentManager = (initialAgentOptions) => {
6438
6675
  };
6439
6676
 
6440
6677
  // src/core.tsx
6441
- var _tmpl$18 = /* @__PURE__ */ template(`<span class="tabular-nums align-middle">`);
6442
- var _tmpl$23 = /* @__PURE__ */ template(`<span class="font-mono tabular-nums align-middle">&lt;<!>>`);
6678
+ var _tmpl$24 = /* @__PURE__ */ template(`<span class="tabular-nums align-middle">`);
6679
+ var _tmpl$25 = /* @__PURE__ */ template(`<span class="font-mono tabular-nums align-middle">&lt;<!>>`);
6443
6680
  var _tmpl$33 = /* @__PURE__ */ template(`<span class="tabular-nums ml-1 align-middle"> in `);
6444
6681
  var onIdle = (callback) => {
6445
6682
  if ("scheduler" in globalThis) {
@@ -6532,7 +6769,7 @@ var init = (rawOptions) => {
6532
6769
  hasInited = true;
6533
6770
  const logIntro = () => {
6534
6771
  try {
6535
- const version = "0.0.71";
6772
+ const version = "0.0.73";
6536
6773
  const logoDataUri = `data:image/svg+xml;base64,${btoa(LOGO_SVG)}`;
6537
6774
  console.log(`%cReact Grab${version ? ` v${version}` : ""}%c
6538
6775
  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;`, "");
@@ -6566,6 +6803,7 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6566
6803
  const [selectionLabelStatus, setSelectionLabelStatus] = createSignal("idle");
6567
6804
  const [labelInstances, setLabelInstances] = createSignal([]);
6568
6805
  const [lastGrabbedElement, setLastGrabbedElement] = createSignal(null);
6806
+ const [lastCopiedElement, setLastCopiedElement] = createSignal(null);
6569
6807
  const [progressStartTime, setProgressStartTime] = createSignal(null);
6570
6808
  const [grabbedBoxes, setGrabbedBoxes] = createSignal([]);
6571
6809
  const [isActivated, setIsActivated] = createSignal(false);
@@ -6585,6 +6823,8 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6585
6823
  const [isInputExpanded, setIsInputExpanded] = createSignal(false);
6586
6824
  const [frozenElement, setFrozenElement] = createSignal(null);
6587
6825
  const [hasAgentProvider, setHasAgentProvider] = createSignal(Boolean(options.agent?.provider));
6826
+ const [isAgentConnected, setIsAgentConnected] = createSignal(false);
6827
+ const [isPendingDismiss, setIsPendingDismiss] = createSignal(false);
6588
6828
  const elementInputCache = /* @__PURE__ */ new WeakMap();
6589
6829
  const [nativeSelectionCursorX, setNativeSelectionCursorX] = createSignal(OFFSCREEN_POSITION);
6590
6830
  const [nativeSelectionCursorY, setNativeSelectionCursorY] = createSignal(OFFSCREEN_POSITION);
@@ -6605,6 +6845,7 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6605
6845
  return await getNearestComponentName(element) || void 0;
6606
6846
  });
6607
6847
  const clearNativeSelectionState = () => {
6848
+ setHasNativeSelection(false);
6608
6849
  setNativeSelectionCursorX(OFFSCREEN_POSITION);
6609
6850
  setNativeSelectionCursorY(OFFSCREEN_POSITION);
6610
6851
  setNativeSelectionElements([]);
@@ -6720,6 +6961,9 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6720
6961
  await operation().finally(() => {
6721
6962
  setIsCopying(false);
6722
6963
  setDidJustCopy(true);
6964
+ if (element) {
6965
+ setLastCopiedElement(element);
6966
+ }
6723
6967
  stopProgressAnimation();
6724
6968
  if (instanceId) {
6725
6969
  updateLabelInstance(instanceId, "copied");
@@ -6763,7 +7007,9 @@ https://react-grab.com`, `background: #330039; color: #ffffff; border: 1px solid
6763
7007
 
6764
7008
  ${combinedSnippets}` : combinedSnippets;
6765
7009
  copiedContent = plainTextContent;
6766
- didCopy = copyContent(plainTextContent);
7010
+ didCopy = copyContent(plainTextContent, {
7011
+ prompt: extraPrompt
7012
+ });
6767
7013
  }
6768
7014
  if (!didCopy) {
6769
7015
  const plainTextContentOnly = createCombinedTextContent(elements);
@@ -6772,7 +7018,9 @@ ${combinedSnippets}` : combinedSnippets;
6772
7018
 
6773
7019
  ${plainTextContentOnly}` : plainTextContentOnly;
6774
7020
  copiedContent = contentWithPrompt;
6775
- didCopy = copyContent(contentWithPrompt);
7021
+ didCopy = copyContent(contentWithPrompt, {
7022
+ prompt: extraPrompt
7023
+ });
6776
7024
  }
6777
7025
  }
6778
7026
  if (didCopy) {
@@ -6786,7 +7034,9 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6786
7034
 
6787
7035
  ${plainTextContentOnly}` : plainTextContentOnly;
6788
7036
  copiedContent = contentWithPrompt;
6789
- didCopy = copyContent(contentWithPrompt);
7037
+ didCopy = copyContent(contentWithPrompt, {
7038
+ prompt: extraPrompt
7039
+ });
6790
7040
  }
6791
7041
  }
6792
7042
  options.onAfterCopy?.(elements, didCopy);
@@ -6821,6 +7071,12 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6821
7071
  if (element && !document.contains(element)) return null;
6822
7072
  return element;
6823
7073
  });
7074
+ const effectiveElement = createMemo(() => {
7075
+ if (isToggleFrozen()) {
7076
+ return frozenElement();
7077
+ }
7078
+ return targetElement();
7079
+ });
6824
7080
  createEffect(() => {
6825
7081
  const element = detectedElement();
6826
7082
  if (!element) return;
@@ -6832,6 +7088,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6832
7088
  onCleanup(() => clearInterval(intervalId));
6833
7089
  });
6834
7090
  createEffect(() => {
7091
+ if (isToggleFrozen()) return;
6835
7092
  const element = targetElement();
6836
7093
  if (element) {
6837
7094
  setFrozenElement(element);
@@ -6839,7 +7096,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6839
7096
  });
6840
7097
  const selectionBounds = createMemo(() => {
6841
7098
  viewportVersion();
6842
- const element = targetElement();
7099
+ const element = effectiveElement();
6843
7100
  if (!element) return void 0;
6844
7101
  return createElementBounds(element);
6845
7102
  });
@@ -6891,7 +7148,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6891
7148
  const copying = isCopying();
6892
7149
  if (!element) {
6893
7150
  return (() => {
6894
- var _el$ = _tmpl$18();
7151
+ var _el$ = _tmpl$24();
6895
7152
  insert(_el$, copying ? "Processing\u2026" : "1 element");
6896
7153
  return _el$;
6897
7154
  })();
@@ -6900,7 +7157,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6900
7157
  const componentName = labelComponentName();
6901
7158
  if (tagName && componentName) {
6902
7159
  return [(() => {
6903
- var _el$2 = _tmpl$23(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling; _el$5.nextSibling;
7160
+ var _el$2 = _tmpl$25(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling; _el$5.nextSibling;
6904
7161
  insert(_el$2, tagName, _el$5);
6905
7162
  return _el$2;
6906
7163
  })(), (() => {
@@ -6911,13 +7168,13 @@ ${plainTextContentOnly}` : plainTextContentOnly;
6911
7168
  }
6912
7169
  if (tagName) {
6913
7170
  return (() => {
6914
- var _el$8 = _tmpl$23(), _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling; _el$1.nextSibling;
7171
+ var _el$8 = _tmpl$25(), _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling; _el$1.nextSibling;
6915
7172
  insert(_el$8, tagName, _el$1);
6916
7173
  return _el$8;
6917
7174
  })();
6918
7175
  }
6919
7176
  return (() => {
6920
- var _el$10 = _tmpl$18();
7177
+ var _el$10 = _tmpl$24();
6921
7178
  insert(_el$10, copying ? "Processing\u2026" : "1 element");
6922
7179
  return _el$10;
6923
7180
  })();
@@ -7110,6 +7367,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7110
7367
  setInputText("");
7111
7368
  setIsToggleFrozen(false);
7112
7369
  setIsInputExpanded(false);
7370
+ setIsPendingDismiss(false);
7113
7371
  setFrozenElement(null);
7114
7372
  setSelectionLabelStatus("idle");
7115
7373
  setDidJustCopy(false);
@@ -7128,25 +7386,32 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7128
7386
  previouslyFocusedElement = null;
7129
7387
  options.onDeactivate?.();
7130
7388
  };
7389
+ const restoreInputFromSession = (session, element) => {
7390
+ if (element && document.contains(element)) {
7391
+ const rect = element.getBoundingClientRect();
7392
+ const centerY = rect.top + rect.height / 2;
7393
+ setMouseX(session.position.x);
7394
+ setMouseY(centerY);
7395
+ setFrozenElement(element);
7396
+ setInputText(session.context.prompt);
7397
+ setIsInputExpanded(true);
7398
+ setIsInputMode(true);
7399
+ setIsToggleMode(true);
7400
+ setIsToggleFrozen(true);
7401
+ if (!isActivated()) {
7402
+ activateRenderer();
7403
+ }
7404
+ }
7405
+ };
7131
7406
  const agentOptions = options.agent ? {
7132
7407
  ...options.agent,
7133
7408
  onAbort: (session, element) => {
7134
7409
  options.agent?.onAbort?.(session, element);
7135
- if (element && document.contains(element)) {
7136
- const rect = element.getBoundingClientRect();
7137
- const centerY = rect.top + rect.height / 2;
7138
- setMouseX(session.position.x);
7139
- setMouseY(centerY);
7140
- setFrozenElement(element);
7141
- setInputText(session.context.prompt);
7142
- setIsInputExpanded(true);
7143
- setIsInputMode(true);
7144
- setIsToggleMode(true);
7145
- setIsToggleFrozen(true);
7146
- if (!isActivated()) {
7147
- activateRenderer();
7148
- }
7149
- }
7410
+ restoreInputFromSession(session, element);
7411
+ },
7412
+ onUndo: (session, element) => {
7413
+ options.agent?.onUndo?.(session, element);
7414
+ restoreInputFromSession(session, element);
7150
7415
  }
7151
7416
  } : void 0;
7152
7417
  const agentManager = createAgentManager(agentOptions);
@@ -7154,6 +7419,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7154
7419
  setInputText(value);
7155
7420
  };
7156
7421
  const handleInputSubmit = () => {
7422
+ setLastCopiedElement(null);
7157
7423
  const element = frozenElement() || targetElement();
7158
7424
  const prompt = isInputMode() ? inputText().trim() : "";
7159
7425
  if (!element) {
@@ -7182,7 +7448,11 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7182
7448
  }
7183
7449
  setIsInputMode(false);
7184
7450
  setInputText("");
7185
- elementInputCache.delete(element);
7451
+ if (prompt) {
7452
+ elementInputCache.set(element, prompt);
7453
+ } else {
7454
+ elementInputCache.delete(element);
7455
+ }
7186
7456
  const tagName = extractElementTagName(element);
7187
7457
  void getNearestComponentName(element).then((componentName) => {
7188
7458
  void executeCopyOperation(currentX, currentY, () => copySingleElementToClipboard(element, prompt || void 0), bounds, tagName, componentName ?? void 0, element).then(() => {
@@ -7191,14 +7461,27 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7191
7461
  });
7192
7462
  };
7193
7463
  const handleInputCancel = () => {
7464
+ setLastCopiedElement(null);
7194
7465
  if (!isInputMode()) return;
7195
- const element = frozenElement() || targetElement();
7196
7466
  const currentInput = inputText().trim();
7467
+ if (currentInput && !isPendingDismiss()) {
7468
+ setIsPendingDismiss(true);
7469
+ return;
7470
+ }
7471
+ const element = frozenElement() || targetElement();
7197
7472
  if (element && currentInput) {
7198
7473
  elementInputCache.set(element, currentInput);
7199
7474
  }
7475
+ setIsPendingDismiss(false);
7476
+ deactivateRenderer();
7477
+ };
7478
+ const handleConfirmDismiss = () => {
7479
+ setIsPendingDismiss(false);
7200
7480
  deactivateRenderer();
7201
7481
  };
7482
+ const handleCancelDismiss = () => {
7483
+ setIsPendingDismiss(false);
7484
+ };
7202
7485
  const handleToggleExpand = () => {
7203
7486
  const element = frozenElement() || targetElement();
7204
7487
  if (element) {
@@ -7310,19 +7593,22 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7310
7593
  transform: stripTranslateFromTransform(firstElement)
7311
7594
  };
7312
7595
  const tagName = extractElementTagName(firstElement);
7596
+ const centerX = bounds.x + bounds.width / 2;
7597
+ const centerY = bounds.y + bounds.height / 2;
7313
7598
  if (hasAgentProvider()) {
7314
- const centerX = bounds.x + bounds.width / 2;
7315
- const centerY = bounds.y + bounds.height / 2;
7316
7599
  setMouseX(centerX);
7317
7600
  setMouseY(centerY);
7318
7601
  setFrozenElement(firstElement);
7319
7602
  setIsToggleMode(true);
7320
7603
  setIsToggleFrozen(true);
7321
7604
  setIsInputExpanded(true);
7605
+ if (!isActivated()) {
7606
+ activateRenderer();
7607
+ }
7322
7608
  setIsInputMode(true);
7323
7609
  } else {
7324
7610
  void getNearestComponentName(firstElement).then((componentName) => {
7325
- void executeCopyOperation(clientX, clientY, () => copyMultipleElementsToClipboard(selectedElements), bounds, tagName, componentName ?? void 0, firstElement, true);
7611
+ void executeCopyOperation(centerX, centerY, () => copyMultipleElementsToClipboard(selectedElements), bounds, tagName, componentName ?? void 0, firstElement, true);
7326
7612
  });
7327
7613
  }
7328
7614
  }
@@ -7362,7 +7648,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7362
7648
  const originalKey = originalKeyDescriptor?.get ? originalKeyDescriptor.get.call(event) : event.key;
7363
7649
  const isEnterKey = originalKey === "Enter" || isEnterCode(event.code);
7364
7650
  const isOverlayActive = isActivated() || isHoldingKeys();
7365
- const shouldBlockEnter = isEnterKey && isOverlayActive && !isInputMode();
7651
+ const shouldBlockEnter = isEnterKey && isOverlayActive && !isInputMode() && !isToggleMode();
7366
7652
  if (shouldBlockEnter) {
7367
7653
  claimedEvents.add(event);
7368
7654
  event.preventDefault();
@@ -7387,13 +7673,14 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7387
7673
  window.addEventListener("keydown", (event) => {
7388
7674
  blockEnterIfNeeded(event);
7389
7675
  const isEnterToActivateInput = isEnterCode(event.code) && isHoldingKeys() && !isInputMode();
7390
- if (isInputMode() && isTargetKeyCombination(event, options)) {
7676
+ if (isInputMode() && isTargetKeyCombination(event, options) && !event.repeat) {
7391
7677
  event.preventDefault();
7392
7678
  event.stopPropagation();
7393
7679
  setIsInputMode(false);
7394
7680
  setInputText("");
7395
7681
  setIsToggleFrozen(false);
7396
7682
  setIsInputExpanded(false);
7683
+ setIsPendingDismiss(false);
7397
7684
  return;
7398
7685
  }
7399
7686
  if (isInputMode() || isEventFromOverlay(event, "data-react-grab-ignore-events") && !isEnterToActivateInput) {
@@ -7412,6 +7699,33 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7412
7699
  return;
7413
7700
  }
7414
7701
  }
7702
+ const copiedElement = lastCopiedElement();
7703
+ if (isEnterCode(event.code) && !isHoldingKeys() && !isInputMode() && !isActivated() && copiedElement && document.contains(copiedElement) && !labelInstances().some((instance) => instance.status === "copied" || instance.status === "fading")) {
7704
+ event.preventDefault();
7705
+ event.stopPropagation();
7706
+ event.stopImmediatePropagation();
7707
+ const bounds = createElementBounds(copiedElement);
7708
+ const selectionCenterX = bounds.x + bounds.width / 2;
7709
+ const centerY = bounds.y + bounds.height / 2;
7710
+ setMouseX(selectionCenterX);
7711
+ setMouseY(centerY);
7712
+ setCopyStartX(selectionCenterX);
7713
+ setCopyStartY(centerY);
7714
+ setCopyOffsetFromCenterX(0);
7715
+ setFrozenElement(copiedElement);
7716
+ setLastCopiedElement(null);
7717
+ setLabelInstances([]);
7718
+ const cachedInput = elementInputCache.get(copiedElement);
7719
+ if (cachedInput) {
7720
+ setInputText(cachedInput);
7721
+ }
7722
+ setIsToggleMode(true);
7723
+ setIsToggleFrozen(true);
7724
+ setIsInputExpanded(true);
7725
+ activateRenderer();
7726
+ setIsInputMode(true);
7727
+ return;
7728
+ }
7415
7729
  if (isEnterCode(event.code) && isHoldingKeys() && !isInputMode()) {
7416
7730
  event.preventDefault();
7417
7731
  event.stopPropagation();
@@ -7497,9 +7811,10 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7497
7811
  if (!isHoldingKeys()) {
7498
7812
  setIsHoldingKeys(true);
7499
7813
  }
7814
+ const activationDuration = isKeyboardEventTriggeredByInput(event) ? options.keyHoldDuration + INPUT_FOCUS_ACTIVATION_DELAY_MS : options.keyHoldDuration;
7500
7815
  holdTimerId = window.setTimeout(() => {
7501
7816
  activateRenderer();
7502
- }, options.keyHoldDuration);
7817
+ }, activationDuration);
7503
7818
  }, {
7504
7819
  signal: eventListenerSignal,
7505
7820
  capture: true
@@ -7634,7 +7949,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7634
7949
  if (hadDrag) {
7635
7950
  setDidJustDrag(false);
7636
7951
  }
7637
- if (isToggleMode() && !isCopying()) {
7952
+ if (isToggleMode() && !isCopying() && !isInputMode()) {
7638
7953
  if (!isHoldingKeys()) {
7639
7954
  deactivateRenderer();
7640
7955
  } else {
@@ -7698,6 +8013,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7698
8013
  selectionDebounceTimerId = null;
7699
8014
  const currentSelection = window.getSelection();
7700
8015
  if (!currentSelection || currentSelection.isCollapsed || currentSelection.rangeCount === 0) {
8016
+ clearNativeSelectionState();
7701
8017
  return;
7702
8018
  }
7703
8019
  const range = currentSelection.getRangeAt(0);
@@ -7706,6 +8022,11 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7706
8022
  clearNativeSelectionState();
7707
8023
  return;
7708
8024
  }
8025
+ const selectedText = currentSelection.toString().trim();
8026
+ if (!selectedText) {
8027
+ clearNativeSelectionState();
8028
+ return;
8029
+ }
7709
8030
  const isBackward = (() => {
7710
8031
  if (!currentSelection.anchorNode || !currentSelection.focusNode) return false;
7711
8032
  const position = currentSelection.anchorNode.compareDocumentPosition(currentSelection.focusNode);
@@ -7755,14 +8076,14 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7755
8076
  const selectionVisible = createMemo(() => {
7756
8077
  if (!theme().selectionBox.enabled) return false;
7757
8078
  if (didJustCopy()) return false;
7758
- return isRendererActive() && !isDragging() && Boolean(targetElement());
8079
+ return isRendererActive() && !isDragging() && Boolean(effectiveElement());
7759
8080
  });
7760
8081
  const selectionTagName = createMemo(() => {
7761
- const element = targetElement();
8082
+ const element = effectiveElement();
7762
8083
  if (!element) return void 0;
7763
8084
  return extractElementTagName(element) || void 0;
7764
8085
  });
7765
- const [selectionComponentName] = createResource(() => targetElement(), async (element) => {
8086
+ const [selectionComponentName] = createResource(() => effectiveElement(), async (element) => {
7766
8087
  if (!element) return void 0;
7767
8088
  const name = await getNearestComponentName(element);
7768
8089
  return name ?? void 0;
@@ -7770,7 +8091,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7770
8091
  const selectionLabelVisible = createMemo(() => {
7771
8092
  if (!theme().elementLabel.enabled) return false;
7772
8093
  if (didJustCopy()) return false;
7773
- return isRendererActive() && !isDragging() && Boolean(targetElement());
8094
+ return isRendererActive() && !isDragging() && Boolean(effectiveElement());
7774
8095
  });
7775
8096
  const computedLabelInstances = createMemo(() => {
7776
8097
  viewportVersion();
@@ -7784,13 +8105,25 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7784
8105
  };
7785
8106
  });
7786
8107
  });
8108
+ const computedGrabbedBoxes = createMemo(() => {
8109
+ viewportVersion();
8110
+ return grabbedBoxes().map((box) => {
8111
+ if (!box.element || !document.body.contains(box.element)) {
8112
+ return box;
8113
+ }
8114
+ return {
8115
+ ...box,
8116
+ bounds: createElementBounds(box.element)
8117
+ };
8118
+ });
8119
+ });
7787
8120
  const dragVisible = createMemo(() => theme().dragBox.enabled && isRendererActive() && isDraggingBeyondThreshold());
7788
8121
  const labelVariant = createMemo(() => isCopying() ? "processing" : "hover");
7789
8122
  const labelVisible = createMemo(() => {
7790
8123
  if (!theme().elementLabel.enabled) return false;
7791
8124
  if (isInputMode()) return false;
7792
8125
  if (isCopying()) return true;
7793
- return isRendererActive() && !isDragging() && Boolean(targetElement());
8126
+ return isRendererActive() && !isDragging() && Boolean(effectiveElement());
7794
8127
  });
7795
8128
  const crosshairVisible = createMemo(() => theme().crosshair.enabled && isRendererActive() && !isDragging() && !isTouchMode() && !isToggleFrozen());
7796
8129
  const shouldShowGrabbedBoxes = createMemo(() => theme().grabbedBoxes.enabled);
@@ -7837,7 +8170,7 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7837
8170
  return dragBounds();
7838
8171
  },
7839
8172
  get grabbedBoxes() {
7840
- return memo(() => !!shouldShowGrabbedBoxes())() ? grabbedBoxes() : [];
8173
+ return memo(() => !!shouldShowGrabbedBoxes())() ? computedGrabbedBoxes() : [];
7841
8174
  },
7842
8175
  labelZIndex: Z_INDEX_LABEL,
7843
8176
  get mouseX() {
@@ -7858,14 +8191,24 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7858
8191
  get hasAgent() {
7859
8192
  return hasAgentProvider();
7860
8193
  },
8194
+ get isAgentConnected() {
8195
+ return isAgentConnected();
8196
+ },
7861
8197
  get agentSessions() {
7862
8198
  return agentManager.sessions();
7863
8199
  },
7864
8200
  onAbortSession: (sessionId) => agentManager.abortSession(sessionId),
8201
+ onDismissSession: (sessionId) => agentManager.dismissSession(sessionId),
8202
+ onUndoSession: (sessionId) => agentManager.undoSession(sessionId),
7865
8203
  onInputChange: handleInputChange,
7866
8204
  onInputSubmit: () => void handleInputSubmit(),
7867
8205
  onInputCancel: handleInputCancel,
7868
8206
  onToggleExpand: handleToggleExpand,
8207
+ get isPendingDismiss() {
8208
+ return isPendingDismiss();
8209
+ },
8210
+ onConfirmDismiss: handleConfirmDismiss,
8211
+ onCancelDismiss: handleCancelDismiss,
7869
8212
  get nativeSelectionCursorVisible() {
7870
8213
  return hasNativeSelection();
7871
8214
  },
@@ -7956,25 +8299,20 @@ ${plainTextContentOnly}` : plainTextContentOnly;
7956
8299
  provider: newAgentOptions.provider ?? existingOptions?.provider,
7957
8300
  onAbort: (session, element) => {
7958
8301
  newAgentOptions?.onAbort?.(session, element);
7959
- if (element && document.contains(element)) {
7960
- const rect = element.getBoundingClientRect();
7961
- const centerY = rect.top + rect.height / 2;
7962
- setMouseX(session.position.x);
7963
- setMouseY(centerY);
7964
- setFrozenElement(element);
7965
- setInputText(session.context.prompt);
7966
- setIsInputExpanded(true);
7967
- setIsInputMode(true);
7968
- setIsToggleMode(true);
7969
- setIsToggleFrozen(true);
7970
- if (!isActivated()) {
7971
- activateRenderer();
7972
- }
7973
- }
8302
+ restoreInputFromSession(session, element);
8303
+ },
8304
+ onUndo: (session, element) => {
8305
+ newAgentOptions?.onUndo?.(session, element);
8306
+ restoreInputFromSession(session, element);
7974
8307
  }
7975
8308
  };
7976
8309
  agentManager.setOptions(mergedOptions);
7977
8310
  setHasAgentProvider(Boolean(mergedOptions.provider));
8311
+ if (mergedOptions.provider?.checkConnection) {
8312
+ void mergedOptions.provider.checkConnection().then((connected) => {
8313
+ setIsAgentConnected(connected);
8314
+ });
8315
+ }
7978
8316
  agentManager.tryResumeSessions();
7979
8317
  }
7980
8318
  };