made-refine 0.2.19 → 0.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -87,7 +87,7 @@ var React8 = __toESM(require("react"));
87
87
  var React = __toESM(require("react"));
88
88
 
89
89
  // dist/styles.css
90
- var styles_default = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--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-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover-foreground:#171717}}@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}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.left-1\\.5{left:calc(var(--spacing)*1.5)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.z-\\[99990\\]{z-index:99990}.z-\\[99991\\]{z-index:99991}.z-\\[99998\\]{z-index:99998}.z-\\[99999\\]{z-index:99999}.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-4{margin:calc(var(--spacing)*4)}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-2{margin-inline:calc(var(--spacing)*2)}.my-0\\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2\\.5{margin-top:calc(var(--spacing)*2.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.list-item{display:list-item}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-2\\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing)*.5)}.h-2{height:calc(var(--spacing)*2)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-\\[150px\\]{height:150px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-\\[240px\\]{max-height:240px}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\\[18px\\]{min-height:18px}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[180px\\]{width:180px}.w-\\[200px\\]{width:200px}.w-\\[240px\\]{width:240px}.w-\\[260px\\]{width:260px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[18px\\]{min-width:18px}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-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)}.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-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.\\[appearance\\:textfield\\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-\\[2px\\]{gap:2px}.gap-\\[4px\\]{gap:4px}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-\\[6px\\]{border-radius:6px}.rounded-\\[8px\\]{border-radius:8px}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.\\[border-top-style\\:solid\\]{border-top-style:solid}.\\[border-right-style\\:dashed\\]{border-right-style:dashed}.\\[border-bottom-style\\:dashed\\]{border-bottom-style:dashed}.\\[border-bottom-style\\:dotted\\]{border-bottom-style:dotted}.\\[border-bottom-style\\:solid\\]{border-bottom-style:solid}.\\[border-left-style\\:double\\]{border-left-style:double}.\\[border-left-style\\:solid\\]{border-left-style:solid}.border-border{border-color:var(--color-border)}.border-border\\/30{border-color:#e6e6e64d}@supports (color:color-mix(in lab, red, red)){.border-border\\/30{border-color:color-mix(in oklab,var(--color-border)30%,transparent)}}.border-border\\/50{border-color:#e6e6e680}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.border-foreground\\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/10{border-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.bg-\\[canvas\\]{background-color:canvas}.bg-background{background-color:var(--color-background)}.bg-background\\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/85{background-color:color-mix(in oklab,var(--color-background)85%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\\/25{background-color:#17171740}@supports (color:color-mix(in lab, red, red)){.bg-foreground\\/25{background-color:color-mix(in oklab,var(--color-foreground)25%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\\/30{background-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/30{background-color:color-mix(in oklab,var(--color-muted-foreground)30%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-transparent{background-color:#0000}.fill-border{fill:var(--color-border)}.p-0{padding:calc(var(--spacing)*0)}.p-0\\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\\.5{padding-block:calc(var(--spacing)*3.5)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-\\[13px\\]{padding-top:13px}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[7px\\]{font-size:7px}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-background{color:var(--color-background)}.text-blue-500{color:var(--color-blue-500)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_4px_6px_-1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[inset_0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-border{outline-color:var(--color-border)}.outline-foreground\\/10{outline-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.outline-foreground\\/10{outline-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.outline-red-500\\/70{outline-color:#fb2c36b3}@supports (color:color-mix(in lab, red, red)){.outline-red-500\\/70{outline-color:color-mix(in oklab,var(--color-red-500)70%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.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-\\[color\\,background-color\\]{transition-property:color,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,background-color\\,color\\]{transition-property:opacity,background-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,scale\\,opacity\\]{transition-property:transform,scale,opacity;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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-ms-overflow-style\\:none\\]{-ms-overflow-style:none}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/pin\\:inline:is(:where(.group\\/pin):hover *){display:inline}}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.placeholder\\:text-red-400::placeholder{color:var(--color-red-400)}.focus-within\\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--color-ring)}.focus-within\\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}.focus-within\\:ring-inset:focus-within{--tw-ring-inset:inset}@media (hover:hover){.hover\\:scale-\\[1\\.67\\]:hover{scale:1.67}.hover\\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\\:bg-destructive\\/90:hover{background-color:#ef4444e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\\:bg-foreground\\/80:hover{background-color:#171717cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/80:hover{background-color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--color-muted)}.hover\\:bg-muted-foreground\\/10:hover{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/10:hover{background-color:color-mix(in oklab,var(--color-muted-foreground)10%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\\:bg-muted\\/80:hover{background-color:#f2f2f2cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab,var(--color-muted)80%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\\:text-foreground:hover{color:var(--color-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-inset:focus-visible{--tw-ring-inset:inset}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.data-ending-style\\:scale-90[data-ending-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-ending-style\\:opacity-0[data-ending-style]{opacity:0}.data-instant\\:transition-none[data-instant]{transition-property:none}.data-starting-style\\:scale-90[data-starting-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-starting-style\\:opacity-0[data-starting-style]{opacity:0}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.dark\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:-outline-offset-1{outline-offset:calc(1px*-1)}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:size-3\\.5 svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&\\:\\:-webkit-inner-spin-button\\]\\:appearance-none::-webkit-inner-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-outer-spin-button\\]\\:appearance-none::-webkit-outer-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none;animation:none}}.lucide{stroke-width:1px}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}';
90
+ var styles_default = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--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-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover-foreground:#171717}}@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}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.left-1\\.5{left:calc(var(--spacing)*1.5)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.isolate{isolation:isolate}.z-\\[99990\\]{z-index:99990}.z-\\[99991\\]{z-index:99991}.z-\\[99998\\]{z-index:99998}.z-\\[99999\\]{z-index:99999}.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-4{margin:calc(var(--spacing)*4)}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-2{margin-inline:calc(var(--spacing)*2)}.my-0\\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2\\.5{margin-top:calc(var(--spacing)*2.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.list-item{display:list-item}.table{display:table}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-2\\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing)*.5)}.h-2{height:calc(var(--spacing)*2)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-\\[150px\\]{height:150px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-\\[240px\\]{max-height:240px}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\\[18px\\]{min-height:18px}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[180px\\]{width:180px}.w-\\[200px\\]{width:200px}.w-\\[240px\\]{width:240px}.w-\\[260px\\]{width:260px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[18px\\]{min-width:18px}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-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)}.rotate-45{rotate:45deg}.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-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.\\[appearance\\:textfield\\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-\\[2px\\]{gap:2px}.gap-\\[4px\\]{gap:4px}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-\\[6px\\]{border-radius:6px}.rounded-\\[8px\\]{border-radius:8px}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.\\[border-top-style\\:solid\\]{border-top-style:solid}.\\[border-right-style\\:dashed\\]{border-right-style:dashed}.\\[border-bottom-style\\:dashed\\]{border-bottom-style:dashed}.\\[border-bottom-style\\:dotted\\]{border-bottom-style:dotted}.\\[border-bottom-style\\:solid\\]{border-bottom-style:solid}.\\[border-left-style\\:double\\]{border-left-style:double}.\\[border-left-style\\:solid\\]{border-left-style:solid}.border-border{border-color:var(--color-border)}.border-border\\/30{border-color:#e6e6e64d}@supports (color:color-mix(in lab, red, red)){.border-border\\/30{border-color:color-mix(in oklab,var(--color-border)30%,transparent)}}.border-border\\/50{border-color:#e6e6e680}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.border-foreground\\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/10{border-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.bg-\\[canvas\\]{background-color:canvas}.bg-background{background-color:var(--color-background)}.bg-background\\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/85{background-color:color-mix(in oklab,var(--color-background)85%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\\/25{background-color:#17171740}@supports (color:color-mix(in lab, red, red)){.bg-foreground\\/25{background-color:color-mix(in oklab,var(--color-foreground)25%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\\/30{background-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/30{background-color:color-mix(in oklab,var(--color-muted-foreground)30%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.fill-border{fill:var(--color-border)}.p-0{padding:calc(var(--spacing)*0)}.p-0\\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\\.5{padding-block:calc(var(--spacing)*3.5)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-\\[13px\\]{padding-top:13px}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[7px\\]{font-size:7px}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-background{color:var(--color-background)}.text-blue-500{color:var(--color-blue-500)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_4px_6px_-1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[inset_0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-border{outline-color:var(--color-border)}.outline-foreground\\/10{outline-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.outline-foreground\\/10{outline-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.outline-red-500\\/70{outline-color:#fb2c36b3}@supports (color:color-mix(in lab, red, red)){.outline-red-500\\/70{outline-color:color-mix(in oklab,var(--color-red-500)70%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.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-\\[color\\,background-color\\]{transition-property:color,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,background-color\\,color\\]{transition-property:opacity,background-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,scale\\,opacity\\]{transition-property:transform,scale,opacity;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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-ms-overflow-style\\:none\\]{-ms-overflow-style:none}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/pin\\:inline:is(:where(.group\\/pin):hover *){display:inline}}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.placeholder\\:text-red-400::placeholder{color:var(--color-red-400)}.focus-within\\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--color-ring)}.focus-within\\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}.focus-within\\:ring-inset:focus-within{--tw-ring-inset:inset}@media (hover:hover){.hover\\:scale-\\[1\\.67\\]:hover{scale:1.67}.hover\\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\\:bg-destructive\\/90:hover{background-color:#ef4444e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\\:bg-foreground\\/80:hover{background-color:#171717cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/80:hover{background-color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--color-muted)}.hover\\:bg-muted-foreground\\/10:hover{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/10:hover{background-color:color-mix(in oklab,var(--color-muted-foreground)10%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\\:bg-muted\\/80:hover{background-color:#f2f2f2cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab,var(--color-muted)80%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\\:text-foreground:hover{color:var(--color-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-inset:focus-visible{--tw-ring-inset:inset}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.data-ending-style\\:scale-90[data-ending-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-ending-style\\:opacity-0[data-ending-style]{opacity:0}.data-instant\\:transition-none[data-instant]{transition-property:none}.data-starting-style\\:scale-90[data-starting-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-starting-style\\:opacity-0[data-starting-style]{opacity:0}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.dark\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:-outline-offset-1{outline-offset:calc(1px*-1)}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:size-3\\.5 svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&\\:\\:-webkit-inner-spin-button\\]\\:appearance-none::-webkit-inner-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-outer-spin-button\\]\\:appearance-none::-webkit-outer-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none;animation:none}}.lucide{stroke-width:1px}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}';
91
91
 
92
92
  // src/portal-container.tsx
93
93
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -477,10 +477,30 @@ function getSourceFromFiber(fiber) {
477
477
  if (fromDebugStack?.fileName) return fromDebugStack;
478
478
  return null;
479
479
  }
