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.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import * as React8 from "react";
|
|
|
7
7
|
import * as React from "react";
|
|
8
8
|
|
|
9
9
|
// dist/styles.css
|
|
10
|
-
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}}';
|
|
10
|
+
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}}';
|
|
11
11
|
|
|
12
12
|
// src/portal-container.tsx
|
|
13
13
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -397,10 +397,30 @@ function getSourceFromFiber(fiber) {
|
|
|
397
397
|
if (fromDebugStack?.fileName) return fromDebugStack;
|
|
398
398
|
return null;
|
|
399
399
|
}
|
|
400
|
+
var REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref");
|
|
401
|
+
var REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo");
|
|
402
|
+
function resolveComponentName(type) {
|
|
403
|
+
let current = type;
|
|
404
|
+
for (let depth = 0; depth < 4 && current != null; depth++) {
|
|
405
|
+
const name = current.displayName || (typeof current === "function" ? current.name : void 0);
|
|
406
|
+
if (name) return name;
|
|
407
|
+
if (typeof current !== "object") return null;
|
|
408
|
+
if (current.$$typeof === REACT_MEMO_TYPE) {
|
|
409
|
+
current = current.type;
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
if (current.$$typeof === REACT_FORWARD_REF_TYPE) {
|
|
413
|
+
current = current.render;
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
400
420
|
function buildFrame(fiber) {
|
|
401
421
|
const type = fiber?.type;
|
|
402
422
|
if (typeof type !== "function" && typeof type !== "object") return null;
|
|
403
|
-
const name = type
|
|
423
|
+
const name = resolveComponentName(type);
|
|
404
424
|
if (!name || name === "Fragment") return null;
|
|
405
425
|
const frame = { name };
|
|
406
426
|
const source = getSourceFromFiber(fiber);
|
|
@@ -2412,7 +2432,7 @@ function buildElementContext(locator) {
|
|
|
2412
2432
|
return buildLocatorContextLines(locator).join("\n");
|
|
2413
2433
|
}
|
|
2414
2434
|
function hasSessionEditChanges(edit) {
|
|
2415
|
-
return Object.keys(edit.pendingStyles).length > 0 || Boolean(edit.textEdit) || Boolean(edit.move);
|
|
2435
|
+
return Object.keys(edit.pendingStyles).length > 0 || Boolean(edit.textEdit) || Boolean(edit.move) || Boolean(edit.deleted);
|
|
2416
2436
|
}
|
|
2417
2437
|
function partitionMultiSelectedEdits(elements, sessionEditsRef) {
|
|
2418
2438
|
const editsWithChanges = [];
|
|
@@ -2934,7 +2954,7 @@ function buildMoveEntries(edits) {
|
|
|
2934
2954
|
let noopMoveCount = 0;
|
|
2935
2955
|
for (const edit of edits) {
|
|
2936
2956
|
const move = edit.move;
|
|
2937
|
-
if (!move) continue;
|
|
2957
|
+
if (!move || edit.deleted) continue;
|
|
2938
2958
|
const subject = buildAnchorRef(
|
|
2939
2959
|
getElementDisplayName(edit.element) || edit.locator.tagName,
|
|
2940
2960
|
edit.locator.domSelector,
|
|
@@ -3093,19 +3113,22 @@ function getExportContentProfile(edits, comments, movePlanOrContext) {
|
|
|
3093
3113
|
hasCssEdits: edits.some((e) => Object.keys(e.pendingStyles).length > 0),
|
|
3094
3114
|
hasTextEdits: edits.some((e) => e.textEdit != null),
|
|
3095
3115
|
hasMoves: moveOpCount > 0,
|
|
3096
|
-
hasComments: comments.length > 0
|
|
3116
|
+
hasComments: comments.length > 0,
|
|
3117
|
+
hasDeletes: edits.some((e) => e.deleted)
|
|
3097
3118
|
};
|
|
3098
3119
|
}
|
|
3099
3120
|
function buildExportInstruction(profile) {
|
|
3100
3121
|
const { hasCssEdits, hasTextEdits, hasMoves, hasComments } = profile;
|
|
3101
|
-
|
|
3102
|
-
if (!hasCssEdits && !hasTextEdits && !hasMoves)
|
|
3122
|
+
const hasDeletes = Boolean(profile.hasDeletes);
|
|
3123
|
+
if (!hasCssEdits && !hasTextEdits && !hasMoves && !hasComments && !hasDeletes) return "";
|
|
3124
|
+
if (!hasCssEdits && !hasTextEdits && !hasMoves && !hasDeletes) {
|
|
3103
3125
|
return hasComments ? "Address this feedback on the UI. Use the provided source location and selector to find each element in the codebase." : "";
|
|
3104
3126
|
}
|
|
3105
3127
|
const parts = [];
|
|
3106
3128
|
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.");
|
|
3107
3129
|
if (hasTextEdits) parts.push("Update the text content as specified.");
|
|
3108
3130
|
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.");
|
|
3131
|
+
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).");
|
|
3109
3132
|
if (hasComments) parts.push("Address the comments on the relevant elements.");
|
|
3110
3133
|
return `${parts.join(" ")} Use the provided source locations, selectors, and context HTML to locate each element in the codebase.`;
|
|
3111
3134
|
}
|
|
@@ -3140,6 +3163,13 @@ function buildSessionExport(edits, comments = [], options) {
|
|
|
3140
3163
|
blocks.push(planLines.join("\n"));
|
|
3141
3164
|
}
|
|
3142
3165
|
for (const edit of edits) {
|
|
3166
|
+
if (edit.deleted) {
|
|
3167
|
+
const lines = buildLocatorContextLines(edit.locator);
|
|
3168
|
+
lines.push("");
|
|
3169
|
+
lines.push("action: delete this element \u2014 remove it from the source");
|
|
3170
|
+
blocks.push(lines.join("\n"));
|
|
3171
|
+
continue;
|
|
3172
|
+
}
|
|
3143
3173
|
const moveIntent = getMoveIntentForEdit(edit, planContext);
|
|
3144
3174
|
const hasMove = Boolean(moveIntent);
|
|
3145
3175
|
const hasStyleOrText = Object.keys(edit.pendingStyles).length > 0 || edit.textEdit != null;
|
|
@@ -4048,6 +4078,7 @@ function useSessionManager({
|
|
|
4048
4078
|
sessionEditsRef,
|
|
4049
4079
|
removedSessionEditsRef,
|
|
4050
4080
|
undoStackRef,
|
|
4081
|
+
onElementInsertedRef,
|
|
4051
4082
|
pushUndo,
|
|
4052
4083
|
setState,
|
|
4053
4084
|
setSessionEditCount
|
|
@@ -4244,27 +4275,48 @@ function useSessionManager({
|
|
|
4244
4275
|
selectElement(firstChild);
|
|
4245
4276
|
}
|
|
4246
4277
|
}, [getSelectableChild, selectElement]);
|
|
4278
|
+
const centerElementOnBody = React3.useCallback((element, size) => {
|
|
4279
|
+
const bodyRect = document.body.getBoundingClientRect();
|
|
4280
|
+
const scaleX = document.body.offsetWidth > 0 ? bodyRect.width / document.body.offsetWidth : 1;
|
|
4281
|
+
const scaleY = document.body.offsetHeight > 0 ? bodyRect.height / document.body.offsetHeight : 1;
|
|
4282
|
+
const fallbackWidth = size?.width ?? element.offsetWidth ?? 0;
|
|
4283
|
+
const fallbackHeight = size?.height ?? element.offsetHeight ?? 0;
|
|
4284
|
+
const measuredRect = element.getBoundingClientRect();
|
|
4285
|
+
const width = measuredRect.width || fallbackWidth;
|
|
4286
|
+
const height = measuredRect.height || fallbackHeight;
|
|
4287
|
+
const left = Math.round((window.innerWidth / 2 - bodyRect.left) / scaleX - width / 2);
|
|
4288
|
+
const top = Math.round((window.innerHeight / 2 - bodyRect.top) / scaleY - height / 2);
|
|
4289
|
+
element.style.left = `${left}px`;
|
|
4290
|
+
element.style.top = `${top}px`;
|
|
4291
|
+
}, []);
|
|
4247
4292
|
const insertElement = React3.useCallback((kind) => {
|
|
4248
4293
|
if (!stateRef.current.editModeActive) return;
|
|
4249
4294
|
saveCurrentToSession();
|
|
4250
4295
|
const restoreSelection = buildSelectionSnapshot();
|
|
4251
4296
|
const selectedEl = stateRef.current.selectedElement;
|
|
4252
|
-
const
|
|
4253
|
-
const
|
|
4254
|
-
const
|
|
4255
|
-
const element = document.createElement("div");
|
|
4297
|
+
const insertsAsSibling = kind === "frame" || kind === "text";
|
|
4298
|
+
const hasSelection = insertsAsSibling && selectedEl !== null && selectedEl !== document.body && selectedEl.parentElement !== null;
|
|
4299
|
+
const element = document.createElement(kind === "text" ? "p" : "div");
|
|
4256
4300
|
element.id = nextGeneratedCanvasId(kind);
|
|
4257
4301
|
element.setAttribute(GENERATED_CANVAS_NODE_ATTR, kind);
|
|
4258
|
-
element.style.width = `${width}px`;
|
|
4259
|
-
element.style.height = `${height}px`;
|
|
4260
4302
|
element.style.boxSizing = "border-box";
|
|
4261
4303
|
if (kind === "frame") {
|
|
4304
|
+
element.style.width = "100px";
|
|
4305
|
+
element.style.height = "100px";
|
|
4262
4306
|
element.style.background = "#F5F5F5";
|
|
4263
4307
|
element.style.border = "1px solid #E0E0E0";
|
|
4264
|
-
} else {
|
|
4308
|
+
} else if (kind === "div") {
|
|
4309
|
+
element.style.width = "160px";
|
|
4310
|
+
element.style.height = "96px";
|
|
4265
4311
|
element.style.borderRadius = "12px";
|
|
4266
4312
|
element.style.border = "1px solid rgba(13, 153, 255, 0.35)";
|
|
4267
4313
|
element.style.background = "rgba(13, 153, 255, 0.08)";
|
|
4314
|
+
} else {
|
|
4315
|
+
element.textContent = "Text";
|
|
4316
|
+
element.style.display = "inline-block";
|
|
4317
|
+
element.style.margin = "0";
|
|
4318
|
+
element.style.minHeight = "24px";
|
|
4319
|
+
element.style.textAlign = "center";
|
|
4268
4320
|
}
|
|
4269
4321
|
if (hasSelection) {
|
|
4270
4322
|
const insertionParent = selectedEl.parentElement;
|
|
@@ -4275,16 +4327,22 @@ function useSessionManager({
|
|
|
4275
4327
|
insertionParent.appendChild(element);
|
|
4276
4328
|
}
|
|
4277
4329
|
} else {
|
|
4278
|
-
const bodyRect = document.body.getBoundingClientRect();
|
|
4279
|
-
const scaleX = document.body.offsetWidth > 0 ? bodyRect.width / document.body.offsetWidth : 1;
|
|
4280
|
-
const scaleY = document.body.offsetHeight > 0 ? bodyRect.height / document.body.offsetHeight : 1;
|
|
4281
|
-
const left = Math.round((window.innerWidth / 2 - bodyRect.left) / scaleX - width / 2);
|
|
4282
|
-
const top = Math.round((window.innerHeight / 2 - bodyRect.top) / scaleY - height / 2);
|
|
4283
4330
|
element.style.position = "absolute";
|
|
4284
|
-
element.style.left = `${left}px`;
|
|
4285
|
-
element.style.top = `${top}px`;
|
|
4286
4331
|
element.style.zIndex = "1";
|
|
4287
|
-
|
|
4332
|
+
if (kind === "text") {
|
|
4333
|
+
element.style.left = "0px";
|
|
4334
|
+
element.style.top = "0px";
|
|
4335
|
+
element.style.visibility = "hidden";
|
|
4336
|
+
document.body.appendChild(element);
|
|
4337
|
+
centerElementOnBody(element);
|
|
4338
|
+
element.style.visibility = "";
|
|
4339
|
+
} else {
|
|
4340
|
+
centerElementOnBody(
|
|
4341
|
+
element,
|
|
4342
|
+
kind === "frame" ? { width: 100, height: 100 } : { width: 160, height: 96 }
|
|
4343
|
+
);
|
|
4344
|
+
document.body.appendChild(element);
|
|
4345
|
+
}
|
|
4288
4346
|
}
|
|
4289
4347
|
pushUndo({
|
|
4290
4348
|
type: "structure",
|
|
@@ -4299,7 +4357,8 @@ function useSessionManager({
|
|
|
4299
4357
|
primaryElement: element,
|
|
4300
4358
|
pushUndo: false
|
|
4301
4359
|
});
|
|
4302
|
-
|
|
4360
|
+
onElementInsertedRef.current?.(kind, element);
|
|
4361
|
+
}, [applySelection, buildSelectionSnapshot, centerElementOnBody, onElementInsertedRef, pushUndo, saveCurrentToSession, stateRef]);
|
|
4303
4362
|
const groupSelection = React3.useCallback(() => {
|
|
4304
4363
|
const selected = getSanitizedSelection(stateRef.current.selectedElements);
|
|
4305
4364
|
if (selected.length < 2) return;
|
|
@@ -4395,9 +4454,17 @@ function useSessionManager({
|
|
|
4395
4454
|
}));
|
|
4396
4455
|
const sessionSnapshots = /* @__PURE__ */ new Map();
|
|
4397
4456
|
for (const el of selected) {
|
|
4398
|
-
const
|
|
4399
|
-
|
|
4400
|
-
sessionEditsRef.current.
|
|
4457
|
+
const existing = sessionEditsRef.current.get(el);
|
|
4458
|
+
sessionSnapshots.set(el, existing ?? null);
|
|
4459
|
+
sessionEditsRef.current.set(el, existing ? { ...existing, deleted: true } : {
|
|
4460
|
+
element: el,
|
|
4461
|
+
locator: getElementLocator(el),
|
|
4462
|
+
originalStyles: {},
|
|
4463
|
+
pendingStyles: {},
|
|
4464
|
+
move: null,
|
|
4465
|
+
textEdit: null,
|
|
4466
|
+
deleted: true
|
|
4467
|
+
});
|
|
4401
4468
|
}
|
|
4402
4469
|
syncSessionItemCount();
|
|
4403
4470
|
for (const { element } of snapshots) {
|
|
@@ -4418,7 +4485,8 @@ function useSessionManager({
|
|
|
4418
4485
|
}
|
|
4419
4486
|
}
|
|
4420
4487
|
for (const [el, edit] of sessionSnapshots) {
|
|
4421
|
-
sessionEditsRef.current.set(el, edit);
|
|
4488
|
+
if (edit) sessionEditsRef.current.set(el, edit);
|
|
4489
|
+
else sessionEditsRef.current.delete(el);
|
|
4422
4490
|
}
|
|
4423
4491
|
syncSessionItemCount();
|
|
4424
4492
|
}
|
|
@@ -4809,7 +4877,7 @@ function useSessionManager({
|
|
|
4809
4877
|
saveCurrentToSession();
|
|
4810
4878
|
const edits = [];
|
|
4811
4879
|
for (const edit of sessionEditsRef.current.values()) {
|
|
4812
|
-
if (!edit.element.isConnected) {
|
|
4880
|
+
if (!edit.element.isConnected && !edit.deleted) {
|
|
4813
4881
|
sessionEditsRef.current.delete(edit.element);
|
|
4814
4882
|
continue;
|
|
4815
4883
|
}
|
|
@@ -4978,6 +5046,7 @@ ${exportMarkdown}`);
|
|
|
4978
5046
|
|
|
4979
5047
|
// src/use-text-and-comments.ts
|
|
4980
5048
|
import * as React4 from "react";
|
|
5049
|
+
var GENERATED_CANVAS_NODE_ATTR2 = "data-made-refine-canvas-node";
|
|
4981
5050
|
function clampUnit(value) {
|
|
4982
5051
|
if (!Number.isFinite(value)) return 0;
|
|
4983
5052
|
return Math.max(0, Math.min(1, value));
|
|
@@ -5013,6 +5082,94 @@ function useTextAndComments({
|
|
|
5013
5082
|
editingElement.style.outlineOffset = "";
|
|
5014
5083
|
editingElement.style.cursor = originalCursor;
|
|
5015
5084
|
editingElement.blur();
|
|
5085
|
+
const isGeneratedTextElement = editingElement.getAttribute(GENERATED_CANVAS_NODE_ATTR2) === "text";
|
|
5086
|
+
const shouldDeleteGeneratedText = isGeneratedTextElement && newText.trim().length === 0;
|
|
5087
|
+
if (shouldDeleteGeneratedText) {
|
|
5088
|
+
const parent = editingElement.parentElement;
|
|
5089
|
+
const nextSibling = editingElement.nextSibling;
|
|
5090
|
+
const current = stateRef.current;
|
|
5091
|
+
const removedComments = current.comments.filter((comment) => comment.element === editingElement);
|
|
5092
|
+
const removedCommentIds = new Set(removedComments.map((comment) => comment.id));
|
|
5093
|
+
const remainingComments = current.comments.filter((comment) => comment.element !== editingElement);
|
|
5094
|
+
const restoredActiveCommentId = current.activeCommentId && removedCommentIds.has(current.activeCommentId) ? current.activeCommentId : null;
|
|
5095
|
+
const existingSessionEdit = existing ? {
|
|
5096
|
+
...existing,
|
|
5097
|
+
originalStyles: { ...existing.originalStyles },
|
|
5098
|
+
pendingStyles: { ...existing.pendingStyles },
|
|
5099
|
+
move: existing.move ? { ...existing.move } : null,
|
|
5100
|
+
textEdit: existing.textEdit ? { ...existing.textEdit } : null
|
|
5101
|
+
} : null;
|
|
5102
|
+
const restoreSelection = {
|
|
5103
|
+
isOpen: current.isOpen,
|
|
5104
|
+
selectedElement: current.selectedElement,
|
|
5105
|
+
selectedElements: [...current.selectedElements],
|
|
5106
|
+
selectionAnchorElement: current.selectionAnchorElement,
|
|
5107
|
+
originalStyles: { ...current.originalStyles },
|
|
5108
|
+
pendingStyles: { ...current.pendingStyles }
|
|
5109
|
+
};
|
|
5110
|
+
sessionEditsRef.current.delete(editingElement);
|
|
5111
|
+
if (editingElement.isConnected) {
|
|
5112
|
+
editingElement.remove();
|
|
5113
|
+
}
|
|
5114
|
+
pushUndo({
|
|
5115
|
+
type: "structure",
|
|
5116
|
+
restoreSelection,
|
|
5117
|
+
undo: () => {
|
|
5118
|
+
editingElement.textContent = previousText;
|
|
5119
|
+
if (!editingElement.isConnected && parent?.isConnected) {
|
|
5120
|
+
if (nextSibling && nextSibling.parentNode === parent) {
|
|
5121
|
+
parent.insertBefore(editingElement, nextSibling);
|
|
5122
|
+
} else {
|
|
5123
|
+
parent.appendChild(editingElement);
|
|
5124
|
+
}
|
|
5125
|
+
}
|
|
5126
|
+
if (existingSessionEdit) {
|
|
5127
|
+
sessionEditsRef.current.set(editingElement, existingSessionEdit);
|
|
5128
|
+
}
|
|
5129
|
+
setState((prev) => ({
|
|
5130
|
+
...prev,
|
|
5131
|
+
comments: current.comments,
|
|
5132
|
+
activeCommentId: restoredActiveCommentId ?? prev.activeCommentId
|
|
5133
|
+
}));
|
|
5134
|
+
syncSessionItemCount(current.comments);
|
|
5135
|
+
}
|
|
5136
|
+
});
|
|
5137
|
+
syncSessionItemCount(remainingComments);
|
|
5138
|
+
setState((prev) => {
|
|
5139
|
+
const selectionContainsElement = prev.selectedElement === editingElement || prev.selectionAnchorElement === editingElement || prev.selectedElements.includes(editingElement);
|
|
5140
|
+
if (!selectionContainsElement) {
|
|
5141
|
+
return prev.textEditingElement === editingElement ? {
|
|
5142
|
+
...prev,
|
|
5143
|
+
comments: prev.comments.filter((comment) => comment.element !== editingElement),
|
|
5144
|
+
activeCommentId: prev.activeCommentId && removedCommentIds.has(prev.activeCommentId) ? null : prev.activeCommentId,
|
|
5145
|
+
textEditingElement: null
|
|
5146
|
+
} : prev;
|
|
5147
|
+
}
|
|
5148
|
+
return {
|
|
5149
|
+
...prev,
|
|
5150
|
+
isOpen: false,
|
|
5151
|
+
selectedElement: null,
|
|
5152
|
+
selectedElements: [],
|
|
5153
|
+
selectionAnchorElement: null,
|
|
5154
|
+
elementInfo: null,
|
|
5155
|
+
computedSpacing: null,
|
|
5156
|
+
computedBorderRadius: null,
|
|
5157
|
+
computedBorder: null,
|
|
5158
|
+
computedFlex: null,
|
|
5159
|
+
computedSizing: null,
|
|
5160
|
+
computedColor: null,
|
|
5161
|
+
computedBoxShadow: null,
|
|
5162
|
+
computedTypography: null,
|
|
5163
|
+
isComponentPrimitive: false,
|
|
5164
|
+
comments: remainingComments,
|
|
5165
|
+
activeCommentId: restoredActiveCommentId ? null : prev.activeCommentId,
|
|
5166
|
+
originalStyles: {},
|
|
5167
|
+
pendingStyles: {},
|
|
5168
|
+
textEditingElement: null
|
|
5169
|
+
};
|
|
5170
|
+
});
|
|
5171
|
+
return;
|
|
5172
|
+
}
|
|
5016
5173
|
if (newText !== previousText) {
|
|
5017
5174
|
pushUndo({ type: "textEdit", element: editingElement, originalText, previousText });
|
|
5018
5175
|
removedSessionEditsRef.current.delete(editingElement);
|
|
@@ -5531,28 +5688,30 @@ async function toClientResponse(response) {
|
|
|
5531
5688
|
const data = await readJsonRecord(response);
|
|
5532
5689
|
const bodyOk = data?.ok;
|
|
5533
5690
|
const parsedOk = typeof bodyOk === "boolean" ? bodyOk : response.ok;
|
|
5691
|
+
const ok = parsedOk && response.ok;
|
|
5534
5692
|
return {
|
|
5535
|
-
ok
|
|
5536
|
-
id: readString(data, "id") ?? ""
|
|
5693
|
+
ok,
|
|
5694
|
+
id: readString(data, "id") ?? "",
|
|
5695
|
+
...!ok ? { errorKind: "rejected" } : {}
|
|
5537
5696
|
};
|
|
5538
5697
|
}
|
|
5539
5698
|
async function postWithSessionToken(path, payload) {
|
|
5540
5699
|
const idempotencyKey = createIdempotencyKey();
|
|
5541
5700
|
let session = await bootstrapSession();
|
|
5542
|
-
if (!session) return { ok: false, id: "" };
|
|
5701
|
+
if (!session) return { ok: false, id: "", errorKind: "network" };
|
|
5543
5702
|
let response;
|
|
5544
5703
|
try {
|
|
5545
5704
|
response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
|
|
5546
5705
|
} catch {
|
|
5547
|
-
return { ok: false, id: "" };
|
|
5706
|
+
return { ok: false, id: "", errorKind: "network" };
|
|
5548
5707
|
}
|
|
5549
5708
|
if (response.status === 401 || response.status === 403) {
|
|
5550
5709
|
session = await refreshSessionToken(session) ?? await bootstrapSession(true);
|
|
5551
|
-
if (!session) return { ok: false, id: "" };
|
|
5710
|
+
if (!session) return { ok: false, id: "", errorKind: "network" };
|
|
5552
5711
|
try {
|
|
5553
5712
|
response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
|
|
5554
5713
|
} catch {
|
|
5555
|
-
return { ok: false, id: "" };
|
|
5714
|
+
return { ok: false, id: "", errorKind: "network" };
|
|
5556
5715
|
}
|
|
5557
5716
|
}
|
|
5558
5717
|
return toClientResponse(response);
|
|
@@ -5605,8 +5764,10 @@ function buildLocatorPayload(locator) {
|
|
|
5605
5764
|
}
|
|
5606
5765
|
function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrentToSession, removeSessionEdit, deleteComment }) {
|
|
5607
5766
|
const [agentAvailable, setAgentAvailable] = React5.useState(false);
|
|
5767
|
+
const [lastSendFailure, setLastSendFailure] = React5.useState(null);
|
|
5608
5768
|
const isMountedRef = React5.useRef(true);
|
|
5609
5769
|
React5.useEffect(() => {
|
|
5770
|
+
isMountedRef.current = true;
|
|
5610
5771
|
return () => {
|
|
5611
5772
|
isMountedRef.current = false;
|
|
5612
5773
|
};
|
|
@@ -5663,7 +5824,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5663
5824
|
const resolvedPlanContext = movePlanContext ?? buildMovePlanContext(editsForPlan);
|
|
5664
5825
|
const includeBatchMoveEnvelope = Boolean(options?.includeBatchMoveEnvelope && sessionEdit.move);
|
|
5665
5826
|
const isBatchSend = Boolean(allEdits && allEdits.length > 1);
|
|
5666
|
-
const exportMarkdown = sessionEdit.move ? buildSessionExport(
|
|
5827
|
+
const exportMarkdown = sessionEdit.move || sessionEdit.deleted ? buildSessionExport(
|
|
5667
5828
|
includeBatchMoveEnvelope ? editsForPlan : [sessionEdit],
|
|
5668
5829
|
[],
|
|
5669
5830
|
{
|
|
@@ -5679,7 +5840,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5679
5840
|
}));
|
|
5680
5841
|
const moveIntent = sessionEdit.move ? getMoveIntentForEdit(sessionEdit, resolvedPlanContext) : null;
|
|
5681
5842
|
const movePlan = includeBatchMoveEnvelope ? resolvedPlanContext.movePlan : null;
|
|
5682
|
-
const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null;
|
|
5843
|
+
const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null || Boolean(sessionEdit.deleted);
|
|
5683
5844
|
if (!hasMeaningfulPayload) return true;
|
|
5684
5845
|
const profile = getExportContentProfile(
|
|
5685
5846
|
[sessionEdit],
|
|
@@ -5693,17 +5854,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5693
5854
|
textChange: sessionEdit.textEdit ?? null,
|
|
5694
5855
|
moveIntent,
|
|
5695
5856
|
...movePlan ? { movePlan } : {},
|
|
5857
|
+
...sessionEdit.deleted ? { deleted: true } : {},
|
|
5696
5858
|
exportMarkdown: withInstruction(profile, exportMarkdown)
|
|
5697
5859
|
});
|
|
5698
5860
|
if (result.ok) {
|
|
5699
5861
|
removeSessionEdit(sessionEdit.element);
|
|
5862
|
+
updateAgentAvailability(true);
|
|
5863
|
+
} else {
|
|
5864
|
+
const kind = result.errorKind === "network" ? "unreachable" : "rejected";
|
|
5865
|
+
updateAgentAvailability(result.errorKind === "network" ? false : true);
|
|
5866
|
+
if (options?._isBatchCall) {
|
|
5867
|
+
options._batchFailKinds?.push(result.errorKind ?? "rejected");
|
|
5868
|
+
} else if (isMountedRef.current) {
|
|
5869
|
+
setLastSendFailure({
|
|
5870
|
+
reason: kind,
|
|
5871
|
+
failedEditElements: [sessionEdit.element],
|
|
5872
|
+
failedCommentIds: [],
|
|
5873
|
+
at: Date.now()
|
|
5874
|
+
});
|
|
5875
|
+
}
|
|
5700
5876
|
}
|
|
5701
|
-
return
|
|
5702
|
-
} catch {
|
|
5703
|
-
|
|
5877
|
+
return result.ok;
|
|
5878
|
+
} catch (err) {
|
|
5879
|
+
updateAgentAvailability(false);
|
|
5880
|
+
if (options?._isBatchCall) {
|
|
5881
|
+
throw err;
|
|
5882
|
+
}
|
|
5883
|
+
if (isMountedRef.current) {
|
|
5884
|
+
setLastSendFailure({
|
|
5885
|
+
reason: "unreachable",
|
|
5886
|
+
failedEditElements: [sessionEdit.element],
|
|
5887
|
+
failedCommentIds: [],
|
|
5888
|
+
at: Date.now()
|
|
5889
|
+
});
|
|
5890
|
+
}
|
|
5891
|
+
return false;
|
|
5704
5892
|
}
|
|
5705
5893
|
}, [updateAgentAvailability, removeSessionEdit]);
|
|
5706
|
-
const sendSessionCommentToAgent = React5.useCallback(async (comment) => {
|
|
5894
|
+
const sendSessionCommentToAgent = React5.useCallback(async (comment, _options) => {
|
|
5707
5895
|
const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies);
|
|
5708
5896
|
const commentProfile = { hasCssEdits: false, hasTextEdits: false, hasMoves: false, hasComments: true };
|
|
5709
5897
|
try {
|
|
@@ -5715,13 +5903,40 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5715
5903
|
});
|
|
5716
5904
|
if (result.ok) {
|
|
5717
5905
|
deleteComment(comment.id);
|
|
5906
|
+
updateAgentAvailability(true);
|
|
5907
|
+
} else {
|
|
5908
|
+
const kind = result.errorKind === "network" ? "unreachable" : "rejected";
|
|
5909
|
+
updateAgentAvailability(result.errorKind === "network" ? false : true);
|
|
5910
|
+
if (_options?._isBatchCall) {
|
|
5911
|
+
_options._batchFailKinds?.push(result.errorKind ?? "rejected");
|
|
5912
|
+
} else if (isMountedRef.current) {
|
|
5913
|
+
setLastSendFailure({
|
|
5914
|
+
reason: kind,
|
|
5915
|
+
failedEditElements: [],
|
|
5916
|
+
failedCommentIds: [comment.id],
|
|
5917
|
+
at: Date.now()
|
|
5918
|
+
});
|
|
5919
|
+
}
|
|
5718
5920
|
}
|
|
5719
|
-
return
|
|
5720
|
-
} catch {
|
|
5721
|
-
|
|
5921
|
+
return result.ok;
|
|
5922
|
+
} catch (err) {
|
|
5923
|
+
updateAgentAvailability(false);
|
|
5924
|
+
if (_options?._isBatchCall) {
|
|
5925
|
+
throw err;
|
|
5926
|
+
}
|
|
5927
|
+
if (isMountedRef.current) {
|
|
5928
|
+
setLastSendFailure({
|
|
5929
|
+
reason: "unreachable",
|
|
5930
|
+
failedEditElements: [],
|
|
5931
|
+
failedCommentIds: [comment.id],
|
|
5932
|
+
at: Date.now()
|
|
5933
|
+
});
|
|
5934
|
+
}
|
|
5935
|
+
return false;
|
|
5722
5936
|
}
|
|
5723
5937
|
}, [updateAgentAvailability, deleteComment]);
|
|
5724
5938
|
const sendEditToAgent2 = React5.useCallback(async () => {
|
|
5939
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5725
5940
|
const current = stateRef.current;
|
|
5726
5941
|
if (current.selectedElements.length > 1) {
|
|
5727
5942
|
saveCurrentToSession();
|
|
@@ -5756,9 +5971,28 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5756
5971
|
removeSessionEdit(el);
|
|
5757
5972
|
}
|
|
5758
5973
|
}
|
|
5974
|
+
updateAgentAvailability(true);
|
|
5975
|
+
} else {
|
|
5976
|
+
updateAgentAvailability(result.errorKind === "network" ? false : true);
|
|
5977
|
+
if (isMountedRef.current) {
|
|
5978
|
+
setLastSendFailure({
|
|
5979
|
+
reason: result.errorKind === "network" ? "unreachable" : "rejected",
|
|
5980
|
+
failedEditElements: editsWithChanges.map((e) => e.element),
|
|
5981
|
+
failedCommentIds: [],
|
|
5982
|
+
at: Date.now()
|
|
5983
|
+
});
|
|
5984
|
+
}
|
|
5759
5985
|
}
|
|
5760
|
-
return
|
|
5986
|
+
return result.ok;
|
|
5761
5987
|
} catch {
|
|
5988
|
+
if (isMountedRef.current) {
|
|
5989
|
+
setLastSendFailure({
|
|
5990
|
+
reason: "unreachable",
|
|
5991
|
+
failedEditElements: editsWithChanges.map((e) => e.element),
|
|
5992
|
+
failedCommentIds: [],
|
|
5993
|
+
at: Date.now()
|
|
5994
|
+
});
|
|
5995
|
+
}
|
|
5762
5996
|
return updateAgentAvailability(false);
|
|
5763
5997
|
}
|
|
5764
5998
|
}
|
|
@@ -5781,11 +6015,13 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5781
6015
|
return sendSessionEditToAgent(editToSend);
|
|
5782
6016
|
}, [canSendEditToAgent, sendSessionEditToAgent, saveCurrentToSession]);
|
|
5783
6017
|
const sendCommentToAgent2 = React5.useCallback(async (id) => {
|
|
6018
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5784
6019
|
const comment = stateRef.current.comments.find((c) => c.id === id);
|
|
5785
6020
|
if (!comment) return false;
|
|
5786
6021
|
return sendSessionCommentToAgent(comment);
|
|
5787
6022
|
}, [sendSessionCommentToAgent]);
|
|
5788
6023
|
const sendAllSessionItemsToAgent = React5.useCallback(async () => {
|
|
6024
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5789
6025
|
const items = getSessionItems();
|
|
5790
6026
|
const current = stateRef.current;
|
|
5791
6027
|
const contextOnlyBlocks = getContextOnlyBlocks(current.selectedElements, items);
|
|
@@ -5794,25 +6030,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5794
6030
|
const movePlanContext = buildMovePlanContext(allEdits);
|
|
5795
6031
|
let moveEnvelopeSent = false;
|
|
5796
6032
|
let allSucceeded = true;
|
|
6033
|
+
const failedEditElements = [];
|
|
6034
|
+
const failedCommentIds = [];
|
|
6035
|
+
let anyThrown = false;
|
|
6036
|
+
const batchFailKinds = [];
|
|
5797
6037
|
for (const item of items) {
|
|
5798
6038
|
let succeeded;
|
|
5799
6039
|
if (item.type === "edit") {
|
|
5800
6040
|
const hasMoveIntent = Boolean(item.edit.move && getMoveIntentForEdit(item.edit, movePlanContext));
|
|
5801
6041
|
const includeBatchMoveEnvelope = hasMoveIntent && !moveEnvelopeSent;
|
|
5802
|
-
|
|
5803
|
-
|
|
5804
|
-
|
|
5805
|
-
|
|
5806
|
-
|
|
5807
|
-
|
|
6042
|
+
try {
|
|
6043
|
+
succeeded = await sendSessionEditToAgent(
|
|
6044
|
+
item.edit,
|
|
6045
|
+
allEdits,
|
|
6046
|
+
movePlanContext,
|
|
6047
|
+
{ includeBatchMoveEnvelope, _isBatchCall: true, _batchFailKinds: batchFailKinds }
|
|
6048
|
+
);
|
|
6049
|
+
if (!succeeded) failedEditElements.push(item.edit.element);
|
|
6050
|
+
} catch {
|
|
6051
|
+
succeeded = false;
|
|
6052
|
+
anyThrown = true;
|
|
6053
|
+
failedEditElements.push(item.edit.element);
|
|
6054
|
+
}
|
|
5808
6055
|
if (includeBatchMoveEnvelope) moveEnvelopeSent = true;
|
|
5809
6056
|
} else {
|
|
5810
|
-
|
|
6057
|
+
try {
|
|
6058
|
+
succeeded = await sendSessionCommentToAgent(item.comment, { _isBatchCall: true, _batchFailKinds: batchFailKinds });
|
|
6059
|
+
if (!succeeded) failedCommentIds.push(item.comment.id);
|
|
6060
|
+
} catch {
|
|
6061
|
+
succeeded = false;
|
|
6062
|
+
anyThrown = true;
|
|
6063
|
+
failedCommentIds.push(item.comment.id);
|
|
6064
|
+
}
|
|
5811
6065
|
}
|
|
5812
6066
|
if (!succeeded) {
|
|
5813
6067
|
allSucceeded = false;
|
|
5814
6068
|
}
|
|
5815
6069
|
}
|
|
6070
|
+
let contextBlockFailed = false;
|
|
5816
6071
|
if (contextOnlyBlocks.length > 0) {
|
|
5817
6072
|
const primaryEl = current.selectedElements.find(
|
|
5818
6073
|
(el) => el.isConnected && !allEdits.some((e) => e.element === el)
|
|
@@ -5826,16 +6081,39 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5826
6081
|
moveIntent: null,
|
|
5827
6082
|
exportMarkdown: contextOnlyBlocks.join("\n\n")
|
|
5828
6083
|
});
|
|
5829
|
-
if (
|
|
6084
|
+
if (result.ok) {
|
|
6085
|
+
updateAgentAvailability(true);
|
|
6086
|
+
} else {
|
|
6087
|
+
updateAgentAvailability(result.errorKind === "network" ? false : true);
|
|
6088
|
+
allSucceeded = false;
|
|
6089
|
+
contextBlockFailed = true;
|
|
6090
|
+
}
|
|
5830
6091
|
} catch {
|
|
6092
|
+
updateAgentAvailability(false);
|
|
5831
6093
|
allSucceeded = false;
|
|
6094
|
+
anyThrown = true;
|
|
6095
|
+
contextBlockFailed = true;
|
|
5832
6096
|
}
|
|
5833
6097
|
}
|
|
5834
6098
|
}
|
|
6099
|
+
if (!allSucceeded && isMountedRef.current) {
|
|
6100
|
+
const reason = anyThrown || batchFailKinds.includes("network") ? "unreachable" : "rejected";
|
|
6101
|
+
setLastSendFailure({
|
|
6102
|
+
reason,
|
|
6103
|
+
failedEditElements,
|
|
6104
|
+
failedCommentIds,
|
|
6105
|
+
at: Date.now()
|
|
6106
|
+
});
|
|
6107
|
+
}
|
|
5835
6108
|
return allSucceeded;
|
|
5836
|
-
}, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent]);
|
|
6109
|
+
}, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent, updateAgentAvailability]);
|
|
6110
|
+
const clearSendFailure = React5.useCallback(() => {
|
|
6111
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
6112
|
+
}, []);
|
|
5837
6113
|
return {
|
|
5838
6114
|
agentAvailable,
|
|
6115
|
+
lastSendFailure,
|
|
6116
|
+
clearSendFailure,
|
|
5839
6117
|
canSendEditToAgent,
|
|
5840
6118
|
sendEditToAgent: sendEditToAgent2,
|
|
5841
6119
|
sendCommentToAgent: sendCommentToAgent2,
|
|
@@ -5882,7 +6160,9 @@ function useKeyboardShortcuts({
|
|
|
5882
6160
|
const s = stateRef.current;
|
|
5883
6161
|
const undoShortcutPressed = usesMetaForUndo ? e.metaKey && !e.ctrlKey && !e.altKey : e.ctrlKey && !e.metaKey && !e.altKey;
|
|
5884
6162
|
if (undoShortcutPressed && e.key === "z" && !e.shiftKey) {
|
|
6163
|
+
if (!s.editModeActive) return;
|
|
5885
6164
|
if (s.textEditingElement) return;
|
|
6165
|
+
if (isInputFocused()) return;
|
|
5886
6166
|
e.preventDefault();
|
|
5887
6167
|
undo();
|
|
5888
6168
|
return;
|
|
@@ -5937,6 +6217,11 @@ function useKeyboardShortcuts({
|
|
|
5937
6217
|
insertElement("frame");
|
|
5938
6218
|
return;
|
|
5939
6219
|
}
|
|
6220
|
+
if (lowerKey === "t") {
|
|
6221
|
+
e.preventDefault();
|
|
6222
|
+
insertElement("text");
|
|
6223
|
+
return;
|
|
6224
|
+
}
|
|
5940
6225
|
if (lowerKey === "d") {
|
|
5941
6226
|
e.preventDefault();
|
|
5942
6227
|
insertElement("div");
|
|
@@ -6599,6 +6884,10 @@ function DirectEditProvider({ children }) {
|
|
|
6599
6884
|
const undoStackRef = React8.useRef([]);
|
|
6600
6885
|
const sessionEditsRef = React8.useRef(/* @__PURE__ */ new Map());
|
|
6601
6886
|
const removedSessionEditsRef = React8.useRef(/* @__PURE__ */ new WeakSet());
|
|
6887
|
+
const commentDraftTextRef = React8.useRef("");
|
|
6888
|
+
const commentDraftBlockedHandlerRef = React8.useRef(null);
|
|
6889
|
+
const onElementInsertedRef = React8.useRef(null);
|
|
6890
|
+
const textInsertRafRef = React8.useRef(null);
|
|
6602
6891
|
const [sessionEditCount, setSessionEditCount] = React8.useState(0);
|
|
6603
6892
|
const stateRef = React8.useRef(state);
|
|
6604
6893
|
React8.useEffect(() => {
|
|
@@ -6633,12 +6922,13 @@ function DirectEditProvider({ children }) {
|
|
|
6633
6922
|
clearSessionEdits,
|
|
6634
6923
|
groupSelection,
|
|
6635
6924
|
deleteSelection,
|
|
6636
|
-
insertElement
|
|
6925
|
+
insertElement: insertElementBase
|
|
6637
6926
|
} = useSessionManager({
|
|
6638
6927
|
stateRef,
|
|
6639
6928
|
sessionEditsRef,
|
|
6640
6929
|
removedSessionEditsRef,
|
|
6641
6930
|
undoStackRef,
|
|
6931
|
+
onElementInsertedRef,
|
|
6642
6932
|
pushUndo,
|
|
6643
6933
|
setState,
|
|
6644
6934
|
setSessionEditCount
|
|
@@ -6688,6 +6978,41 @@ function DirectEditProvider({ children }) {
|
|
|
6688
6978
|
syncSessionItemCount,
|
|
6689
6979
|
setState
|
|
6690
6980
|
});
|
|
6981
|
+
React8.useEffect(() => {
|
|
6982
|
+
onElementInsertedRef.current = (kind, element) => {
|
|
6983
|
+
if (kind === "text") {
|
|
6984
|
+
if (textInsertRafRef.current) {
|
|
6985
|
+
cancelAnimationFrame(textInsertRafRef.current);
|
|
6986
|
+
}
|
|
6987
|
+
textInsertRafRef.current = requestAnimationFrame(() => {
|
|
6988
|
+
textInsertRafRef.current = null;
|
|
6989
|
+
if (element.isConnected) {
|
|
6990
|
+
startTextEditing(element);
|
|
6991
|
+
}
|
|
6992
|
+
});
|
|
6993
|
+
}
|
|
6994
|
+
};
|
|
6995
|
+
return () => {
|
|
6996
|
+
if (textInsertRafRef.current) {
|
|
6997
|
+
cancelAnimationFrame(textInsertRafRef.current);
|
|
6998
|
+
textInsertRafRef.current = null;
|
|
6999
|
+
}
|
|
7000
|
+
onElementInsertedRef.current = null;
|
|
7001
|
+
};
|
|
7002
|
+
}, [startTextEditing]);
|
|
7003
|
+
const setCommentDraftText = React8.useCallback((text) => {
|
|
7004
|
+
commentDraftTextRef.current = text;
|
|
7005
|
+
}, []);
|
|
7006
|
+
const setCommentDraftBlockedHandler = React8.useCallback((handler) => {
|
|
7007
|
+
commentDraftBlockedHandlerRef.current = handler;
|
|
7008
|
+
}, []);
|
|
7009
|
+
const hasPendingCommentDraft = React8.useCallback(() => {
|
|
7010
|
+
const activeCommentId = stateRef.current.activeCommentId;
|
|
7011
|
+
if (!activeCommentId) return false;
|
|
7012
|
+
const active = stateRef.current.comments.find((comment) => comment.id === activeCommentId);
|
|
7013
|
+
if (!active) return false;
|
|
7014
|
+
return active.text.trim().length === 0 && commentDraftTextRef.current.trim().length > 0;
|
|
7015
|
+
}, []);
|
|
6691
7016
|
const { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 } = useCanvas({
|
|
6692
7017
|
stateRef,
|
|
6693
7018
|
setState
|
|
@@ -6824,6 +7149,8 @@ function DirectEditProvider({ children }) {
|
|
|
6824
7149
|
}, [state.editModeActive]);
|
|
6825
7150
|
const {
|
|
6826
7151
|
agentAvailable,
|
|
7152
|
+
lastSendFailure,
|
|
7153
|
+
clearSendFailure,
|
|
6827
7154
|
canSendEditToAgent,
|
|
6828
7155
|
sendEditToAgent: sendEditToAgent2,
|
|
6829
7156
|
sendCommentToAgent: sendCommentToAgent2,
|
|
@@ -6850,6 +7177,16 @@ function DirectEditProvider({ children }) {
|
|
|
6850
7177
|
} catch {
|
|
6851
7178
|
}
|
|
6852
7179
|
}, []);
|
|
7180
|
+
const insertElement = React8.useCallback((kind) => {
|
|
7181
|
+
if (hasPendingCommentDraft()) {
|
|
7182
|
+
commentDraftBlockedHandlerRef.current?.();
|
|
7183
|
+
return;
|
|
7184
|
+
}
|
|
7185
|
+
if (stateRef.current.textEditingElement) {
|
|
7186
|
+
commitTextEditing();
|
|
7187
|
+
}
|
|
7188
|
+
insertElementBase(kind);
|
|
7189
|
+
}, [commitTextEditing, hasPendingCommentDraft, insertElementBase, stateRef]);
|
|
6853
7190
|
useKeyboardShortcuts({
|
|
6854
7191
|
stateRef,
|
|
6855
7192
|
toggleEditMode,
|
|
@@ -6879,9 +7216,10 @@ function DirectEditProvider({ children }) {
|
|
|
6879
7216
|
const stateContextValue = React8.useMemo(() => ({
|
|
6880
7217
|
...state,
|
|
6881
7218
|
agentAvailable,
|
|
7219
|
+
lastSendFailure,
|
|
6882
7220
|
sessionEditCount,
|
|
6883
7221
|
multiSelectContextCount
|
|
6884
|
-
}), [agentAvailable, state, sessionEditCount, multiSelectContextCount]);
|
|
7222
|
+
}), [agentAvailable, lastSendFailure, state, sessionEditCount, multiSelectContextCount]);
|
|
6885
7223
|
const actionsContextValue = React8.useMemo(() => ({
|
|
6886
7224
|
selectElement,
|
|
6887
7225
|
selectElements,
|
|
@@ -6904,6 +7242,7 @@ function DirectEditProvider({ children }) {
|
|
|
6904
7242
|
updateTypographyProperty,
|
|
6905
7243
|
resetToOriginal,
|
|
6906
7244
|
exportEdits,
|
|
7245
|
+
clearSendFailure,
|
|
6907
7246
|
canSendEditToAgent,
|
|
6908
7247
|
sendEditToAgent: sendEditToAgent2,
|
|
6909
7248
|
sendAllSessionItemsToAgent,
|
|
@@ -6928,6 +7267,8 @@ function DirectEditProvider({ children }) {
|
|
|
6928
7267
|
removeSessionEdit,
|
|
6929
7268
|
startTextEditing,
|
|
6930
7269
|
commitTextEditing,
|
|
7270
|
+
setCommentDraftText,
|
|
7271
|
+
setCommentDraftBlockedHandler,
|
|
6931
7272
|
groupSelection,
|
|
6932
7273
|
deleteSelection,
|
|
6933
7274
|
insertElement,
|
|
@@ -6957,6 +7298,7 @@ function DirectEditProvider({ children }) {
|
|
|
6957
7298
|
updateTypographyProperty,
|
|
6958
7299
|
resetToOriginal,
|
|
6959
7300
|
exportEdits,
|
|
7301
|
+
clearSendFailure,
|
|
6960
7302
|
canSendEditToAgent,
|
|
6961
7303
|
sendEditToAgent2,
|
|
6962
7304
|
sendAllSessionItemsToAgent,
|
|
@@ -6981,6 +7323,8 @@ function DirectEditProvider({ children }) {
|
|
|
6981
7323
|
removeSessionEdit,
|
|
6982
7324
|
startTextEditing,
|
|
6983
7325
|
commitTextEditing,
|
|
7326
|
+
setCommentDraftText,
|
|
7327
|
+
setCommentDraftBlockedHandler,
|
|
6984
7328
|
groupSelection,
|
|
6985
7329
|
deleteSelection,
|
|
6986
7330
|
insertElement,
|
|
@@ -7413,6 +7757,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7413
7757
|
{ x: 0, y: 0, scaleX: 1, scaleY: 1 }
|
|
7414
7758
|
);
|
|
7415
7759
|
const originalTransformRef = React12.useRef("");
|
|
7760
|
+
const composeBaseRef = React12.useRef("");
|
|
7416
7761
|
const reorderPreviewRef = React12.useRef(/* @__PURE__ */ new Map());
|
|
7417
7762
|
React12.useEffect(() => {
|
|
7418
7763
|
dragStateRef.current = dragState;
|
|
@@ -7507,6 +7852,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7507
7852
|
}
|
|
7508
7853
|
clearReorderPreview();
|
|
7509
7854
|
originalTransformRef.current = "";
|
|
7855
|
+
composeBaseRef.current = "";
|
|
7510
7856
|
initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
|
|
7511
7857
|
dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
|
|
7512
7858
|
dragGuardRef.current.deactivate();
|
|
@@ -7528,6 +7874,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7528
7874
|
draggedElement.style.opacity = "";
|
|
7529
7875
|
clearReorderPreview();
|
|
7530
7876
|
originalTransformRef.current = "";
|
|
7877
|
+
composeBaseRef.current = "";
|
|
7531
7878
|
initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
|
|
7532
7879
|
const dragMode = dragOptionsRef.current.mode;
|
|
7533
7880
|
dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
|
|
@@ -7588,7 +7935,14 @@ function useMove({ onMoveComplete }) {
|
|
|
7588
7935
|
scaleX: element.offsetWidth > 0 ? rect.width / element.offsetWidth : 1,
|
|
7589
7936
|
scaleY: element.offsetHeight > 0 ? rect.height / element.offsetHeight : 1
|
|
7590
7937
|
};
|
|
7591
|
-
|
|
7938
|
+
const inlineTransform = element.style.transform;
|
|
7939
|
+
originalTransformRef.current = inlineTransform;
|
|
7940
|
+
if (inlineTransform) {
|
|
7941
|
+
composeBaseRef.current = inlineTransform;
|
|
7942
|
+
} else {
|
|
7943
|
+
const computed = getComputedStyle(element).transform;
|
|
7944
|
+
composeBaseRef.current = computed && computed !== "none" ? computed : "";
|
|
7945
|
+
}
|
|
7592
7946
|
dragGuardRef.current.activate();
|
|
7593
7947
|
setDragState({
|
|
7594
7948
|
isDragging: true,
|
|
@@ -7621,7 +7975,8 @@ function useMove({ onMoveComplete }) {
|
|
|
7621
7975
|
const { x, y, scaleX, scaleY } = initialRectRef.current;
|
|
7622
7976
|
const dx = (e.clientX - dragOffset.x - x) / scaleX;
|
|
7623
7977
|
const dy = (e.clientY - dragOffset.y - y) / scaleY;
|
|
7624
|
-
|
|
7978
|
+
const base = composeBaseRef.current;
|
|
7979
|
+
draggedElement.style.transform = base ? `translate(${dx}px, ${dy}px) ${base}` : `translate(${dx}px, ${dy}px)`;
|
|
7625
7980
|
}
|
|
7626
7981
|
if (dragOptionsRef.current.mode === "position") {
|
|
7627
7982
|
let container2 = findLayoutContainerAtPoint(
|
|
@@ -8488,6 +8843,7 @@ function SelectedCommentComposer({
|
|
|
8488
8843
|
comment,
|
|
8489
8844
|
attentionNonce,
|
|
8490
8845
|
draftRef,
|
|
8846
|
+
onDraftTextChange,
|
|
8491
8847
|
onSubmit,
|
|
8492
8848
|
onCancel
|
|
8493
8849
|
}) {
|
|
@@ -8533,7 +8889,8 @@ function SelectedCommentComposer({
|
|
|
8533
8889
|
}, [attentionNonce]);
|
|
8534
8890
|
React17.useEffect(() => {
|
|
8535
8891
|
if (draftRef) draftRef.current = text;
|
|
8536
|
-
|
|
8892
|
+
onDraftTextChange?.(text);
|
|
8893
|
+
}, [draftRef, onDraftTextChange, text]);
|
|
8537
8894
|
const submit = React17.useCallback(() => {
|
|
8538
8895
|
const nextText = text.trim();
|
|
8539
8896
|
if (!nextText) return;
|
|
@@ -11917,6 +12274,7 @@ function PanelFooter({
|
|
|
11917
12274
|
onExportEdits,
|
|
11918
12275
|
onSendToAgent,
|
|
11919
12276
|
showSendButton = true,
|
|
12277
|
+
sendFailureReason,
|
|
11920
12278
|
onPointerDown,
|
|
11921
12279
|
onPointerMove,
|
|
11922
12280
|
onPointerUp,
|
|
@@ -11925,6 +12283,13 @@ function PanelFooter({
|
|
|
11925
12283
|
const [copied, setCopied] = React30.useState(false);
|
|
11926
12284
|
const [copyError, setCopyError] = React30.useState(false);
|
|
11927
12285
|
const [sendStatus, setSendStatus] = React30.useState("idle");
|
|
12286
|
+
const prevCanTriggerSendRef = React30.useRef(canTriggerSend);
|
|
12287
|
+
React30.useEffect(() => {
|
|
12288
|
+
if (prevCanTriggerSendRef.current !== canTriggerSend) {
|
|
12289
|
+
prevCanTriggerSendRef.current = canTriggerSend;
|
|
12290
|
+
setSendStatus("idle");
|
|
12291
|
+
}
|
|
12292
|
+
}, [canTriggerSend]);
|
|
11928
12293
|
const handleCopy = async () => {
|
|
11929
12294
|
if (!onExportEdits) return;
|
|
11930
12295
|
const success = await onExportEdits();
|
|
@@ -11938,6 +12303,7 @@ function PanelFooter({
|
|
|
11938
12303
|
setCopyError(true);
|
|
11939
12304
|
setTimeout(() => setCopyError(false), 2e3);
|
|
11940
12305
|
};
|
|
12306
|
+
const sendTooltipLabel = sendStatus === "offline" ? sendFailureReason === "unreachable" ? "Agent unreachable \u2014 click to retry" : "Agent rejected the edit \u2014 click to retry" : "Apply changes via agent";
|
|
11941
12307
|
const handleSendToAgent = async () => {
|
|
11942
12308
|
if (!onSendToAgent || sendStatus === "sending") return;
|
|
11943
12309
|
setSendStatus("sending");
|
|
@@ -11947,7 +12313,6 @@ function PanelFooter({
|
|
|
11947
12313
|
setTimeout(() => setSendStatus("idle"), 2e3);
|
|
11948
12314
|
} else {
|
|
11949
12315
|
setSendStatus("offline");
|
|
11950
|
-
setTimeout(() => setSendStatus("idle"), 2e3);
|
|
11951
12316
|
}
|
|
11952
12317
|
};
|
|
11953
12318
|
return /* @__PURE__ */ jsxs18(
|
|
@@ -11975,7 +12340,7 @@ function PanelFooter({
|
|
|
11975
12340
|
children: copyError ? /* @__PURE__ */ jsx24(X3, { className: "text-red-500" }) : copied ? /* @__PURE__ */ jsx24(Check3, { className: "text-green-500" }) : /* @__PURE__ */ jsx24(Copy2, {})
|
|
11976
12341
|
}
|
|
11977
12342
|
) }),
|
|
11978
|
-
showSendButton && onSendToAgent && /* @__PURE__ */ jsx24("span", { className: !canTriggerSend || sendStatus === "sending" ? "cursor-not-allowed" : void 0, children: /* @__PURE__ */ jsx24(Tip, { label:
|
|
12343
|
+
showSendButton && onSendToAgent && /* @__PURE__ */ jsx24("span", { className: !canTriggerSend || sendStatus === "sending" ? "cursor-not-allowed" : void 0, children: /* @__PURE__ */ jsx24(Tip, { label: sendTooltipLabel, children: /* @__PURE__ */ jsx24(
|
|
11979
12344
|
Button,
|
|
11980
12345
|
{
|
|
11981
12346
|
variant: "outline",
|
|
@@ -12692,6 +13057,7 @@ function DirectEditPanelInner({
|
|
|
12692
13057
|
onSendToAgent,
|
|
12693
13058
|
canSendToAgent = false,
|
|
12694
13059
|
showSendButton = true,
|
|
13060
|
+
sendFailureReason,
|
|
12695
13061
|
className,
|
|
12696
13062
|
style,
|
|
12697
13063
|
panelRef,
|
|
@@ -12845,6 +13211,7 @@ function DirectEditPanelInner({
|
|
|
12845
13211
|
onExportEdits,
|
|
12846
13212
|
onSendToAgent,
|
|
12847
13213
|
showSendButton,
|
|
13214
|
+
sendFailureReason,
|
|
12848
13215
|
onPointerDown: onHeaderPointerDown,
|
|
12849
13216
|
onPointerMove: onHeaderPointerMove,
|
|
12850
13217
|
onPointerUp: onHeaderPointerUp,
|
|
@@ -12879,7 +13246,8 @@ function DirectEditPanelContent() {
|
|
|
12879
13246
|
comments,
|
|
12880
13247
|
activeCommentId,
|
|
12881
13248
|
textEditingElement,
|
|
12882
|
-
agentAvailable
|
|
13249
|
+
agentAvailable,
|
|
13250
|
+
lastSendFailure
|
|
12883
13251
|
} = useDirectEditState();
|
|
12884
13252
|
const {
|
|
12885
13253
|
selectParent,
|
|
@@ -12911,7 +13279,9 @@ function DirectEditPanelContent() {
|
|
|
12911
13279
|
setActiveCommentId,
|
|
12912
13280
|
startTextEditing,
|
|
12913
13281
|
toggleEditMode,
|
|
12914
|
-
deleteSelection
|
|
13282
|
+
deleteSelection,
|
|
13283
|
+
setCommentDraftText,
|
|
13284
|
+
setCommentDraftBlockedHandler
|
|
12915
13285
|
} = useDirectEditActions();
|
|
12916
13286
|
const {
|
|
12917
13287
|
position,
|
|
@@ -12933,7 +13303,8 @@ function DirectEditPanelContent() {
|
|
|
12933
13303
|
});
|
|
12934
13304
|
React34.useEffect(() => {
|
|
12935
13305
|
commentDraftRef.current = "";
|
|
12936
|
-
|
|
13306
|
+
setCommentDraftText("");
|
|
13307
|
+
}, [activeCommentId, setCommentDraftText]);
|
|
12937
13308
|
const activeDraftComment = React34.useMemo(() => {
|
|
12938
13309
|
if (!commentTargetElement || !activeCommentId) return null;
|
|
12939
13310
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
@@ -12953,6 +13324,18 @@ function DirectEditPanelContent() {
|
|
|
12953
13324
|
const triggerCommentInputAttention = React34.useCallback((commentId) => {
|
|
12954
13325
|
setCommentInputAttention((prev) => prev?.commentId === commentId ? { commentId, nonce: prev.nonce + 1 } : { commentId, nonce: 1 });
|
|
12955
13326
|
}, []);
|
|
13327
|
+
React34.useEffect(() => {
|
|
13328
|
+
if (!activeCommentId) {
|
|
13329
|
+
setCommentDraftBlockedHandler(null);
|
|
13330
|
+
return;
|
|
13331
|
+
}
|
|
13332
|
+
setCommentDraftBlockedHandler(() => {
|
|
13333
|
+
triggerCommentInputAttention(activeCommentId);
|
|
13334
|
+
});
|
|
13335
|
+
return () => {
|
|
13336
|
+
setCommentDraftBlockedHandler(null);
|
|
13337
|
+
};
|
|
13338
|
+
}, [activeCommentId, setCommentDraftBlockedHandler, triggerCommentInputAttention]);
|
|
12956
13339
|
const hasPendingCommentDraft = React34.useCallback((nextCommentId = null) => {
|
|
12957
13340
|
if (!activeCommentId) return false;
|
|
12958
13341
|
if (nextCommentId && nextCommentId === activeCommentId) return false;
|
|
@@ -13062,6 +13445,7 @@ function DirectEditPanelContent() {
|
|
|
13062
13445
|
comment: activeDraftComment,
|
|
13063
13446
|
attentionNonce: commentInputAttention?.commentId === activeDraftComment.id ? commentInputAttention.nonce : 0,
|
|
13064
13447
|
draftRef: commentDraftRef,
|
|
13448
|
+
onDraftTextChange: setCommentDraftText,
|
|
13065
13449
|
onSubmit: (text) => submitCommentDraft(activeDraftComment.id, text),
|
|
13066
13450
|
onCancel: () => handleSetActiveComment(null)
|
|
13067
13451
|
}
|
|
@@ -14148,7 +14532,7 @@ function useToolbarDock(toolbarRef) {
|
|
|
14148
14532
|
}
|
|
14149
14533
|
|
|
14150
14534
|
// src/toolbar.tsx
|
|
14151
|
-
import { MousePointer2, Command as Command2, Send as Send3, Check as Check8, X as X5 } from "lucide-react";
|
|
14535
|
+
import { MousePointer2, Command as Command2, Send as Send3, Check as Check8, X as X5, Square as Square2, Type as Type2 } from "lucide-react";
|
|
14152
14536
|
|
|
14153
14537
|
// src/toolbar/edits-popover.tsx
|
|
14154
14538
|
import * as React38 from "react";
|
|
@@ -14211,7 +14595,8 @@ function EditsPopover({
|
|
|
14211
14595
|
onExportAllEdits,
|
|
14212
14596
|
onClearSessionEdits,
|
|
14213
14597
|
onRemoveSessionEdit,
|
|
14214
|
-
onDeleteComment
|
|
14598
|
+
onDeleteComment,
|
|
14599
|
+
sendFailure
|
|
14215
14600
|
}) {
|
|
14216
14601
|
const [copied, setCopied] = React38.useState(false);
|
|
14217
14602
|
const editsPopupRef = React38.useRef(null);
|
|
@@ -14224,6 +14609,7 @@ function EditsPopover({
|
|
|
14224
14609
|
const visibleItems = React38.useMemo(() => {
|
|
14225
14610
|
return editsSnapshot.filter((item) => {
|
|
14226
14611
|
if (item.type === "comment") return true;
|
|
14612
|
+
if (item.edit.deleted) return true;
|
|
14227
14613
|
if (!item.edit.move) return true;
|
|
14228
14614
|
const moveIntent = getMoveIntentForEdit(item.edit, movePlanContext);
|
|
14229
14615
|
const hasStyleOrText = Object.keys(item.edit.pendingStyles).length > 0 || item.edit.textEdit != null;
|
|
@@ -14328,12 +14714,15 @@ ${text}`);
|
|
|
14328
14714
|
visibleItems.length === 0 && multiSelectContextItems.length === 0 ? /* @__PURE__ */ jsx32("div", { className: "px-3 pb-3 pt-1 text-xs text-muted-foreground", children: "No edits or comments yet." }) : /* @__PURE__ */ jsxs25("div", { className: "max-h-[240px] overflow-y-auto px-1 py-1", children: [
|
|
14329
14715
|
visibleItems.map((item, i) => {
|
|
14330
14716
|
const isEdit = item.type === "edit";
|
|
14717
|
+
const isDeleted = isEdit && Boolean(item.edit.deleted);
|
|
14331
14718
|
const moveIntent = isEdit && item.edit.move ? getMoveIntentForEdit(item.edit, movePlanContext) : null;
|
|
14332
14719
|
const isMoved = Boolean(moveIntent);
|
|
14333
14720
|
const locator = isEdit ? item.edit.locator : item.comment.locator;
|
|
14334
14721
|
const componentName = locator.reactStack[0]?.name ?? locator.tagName;
|
|
14335
14722
|
let valueSummary = "";
|
|
14336
|
-
if (isEdit) {
|
|
14723
|
+
if (isEdit && isDeleted) {
|
|
14724
|
+
valueSummary = locator.textPreview || locator.domSelector || locator.tagName;
|
|
14725
|
+
} else if (isEdit) {
|
|
14337
14726
|
const entries = Object.entries(item.edit.pendingStyles);
|
|
14338
14727
|
const editValues = [];
|
|
14339
14728
|
for (const [prop, value] of entries) {
|
|
@@ -14354,6 +14743,7 @@ ${text}`);
|
|
|
14354
14743
|
}
|
|
14355
14744
|
valueSummary = commentValues.join(", ");
|
|
14356
14745
|
}
|
|
14746
|
+
const failed = isEdit ? sendFailure?.failedEditElements.includes(item.edit.element) : sendFailure?.failedCommentIds.includes(item.comment.id);
|
|
14357
14747
|
return /* @__PURE__ */ jsxs25(
|
|
14358
14748
|
"div",
|
|
14359
14749
|
{
|
|
@@ -14372,13 +14762,16 @@ ${text}`);
|
|
|
14372
14762
|
},
|
|
14373
14763
|
children: [
|
|
14374
14764
|
/* @__PURE__ */ jsxs25("div", { className: "min-w-0 flex flex-1 flex-col items-start gap-[4px]", children: [
|
|
14375
|
-
/* @__PURE__ */ jsxs25(
|
|
14376
|
-
"
|
|
14377
|
-
|
|
14378
|
-
|
|
14765
|
+
/* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-1", children: [
|
|
14766
|
+
/* @__PURE__ */ jsxs25(Badge, { variant: "secondary", className: "h-6 shrink-0 px-1.5 text-xs", children: [
|
|
14767
|
+
"@<",
|
|
14768
|
+
componentName,
|
|
14769
|
+
">"
|
|
14770
|
+
] }),
|
|
14771
|
+
failed && /* @__PURE__ */ jsx32(Badge, { variant: "default", className: "h-6 shrink-0 px-1.5 text-xs bg-red-500 text-white border-transparent", children: "Failed" })
|
|
14379
14772
|
] }),
|
|
14380
14773
|
/* @__PURE__ */ jsxs25("span", { className: "min-w-0 max-w-full truncate text-xs text-muted-foreground", children: [
|
|
14381
|
-
isEdit ? isMoved ? "moved: " : "edit: " : "comment: ",
|
|
14774
|
+
isEdit ? isDeleted ? "deleted: " : isMoved ? "moved: " : "edit: " : "comment: ",
|
|
14382
14775
|
truncateText(valueSummary, 128)
|
|
14383
14776
|
] })
|
|
14384
14777
|
] }),
|
|
@@ -14643,6 +15036,7 @@ function SettingsPopover({
|
|
|
14643
15036
|
{ label: "Undo", keys: isMac ? [/* @__PURE__ */ jsx33(Command, { className: "size-2.5" }, "cmd"), "Z"] : ["Ctrl", "Z"] },
|
|
14644
15037
|
{ label: "Group selection", keys: isMac ? [/* @__PURE__ */ jsx33(Command, { className: "size-2.5" }, "cmd"), "G"] : ["Ctrl", "G"] },
|
|
14645
15038
|
{ label: "Add frame", keys: ["F"] },
|
|
15039
|
+
{ label: "Add text", keys: ["T"] },
|
|
14646
15040
|
{ label: "Add div", keys: ["D"] },
|
|
14647
15041
|
{ label: "Add to selection", keys: [/* @__PURE__ */ jsx33(ArrowBigUp, { className: "size-3" }, "shift"), "Click"] },
|
|
14648
15042
|
{ label: "Marquee select", keys: ["Drag"] },
|
|
@@ -14685,6 +15079,8 @@ function DirectEditToolbarInner({
|
|
|
14685
15079
|
onExportAllEdits,
|
|
14686
15080
|
onSendAllToAgents,
|
|
14687
15081
|
agentAvailable = true,
|
|
15082
|
+
sendFailureReason,
|
|
15083
|
+
sendFailure,
|
|
14688
15084
|
onClearSessionEdits,
|
|
14689
15085
|
onRemoveSessionEdit,
|
|
14690
15086
|
onDeleteComment,
|
|
@@ -14694,7 +15090,8 @@ function DirectEditToolbarInner({
|
|
|
14694
15090
|
onToggleCanvas,
|
|
14695
15091
|
onSetCanvasZoom,
|
|
14696
15092
|
onZoomTo100,
|
|
14697
|
-
onFitToViewport
|
|
15093
|
+
onFitToViewport,
|
|
15094
|
+
onInsertElement
|
|
14698
15095
|
}) {
|
|
14699
15096
|
const container = usePortalContainer();
|
|
14700
15097
|
const toolbarRef = React40.useRef(null);
|
|
@@ -14703,7 +15100,8 @@ function DirectEditToolbarInner({
|
|
|
14703
15100
|
const [activePopover, setActivePopover] = React40.useState(null);
|
|
14704
15101
|
const [applyStatus, setApplyStatus] = React40.useState("idle");
|
|
14705
15102
|
const applyTimerRef = React40.useRef(null);
|
|
14706
|
-
const showApplyButton = agentAvailable && Boolean(onSendAllToAgents);
|
|
15103
|
+
const showApplyButton = (agentAvailable || applyStatus !== "idle") && Boolean(onSendAllToAgents);
|
|
15104
|
+
const showInsertButtons = Boolean(onInsertElement);
|
|
14707
15105
|
const totalItemCount = sessionEditCount + multiSelectCount;
|
|
14708
15106
|
const sizeCacheRef = React40.useRef({});
|
|
14709
15107
|
React40.useEffect(() => {
|
|
@@ -14757,6 +15155,16 @@ function DirectEditToolbarInner({
|
|
|
14757
15155
|
setApplyStatus("idle");
|
|
14758
15156
|
}, 2e3);
|
|
14759
15157
|
}, []);
|
|
15158
|
+
const prevTotalItemCountRef = React40.useRef(totalItemCount);
|
|
15159
|
+
React40.useEffect(() => {
|
|
15160
|
+
if (prevTotalItemCountRef.current !== totalItemCount) {
|
|
15161
|
+
prevTotalItemCountRef.current = totalItemCount;
|
|
15162
|
+
if (applyStatus === "offline") {
|
|
15163
|
+
setApplyStatus("idle");
|
|
15164
|
+
}
|
|
15165
|
+
}
|
|
15166
|
+
}, [totalItemCount, applyStatus]);
|
|
15167
|
+
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";
|
|
14760
15168
|
const handleApplyAll = React40.useCallback(async () => {
|
|
14761
15169
|
if (!onSendAllToAgents || totalItemCount === 0 || applyStatus === "sending") return;
|
|
14762
15170
|
setApplyStatus("sending");
|
|
@@ -14766,8 +15174,12 @@ function DirectEditToolbarInner({
|
|
|
14766
15174
|
} catch {
|
|
14767
15175
|
success = false;
|
|
14768
15176
|
}
|
|
14769
|
-
|
|
14770
|
-
|
|
15177
|
+
if (success) {
|
|
15178
|
+
setApplyStatus("sent");
|
|
15179
|
+
scheduleApplyReset();
|
|
15180
|
+
} else {
|
|
15181
|
+
setApplyStatus("offline");
|
|
15182
|
+
}
|
|
14771
15183
|
}, [applyStatus, onSendAllToAgents, scheduleApplyReset, totalItemCount]);
|
|
14772
15184
|
const dragHandlers = React40.useMemo(() => ({
|
|
14773
15185
|
onPointerDown: handlePointerDown,
|
|
@@ -14848,6 +15260,38 @@ function DirectEditToolbarInner({
|
|
|
14848
15260
|
},
|
|
14849
15261
|
...dragHandlers,
|
|
14850
15262
|
children: [
|
|
15263
|
+
showInsertButtons && /* @__PURE__ */ jsxs27(Fragment8, { children: [
|
|
15264
|
+
/* @__PURE__ */ jsxs27(Tooltip, { children: [
|
|
15265
|
+
/* @__PURE__ */ jsx34(
|
|
15266
|
+
TooltipTrigger,
|
|
15267
|
+
{
|
|
15268
|
+
className: cn(toolbarBtnClass, "text-muted-foreground hover:bg-muted hover:text-foreground"),
|
|
15269
|
+
onPointerDown: (e) => e.stopPropagation(),
|
|
15270
|
+
onClick: () => onInsertElement?.("frame"),
|
|
15271
|
+
children: /* @__PURE__ */ jsx34(Square2, { className: "size-4" })
|
|
15272
|
+
}
|
|
15273
|
+
),
|
|
15274
|
+
/* @__PURE__ */ jsxs27(TooltipContent, { side: tooltipSide, className: "inline-flex items-center gap-1.5", children: [
|
|
15275
|
+
/* @__PURE__ */ jsx34("span", { children: "Add frame" }),
|
|
15276
|
+
/* @__PURE__ */ jsx34("kbd", { className: kbdClass, children: "F" })
|
|
15277
|
+
] })
|
|
15278
|
+
] }),
|
|
15279
|
+
/* @__PURE__ */ jsxs27(Tooltip, { children: [
|
|
15280
|
+
/* @__PURE__ */ jsx34(
|
|
15281
|
+
TooltipTrigger,
|
|
15282
|
+
{
|
|
15283
|
+
className: cn(toolbarBtnClass, "text-muted-foreground hover:bg-muted hover:text-foreground"),
|
|
15284
|
+
onPointerDown: (e) => e.stopPropagation(),
|
|
15285
|
+
onClick: () => onInsertElement?.("text"),
|
|
15286
|
+
children: /* @__PURE__ */ jsx34(Type2, { className: "size-4" })
|
|
15287
|
+
}
|
|
15288
|
+
),
|
|
15289
|
+
/* @__PURE__ */ jsxs27(TooltipContent, { side: tooltipSide, className: "inline-flex items-center gap-1.5", children: [
|
|
15290
|
+
/* @__PURE__ */ jsx34("span", { children: "Add text" }),
|
|
15291
|
+
/* @__PURE__ */ jsx34("kbd", { className: kbdClass, children: "T" })
|
|
15292
|
+
] })
|
|
15293
|
+
] })
|
|
15294
|
+
] }),
|
|
14851
15295
|
/* @__PURE__ */ jsx34(
|
|
14852
15296
|
EditsPopover,
|
|
14853
15297
|
{
|
|
@@ -14860,7 +15304,8 @@ function DirectEditToolbarInner({
|
|
|
14860
15304
|
onExportAllEdits,
|
|
14861
15305
|
onClearSessionEdits,
|
|
14862
15306
|
onRemoveSessionEdit,
|
|
14863
|
-
onDeleteComment
|
|
15307
|
+
onDeleteComment,
|
|
15308
|
+
sendFailure
|
|
14864
15309
|
}
|
|
14865
15310
|
),
|
|
14866
15311
|
showApplyButton && /* @__PURE__ */ jsxs27(Tooltip, { children: [
|
|
@@ -14884,7 +15329,7 @@ function DirectEditToolbarInner({
|
|
|
14884
15329
|
]
|
|
14885
15330
|
}
|
|
14886
15331
|
),
|
|
14887
|
-
/* @__PURE__ */ jsx34(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ jsx34("span", { children:
|
|
15332
|
+
/* @__PURE__ */ jsx34(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ jsx34("span", { children: applyTooltipLabel }) })
|
|
14888
15333
|
] }),
|
|
14889
15334
|
/* @__PURE__ */ jsx34(
|
|
14890
15335
|
"div",
|
|
@@ -14946,7 +15391,7 @@ function DirectEditToolbarInner({
|
|
|
14946
15391
|
return toolbar;
|
|
14947
15392
|
}
|
|
14948
15393
|
function DirectEditToolbarContent() {
|
|
14949
|
-
const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable } = useDirectEditState();
|
|
15394
|
+
const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable, lastSendFailure } = useDirectEditState();
|
|
14950
15395
|
const {
|
|
14951
15396
|
toggleEditMode,
|
|
14952
15397
|
setTheme,
|
|
@@ -14956,6 +15401,7 @@ function DirectEditToolbarContent() {
|
|
|
14956
15401
|
clearSessionEdits,
|
|
14957
15402
|
removeSessionEdit,
|
|
14958
15403
|
deleteComment,
|
|
15404
|
+
insertElement,
|
|
14959
15405
|
toggleCanvas,
|
|
14960
15406
|
setCanvasZoom,
|
|
14961
15407
|
zoomCanvasTo100,
|
|
@@ -14978,6 +15424,8 @@ function DirectEditToolbarContent() {
|
|
|
14978
15424
|
onExportAllEdits: exportAllEdits,
|
|
14979
15425
|
onSendAllToAgents: sendAllSessionItemsToAgent,
|
|
14980
15426
|
agentAvailable,
|
|
15427
|
+
sendFailureReason: lastSendFailure?.reason ?? null,
|
|
15428
|
+
sendFailure: lastSendFailure,
|
|
14981
15429
|
onClearSessionEdits: clearSessionEdits,
|
|
14982
15430
|
onRemoveSessionEdit: removeSessionEdit,
|
|
14983
15431
|
onDeleteComment: deleteComment,
|
|
@@ -14986,7 +15434,8 @@ function DirectEditToolbarContent() {
|
|
|
14986
15434
|
onToggleCanvas: toggleCanvas,
|
|
14987
15435
|
onSetCanvasZoom: setCanvasZoom,
|
|
14988
15436
|
onZoomTo100: zoomCanvasTo100,
|
|
14989
|
-
onFitToViewport: fitCanvasToViewport
|
|
15437
|
+
onFitToViewport: fitCanvasToViewport,
|
|
15438
|
+
onInsertElement: insertElement
|
|
14990
15439
|
}
|
|
14991
15440
|
);
|
|
14992
15441
|
}
|