made-refine 0.2.19 → 0.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/babel.cjs +5 -1
- package/dist/index.d.mts +26 -5
- package/dist/index.d.ts +26 -5
- package/dist/index.js +733 -209
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +639 -115
- package/dist/index.mjs.map +1 -1
- package/dist/preload/preload.js +23 -2
- package/dist/preload.js +22 -2
- package/dist/preload.js.map +1 -1
- package/dist/preload.mjs +7 -2
- package/dist/preload.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/{utils-CpmjloNg.d.mts → utils-Byovnuwg.d.mts} +4 -1
- package/dist/{utils-CpmjloNg.d.ts → utils-Byovnuwg.d.ts} +4 -1
- package/dist/utils.d.mts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +36 -6
- package/dist/utils.js.map +1 -1
- package/dist/utils.mjs +36 -6
- package/dist/utils.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.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,40 +4275,75 @@ function useSessionManager({
|
|
|
4244
4275
|
selectElement(firstChild);
|
|
4245
4276
|
}
|
|
4246
4277
|
}, [getSelectableChild, selectElement]);
|
|
4247
|
-
const
|
|
4248
|
-
if (!stateRef.current.editModeActive) return;
|
|
4249
|
-
saveCurrentToSession();
|
|
4250
|
-
const restoreSelection = buildSelectionSnapshot();
|
|
4278
|
+
const centerElementOnBody = React3.useCallback((element, size) => {
|
|
4251
4279
|
const bodyRect = document.body.getBoundingClientRect();
|
|
4252
4280
|
const scaleX = document.body.offsetWidth > 0 ? bodyRect.width / document.body.offsetWidth : 1;
|
|
4253
4281
|
const scaleY = document.body.offsetHeight > 0 ? bodyRect.height / document.body.offsetHeight : 1;
|
|
4254
|
-
const
|
|
4255
|
-
const
|
|
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;
|
|
4256
4287
|
const left = Math.round((window.innerWidth / 2 - bodyRect.left) / scaleX - width / 2);
|
|
4257
4288
|
const top = Math.round((window.innerHeight / 2 - bodyRect.top) / scaleY - height / 2);
|
|
4258
|
-
const element = document.createElement("div");
|
|
4259
|
-
element.id = nextGeneratedCanvasId(kind);
|
|
4260
|
-
element.setAttribute(GENERATED_CANVAS_NODE_ATTR, kind);
|
|
4261
|
-
element.style.position = "absolute";
|
|
4262
4289
|
element.style.left = `${left}px`;
|
|
4263
4290
|
element.style.top = `${top}px`;
|
|
4264
|
-
|
|
4265
|
-
|
|
4291
|
+
}, []);
|
|
4292
|
+
const insertElement = React3.useCallback((kind) => {
|
|
4293
|
+
if (!stateRef.current.editModeActive) return;
|
|
4294
|
+
saveCurrentToSession();
|
|
4295
|
+
const restoreSelection = buildSelectionSnapshot();
|
|
4296
|
+
const selectedEl = stateRef.current.selectedElement;
|
|
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");
|
|
4300
|
+
element.id = nextGeneratedCanvasId(kind);
|
|
4301
|
+
element.setAttribute(GENERATED_CANVAS_NODE_ATTR, kind);
|
|
4266
4302
|
element.style.boxSizing = "border-box";
|
|
4267
|
-
element.style.borderRadius = kind === "frame" ? "16px" : "12px";
|
|
4268
|
-
element.style.border = "1px solid rgba(13, 153, 255, 0.35)";
|
|
4269
|
-
element.style.zIndex = "1";
|
|
4270
4303
|
if (kind === "frame") {
|
|
4271
|
-
element.style.
|
|
4272
|
-
element.style.
|
|
4273
|
-
element.style.
|
|
4274
|
-
element.style.
|
|
4275
|
-
|
|
4276
|
-
element.style.
|
|
4277
|
-
|
|
4304
|
+
element.style.width = "100px";
|
|
4305
|
+
element.style.height = "100px";
|
|
4306
|
+
element.style.background = "#F5F5F5";
|
|
4307
|
+
element.style.border = "1px solid #E0E0E0";
|
|
4308
|
+
} else if (kind === "div") {
|
|
4309
|
+
element.style.width = "160px";
|
|
4310
|
+
element.style.height = "96px";
|
|
4311
|
+
element.style.borderRadius = "12px";
|
|
4312
|
+
element.style.border = "1px solid rgba(13, 153, 255, 0.35)";
|
|
4278
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";
|
|
4320
|
+
}
|
|
4321
|
+
if (hasSelection) {
|
|
4322
|
+
const insertionParent = selectedEl.parentElement;
|
|
4323
|
+
const refNode = selectedEl.nextSibling;
|
|
4324
|
+
if (refNode) {
|
|
4325
|
+
insertionParent.insertBefore(element, refNode);
|
|
4326
|
+
} else {
|
|
4327
|
+
insertionParent.appendChild(element);
|
|
4328
|
+
}
|
|
4329
|
+
} else {
|
|
4330
|
+
element.style.position = "absolute";
|
|
4331
|
+
element.style.zIndex = "1";
|
|
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
|
+
}
|
|
4279
4346
|
}
|
|
4280
|
-
document.body.appendChild(element);
|
|
4281
4347
|
pushUndo({
|
|
4282
4348
|
type: "structure",
|
|
4283
4349
|
restoreSelection,
|
|
@@ -4291,7 +4357,8 @@ function useSessionManager({
|
|
|
4291
4357
|
primaryElement: element,
|
|
4292
4358
|
pushUndo: false
|
|
4293
4359
|
});
|
|
4294
|
-
|
|
4360
|
+
onElementInsertedRef.current?.(kind, element);
|
|
4361
|
+
}, [applySelection, buildSelectionSnapshot, centerElementOnBody, onElementInsertedRef, pushUndo, saveCurrentToSession, stateRef]);
|
|
4295
4362
|
const groupSelection = React3.useCallback(() => {
|
|
4296
4363
|
const selected = getSanitizedSelection(stateRef.current.selectedElements);
|
|
4297
4364
|
if (selected.length < 2) return;
|
|
@@ -4387,9 +4454,17 @@ function useSessionManager({
|
|
|
4387
4454
|
}));
|
|
4388
4455
|
const sessionSnapshots = /* @__PURE__ */ new Map();
|
|
4389
4456
|
for (const el of selected) {
|
|
4390
|
-
const
|
|
4391
|
-
|
|
4392
|
-
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
|
+
});
|
|
4393
4468
|
}
|
|
4394
4469
|
syncSessionItemCount();
|
|
4395
4470
|
for (const { element } of snapshots) {
|
|
@@ -4410,7 +4485,8 @@ function useSessionManager({
|
|
|
4410
4485
|
}
|
|
4411
4486
|
}
|
|
4412
4487
|
for (const [el, edit] of sessionSnapshots) {
|
|
4413
|
-
sessionEditsRef.current.set(el, edit);
|
|
4488
|
+
if (edit) sessionEditsRef.current.set(el, edit);
|
|
4489
|
+
else sessionEditsRef.current.delete(el);
|
|
4414
4490
|
}
|
|
4415
4491
|
syncSessionItemCount();
|
|
4416
4492
|
}
|
|
@@ -4801,7 +4877,7 @@ function useSessionManager({
|
|
|
4801
4877
|
saveCurrentToSession();
|
|
4802
4878
|
const edits = [];
|
|
4803
4879
|
for (const edit of sessionEditsRef.current.values()) {
|
|
4804
|
-
if (!edit.element.isConnected) {
|
|
4880
|
+
if (!edit.element.isConnected && !edit.deleted) {
|
|
4805
4881
|
sessionEditsRef.current.delete(edit.element);
|
|
4806
4882
|
continue;
|
|
4807
4883
|
}
|
|
@@ -4970,6 +5046,7 @@ ${exportMarkdown}`);
|
|
|
4970
5046
|
|
|
4971
5047
|
// src/use-text-and-comments.ts
|
|
4972
5048
|
import * as React4 from "react";
|
|
5049
|
+
var GENERATED_CANVAS_NODE_ATTR2 = "data-made-refine-canvas-node";
|
|
4973
5050
|
function clampUnit(value) {
|
|
4974
5051
|
if (!Number.isFinite(value)) return 0;
|
|
4975
5052
|
return Math.max(0, Math.min(1, value));
|
|
@@ -5005,6 +5082,94 @@ function useTextAndComments({
|
|
|
5005
5082
|
editingElement.style.outlineOffset = "";
|
|
5006
5083
|
editingElement.style.cursor = originalCursor;
|
|
5007
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
|
+
}
|
|
5008
5173
|
if (newText !== previousText) {
|
|
5009
5174
|
pushUndo({ type: "textEdit", element: editingElement, originalText, previousText });
|
|
5010
5175
|
removedSessionEditsRef.current.delete(editingElement);
|
|
@@ -5523,28 +5688,30 @@ async function toClientResponse(response) {
|
|
|
5523
5688
|
const data = await readJsonRecord(response);
|
|
5524
5689
|
const bodyOk = data?.ok;
|
|
5525
5690
|
const parsedOk = typeof bodyOk === "boolean" ? bodyOk : response.ok;
|
|
5691
|
+
const ok = parsedOk && response.ok;
|
|
5526
5692
|
return {
|
|
5527
|
-
ok
|
|
5528
|
-
id: readString(data, "id") ?? ""
|
|
5693
|
+
ok,
|
|
5694
|
+
id: readString(data, "id") ?? "",
|
|
5695
|
+
...!ok ? { errorKind: "rejected" } : {}
|
|
5529
5696
|
};
|
|
5530
5697
|
}
|
|
5531
5698
|
async function postWithSessionToken(path, payload) {
|
|
5532
5699
|
const idempotencyKey = createIdempotencyKey();
|
|
5533
5700
|
let session = await bootstrapSession();
|
|
5534
|
-
if (!session) return { ok: false, id: "" };
|
|
5701
|
+
if (!session) return { ok: false, id: "", errorKind: "network" };
|
|
5535
5702
|
let response;
|
|
5536
5703
|
try {
|
|
5537
5704
|
response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
|
|
5538
5705
|
} catch {
|
|
5539
|
-
return { ok: false, id: "" };
|
|
5706
|
+
return { ok: false, id: "", errorKind: "network" };
|
|
5540
5707
|
}
|
|
5541
5708
|
if (response.status === 401 || response.status === 403) {
|
|
5542
5709
|
session = await refreshSessionToken(session) ?? await bootstrapSession(true);
|
|
5543
|
-
if (!session) return { ok: false, id: "" };
|
|
5710
|
+
if (!session) return { ok: false, id: "", errorKind: "network" };
|
|
5544
5711
|
try {
|
|
5545
5712
|
response = await sendAnnotationRequest(session, path, payload, idempotencyKey);
|
|
5546
5713
|
} catch {
|
|
5547
|
-
return { ok: false, id: "" };
|
|
5714
|
+
return { ok: false, id: "", errorKind: "network" };
|
|
5548
5715
|
}
|
|
5549
5716
|
}
|
|
5550
5717
|
return toClientResponse(response);
|
|
@@ -5597,8 +5764,10 @@ function buildLocatorPayload(locator) {
|
|
|
5597
5764
|
}
|
|
5598
5765
|
function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrentToSession, removeSessionEdit, deleteComment }) {
|
|
5599
5766
|
const [agentAvailable, setAgentAvailable] = React5.useState(false);
|
|
5767
|
+
const [lastSendFailure, setLastSendFailure] = React5.useState(null);
|
|
5600
5768
|
const isMountedRef = React5.useRef(true);
|
|
5601
5769
|
React5.useEffect(() => {
|
|
5770
|
+
isMountedRef.current = true;
|
|
5602
5771
|
return () => {
|
|
5603
5772
|
isMountedRef.current = false;
|
|
5604
5773
|
};
|
|
@@ -5655,7 +5824,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5655
5824
|
const resolvedPlanContext = movePlanContext ?? buildMovePlanContext(editsForPlan);
|
|
5656
5825
|
const includeBatchMoveEnvelope = Boolean(options?.includeBatchMoveEnvelope && sessionEdit.move);
|
|
5657
5826
|
const isBatchSend = Boolean(allEdits && allEdits.length > 1);
|
|
5658
|
-
const exportMarkdown = sessionEdit.move ? buildSessionExport(
|
|
5827
|
+
const exportMarkdown = sessionEdit.move || sessionEdit.deleted ? buildSessionExport(
|
|
5659
5828
|
includeBatchMoveEnvelope ? editsForPlan : [sessionEdit],
|
|
5660
5829
|
[],
|
|
5661
5830
|
{
|
|
@@ -5671,7 +5840,7 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5671
5840
|
}));
|
|
5672
5841
|
const moveIntent = sessionEdit.move ? getMoveIntentForEdit(sessionEdit, resolvedPlanContext) : null;
|
|
5673
5842
|
const movePlan = includeBatchMoveEnvelope ? resolvedPlanContext.movePlan : null;
|
|
5674
|
-
const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null;
|
|
5843
|
+
const hasMeaningfulPayload = changes.length > 0 || sessionEdit.textEdit != null || moveIntent != null || Boolean(sessionEdit.deleted);
|
|
5675
5844
|
if (!hasMeaningfulPayload) return true;
|
|
5676
5845
|
const profile = getExportContentProfile(
|
|
5677
5846
|
[sessionEdit],
|
|
@@ -5685,17 +5854,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5685
5854
|
textChange: sessionEdit.textEdit ?? null,
|
|
5686
5855
|
moveIntent,
|
|
5687
5856
|
...movePlan ? { movePlan } : {},
|
|
5857
|
+
...sessionEdit.deleted ? { deleted: true } : {},
|
|
5688
5858
|
exportMarkdown: withInstruction(profile, exportMarkdown)
|
|
5689
5859
|
});
|
|
5690
5860
|
if (result.ok) {
|
|
5691
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
|
+
}
|
|
5692
5876
|
}
|
|
5693
|
-
return
|
|
5694
|
-
} catch {
|
|
5695
|
-
|
|
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;
|
|
5696
5892
|
}
|
|
5697
5893
|
}, [updateAgentAvailability, removeSessionEdit]);
|
|
5698
|
-
const sendSessionCommentToAgent = React5.useCallback(async (comment) => {
|
|
5894
|
+
const sendSessionCommentToAgent = React5.useCallback(async (comment, _options) => {
|
|
5699
5895
|
const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies);
|
|
5700
5896
|
const commentProfile = { hasCssEdits: false, hasTextEdits: false, hasMoves: false, hasComments: true };
|
|
5701
5897
|
try {
|
|
@@ -5707,13 +5903,40 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5707
5903
|
});
|
|
5708
5904
|
if (result.ok) {
|
|
5709
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
|
+
}
|
|
5710
5920
|
}
|
|
5711
|
-
return
|
|
5712
|
-
} catch {
|
|
5713
|
-
|
|
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;
|
|
5714
5936
|
}
|
|
5715
5937
|
}, [updateAgentAvailability, deleteComment]);
|
|
5716
5938
|
const sendEditToAgent2 = React5.useCallback(async () => {
|
|
5939
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5717
5940
|
const current = stateRef.current;
|
|
5718
5941
|
if (current.selectedElements.length > 1) {
|
|
5719
5942
|
saveCurrentToSession();
|
|
@@ -5748,9 +5971,28 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5748
5971
|
removeSessionEdit(el);
|
|
5749
5972
|
}
|
|
5750
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
|
+
}
|
|
5751
5985
|
}
|
|
5752
|
-
return
|
|
5986
|
+
return result.ok;
|
|
5753
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
|
+
}
|
|
5754
5996
|
return updateAgentAvailability(false);
|
|
5755
5997
|
}
|
|
5756
5998
|
}
|
|
@@ -5773,11 +6015,13 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5773
6015
|
return sendSessionEditToAgent(editToSend);
|
|
5774
6016
|
}, [canSendEditToAgent, sendSessionEditToAgent, saveCurrentToSession]);
|
|
5775
6017
|
const sendCommentToAgent2 = React5.useCallback(async (id) => {
|
|
6018
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5776
6019
|
const comment = stateRef.current.comments.find((c) => c.id === id);
|
|
5777
6020
|
if (!comment) return false;
|
|
5778
6021
|
return sendSessionCommentToAgent(comment);
|
|
5779
6022
|
}, [sendSessionCommentToAgent]);
|
|
5780
6023
|
const sendAllSessionItemsToAgent = React5.useCallback(async () => {
|
|
6024
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
5781
6025
|
const items = getSessionItems();
|
|
5782
6026
|
const current = stateRef.current;
|
|
5783
6027
|
const contextOnlyBlocks = getContextOnlyBlocks(current.selectedElements, items);
|
|
@@ -5786,25 +6030,44 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5786
6030
|
const movePlanContext = buildMovePlanContext(allEdits);
|
|
5787
6031
|
let moveEnvelopeSent = false;
|
|
5788
6032
|
let allSucceeded = true;
|
|
6033
|
+
const failedEditElements = [];
|
|
6034
|
+
const failedCommentIds = [];
|
|
6035
|
+
let anyThrown = false;
|
|
6036
|
+
const batchFailKinds = [];
|
|
5789
6037
|
for (const item of items) {
|
|
5790
6038
|
let succeeded;
|
|
5791
6039
|
if (item.type === "edit") {
|
|
5792
6040
|
const hasMoveIntent = Boolean(item.edit.move && getMoveIntentForEdit(item.edit, movePlanContext));
|
|
5793
6041
|
const includeBatchMoveEnvelope = hasMoveIntent && !moveEnvelopeSent;
|
|
5794
|
-
|
|
5795
|
-
|
|
5796
|
-
|
|
5797
|
-
|
|
5798
|
-
|
|
5799
|
-
|
|
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
|
+
}
|
|
5800
6055
|
if (includeBatchMoveEnvelope) moveEnvelopeSent = true;
|
|
5801
6056
|
} else {
|
|
5802
|
-
|
|
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
|
+
}
|
|
5803
6065
|
}
|
|
5804
6066
|
if (!succeeded) {
|
|
5805
6067
|
allSucceeded = false;
|
|
5806
6068
|
}
|
|
5807
6069
|
}
|
|
6070
|
+
let contextBlockFailed = false;
|
|
5808
6071
|
if (contextOnlyBlocks.length > 0) {
|
|
5809
6072
|
const primaryEl = current.selectedElements.find(
|
|
5810
6073
|
(el) => el.isConnected && !allEdits.some((e) => e.element === el)
|
|
@@ -5818,16 +6081,39 @@ function useAgentComms({ stateRef, sessionEditsRef, getSessionItems, saveCurrent
|
|
|
5818
6081
|
moveIntent: null,
|
|
5819
6082
|
exportMarkdown: contextOnlyBlocks.join("\n\n")
|
|
5820
6083
|
});
|
|
5821
|
-
if (
|
|
6084
|
+
if (result.ok) {
|
|
6085
|
+
updateAgentAvailability(true);
|
|
6086
|
+
} else {
|
|
6087
|
+
updateAgentAvailability(result.errorKind === "network" ? false : true);
|
|
6088
|
+
allSucceeded = false;
|
|
6089
|
+
contextBlockFailed = true;
|
|
6090
|
+
}
|
|
5822
6091
|
} catch {
|
|
6092
|
+
updateAgentAvailability(false);
|
|
5823
6093
|
allSucceeded = false;
|
|
6094
|
+
anyThrown = true;
|
|
6095
|
+
contextBlockFailed = true;
|
|
5824
6096
|
}
|
|
5825
6097
|
}
|
|
5826
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
|
+
}
|
|
5827
6108
|
return allSucceeded;
|
|
5828
|
-
}, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent]);
|
|
6109
|
+
}, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent, updateAgentAvailability]);
|
|
6110
|
+
const clearSendFailure = React5.useCallback(() => {
|
|
6111
|
+
if (isMountedRef.current) setLastSendFailure(null);
|
|
6112
|
+
}, []);
|
|
5829
6113
|
return {
|
|
5830
6114
|
agentAvailable,
|
|
6115
|
+
lastSendFailure,
|
|
6116
|
+
clearSendFailure,
|
|
5831
6117
|
canSendEditToAgent,
|
|
5832
6118
|
sendEditToAgent: sendEditToAgent2,
|
|
5833
6119
|
sendCommentToAgent: sendCommentToAgent2,
|
|
@@ -5874,7 +6160,9 @@ function useKeyboardShortcuts({
|
|
|
5874
6160
|
const s = stateRef.current;
|
|
5875
6161
|
const undoShortcutPressed = usesMetaForUndo ? e.metaKey && !e.ctrlKey && !e.altKey : e.ctrlKey && !e.metaKey && !e.altKey;
|
|
5876
6162
|
if (undoShortcutPressed && e.key === "z" && !e.shiftKey) {
|
|
6163
|
+
if (!s.editModeActive) return;
|
|
5877
6164
|
if (s.textEditingElement) return;
|
|
6165
|
+
if (isInputFocused()) return;
|
|
5878
6166
|
e.preventDefault();
|
|
5879
6167
|
undo();
|
|
5880
6168
|
return;
|
|
@@ -5929,6 +6217,11 @@ function useKeyboardShortcuts({
|
|
|
5929
6217
|
insertElement("frame");
|
|
5930
6218
|
return;
|
|
5931
6219
|
}
|
|
6220
|
+
if (lowerKey === "t") {
|
|
6221
|
+
e.preventDefault();
|
|
6222
|
+
insertElement("text");
|
|
6223
|
+
return;
|
|
6224
|
+
}
|
|
5932
6225
|
if (lowerKey === "d") {
|
|
5933
6226
|
e.preventDefault();
|
|
5934
6227
|
insertElement("div");
|
|
@@ -6591,6 +6884,10 @@ function DirectEditProvider({ children }) {
|
|
|
6591
6884
|
const undoStackRef = React8.useRef([]);
|
|
6592
6885
|
const sessionEditsRef = React8.useRef(/* @__PURE__ */ new Map());
|
|
6593
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);
|
|
6594
6891
|
const [sessionEditCount, setSessionEditCount] = React8.useState(0);
|
|
6595
6892
|
const stateRef = React8.useRef(state);
|
|
6596
6893
|
React8.useEffect(() => {
|
|
@@ -6625,12 +6922,13 @@ function DirectEditProvider({ children }) {
|
|
|
6625
6922
|
clearSessionEdits,
|
|
6626
6923
|
groupSelection,
|
|
6627
6924
|
deleteSelection,
|
|
6628
|
-
insertElement
|
|
6925
|
+
insertElement: insertElementBase
|
|
6629
6926
|
} = useSessionManager({
|
|
6630
6927
|
stateRef,
|
|
6631
6928
|
sessionEditsRef,
|
|
6632
6929
|
removedSessionEditsRef,
|
|
6633
6930
|
undoStackRef,
|
|
6931
|
+
onElementInsertedRef,
|
|
6634
6932
|
pushUndo,
|
|
6635
6933
|
setState,
|
|
6636
6934
|
setSessionEditCount
|
|
@@ -6680,6 +6978,41 @@ function DirectEditProvider({ children }) {
|
|
|
6680
6978
|
syncSessionItemCount,
|
|
6681
6979
|
setState
|
|
6682
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
|
+
}, []);
|
|
6683
7016
|
const { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 } = useCanvas({
|
|
6684
7017
|
stateRef,
|
|
6685
7018
|
setState
|
|
@@ -6816,6 +7149,8 @@ function DirectEditProvider({ children }) {
|
|
|
6816
7149
|
}, [state.editModeActive]);
|
|
6817
7150
|
const {
|
|
6818
7151
|
agentAvailable,
|
|
7152
|
+
lastSendFailure,
|
|
7153
|
+
clearSendFailure,
|
|
6819
7154
|
canSendEditToAgent,
|
|
6820
7155
|
sendEditToAgent: sendEditToAgent2,
|
|
6821
7156
|
sendCommentToAgent: sendCommentToAgent2,
|
|
@@ -6842,6 +7177,16 @@ function DirectEditProvider({ children }) {
|
|
|
6842
7177
|
} catch {
|
|
6843
7178
|
}
|
|
6844
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]);
|
|
6845
7190
|
useKeyboardShortcuts({
|
|
6846
7191
|
stateRef,
|
|
6847
7192
|
toggleEditMode,
|
|
@@ -6871,9 +7216,10 @@ function DirectEditProvider({ children }) {
|
|
|
6871
7216
|
const stateContextValue = React8.useMemo(() => ({
|
|
6872
7217
|
...state,
|
|
6873
7218
|
agentAvailable,
|
|
7219
|
+
lastSendFailure,
|
|
6874
7220
|
sessionEditCount,
|
|
6875
7221
|
multiSelectContextCount
|
|
6876
|
-
}), [agentAvailable, state, sessionEditCount, multiSelectContextCount]);
|
|
7222
|
+
}), [agentAvailable, lastSendFailure, state, sessionEditCount, multiSelectContextCount]);
|
|
6877
7223
|
const actionsContextValue = React8.useMemo(() => ({
|
|
6878
7224
|
selectElement,
|
|
6879
7225
|
selectElements,
|
|
@@ -6896,6 +7242,7 @@ function DirectEditProvider({ children }) {
|
|
|
6896
7242
|
updateTypographyProperty,
|
|
6897
7243
|
resetToOriginal,
|
|
6898
7244
|
exportEdits,
|
|
7245
|
+
clearSendFailure,
|
|
6899
7246
|
canSendEditToAgent,
|
|
6900
7247
|
sendEditToAgent: sendEditToAgent2,
|
|
6901
7248
|
sendAllSessionItemsToAgent,
|
|
@@ -6920,6 +7267,8 @@ function DirectEditProvider({ children }) {
|
|
|
6920
7267
|
removeSessionEdit,
|
|
6921
7268
|
startTextEditing,
|
|
6922
7269
|
commitTextEditing,
|
|
7270
|
+
setCommentDraftText,
|
|
7271
|
+
setCommentDraftBlockedHandler,
|
|
6923
7272
|
groupSelection,
|
|
6924
7273
|
deleteSelection,
|
|
6925
7274
|
insertElement,
|
|
@@ -6949,6 +7298,7 @@ function DirectEditProvider({ children }) {
|
|
|
6949
7298
|
updateTypographyProperty,
|
|
6950
7299
|
resetToOriginal,
|
|
6951
7300
|
exportEdits,
|
|
7301
|
+
clearSendFailure,
|
|
6952
7302
|
canSendEditToAgent,
|
|
6953
7303
|
sendEditToAgent2,
|
|
6954
7304
|
sendAllSessionItemsToAgent,
|
|
@@ -6973,6 +7323,8 @@ function DirectEditProvider({ children }) {
|
|
|
6973
7323
|
removeSessionEdit,
|
|
6974
7324
|
startTextEditing,
|
|
6975
7325
|
commitTextEditing,
|
|
7326
|
+
setCommentDraftText,
|
|
7327
|
+
setCommentDraftBlockedHandler,
|
|
6976
7328
|
groupSelection,
|
|
6977
7329
|
deleteSelection,
|
|
6978
7330
|
insertElement,
|
|
@@ -7405,6 +7757,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7405
7757
|
{ x: 0, y: 0, scaleX: 1, scaleY: 1 }
|
|
7406
7758
|
);
|
|
7407
7759
|
const originalTransformRef = React12.useRef("");
|
|
7760
|
+
const composeBaseRef = React12.useRef("");
|
|
7408
7761
|
const reorderPreviewRef = React12.useRef(/* @__PURE__ */ new Map());
|
|
7409
7762
|
React12.useEffect(() => {
|
|
7410
7763
|
dragStateRef.current = dragState;
|
|
@@ -7499,6 +7852,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7499
7852
|
}
|
|
7500
7853
|
clearReorderPreview();
|
|
7501
7854
|
originalTransformRef.current = "";
|
|
7855
|
+
composeBaseRef.current = "";
|
|
7502
7856
|
initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
|
|
7503
7857
|
dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
|
|
7504
7858
|
dragGuardRef.current.deactivate();
|
|
@@ -7520,6 +7874,7 @@ function useMove({ onMoveComplete }) {
|
|
|
7520
7874
|
draggedElement.style.opacity = "";
|
|
7521
7875
|
clearReorderPreview();
|
|
7522
7876
|
originalTransformRef.current = "";
|
|
7877
|
+
composeBaseRef.current = "";
|
|
7523
7878
|
initialRectRef.current = { x: 0, y: 0, scaleX: 1, scaleY: 1 };
|
|
7524
7879
|
const dragMode = dragOptionsRef.current.mode;
|
|
7525
7880
|
dragOptionsRef.current = DEFAULT_DRAG_OPTIONS;
|
|
@@ -7580,7 +7935,14 @@ function useMove({ onMoveComplete }) {
|
|
|
7580
7935
|
scaleX: element.offsetWidth > 0 ? rect.width / element.offsetWidth : 1,
|
|
7581
7936
|
scaleY: element.offsetHeight > 0 ? rect.height / element.offsetHeight : 1
|
|
7582
7937
|
};
|
|
7583
|
-
|
|
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
|
+
}
|
|
7584
7946
|
dragGuardRef.current.activate();
|
|
7585
7947
|
setDragState({
|
|
7586
7948
|
isDragging: true,
|
|
@@ -7613,7 +7975,8 @@ function useMove({ onMoveComplete }) {
|
|
|
7613
7975
|
const { x, y, scaleX, scaleY } = initialRectRef.current;
|
|
7614
7976
|
const dx = (e.clientX - dragOffset.x - x) / scaleX;
|
|
7615
7977
|
const dy = (e.clientY - dragOffset.y - y) / scaleY;
|
|
7616
|
-
|
|
7978
|
+
const base = composeBaseRef.current;
|
|
7979
|
+
draggedElement.style.transform = base ? `translate(${dx}px, ${dy}px) ${base}` : `translate(${dx}px, ${dy}px)`;
|
|
7617
7980
|
}
|
|
7618
7981
|
if (dragOptionsRef.current.mode === "position") {
|
|
7619
7982
|
let container2 = findLayoutContainerAtPoint(
|
|
@@ -8480,6 +8843,7 @@ function SelectedCommentComposer({
|
|
|
8480
8843
|
comment,
|
|
8481
8844
|
attentionNonce,
|
|
8482
8845
|
draftRef,
|
|
8846
|
+
onDraftTextChange,
|
|
8483
8847
|
onSubmit,
|
|
8484
8848
|
onCancel
|
|
8485
8849
|
}) {
|
|
@@ -8525,7 +8889,8 @@ function SelectedCommentComposer({
|
|
|
8525
8889
|
}, [attentionNonce]);
|
|
8526
8890
|
React17.useEffect(() => {
|
|
8527
8891
|
if (draftRef) draftRef.current = text;
|
|
8528
|
-
|
|
8892
|
+
onDraftTextChange?.(text);
|
|
8893
|
+
}, [draftRef, onDraftTextChange, text]);
|
|
8529
8894
|
const submit = React17.useCallback(() => {
|
|
8530
8895
|
const nextText = text.trim();
|
|
8531
8896
|
if (!nextText) return;
|
|
@@ -8561,6 +8926,7 @@ function SelectedCommentComposer({
|
|
|
8561
8926
|
{
|
|
8562
8927
|
ref: inputRef,
|
|
8563
8928
|
rows: 1,
|
|
8929
|
+
autoFocus: true,
|
|
8564
8930
|
"aria-invalid": showError,
|
|
8565
8931
|
className: cn(
|
|
8566
8932
|
"min-h-[18px] min-w-0 flex-1 resize-none overflow-hidden bg-transparent px-1.5 py-1.5 text-xs leading-[18px] text-foreground placeholder:text-muted-foreground focus:outline-none",
|
|
@@ -8641,6 +9007,7 @@ function MoveOverlay({ dropIndicator }) {
|
|
|
8641
9007
|
|
|
8642
9008
|
// src/selection-overlay.tsx
|
|
8643
9009
|
import * as React19 from "react";
|
|
9010
|
+
import { MessageSquare } from "lucide-react";
|
|
8644
9011
|
|
|
8645
9012
|
// src/use-selection-resize.ts
|
|
8646
9013
|
import * as React18 from "react";
|
|
@@ -8933,7 +9300,10 @@ function SelectionOverlay({
|
|
|
8933
9300
|
onSelectPageFrame,
|
|
8934
9301
|
isComponentPrimitive = false,
|
|
8935
9302
|
enableResizeHandles = false,
|
|
8936
|
-
onResizeSizingChange
|
|
9303
|
+
onResizeSizingChange,
|
|
9304
|
+
showCommentPill = false,
|
|
9305
|
+
isCommentActive = false,
|
|
9306
|
+
onCommentPillClick
|
|
8937
9307
|
}) {
|
|
8938
9308
|
const selectionColor = isComponentPrimitive ? COMPONENT_PURPLE : BLUE3;
|
|
8939
9309
|
const rectElement = isDragging && draggedElement ? draggedElement : selectedElement;
|
|
@@ -9297,7 +9667,7 @@ function SelectionOverlay({
|
|
|
9297
9667
|
}
|
|
9298
9668
|
}
|
|
9299
9669
|
),
|
|
9300
|
-
!isTextEditing && /* @__PURE__ */
|
|
9670
|
+
!isTextEditing && /* @__PURE__ */ jsxs5(
|
|
9301
9671
|
"div",
|
|
9302
9672
|
{
|
|
9303
9673
|
"data-direct-edit": "dimension-label",
|
|
@@ -9312,24 +9682,69 @@ function SelectionOverlay({
|
|
|
9312
9682
|
alignItems: "center",
|
|
9313
9683
|
gap: "4px"
|
|
9314
9684
|
},
|
|
9315
|
-
children:
|
|
9316
|
-
|
|
9317
|
-
|
|
9318
|
-
|
|
9319
|
-
|
|
9320
|
-
|
|
9321
|
-
|
|
9322
|
-
|
|
9323
|
-
|
|
9324
|
-
|
|
9325
|
-
|
|
9326
|
-
|
|
9327
|
-
|
|
9328
|
-
|
|
9329
|
-
|
|
9330
|
-
|
|
9331
|
-
|
|
9332
|
-
|
|
9685
|
+
children: [
|
|
9686
|
+
/* @__PURE__ */ jsx9(
|
|
9687
|
+
"span",
|
|
9688
|
+
{
|
|
9689
|
+
style: {
|
|
9690
|
+
background: selectionColor,
|
|
9691
|
+
color: "white",
|
|
9692
|
+
fontSize: "11px",
|
|
9693
|
+
lineHeight: "20px",
|
|
9694
|
+
padding: "0 6px",
|
|
9695
|
+
borderRadius: "4px",
|
|
9696
|
+
whiteSpace: "nowrap",
|
|
9697
|
+
fontFamily: "system-ui, sans-serif",
|
|
9698
|
+
fontWeight: 500,
|
|
9699
|
+
letterSpacing: "-0.01em"
|
|
9700
|
+
},
|
|
9701
|
+
children: dimensionText
|
|
9702
|
+
}
|
|
9703
|
+
),
|
|
9704
|
+
showCommentPill && /* @__PURE__ */ jsx9(TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ jsxs5(Tooltip, { children: [
|
|
9705
|
+
/* @__PURE__ */ jsx9(
|
|
9706
|
+
TooltipTrigger,
|
|
9707
|
+
{
|
|
9708
|
+
render: /* @__PURE__ */ jsx9(
|
|
9709
|
+
"button",
|
|
9710
|
+
{
|
|
9711
|
+
type: "button",
|
|
9712
|
+
"data-direct-edit": "comment-pill",
|
|
9713
|
+
"aria-label": "Toggle comment",
|
|
9714
|
+
style: {
|
|
9715
|
+
display: "inline-flex",
|
|
9716
|
+
alignItems: "center",
|
|
9717
|
+
justifyContent: "center",
|
|
9718
|
+
background: isCommentActive ? "white" : selectionColor,
|
|
9719
|
+
color: isCommentActive ? selectionColor : "white",
|
|
9720
|
+
height: "20px",
|
|
9721
|
+
width: "24px",
|
|
9722
|
+
borderRadius: "4px",
|
|
9723
|
+
border: "none",
|
|
9724
|
+
boxSizing: "border-box",
|
|
9725
|
+
cursor: "pointer",
|
|
9726
|
+
pointerEvents: "auto",
|
|
9727
|
+
padding: 0,
|
|
9728
|
+
opacity: 1
|
|
9729
|
+
},
|
|
9730
|
+
onClick: (e) => {
|
|
9731
|
+
e.stopPropagation();
|
|
9732
|
+
onCommentPillClick?.();
|
|
9733
|
+
},
|
|
9734
|
+
onPointerEnter: (e) => {
|
|
9735
|
+
e.currentTarget.style.opacity = "0.85";
|
|
9736
|
+
},
|
|
9737
|
+
onPointerLeave: (e) => {
|
|
9738
|
+
e.currentTarget.style.opacity = "1";
|
|
9739
|
+
}
|
|
9740
|
+
}
|
|
9741
|
+
),
|
|
9742
|
+
children: /* @__PURE__ */ jsx9(MessageSquare, { style: { width: 12, height: 12 }, strokeWidth: 2.5 })
|
|
9743
|
+
}
|
|
9744
|
+
),
|
|
9745
|
+
/* @__PURE__ */ jsx9(TooltipContent, { side: "bottom", children: "Comment" })
|
|
9746
|
+
] }) })
|
|
9747
|
+
]
|
|
9333
9748
|
}
|
|
9334
9749
|
),
|
|
9335
9750
|
!isDragging && !isTextEditing && /* @__PURE__ */ jsxs5(
|
|
@@ -11859,6 +12274,7 @@ function PanelFooter({
|
|
|
11859
12274
|
onExportEdits,
|
|
11860
12275
|
onSendToAgent,
|
|
11861
12276
|
showSendButton = true,
|
|
12277
|
+
sendFailureReason,
|
|
11862
12278
|
onPointerDown,
|
|
11863
12279
|
onPointerMove,
|
|
11864
12280
|
onPointerUp,
|
|
@@ -11867,6 +12283,13 @@ function PanelFooter({
|
|
|
11867
12283
|
const [copied, setCopied] = React30.useState(false);
|
|
11868
12284
|
const [copyError, setCopyError] = React30.useState(false);
|
|
11869
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]);
|
|
11870
12293
|
const handleCopy = async () => {
|
|
11871
12294
|
if (!onExportEdits) return;
|
|
11872
12295
|
const success = await onExportEdits();
|
|
@@ -11880,6 +12303,7 @@ function PanelFooter({
|
|
|
11880
12303
|
setCopyError(true);
|
|
11881
12304
|
setTimeout(() => setCopyError(false), 2e3);
|
|
11882
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";
|
|
11883
12307
|
const handleSendToAgent = async () => {
|
|
11884
12308
|
if (!onSendToAgent || sendStatus === "sending") return;
|
|
11885
12309
|
setSendStatus("sending");
|
|
@@ -11889,7 +12313,6 @@ function PanelFooter({
|
|
|
11889
12313
|
setTimeout(() => setSendStatus("idle"), 2e3);
|
|
11890
12314
|
} else {
|
|
11891
12315
|
setSendStatus("offline");
|
|
11892
|
-
setTimeout(() => setSendStatus("idle"), 2e3);
|
|
11893
12316
|
}
|
|
11894
12317
|
};
|
|
11895
12318
|
return /* @__PURE__ */ jsxs18(
|
|
@@ -11917,7 +12340,7 @@ function PanelFooter({
|
|
|
11917
12340
|
children: copyError ? /* @__PURE__ */ jsx24(X3, { className: "text-red-500" }) : copied ? /* @__PURE__ */ jsx24(Check3, { className: "text-green-500" }) : /* @__PURE__ */ jsx24(Copy2, {})
|
|
11918
12341
|
}
|
|
11919
12342
|
) }),
|
|
11920
|
-
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(
|
|
11921
12344
|
Button,
|
|
11922
12345
|
{
|
|
11923
12346
|
variant: "outline",
|
|
@@ -12634,6 +13057,7 @@ function DirectEditPanelInner({
|
|
|
12634
13057
|
onSendToAgent,
|
|
12635
13058
|
canSendToAgent = false,
|
|
12636
13059
|
showSendButton = true,
|
|
13060
|
+
sendFailureReason,
|
|
12637
13061
|
className,
|
|
12638
13062
|
style,
|
|
12639
13063
|
panelRef,
|
|
@@ -12787,6 +13211,7 @@ function DirectEditPanelInner({
|
|
|
12787
13211
|
onExportEdits,
|
|
12788
13212
|
onSendToAgent,
|
|
12789
13213
|
showSendButton,
|
|
13214
|
+
sendFailureReason,
|
|
12790
13215
|
onPointerDown: onHeaderPointerDown,
|
|
12791
13216
|
onPointerMove: onHeaderPointerMove,
|
|
12792
13217
|
onPointerUp: onHeaderPointerUp,
|
|
@@ -12821,7 +13246,8 @@ function DirectEditPanelContent() {
|
|
|
12821
13246
|
comments,
|
|
12822
13247
|
activeCommentId,
|
|
12823
13248
|
textEditingElement,
|
|
12824
|
-
agentAvailable
|
|
13249
|
+
agentAvailable,
|
|
13250
|
+
lastSendFailure
|
|
12825
13251
|
} = useDirectEditState();
|
|
12826
13252
|
const {
|
|
12827
13253
|
selectParent,
|
|
@@ -12853,7 +13279,9 @@ function DirectEditPanelContent() {
|
|
|
12853
13279
|
setActiveCommentId,
|
|
12854
13280
|
startTextEditing,
|
|
12855
13281
|
toggleEditMode,
|
|
12856
|
-
deleteSelection
|
|
13282
|
+
deleteSelection,
|
|
13283
|
+
setCommentDraftText,
|
|
13284
|
+
setCommentDraftBlockedHandler
|
|
12857
13285
|
} = useDirectEditActions();
|
|
12858
13286
|
const {
|
|
12859
13287
|
position,
|
|
@@ -12875,7 +13303,8 @@ function DirectEditPanelContent() {
|
|
|
12875
13303
|
});
|
|
12876
13304
|
React34.useEffect(() => {
|
|
12877
13305
|
commentDraftRef.current = "";
|
|
12878
|
-
|
|
13306
|
+
setCommentDraftText("");
|
|
13307
|
+
}, [activeCommentId, setCommentDraftText]);
|
|
12879
13308
|
const activeDraftComment = React34.useMemo(() => {
|
|
12880
13309
|
if (!commentTargetElement || !activeCommentId) return null;
|
|
12881
13310
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
@@ -12895,6 +13324,18 @@ function DirectEditPanelContent() {
|
|
|
12895
13324
|
const triggerCommentInputAttention = React34.useCallback((commentId) => {
|
|
12896
13325
|
setCommentInputAttention((prev) => prev?.commentId === commentId ? { commentId, nonce: prev.nonce + 1 } : { commentId, nonce: 1 });
|
|
12897
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]);
|
|
12898
13339
|
const hasPendingCommentDraft = React34.useCallback((nextCommentId = null) => {
|
|
12899
13340
|
if (!activeCommentId) return false;
|
|
12900
13341
|
if (nextCommentId && nextCommentId === activeCommentId) return false;
|
|
@@ -12915,6 +13356,20 @@ function DirectEditPanelContent() {
|
|
|
12915
13356
|
}
|
|
12916
13357
|
setActiveCommentId(id);
|
|
12917
13358
|
}, [activeCommentId, comments, hasPendingCommentDraft, deleteComment, setActiveCommentId]);
|
|
13359
|
+
const handleCommentPillClick = React34.useCallback(() => {
|
|
13360
|
+
if (activeDraftComment) {
|
|
13361
|
+
handleSetActiveComment(null);
|
|
13362
|
+
return;
|
|
13363
|
+
}
|
|
13364
|
+
if (hasPendingCommentDraft()) return;
|
|
13365
|
+
if (!commentTargetElement) return;
|
|
13366
|
+
const existingDraft = comments.find((comment) => comment.element === commentTargetElement && comment.text.trim().length === 0);
|
|
13367
|
+
if (existingDraft) {
|
|
13368
|
+
setActiveCommentId(existingDraft.id);
|
|
13369
|
+
return;
|
|
13370
|
+
}
|
|
13371
|
+
addComment(commentTargetElement, getElementCommentAnchor(commentTargetElement));
|
|
13372
|
+
}, [activeDraftComment, handleSetActiveComment, hasPendingCommentDraft, commentTargetElement, comments, setActiveCommentId, addComment]);
|
|
12918
13373
|
React34.useEffect(() => {
|
|
12919
13374
|
const previous = previousCommentTriggerRef.current;
|
|
12920
13375
|
previousCommentTriggerRef.current = { editModeActive, commentTargetElement };
|
|
@@ -12930,18 +13385,18 @@ function DirectEditPanelContent() {
|
|
|
12930
13385
|
setActiveCommentId(null);
|
|
12931
13386
|
return;
|
|
12932
13387
|
}
|
|
12933
|
-
if (activeCommentId)
|
|
12934
|
-
|
|
12935
|
-
|
|
12936
|
-
|
|
12937
|
-
|
|
13388
|
+
if (activeCommentId) {
|
|
13389
|
+
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13390
|
+
if (active && active.text.trim().length === 0 && active.element !== commentTargetElement) {
|
|
13391
|
+
deleteComment(active.id);
|
|
13392
|
+
setActiveCommentId(null);
|
|
13393
|
+
}
|
|
12938
13394
|
}
|
|
12939
|
-
addComment(commentTargetElement, getElementCommentAnchor(commentTargetElement));
|
|
12940
13395
|
}, [
|
|
12941
13396
|
activeCommentId,
|
|
12942
|
-
addComment,
|
|
12943
13397
|
commentTargetElement,
|
|
12944
13398
|
comments,
|
|
13399
|
+
deleteComment,
|
|
12945
13400
|
editModeActive,
|
|
12946
13401
|
setActiveCommentId,
|
|
12947
13402
|
textEditingElement
|
|
@@ -12990,6 +13445,7 @@ function DirectEditPanelContent() {
|
|
|
12990
13445
|
comment: activeDraftComment,
|
|
12991
13446
|
attentionNonce: commentInputAttention?.commentId === activeDraftComment.id ? commentInputAttention.nonce : 0,
|
|
12992
13447
|
draftRef: commentDraftRef,
|
|
13448
|
+
onDraftTextChange: setCommentDraftText,
|
|
12993
13449
|
onSubmit: (text) => submitCommentDraft(activeDraftComment.id, text),
|
|
12994
13450
|
onCancel: () => handleSetActiveComment(null)
|
|
12995
13451
|
}
|
|
@@ -13134,7 +13590,10 @@ function DirectEditPanelContent() {
|
|
|
13134
13590
|
},
|
|
13135
13591
|
isComponentPrimitive,
|
|
13136
13592
|
enableResizeHandles: true,
|
|
13137
|
-
onResizeSizingChange: updateSizingProperties
|
|
13593
|
+
onResizeSizingChange: updateSizingProperties,
|
|
13594
|
+
showCommentPill: editModeActive,
|
|
13595
|
+
isCommentActive: Boolean(activeDraftComment),
|
|
13596
|
+
onCommentPillClick: handleCommentPillClick
|
|
13138
13597
|
}
|
|
13139
13598
|
) : selectedElements.length > 1 && !textEditingElement ? /* @__PURE__ */ jsx29(MultiSelectionOverlay, { selectedElements }) : null;
|
|
13140
13599
|
const selectionChrome = selectionChromeContent && container ? createPortal(selectionChromeContent, container) : null;
|
|
@@ -14073,7 +14532,7 @@ function useToolbarDock(toolbarRef) {
|
|
|
14073
14532
|
}
|
|
14074
14533
|
|
|
14075
14534
|
// src/toolbar.tsx
|
|
14076
|
-
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";
|
|
14077
14536
|
|
|
14078
14537
|
// src/toolbar/edits-popover.tsx
|
|
14079
14538
|
import * as React38 from "react";
|
|
@@ -14136,7 +14595,8 @@ function EditsPopover({
|
|
|
14136
14595
|
onExportAllEdits,
|
|
14137
14596
|
onClearSessionEdits,
|
|
14138
14597
|
onRemoveSessionEdit,
|
|
14139
|
-
onDeleteComment
|
|
14598
|
+
onDeleteComment,
|
|
14599
|
+
sendFailure
|
|
14140
14600
|
}) {
|
|
14141
14601
|
const [copied, setCopied] = React38.useState(false);
|
|
14142
14602
|
const editsPopupRef = React38.useRef(null);
|
|
@@ -14149,6 +14609,7 @@ function EditsPopover({
|
|
|
14149
14609
|
const visibleItems = React38.useMemo(() => {
|
|
14150
14610
|
return editsSnapshot.filter((item) => {
|
|
14151
14611
|
if (item.type === "comment") return true;
|
|
14612
|
+
if (item.edit.deleted) return true;
|
|
14152
14613
|
if (!item.edit.move) return true;
|
|
14153
14614
|
const moveIntent = getMoveIntentForEdit(item.edit, movePlanContext);
|
|
14154
14615
|
const hasStyleOrText = Object.keys(item.edit.pendingStyles).length > 0 || item.edit.textEdit != null;
|
|
@@ -14253,12 +14714,15 @@ ${text}`);
|
|
|
14253
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: [
|
|
14254
14715
|
visibleItems.map((item, i) => {
|
|
14255
14716
|
const isEdit = item.type === "edit";
|
|
14717
|
+
const isDeleted = isEdit && Boolean(item.edit.deleted);
|
|
14256
14718
|
const moveIntent = isEdit && item.edit.move ? getMoveIntentForEdit(item.edit, movePlanContext) : null;
|
|
14257
14719
|
const isMoved = Boolean(moveIntent);
|
|
14258
14720
|
const locator = isEdit ? item.edit.locator : item.comment.locator;
|
|
14259
14721
|
const componentName = locator.reactStack[0]?.name ?? locator.tagName;
|
|
14260
14722
|
let valueSummary = "";
|
|
14261
|
-
if (isEdit) {
|
|
14723
|
+
if (isEdit && isDeleted) {
|
|
14724
|
+
valueSummary = locator.textPreview || locator.domSelector || locator.tagName;
|
|
14725
|
+
} else if (isEdit) {
|
|
14262
14726
|
const entries = Object.entries(item.edit.pendingStyles);
|
|
14263
14727
|
const editValues = [];
|
|
14264
14728
|
for (const [prop, value] of entries) {
|
|
@@ -14279,6 +14743,7 @@ ${text}`);
|
|
|
14279
14743
|
}
|
|
14280
14744
|
valueSummary = commentValues.join(", ");
|
|
14281
14745
|
}
|
|
14746
|
+
const failed = isEdit ? sendFailure?.failedEditElements.includes(item.edit.element) : sendFailure?.failedCommentIds.includes(item.comment.id);
|
|
14282
14747
|
return /* @__PURE__ */ jsxs25(
|
|
14283
14748
|
"div",
|
|
14284
14749
|
{
|
|
@@ -14297,13 +14762,16 @@ ${text}`);
|
|
|
14297
14762
|
},
|
|
14298
14763
|
children: [
|
|
14299
14764
|
/* @__PURE__ */ jsxs25("div", { className: "min-w-0 flex flex-1 flex-col items-start gap-[4px]", children: [
|
|
14300
|
-
/* @__PURE__ */ jsxs25(
|
|
14301
|
-
"
|
|
14302
|
-
|
|
14303
|
-
|
|
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" })
|
|
14304
14772
|
] }),
|
|
14305
14773
|
/* @__PURE__ */ jsxs25("span", { className: "min-w-0 max-w-full truncate text-xs text-muted-foreground", children: [
|
|
14306
|
-
isEdit ? isMoved ? "moved: " : "edit: " : "comment: ",
|
|
14774
|
+
isEdit ? isDeleted ? "deleted: " : isMoved ? "moved: " : "edit: " : "comment: ",
|
|
14307
14775
|
truncateText(valueSummary, 128)
|
|
14308
14776
|
] })
|
|
14309
14777
|
] }),
|
|
@@ -14568,6 +15036,7 @@ function SettingsPopover({
|
|
|
14568
15036
|
{ label: "Undo", keys: isMac ? [/* @__PURE__ */ jsx33(Command, { className: "size-2.5" }, "cmd"), "Z"] : ["Ctrl", "Z"] },
|
|
14569
15037
|
{ label: "Group selection", keys: isMac ? [/* @__PURE__ */ jsx33(Command, { className: "size-2.5" }, "cmd"), "G"] : ["Ctrl", "G"] },
|
|
14570
15038
|
{ label: "Add frame", keys: ["F"] },
|
|
15039
|
+
{ label: "Add text", keys: ["T"] },
|
|
14571
15040
|
{ label: "Add div", keys: ["D"] },
|
|
14572
15041
|
{ label: "Add to selection", keys: [/* @__PURE__ */ jsx33(ArrowBigUp, { className: "size-3" }, "shift"), "Click"] },
|
|
14573
15042
|
{ label: "Marquee select", keys: ["Drag"] },
|
|
@@ -14610,6 +15079,8 @@ function DirectEditToolbarInner({
|
|
|
14610
15079
|
onExportAllEdits,
|
|
14611
15080
|
onSendAllToAgents,
|
|
14612
15081
|
agentAvailable = true,
|
|
15082
|
+
sendFailureReason,
|
|
15083
|
+
sendFailure,
|
|
14613
15084
|
onClearSessionEdits,
|
|
14614
15085
|
onRemoveSessionEdit,
|
|
14615
15086
|
onDeleteComment,
|
|
@@ -14619,7 +15090,8 @@ function DirectEditToolbarInner({
|
|
|
14619
15090
|
onToggleCanvas,
|
|
14620
15091
|
onSetCanvasZoom,
|
|
14621
15092
|
onZoomTo100,
|
|
14622
|
-
onFitToViewport
|
|
15093
|
+
onFitToViewport,
|
|
15094
|
+
onInsertElement
|
|
14623
15095
|
}) {
|
|
14624
15096
|
const container = usePortalContainer();
|
|
14625
15097
|
const toolbarRef = React40.useRef(null);
|
|
@@ -14628,7 +15100,8 @@ function DirectEditToolbarInner({
|
|
|
14628
15100
|
const [activePopover, setActivePopover] = React40.useState(null);
|
|
14629
15101
|
const [applyStatus, setApplyStatus] = React40.useState("idle");
|
|
14630
15102
|
const applyTimerRef = React40.useRef(null);
|
|
14631
|
-
const showApplyButton = agentAvailable && Boolean(onSendAllToAgents);
|
|
15103
|
+
const showApplyButton = (agentAvailable || applyStatus !== "idle") && Boolean(onSendAllToAgents);
|
|
15104
|
+
const showInsertButtons = Boolean(onInsertElement);
|
|
14632
15105
|
const totalItemCount = sessionEditCount + multiSelectCount;
|
|
14633
15106
|
const sizeCacheRef = React40.useRef({});
|
|
14634
15107
|
React40.useEffect(() => {
|
|
@@ -14682,6 +15155,16 @@ function DirectEditToolbarInner({
|
|
|
14682
15155
|
setApplyStatus("idle");
|
|
14683
15156
|
}, 2e3);
|
|
14684
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";
|
|
14685
15168
|
const handleApplyAll = React40.useCallback(async () => {
|
|
14686
15169
|
if (!onSendAllToAgents || totalItemCount === 0 || applyStatus === "sending") return;
|
|
14687
15170
|
setApplyStatus("sending");
|
|
@@ -14691,8 +15174,12 @@ function DirectEditToolbarInner({
|
|
|
14691
15174
|
} catch {
|
|
14692
15175
|
success = false;
|
|
14693
15176
|
}
|
|
14694
|
-
|
|
14695
|
-
|
|
15177
|
+
if (success) {
|
|
15178
|
+
setApplyStatus("sent");
|
|
15179
|
+
scheduleApplyReset();
|
|
15180
|
+
} else {
|
|
15181
|
+
setApplyStatus("offline");
|
|
15182
|
+
}
|
|
14696
15183
|
}, [applyStatus, onSendAllToAgents, scheduleApplyReset, totalItemCount]);
|
|
14697
15184
|
const dragHandlers = React40.useMemo(() => ({
|
|
14698
15185
|
onPointerDown: handlePointerDown,
|
|
@@ -14773,6 +15260,38 @@ function DirectEditToolbarInner({
|
|
|
14773
15260
|
},
|
|
14774
15261
|
...dragHandlers,
|
|
14775
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
|
+
] }),
|
|
14776
15295
|
/* @__PURE__ */ jsx34(
|
|
14777
15296
|
EditsPopover,
|
|
14778
15297
|
{
|
|
@@ -14785,7 +15304,8 @@ function DirectEditToolbarInner({
|
|
|
14785
15304
|
onExportAllEdits,
|
|
14786
15305
|
onClearSessionEdits,
|
|
14787
15306
|
onRemoveSessionEdit,
|
|
14788
|
-
onDeleteComment
|
|
15307
|
+
onDeleteComment,
|
|
15308
|
+
sendFailure
|
|
14789
15309
|
}
|
|
14790
15310
|
),
|
|
14791
15311
|
showApplyButton && /* @__PURE__ */ jsxs27(Tooltip, { children: [
|
|
@@ -14809,7 +15329,7 @@ function DirectEditToolbarInner({
|
|
|
14809
15329
|
]
|
|
14810
15330
|
}
|
|
14811
15331
|
),
|
|
14812
|
-
/* @__PURE__ */ jsx34(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ jsx34("span", { children:
|
|
15332
|
+
/* @__PURE__ */ jsx34(TooltipContent, { side: tooltipSide, children: /* @__PURE__ */ jsx34("span", { children: applyTooltipLabel }) })
|
|
14813
15333
|
] }),
|
|
14814
15334
|
/* @__PURE__ */ jsx34(
|
|
14815
15335
|
"div",
|
|
@@ -14871,7 +15391,7 @@ function DirectEditToolbarInner({
|
|
|
14871
15391
|
return toolbar;
|
|
14872
15392
|
}
|
|
14873
15393
|
function DirectEditToolbarContent() {
|
|
14874
|
-
const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable } = useDirectEditState();
|
|
15394
|
+
const { editModeActive, theme, sessionEditCount, multiSelectContextCount, selectedElements, canvas, agentAvailable, lastSendFailure } = useDirectEditState();
|
|
14875
15395
|
const {
|
|
14876
15396
|
toggleEditMode,
|
|
14877
15397
|
setTheme,
|
|
@@ -14881,6 +15401,7 @@ function DirectEditToolbarContent() {
|
|
|
14881
15401
|
clearSessionEdits,
|
|
14882
15402
|
removeSessionEdit,
|
|
14883
15403
|
deleteComment,
|
|
15404
|
+
insertElement,
|
|
14884
15405
|
toggleCanvas,
|
|
14885
15406
|
setCanvasZoom,
|
|
14886
15407
|
zoomCanvasTo100,
|
|
@@ -14903,6 +15424,8 @@ function DirectEditToolbarContent() {
|
|
|
14903
15424
|
onExportAllEdits: exportAllEdits,
|
|
14904
15425
|
onSendAllToAgents: sendAllSessionItemsToAgent,
|
|
14905
15426
|
agentAvailable,
|
|
15427
|
+
sendFailureReason: lastSendFailure?.reason ?? null,
|
|
15428
|
+
sendFailure: lastSendFailure,
|
|
14906
15429
|
onClearSessionEdits: clearSessionEdits,
|
|
14907
15430
|
onRemoveSessionEdit: removeSessionEdit,
|
|
14908
15431
|
onDeleteComment: deleteComment,
|
|
@@ -14911,7 +15434,8 @@ function DirectEditToolbarContent() {
|
|
|
14911
15434
|
onToggleCanvas: toggleCanvas,
|
|
14912
15435
|
onSetCanvasZoom: setCanvasZoom,
|
|
14913
15436
|
onZoomTo100: zoomCanvasTo100,
|
|
14914
|
-
onFitToViewport: fitCanvasToViewport
|
|
15437
|
+
onFitToViewport: fitCanvasToViewport,
|
|
15438
|
+
onInsertElement: insertElement
|
|
14915
15439
|
}
|
|
14916
15440
|
);
|
|
14917
15441
|
}
|