480
+ var REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref");
481
+ var REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo");
482
+ function resolveComponentName(type) {
483
+ let current = type;
484
+ for (let depth = 0; depth < 4 && current != null; depth++) {
485
+ const name = current.displayName || (typeof current === "function" ? current.name : void 0);
486
+ if (name) return name;
487
+ if (typeof current !== "object") return null;
488
+ if (current.$$typeof === REACT_MEMO_TYPE) {
489
+ current = current.type;
490
+ continue;
491
+ }
492
+ if (current.$$typeof === REACT_FORWARD_REF_TYPE) {
493
+ current = current.render;
494
+ continue;
495
+ }
496
+ return null;
497
+ }
498
+ return null;
499
+ }
480
500
  function buildFrame(fiber) {
481
501
  const type = fiber?.type;
482
502
  if (typeof type !== "function" && typeof type !== "object") return null;
483
- const name = type?.displayName || type?.name || null;
503
+ const name = resolveComponentName(type);
484
504
  if (!name || name === "Fragment") return null;
485
505
  const frame = { name };
486
506
  const source = getSourceFromFiber(fiber);
@@ -2492,7 +2512,7 @@ function buildElementContext(locator) {
2492
2512
  return buildLocatorContextLines(locator).join("\n");
2493
2513
  }
2494
2514
  function hasSessionEditChanges(edit) {
2495
- return Object.keys(edit.pendingStyles).length > 0 || Boolean(edit.textEdit) || Boolean(edit.move);
2515
+ return Object.keys(edit.pendingStyles).length > 0 || Boolean(edit.textEdit) || Boolean(edit.move) || Boolean(edit.deleted);
2496
2516
  }
2497
2517
  function partitionMultiSelectedEdits(elements, sessionEditsRef) {
2498
2518
  const editsWithChanges = [];
@@ -3014,7 +3034,7 @@ function buildMoveEntries(edits) {
3014
3034
  let noopMoveCount = 0;
3015
3035
  for (const edit of edits) {
3016
3036
  const move = edit.move;
3017
- if (!move) continue;
3037
+ if (!move || edit.deleted) continue;
3018
3038
  const subject = buildAnchorRef(
3019
3039
  getElementDisplayName(edit.element) || edit.locator.tagName,
3020
3040
  edit.locator.domSelector,
@@ -3173,19 +3193,22 @@ function getExportContentProfile(edits, comments, movePlanOrContext) {
3173
3193
  hasCssEdits: edits.some((e) => Object.keys(e.pendingStyles).length > 0),
3174
3194
  hasTextEdits: edits.some((e) => e.textEdit != null),
3175
3195
  hasMoves: moveOpCount > 0,
3176
- hasComments: comments.length > 0
3196
+ hasComments: comments.length > 0,
3197
+ hasDeletes: edits.some((e) => e.deleted)
3177
3198
  };
3178
3199
  }
3179
3200
  function buildExportInstruction(profile) {
3180
3201
  const { hasCssEdits, hasTextEdits, hasMoves, hasComments } = profile;
3181
- if (!hasCssEdits && !hasTextEdits && !hasMoves && !hasComments) return "";
3182
- if (!hasCssEdits && !hasTextEdits && !hasMoves) {
3202
+ const hasDeletes = Boolean(profile.hasDeletes);
3203
+ if (!hasCssEdits && !hasTextEdits && !hasMoves && !hasComments && !hasDeletes) return "";
3204
+ if (!hasCssEdits && !hasTextEdits && !hasMoves && !hasDeletes) {
3183
3205
  return hasComments ? "Address this feedback on the UI. Use the provided source location and selector to find each element in the codebase." : "";
3184
3206
  }
3185
3207
  const parts = [];
3186
3208
  if (hasCssEdits) parts.push("Apply the CSS changes to the targeted elements using the project's existing styling approach (Tailwind, CSS modules, etc.). Map values to existing CSS variables, design tokens, or utility classes already used in the project whenever possible.");
3187
3209
  if (hasTextEdits) parts.push("Update the text content as specified.");
3188
3210
  if (hasMoves) parts.push("Implement the move plan below directly in source code. For `structural_move`, reorder/reparent elements using the target anchors. For `layout_refactor`, apply the listed flex/grid refactor steps. Do NOT simulate movement with absolute positioning, left/top offsets, transform, or margin hacks.");
3211
+ if (hasDeletes) parts.push("Delete the elements marked for deletion from the source code \u2014 remove their markup/JSX (and any now-dead props, handlers, or imports they solely used).");
3189
3212
  if (hasComments) parts.push("Address the comments on the relevant elements.");
3190
3213
  return `${parts.join(" ")} Use the provided source locations, selectors, and context HTML to locate each element in the codebase.`;
3191
3214
  }
@@ -3220,6 +3243,13 @@ function buildSessionExport(edits, comments = [], options) {
3220
3243
  blocks.push(planLines.join("\n"));
3221
3244
  }
3222
3245
  for (const edit of edits) {
3246
+ if (edit.deleted) {
3247
+ const lines = buildLocatorContextLines(edit.locator);
3248
+ lines.push("");
3249
+ lines.push("action: delete this element \u2014 remove it from the source");
3250
+ blocks.push(lines.join("\n"));
3251
+ continue;
3252
+ }
3223
3253
  const moveIntent = getMoveIntentForEdit(edit, planContext);
3224
3254
  const hasMove = Boolean(moveIntent);
3225
3255
  const hasStyleOrText = Object.keys(edit.pendingStyles).length > 0 || edit.textEdit != null;
@@ -4128,6 +4158,7 @@ function useSessionManager({
4128
4158
  sessionEditsRef,
4129
4159
  removedSessionEditsRef,
4130
4160
  undoStackRef,
4161
+ onElementInsertedRef,
4131
4162
  pushUndo,
4132
4163
  setState,
4133
4164
  setSessionEditCount
@@ -4324,40 +4355,75 @@ function useSessionManager({
4324
4355
  selectElement(firstChild);
4325
4356
  }
4326
4357
  }, [getSelectableChild, selectElement]);
4327
- const insertElement = React3.useCallback((kind) => {
4328
- if (!stateRef.current.editModeActive) return;
4329
- saveCurrentToSession();
4330
- const restoreSelection = buildSelectionSnapshot();
4358
+ const centerElementOnBody = React3.useCallback((element, size) => {
4331
4359
  const bodyRect = document.body.getBoundingClientRect();
4332
4360
  const scaleX = document.body.offsetWidth > 0 ? bodyRect.width / document.body.offsetWidth : 1;
4333
4361
  const scaleY = document.body.offsetHeight > 0 ? bodyRect.height / document.body.offsetHeight : 1;
4334
- const width = kind === "frame" ? 240 : 160;
4335
- const height = kind === "frame" ? 160 : 96;
4362
+ const fallbackWidth = size?.width ?? element.offsetWidth ?? 0;
4363
+ const fallbackHeight = size?.height ?? element.offsetHeight ?? 0;
4364
+ const measuredRect = element.getBoundingClientRect();
4365
+ const width = measuredRect.width || fallbackWidth;
4366
+ const height = measuredRect.height || fallbackHeight;
4336
4367
  const left = Math.round((window.innerWidth / 2 - bodyRect.left) / scaleX - width / 2);
4337
4368
  const top = Math.round((window.innerHeight / 2 - bodyRect.top) / scaleY - height / 2);
4338
- const element = document.createElement("div");
4339
- element.id = nextGeneratedCanvasId(kind);
4340
- element.setAttribute(GENERATED_CANVAS_NODE_ATTR, kind);
4341
- element.style.position = "absolute";
4342
4369
  element.style.left = `${left}px`;
4343
4370
  element.style.top = `${top}px`;
4344
- element.style.width = `${width}px`;
4345
- element.style.height = `${height}px`;
4371
+ }, []);
4372
+ const insertElement = React3.useCallback((kind) => {
4373
+ if (!stateRef.current.editModeActive) return;
4374
+ saveCurrentToSession();
4375
+ const restoreSelection = buildSelectionSnapshot();
4376
+ const selectedEl = stateRef.current.selectedElement;
4377
+ const insertsAsSibling = kind === "frame" || kind === "text";
4378
+ const hasSelection = insertsAsSibling && selectedEl !== null && selectedEl !== document.body && selectedEl.parentElement !== null;
4379
+ const element = document.createElement(kind === "text" ? "p" : "div");
4380
+ element.id = nextGeneratedCanvasId(kind);
4381
+ element.setAttribute(GENERATED_CANVAS_NODE_ATTR, kind);
4346
4382
  element.style.boxSizing = "border-box";
4347
- element.style.borderRadius = kind === "frame" ? "16px" : "12px";
4348
- element.style.border = "1px solid rgba(13, 153, 255, 0.35)";
4349
- element.style.zIndex = "1";
4350
4383
  if (kind === "frame") {
4351
- element.style.display = "flex";
4352
- element.style.flexDirection = "column";
4353
- element.style.gap = "12px";
4354
- element.style.padding = "16px";
4355
- element.style.background = "rgba(255, 255, 255, 0.92)";
4356
- element.style.boxShadow = "0 10px 30px rgba(15, 23, 42, 0.10)";
4357
- } else {
4384
+ element.style.width = "100px";
4385
+ element.style.height = "100px";
4386
+ element.style.background = "#F5F5F5";
4387
+ element.style.border = "1px solid #E0E0E0";
4388
+ } else if (kind === "div") {
4389
+ element.style.width = "160px";
4390
+ element.style.height = "96px";
4391
+ element.style.borderRadius = "12px";
4392
+ element.style.border = "1px solid rgba(13, 153, 255, 0.35)";
4358
4393
  element.style.background = "rgba(13, 153, 255, 0.08)";
4394
+ } else {
4395
+ element.textContent = "Text";
4396
+ element.style.display = "inline-block";
4397
+ element.style.margin = "0";
4398
+ element.style.minHeight = "24px";
4399
+ element.style.textAlign = "center";
4400
+ }
4401
+ if (hasSelection) {
4402
+ const insertionParent = selectedEl.parentElement;
4403
+ const refNode = selectedEl.nextSibling;
4404
+ if (refNode) {
4405
+ insertionParent.insertBefore(element, refNode);
4406
+ } else {
4407
+ insertionParent.appendChild(element);
4408
+ }
4409
+ } else {
4410
+ element.style.position = "absolute";
4411
+ element.style.zIndex = "1";
4412
+ if (kind === "text") {
4413
+ element.style.left = "0px";
4414
+ element.style.top = "0px";
4415
+ element.style.visibility = "hidden";
4416
+ document.body.appendChild(element);
4417
+ centerElementOnBody(element);
4418
+ element.style.visibility = "";
4419
+ } else {
4420
+ centerElementOnBody(
4421
+ element,
4422
+ kind === "frame" ? { width: 100, height: 100 } : { width: 160, height: 96 }
4423
+ );
4424
+ document.body.appendChild(element);
4425
+ }
4359
4426
  }
4360
- document.body.appendChild(element);
4361
4427
  pushUndo({
4362
4428
  type: "structure",
4363
4429
  restoreSelection,
@@ -4371,7 +4437,8 @@ function useSessionManager({
4371
4437
  primaryElement: element,
4372
4438
  pushUndo: false
4373
4439
  });
4374
- }, [applySelection, buildSelectionSnapshot, pushUndo, saveCurrentToSession, stateRef]);
4440
+ onElementInsertedRef.current?.(kind, element);
4441
+ }, [applySelection, buildSelectionSnapshot, centerElementOnBody, onElementInsertedRef, pushUndo, saveCurrentToSession, stateRef]);
4375
4442
  const groupSelection = React3.useCallback(() => {
4376
4443
  const selected = getSanitizedSelection(stateRef.current.selectedElements);
4377
4444
  if (selected.length < 2) return;
@@ -4467,9 +4534,17 @@ function useSessionManager({
4467
4534
  }));
4468
4535
  const sessionSnapshots = /* @__PURE__ */ new Map();
4469
4536
  for (const el of selected) {
4470
- const edit = sessionEditsRef.current.get(el);
4471
- if (edit) sessionSnapshots.set(el, edit);
4472
- sessionEditsRef.current.delete(el);
4537
+ const existing = sessionEditsRef.current.get(el);
4538
+ sessionSnapshots.set(el, existing ?? null);
4539
+ sessionEditsRef.current.set(el, existing ? { ...existing, deleted: true } : {
4540
+ element: el,
4541
+ locator: getElementLocator(el),
4542
+ originalStyles: {},
4543
+ pendingStyles: {},
4544
+ move: null,
4545
+ textEdit: null,
4546
+ deleted: true
4547
+ });
4473
4548
  }
4474
4549
  syncSessionItemCount();
4475
4550
  for (const { element } of snapshots) {
@@ -4490,7 +4565,8 @@ function useSessionManager({
4490
4565
  }
4491
4566
  }
4492
4567
  for (const [el, edit] of sessionSnapshots) {
4493
- sessionEditsRef.current.set(el, edit);
4568
+ if (edit) sessionEditsRef.current.set(el, edit);
4569
+ else sessionEditsRef.current.delete(el);
4494
4570
  }
4495
4571
  syncSessionItemCount();
4496
4572
  }
@@ -4881,7 +4957,7 @@ function useSessionManager({
4881
4957
  saveCurrentToSession();
4882
4958
  const edits = [];
4883
4959
  for (const edit of sessionEditsRef.current.values()) {
4884
- if (!edit.element.isConnected) {
4960
+ if (!edit.element.isConnected && !edit.deleted) {
4885
4961
  sessionEditsRef.current.delete(edit.element);
4886
4962
  continue;
4887
4963
  }
@@ -5050,6 +5126,7 @@ ${exportMarkdown}`);
5050
5126
 
5051
5127
  // src/use-text-and-comments.ts
5052
5128
  var React4 = __toESM(require("react"));
5129
+ var GENERATED_CANVAS_NODE_ATTR2 = "data-made-refine-canvas-node";
5053
5130
  function clampUnit(value) {
5054
5131
  if (!Number.isFinite(value)) return 0;
5055
5132
  return Math.max(0, Math.min(1, value));
@@ -5085,6 +5162,94 @@ function useTextAndComments({
5085
5162
  editingElement.style.outlineOffset = "";
5086
5163
  editingElement.style.cursor = originalCursor;
5087
5164
  editingElement.blur();
5165
+ const isGeneratedTextElement = editingElement.getAttribute(GENERATED_CANVAS_NODE_ATTR2) === "text";
5166
+ const shouldDeleteGeneratedText = isGeneratedTextElement && newText.trim().length === 0;
5167
+ if (shouldDeleteGeneratedText) {
5168
+ const parent = editingElement.parentElement;
5169
+ const nextSibling = editingElement.nextSibling;
5170
+ const current = stateRef.current;
5171
+ const removedComments = current.comments.filter((comment) => comment.element === editingElement);
5172
+ const removedCommentIds = new Set(removedComments.map((comment) => comment.id));
5173
+ const remainingComments = current.comments.filter((comment) => comment.element !== editingElement);
5174
+ const restoredActiveCommentId = current.activeCommentId && removedCommentIds.has(current.activeCommentId) ? current.activeCommentId : null;
5175
+ const existingSessionEdit = existing ? {
5176
+ ...existing,
5177
+ originalStyles: { ...existing.originalStyles },
5178
+ pendingStyles: { ...existing.pendingStyles },
5179
+ move: existing.move ? { ...existing.move } : null,
5180
+ textEdit: existing.textEdit ? { ...existing.textEdit } : null
5181
+ } : null;
5182
+ const restoreSelection = {
5183
+ isOpen: current.isOpen,
5184
+ selectedElement: current.selectedElement,
5185
+ selectedElements: [...current.selectedElements],
5186
+ selectionAnchorElement: current.selectionAnchorElement,
5187
+ originalStyles: { ...current.originalStyles },
5188
+ pendingStyles: { ...current.pendingStyles }
5189
+ };
5190
+ sessionEditsRef.current.delete(editingElement);
5191
+ if (editingElement.isConnected) {
5192
+ editingElement.remove();
5193
+ }
5194
+ pushUndo({
5195
+ type: "structure",
5196
+ restoreSelection,
5197
+ undo: () => {
5198
+ editingElement.textContent = previousText;
5199
+ if (!editingElement.isConnected && parent?.isConnected) {
5200
+ if (nextSibling && nextSibling.parentNode === parent) {
5201
+ parent.insertBefore(editingElement, nextSibling);
5202
+ } else {
5203
+ parent.appendChild(editingElement);
5204
+ }
5205
+ }
5206
+ if (existingSessionEdit) {
5207
+ sessionEditsRef.current.set(editingElement, existingSessionEdit);
5208
+ }
5209
+ setState((prev) => ({
5210
+ ...prev,
5211
+ comments: current.comments,
5212
+ activeCommentId: restoredActiveCommentId ?? prev.activeCommentId
5213
+ }));
5214
+ syncSessionItemCount(current.comments);
5215
+ }
5216
+ });
5217
+ syncSessionItemCount(remainingComments);
5218
+ setState((prev) => {
5219
+ const selectionContainsElement = prev.selectedElement === editingElement || prev.selectionAnchorElement === editingElement || prev.selectedElements.includes(editingElement);
5220
+ if (!selectionContainsElement) {
5221
+ return prev.textEditingElement === editingElement ? {
5222
+ ...prev,
5223
+ comments: prev.comments.filter((comment) => comment.element !== editingElement),
5224
+ activeCommentId: prev.activeCommentId && removedCommentIds.has(prev.activeCommentId) ? null : prev.activeCommentId,
5225
+ textEditingElement: null
5226
+ } : prev;
5227
+ }
5228
+ return {
5229
+ ...prev,
5230
+ isOpen: false,
5231
+ selectedElement: null,
5232
+ selectedElements: [],
5233
+ selectionAnchorElement: null,
5234
+ elementInfo: null,
5235
+ computedSpacing: null,
5236
+ computedBorderRadius: null,
5237
+ computedBorder: null,
5238
+ computedFlex: null,
5239
+ computedSizing: null,
5240
+ computedColor: null,
5241
+ computedBoxShadow: null,
5242
+ computedTypography: null,
5243
+ isComponentPrimitive: false,
5244
+ comments: remainingComments,
5245
+ activeCommentId: restoredActiveCommentId ? null : prev.activeCommentId,
5246
+ originalStyles: {},
5247
+ pendingStyles: {},
5248
+ textEditingElement: null
5249
+ };
5250
+ });
5251
+ return;
5252
+ }
5088
5253
  if (newText !== previousText) {
5089
5254
  pushUndo({ type: "textEdit", element: editingElement, originalText, previousText });
5090
5255
  removedSessionEditsRef.current.delete(editingElement);
@@ -5603,28 +5768,30 @@ async function toClientResponse(response) {
5603
5768
  const data = await readJsonRecord(response);
5604
5769
  const bodyOk = data?.ok;
5605
5770
  const parsedOk = typeof bodyOk === "boolean" ? bodyOk : response.ok;
5771
+ const ok = parsedOk && response.ok;
5606
5772
  return {
5607
- ok: parsedOk && response.ok,
5608
- id: readString(data, "id") ?? ""
5773
+ ok,
5774
+ id: readString(data, "id") ?? "",
5775
+ ...!ok ? { errorKind: "rejected" } : {}
5609
5776
  };
5610
5777
  }
5611
5778
  async function postWithSessionToken(path, payload) {
5612
5779
  const idempotencyKey = createIdempotencyKey();
5613
5780
  let session = await bootstrapSession();
5614
- if (!session) return { ok: false, id: "" };
5781
+ if (!session) return { ok: false, id: "", errorKind: "network" };
5615
5782
  let response;
5616
5783
  try {
5617
5784
  response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
5618
5785
  } catch {
5619
- return { ok: false, id: "" };
5786
+ return { ok: false, id: "", errorKind: "network" };
5620
5787
  }
5621
5788
  if (response.status === 401 || response.status === 403) {
5622
5789
  session = await refreshSessionToken(session) ?? await bootstrapSession(true);
5623
- if (!session) return { ok: false, id: "" };
5790
+ if (!session) return { ok: false, id: "", errorKind: "network" };
5624
5791
  try {
5625
5792
  response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
5626
5793
  } catch {
5627
- return { ok: false, id: "" };
5794
+ return { ok: false, id: "", errorKind: "network" };
5628
5795
  }
5629
5796
  }
5630
5797
  return toClientResponse(response);
@@ -5677,8 +5844,10 @@ function buildLocatorPayload(locator) {
5677
5844
  }
5678
5845
  function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrentToSession, removeSessionEdit, deleteComment }) {
5679
5846
  const [agentAvailable, setAgentAvailable] = React5.useState(false);
5847
+ const [lastSendFailure, setLastSendFailure] = React5.useState(null);
5680
5848
  const isMountedRef = React5.useRef(true);
5681
5849
  React5.useEffect(() => {
5850
+ isMountedRef.current = true;
5682
5851
  return () => {
5683
5852
  isMountedRef.current = false;
5684
5853
  };
@@ -5735,7 +5904,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5735
5904
  const resolvedPlanContext = movePlanContext ?? buildMovePlanContext(editsForPlan);
5736
5905
  const includeBatchMoveEnvelope = Boolean(options?.includeBatchMoveEnvelope && sessionEdit.move);
5737
5906
  const isBatchSend = Boolean(allEdits && allEdits.length > 1);
5738
- const exportMarkdown = sessionEdit.move ? buildSessionExport(
5907
+ const exportMarkdown = sessionEdit.move || sessionEdit.deleted ? buildSessionExport(
5739
5908
  includeBatchMoveEnvelope ? editsForPlan : [sessionEdit],
5740
5909
  [],
5741
5910
  {
@@ -5751,7 +5920,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5751
5920
  }));
5752
5921
  const moveIntent = sessionEdit.move ? getMoveIntentForEdit(sessionEdit, resolvedPlanContext) : null;
5753
5922
  const movePlan = includeBatchMoveEnvelope ? resolvedPlanContext.movePlan : null;
5754
- const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null;
5923
+ const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null || Boolean(sessionEdit.deleted);
5755
5924
  if (!hasMeaningfulPayload) return true;
5756
5925
  const profile = getExportContentProfile(
5757
5926
  [sessionEdit],
@@ -5765,17 +5934,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5765
5934
  textChange: sessionEdit.textEdit ?? null,
5766
5935
  moveIntent,
5767
5936
  ...movePlan ? { movePlan } : {},
5937
+ ...sessionEdit.deleted ? { deleted: true } : {},
5768
5938
  exportMarkdown: withInstruction(profile, exportMarkdown)
5769
5939
  });
5770
5940
  if (result.ok) {
5771
5941
  removeSessionEdit(sessionEdit.element);
5942
+ updateAgentAvailability(true);
5943
+ } else {
5944
+ const kind = result.errorKind === "network" ? "unreachable" : "rejected";
5945
+ updateAgentAvailability(result.errorKind === "network" ? false : true);
5946
+ if (options?._isBatchCall) {
5947
+ options._batchFailKinds?.push(result.errorKind ?? "rejected");
5948
+ } else if (isMountedRef.current) {
5949
+ setLastSendFailure({
5950
+ reason: kind,
5951
+ failedEditElements: [sessionEdit.element],
5952
+ failedCommentIds: [],
5953
+ at: Date.now()
5954
+ });
5955
+ }
5772
5956
  }
5773
- return updateAgentAvailability(result.ok);
5774
- } catch {
5775
- return updateAgentAvailability(false);
5957
+ return result.ok;
5958
+ } catch (err) {
5959
+ updateAgentAvailability(false);
5960
+ if (options?._isBatchCall) {
5961
+ throw err;
5962
+ }
5963
+ if (isMountedRef.current) {
5964
+ setLastSendFailure({
5965
+ reason: "unreachable",
5966
+ failedEditElements: [sessionEdit.element],
5967
+ failedCommentIds: [],
5968
+ at: Date.now()
5969
+ });
5970
+ }
5971
+ return false;
5776
5972
  }
5777
5973
  }, [updateAgentAvailability, removeSessionEdit]);
5778
- const sendSessionCommentToAgent = React5.useCallback(async (comment) => {
5974
+ const sendSessionCommentToAgent = React5.useCallback(async (comment, _options) => {
5779
5975
  const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies);
5780
5976
  const commentProfile = { hasCssEdits: false, hasTextEdits: false, hasMoves: false, hasComments: true };
5781
5977
  try {
@@ -5787,13 +5983,40 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5787
5983
  });
5788
5984
  if (result.ok) {
5789
5985
  deleteComment(comment.id);
5986
+ updateAgentAvailability(true);
5987
+ } else {
5988
+ const kind = result.errorKind === "network" ? "unreachable" : "rejected";
5989
+ updateAgentAvailability(result.errorKind === "network" ? false : true);
5990
+ if (_options?._isBatchCall) {
5991
+ _options._batchFailKinds?.push(result.errorKind ?? "rejected");
5992
+ } else if (isMountedRef.current) {
5993
+ setLastSendFailure({
5994
+ reason: kind,
5995
+ failedEditElements: [],
5996
+ failedCommentIds: [comment.id],
5997
+ at: Date.now()
5998
+ });
5999
+ }
5790
6000
  }
5791
- return updateAgentAvailability(result.ok);
5792
- } catch {
5793
- return updateAgentAvailability(false);
6001
+ return result.ok;
6002
+ } catch (err) {
6003
+ updateAgentAvailability(false);
6004
+ if (_options?._isBatchCall) {
6005
+ throw err;
6006
+ }
6007
+ if (isMountedRef.current) {
6008
+ setLastSendFailure({
6009
+ reason: "unreachable",
6010
+ failedEditElements: [],
6011
+ failedCommentIds: [comment.id],
6012
+ at: Date.now()
6013
+ });
6014
+ }
6015
+ return false;
5794
6016
  }
5795
6017
  }, [updateAgentAvailability, deleteComment]);
5796
6018
  const sendEditToAgent2 = React5.useCallback(async () => {
6019
+ if (isMountedRef.current) setLastSendFailure(null);
5797
6020
  const current = stateRef.current;
5798
6021
  if (current.selectedElements.length > 1) {
5799
6022
  saveCurrentToSession();
@@ -5828,9 +6051,28 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5828
6051
  removeSessionEdit(el);
5829
6052
  }
5830
6053
  }
6054
+ updateAgentAvailability(true);
6055
+ } else {
6056
+ updateAgentAvailability(result.errorKind === "network" ? false : true);
6057
+ if (isMountedRef.current) {
6058
+ setLastSendFailure({
6059
+ reason: result.errorKind === "network" ? "unreachable" : "rejected",
6060
+ failedEditElements: editsWithChanges.map((e) => e.element),
6061
+ failedCommentIds: [],
6062
+ at: Date.now()
6063
+ });
6064
+ }
5831
6065
  }
5832
- return updateAgentAvailability(result.ok);
6066
+ return result.ok;
5833
6067
  } catch {
6068
+ if (isMountedRef.current) {
6069
+ setLastSendFailure({
6070
+ reason: "unreachable",
6071
+ failedEditElements: editsWithChanges.map((e) => e.element),
6072
+ failedCommentIds: [],
6073
+ at: Date.now()
6074
+ });
6075
+ }
5834
6076
  return updateAgentAvailability(false);
5835
6077
  }
5836
6078
  }
@@ -5853,11 +6095,13 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5853
6095
  return sendSessionEditToAgent(editToSend);
5854
6096
  }, [canSendEditToAgent, sendSessionEditToAgent, saveCurrentToSession]);
5855
6097
  const sendCommentToAgent2 = React5.useCallback(async (id) => {
6098
+ if (isMountedRef.current) setLastSendFailure(null);
5856
6099
  const comment = stateRef.current.comments.find((c) => c.id === id);
5857
6100
  if (!comment) return false;
5858
6101
  return sendSessionCommentToAgent(comment);
5859
6102
  }, [sendSessionCommentToAgent]);
5860
6103
  const sendAllSessionItemsToAgent = React5.useCallback(async () => {
6104
+ if (isMountedRef.current) setLastSendFailure(null);
5861
6105
  const items = getSessionItems();
5862
6106
  const current = stateRef.current;
5863
6107
  const contextOnlyBlocks = getContextOnlyBlocks(current.selectedElements, items);
@@ -5866,25 +6110,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5866
6110
  const movePlanContext = buildMovePlanContext(allEdits);
5867
6111
  let moveEnvelopeSent = false;
5868
6112
  let allSucceeded = true;
6113
+ const failedEditElements = [];
6114
+ const failedCommentIds = [];
6115
+ let anyThrown = false;
6116
+ const batchFailKinds = [];
5869
6117
  for (const item of items) {
5870
6118
  let succeeded;
5871
6119
  if (item.type === "edit") {
5872
6120
  const hasMoveIntent = Boolean(item.edit.move && getMoveIntentForEdit(item.edit, movePlanContext));
5873
6121
  const includeBatchMoveEnvelope = hasMoveIntent && !moveEnvelopeSent;
5874
- succeeded = await sendSessionEditToAgent(
5875
- item.edit,
5876
- allEdits,
5877
- movePlanContext,
5878
- { includeBatchMoveEnvelope }
5879
- );
6122
+ try {
6123
+ succeeded = await sendSessionEditToAgent(
6124
+ item.edit,
6125
+ allEdits,
6126
+ movePlanContext,
6127
+ { includeBatchMoveEnvelope, _isBatchCall: true, _batchFailKinds: batchFailKinds }
6128
+ );
6129
+ if (!succeeded) failedEditElements.push(item.edit.element);
6130
+ } catch {
6131
+ succeeded = false;
6132
+ anyThrown = true;
6133
+ failedEditElements.push(item.edit.element);
6134
+ }
5880
6135
  if (includeBatchMoveEnvelope) moveEnvelopeSent = true;
5881
6136
  } else {
5882
- succeeded = await sendSessionCommentToAgent(item.comment);
6137
+ try {
6138
+ succeeded = await sendSessionCommentToAgent(item.comment, { _isBatchCall: true, _batchFailKinds: batchFailKinds });
6139
+ if (!succeeded) failedCommentIds.push(item.comment.id);
6140
+ } catch {
6141
+ succeeded = false;
6142
+ anyThrown = true;
6143
+ failedCommentIds.push(item.comment.id);
6144
+ }
5883
6145
  }
5884
6146
  if (!succeeded) {
5885
6147
  allSucceeded = false;
5886
6148
  }
5887
6149
  }
6150
+ let contextBlockFailed = false;
5888
6151
  if (contextOnlyBlocks.length > 0) {
5889
6152
  const primaryEl = current.selectedElements.find(
5890
6153
  (el) => el.isConnected && !allEdits.some((e) => e.element === el)
@@ -5898,16 +6161,39 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
5898
6161
  moveIntent: null,
5899
6162
  exportMarkdown: contextOnlyBlocks.join("\n\n")
5900
6163
  });
5901
- if (!result.ok) allSucceeded = false;
6164
+ if (result.ok) {
6165
+ updateAgentAvailability(true);
6166
+ } else {
6167
+ updateAgentAvailability(result.errorKind === "network" ? false : true);
6168
+ allSucceeded = false;
6169
+ contextBlockFailed = true;
6170
+ }
5902
6171
  } catch {
6172
+ updateAgentAvailability(false);
5903
6173
  allSucceeded = false;
6174
+ anyThrown = true;
6175
+ contextBlockFailed = true;
5904
6176
  }
5905
6177
  }
5906
6178
  }
6179
+ if (!allSucceeded && isMountedRef.current) {
6180
+ const reason = anyThrown || batchFailKinds.includes("network") ? "unreachable" : "rejected";
6181
+ setLastSendFailure({
6182
+ reason,
6183
+ failedEditElements,
6184
+ failedCommentIds,
6185
+ at: Date.now()
6186
+ });
6187
+ }
5907
6188
  return allSucceeded;
5908
- }, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent]);
6189
+ }, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent, updateAgentAvailability]);
6190
+ const clearSendFailure = React5.useCallback(() => {
6191
+ if (isMountedRef.current) setLastSendFailure(null);
6192
+ }, []);
5909
6193
  return {
5910
6194
  agentAvailable,
6195
+ lastSendFailure,
6196
+ clearSendFailure,
5911
6197
  canSendEditToAgent,
5912
6198
  sendEditToAgent: sendEditToAgent2,
5913
6199
  sendCommentToAgent: sendCommentToAgent2,
@@ -5954,7 +6240,9 @@ function useKeyboardShortcuts({
5954
6240
  const s = stateRef.current;
5955
6241
  const undoShortcutPressed = usesMetaForUndo ? e.metaKey && !e.ctrlKey && !e.altKey : e.ctrlKey && !e.metaKey && !e.altKey;
5956
6242
  if (undoShortcutPressed && e.key === "z" && !e.shiftKey) {
6243
+ if (!s.editModeActive) return;
5957
6244
  if (s.textEditingElement) return;
6245
+ if (isInputFocused()) return;
5958
6246
  e.preventDefault();
5959
6247
  undo();
5960
6248
  return;
@@ -6009,6 +6297,11 @@ function useKeyboardShortcuts({
6009
6297
  insertElement("frame");
6010
6298
  return;
6011
6299
  }
6300
+ if (lowerKey === "t") {
6301
+ e.preventDefault();
6302
+ insertElement("text");
6303
+ return;
6304
+ }
6012
6305
  if (lowerKey === "d") {
6013
6306
  e.preventDefault();
6014
6307
  insertElement("div");
@@ -6671,6 +6964,10 @@ function DirectEditProvider({ children }) {
6671
6964
  const undoStackRef = React8.useRef([]);
6672
6965
  const sessionEditsRef = React8.useRef(/* @__PURE__ */ new Map());
6673
6966
  const removedSessionEditsRef = React8.useRef(/* @__PURE__ */ new WeakSet());
6967
+ const commentDraftTextRef = React8.useRef("");
6968
+ const commentDraftBlockedHandlerRef = React8.useRef(null);
6969
+ const onElementInsertedRef = React8.useRef(null);
6970
+ const textInsertRafRef = React8.useRef(null);
6674
6971
  const [sessionEditCount, setSessionEditCount] = React8.useState(0);
6675
6972
  const stateRef = React8.useRef(state);
6676
6973
  React8.useEffect(() => {
@@ -6705,12 +7002,13 @@ function DirectEditProvider({ children }) {
6705
7002
  clearSessionEdits,
6706
7003
  groupSelection,
6707
7004
  deleteSelection,
6708
- insertElement
7005
+ insertElement: insertElementBase
6709
7006
  } = useSessionManager({
6710
7007
  stateRef,
6711
7008
  sessionEditsRef,
6712
7009
  removedSessionEditsRef,
6713
7010
  undoStackRef,
7011
+ onElementInsertedRef,
6714
7012
  pushUndo,
6715
7013
  setState,
6716
7014
  setSessionEditCount
@@ -6760,6 +7058,41 @@ function DirectEditProvider({ children }) {
6760
7058
  syncSessionItemCount,
6761
7059
  setState
6762
7060
  });
7061
+ React8.useEffect(() => {
7062
+ onElementInsertedRef.current = (kind, element) => {
7063
+ if (kind === "text") {
7064
+ if (textInsertRafRef.current) {
7065
+ cancelAnimationFrame(textInsertRafRef.current);
7066
+ }
7067
+ textInsertRafRef.current = requestAnimationFrame(() => {
7068
+ textInsertRafRef.current = null;
7069
+ if (element.isConnected) {
7070
+ startTextEditing(element);
7071
+ }
7072
+ });
7073
+ }
7074
+ };
7075
+ return () => {
7076
+ if (textInsertRafRef.current) {
7077
+ cancelAnimationFrame(textInsertRafRef.current);
7078
+ textInsertRafRef.current = null;
7079
+ }
7080
+ onElementInsertedRef.current = null;
7081
+ };
7082
+ }, [startTextEditing]);
7083
+ const setCommentDraftText = React8.useCallback((text) => {
7084
+ commentDraftTextRef.current = text;
7085
+ }, []);
7086
+ const setCommentDraftBlockedHandler = React8.useCallback((handler) => {
7087
+ commentDraftBlockedHandlerRef.current = handler;
7088
+ }, []);
7089
+ const hasPendingCommentDraft = React8.useCallback(() => {
7090
+ const activeCommentId = stateRef.current.activeCommentId;
7091
+ if (!activeCommentId) return false;
7092
+ const active = stateRef.current.comments.find((comment) => comment.id === activeCommentId);
7093
+ if (!active) return false;
7094
+ return active.text.trim().length === 0 && commentDraftTextRef.current.trim().length > 0;
7095
+ }, []);
6763
7096
  const { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 } = useCanvas({
6764
7097
  stateRef,
6765
7098
  setState
@@ -6896,6 +7229,8 @@ function DirectEditProvider({ children }) {
6896
7229
  }, [state.editModeActive]);
6897
7230
  const {
6898
7231
  agentAvailable,
7232
+ lastSendFailure,
7233
+ clearSendFailure,
6899
7234
  canSendEditToAgent,
6900
7235
  sendEditToAgent: sendEditToAgent2,
6901
7236
  sendCommentToAgent: sendCommentToAgent2,
@@ -6922,6 +7257,16 @@ function DirectEditProvider({ children }) {
6922
7257
  } catch {
6923
7258
  }
6924
7259
  }, []);
7260
+ const insertElement = React8.useCallback((kind) => {
7261
+ if (hasPendingCommentDraft()) {
7262
+ commentDraftBlockedHandlerRef.current?.();
7263
+ return;
7264
+ }
7265
+ if (stateRef.current.textEditingElement) {
7266
+ commitTextEditing();
7267
+ }
7268
+ insertElementBase(kind);
7269
+ }, [commitTextEditing, hasPendingCommentDraft, insertElementBase, stateRef]);
6925
7270
  useKeyboardShortcuts({
6926
7271
  stateRef,
6927
7272
  toggleEditMode,
@@ -6951,9 +7296,10 @@ function DirectEditProvider({ children }) {
6951
7296
  const stateContextValue = React8.useMemo(() => ({
6952
7297
  ...state,
6953
7298
  agentAvailable,
7299
+ lastSendFailure,
6954
7300
  sessionEditCount,
6955
7301
  multiSelectContextCount
6956
- }), [agentAvailable, state, sessionEditCount, multiSelectContextCount]);
7302
+ }), [agentAvailable, lastSendFailure, state, sessionEditCount, multiSelectContextCount]);
6957
7303
  const actionsContextValue = React8.useMemo(() => ({
6958
7304
  selectElement,
6959
7305
  selectElements,
@@ -6976,6 +7322,7 @@ function DirectEditProvider({ children }) {
6976
7322
  updateTypographyProperty,
6977
7323
  resetToOriginal,
6978
7324
  exportEdits,
7325
+ clearSendFailure,
6979
7326
  canSendEditToAgent,
6980
7327
  sendEditToAgent: sendEditToAgent2,
6981
7328
  sendAllSessionItemsToAgent,
@@ -7000,6 +7347,8 @@ function DirectEditProvider({ children }) {
7000
7347
  removeSessionEdit,
7001
7348
  startTextEditing,
7002
7349
  commitTextEditing,
7350
+ setCommentDraftText,
7351
+ setCommentDraftBlockedHandler,
7003
7352
  groupSelection,
7004
7353
  deleteSelection,
7005
7354
  insertElement,
@@ -7029,6 +7378,7 @@ function DirectEditProvider({ children }) {
7029
7378
  updateTypographyProperty,
7030
7379
  resetToOriginal,
7031
7380
  exportEdits,
7381
+ clearSendFailure,
7032
7382
  canSendEditToAgent,
7033
7383
  sendEditToAgent2,
7034
7384
  sendAllSessionItemsToAgent,
@@ -7053,6 +7403,8 @@ function DirectEditProvider({ children }) {
7053
7403
  removeSessionEdit,
7054
7404
  startTextEditing,
7055
7405
  commitTextEditing,
7406
+ setCommentDraftText,
7407
+ setCommentDraftBlockedHandler,
7056
7408
  groupSelection,
7057
7409
  deleteSelection,
7058
7410
  insertElement,
@@ -7485,6 +7837,7 @@ function useMove({ onMoveComplete }) {
7485
7837
  { x: 0, y: 0, scaleX: 1, scaleY: 1 }
7486
7838
  );
7487
7839
  const originalTransformRef = React12.useRef("");
7840
+ const composeBaseRef = React12.useRef("");
7488
7841
  const reorderPreviewRef = React12.useRef(/* @__PURE__ */ new Map());
7489
7842
  React12.useEffect(() => {
7490
7843
  dragStateRef.current = dragState;
@@ -7579,6 +7932,7 @@ function useMove({ onMoveComplete }) {
7579
7932
  }
7580
7933
  clearReorderPreview();
7581
7934
  originalTransformRef.current = "";
7935
+ composeBaseRef.current = "";
7582
7936
  initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
7583
7937
  dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
7584
7938
  dragGuardRef.current.deactivate();
@@ -7600,6 +7954,7 @@ function useMove({ onMoveComplete }) {
7600
7954
  draggedElement.style.opacity = "";
7601
7955
  clearReorderPreview();
7602
7956
  originalTransformRef.current = "";
7957
+ composeBaseRef.current = "";
7603
7958
  initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
7604
7959
  const dragMode = dragOptionsRef.current.mode;
7605
7960
  dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
@@ -7660,7 +8015,14 @@ function useMove({ onMoveComplete }) {
7660
8015
  scaleX: element.offsetWidth > 0 ? rect.width / element.offsetWidth : 1,
7661
8016
  scaleY: element.offsetHeight > 0 ? rect.height / element.offsetHeight : 1
7662
8017
  };
7663
- originalTransformRef.current = element.style.transform;
8018
+ const inlineTransform = element.style.transform;
8019
+ originalTransformRef.current = inlineTransform;
8020
+ if (inlineTransform) {
8021
+ composeBaseRef.current = inlineTransform;
8022
+ } else {
8023
+ const computed = getComputedStyle(element).transform;
8024
+ composeBaseRef.current = computed && computed !== "none" ? computed : "";
8025
+ }
7664
8026
  dragGuardRef.current.activate();
7665
8027
  setDragState({
7666
8028
  isDragging: true,
@@ -7693,7 +8055,8 @@ function useMove({ onMoveComplete }) {
7693
8055
  const { x, y, scaleX, scaleY } = initialRectRef.current;
7694
8056
  const dx = (e.clientX - dragOffset.x - x) / scaleX;
7695
8057
  const dy = (e.clientY - dragOffset.y - y) / scaleY;
7696
- draggedElement.style.transform = `translate(${dx}px, ${dy}px)`;
8058
+ const base = composeBaseRef.current;
8059
+ draggedElement.style.transform = base ? `translate(${dx}px, ${dy}px) ${base}` : `translate(${dx}px, ${dy}px)`;
7697
8060
  }
7698
8061
  if (dragOptionsRef.current.mode === "position") {
7699
8062
  let container2 = findLayoutContainerAtPoint(
@@ -8560,6 +8923,7 @@ function SelectedCommentComposer({
8560
8923
  comment,
8561
8924
  attentionNonce,
8562
8925
  draftRef,
8926
+ onDraftTextChange,
8563
8927
  onSubmit,
8564
8928
  onCancel
8565
8929
  }) {
@@ -8605,7 +8969,8 @@ function SelectedCommentComposer({
8605
8969
  }, [attentionNonce]);
8606
8970
  React17.useEffect(() => {
8607
8971
  if (draftRef) draftRef.current = text;
8608
- }, [draftRef, text]);
8972
+ onDraftTextChange?.(text);
8973
+ }, [draftRef, onDraftTextChange, text]);
8609
8974
  const submit = React17.useCallback(() => {
8610
8975
  const nextText = text.trim();
8611
8976
  if (!nextText) return;
@@ -8641,6 +9006,7 @@ function SelectedCommentComposer({
8641
9006
  {
8642
9007
  ref: inputRef,
8643
9008
  rows: 1,
9009
+ autoFocus: true,
8644
9010
  "aria-invalid": showError,
8645
9011
  className: cn(
8646
9012
  "min-h-[18px] min-w-0 flex-1 resize-none overflow-hidden bg-transparent px-1.5 py-1.5 text-xs leading-[18px] text-foreground placeholder:text-muted-foreground focus:outline-none",
@@ -8721,6 +9087,7 @@ function MoveOverlay({ dropIndicator }) {
8721
9087
 
8722
9088
  // src/selection-overlay.tsx
8723
9089
  var React19 = __toESM(require("react"));
9090
+ var import_lucide_react2 = require("lucide-react");
8724
9091
 
8725
9092
  // src/use-selection-resize.ts
8726
9093
  var React18 = __toESM(require("react"));
@@ -9013,7 +9380,10 @@ function SelectionOverlay({
9013
9380
  onSelectPageFrame,
9014
9381
  isComponentPrimitive = false,
9015
9382
  enableResizeHandles = false,
9016
- onResizeSizingChange
9383
+ onResizeSizingChange,
9384
+ showCommentPill = false,
9385
+ isCommentActive = false,
9386
+ onCommentPillClick
9017
9387
  }) {
9018
9388
  const selectionColor = isComponentPrimitive ? COMPONENT_PURPLE : BLUE3;
9019
9389
  const rectElement = isDragging && draggedElement ? draggedElement : selectedElement;
@@ -9377,7 +9747,7 @@ function SelectionOverlay({
9377
9747
  }
9378
9748
  }
9379
9749
  ),
9380
- !isTextEditing && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
9750
+ !isTextEditing && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
9381
9751
  "div",
9382
9752
  {
9383
9753
  "data-direct-edit": "dimension-label",
@@ -9392,24 +9762,69 @@ function SelectionOverlay({
9392
9762
  alignItems: "center",
9393
9763
  gap: "4px"
9394
9764
  },
9395
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
9396
- "span",
9397
- {
9398
- style: {
9399
- background: selectionColor,
9400
- color: "white",
9401
- fontSize: "11px",
9402
- lineHeight: "20px",
9403
- padding: "0 6px",
9404
- borderRadius: "4px",
9405
- whiteSpace: "nowrap",
9406
- fontFamily: "system-ui, sans-serif",
9407
- fontWeight: 500,
9408
- letterSpacing: "-0.01em"
9409
- },
9410
- children: dimensionText
9411
- }
9412
- )
9765
+ children: [
9766
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
9767
+ "span",
9768
+ {
9769
+ style: {
9770
+ background: selectionColor,
9771
+ color: "white",
9772
+ fontSize: "11px",
9773
+ lineHeight: "20px",
9774
+ padding: "0 6px",
9775
+ borderRadius: "4px",
9776
+ whiteSpace: "nowrap",
9777
+ fontFamily: "system-ui, sans-serif",
9778
+ fontWeight: 500,
9779
+ letterSpacing: "-0.01em"
9780
+ },
9781
+ children: dimensionText
9782
+ }
9783
+ ),
9784
+ showCommentPill && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Tooltip, { children: [
9785
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
9786
+ TooltipTrigger,
9787
+ {
9788
+ render: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
9789
+ "button",
9790
+ {
9791
+ type: "button",
9792
+ "data-direct-edit": "comment-pill",
9793
+ "aria-label": "Toggle comment",
9794
+ style: {
9795
+ display: "inline-flex",
9796
+ alignItems: "center",
9797
+ justifyContent: "center",
9798
+ background: isCommentActive ? "white" : selectionColor,
9799
+ color: isCommentActive ? selectionColor : "white",
9800
+ height: "20px",
9801
+ width: "24px",
9802
+ borderRadius: "4px",
9803
+ border: "none",
9804
+ boxSizing: "border-box",
9805
+ cursor: "pointer",
9806
+ pointerEvents: "auto",
9807
+ padding: 0,
9808
+ opacity: 1
9809
+ },
9810
+ onClick: (e) => {
9811
+ e.stopPropagation();
9812
+ onCommentPillClick?.();
9813
+ },
9814
+ onPointerEnter: (e) => {
9815
+ e.currentTarget.style.opacity = "0.85";
9816
+ },
9817
+ onPointerLeave: (e) => {
9818
+ e.currentTarget.style.opacity = "1";
9819
+ }
9820
+ }
9821
+ ),
9822
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react2.MessageSquare, { style: { width: 12, height: 12 }, strokeWidth: 2.5 })
9823
+ }
9824
+ ),
9825
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TooltipContent, { side: "bottom", children: "Comment" })
9826
+ ] }) })
9827
+ ]
9413
9828
  }
9414
9829
  ),
9415
9830
  !isDragging && !isTextEditing && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
@@ -9627,7 +10042,7 @@ function MultiSelectionOverlay({ selectedElements }) {
9627
10042
 
9628
10043
  // src/comment-overlay.tsx
9629
10044
  var React21 = __toESM(require("react"));
9630
- var import_lucide_react2 = require("lucide-react");
10045
+ var import_lucide_react3 = require("lucide-react");
9631
10046
  var import_jsx_runtime11 = require("react/jsx-runtime");
9632
10047
  var COMMENT_CARD_WIDTH = 280;
9633
10048
  function getTopRightCommentPosition(element, fallback) {
@@ -9878,7 +10293,7 @@ function NewCommentInput({
9878
10293
  onClick: () => {
9879
10294
  if (text.trim()) onSubmit(text.trim());
9880
10295
  },
9881
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.ArrowUp, {})
10296
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.ArrowUp, {})
9882
10297
  }
9883
10298
  )
9884
10299
  ]
@@ -9973,7 +10388,7 @@ function CommentThread({
9973
10388
  onClick: onClose
9974
10389
  }
9975
10390
  ),
9976
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.ChevronLeft, {})
10391
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.ChevronLeft, {})
9977
10392
  }
9978
10393
  ),
9979
10394
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TooltipContent, { side: "bottom", children: "Back" })
@@ -9995,7 +10410,7 @@ function CommentThread({
9995
10410
  onClick: handleCopy
9996
10411
  }
9997
10412
  ),
9998
- children: copied ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.Check, { className: "text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.Copy, {})
10413
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.Check, { className: "text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.Copy, {})
9999
10414
  }
10000
10415
  ),
10001
10416
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TooltipContent, { side: "bottom", children: copied ? "Copied" : "Copy" })
@@ -10013,7 +10428,7 @@ function CommentThread({
10013
10428
  onClick: handleSendToAgent
10014
10429
  }
10015
10430
  ),
10016
- children: sendStatus === "sent" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.Check, { className: "text-green-500" }) : sendStatus === "offline" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.X, { className: "text-red-500" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.Send, {})
10431
+ children: sendStatus === "sent" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.Check, { className: "text-green-500" }) : sendStatus === "offline" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.X, { className: "text-red-500" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.Send, {})
10017
10432
  }
10018
10433
  ),
10019
10434
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TooltipContent, { side: "bottom", children: sendStatus === "sent" ? "Sent" : sendStatus === "offline" ? "Offline" : "Send to Agent" })
@@ -10031,7 +10446,7 @@ function CommentThread({
10031
10446
  onClick: onDelete
10032
10447
  }
10033
10448
  ),
10034
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.Trash2, {})
10449
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.Trash2, {})
10035
10450
  }
10036
10451
  ),
10037
10452
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TooltipContent, { side: "bottom", children: "Delete" })
@@ -10090,7 +10505,7 @@ function CommentThread({
10090
10505
  ),
10091
10506
  disabled: !replyText.trim(),
10092
10507
  onClick: handleSubmitReply,
10093
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.ArrowUp, {})
10508
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react3.ArrowUp, {})
10094
10509
  }
10095
10510
  )
10096
10511
  ] })
@@ -10278,7 +10693,7 @@ var Slider = React24.forwardRef(({ className, ...props }, ref) => /* @__PURE__ *
10278
10693
  Slider.displayName = "Slider";
10279
10694
 
10280
10695
  // src/panel/border-radius-inputs.tsx
10281
- var import_lucide_react3 = require("lucide-react");
10696
+ var import_lucide_react4 = require("lucide-react");
10282
10697
  var import_jsx_runtime15 = require("react/jsx-runtime");
10283
10698
  var BORDER_RADIUS_FULL = 9999;
10284
10699
  var BORDER_RADIUS_SLIDER_MAX = 49;
@@ -10352,7 +10767,7 @@ function BorderRadiusInputs({ values, onChange }) {
10352
10767
  size: "icon",
10353
10768
  className: "size-7 shrink-0",
10354
10769
  onClick: () => setIndividual(false),
10355
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react3.Columns2, {})
10770
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react4.Columns2, {})
10356
10771
  }
10357
10772
  ) })
10358
10773
  ] }),
@@ -10424,7 +10839,7 @@ function BorderRadiusInputs({ values, onChange }) {
10424
10839
  size: "icon",
10425
10840
  className: "size-7 shrink-0 text-muted-foreground",
10426
10841
  onClick: () => setIndividual(true),
10427
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react3.Grid2x2, {})
10842
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react4.Grid2x2, {})
10428
10843
  }
10429
10844
  ) })
10430
10845
  ] });
@@ -10453,7 +10868,7 @@ var SelectItemIndicator = import_select.Select.ItemIndicator;
10453
10868
  var SelectItemText = import_select.Select.ItemText;
10454
10869
 
10455
10870
  // src/ui/simple-select.tsx
10456
- var import_lucide_react4 = require("lucide-react");
10871
+ var import_lucide_react5 = require("lucide-react");
10457
10872
  var import_jsx_runtime17 = require("react/jsx-runtime");
10458
10873
  function SimpleSelect({
10459
10874
  value,
@@ -10476,7 +10891,7 @@ function SimpleSelect({
10476
10891
  icon,
10477
10892
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: label ?? options.find((o) => o.value === value)?.label ?? value })
10478
10893
  ] }),
10479
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectIcon, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react4.ChevronDown, { className: "size-3.5 text-muted-foreground" }) })
10894
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectIcon, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react5.ChevronDown, { className: "size-3.5 text-muted-foreground" }) })
10480
10895
  ] }),
10481
10896
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectPositioner, { sideOffset: 4, className: "z-[99999]", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectPopup, { className: cn(
10482
10897
  "overflow-hidden rounded-xl outline outline-1 outline-foreground/10 bg-background p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95"
@@ -10486,7 +10901,7 @@ function SimpleSelect({
10486
10901
  value: option.value,
10487
10902
  className: itemClassName ?? defaultItemClass,
10488
10903
  children: [
10489
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectItemIndicator, { className: "absolute left-1.5 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react4.Check, { className: "size-3.5" }) }),
10904
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectItemIndicator, { className: "absolute left-1.5 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react5.Check, { className: "size-3.5" }) }),
10490
10905
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SelectItemText, { children: option.label })
10491
10906
  ]
10492
10907
  },
@@ -11001,7 +11416,7 @@ function serializeFillLayers(layers) {
11001
11416
  }
11002
11417
 
11003
11418
  // src/panel/fill-section.tsx
11004
- var import_lucide_react5 = require("lucide-react");
11419
+ var import_lucide_react6 = require("lucide-react");
11005
11420
  var import_jsx_runtime19 = require("react/jsx-runtime");
11006
11421
  function ColorInput({ id, value, onChange, className }) {
11007
11422
  const [hexInput, setHexInput] = React27.useState(value.hex);
@@ -11102,7 +11517,7 @@ function FillSection({
11102
11517
  onClick: () => onSelectionColorTarget(color),
11103
11518
  "aria-label": `Select element with #${color.hex}`,
11104
11519
  title: `Select element with #${color.hex}`,
11105
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react5.LocateFixed, {})
11520
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react6.LocateFixed, {})
11106
11521
  }
11107
11522
  )
11108
11523
  ] }, `${color.hex}-${color.alpha}-${index}`)) }) }),
@@ -11166,7 +11581,7 @@ function BackgroundFillSection({ backgroundColor, onSetCSS, pendingStyles }) {
11166
11581
  size: "icon",
11167
11582
  className: "size-7 text-muted-foreground",
11168
11583
  onClick: addLayer,
11169
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react5.Plus, {})
11584
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react6.Plus, {})
11170
11585
  }
