made-refine 0.2.20 → 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 +22 -4
- package/dist/index.d.ts +22 -4
- package/dist/index.js +527 -78
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +528 -79
- 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,27 +4355,48 @@ function useSessionManager({
|
|
|
4324
4355
|
selectElement(firstChild);
|
|
4325
4356
|
}
|
|
4326
4357
|
}, [getSelectableChild, selectElement]);
|
|
4358
|
+
const centerElementOnBody = React3.useCallback((element, size) => {
|
|
4359
|
+
const bodyRect = document.body.getBoundingClientRect();
|
|
4360
|
+
const scaleX = document.body.offsetWidth > 0 ? bodyRect.width / document.body.offsetWidth : 1;
|
|
4361
|
+
const scaleY = document.body.offsetHeight > 0 ? bodyRect.height / document.body.offsetHeight : 1;
|
|
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;
|
|
4367
|
+
const left = Math.round((window.innerWidth / 2 - bodyRect.left) / scaleX - width / 2);
|
|
4368
|
+
const top = Math.round((window.innerHeight / 2 - bodyRect.top) / scaleY - height / 2);
|
|
4369
|
+
element.style.left = `${left}px`;
|
|
4370
|
+
element.style.top = `${top}px`;
|
|
4371
|
+
}, []);
|
|
4327
4372
|
const insertElement = React3.useCallback((kind) => {
|
|
4328
4373
|
if (!stateRef.current.editModeActive) return;
|
|
4329
4374
|
saveCurrentToSession();
|
|
4330
4375
|
const restoreSelection = buildSelectionSnapshot();
|
|
4331
4376
|
const selectedEl = stateRef.current.selectedElement;
|
|
4332
|
-
const
|
|
4333
|
-
const
|
|
4334
|
-
const
|
|
4335
|
-
const element = document.createElement("div");
|
|
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");
|
|
4336
4380
|
element.id = nextGeneratedCanvasId(kind);
|
|
4337
4381
|
element.setAttribute(GENERATED_CANVAS_NODE_ATTR, kind);
|
|
4338
|
-
element.style.width = `${width}px`;
|
|
4339
|
-
element.style.height = `${height}px`;
|
|
4340
4382
|
element.style.boxSizing = "border-box";
|
|
4341
4383
|
if (kind === "frame") {
|
|
4384
|
+
element.style.width = "100px";
|
|
4385
|
+
element.style.height = "100px";
|
|
4342
4386
|
element.style.background = "#F5F5F5";
|
|
4343
4387
|
element.style.border = "1px solid #E0E0E0";
|
|
4344
|
-
} else {
|
|
4388
|
+
} else if (kind === "div") {
|
|
4389
|
+
element.style.width = "160px";
|
|
4390
|
+
element.style.height = "96px";
|
|
4345
4391
|
element.style.borderRadius = "12px";
|
|
4346
4392
|
element.style.border = "1px solid rgba(13, 153, 255, 0.35)";
|
|
4347
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";
|
|
4348
4400
|
}
|
|
4349
4401
|
if (hasSelection) {
|
|
4350
4402
|
const insertionParent = selectedEl.parentElement;
|
|
@@ -4355,16 +4407,22 @@ function useSessionManager({
|
|
|
4355
4407
|
insertionParent.appendChild(element);
|
|
4356
4408
|
}
|
|
4357
4409
|
} else {
|
|
4358
|
-
const bodyRect = document.body.getBoundingClientRect();
|
|
4359
|
-
const scaleX = document.body.offsetWidth > 0 ? bodyRect.width / document.body.offsetWidth : 1;
|
|
4360
|
-
const scaleY = document.body.offsetHeight > 0 ? bodyRect.height / document.body.offsetHeight : 1;
|
|
4361
|
-
const left = Math.round((window.innerWidth / 2 - bodyRect.left) / scaleX - width / 2);
|
|
4362
|
-
const top = Math.round((window.innerHeight / 2 - bodyRect.top) / scaleY - height / 2);
|
|
4363
4410
|
element.style.position = "absolute";
|
|
4364
|
-
element.style.left = `${left}px`;
|
|
4365
|
-
element.style.top = `${top}px`;
|
|
4366
4411
|
element.style.zIndex = "1";
|
|
4367
|
-
|
|
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
|
+
}
|
|
4368
4426
|
}
|
|
4369
4427
|
pushUndo({
|
|
4370
4428
|
type: "structure",
|
|
@@ -4379,7 +4437,8 @@ function useSessionManager({
|
|
|
4379
4437
|
primaryElement: element,
|
|
4380
4438
|
pushUndo: false
|
|
4381
4439
|
});
|
|
4382
|
-
|
|
4440
|
+
onElementInsertedRef.current?.(kind, element);
|
|
4441
|
+
}, [applySelection, buildSelectionSnapshot, centerElementOnBody, onElementInsertedRef, pushUndo, saveCurrentToSession, stateRef]);
|
|
4383
4442
|
const groupSelection = React3.useCallback(() => {
|
|
4384
4443
|
const selected = getSanitizedSelection(stateRef.current.selectedElements);
|
|
4385
4444
|
if (selected.length < 2) return;
|
|
@@ -4475,9 +4534,17 @@ function useSessionManager({
|
|
|
4475
4534
|
}));
|
|
4476
4535
|
const sessionSnapshots = /* @__PURE__ */ new Map();
|
|
4477
4536
|
for (const el of selected) {
|
|
4478
|
-
const
|
|
4479
|
-
|
|
4480
|
-
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
|
+
});
|
|
4481
4548
|
}
|
|
4482
4549
|
syncSessionItemCount();
|
|
4483
4550
|
for (const { element } of snapshots) {
|
|
@@ -4498,7 +4565,8 @@ function useSessionManager({
|
|
|
4498
4565
|
}
|
|
4499
4566
|
}
|
|
4500
4567
|
for (const [el, edit] of sessionSnapshots) {
|
|
4501
|
-
sessionEditsRef.current.set(el, edit);
|
|
4568
|
+
if (edit) sessionEditsRef.current.set(el, edit);
|
|
4569
|
+
else sessionEditsRef.current.delete(el);
|
|
4502
4570
|
}
|
|
4503
4571
|
syncSessionItemCount();
|
|
4504
4572
|
}
|
|
@@ -4889,7 +4957,7 @@ function useSessionManager({
|
|
|
4889
4957
|
saveCurrentToSession();
|
|
4890
4958
|
const edits = [];
|
|
4891
4959
|
for (const edit of sessionEditsRef.current.values()) {
|
|
4892
|
-
if (!edit.element.isConnected) {
|
|
4960
|
+
if (!edit.element.isConnected && !edit.deleted) {
|
|
4893
4961
|
sessionEditsRef.current.delete(edit.element);
|
|
4894
4962
|
continue;
|
|
4895
4963
|
}
|
|
@@ -5058,6 +5126,7 @@ ${exportMarkdown}`);
|
|
|
5058
5126
|
|
|
5059
5127
|
// src/use-text-and-comments.ts
|
|
5060
5128
|
var React4 = __toESM(require("react"));
|
|
5129
|
+
var GENERATED_CANVAS_NODE_ATTR2 = "data-made-refine-canvas-node";
|
|
5061
5130
|
function clampUnit(value) {
|
|
5062
5131
|
if (!Number.isFinite(value)) return 0;
|
|
5063
5132
|
return Math.max(0, Math.min(1, value));
|
|
@@ -5093,6 +5162,94 @@ function useTextAndComments({
|
|
|
5093
5162
|
editingElement.style.outlineOffset = "";
|
|
5094
5163
|
editingElement.style.cursor = originalCursor;
|
|
5095
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
|
+
}
|
|
5096
5253
|
if (newText !== previousText) {
|
|
5097
5254
|
pushUndo({ type: "textEdit", element: editingElement, originalText, previousText });
|
|
5098
5255
|
removedSessionEditsRef.current.delete(editingElement);
|
|
@@ -5611,28 +5768,30 @@ async function toClientResponse(response) {
|
|
|
5611
5768
|
const data = await readJsonRecord(response);
|
|
5612
5769
|
const bodyOk = data?.ok;
|
|
5613
5770
|
const parsedOk = typeof bodyOk === "boolean" ? bodyOk : response.ok;
|
|
5771
|
+
const ok = parsedOk && response.ok;
|
|
5614
5772
|
return {
|
|
5615
|
-
ok
|
|
5616
|
-
id: readString(data, "id") ?? ""
|
|
5773
|
+
ok,
|
|
5774
|
+
id: readString(data, "id") ?? "",
|
|
5775
|
+
...!ok ? { errorKind: "rejected" } : {}
|
|
5617
5776
|
};
|
|
5618
5777
|
}
|
|
5619
5778
|
async function postWithSessionToken(path, payload) {
|
|
5620
5779
|
const idempotencyKey = createIdempotencyKey();
|
|
5621
5780
|
let session = await bootstrapSession();
|
|
5622
|
-
if (!session) return { ok: false, id: "" };
|
|
5781
|
+
if (!session) return { ok: false, id: "", errorKind: "network" };
|
|
5623
5782
|
let response;
|
|
5624
5783
|
try {
|
|
5625
5784
|
response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
|
|
5626
5785
|
} catch {
|
|
5627
|
-
return { ok: false, id: "" };
|
|
5786
|
+
return { ok: false, id: "", errorKind: "network" };
|
|
5628
5787
|
}
|
|
5629
5788
|
if (response.status === 401 || response.status === 403) {
|
|
5630
5789
|
session = await refreshSessionToken(session) ?? await bootstrapSession(true);
|
|
5631
|
-
if (!session) return { ok: false, id: "" };
|
|
5790
|
+
if (!session) return { ok: false, id: "", errorKind: "network" };
|
|
5632
5791
|
try {
|
|
5633
5792
|
response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
|
|
5634
5793
|
} catch {
|
|
5635
|
-
return { ok: false, id: "" };
|
|
5794
|
+
return { ok: false, id: "", errorKind: "network" };
|
|
5636
5795
|
}
|
|
5637
5796
|
}
|
|
5638
5797
|
return toClientResponse(response);
|
|
@@ -5685,8 +5844,10 @@ function buildLocatorPayload(locator) {
|
|
|
5685
5844
|
}
|
|
5686
5845
|
function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrentToSession, removeSessionEdit, deleteComment }) {
|
|
5687
5846
|
const [agentAvailable, setAgentAvailable] = React5.useState(false);
|
|
5847
|
+
const [lastSendFailure, setLastSendFailure] = React5.useState(null);
|
|
5688
5848
|
const isMountedRef = React5.useRef(true);
|
|
5689
5849
|
React5.useEffect(() => {
|
|
5850
|
+
isMountedRef.current = true;
|
|
5690
5851
|
return () => {
|
|
5691
5852
|
isMountedRef.current = false;
|
|
5692
5853
|
};
|
|
@@ -5743,7 +5904,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5743
5904
|
const resolvedPlanContext = movePlanContext ?? buildMovePlanContext(editsForPlan);
|
|
5744
5905
|
const includeBatchMoveEnvelope = Boolean(options?.includeBatchMoveEnvelope && sessionEdit.move);
|
|
5745
5906
|
const isBatchSend = Boolean(allEdits && allEdits.length > 1);
|
|
5746
|
-
const exportMarkdown = sessionEdit.move ? buildSessionExport(
|
|
5907
|
+
const exportMarkdown = sessionEdit.move || sessionEdit.deleted ? buildSessionExport(
|
|
5747
5908
|
includeBatchMoveEnvelope ? editsForPlan : [sessionEdit],
|
|
5748
5909
|
[],
|
|
5749
5910
|
{
|
|
@@ -5759,7 +5920,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5759
5920
|
}));
|
|
5760
5921
|
const moveIntent = sessionEdit.move ? getMoveIntentForEdit(sessionEdit, resolvedPlanContext) : null;
|
|
5761
5922
|
const movePlan = includeBatchMoveEnvelope ? resolvedPlanContext.movePlan : null;
|
|
5762
|
-
const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null;
|
|
5923
|
+
const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null || Boolean(sessionEdit.deleted);
|
|
5763
5924
|
if (!hasMeaningfulPayload) return true;
|
|
5764
5925
|
const profile = getExportContentProfile(
|
|
5765
5926
|
[sessionEdit],
|
|
@@ -5773,17 +5934,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5773
5934
|
textChange: sessionEdit.textEdit ?? null,
|
|
5774
5935
|
moveIntent,
|
|
5775
5936
|
...movePlan ? { movePlan } : {},
|
|
5937
|
+
...sessionEdit.deleted ? { deleted: true } : {},
|
|
5776
5938
|
exportMarkdown: withInstruction(profile, exportMarkdown)
|
|
5777
5939
|
});
|
|
5778
5940
|
if (result.ok) {
|
|
5779
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
|
+
}
|
|
5780
5956
|
}
|
|
5781
|
-
return
|
|
5782
|
-
} catch {
|
|
5783
|
-
|
|
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;
|
|
5784
5972
|
}
|
|
5785
5973
|
}, [updateAgentAvailability, removeSessionEdit]);
|
|
5786
|
-
const sendSessionCommentToAgent = React5.useCallback(async (comment) => {
|
|
5974
|
+
const sendSessionCommentToAgent = React5.useCallback(async (comment, _options) => {
|
|
5787
5975
|
const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies);
|
|
5788
5976
|
const commentProfile = { hasCssEdits: false, hasTextEdits: false, hasMoves: false, hasComments: true };
|
|
5789
5977
|
try {
|
|
@@ -5795,13 +5983,40 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5795
5983
|
});
|
|
5796
5984
|
if (result.ok) {
|
|
5797
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
|
+
}
|
|
5798
6000
|
}
|
|
5799
|
-
return
|
|
5800
|
-
} catch {
|
|
5801
|
-
|
|
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;
|
|
5802
6016
|
}
|
|
5803
6017
|
}, [updateAgentAvailability, deleteComment]);
|
|
5804
6018
|
const sendEditToAgent2 = React5.useCallback(async () => {
|
|
6019
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5805
6020
|
const current = stateRef.current;
|
|
5806
6021
|
if (current.selectedElements.length > 1) {
|
|
5807
6022
|
saveCurrentToSession();
|
|
@@ -5836,9 +6051,28 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5836
6051
|
removeSessionEdit(el);
|
|
5837
6052
|
}
|
|
5838
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
|
+
}
|
|
5839
6065
|
}
|
|
5840
|
-
return
|
|
6066
|
+
return result.ok;
|
|
5841
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
|
+
}
|
|
5842
6076
|
return updateAgentAvailability(false);
|
|
5843
6077
|
}
|
|
5844
6078
|
}
|
|
@@ -5861,11 +6095,13 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5861
6095
|
return sendSessionEditToAgent(editToSend);
|
|
5862
6096
|
}, [canSendEditToAgent, sendSessionEditToAgent, saveCurrentToSession]);
|
|
5863
6097
|
const sendCommentToAgent2 = React5.useCallback(async (id) => {
|
|
6098
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5864
6099
|
const comment = stateRef.current.comments.find((c) => c.id === id);
|
|
5865
6100
|
if (!comment) return false;
|
|
5866
6101
|
return sendSessionCommentToAgent(comment);
|
|
5867
6102
|
}, [sendSessionCommentToAgent]);
|
|
5868
6103
|
const sendAllSessionItemsToAgent = React5.useCallback(async () => {
|
|
6104
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5869
6105
|
const items = getSessionItems();
|
|
5870
6106
|
const current = stateRef.current;
|
|
5871
6107
|
const contextOnlyBlocks = getContextOnlyBlocks(current.selectedElements, items);
|
|
@@ -5874,25 +6110,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5874
6110
|
const movePlanContext = buildMovePlanContext(allEdits);
|
|
5875
6111
|
let moveEnvelopeSent = false;
|
|
5876
6112
|
let allSucceeded = true;
|
|
6113
|
+
const failedEditElements = [];
|
|
6114
|
+
const failedCommentIds = [];
|
|
6115
|
+
let anyThrown = false;
|
|
6116
|
+
const batchFailKinds = [];
|
|
5877
6117
|
for (const item of items) {
|
|
5878
6118
|
let succeeded;
|
|
5879
6119
|
if (item.type === "edit") {
|
|
5880
6120
|
const hasMoveIntent = Boolean(item.edit.move && getMoveIntentForEdit(item.edit, movePlanContext));
|
|
5881
6121
|
const includeBatchMoveEnvelope = hasMoveIntent && !moveEnvelopeSent;
|
|
5882
|
-
|
|
5883
|
-
|
|
5884
|
-
|
|
5885
|
-
|
|
5886
|
-
|
|
5887
|
-
|
|
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
|
+
}
|
|
5888
6135
|
if (includeBatchMoveEnvelope) moveEnvelopeSent = true;
|
|
5889
6136
|
} else {
|
|
5890
|
-
|
|
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
|
+
}
|
|
5891
6145
|
}
|
|
5892
6146
|
if (!succeeded) {
|
|
5893
6147
|
allSucceeded = false;
|
|
5894
6148
|
}
|
|
5895
6149
|
}
|
|
6150
|
+
let contextBlockFailed = false;
|
|
5896
6151
|
if (contextOnlyBlocks.length > 0) {
|
|
5897
6152
|
const primaryEl = current.selectedElements.find(
|
|
5898
6153
|
(el) => el.isConnected && !allEdits.some((e) => e.element === el)
|
|
@@ -5906,16 +6161,39 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5906
6161
|
moveIntent: null,
|
|
5907
6162
|
exportMarkdown: contextOnlyBlocks.join("\n\n")
|
|
5908
6163
|
});
|
|
5909
|
-
if (
|
|
6164
|
+
if (result.ok) {
|
|
6165
|
+
updateAgentAvailability(true);
|
|
6166
|
+
} else {
|
|
6167
|
+
updateAgentAvailability(result.errorKind === "network" ? false : true);
|
|
6168
|
+
allSucceeded = false;
|
|
6169
|
+
contextBlockFailed = true;
|
|
6170
|
+
}
|
|
5910
6171
|
} catch {
|
|
6172
|
+
updateAgentAvailability(false);
|
|
5911
6173
|
allSucceeded = false;
|
|
6174
|
+
anyThrown = true;
|
|
6175
|
+
contextBlockFailed = true;
|
|
5912
6176
|
}
|
|
5913
6177
|
}
|
|
5914
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
|
+
}
|
|
5915
6188
|
return allSucceeded;
|
|
5916
|
-
}, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent]);
|
|
6189
|
+
}, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent, updateAgentAvailability]);
|
|
6190
|
+
const clearSendFailure = React5.useCallback(() => {
|
|
6191
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
6192
|
+
}, []);
|
|
5917
6193
|
return {
|
|
5918
6194
|
agentAvailable,
|
|
6195
|
+
lastSendFailure,
|
|
6196
|
+
clearSendFailure,
|
|
5919
6197
|
canSendEditToAgent,
|
|
5920
6198
|
sendEditToAgent: sendEditToAgent2,
|
|
5921
6199
|
sendCommentToAgent: sendCommentToAgent2,
|
|
@@ -5962,7 +6240,9 @@ function useKeyboardShortcuts({
|
|
|
5962
6240
|
const s = stateRef.current;
|
|
5963
6241
|
const undoShortcutPressed = usesMetaForUndo ? e.metaKey && !e.ctrlKey && !e.altKey : e.ctrlKey && !e.metaKey && !e.altKey;
|
|
5964
6242
|
if (undoShortcutPressed && e.key === "z" && !e.shiftKey) {
|
|
6243
|
+
if (!s.editModeActive) return;
|
|
5965
6244
|
if (s.textEditingElement) return;
|
|
6245
|
+
if (isInputFocused()) return;
|
|
5966
6246
|
e.preventDefault();
|
|
5967
6247
|
undo();
|
|
5968
6248
|
return;
|
|
@@ -6017,6 +6297,11 @@ function useKeyboardShortcuts({
|
|
|
6017
6297
|
insertElement("frame");
|
|
6018
6298
|
return;
|
|
6019
6299
|
}
|
|
6300
|
+
if (lowerKey === "t") {
|
|
6301
|
+
e.preventDefault();
|
|
6302
|
+
insertElement("text");
|
|
6303
|
+
return;
|
|
6304
|
+
}
|
|
6020
6305
|
if (lowerKey === "d") {
|
|
6021
6306
|
e.preventDefault();
|
|
6022
6307
|
insertElement("div");
|
|
@@ -6679,6 +6964,10 @@ function DirectEditProvider({ children }) {
|
|
|
6679
6964
|
const undoStackRef = React8.useRef([]);
|
|
6680
6965
|
const sessionEditsRef = React8.useRef(/* @__PURE__ */ new Map());
|
|
6681
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);
|
|
6682
6971
|
const [sessionEditCount, setSessionEditCount] = React8.useState(0);
|
|
6683
6972
|
const stateRef = React8.useRef(state);
|
|
6684
6973
|
React8.useEffect(() => {
|
|
@@ -6713,12 +7002,13 @@ function DirectEditProvider({ children }) {
|
|
|
6713
7002
|
clearSessionEdits,
|
|
6714
7003
|
groupSelection,
|
|
6715
7004
|
deleteSelection,
|
|
6716
|
-
insertElement
|
|
7005
|
+
insertElement: insertElementBase
|
|
6717
7006
|
} = useSessionManager({
|
|
6718
7007
|
stateRef,
|
|
6719
7008
|
sessionEditsRef,
|
|
6720
7009
|
removedSessionEditsRef,
|
|
6721
7010
|
undoStackRef,
|
|
7011
|
+
onElementInsertedRef,
|
|
6722
7012
|
pushUndo,
|
|
6723
7013
|
setState,
|
|
6724
7014
|
setSessionEditCount
|
|
@@ -6768,6 +7058,41 @@ function DirectEditProvider({ children }) {
|
|
|
6768
7058
|
syncSessionItemCount,
|
|
6769
7059
|
setState
|
|
6770
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
|
+
}, []);
|
|
6771
7096
|
const { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 } = useCanvas({
|
|
6772
7097
|
stateRef,
|
|
6773
7098
|
setState
|
|
@@ -6904,6 +7229,8 @@ function DirectEditProvider({ children }) {
|
|
|
6904
7229
|
}, [state.editModeActive]);
|
|
6905
7230
|
const {
|
|
6906
7231
|
agentAvailable,
|
|
7232
|
+
lastSendFailure,
|
|
7233
|
+
clearSendFailure,
|
|
6907
7234
|
canSendEditToAgent,
|
|
6908
7235
|
sendEditToAgent: sendEditToAgent2,
|
|
6909
7236
|
sendCommentToAgent: sendCommentToAgent2,
|
|
@@ -6930,6 +7257,16 @@ function DirectEditProvider({ children }) {
|
|
|
6930
7257
|
} catch {
|
|
6931
7258
|
}
|
|
6932
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]);
|
|
6933
7270
|
useKeyboardShortcuts({
|
|
6934
7271
|
stateRef,
|
|
6935
7272
|
toggleEditMode,
|
|
@@ -6959,9 +7296,10 @@ function DirectEditProvider({ children }) {
|
|
|
6959
7296
|
const stateContextValue = React8.useMemo(() => ({
|
|
6960
7297
|
...state,
|
|
6961
7298
|
agentAvailable,
|
|
7299
|
+
lastSendFailure,
|
|
6962
7300
|
sessionEditCount,
|
|
6963
7301
|
multiSelectContextCount
|
|
6964
|
-
}), [agentAvailable, state, sessionEditCount, multiSelectContextCount]);
|
|
7302
|
+
}), [agentAvailable, lastSendFailure, state, sessionEditCount, multiSelectContextCount]);
|
|
6965
7303
|
const actionsContextValue = React8.useMemo(() => ({
|
|
6966
7304
|
selectElement,
|
|
6967
7305
|
selectElements,
|
|
@@ -6984,6 +7322,7 @@ function DirectEditProvider({ children }) {
|
|
|
6984
7322
|
updateTypographyProperty,
|
|
6985
7323
|
resetToOriginal,
|
|
6986
7324
|
exportEdits,
|
|
7325
|
+
clearSendFailure,
|
|
6987
7326
|
canSendEditToAgent,
|
|
6988
7327
|
sendEditToAgent: sendEditToAgent2,
|
|
6989
7328
|
sendAllSessionItemsToAgent,
|
|
@@ -7008,6 +7347,8 @@ function DirectEditProvider({ children }) {
|
|
|
7008
7347
|
removeSessionEdit,
|
|
7009
7348
|
startTextEditing,
|
|
7010
7349
|
commitTextEditing,
|
|
7350
|
+
setCommentDraftText,
|
|
7351
|
+
setCommentDraftBlockedHandler,
|
|
7011
7352
|
groupSelection,
|
|
7012
7353
|
deleteSelection,
|
|
7013
7354
|
insertElement,
|
|
@@ -7037,6 +7378,7 @@ function DirectEditProvider({ children }) {
|
|
|
7037
7378
|
updateTypographyProperty,
|
|
7038
7379
|
resetToOriginal,
|
|
7039
7380
|
exportEdits,
|
|
7381
|
+
clearSendFailure,
|
|
7040
7382
|
canSendEditToAgent,
|
|
7041
7383
|
sendEditToAgent2,
|
|
7042
7384
|
sendAllSessionItemsToAgent,
|
|
@@ -7061,6 +7403,8 @@ function DirectEditProvider({ children }) {
|
|
|
7061
7403
|
removeSessionEdit,
|
|
7062
7404
|
startTextEditing,
|
|
7063
7405
|
commitTextEditing,
|
|
7406
|
+
setCommentDraftText,
|
|
7407
|
+
setCommentDraftBlockedHandler,
|
|
7064
7408
|
groupSelection,
|
|
7065
7409
|
deleteSelection,
|
|
7066
7410
|
insertElement,
|
|
@@ -7493,6 +7837,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7493
7837
|
{ x: 0, y: 0, scaleX: 1, scaleY: 1 }
|
|
7494
7838
|
);
|
|
7495
7839
|
const originalTransformRef = React12.useRef("");
|
|
7840
|
+
const composeBaseRef = React12.useRef("");
|
|
7496
7841
|
const reorderPreviewRef = React12.useRef(/* @__PURE__ */ new Map());
|
|
7497
7842
|
React12.useEffect(() => {
|
|
7498
7843
|
dragStateRef.current = dragState;
|
|
@@ -7587,6 +7932,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7587
7932
|
}
|
|
7588
7933
|
clearReorderPreview();
|
|
7589
7934
|
originalTransformRef.current = "";
|
|
7935
|
+
composeBaseRef.current = "";
|
|
7590
7936
|
initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
|
|
7591
7937
|
dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
|
|
7592
7938
|
dragGuardRef.current.deactivate();
|
|
@@ -7608,6 +7954,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7608
7954
|
draggedElement.style.opacity = "";
|
|
7609
7955
|
clearReorderPreview();
|
|
7610
7956
|
originalTransformRef.current = "";
|
|
7957
|
+
composeBaseRef.current = "";
|
|
7611
7958
|
initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
|
|
7612
7959
|
const dragMode = dragOptionsRef.current.mode;
|
|
7613
7960
|
dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
|
|
@@ -7668,7 +8015,14 @@ function useMove({ onMoveComplete }) {
|
|
|
7668
8015
|
scaleX: element.offsetWidth > 0 ? rect.width / element.offsetWidth : 1,
|
|
7669
8016
|
scaleY: element.offsetHeight > 0 ? rect.height / element.offsetHeight : 1
|
|
7670
8017
|
};
|
|
7671
|
-
|
|
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
|
+
}
|
|
7672
8026
|
dragGuardRef.current.activate();
|
|
7673
8027
|
setDragState({
|
|
7674
8028
|
isDragging: true,
|
|
@@ -7701,7 +8055,8 @@ function useMove({ onMoveComplete }) {
|
|
|
7701
8055
|
const { x, y, scaleX, scaleY } = initialRectRef.current;
|
|
7702
8056
|
const dx = (e.clientX - dragOffset.x - x) / scaleX;
|
|
7703
8057
|
const dy = (e.clientY - dragOffset.y - y) / scaleY;
|
|
7704
|
-
|
|
8058
|
+
const base = composeBaseRef.current;
|
|
8059
|
+
draggedElement.style.transform = base ? `translate(${dx}px, ${dy}px) ${base}` : `translate(${dx}px, ${dy}px)`;
|
|
7705
8060
|
}
|
|
7706
8061
|
if (dragOptionsRef.current.mode === "position") {
|
|
7707
8062
|
let container2 = findLayoutContainerAtPoint(
|
|
@@ -8568,6 +8923,7 @@ function SelectedCommentComposer({
|
|
|
8568
8923
|
comment,
|
|
8569
8924
|
attentionNonce,
|
|
8570
8925
|
draftRef,
|
|
8926
|
+
onDraftTextChange,
|
|
8571
8927
|
onSubmit,
|
|
8572
8928
|
onCancel
|
|
8573
8929
|
}) {
|
|
@@ -8613,7 +8969,8 @@ function SelectedCommentComposer({
|
|
|
8613
8969
|
}, [attentionNonce]);
|
|
8614
8970
|
React17.useEffect(() => {
|
|
8615
8971
|
if (draftRef) draftRef.current = text;
|
|
8616
|
-
|
|
8972
|
+
onDraftTextChange?.(text);
|
|
8973
|
+
}, [draftRef, onDraftTextChange, text]);
|
|
8617
8974
|
const submit = React17.useCallback(() => {
|
|
8618
8975
|
const nextText = text.trim();
|
|
8619
8976
|
if (!nextText) return;
|
|
@@ -11968,6 +12325,7 @@ function PanelFooter({
|
|
|
11968
12325
|
onExportEdits,
|
|
11969
12326
|
onSendToAgent,
|
|
11970
12327
|
showSendButton = true,
|
|
12328
|
+
sendFailureReason,
|
|
11971
12329
|
onPointerDown,
|
|
11972
12330
|
onPointerMove,
|
|
11973
12331
|
onPointerUp,
|
|
@@ -11976,6 +12334,13 @@ function PanelFooter({
|
|
|
11976
12334
|
const [copied, setCopied] = React30.useState(false);
|
|
11977
12335
|
const [copyError, setCopyError] = React30.useState(false);
|
|
11978
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]);
|
|
11979
12344
|
const handleCopy = async () => {
|
|
11980
12345
|
if (!onExportEdits) return;
|
|
11981
12346
|
const success = await onExportEdits();
|
|
@@ -11989,6 +12354,7 @@ function PanelFooter({
|
|
|
11989
12354
|
setCopyError(true);
|
|
11990
12355
|
setTimeout(() => setCopyError(false), 2e3);
|
|
11991
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";
|
|
11992
12358
|
const handleSendToAgent = async () => {
|
|
11993
12359
|
if (!onSendToAgent || sendStatus === "sending") return;
|
|
11994
12360
|
setSendStatus("sending");
|
|
@@ -11998,7 +12364,6 @@ function PanelFooter({
|
|
|
11998
12364
|
setTimeout(() => setSendStatus("idle"), 2e3);
|
|
11999
12365
|
} else {
|
|
12000
12366
|
setSendStatus("offline");
|
|
12001
|
-
setTimeout(() => setSendStatus("idle"), 2e3);
|
|
12002
12367
|
}
|
|
12003
12368
|
};
|
|
12004
12369
|
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
|
|
@@ -12026,7 +12391,7 @@ function PanelFooter({
|
|
|
12026
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, {})
|
|
12027
12392
|
}
|
|
12028
12393
|
) }),
|
|
12029
|
-
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)(
|
|
12030
12395
|
Button,
|
|
12031
12396
|
{
|
|
12032
12397
|
variant: "outline",
|
|
@@ -12721,6 +13086,7 @@ function DirectEditPanelInner({
|
|
|
12721
13086
|
onSendToAgent,
|
|
12722
13087
|
canSendToAgent = false,
|
|
12723
13088
|
showSendButton = true,
|
|
13089
|
+
sendFailureReason,
|
|
12724
13090
|
className,
|
|
12725
13091
|
style,
|
|
12726
13092
|
panelRef,
|
|
@@ -12874,6 +13240,7 @@ function DirectEditPanelInner({
|
|
|
12874
13240
|
onExportEdits,
|
|
12875
13241
|
onSendToAgent,
|
|
12876
13242
|
showSendButton,
|
|
13243
|
+
sendFailureReason,
|
|
12877
13244
|
onPointerDown: onHeaderPointerDown,
|
|
12878
13245
|
onPointerMove: onHeaderPointerMove,
|
|
12879
13246
|
onPointerUp: onHeaderPointerUp,
|
|
@@ -12908,7 +13275,8 @@ function DirectEditPanelContent() {
|
|
|
12908
13275
|
comments,
|
|
12909
13276
|
activeCommentId,
|
|
12910
13277
|
textEditingElement,
|
|
12911
|
-
agentAvailable
|
|
13278
|
+
agentAvailable,
|
|
13279
|
+
lastSendFailure
|
|
12912
13280
|
} = useDirectEditState();
|
|
12913
13281
|
const {
|
|
12914
13282
|
selectParent,
|
|
@@ -12940,7 +13308,9 @@ function DirectEditPanelContent() {
|
|
|
12940
13308
|
setActiveCommentId,
|
|
12941
13309
|
startTextEditing,
|
|
12942
13310
|
toggleEditMode,
|
|
12943
|
-
deleteSelection
|
|
13311
|
+
deleteSelection,
|
|
13312
|
+
setCommentDraftText,
|
|
13313
|
+
setCommentDraftBlockedHandler
|
|
12944
13314
|
} = useDirectEditActions();
|
|
12945
13315
|
const {
|
|
12946
13316
|
position,
|
|
@@ -12962,7 +13332,8 @@ function DirectEditPanelContent() {
|
|
|
12962
13332
|
});
|
|
12963
13333
|
React34.useEffect(() => {
|
|
12964
13334
|
commentDraftRef.current = "";
|
|
12965
|
-
|
|
13335
|
+
setCommentDraftText("");
|
|
13336
|
+
}, [activeCommentId, setCommentDraftText]);
|
|
12966
13337
|
const activeDraftComment = React34.useMemo(() => {
|
|
12967
13338
|
if (!commentTargetElement || !activeCommentId) return null;
|
|
12968
13339
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
@@ -12982,6 +13353,18 @@ function DirectEditPanelContent() {
|
|
|
12982
13353
|
const triggerCommentInputAttention = React34.useCallback((commentId) => {
|
|
12983
13354
|
setCommentInputAttention((prev) => prev?.commentId === commentId ? { commentId, nonce: prev.nonce + 1 } : { commentId, nonce: 1 });
|
|
12984
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]);
|
|
12985
13368
|
const hasPendingCommentDraft = React34.useCallback((nextCommentId = null) => {
|
|
12986
13369
|
if (!activeCommentId) return false;
|
|
12987
13370
|
if (nextCommentId && nextCommentId === activeCommentId) return false;
|
|
@@ -13091,6 +13474,7 @@ function DirectEditPanelContent() {
|
|
|
13091
13474
|
comment: activeDraftComment,
|
|
13092
13475
|
attentionNonce: commentInputAttention?.commentId === activeDraftComment.id ? commentInputAttention.nonce : 0,
|
|
13093
13476
|
draftRef: commentDraftRef,
|
|
13477
|
+
onDraftTextChange: setCommentDraftText,
|
|
13094
13478
|
onSubmit: (text) => submitCommentDraft(activeDraftComment.id, text),
|
|
13095
13479
|
onCancel: () => handleSetActiveComment(null)
|
|
13096
13480
|
}
|
|
@@ -14240,7 +14624,8 @@ function EditsPopover({
|
|
|
14240
14624
|
onExportAllEdits,
|
|
14241
14625
|
onClearSessionEdits,
|
|
14242
14626
|
onRemoveSessionEdit,
|
|
14243
|
-
onDeleteComment
|
|
14627
|
+
onDeleteComment,
|
|
14628
|
+
sendFailure
|
|
14244
14629
|
}) {
|
|
14245
14630
|
const [copied, setCopied] = React38.useState(false);
|
|
14246
14631
|
const editsPopupRef = React38.useRef(null);
|
|
@@ -14253,6 +14638,7 @@ function EditsPopover({
|
|
|
14253
14638
|
const visibleItems = React38.useMemo(() => {
|
|
14254
14639
|
return editsSnapshot.filter((item) => {
|
|
14255
14640
|
if (item.type === "comment") return true;
|
|
14641
|
+
if (item.edit.deleted) return true;
|
|
14256
14642
|
if (!item.edit.move) return true;
|
|
14257
14643
|
const moveIntent = getMoveIntentForEdit(item.edit, movePlanContext);
|
|
14258
14644
|
const hasStyleOrText = Object.keys(item.edit.pendingStyles).length > 0 || item.edit.textEdit != null;
|
|
@@ -14357,12 +14743,15 @@ ${text}`);
|
|
|
14357
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: [
|
|
14358
14744
|
visibleItems.map((item, i) => {
|
|
14359
14745
|
const isEdit = item.type === "edit";
|
|
14746
|
+
const isDeleted = isEdit && Boolean(item.edit.deleted);
|
|
14360
14747
|
const moveIntent = isEdit && item.edit.move ? getMoveIntentForEdit(item.edit, movePlanContext) : null;
|
|
14361
14748
|
const isMoved = Boolean(moveIntent);
|
|
14362
14749
|
const locator = isEdit ? item.edit.locator : item.comment.locator;
|
|
14363
14750
|
const componentName = locator.reactStack[0]?.name ?? locator.tagName;
|
|
14364
14751
|
let valueSummary = "";
|
|
14365
|
-
if (isEdit) {
|
|
14752
|
+
if (isEdit && isDeleted) {
|
|
14753
|
+
valueSummary = locator.textPreview || locator.domSelector || locator.tagName;
|
|
14754
|
+
} else if (isEdit) {
|
|
14366
14755
|
const entries = Object.entries(item.edit.pendingStyles);
|
|
14367
14756
|
const editValues = [];
|
|
14368
14757
|
for (const [prop, value] of entries) {
|
|
@@ -14383,6 +14772,7 @@ ${text}`);
|
|
|
14383
14772
|
}
|
|
14384
14773
|
valueSummary = commentValues.join(", ");
|
|
14385
14774
|
}
|
|
14775
|
+
const failed = isEdit ? sendFailure?.failedEditElements.includes(item.edit.element) : sendFailure?.failedCommentIds.includes(item.comment.id);
|
|
14386
14776
|
return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
|
|
14387
14777
|
"div",
|
|
14388
14778
|
{
|
|
@@ -14401,13 +14791,16 @@ ${text}`);
|
|
|
14401
14791
|
},
|
|
14402
14792
|
children: [
|
|
14403
14793
|
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "min-w-0 flex flex-1 flex-col items-start gap-[4px]", children: [
|
|
14404
|
-
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
|
|
14405
|
-
"
|
|
14406
|
-
|
|
14407
|
-
|
|
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" })
|
|
14408
14801
|
] }),
|
|
14409
14802
|
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("span", { className: "min-w-0 max-w-full truncate text-xs text-muted-foreground", children: [
|
|
14410
|
-
isEdit ? isMoved ? "moved: " : "edit: " : "comment: ",
|
|
14803
|
+
isEdit ? isDeleted ? "deleted: " : isMoved ? "moved: " : "edit: " : "comment: ",
|
|
14411
14804
|
truncateText(valueSummary, 128)
|
|
14412
14805
|
] })
|
|
14413
14806
|
] }),
|
|
@@ -14659,6 +15052,7 @@ function SettingsPopover({
|
|
|
14659
15052
|
{ label: "Undo", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Command, { className: "size-2.5" }, "cmd"), "Z"] : ["Ctrl", "Z"] },
|
|
14660
15053
|
{ label: "Group selection", keys: isMac ? [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.Command, { className: "size-2.5" }, "cmd"), "G"] : ["Ctrl", "G"] },
|
|
14661
15054
|
{ label: "Add frame", keys: ["F"] },
|
|
15055
|
+
{ label: "Add text", keys: ["T"] },
|
|
14662
15056
|
{ label: "Add div", keys: ["D"] },
|
|
14663
15057
|
{ label: "Add to selection", keys: [/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ArrowBigUp, { className: "size-3" }, "shift"), "Click"] },
|
|
14664
15058
|
{ label: "Marquee select", keys: ["Drag"] },
|
|
@@ -14701,6 +15095,8 @@ function DirectEditToolbarInner({
|
|
|
14701
15095
|
onExportAllEdits,
|
|
14702
15096
|
onSendAllToAgents,
|
|
14703
15097
|
agentAvailable = true,
|
|
15098
|
+
sendFailureReason,
|
|
15099
|
+
sendFailure,
|
|
14704
15100
|
onClearSessionEdits,
|
|
14705
15101
|
onRemoveSessionEdit,
|
|
14706
15102
|
onDeleteComment,
|
|
@@ -14710,7 +15106,8 @@ function DirectEditToolbarInner({
|
|
|
14710
15106
|
onToggleCanvas,
|
|
14711
15107
|
onSetCanvasZoom,
|
|
14712
15108
|
onZoomTo100,
|
|
14713
|
-
onFitToViewport
|
|
15109
|
+
onFitToViewport,
|
|
15110
|
+
onInsertElement
|
|
14714
15111
|
}) {
|
|
14715
15112
|
const container = usePortalContainer();
|
|
14716
15113
|
const toolbarRef = React40.useRef(null);
|
|
@@ -14719,7 +15116,8 @@ function DirectEditToolbarInner({
|
|
|
14719
15116
|
const [activePopover, setActivePopover] = React40.useState(null);
|
|
14720
15117
|
const [applyStatus, setApplyStatus] = React40.useState("idle");
|
|
14721
15118
|
const applyTimerRef = React40.useRef(null);
|
|
14722
|
-
const showApplyButton = agentAvailable && Boolean(onSendAllToAgents);
|
|
15119
|
+
const showApplyButton = (agentAvailable || applyStatus !== "idle") && Boolean(onSendAllToAgents);
|
|
15120
|
+
const showInsertButtons = Boolean(onInsertElement);
|
|
14723
15121
|
const totalItemCount = sessionEditCount + multiSelectCount;
|
|
14724
15122
|
const sizeCacheRef = React40.useRef({});
|
|
14725
15123
|
React40.useEffect(() => {
|
|
@@ -14773,6 +15171,16 @@ function DirectEditToolbarInner({
|
|
|
14773
15171
|
setApplyStatus("idle");
|
|
14774
15172
|
}, 2e3);
|
|
14775
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";
|
|
14776
15184
|
const handleApplyAll = React40.useCallback(async () => {
|
|
14777
15185
|
if (!onSendAllToAgents || totalItemCount === 0 || applyStatus === "sending") return;
|
|
14778
15186
|
setApplyStatus("sending");
|
|
@@ -14782,8 +15190,12 @@ function DirectEditToolbarInner({
|
|
|
14782
15190
|
} catch {
|
|
14783
15191
|
success = false;
|
|
14784
15192
|
}
|
|
14785
|
-
|
|
14786
|
-
|
|
15193
|
+
if (success) {
|
|
15194
|
+
setApplyStatus("sent");
|
|
15195
|
+
scheduleApplyReset();
|
|
15196
|
+
} else {
|
|
15197
|
+
setApplyStatus("offline");
|
|
15198
|
+
}
|
|
14787
15199
|
}, [applyStatus, onSendAllToAgents, scheduleApplyReset, totalItemCount]);
|
|
14788
15200
|
const dragHandlers = React40.useMemo(() => ({
|
|
14789
15201
|
onPointerDown: handlePointerDown,
|
|
@@ -14864,6 +15276,38 @@ function DirectEditToolbarInner({
|
|
|
14864
15276
|
},
|
|
14865
15277
|
...dragHandlers,
|
|
14866
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
|
+
] }),
|
|
14867
15311
|
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
14868
15312
|
EditsPopover,
|
|
14869
15313
|
{
|
|
@@ -14876,7 +15320,8 @@ function DirectEditToolbarInner({
|
|
|
14876
15320
|
onExportAllEdits,
|
|
14877
15321
|
onClearSessionEdits,
|
|
14878
15322
|
onRemoveSessionEdit,
|
|
14879
|
-
onDeleteComment
|
|
15323
|
+
onDeleteComment,
|
|
15324
|
+
sendFailure
|
|
14880
15325
|
}
|
|
14881
15326
|
),
|
|
14882
15327
|
showApplyButton && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Tooltip, { children: [
|
|
@@ -14900,7 +15345,7 @@ function DirectEditToolbarInner({
|
|
|
14900
15345
|
]
|
|
14901
15346
|
}
|
|
14902
15347
|
),
|
|
14903
|
-
/* @__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 }) })
|
|
14904
15349
|
] }),
|
|
14905
15350
|
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
14906
15351
|
"div",
|
|
@@ -14962,7 +15407,7 @@ function DirectEditToolbarInner({
|
|
|
14962
15407
|
return toolbar;
|
|
14963
15408
|
}
|
|
14964
15409
|
function DirectEditToolbarContent() {
|
|
14965
|
-
const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable } = useDirectEditState();
|
|
15410
|
+
const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable, lastSendFailure } = useDirectEditState();
|
|
14966
15411
|
const {
|
|
14967
15412
|
toggleEditMode,
|
|
14968
15413
|
setTheme,
|
|
@@ -14972,6 +15417,7 @@ function DirectEditToolbarContent() {
|
|
|
14972
15417
|
clearSessionEdits,
|
|
14973
15418
|
removeSessionEdit,
|
|
14974
15419
|
deleteComment,
|
|
15420
|
+
insertElement,
|
|
14975
15421
|
toggleCanvas,
|
|
14976
15422
|
setCanvasZoom,
|
|
14977
15423
|
zoomCanvasTo100,
|
|
@@ -14994,6 +15440,8 @@ function DirectEditToolbarContent() {
|
|
|
14994
15440
|
onExportAllEdits: exportAllEdits,
|
|
14995
15441
|
onSendAllToAgents: sendAllSessionItemsToAgent,
|
|
14996
15442
|
agentAvailable,
|
|
15443
|
+
sendFailureReason: lastSendFailure?.reason ?? null,
|
|
15444
|
+
sendFailure: lastSendFailure,
|
|
14997
15445
|
onClearSessionEdits: clearSessionEdits,
|
|
14998
15446
|
onRemoveSessionEdit: removeSessionEdit,
|
|
14999
15447
|
onDeleteComment: deleteComment,
|
|
@@ -15002,7 +15450,8 @@ function DirectEditToolbarContent() {
|
|
|
15002
15450
|
onToggleCanvas: toggleCanvas,
|
|
15003
15451
|
onSetCanvasZoom: setCanvasZoom,
|
|
15004
15452
|
onZoomTo100: zoomCanvasTo100,
|
|
15005
|
-
onFitToViewport: fitCanvasToViewport
|
|
15453
|
+
onFitToViewport: fitCanvasToViewport,
|
|
15454
|
+
onInsertElement: insertElement
|
|
15006
15455
|
}
|
|
15007
15456
|
);
|
|
15008
15457
|
}
|