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/README.md +1 -1
- package/dist/babel.cjs +5 -1
- package/dist/index.d.mts +26 -5
- package/dist/index.d.ts +26 -5
- package/dist/index.js +733 -209
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +639 -115
- package/dist/index.mjs.map +1 -1
- package/dist/preload/preload.js +23 -2
- package/dist/preload.js +22 -2
- package/dist/preload.js.map +1 -1
- package/dist/preload.mjs +7 -2
- package/dist/preload.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/{utils-CpmjloNg.d.mts → utils-Byovnuwg.d.mts} +4 -1
- package/dist/{utils-CpmjloNg.d.ts → utils-Byovnuwg.d.ts} +4 -1
- package/dist/utils.d.mts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +36 -6
- package/dist/utils.js.map +1 -1
- package/dist/utils.mjs +36 -6
- package/dist/utils.mjs.map +1 -1
- package/package.json +3 -3
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
|
|
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
|
-
|
|
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
|
|
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
|
|
4335
|
-
const
|
|
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
|
-
|
|
4345
|
-
|
|
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.
|
|
4352
|
-
element.style.
|
|
4353
|
-
element.style.
|
|
4354
|
-
element.style.
|
|
4355
|
-
|
|
4356
|
-
element.style.
|
|
4357
|
-
|
|
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
|
-
|
|
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
|
|
4471
|
-
|
|
4472
|
-
sessionEditsRef.current.
|
|
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
|
|
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
|
|
5774
|
-
} catch {
|
|
5775
|
-
|
|
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
|
|
5792
|
-
} catch {
|
|
5793
|
-
|
|
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
|
|
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
|
-
|
|
5875
|
-
|
|
5876
|
-
|
|
5877
|
-
|
|
5878
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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:
|
|
9396
|
-
|
|
9397
|
-
|
|
9398
|
-
|
|
9399
|
-
|
|
9400
|
-
|
|
9401
|
-
|
|
9402
|
-
|
|
9403
|
-
|
|
9404
|
-
|
|
9405
|
-
|
|
9406
|
-
|
|
9407
|
-
|
|
9408
|
-
|
|
9409
|
-
|
|
9410
|
-
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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:
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
-
|
|
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)
|
|
12963
|
-
|
|
12964
|
-
|
|
12965
|
-
|
|
12966
|
-
|
|
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
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
14330
|
-
"
|
|
14331
|
-
|
|
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)(
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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:
|
|
14525
|
-
{ value: "dark", label: "Dark", Icon:
|
|
14526
|
-
{ value: "system", label: "System", Icon:
|
|
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)(
|
|
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)(
|
|
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)(
|
|
14584
|
-
{ label: "Undo", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
14585
|
-
{ label: "Group selection", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
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)(
|
|
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)(
|
|
14591
|
-
{ label: "Toggle canvas mode", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
14592
|
-
{ label: "Hover to measure", keys: isMac ? ["Hold", /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
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)(
|
|
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
|
-
|
|
14711
|
-
|
|
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)(
|
|
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)(
|
|
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:
|
|
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)(
|
|
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
|
}
|