11171
11586
  ) }) });
11172
11587
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CollapsibleSection, { title: "Fill", actions: headerActions, children: hasFill ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ColorPickerGroup, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "space-y-2", children: layers.map((layer, index) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex items-center gap-2", children: [
@@ -11185,14 +11600,14 @@ function BackgroundFillSection({ backgroundColor, onSetCSS, pendingStyles }) {
11185
11600
  size: "icon",
11186
11601
  className: "size-7 shrink-0 text-muted-foreground",
11187
11602
  onClick: () => removeLayer(index),
11188
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react5.Minus, {})
11603
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react6.Minus, {})
11189
11604
  }
11190
11605
  ) })
11191
11606
  ] }, `fill-layer-${index}`)) }) }) : null });
11192
11607
  }
11193
11608
 
11194
11609
  // src/panel/border-section.tsx
11195
- var import_lucide_react6 = require("lucide-react");
11610
+ var import_lucide_react7 = require("lucide-react");
11196
11611
  var import_jsx_runtime20 = require("react/jsx-runtime");
11197
11612
  var BORDER_STYLE_OPTIONS = [
11198
11613
  { value: "solid", label: "Solid" },
@@ -11380,14 +11795,14 @@ function BorderInputs({ border, borderColor, outlineColor, onChange, onBatchChan
11380
11795
  className: cn(
11381
11796
  "flex size-7 shrink-0 items-center justify-center rounded-md border-0 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
11382
11797
  ),
11383
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.Settings2, { className: "size-3.5" })
11798
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.Settings2, { className: "size-3.5" })
11384
11799
  }
11385
11800
  ) }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(SelectTrigger, { className: "flex h-7 flex-1 items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", children: [
11386
11801
  /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("span", { className: "flex items-center gap-2", children: [
11387
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.Square, { className: "size-3.5 text-muted-foreground" }),
11802
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.Square, { className: "size-3.5 text-muted-foreground" }),
11388
11803
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: currentStyleLabel })
11389
11804
  ] }),
11390
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectIcon, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.ChevronDown, { className: "size-3.5 text-muted-foreground" }) })
11805
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectIcon, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.ChevronDown, { className: "size-3.5 text-muted-foreground" }) })
11391
11806
  ] })
11392
11807
  }
11393
11808
  ),
@@ -11398,7 +11813,7 @@ function BorderInputs({ border, borderColor, outlineColor, onChange, onBatchChan
11398
11813
  onValueChange: (val) => handleSideChange(val),
11399
11814
  options: BORDER_SIDE_OPTIONS.map((side) => ({ value: side, label: side })),
11400
11815
  popupMinWidth: "90px",
11401
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Tip, { label: `Sides: ${selectedSide}`, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectTrigger, { className: "flex size-7 shrink-0 items-center justify-center rounded-md border-0 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", children: selectedSide === "Custom" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.Grid2x2, { className: "size-3.5 text-muted-foreground", strokeWidth: 1 }) : selectedSide === "All" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.Square, { className: "size-3.5 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(BorderSideIcon, { side: selectedSide, className: "text-muted-foreground" }) }) })
11816
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Tip, { label: `Sides: ${selectedSide}`, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectTrigger, { className: "flex size-7 shrink-0 items-center justify-center rounded-md border-0 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", children: selectedSide === "Custom" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.Grid2x2, { className: "size-3.5 text-muted-foreground", strokeWidth: 1 }) : selectedSide === "All" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.Square, { className: "size-3.5 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(BorderSideIcon, { side: selectedSide, className: "text-muted-foreground" }) }) })
11402
11817
  }
11403
11818
  )
11404
11819
  ] }),
@@ -11519,7 +11934,7 @@ function BorderSection({ border, borderColor, outlineColor, borderStyleControlPr
11519
11934
  size: "icon",
11520
11935
  className: "size-7 text-muted-foreground",
11521
11936
  onClick: hasBorder ? handleRemoveBorder : handleAddBorder,
11522
- children: hasBorder ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.Minus, {}) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react6.Plus, {})
11937
+ children: hasBorder ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.Minus, {}) : /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react7.Plus, {})
11523
11938
  }
11524
11939
  ) });
11525
11940
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CollapsibleSection, { title: "Border", actions: headerActions, children: hasBorder ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ColorPickerGroup, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
@@ -11544,7 +11959,7 @@ function BorderSection({ border, borderColor, outlineColor, borderStyleControlPr
11544
11959
 
11545
11960
  // src/panel/shadow-section.tsx
11546
11961
  var React29 = __toESM(require("react"));
11547
- var import_lucide_react7 = require("lucide-react");
11962
+ var import_lucide_react8 = require("lucide-react");
11548
11963
  var import_jsx_runtime21 = require("react/jsx-runtime");
11549
11964
  function ShadowField({
11550
11965
  label,
@@ -11584,7 +11999,7 @@ function ShadowLayerEditor({
11584
11999
  size: "icon",
11585
12000
  className: "size-7 shrink-0 text-muted-foreground",
11586
12001
  onClick: onRemoveLayer,
11587
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react7.Minus, {})
12002
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react8.Minus, {})
11588
12003
  }
11589
12004
  ) })
11590
12005
  ] }),
@@ -11634,7 +12049,7 @@ function ShadowSection({ boxShadow, onSetCSS, pendingStyles }) {
11634
12049
  size: "icon",
11635
12050
  className: "size-7 text-muted-foreground",
11636
12051
  onClick: addLayer,
11637
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react7.Plus, {})
12052
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react8.Plus, {})
11638
12053
  }
11639
12054
  ) }) });
11640
12055
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CollapsibleSection, { title: "Shadow", actions: headerActions, children: hasShadow ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "space-y-2", children: layers.map((layer, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
@@ -11650,7 +12065,7 @@ function ShadowSection({ boxShadow, onSetCSS, pendingStyles }) {
11650
12065
  }
11651
12066
 
11652
12067
  // src/panel/typography-inputs.tsx
11653
- var import_lucide_react8 = require("lucide-react");
12068
+ var import_lucide_react9 = require("lucide-react");
11654
12069
  var import_jsx_runtime22 = require("react/jsx-runtime");
11655
12070
  var FONT_FAMILIES = [
11656
12071
  { value: "system-ui, sans-serif", label: "System Sans-Serif" },
@@ -11701,7 +12116,7 @@ function TypographyInputs({ typography, onUpdate }) {
11701
12116
  onValueChange: (val) => onUpdate("fontFamily", val),
11702
12117
  options: FONT_FAMILIES,
11703
12118
  label: getFontFamilyLabel(typography.fontFamily),
11704
- icon: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.Type, { className: "size-3.5 text-muted-foreground" }),
12119
+ icon: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.Type, { className: "size-3.5 text-muted-foreground" }),
11705
12120
  triggerClassName: "w-full",
11706
12121
  popupMinWidth: "180px",
11707
12122
  itemClassName: "relative flex cursor-default select-none items-center rounded-md py-2 pl-7 pr-2 text-xs outline-none hover:bg-muted hover:text-foreground data-[highlighted]:bg-muted data-[highlighted]:text-foreground"
@@ -11714,7 +12129,7 @@ function TypographyInputs({ typography, onUpdate }) {
11714
12129
  onValueChange: (val) => onUpdate("fontWeight", val),
11715
12130
  options: FONT_WEIGHTS,
11716
12131
  label: getFontWeightLabel(typography.fontWeight),
11717
- icon: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.ALargeSmall, { className: "size-3.5 text-muted-foreground" }),
12132
+ icon: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.ALargeSmall, { className: "size-3.5 text-muted-foreground" }),
11718
12133
  triggerClassName: "w-full",
11719
12134
  popupMinWidth: "140px",
11720
12135
  itemClassName: "relative flex cursor-default select-none items-center rounded-md py-2 pl-7 pr-2 text-xs outline-none hover:bg-muted hover:text-foreground data-[highlighted]:bg-muted data-[highlighted]:text-foreground"
@@ -11722,7 +12137,7 @@ function TypographyInputs({ typography, onUpdate }) {
11722
12137
  ),
11723
12138
  /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex gap-2", children: [
11724
12139
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Font Size", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "relative flex-1", children: [
11725
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AArrowUp, { className: "absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
12140
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AArrowUp, { className: "absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
11726
12141
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11727
12142
  NumberInput,
11728
12143
  {
@@ -11733,7 +12148,7 @@ function TypographyInputs({ typography, onUpdate }) {
11733
12148
  )
11734
12149
  ] }) }),
11735
12150
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Line Height", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "relative flex-1", children: [
11736
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.WrapText, { className: "absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
12151
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.WrapText, { className: "absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
11737
12152
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11738
12153
  NumberInput,
11739
12154
  {
@@ -11744,7 +12159,7 @@ function TypographyInputs({ typography, onUpdate }) {
11744
12159
  )
11745
12160
  ] }) }),
11746
12161
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Letter Spacing (em)", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "relative flex-1", children: [
11747
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.LetterText, { className: "absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
12162
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.LetterText, { className: "absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
11748
12163
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
11749
12164
  NumberInput,
11750
12165
  {
@@ -11765,7 +12180,7 @@ function TypographyInputs({ typography, onUpdate }) {
11765
12180
  size: "icon",
11766
12181
  className: typography.textAlign === "left" || typography.textAlign === "start" ? "size-7 bg-muted text-foreground" : "size-7 text-muted-foreground",
11767
12182
  onClick: () => onUpdate("textAlign", "left"),
11768
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AlignLeft, {})
12183
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AlignLeft, {})
11769
12184
  }
11770
12185
  ) }),
11771
12186
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Align Center", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
@@ -11775,7 +12190,7 @@ function TypographyInputs({ typography, onUpdate }) {
11775
12190
  size: "icon",
11776
12191
  className: typography.textAlign === "center" ? "size-7 bg-muted text-foreground" : "size-7 text-muted-foreground",
11777
12192
  onClick: () => onUpdate("textAlign", "center"),
11778
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AlignCenter, {})
12193
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AlignCenter, {})
11779
12194
  }
11780
12195
  ) }),
11781
12196
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Align Right", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
@@ -11785,7 +12200,7 @@ function TypographyInputs({ typography, onUpdate }) {
11785
12200
  size: "icon",
11786
12201
  className: typography.textAlign === "right" || typography.textAlign === "end" ? "size-7 bg-muted text-foreground" : "size-7 text-muted-foreground",
11787
12202
  onClick: () => onUpdate("textAlign", "right"),
11788
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AlignRight, {})
12203
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AlignRight, {})
11789
12204
  }
11790
12205
  ) })
11791
12206
  ] }),
@@ -11797,7 +12212,7 @@ function TypographyInputs({ typography, onUpdate }) {
11797
12212
  size: "icon",
11798
12213
  className: typography.textVerticalAlign === "flex-start" ? "size-7 bg-muted text-foreground" : "size-7 text-muted-foreground",
11799
12214
  onClick: () => onUpdate("textVerticalAlign", "flex-start"),
11800
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AlignVerticalJustifyStart, {})
12215
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AlignVerticalJustifyStart, {})
11801
12216
  }
11802
12217
  ) }),
11803
12218
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Align Middle", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
@@ -11807,7 +12222,7 @@ function TypographyInputs({ typography, onUpdate }) {
11807
12222
  size: "icon",
11808
12223
  className: typography.textVerticalAlign === "center" ? "size-7 bg-muted text-foreground" : "size-7 text-muted-foreground",
11809
12224
  onClick: () => onUpdate("textVerticalAlign", "center"),
11810
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AlignVerticalJustifyCenter, {})
12225
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AlignVerticalJustifyCenter, {})
11811
12226
  }
11812
12227
  ) }),
11813
12228
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Tip, { label: "Align Bottom", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
@@ -11817,7 +12232,7 @@ function TypographyInputs({ typography, onUpdate }) {
11817
12232
  size: "icon",
11818
12233
  className: typography.textVerticalAlign === "flex-end" ? "size-7 bg-muted text-foreground" : "size-7 text-muted-foreground",
11819
12234
  onClick: () => onUpdate("textVerticalAlign", "flex-end"),
11820
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react8.AlignVerticalJustifyEnd, {})
12235
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react9.AlignVerticalJustifyEnd, {})
11821
12236
  }
11822
12237
  ) })
11823
12238
  ] })
@@ -11826,7 +12241,7 @@ function TypographyInputs({ typography, onUpdate }) {
11826
12241
  }
11827
12242
 
11828
12243
  // src/panel/panel-header.tsx
11829
- var import_lucide_react9 = require("lucide-react");
12244
+ var import_lucide_react10 = require("lucide-react");
11830
12245
  var import_jsx_runtime23 = require("react/jsx-runtime");
11831
12246
  var panelBarBaseClass = "flex h-11 shrink-0 items-center border-border/50 bg-background px-3";
11832
12247
  function PanelHeader({
@@ -11874,7 +12289,7 @@ function PanelHeader({
11874
12289
  disabled: !elementInfo.parentElement,
11875
12290
  "aria-label": "Select parent element",
11876
12291
  className: "size-7",
11877
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.ChevronUp, {})
12292
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react10.ChevronUp, {})
11878
12293
  }
11879
12294
  ) }) }),
11880
12295
  onSelectChild && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: !elementInfo.hasChildren ? "cursor-not-allowed" : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Tip, { label: "Select Child", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
@@ -11886,12 +12301,12 @@ function PanelHeader({
11886
12301
  disabled: !elementInfo.hasChildren,
11887
12302
  "aria-label": "Select child element",
11888
12303
  className: "size-7",
11889
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.ChevronDown, {})
12304
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react10.ChevronDown, {})
11890
12305
  }
11891
12306
  ) }) }),
11892
12307
  onClose && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
11893
12308
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mx-0.5 h-4 w-px bg-border" }),
11894
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button, { variant: "ghost", size: "icon", "aria-label": "Close panel", className: "size-7", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.X, {}) })
12309
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button, { variant: "ghost", size: "icon", "aria-label": "Close panel", className: "size-7", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react10.X, {}) })
11895
12310
  ] })
11896
12311
  ] })
11897
12312
  ]
@@ -11901,7 +12316,7 @@ function PanelHeader({
11901
12316
 
11902
12317
  // src/panel/panel-footer.tsx
11903
12318
  var React30 = __toESM(require("react"));
11904
- var import_lucide_react10 = require("lucide-react");
12319
+ var import_lucide_react11 = require("lucide-react");
11905
12320
  var import_jsx_runtime24 = require("react/jsx-runtime");
11906
12321
  var panelBarBaseClass2 = "flex h-11 shrink-0 items-center border-border/50 bg-background px-3";
11907
12322
  function PanelFooter({
@@ -11910,6 +12325,7 @@ function PanelFooter({
11910
12325
  onExportEdits,
11911
12326
  onSendToAgent,
11912
12327
  showSendButton = true,
12328
+ sendFailureReason,
11913
12329
  onPointerDown,
11914
12330
  onPointerMove,
11915
12331
  onPointerUp,
@@ -11918,6 +12334,13 @@ function PanelFooter({
11918
12334
  const [copied, setCopied] = React30.useState(false);
11919
12335
  const [copyError, setCopyError] = React30.useState(false);
11920
12336
  const [sendStatus, setSendStatus] = React30.useState("idle");
12337
+ const prevCanTriggerSendRef = React30.useRef(canTriggerSend);
12338
+ React30.useEffect(() => {
12339
+ if (prevCanTriggerSendRef.current !== canTriggerSend) {
12340
+ prevCanTriggerSendRef.current = canTriggerSend;
12341
+ setSendStatus("idle");
12342
+ }
12343
+ }, [canTriggerSend]);
11921
12344
  const handleCopy = async () => {
11922
12345
  if (!onExportEdits) return;
11923
12346
  const success = await onExportEdits();
@@ -11931,6 +12354,7 @@ function PanelFooter({
11931
12354
  setCopyError(true);
11932
12355
  setTimeout(() => setCopyError(false), 2e3);
11933
12356
  };
12357
+ const sendTooltipLabel = sendStatus === "offline" ? sendFailureReason === "unreachable" ? "Agent unreachable \u2014 click to retry" : "Agent rejected the edit \u2014 click to retry" : "Apply changes via agent";
11934
12358
  const handleSendToAgent = async () => {
11935
12359
  if (!onSendToAgent || sendStatus === "sending") return;
11936
12360
  setSendStatus("sending");
@@ -11940,7 +12364,6 @@ function PanelFooter({
11940
12364
  setTimeout(() => setSendStatus("idle"), 2e3);
11941
12365
  } else {
11942
12366
  setSendStatus("offline");
11943
- setTimeout(() => setSendStatus("idle"), 2e3);
11944
12367
  }
11945
12368
  };
11946
12369
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
@@ -11965,10 +12388,10 @@ function PanelFooter({
11965
12388
  onClick: handleCopy,
11966
12389
  "aria-label": copyError ? "Copy failed" : copied ? "Copied" : "Copy edits",
11967
12390
  className: "size-7",
11968
- children: copyError ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.X, { className: "text-red-500" }) : copied ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Check, { className: "text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Copy, {})
12391
+ children: copyError ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.X, { className: "text-red-500" }) : copied ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.Check, { className: "text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.Copy, {})
11969
12392
  }
11970
12393
  ) }),
11971
- showSendButton && onSendToAgent && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: !canTriggerSend || sendStatus === "sending" ? "cursor-not-allowed" : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Tip, { label: "Apply changes via agent", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
12394
+ showSendButton && onSendToAgent && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: !canTriggerSend || sendStatus === "sending" ? "cursor-not-allowed" : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Tip, { label: sendTooltipLabel, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
11972
12395
  Button,
11973
12396
  {
11974
12397
  variant: "outline",
@@ -11977,7 +12400,7 @@ function PanelFooter({
11977
12400
  disabled: !canTriggerSend || sendStatus === "sending",
11978
12401
  "aria-label": sendStatus === "offline" ? "Send failed" : sendStatus === "sent" ? "Changes sent" : "Apply changes via agent",
11979
12402
  className: "size-7",
11980
- children: sendStatus === "offline" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.X, { className: "text-red-500" }) : sendStatus === "sent" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Check, { className: "text-green-500" }) : sendStatus === "sending" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Send, { className: "animate-pulse" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react10.Send, {})
12403
+ children: sendStatus === "offline" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.X, { className: "text-red-500" }) : sendStatus === "sent" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.Check, { className: "text-green-500" }) : sendStatus === "sending" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.Send, { className: "animate-pulse" }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react11.Send, {})
11981
12404
  }
11982
12405
  ) }) })
11983
12406
  ]
@@ -11987,7 +12410,7 @@ function PanelFooter({
11987
12410
 
11988
12411
  // src/panel/spacing-inputs.tsx
11989
12412
  var React31 = __toESM(require("react"));
11990
- var import_lucide_react11 = require("lucide-react");
12413
+ var import_lucide_react12 = require("lucide-react");
11991
12414
  var import_jsx_runtime25 = require("react/jsx-runtime");
11992
12415
  function SpacingInputs({ prefix, values, onChange }) {
11993
12416
  const [individual, setIndividual] = React31.useState(false);
@@ -12010,7 +12433,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12010
12433
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-2", children: [
12011
12434
  /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
12012
12435
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Tip, { label: "Left", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative flex-1", children: [
12013
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowLeft, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12436
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.ArrowLeft, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12014
12437
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
12015
12438
  NumberInput,
12016
12439
  {
@@ -12021,7 +12444,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12021
12444
  )
12022
12445
  ] }) }),
12023
12446
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Tip, { label: "Top", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative flex-1", children: [
12024
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowUp, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12447
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.ArrowUp, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12025
12448
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
12026
12449
  NumberInput,
12027
12450
  {
@@ -12038,13 +12461,13 @@ function SpacingInputs({ prefix, values, onChange }) {
12038
12461
  size: "icon",
12039
12462
  className: "size-7 shrink-0",
12040
12463
  onClick: () => setIndividual(false),
12041
- children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Columns2, {})
12464
+ children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.Columns2, {})
12042
12465
  }
12043
12466
  ) })
12044
12467
  ] }),
12045
12468
  /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
12046
12469
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Tip, { label: "Right", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative flex-1", children: [
12047
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowRight, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12470
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.ArrowRight, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12048
12471
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
12049
12472
  NumberInput,
12050
12473
  {
@@ -12055,7 +12478,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12055
12478
  )
12056
12479
  ] }) }),
12057
12480
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Tip, { label: "Bottom", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative flex-1", children: [
12058
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.ArrowDown, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12481
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.ArrowDown, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12059
12482
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
12060
12483
  NumberInput,
12061
12484
  {
@@ -12071,7 +12494,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12071
12494
  }
12072
12495
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
12073
12496
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Tip, { label: "Horizontal (left & right)", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative flex-1", children: [
12074
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.MoveHorizontal, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12497
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.MoveHorizontal, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12075
12498
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
12076
12499
  NumberInput,
12077
12500
  {
@@ -12083,7 +12506,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12083
12506
  )
12084
12507
  ] }) }),
12085
12508
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Tip, { label: "Vertical (top & bottom)", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative flex-1", children: [
12086
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.MoveVertical, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12509
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.MoveVertical, { className: "absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground" }),
12087
12510
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
12088
12511
  NumberInput,
12089
12512
  {
@@ -12101,7 +12524,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12101
12524
  size: "icon",
12102
12525
  className: "size-7 shrink-0 text-muted-foreground",
12103
12526
  onClick: () => setIndividual(true),
12104
- children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react11.Grid2x2, {})
12527
+ children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react12.Grid2x2, {})
12105
12528
  }
12106
12529
  ) })
12107
12530
  ] });
@@ -12109,7 +12532,7 @@ function SpacingInputs({ prefix, values, onChange }) {
12109
12532
 
12110
12533
  // src/panel/sizing-inputs.tsx
12111
12534
  var React32 = __toESM(require("react"));
12112
- var import_lucide_react12 = require("lucide-react");
12535
+ var import_lucide_react13 = require("lucide-react");
12113
12536
  var import_jsx_runtime26 = require("react/jsx-runtime");
12114
12537
  var SIZING_OPTIONS = [
12115
12538
  { value: "fixed", label: "Fixed" },
@@ -12176,9 +12599,9 @@ function SizingDropdown({ label, value, onChange }) {
12176
12599
  /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Select, { value: value.mode, onValueChange: (val) => {
12177
12600
  if (val) onChange({ mode: val, value: value.value });
12178
12601
  }, children: [
12179
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectTrigger, { className: "flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10 focus-visible:outline-none", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react12.ChevronsUpDown, { className: "size-3.5 text-muted-foreground" }) }),
12602
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectTrigger, { className: "flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10 focus-visible:outline-none", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react13.ChevronsUpDown, { className: "size-3.5 text-muted-foreground" }) }),
12180
12603
  /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPositioner, { side: "bottom", sideOffset: 4, alignItemWithTrigger: false, className: "z-[99999]", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPopup, { className: "min-w-[100px] overflow-hidden rounded-xl outline outline-1 outline-foreground/10 bg-background p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95", children: SIZING_OPTIONS.map((option) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(SelectItem, { value: option.value, className: "relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted", children: [
12181
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectItemIndicator, { className: "absolute left-1.5 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react12.Check, { className: "size-3.5" }) }),
12604
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectItemIndicator, { className: "absolute left-1.5 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react13.Check, { className: "size-3.5" }) }),
12182
12605
  /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectItemText, { children: option.label })
12183
12606
  ] }, option.value)) }) }) })
12184
12607
  ] })
@@ -12229,7 +12652,7 @@ function SizingInputs({ width, height, onWidthChange, onHeightChange }) {
12229
12652
  className: "size-7 shrink-0",
12230
12653
  onClick: handleLockToggle,
12231
12654
  disabled: !canLock,
12232
- children: locked ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react12.Link, {}) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react12.Unlink, {})
12655
+ children: locked ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react13.Link, {}) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react13.Unlink, {})
12233
12656
  }
12234
12657
  ) })
12235
12658
  ] });
@@ -12300,7 +12723,7 @@ function AlignmentGrid({ justifyContent, alignItems, onChange }) {
12300
12723
  }
12301
12724
 
12302
12725
  // src/panel/layout-section.tsx
12303
- var import_lucide_react13 = require("lucide-react");
12726
+ var import_lucide_react14 = require("lucide-react");
12304
12727
  var import_jsx_runtime28 = require("react/jsx-runtime");
12305
12728
  function LayoutSection({
12306
12729
  elementInfo,
@@ -12322,7 +12745,7 @@ function LayoutSection({
12322
12745
  size: "icon",
12323
12746
  className: "size-7 text-muted-foreground",
12324
12747
  onClick: onToggleFlex,
12325
- children: elementInfo.isFlexContainer ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Minus, {}) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Plus, {})
12748
+ children: elementInfo.isFlexContainer ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.Minus, {}) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.Plus, {})
12326
12749
  }
12327
12750
  ) }), children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "space-y-2", ref: sectionRef, children: [
12328
12751
  elementInfo.isFlexContainer && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { children: [
@@ -12339,7 +12762,7 @@ function LayoutSection({
12339
12762
  computedFlex.flexDirection === "row" ? "bg-background text-blue-500 shadow-sm" : "text-muted-foreground hover:text-foreground"
12340
12763
  ),
12341
12764
  onClick: () => onUpdateFlex("flexDirection", "row"),
12342
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.ArrowRight, { className: "size-3.5" })
12765
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.ArrowRight, { className: "size-3.5" })
12343
12766
  }
12344
12767
  ) }),
12345
12768
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Tip, { label: "Column", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
@@ -12351,13 +12774,13 @@ function LayoutSection({
12351
12774
  computedFlex.flexDirection === "column" ? "bg-background text-blue-500 shadow-sm" : "text-muted-foreground hover:text-foreground"
12352
12775
  ),
12353
12776
  onClick: () => onUpdateFlex("flexDirection", "column"),
12354
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.ArrowDown, { className: "size-3.5" })
12777
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.ArrowDown, { className: "size-3.5" })
12355
12778
  }
12356
12779
  ) })
12357
12780
  ] }),
12358
12781
  /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex h-7 items-center overflow-hidden rounded-md border-0 bg-muted text-xs focus-within:outline-none focus-within:ring-1 focus-within:ring-inset focus-within:ring-ring", children: [
12359
12782
  /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { className: "flex flex-1 items-center gap-1.5 px-2", children: [
12360
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.MoveHorizontal, { className: "size-3.5 shrink-0 text-muted-foreground" }),
12783
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.MoveHorizontal, { className: "size-3.5 shrink-0 text-muted-foreground" }),
12361
12784
  isDistributeValue ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "flex-1 truncate", children: DISTRIBUTE_LABELS[distributeMode] }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
12362
12785
  SizingFixedInput,
12363
12786
  {
@@ -12376,9 +12799,9 @@ function LayoutSection({
12376
12799
  /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Select, { value: distributeMode, onValueChange: (val) => {
12377
12800
  if (val) onUpdateFlex("justifyContent", val === "fixed" ? "flex-start" : val);
12378
12801
  }, children: [
12379
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectTrigger, { className: "flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10 focus-visible:outline-none", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.ChevronsUpDown, { className: "size-3.5 text-muted-foreground" }) }),
12802
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectTrigger, { className: "flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10 focus-visible:outline-none", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.ChevronsUpDown, { className: "size-3.5 text-muted-foreground" }) }),
12380
12803
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectPositioner, { side: "bottom", sideOffset: 4, alignItemWithTrigger: false, className: "z-[99999]", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectPopup, { className: "min-w-[120px] overflow-hidden rounded-xl outline outline-1 outline-foreground/10 bg-background p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95", children: DISTRIBUTE_MODES.map((mode) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(SelectItem, { value: mode, className: "relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted", children: [
12381
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectItemIndicator, { className: "absolute left-1.5 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react13.Check, { className: "size-3.5" }) }),
12804
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectItemIndicator, { className: "absolute left-1.5 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.Check, { className: "size-3.5" }) }),
12382
12805
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SelectItemText, { children: DISTRIBUTE_LABELS[mode] })
12383
12806
  ] }, mode)) }) }) })
12384
12807
  ] })
@@ -12663,6 +13086,7 @@ function DirectEditPanelInner({
12663
13086
  onSendToAgent,
12664
13087
  canSendToAgent = false,
12665
13088
  showSendButton = true,
13089
+ sendFailureReason,
12666
13090
  className,
12667
13091
  style,
12668
13092
  panelRef,
@@ -12816,6 +13240,7 @@ function DirectEditPanelInner({
12816
13240
  onExportEdits,
12817
13241
  onSendToAgent,
12818
13242
  showSendButton,
13243
+ sendFailureReason,
12819
13244
  onPointerDown: onHeaderPointerDown,
12820
13245
  onPointerMove: onHeaderPointerMove,
12821
13246
  onPointerUp: onHeaderPointerUp,
@@ -12850,7 +13275,8 @@ function DirectEditPanelContent() {
12850
13275
  comments,
12851
13276
  activeCommentId,
12852
13277
  textEditingElement,
12853
- agentAvailable
13278
+ agentAvailable,
13279
+ lastSendFailure
12854
13280
  } = useDirectEditState();
12855
13281
  const {
12856
13282
  selectParent,
@@ -12882,7 +13308,9 @@ function DirectEditPanelContent() {
12882
13308
  setActiveCommentId,
12883
13309
  startTextEditing,
12884
13310
  toggleEditMode,
12885
- deleteSelection
13311
+ deleteSelection,
13312
+ setCommentDraftText,
13313
+ setCommentDraftBlockedHandler
12886
13314
  } = useDirectEditActions();
12887
13315
  const {
12888
13316
  position,
@@ -12904,7 +13332,8 @@ function DirectEditPanelContent() {
12904
13332
  });
12905
13333
  React34.useEffect(() => {
12906
13334
  commentDraftRef.current = "";
12907
- }, [activeCommentId]);
13335
+ setCommentDraftText("");
13336
+ }, [activeCommentId, setCommentDraftText]);
12908
13337
  const activeDraftComment = React34.useMemo(() => {
12909
13338
  if (!commentTargetElement || !activeCommentId) return null;
12910
13339
  const active = comments.find((comment) => comment.id === activeCommentId);
@@ -12924,6 +13353,18 @@ function DirectEditPanelContent() {
12924
13353
  const triggerCommentInputAttention = React34.useCallback((commentId) => {
12925
13354
  setCommentInputAttention((prev) => prev?.commentId === commentId ? { commentId, nonce: prev.nonce + 1 } : { commentId, nonce: 1 });
12926
13355
  }, []);
13356
+ React34.useEffect(() => {
13357
+ if (!activeCommentId) {
13358
+ setCommentDraftBlockedHandler(null);
13359
+ return;
13360
+ }
13361
+ setCommentDraftBlockedHandler(() => {
13362
+ triggerCommentInputAttention(activeCommentId);
13363
+ });
13364
+ return () => {
13365
+ setCommentDraftBlockedHandler(null);
13366
+ };
13367
+ }, [activeCommentId, setCommentDraftBlockedHandler, triggerCommentInputAttention]);
12927
13368
  const hasPendingCommentDraft = React34.useCallback((nextCommentId = null) => {
12928
13369
  if (!activeCommentId) return false;
12929
13370
  if (nextCommentId && nextCommentId === activeCommentId) return false;
@@ -12944,6 +13385,20 @@ function DirectEditPanelContent() {
12944
13385
  }
12945
13386
  setActiveCommentId(id);
12946
13387
  }, [activeCommentId, comments, hasPendingCommentDraft, deleteComment, setActiveCommentId]);
13388
+ const handleCommentPillClick = React34.useCallback(() => {
13389
+ if (activeDraftComment) {
13390
+ handleSetActiveComment(null);
13391
+ return;
13392
+ }
13393
+ if (hasPendingCommentDraft()) return;
13394
+ if (!commentTargetElement) return;
13395
+ const existingDraft = comments.find((comment) => comment.element === commentTargetElement && comment.text.trim().length === 0);
13396
+ if (existingDraft) {
13397
+ setActiveCommentId(existingDraft.id);
13398
+ return;
13399
+ }
13400
+ addComment(commentTargetElement, getElementCommentAnchor(commentTargetElement));
13401
+ }, [activeDraftComment, handleSetActiveComment, hasPendingCommentDraft, commentTargetElement, comments, setActiveCommentId, addComment]);
12947
13402
  React34.useEffect(() => {
12948
13403
  const previous = previousCommentTriggerRef.current;
12949
13404
  previousCommentTriggerRef.current = { editModeActive, commentTargetElement };
@@ -12959,18 +13414,18 @@ function DirectEditPanelContent() {
12959
13414
  setActiveCommentId(null);
12960
13415
  return;
12961
13416
  }
12962
- if (activeCommentId) return;
12963
- const existingDraft = comments.find((comment) => comment.element === commentTargetElement && comment.text.trim().length === 0);
12964
- if (existingDraft) {
12965
- setActiveCommentId(existingDraft.id);
12966
- return;
13417
+ if (activeCommentId) {
13418
+ const active = comments.find((comment) => comment.id === activeCommentId);
13419
+ if (active && active.text.trim().length === 0 && active.element !== commentTargetElement) {
13420
+ deleteComment(active.id);
13421
+ setActiveCommentId(null);
13422
+ }
12967
13423
  }
12968
- addComment(commentTargetElement, getElementCommentAnchor(commentTargetElement));
12969
13424
  }, [
12970
13425
  activeCommentId,
12971
- addComment,
12972
13426
  commentTargetElement,
12973
13427
  comments,
13428
+ deleteComment,
12974
13429
  editModeActive,
12975
13430
  setActiveCommentId,
12976
13431
  textEditingElement
@@ -13019,6 +13474,7 @@ function DirectEditPanelContent() {
13019
13474
  comment: activeDraftComment,
13020
13475
  attentionNonce: commentInputAttention?.commentId === activeDraftComment.id ? commentInputAttention.nonce : 0,
13021
13476
  draftRef: commentDraftRef,
13477
+ onDraftTextChange: setCommentDraftText,
13022
13478
  onSubmit: (text) => submitCommentDraft(activeDraftComment.id, text),
13023
13479
  onCancel: () => handleSetActiveComment(null)
13024
13480
  }
@@ -13163,7 +13619,10 @@ function DirectEditPanelContent() {
13163
13619
  },
13164
13620
  isComponentPrimitive,
13165
13621
  enableResizeHandles: true,
13166
- onResizeSizingChange: updateSizingProperties
13622
+ onResizeSizingChange: updateSizingProperties,
13623
+ showCommentPill: editModeActive,
13624
+ isCommentActive: Boolean(activeDraftComment),
13625
+ onCommentPillClick: handleCommentPillClick
13167
13626
  }
13168
13627
  ) : selectedElements.length > 1 && !textEditingElement ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(MultiSelectionOverlay, { selectedElements }) : null;
13169
13628
  const selectionChrome = selectionChromeContent && container ? (0, import_react_dom.createPortal)(selectionChromeContent, container) : null;
@@ -14102,13 +14561,13 @@ function useToolbarDock(toolbarRef) {
14102
14561
  }
14103
14562
 
14104
14563
  // src/toolbar.tsx
14105
- var import_lucide_react16 = require("lucide-react");
14564
+ var import_lucide_react17 = require("lucide-react");
14106
14565
 
14107
14566
  // src/toolbar/edits-popover.tsx
14108
14567
  var React38 = __toESM(require("react"));
14109
14568
  var import_button13 = require("@base-ui/react/button");
14110
14569
  var import_popover2 = require("@base-ui/react/popover");
14111
- var import_lucide_react14 = require("lucide-react");
14570
+ var import_lucide_react15 = require("lucide-react");
14112
14571
 
14113
14572
  // src/ui/badge.tsx
14114
14573
  var React37 = __toESM(require("react"));
@@ -14165,7 +14624,8 @@ function EditsPopover({
14165
14624
  onExportAllEdits,
14166
14625
  onClearSessionEdits,
14167
14626
  onRemoveSessionEdit,
14168
- onDeleteComment
14627
+ onDeleteComment,
14628
+ sendFailure
14169
14629
  }) {
14170
14630
  const [copied, setCopied] = React38.useState(false);
14171
14631
  const editsPopupRef = React38.useRef(null);
@@ -14178,6 +14638,7 @@ function EditsPopover({
14178
14638
  const visibleItems = React38.useMemo(() => {
14179
14639
  return editsSnapshot.filter((item) => {
14180
14640
  if (item.type === "comment") return true;
14641
+ if (item.edit.deleted) return true;
14181
14642
  if (!item.edit.move) return true;
14182
14643
  const moveIntent = getMoveIntentForEdit(item.edit, movePlanContext);
14183
14644
  const hasStyleOrText = Object.keys(item.edit.pendingStyles).length > 0 || item.edit.textEdit != null;
@@ -14238,7 +14699,7 @@ ${text}`);
14238
14699
  onOpenChange(!isOpen);
14239
14700
  }
14240
14701
  }
14241
- ) }), children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react14.Copy, { className: "size-4" }) }),
14702
+ ) }), children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react15.Copy, { className: "size-4" }) }),
14242
14703
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: "Export edits" }) })
14243
14704
  ] }),
14244
14705
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(EditsPopoverPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_popover2.Popover.Positioner, { side: tooltipSide, sideOffset: 12, className: "fixed z-[99999]", style: { pointerEvents: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
@@ -14259,7 +14720,7 @@ ${text}`);
14259
14720
  void handleCopyAll();
14260
14721
  },
14261
14722
  children: [
14262
- copied ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react14.Check, { className: "size-3 text-green-400" }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react14.Copy, { className: "size-3" }),
14723
+ copied ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react15.Check, { className: "size-3 text-green-400" }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react15.Copy, { className: "size-3" }),
14263
14724
  copied ? "Copied" : "Copy all"
14264
14725
  ]
14265
14726
  }
@@ -14274,7 +14735,7 @@ ${text}`);
14274
14735
  setEditsSnapshot([]);
14275
14736
  }
14276
14737
  }
14277
- ), children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react14.Trash2, { className: "size-3" }) }),
14738
+ ), children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react15.Trash2, { className: "size-3" }) }),
14278
14739
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: "Clear all" }) })
14279
14740
  ] })
14280
14741
  ] })
@@ -14282,12 +14743,15 @@ ${text}`);
14282
14743
  visibleItems.length === 0 && multiSelectContextItems.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "px-3 pb-3 pt-1 text-xs text-muted-foreground", children: "No edits or comments yet." }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "max-h-[240px] overflow-y-auto px-1 py-1", children: [
14283
14744
  visibleItems.map((item, i) => {
14284
14745
  const isEdit = item.type === "edit";
14746
+ const isDeleted = isEdit && Boolean(item.edit.deleted);
14285
14747
  const moveIntent = isEdit && item.edit.move ? getMoveIntentForEdit(item.edit, movePlanContext) : null;
14286
14748
  const isMoved = Boolean(moveIntent);
14287
14749
  const locator = isEdit ? item.edit.locator : item.comment.locator;
14288
14750
  const componentName = locator.reactStack[0]?.name ?? locator.tagName;
14289
14751
  let valueSummary = "";
14290
- if (isEdit) {
14752
+ if (isEdit && isDeleted) {
14753
+ valueSummary = locator.textPreview || locator.domSelector || locator.tagName;
14754
+ } else if (isEdit) {
14291
14755
  const entries = Object.entries(item.edit.pendingStyles);
14292
14756
  const editValues = [];
14293
14757
  for (const [prop, value] of entries) {
@@ -14308,6 +14772,7 @@ ${text}`);
14308
14772
  }
14309
14773
  valueSummary = commentValues.join(", ");
14310
14774
  }
14775
+ const failed = isEdit ? sendFailure?.failedEditElements.includes(item.edit.element) : sendFailure?.failedCommentIds.includes(item.comment.id);
14311
14776
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
14312
14777
  "div",
14313
14778
  {
@@ -14326,13 +14791,16 @@ ${text}`);
14326
14791
  },
14327
14792
  children: [
14328
14793
  /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "min-w-0 flex flex-1 flex-col items-start gap-[4px]", children: [
14329
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(Badge, { variant: "secondary", className: "h-6 shrink-0 px-1.5 text-xs", children: [
14330
- "@<",
14331
- componentName,
14332
- ">"
14794
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-center gap-1", children: [
14795
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(Badge, { variant: "secondary", className: "h-6 shrink-0 px-1.5 text-xs", children: [
14796
+ "@<",
14797
+ componentName,
14798
+ ">"
14799
+ ] }),
14800
+ failed && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Badge, { variant: "default", className: "h-6 shrink-0 px-1.5 text-xs bg-red-500 text-white border-transparent", children: "Failed" })
14333
14801
  ] }),
14334
14802
  /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("span", { className: "min-w-0 max-w-full truncate text-xs text-muted-foreground", children: [
14335
- isEdit ? isMoved ? "moved: " : "edit: " : "comment: ",
14803
+ isEdit ? isDeleted ? "deleted: " : isMoved ? "moved: " : "edit: " : "comment: ",
14336
14804
  truncateText(valueSummary, 128)
14337
14805
  ] })
14338
14806
  ] }),
@@ -14358,7 +14826,7 @@ ${text}`);
14358
14826
  return true;
14359
14827
  }));
14360
14828
  },
14361
- children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react14.X, { className: "size-3" })
14829
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react15.X, { className: "size-3" })
14362
14830
  }
14363
14831
  )
14364
14832
  ]
@@ -14397,7 +14865,7 @@ ${text}`);
14397
14865
  // src/toolbar/settings-popover.tsx
14398
14866
  var React39 = __toESM(require("react"));
14399
14867
  var import_menu = require("@base-ui/react/menu");
14400
- var import_lucide_react15 = require("lucide-react");
14868
+ var import_lucide_react16 = require("lucide-react");
14401
14869
  var import_jsx_runtime33 = require("react/jsx-runtime");
14402
14870
  function SettingsMenuPortal(props) {
14403
14871
  const container = usePortalContainer();
@@ -14439,7 +14907,7 @@ function SettingsPopover({
14439
14907
  ),
14440
14908
  onPointerDown: (e) => e.stopPropagation()
14441
14909
  }
14442
- ) }), children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Settings2, { className: "size-4" }) }),
14910
+ ) }), children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Settings2, { className: "size-4" }) }),
14443
14911
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { children: "Preferences" }) })
14444
14912
  ] }),
14445
14913
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SettingsMenuPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_menu.Menu.Positioner, { side: tooltipSide, sideOffset: 12, className: "fixed z-[99999]", style: { pointerEvents: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
@@ -14464,9 +14932,9 @@ function SettingsPopover({
14464
14932
  onOpenChange(false);
14465
14933
  },
14466
14934
  children: [
14467
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Ruler, { className: "size-3.5" }),
14935
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Ruler, { className: "size-3.5" }),
14468
14936
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "flex-1", children: "Rulers" }),
14469
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Check, { className: cn("size-3.5", rulersVisible ? "opacity-100" : "opacity-0") })
14937
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Check, { className: cn("size-3.5", rulersVisible ? "opacity-100" : "opacity-0") })
14470
14938
  ]
14471
14939
  }
14472
14940
  ),
@@ -14482,9 +14950,9 @@ function SettingsPopover({
14482
14950
  onOpenChange(false);
14483
14951
  },
14484
14952
  children: [
14485
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Maximize2, { className: "size-3.5" }),
14953
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Maximize2, { className: "size-3.5" }),
14486
14954
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "flex-1", children: "Canvas mode" }),
14487
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Check, { className: cn("size-3.5", canvasActive ? "opacity-100" : "opacity-0") })
14955
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Check, { className: cn("size-3.5", canvasActive ? "opacity-100" : "opacity-0") })
14488
14956
  ]
14489
14957
  }
14490
14958
  ),
@@ -14496,9 +14964,9 @@ function SettingsPopover({
14496
14964
  openOnHover: false,
14497
14965
  className: popupItemClass,
14498
14966
  children: [
14499
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Monitor, { className: "size-3.5" }),
14967
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Monitor, { className: "size-3.5" }),
14500
14968
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "flex-1", children: "Theme" }),
14501
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.ChevronRight, { className: "size-3.5" })
14969
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ChevronRight, { className: "size-3.5" })
14502
14970
  ]
14503
14971
  }
14504
14972
  ),
@@ -14521,9 +14989,9 @@ function SettingsPopover({
14521
14989
  children: [
14522
14990
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: popupTitleClass, children: "Theme" }),
14523
14991
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex flex-col gap-1 px-1 pb-1", children: [
14524
- { value: "light", label: "Light", Icon: import_lucide_react15.Sun },
14525
- { value: "dark", label: "Dark", Icon: import_lucide_react15.Moon },
14526
- { value: "system", label: "System", Icon: import_lucide_react15.Monitor }
14992
+ { value: "light", label: "Light", Icon: import_lucide_react16.Sun },
14993
+ { value: "dark", label: "Dark", Icon: import_lucide_react16.Moon },
14994
+ { value: "system", label: "System", Icon: import_lucide_react16.Monitor }
14527
14995
  ].map(({ value, label, Icon }) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
14528
14996
  import_menu.Menu.Item,
14529
14997
  {
@@ -14555,9 +15023,9 @@ function SettingsPopover({
14555
15023
  openOnHover: false,
14556
15024
  className: popupItemClass,
14557
15025
  children: [
14558
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Keyboard, { className: "size-3.5" }),
15026
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Keyboard, { className: "size-3.5" }),
14559
15027
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "flex-1", children: "Keyboard shortcuts" }),
14560
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.ChevronRight, { className: "size-3.5" })
15028
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ChevronRight, { className: "size-3.5" })
14561
15029
  ]
14562
15030
  }
14563
15031
  ),
@@ -14580,16 +15048,17 @@ function SettingsPopover({
14580
15048
  children: [
14581
15049
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: popupTitleClass, children: "Keyboard Shortcuts" }),
14582
15050
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex flex-col gap-1 px-1 pb-1", children: [
14583
- { label: "Toggle design mode", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Command, { className: "size-2.5" }, "cmd"), "."] : ["Ctrl", "."] },
14584
- { label: "Undo", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Command, { className: "size-2.5" }, "cmd"), "Z"] : ["Ctrl", "Z"] },
14585
- { label: "Group selection", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Command, { className: "size-2.5" }, "cmd"), "G"] : ["Ctrl", "G"] },
15051
+ { label: "Toggle design mode", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Command, { className: "size-2.5" }, "cmd"), "."] : ["Ctrl", "."] },
15052
+ { label: "Undo", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Command, { className: "size-2.5" }, "cmd"), "Z"] : ["Ctrl", "Z"] },
15053
+ { label: "Group selection", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Command, { className: "size-2.5" }, "cmd"), "G"] : ["Ctrl", "G"] },
14586
15054
  { label: "Add frame", keys: ["F"] },
15055
+ { label: "Add text", keys: ["T"] },
14587
15056
  { label: "Add div", keys: ["D"] },
14588
- { label: "Add to selection", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.ArrowBigUp, { className: "size-3" }, "shift"), "Click"] },
15057
+ { label: "Add to selection", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ArrowBigUp, { className: "size-3" }, "shift"), "Click"] },
14589
15058
  { label: "Marquee select", keys: ["Drag"] },
14590
- { label: "Toggle rulers", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.ArrowBigUp, { className: "size-3" }, "shift"), "R"] },
14591
- { label: "Toggle canvas mode", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.ArrowBigUp, { className: "size-3" }, "shift"), "Z"] },
14592
- { label: "Hover to measure", keys: isMac ? ["Hold", /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react15.Option, { className: "size-2.5" }, "opt")] : ["Hold", "Alt"] },
15059
+ { label: "Toggle rulers", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ArrowBigUp, { className: "size-3" }, "shift"), "R"] },
15060
+ { label: "Toggle canvas mode", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ArrowBigUp, { className: "size-3" }, "shift"), "Z"] },
15061
+ { label: "Hover to measure", keys: isMac ? ["Hold", /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Option, { className: "size-2.5" }, "opt")] : ["Hold", "Alt"] },
14593
15062
  { label: "Back / Exit", keys: ["Esc"] }
14594
15063
  ].map(({ label, keys }) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex h-8 w-full items-center justify-between rounded-md px-2 text-xs text-muted-foreground", children: [
14595
15064
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { children: label }),
@@ -14626,6 +15095,8 @@ function DirectEditToolbarInner({
14626
15095
  onExportAllEdits,
14627
15096
  onSendAllToAgents,
14628
15097
  agentAvailable = true,
15098
+ sendFailureReason,
15099
+ sendFailure,
14629
15100
  onClearSessionEdits,
14630
15101
  onRemoveSessionEdit,
14631
15102
  onDeleteComment,
@@ -14635,7 +15106,8 @@ function DirectEditToolbarInner({
14635
15106
  onToggleCanvas,
14636
15107
  onSetCanvasZoom,
14637
15108
  onZoomTo100,
14638
- onFitToViewport
15109
+ onFitToViewport,
15110
+ onInsertElement
14639
15111
  }) {
14640
15112
  const container = usePortalContainer();
14641
15113
  const toolbarRef = React40.useRef(null);
@@ -14644,7 +15116,8 @@ function DirectEditToolbarInner({
14644
15116
  const [activePopover, setActivePopover] = React40.useState(null);
14645
15117
  const [applyStatus, setApplyStatus] = React40.useState("idle");
14646
15118
  const applyTimerRef = React40.useRef(null);
14647
- const showApplyButton = agentAvailable && Boolean(onSendAllToAgents);
15119
+ const showApplyButton = (agentAvailable || applyStatus !== "idle") && Boolean(onSendAllToAgents);
15120
+ const showInsertButtons = Boolean(onInsertElement);
14648
15121
  const totalItemCount = sessionEditCount + multiSelectCount;
14649
15122
  const sizeCacheRef = React40.useRef({});
14650
15123
  React40.useEffect(() => {
@@ -14683,7 +15156,7 @@ function DirectEditToolbarInner({
14683
15156
  const [isMac] = React40.useState(() => typeof navigator !== "undefined" ? navigator.platform?.includes("Mac") ?? false : false);
14684
15157
  const kbdClass = "inline-flex items-center justify-center rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground min-w-[20px] min-h-[18px]";
14685
15158
  const shortcutContent = isMac ? /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
14686
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("kbd", { className: kbdClass, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react16.Command, { className: "size-2.5" }) }),
15159
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("kbd", { className: kbdClass, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.Command, { className: "size-2.5" }) }),
14687
15160
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("kbd", { className: kbdClass, children: "." })
14688
15161
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
14689
15162
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("kbd", { className: kbdClass, children: "Ctrl" }),
@@ -14698,6 +15171,16 @@ function DirectEditToolbarInner({
14698
15171
  setApplyStatus("idle");
14699
15172
  }, 2e3);
14700
15173
  }, []);
15174
+ const prevTotalItemCountRef = React40.useRef(totalItemCount);
15175
+ React40.useEffect(() => {
15176
+ if (prevTotalItemCountRef.current !== totalItemCount) {
15177
+ prevTotalItemCountRef.current = totalItemCount;
15178
+ if (applyStatus === "offline") {
15179
+ setApplyStatus("idle");
15180
+ }
15181
+ }
15182
+ }, [totalItemCount, applyStatus]);
15183
+ const applyTooltipLabel = applyStatus === "offline" ? sendFailureReason === "unreachable" ? "Agent unreachable \u2014 click to retry" : "Agent rejected the edit \u2014 click to retry" : "Apply all changes via agent";
14701
15184
  const handleApplyAll = React40.useCallback(async () => {
14702
15185
  if (!onSendAllToAgents || totalItemCount === 0 || applyStatus === "sending") return;
14703
15186
  setApplyStatus("sending");
@@ -14707,8 +15190,12 @@ function DirectEditToolbarInner({
14707
15190
  } catch {
14708
15191
  success = false;
14709
15192
  }
14710
- setApplyStatus(success ? "sent" : "offline");
14711
- scheduleApplyReset();
15193
+ if (success) {
15194
+ setApplyStatus("sent");
15195
+ scheduleApplyReset();
15196
+ } else {
15197
+ setApplyStatus("offline");
15198
+ }
14712
15199
  }, [applyStatus, onSendAllToAgents, scheduleApplyReset, totalItemCount]);
14713
15200
  const dragHandlers = React40.useMemo(() => ({
14714
15201
  onPointerDown: handlePointerDown,
@@ -14753,7 +15240,7 @@ function DirectEditToolbarInner({
14753
15240
  ),
14754
15241
  onPointerDown: (e) => e.stopPropagation(),
14755
15242
  onClick: onToggleEditMode,
14756
- children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react16.MousePointer2, { className: "size-4" })
15243
+ children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.MousePointer2, { className: "size-4" })
14757
15244
  }
14758
15245
  ),
14759
15246
  /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(TooltipContent, { side: tooltipSide, className: "inline-flex items-center gap-1.5", children: [
@@ -14789,6 +15276,38 @@ function DirectEditToolbarInner({
14789
15276
  },
14790
15277
  ...dragHandlers,
14791
15278
  children: [
15279
+ showInsertButtons && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
15280
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Tooltip, { children: [
15281
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
15282
+ TooltipTrigger,
15283
+ {
15284
+ className: cn(toolbarBtnClass, "text-muted-foreground hover:bg-muted hover:text-foreground"),
15285
+ onPointerDown: (e) => e.stopPropagation(),
15286
+ onClick: () => onInsertElement?.("frame"),
15287
+ children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.Square, { className: "size-4" })
15288
+ }
15289
+ ),
15290
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(TooltipContent, { side: tooltipSide, className: "inline-flex items-center gap-1.5", children: [
15291
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { children: "Add frame" }),
15292
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("kbd", { className: kbdClass, children: "F" })
15293
+ ] })
15294
+ ] }),
15295
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Tooltip, { children: [
15296
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
15297
+ TooltipTrigger,
15298
+ {
15299
+ className: cn(toolbarBtnClass, "text-muted-foreground hover:bg-muted hover:text-foreground"),
15300
+ onPointerDown: (e) => e.stopPropagation(),
15301
+ onClick: () => onInsertElement?.("text"),
15302
+ children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.Type, { className: "size-4" })
15303
+ }
15304
+ ),
15305
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(TooltipContent, { side: tooltipSide, className: "inline-flex items-center gap-1.5", children: [
15306
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { children: "Add text" }),
15307
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("kbd", { className: kbdClass, children: "T" })
15308
+ ] })
15309
+ ] })
15310
+ ] }),
14792
15311
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
14793
15312
  EditsPopover,
14794
15313
  {
@@ -14801,7 +15320,8 @@ function DirectEditToolbarInner({
14801
15320
  onExportAllEdits,
14802
15321
  onClearSessionEdits,
14803
15322
  onRemoveSessionEdit,
14804
- onDeleteComment
15323
+ onDeleteComment,
15324
+ sendFailure
14805
15325
  }
14806
15326
  ),
14807
15327
  showApplyButton && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Tooltip, { children: [
@@ -14820,12 +15340,12 @@ function DirectEditToolbarInner({
14820
15340
  void handleApplyAll();
14821
15341
  },
14822
15342
  children: [
14823
- applyStatus === "offline" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react16.X, { className: "size-3.5 text-red-500" }) : applyStatus === "sent" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react16.Check, { className: "size-3.5 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react16.Send, { className: cn("size-3.5", applyStatus === "sending" && "animate-pulse") }),
15343
+ applyStatus === "offline" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.X, { className: "size-3.5 text-red-500" }) : applyStatus === "sent" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.Check, { className: "size-3.5 text-green-500" }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.Send, { className: cn("size-3.5", applyStatus === "sending" && "animate-pulse") }),
14824
15344
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { children: applyStatus === "sending" ? "Applying" : applyStatus === "sent" ? "Applied" : applyStatus === "offline" ? "Offline" : "Apply" })
14825
15345
  ]
14826
15346
  }
14827
15347
  ),
14828
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { children: "Apply all changes via agent" }) })
15348
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { children: applyTooltipLabel }) })
14829
15349
  ] }),
14830
15350
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
14831
15351
  "div",
@@ -14864,7 +15384,7 @@ function DirectEditToolbarInner({
14864
15384
  className: cn(toolbarBtnClass, "text-muted-foreground hover:bg-muted hover:text-foreground"),
14865
15385
  onPointerDown: (e) => e.stopPropagation(),
14866
15386
  onClick: onToggleEditMode,
14867
- children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react16.X, { className: "size-4" })
15387
+ children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react17.X, { className: "size-4" })
14868
15388
  }
14869
15389
  ),
14870
15390
  /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(TooltipContent, { side: tooltipSide, className: "inline-flex items-center gap-1.5", children: [
@@ -14887,7 +15407,7 @@ function DirectEditToolbarInner({
14887
15407
  return toolbar;
14888
15408
  }
14889
15409
  function DirectEditToolbarContent() {
14890
- const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable } = useDirectEditState();
15410
+ const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable, lastSendFailure } = useDirectEditState();
14891
15411
  const {
14892
15412
  toggleEditMode,
14893
15413
  setTheme,
@@ -14897,6 +15417,7 @@ function DirectEditToolbarContent() {
14897
15417
  clearSessionEdits,
14898
15418
  removeSessionEdit,
14899
15419
  deleteComment,
15420
+ insertElement,
14900
15421
  toggleCanvas,
14901
15422
  setCanvasZoom,
14902
15423
  zoomCanvasTo100,
@@ -14919,6 +15440,8 @@ function DirectEditToolbarContent() {
14919
15440
  onExportAllEdits: exportAllEdits,
14920
15441
  onSendAllToAgents: sendAllSessionItemsToAgent,
14921
15442
  agentAvailable,
15443
+ sendFailureReason: lastSendFailure?.reason ?? null,
15444
+ sendFailure: lastSendFailure,
14922
15445
  onClearSessionEdits: clearSessionEdits,
14923
15446
  onRemoveSessionEdit: removeSessionEdit,
14924
15447
  onDeleteComment: deleteComment,
@@ -14927,7 +15450,8 @@ function DirectEditToolbarContent() {
14927
15450
  onToggleCanvas: toggleCanvas,
14928
15451
  onSetCanvasZoom: setCanvasZoom,
14929
15452
  onZoomTo100: zoomCanvasTo100,
14930
- onFitToViewport: fitCanvasToViewport
15453
+ onFitToViewport: fitCanvasToViewport,
15454
+ onInsertElement: insertElement
14931
15455
  }
14932
15456
  );
14933
15457
  }