made-refine 0.2.21 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +998 -715
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +998 -715
- package/dist/index.mjs.map +1 -1
- package/dist/preload/preload.js +3 -1
- package/dist/preload.js +3 -1
- package/dist/preload.js.map +1 -1
- package/dist/preload.mjs +3 -1
- package/dist/preload.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/{utils-Byovnuwg.d.mts → utils-ovHeRo0g.d.mts} +16 -15
- package/dist/{utils-Byovnuwg.d.ts → utils-ovHeRo0g.d.ts} +16 -15
- package/dist/utils.d.mts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +256 -192
- package/dist/utils.js.map +1 -1
- package/dist/utils.mjs +256 -192
- package/dist/utils.mjs.map +1 -1
- package/package.json +12 -1
package/dist/index.js
CHANGED
|
@@ -87,7 +87,7 @@ var React8 = __toESM(require("react"));
|
|
|
87
87
|
var React = __toESM(require("react"));
|
|
88
88
|
|
|
89
89
|
// dist/styles.css
|
|
90
|
-
var styles_default = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover-foreground:#171717}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.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}}';
|
|
90
|
+
var styles_default = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover-foreground:#171717}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.left-1\\.5{left:calc(var(--spacing)*1.5)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.isolate{isolation:isolate}.z-\\[99990\\]{z-index:99990}.z-\\[99991\\]{z-index:99991}.z-\\[99998\\]{z-index:99998}.z-\\[99999\\]{z-index:99999}.\\!container{width:100%!important}@media (min-width:40rem){.\\!container{max-width:40rem!important}}@media (min-width:48rem){.\\!container{max-width:48rem!important}}@media (min-width:64rem){.\\!container{max-width:64rem!important}}@media (min-width:80rem){.\\!container{max-width:80rem!important}}@media (min-width:96rem){.\\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-4{margin:calc(var(--spacing)*4)}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-2{margin-inline:calc(var(--spacing)*2)}.my-0\\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2\\.5{margin-top:calc(var(--spacing)*2.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.list-item{display:list-item}.table{display:table}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-2\\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing)*.5)}.h-2{height:calc(var(--spacing)*2)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-\\[150px\\]{height:150px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-\\[240px\\]{max-height:240px}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\\[18px\\]{min-height:18px}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[180px\\]{width:180px}.w-\\[200px\\]{width:200px}.w-\\[240px\\]{width:240px}.w-\\[260px\\]{width:260px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[18px\\]{min-width:18px}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.\\[appearance\\:textfield\\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-\\[2px\\]{gap:2px}.gap-\\[4px\\]{gap:4px}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-\\[6px\\]{border-radius:6px}.rounded-\\[8px\\]{border-radius:8px}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.\\[border-top-style\\:solid\\]{border-top-style:solid}.\\[border-right-style\\:dashed\\]{border-right-style:dashed}.\\[border-bottom-style\\:dashed\\]{border-bottom-style:dashed}.\\[border-bottom-style\\:dotted\\]{border-bottom-style:dotted}.\\[border-bottom-style\\:solid\\]{border-bottom-style:solid}.\\[border-left-style\\:double\\]{border-left-style:double}.\\[border-left-style\\:solid\\]{border-left-style:solid}.border-border{border-color:var(--color-border)}.border-border\\/30{border-color:#e6e6e64d}@supports (color:color-mix(in lab, red, red)){.border-border\\/30{border-color:color-mix(in oklab,var(--color-border)30%,transparent)}}.border-border\\/50{border-color:#e6e6e680}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.border-foreground\\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/10{border-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.bg-\\[canvas\\]{background-color:canvas}.bg-background{background-color:var(--color-background)}.bg-background\\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/85{background-color:color-mix(in oklab,var(--color-background)85%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\\/25{background-color:#17171740}@supports (color:color-mix(in lab, red, red)){.bg-foreground\\/25{background-color:color-mix(in oklab,var(--color-foreground)25%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\\/30{background-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/30{background-color:color-mix(in oklab,var(--color-muted-foreground)30%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.fill-border{fill:var(--color-border)}.p-0{padding:calc(var(--spacing)*0)}.p-0\\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\\.5{padding-block:calc(var(--spacing)*3.5)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-\\[13px\\]{padding-top:13px}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[7px\\]{font-size:7px}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-background{color:var(--color-background)}.text-blue-500{color:var(--color-blue-500)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_4px_6px_-1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[inset_0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-border{outline-color:var(--color-border)}.outline-foreground\\/10{outline-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.outline-foreground\\/10{outline-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.outline-red-500\\/70{outline-color:#fb2c36b3}@supports (color:color-mix(in lab, red, red)){.outline-red-500\\/70{outline-color:color-mix(in oklab,var(--color-red-500)70%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\]{transition-property:color,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,background-color\\,color\\]{transition-property:opacity,background-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,scale\\,opacity\\]{transition-property:transform,scale,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-ms-overflow-style\\:none\\]{-ms-overflow-style:none}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/pin\\:inline:is(:where(.group\\/pin):hover *){display:inline}}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.placeholder\\:text-red-400::placeholder{color:var(--color-red-400)}.focus-within\\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\\:ring-ring:focus-within{--tw-ring-color:var(--color-ring)}.focus-within\\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}.focus-within\\:ring-inset:focus-within{--tw-ring-inset:inset}@media (hover:hover){.hover\\:scale-\\[1\\.67\\]:hover{scale:1.67}.hover\\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\\:bg-destructive\\/90:hover{background-color:#ef4444e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\\:bg-foreground\\/80:hover{background-color:#171717cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/80:hover{background-color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--color-muted)}.hover\\:bg-muted-foreground\\/10:hover{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/10:hover{background-color:color-mix(in oklab,var(--color-muted-foreground)10%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\\:bg-muted\\/80:hover{background-color:#f2f2f2cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab,var(--color-muted)80%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\\:text-foreground:hover{color:var(--color-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-inset:focus-visible{--tw-ring-inset:inset}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.data-ending-style\\:scale-90[data-ending-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-ending-style\\:opacity-0[data-ending-style]{opacity:0}.data-instant\\:transition-none[data-instant]{transition-property:none}.data-starting-style\\:scale-90[data-starting-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-starting-style\\:opacity-0[data-starting-style]{opacity:0}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.dark\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:-outline-offset-1{outline-offset:calc(1px*-1)}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:size-3\\.5 svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&\\:\\:-webkit-inner-spin-button\\]\\:appearance-none::-webkit-inner-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-outer-spin-button\\]\\:appearance-none::-webkit-outer-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none;animation:none}}.lucide{stroke-width:1px}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}';
|
|
91
91
|
|
|
92
92
|
// src/portal-container.tsx
|
|
93
93
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -572,14 +572,7 @@ function getReactComponentInfo(element) {
|
|
|
572
572
|
}
|
|
573
573
|
return { ...getRenderStack(fiber), elementSourceFile };
|
|
574
574
|
}
|
|
575
|
-
var EXCLUDED_PROP_KEYS = /* @__PURE__ */ new Set([
|
|
576
|
-
"className",
|
|
577
|
-
"style",
|
|
578
|
-
"children",
|
|
579
|
-
"ref",
|
|
580
|
-
"key",
|
|
581
|
-
"render"
|
|
582
|
-
]);
|
|
575
|
+
var EXCLUDED_PROP_KEYS = /* @__PURE__ */ new Set(["className", "style", "children", "ref", "key", "render"]);
|
|
583
576
|
function serializePropValue(value) {
|
|
584
577
|
if (typeof value === "function") return "[function]";
|
|
585
578
|
if (typeof value === "symbol") return void 0;
|
|
@@ -690,19 +683,7 @@ function classifyComponentFiber(fiber, frames, elementSourceFile) {
|
|
|
690
683
|
return { isComponentPrimitive: false };
|
|
691
684
|
}
|
|
692
685
|
|
|
693
|
-
// src/utils.ts
|
|
694
|
-
function clamp(value, min, max) {
|
|
695
|
-
if (!Number.isFinite(value)) return min;
|
|
696
|
-
if (max < min) return min;
|
|
697
|
-
return Math.max(min, Math.min(max, value));
|
|
698
|
-
}
|
|
699
|
-
function isInputFocused() {
|
|
700
|
-
let active = document.activeElement;
|
|
701
|
-
while (active?.shadowRoot?.activeElement) {
|
|
702
|
-
active = active.shadowRoot.activeElement;
|
|
703
|
-
}
|
|
704
|
-
return active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || active instanceof HTMLElement && active.isContentEditable;
|
|
705
|
-
}
|
|
686
|
+
// src/utils/computed-styles.ts
|
|
706
687
|
function getComputedStyles(element) {
|
|
707
688
|
const computed = window.getComputedStyle(element);
|
|
708
689
|
return {
|
|
@@ -811,6 +792,255 @@ function getOriginalInlineStyles(element) {
|
|
|
811
792
|
}
|
|
812
793
|
return styles;
|
|
813
794
|
}
|
|
795
|
+
function getComputedTypography(element) {
|
|
796
|
+
const computed = window.getComputedStyle(element);
|
|
797
|
+
let textVerticalAlign = "flex-start";
|
|
798
|
+
if (computed.display === "flex" || computed.display === "inline-flex") {
|
|
799
|
+
const alignItems = computed.alignItems;
|
|
800
|
+
if (alignItems === "center") textVerticalAlign = "center";
|
|
801
|
+
else if (alignItems === "flex-end" || alignItems === "end") textVerticalAlign = "flex-end";
|
|
802
|
+
}
|
|
803
|
+
const lineHeight = computed.lineHeight === "normal" ? {
|
|
804
|
+
numericValue: parseFloat(computed.fontSize) * 1.2,
|
|
805
|
+
unit: "px",
|
|
806
|
+
raw: `${Math.round(parseFloat(computed.fontSize) * 1.2)}px`
|
|
807
|
+
} : parsePropertyValue(computed.lineHeight);
|
|
808
|
+
const fontSize = parseFloat(computed.fontSize);
|
|
809
|
+
let letterSpacing;
|
|
810
|
+
if (computed.letterSpacing === "normal") {
|
|
811
|
+
letterSpacing = { numericValue: 0, unit: "em", raw: "0em" };
|
|
812
|
+
} else {
|
|
813
|
+
const parsed = parsePropertyValue(computed.letterSpacing);
|
|
814
|
+
if (parsed.unit === "px" && fontSize > 0) {
|
|
815
|
+
const emValue = Math.round(parsed.numericValue / fontSize * 100) / 100;
|
|
816
|
+
letterSpacing = { numericValue: emValue, unit: "em", raw: `${emValue}em` };
|
|
817
|
+
} else {
|
|
818
|
+
letterSpacing = parsed;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
return {
|
|
822
|
+
fontFamily: computed.fontFamily,
|
|
823
|
+
fontWeight: computed.fontWeight,
|
|
824
|
+
fontSize: parsePropertyValue(computed.fontSize),
|
|
825
|
+
lineHeight,
|
|
826
|
+
letterSpacing,
|
|
827
|
+
textAlign: computed.textAlign,
|
|
828
|
+
textVerticalAlign
|
|
829
|
+
};
|
|
830
|
+
}
|
|
831
|
+
function getComputedSizing(element) {
|
|
832
|
+
return {
|
|
833
|
+
width: getSizingValue(element, "width"),
|
|
834
|
+
height: getSizingValue(element, "height")
|
|
835
|
+
};
|
|
836
|
+
}
|
|
837
|
+
var TEXT_ELEMENT_TAGS = /* @__PURE__ */ new Set([
|
|
838
|
+
"p",
|
|
839
|
+
"h1",
|
|
840
|
+
"h2",
|
|
841
|
+
"h3",
|
|
842
|
+
"h4",
|
|
843
|
+
"h5",
|
|
844
|
+
"h6",
|
|
845
|
+
"span",
|
|
846
|
+
"label",
|
|
847
|
+
"a",
|
|
848
|
+
"strong",
|
|
849
|
+
"em",
|
|
850
|
+
"small",
|
|
851
|
+
"blockquote",
|
|
852
|
+
"li",
|
|
853
|
+
"td",
|
|
854
|
+
"th",
|
|
855
|
+
"caption",
|
|
856
|
+
"figcaption",
|
|
857
|
+
"legend",
|
|
858
|
+
"dt",
|
|
859
|
+
"dd",
|
|
860
|
+
"abbr",
|
|
861
|
+
"cite",
|
|
862
|
+
"code",
|
|
863
|
+
"pre"
|
|
864
|
+
]);
|
|
865
|
+
function hasDirectNonWhitespaceText(element) {
|
|
866
|
+
return Array.from(element.childNodes).some(
|
|
867
|
+
(node) => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())
|
|
868
|
+
);
|
|
869
|
+
}
|
|
870
|
+
var TRANSPARENT_COLOR = { hex: "000000", alpha: 0, raw: "transparent" };
|
|
871
|
+
function isVisibleBorderSide(side) {
|
|
872
|
+
return side.style !== "none" && side.style !== "hidden" && parseFloat(side.width) > 0;
|
|
873
|
+
}
|
|
874
|
+
function hasVisibleOutline(computed) {
|
|
875
|
+
return computed.outlineStyle !== "none" && parseFloat(computed.outlineWidth) > 0;
|
|
876
|
+
}
|
|
877
|
+
function parseVisibleColor(value, fallbackCurrentColor) {
|
|
878
|
+
const raw = value.trim();
|
|
879
|
+
const lowered = raw.toLowerCase();
|
|
880
|
+
if (!raw || lowered === "none" || lowered === "transparent") {
|
|
881
|
+
return null;
|
|
882
|
+
}
|
|
883
|
+
const resolved = /^currentcolor$/i.test(raw) ? fallbackCurrentColor ?? raw : raw;
|
|
884
|
+
const parsed = parseColorValue(resolved);
|
|
885
|
+
if (parsed.alpha <= 0) {
|
|
886
|
+
return null;
|
|
887
|
+
}
|
|
888
|
+
return parsed;
|
|
889
|
+
}
|
|
890
|
+
function addUniqueColor(colors, color) {
|
|
891
|
+
if (!color) return;
|
|
892
|
+
colors.set(`${color.hex}:${color.alpha}`, color);
|
|
893
|
+
}
|
|
894
|
+
function isTextRenderingFormControl(element) {
|
|
895
|
+
if (element instanceof HTMLTextAreaElement) return true;
|
|
896
|
+
if (element instanceof HTMLSelectElement) return true;
|
|
897
|
+
if (element instanceof HTMLButtonElement) return true;
|
|
898
|
+
if (element instanceof HTMLInputElement) {
|
|
899
|
+
const textlessInputTypes = /* @__PURE__ */ new Set([
|
|
900
|
+
"hidden",
|
|
901
|
+
"checkbox",
|
|
902
|
+
"radio",
|
|
903
|
+
"range",
|
|
904
|
+
"color",
|
|
905
|
+
"file",
|
|
906
|
+
"image"
|
|
907
|
+
]);
|
|
908
|
+
return !textlessInputTypes.has(element.type.toLowerCase());
|
|
909
|
+
}
|
|
910
|
+
return false;
|
|
911
|
+
}
|
|
912
|
+
function hasRenderableTextNode(element) {
|
|
913
|
+
if (element.isContentEditable) return true;
|
|
914
|
+
if (isTextRenderingFormControl(element)) return true;
|
|
915
|
+
if (!element.textContent?.trim()) return false;
|
|
916
|
+
if (hasDirectNonWhitespaceText(element)) return true;
|
|
917
|
+
const tagName = element.tagName.toLowerCase();
|
|
918
|
+
return TEXT_ELEMENT_TAGS.has(tagName) || element.children.length === 0;
|
|
919
|
+
}
|
|
920
|
+
function getComputedBoxShadow(element) {
|
|
921
|
+
const computed = window.getComputedStyle(element);
|
|
922
|
+
const value = computed.boxShadow.trim();
|
|
923
|
+
return value || "none";
|
|
924
|
+
}
|
|
925
|
+
function getComputedColorStyles(element) {
|
|
926
|
+
const computed = window.getComputedStyle(element);
|
|
927
|
+
const borderSides = [
|
|
928
|
+
{
|
|
929
|
+
style: computed.borderTopStyle,
|
|
930
|
+
width: computed.borderTopWidth,
|
|
931
|
+
color: computed.borderTopColor
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
style: computed.borderRightStyle,
|
|
935
|
+
width: computed.borderRightWidth,
|
|
936
|
+
color: computed.borderRightColor
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
style: computed.borderBottomStyle,
|
|
940
|
+
width: computed.borderBottomWidth,
|
|
941
|
+
color: computed.borderBottomColor
|
|
942
|
+
},
|
|
943
|
+
{
|
|
944
|
+
style: computed.borderLeftStyle,
|
|
945
|
+
width: computed.borderLeftWidth,
|
|
946
|
+
color: computed.borderLeftColor
|
|
947
|
+
}
|
|
948
|
+
];
|
|
949
|
+
const visibleBorderSide = borderSides.find((side) => isVisibleBorderSide(side));
|
|
950
|
+
const hasBorder = Boolean(visibleBorderSide);
|
|
951
|
+
const hasOutline = hasVisibleOutline(computed);
|
|
952
|
+
return {
|
|
953
|
+
backgroundColor: parseColorValue(computed.backgroundColor),
|
|
954
|
+
color: parseColorValue(computed.color),
|
|
955
|
+
borderColor: hasBorder && visibleBorderSide ? parseColorValue(visibleBorderSide.color) : TRANSPARENT_COLOR,
|
|
956
|
+
outlineColor: hasOutline ? parseColorValue(computed.outlineColor) : TRANSPARENT_COLOR
|
|
957
|
+
};
|
|
958
|
+
}
|
|
959
|
+
function getSelectionColors(element) {
|
|
960
|
+
const uniqueColors = /* @__PURE__ */ new Map();
|
|
961
|
+
const queue = [element];
|
|
962
|
+
for (let index = 0; index < queue.length; index++) {
|
|
963
|
+
const node = queue[index];
|
|
964
|
+
const computed = window.getComputedStyle(node);
|
|
965
|
+
if (computed.display === "none") {
|
|
966
|
+
continue;
|
|
967
|
+
}
|
|
968
|
+
const isVisibilityHidden = computed.visibility === "hidden" || computed.visibility === "collapse";
|
|
969
|
+
const currentTextColor = computed.color;
|
|
970
|
+
if (!isVisibilityHidden) {
|
|
971
|
+
addUniqueColor(uniqueColors, parseVisibleColor(computed.backgroundColor));
|
|
972
|
+
if (node instanceof HTMLElement && hasRenderableTextNode(node)) {
|
|
973
|
+
addUniqueColor(uniqueColors, parseVisibleColor(currentTextColor));
|
|
974
|
+
}
|
|
975
|
+
const borderSides = [
|
|
976
|
+
{
|
|
977
|
+
style: computed.borderTopStyle,
|
|
978
|
+
width: computed.borderTopWidth,
|
|
979
|
+
color: computed.borderTopColor
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
style: computed.borderRightStyle,
|
|
983
|
+
width: computed.borderRightWidth,
|
|
984
|
+
color: computed.borderRightColor
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
style: computed.borderBottomStyle,
|
|
988
|
+
width: computed.borderBottomWidth,
|
|
989
|
+
color: computed.borderBottomColor
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
style: computed.borderLeftStyle,
|
|
993
|
+
width: computed.borderLeftWidth,
|
|
994
|
+
color: computed.borderLeftColor
|
|
995
|
+
}
|
|
996
|
+
];
|
|
997
|
+
for (const side of borderSides) {
|
|
998
|
+
if (!isVisibleBorderSide(side)) continue;
|
|
999
|
+
addUniqueColor(uniqueColors, parseVisibleColor(side.color, currentTextColor));
|
|
1000
|
+
}
|
|
1001
|
+
if (hasVisibleOutline(computed)) {
|
|
1002
|
+
addUniqueColor(uniqueColors, parseVisibleColor(computed.outlineColor, currentTextColor));
|
|
1003
|
+
}
|
|
1004
|
+
if (node instanceof SVGElement) {
|
|
1005
|
+
const fillColor = parseVisibleColor(computed.getPropertyValue("fill"), currentTextColor) ?? parseVisibleColor(node.getAttribute("fill") ?? "", currentTextColor);
|
|
1006
|
+
const strokeColor = parseVisibleColor(computed.getPropertyValue("stroke"), currentTextColor) ?? parseVisibleColor(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
1007
|
+
addUniqueColor(uniqueColors, fillColor);
|
|
1008
|
+
addUniqueColor(uniqueColors, strokeColor);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
for (const child of node.children) {
|
|
1012
|
+
queue.push(child);
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
return Array.from(uniqueColors.values());
|
|
1016
|
+
}
|
|
1017
|
+
function getAllComputedStyles(element) {
|
|
1018
|
+
const { spacing, borderRadius, flex } = getComputedStyles(element);
|
|
1019
|
+
return {
|
|
1020
|
+
spacing,
|
|
1021
|
+
borderRadius,
|
|
1022
|
+
border: getComputedBorderStyles(element),
|
|
1023
|
+
flex,
|
|
1024
|
+
sizing: getComputedSizing(element),
|
|
1025
|
+
color: getComputedColorStyles(element),
|
|
1026
|
+
boxShadow: getComputedBoxShadow(element),
|
|
1027
|
+
typography: getComputedTypography(element)
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
// src/utils.ts
|
|
1032
|
+
function clamp(value, min, max) {
|
|
1033
|
+
if (!Number.isFinite(value)) return min;
|
|
1034
|
+
if (max < min) return min;
|
|
1035
|
+
return Math.max(min, Math.min(max, value));
|
|
1036
|
+
}
|
|
1037
|
+
function isInputFocused() {
|
|
1038
|
+
let active = document.activeElement;
|
|
1039
|
+
while (active?.shadowRoot?.activeElement) {
|
|
1040
|
+
active = active.shadowRoot.activeElement;
|
|
1041
|
+
}
|
|
1042
|
+
return active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || active instanceof HTMLElement && active.isContentEditable;
|
|
1043
|
+
}
|
|
814
1044
|
var spacingScale = { 0: "0", 1: "px", 2: "0.5", 4: "1", 8: "2", 12: "3", 16: "4", 20: "5", 24: "6", 32: "8" };
|
|
815
1045
|
var tailwindClassMap = {
|
|
816
1046
|
padding: { prefix: "p", scale: spacingScale },
|
|
@@ -1137,7 +1367,7 @@ var typographyPropertyToCSSMap = {
|
|
|
1137
1367
|
textAlign: "text-align",
|
|
1138
1368
|
textVerticalAlign: "align-items"
|
|
1139
1369
|
};
|
|
1140
|
-
var
|
|
1370
|
+
var TEXT_ELEMENT_TAGS2 = /* @__PURE__ */ new Set([
|
|
1141
1371
|
"p",
|
|
1142
1372
|
"h1",
|
|
1143
1373
|
"h2",
|
|
@@ -1165,17 +1395,17 @@ var TEXT_ELEMENT_TAGS = /* @__PURE__ */ new Set([
|
|
|
1165
1395
|
"code",
|
|
1166
1396
|
"pre"
|
|
1167
1397
|
]);
|
|
1168
|
-
function
|
|
1398
|
+
function hasDirectNonWhitespaceText2(element) {
|
|
1169
1399
|
return Array.from(element.childNodes).some(
|
|
1170
1400
|
(node) => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())
|
|
1171
1401
|
);
|
|
1172
1402
|
}
|
|
1173
1403
|
function isTextElement2(element) {
|
|
1174
1404
|
const tagName = element.tagName.toLowerCase();
|
|
1175
|
-
if (
|
|
1405
|
+
if (TEXT_ELEMENT_TAGS2.has(tagName)) {
|
|
1176
1406
|
return true;
|
|
1177
1407
|
}
|
|
1178
|
-
if (
|
|
1408
|
+
if (hasDirectNonWhitespaceText2(element)) {
|
|
1179
1409
|
return true;
|
|
1180
1410
|
}
|
|
1181
1411
|
if (element.children.length === 0 && element.textContent?.trim()) {
|
|
@@ -1183,38 +1413,6 @@ function isTextElement2(element) {
|
|
|
1183
1413
|
}
|
|
1184
1414
|
return false;
|
|
1185
1415
|
}
|
|
1186
|
-
function getComputedTypography(element) {
|
|
1187
|
-
const computed = window.getComputedStyle(element);
|
|
1188
|
-
let textVerticalAlign = "flex-start";
|
|
1189
|
-
if (computed.display === "flex" || computed.display === "inline-flex") {
|
|
1190
|
-
const alignItems = computed.alignItems;
|
|
1191
|
-
if (alignItems === "center") textVerticalAlign = "center";
|
|
1192
|
-
else if (alignItems === "flex-end" || alignItems === "end") textVerticalAlign = "flex-end";
|
|
1193
|
-
}
|
|
1194
|
-
const lineHeight = computed.lineHeight === "normal" ? { numericValue: parseFloat(computed.fontSize) * 1.2, unit: "px", raw: `${Math.round(parseFloat(computed.fontSize) * 1.2)}px` } : parsePropertyValue(computed.lineHeight);
|
|
1195
|
-
const fontSize = parseFloat(computed.fontSize);
|
|
1196
|
-
let letterSpacing;
|
|
1197
|
-
if (computed.letterSpacing === "normal") {
|
|
1198
|
-
letterSpacing = { numericValue: 0, unit: "em", raw: "0em" };
|
|
1199
|
-
} else {
|
|
1200
|
-
const parsed = parsePropertyValue(computed.letterSpacing);
|
|
1201
|
-
if (parsed.unit === "px" && fontSize > 0) {
|
|
1202
|
-
const emValue = Math.round(parsed.numericValue / fontSize * 100) / 100;
|
|
1203
|
-
letterSpacing = { numericValue: emValue, unit: "em", raw: `${emValue}em` };
|
|
1204
|
-
} else {
|
|
1205
|
-
letterSpacing = parsed;
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
return {
|
|
1209
|
-
fontFamily: computed.fontFamily,
|
|
1210
|
-
fontWeight: computed.fontWeight,
|
|
1211
|
-
fontSize: parsePropertyValue(computed.fontSize),
|
|
1212
|
-
lineHeight,
|
|
1213
|
-
letterSpacing,
|
|
1214
|
-
textAlign: computed.textAlign,
|
|
1215
|
-
textVerticalAlign
|
|
1216
|
-
};
|
|
1217
|
-
}
|
|
1218
1416
|
function detectSizingMode(element, dimension) {
|
|
1219
1417
|
const computed = window.getComputedStyle(element);
|
|
1220
1418
|
const inlineValue = element.style[dimension];
|
|
@@ -1262,12 +1460,6 @@ function getSizingValue(element, dimension) {
|
|
|
1262
1460
|
}
|
|
1263
1461
|
};
|
|
1264
1462
|
}
|
|
1265
|
-
function getComputedSizing(element) {
|
|
1266
|
-
return {
|
|
1267
|
-
width: getSizingValue(element, "width"),
|
|
1268
|
-
height: getSizingValue(element, "height")
|
|
1269
|
-
};
|
|
1270
|
-
}
|
|
1271
1463
|
function sizingValueToCSS(sizing) {
|
|
1272
1464
|
switch (sizing.mode) {
|
|
1273
1465
|
case "fill":
|
|
@@ -1307,202 +1499,74 @@ function parseRgbAlpha(value) {
|
|
|
1307
1499
|
const token = value.trim();
|
|
1308
1500
|
if (token.endsWith("%")) {
|
|
1309
1501
|
const numeric2 = parseFloat(token.slice(0, -1));
|
|
1310
|
-
if (!Number.isFinite(numeric2)) return null;
|
|
1311
|
-
return Math.max(0, Math.min(100, numeric2)) / 100;
|
|
1312
|
-
}
|
|
1313
|
-
const numeric = parseFloat(token);
|
|
1314
|
-
if (!Number.isFinite(numeric)) return null;
|
|
1315
|
-
return Math.max(0, Math.min(1, numeric));
|
|
1316
|
-
}
|
|
1317
|
-
function parseRgbaColor(rgba) {
|
|
1318
|
-
const raw = rgba.trim();
|
|
1319
|
-
const fnMatch = raw.match(/^rgba?\((.*)\)$/i);
|
|
1320
|
-
if (!fnMatch) {
|
|
1321
|
-
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1322
|
-
}
|
|
1323
|
-
const body = fnMatch[1].trim();
|
|
1324
|
-
let channelTokens = null;
|
|
1325
|
-
let alphaToken;
|
|
1326
|
-
const commaParts = body.split(",").map((part) => part.trim()).filter(Boolean);
|
|
1327
|
-
if (commaParts.length === 3 || commaParts.length === 4) {
|
|
1328
|
-
channelTokens = [commaParts[0], commaParts[1], commaParts[2]];
|
|
1329
|
-
alphaToken = commaParts[3];
|
|
1330
|
-
} else {
|
|
1331
|
-
const slashParts = body.split("/");
|
|
1332
|
-
if (slashParts.length === 1 || slashParts.length === 2) {
|
|
1333
|
-
const channels = slashParts[0].trim().split(/\s+/).filter(Boolean);
|
|
1334
|
-
if (channels.length === 3) {
|
|
1335
|
-
channelTokens = [channels[0], channels[1], channels[2]];
|
|
1336
|
-
alphaToken = slashParts[1]?.trim();
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
if (!channelTokens) {
|
|
1341
|
-
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1342
|
-
}
|
|
1343
|
-
const r = parseRgbChannel(channelTokens[0]);
|
|
1344
|
-
const g = parseRgbChannel(channelTokens[1]);
|
|
1345
|
-
const b = parseRgbChannel(channelTokens[2]);
|
|
1346
|
-
const a = parseRgbAlpha(alphaToken);
|
|
1347
|
-
if (r === null || g === null || b === null || a === null) {
|
|
1348
|
-
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1349
|
-
}
|
|
1350
|
-
const hex = [r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1351
|
-
const alpha = Math.round(a * 100);
|
|
1352
|
-
return { hex, alpha, raw: rgba };
|
|
1353
|
-
}
|
|
1354
|
-
function parseNamedColor(name) {
|
|
1355
|
-
const ctx = document.createElement("canvas").getContext("2d");
|
|
1356
|
-
if (!ctx) {
|
|
1357
|
-
return { hex: "000000", alpha: 100, raw: name };
|
|
1358
|
-
}
|
|
1359
|
-
ctx.fillStyle = name;
|
|
1360
|
-
const computed = ctx.fillStyle;
|
|
1361
|
-
if (computed.startsWith("#")) {
|
|
1362
|
-
return parseHexColor(computed);
|
|
1363
|
-
}
|
|
1364
|
-
return parseRgbaColor(computed);
|
|
1365
|
-
}
|
|
1366
|
-
function parseColorValue(cssValue) {
|
|
1367
|
-
const raw = cssValue.trim();
|
|
1368
|
-
if (raw === "transparent") {
|
|
1369
|
-
return { hex: "000000", alpha: 0, raw };
|
|
1370
|
-
}
|
|
1371
|
-
if (raw.startsWith("#")) {
|
|
1372
|
-
return parseHexColor(raw);
|
|
1373
|
-
}
|
|
1374
|
-
if (raw.startsWith("rgb")) {
|
|
1375
|
-
return parseRgbaColor(raw);
|
|
1376
|
-
}
|
|
1377
|
-
return parseNamedColor(raw);
|
|
1378
|
-
}
|
|
1379
|
-
var TRANSPARENT_COLOR = { hex: "000000", alpha: 0, raw: "transparent" };
|
|
1380
|
-
function isVisibleBorderSide(side) {
|
|
1381
|
-
return side.style !== "none" && side.style !== "hidden" && parseFloat(side.width) > 0;
|
|
1382
|
-
}
|
|
1383
|
-
function hasVisibleOutline(computed) {
|
|
1384
|
-
return computed.outlineStyle !== "none" && parseFloat(computed.outlineWidth) > 0;
|
|
1385
|
-
}
|
|
1386
|
-
function parseVisibleColor(value, fallbackCurrentColor) {
|
|
1387
|
-
const raw = value.trim();
|
|
1388
|
-
const lowered = raw.toLowerCase();
|
|
1389
|
-
if (!raw || lowered === "none" || lowered === "transparent") {
|
|
1390
|
-
return null;
|
|
1391
|
-
}
|
|
1392
|
-
const resolved = /^currentcolor$/i.test(raw) ? fallbackCurrentColor ?? raw : raw;
|
|
1393
|
-
const parsed = parseColorValue(resolved);
|
|
1394
|
-
if (parsed.alpha <= 0) {
|
|
1395
|
-
return null;
|
|
1396
|
-
}
|
|
1397
|
-
return parsed;
|
|
1398
|
-
}
|
|
1399
|
-
function addUniqueColor(colors, color) {
|
|
1400
|
-
if (!color) return;
|
|
1401
|
-
colors.set(`${color.hex}:${color.alpha}`, color);
|
|
1402
|
-
}
|
|
1403
|
-
function isTextRenderingFormControl(element) {
|
|
1404
|
-
if (element instanceof HTMLTextAreaElement) return true;
|
|
1405
|
-
if (element instanceof HTMLSelectElement) return true;
|
|
1406
|
-
if (element instanceof HTMLButtonElement) return true;
|
|
1407
|
-
if (element instanceof HTMLInputElement) {
|
|
1408
|
-
const textlessInputTypes = /* @__PURE__ */ new Set([
|
|
1409
|
-
"hidden",
|
|
1410
|
-
"checkbox",
|
|
1411
|
-
"radio",
|
|
1412
|
-
"range",
|
|
1413
|
-
"color",
|
|
1414
|
-
"file",
|
|
1415
|
-
"image"
|
|
1416
|
-
]);
|
|
1417
|
-
return !textlessInputTypes.has(element.type.toLowerCase());
|
|
1418
|
-
}
|
|
1419
|
-
return false;
|
|
1420
|
-
}
|
|
1421
|
-
function hasRenderableTextNode(element) {
|
|
1422
|
-
if (element.isContentEditable) return true;
|
|
1423
|
-
if (isTextRenderingFormControl(element)) return true;
|
|
1424
|
-
if (!element.textContent?.trim()) return false;
|
|
1425
|
-
if (hasDirectNonWhitespaceText(element)) return true;
|
|
1426
|
-
const tagName = element.tagName.toLowerCase();
|
|
1427
|
-
return TEXT_ELEMENT_TAGS.has(tagName) || element.children.length === 0;
|
|
1428
|
-
}
|
|
1429
|
-
function getComputedBoxShadow(element) {
|
|
1430
|
-
const computed = window.getComputedStyle(element);
|
|
1431
|
-
const value = computed.boxShadow.trim();
|
|
1432
|
-
return value || "none";
|
|
1433
|
-
}
|
|
1434
|
-
function getComputedColorStyles(element) {
|
|
1435
|
-
const computed = window.getComputedStyle(element);
|
|
1436
|
-
const borderSides = [
|
|
1437
|
-
{ style: computed.borderTopStyle, width: computed.borderTopWidth, color: computed.borderTopColor },
|
|
1438
|
-
{ style: computed.borderRightStyle, width: computed.borderRightWidth, color: computed.borderRightColor },
|
|
1439
|
-
{ style: computed.borderBottomStyle, width: computed.borderBottomWidth, color: computed.borderBottomColor },
|
|
1440
|
-
{ style: computed.borderLeftStyle, width: computed.borderLeftWidth, color: computed.borderLeftColor }
|
|
1441
|
-
];
|
|
1442
|
-
const visibleBorderSide = borderSides.find((side) => isVisibleBorderSide(side));
|
|
1443
|
-
const hasBorder = Boolean(visibleBorderSide);
|
|
1444
|
-
const hasOutline = hasVisibleOutline(computed);
|
|
1445
|
-
return {
|
|
1446
|
-
backgroundColor: parseColorValue(computed.backgroundColor),
|
|
1447
|
-
color: parseColorValue(computed.color),
|
|
1448
|
-
borderColor: hasBorder && visibleBorderSide ? parseColorValue(visibleBorderSide.color) : TRANSPARENT_COLOR,
|
|
1449
|
-
outlineColor: hasOutline ? parseColorValue(computed.outlineColor) : TRANSPARENT_COLOR
|
|
1450
|
-
};
|
|
1502
|
+
if (!Number.isFinite(numeric2)) return null;
|
|
1503
|
+
return Math.max(0, Math.min(100, numeric2)) / 100;
|
|
1504
|
+
}
|
|
1505
|
+
const numeric = parseFloat(token);
|
|
1506
|
+
if (!Number.isFinite(numeric)) return null;
|
|
1507
|
+
return Math.max(0, Math.min(1, numeric));
|
|
1451
1508
|
}
|
|
1452
|
-
function
|
|
1453
|
-
const
|
|
1454
|
-
const
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
const
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
{ style: computed.borderLeftStyle, width: computed.borderLeftWidth, color: computed.borderLeftColor }
|
|
1473
|
-
];
|
|
1474
|
-
for (const side of borderSides) {
|
|
1475
|
-
if (!isVisibleBorderSide(side)) continue;
|
|
1476
|
-
addUniqueColor(uniqueColors, parseVisibleColor(side.color, currentTextColor));
|
|
1477
|
-
}
|
|
1478
|
-
if (hasVisibleOutline(computed)) {
|
|
1479
|
-
addUniqueColor(uniqueColors, parseVisibleColor(computed.outlineColor, currentTextColor));
|
|
1480
|
-
}
|
|
1481
|
-
if (node instanceof SVGElement) {
|
|
1482
|
-
const fillColor = parseVisibleColor(computed.getPropertyValue("fill"), currentTextColor) ?? parseVisibleColor(node.getAttribute("fill") ?? "", currentTextColor);
|
|
1483
|
-
const strokeColor = parseVisibleColor(computed.getPropertyValue("stroke"), currentTextColor) ?? parseVisibleColor(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
1484
|
-
addUniqueColor(uniqueColors, fillColor);
|
|
1485
|
-
addUniqueColor(uniqueColors, strokeColor);
|
|
1509
|
+
function parseRgbaColor(rgba) {
|
|
1510
|
+
const raw = rgba.trim();
|
|
1511
|
+
const fnMatch = raw.match(/^rgba?\((.*)\)$/i);
|
|
1512
|
+
if (!fnMatch) {
|
|
1513
|
+
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1514
|
+
}
|
|
1515
|
+
const body = fnMatch[1].trim();
|
|
1516
|
+
let channelTokens = null;
|
|
1517
|
+
let alphaToken;
|
|
1518
|
+
const commaParts = body.split(",").map((part) => part.trim()).filter(Boolean);
|
|
1519
|
+
if (commaParts.length === 3 || commaParts.length === 4) {
|
|
1520
|
+
channelTokens = [commaParts[0], commaParts[1], commaParts[2]];
|
|
1521
|
+
alphaToken = commaParts[3];
|
|
1522
|
+
} else {
|
|
1523
|
+
const slashParts = body.split("/");
|
|
1524
|
+
if (slashParts.length === 1 || slashParts.length === 2) {
|
|
1525
|
+
const channels = slashParts[0].trim().split(/\s+/).filter(Boolean);
|
|
1526
|
+
if (channels.length === 3) {
|
|
1527
|
+
channelTokens = [channels[0], channels[1], channels[2]];
|
|
1528
|
+
alphaToken = slashParts[1]?.trim();
|
|
1486
1529
|
}
|
|
1487
1530
|
}
|
|
1488
|
-
for (const child of node.children) {
|
|
1489
|
-
queue.push(child);
|
|
1490
|
-
}
|
|
1491
1531
|
}
|
|
1492
|
-
|
|
1532
|
+
if (!channelTokens) {
|
|
1533
|
+
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1534
|
+
}
|
|
1535
|
+
const r = parseRgbChannel(channelTokens[0]);
|
|
1536
|
+
const g = parseRgbChannel(channelTokens[1]);
|
|
1537
|
+
const b = parseRgbChannel(channelTokens[2]);
|
|
1538
|
+
const a = parseRgbAlpha(alphaToken);
|
|
1539
|
+
if (r === null || g === null || b === null || a === null) {
|
|
1540
|
+
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1541
|
+
}
|
|
1542
|
+
const hex = [r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1543
|
+
const alpha = Math.round(a * 100);
|
|
1544
|
+
return { hex, alpha, raw: rgba };
|
|
1493
1545
|
}
|
|
1494
|
-
function
|
|
1495
|
-
const
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1546
|
+
function parseNamedColor(name) {
|
|
1547
|
+
const ctx = document.createElement("canvas").getContext("2d");
|
|
1548
|
+
if (!ctx) {
|
|
1549
|
+
return { hex: "000000", alpha: 100, raw: name };
|
|
1550
|
+
}
|
|
1551
|
+
ctx.fillStyle = name;
|
|
1552
|
+
const computed = ctx.fillStyle;
|
|
1553
|
+
if (computed.startsWith("#")) {
|
|
1554
|
+
return parseHexColor(computed);
|
|
1555
|
+
}
|
|
1556
|
+
return parseRgbaColor(computed);
|
|
1557
|
+
}
|
|
1558
|
+
function parseColorValue(cssValue) {
|
|
1559
|
+
const raw = cssValue.trim();
|
|
1560
|
+
if (raw === "transparent") {
|
|
1561
|
+
return { hex: "000000", alpha: 0, raw };
|
|
1562
|
+
}
|
|
1563
|
+
if (raw.startsWith("#")) {
|
|
1564
|
+
return parseHexColor(raw);
|
|
1565
|
+
}
|
|
1566
|
+
if (raw.startsWith("rgb")) {
|
|
1567
|
+
return parseRgbaColor(raw);
|
|
1568
|
+
}
|
|
1569
|
+
return parseNamedColor(raw);
|
|
1506
1570
|
}
|
|
1507
1571
|
var colorPropertyToCSSMap = {
|
|
1508
1572
|
backgroundColor: "background-color",
|
|
@@ -1958,7 +2022,7 @@ function findChildAtPoint(parent, clientX, clientY) {
|
|
|
1958
2022
|
return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom;
|
|
1959
2023
|
});
|
|
1960
2024
|
if (hit) return hit;
|
|
1961
|
-
if (children.length === 1 && !
|
|
2025
|
+
if (children.length === 1 && !hasDirectNonWhitespaceText2(parent)) return children[0];
|
|
1962
2026
|
return null;
|
|
1963
2027
|
}
|
|
1964
2028
|
function elementFromPointWithoutOverlays(x, y) {
|
|
@@ -7761,6 +7825,219 @@ function createDragInteractionGuard() {
|
|
|
7761
7825
|
};
|
|
7762
7826
|
}
|
|
7763
7827
|
|
|
7828
|
+
// src/utils/resize-geometry.ts
|
|
7829
|
+
function toFinite(value, fallback) {
|
|
7830
|
+
if (!Number.isFinite(value)) return fallback;
|
|
7831
|
+
return value;
|
|
7832
|
+
}
|
|
7833
|
+
function multiplyMatrix(left, right) {
|
|
7834
|
+
return {
|
|
7835
|
+
a: left.a * right.a + left.c * right.b,
|
|
7836
|
+
b: left.b * right.a + left.d * right.b,
|
|
7837
|
+
c: left.a * right.c + left.c * right.d,
|
|
7838
|
+
d: left.b * right.c + left.d * right.d
|
|
7839
|
+
};
|
|
7840
|
+
}
|
|
7841
|
+
function splitTransformArgs(raw) {
|
|
7842
|
+
return raw.trim().replace(/,/g, " ").split(/\s+/).filter(Boolean);
|
|
7843
|
+
}
|
|
7844
|
+
function parseAngleRadians(value) {
|
|
7845
|
+
const numeric = Number.parseFloat(value);
|
|
7846
|
+
if (!Number.isFinite(numeric)) return 0;
|
|
7847
|
+
const unit = value.trim().replace(String(numeric), "").trim().toLowerCase();
|
|
7848
|
+
switch (unit) {
|
|
7849
|
+
case "rad":
|
|
7850
|
+
return numeric;
|
|
7851
|
+
case "turn":
|
|
7852
|
+
return numeric * Math.PI * 2;
|
|
7853
|
+
case "grad":
|
|
7854
|
+
return numeric * Math.PI / 200;
|
|
7855
|
+
case "deg":
|
|
7856
|
+
case "":
|
|
7857
|
+
default:
|
|
7858
|
+
return numeric * Math.PI / 180;
|
|
7859
|
+
}
|
|
7860
|
+
}
|
|
7861
|
+
function parseTransformFunction(name, rawArgs) {
|
|
7862
|
+
const args = splitTransformArgs(rawArgs);
|
|
7863
|
+
switch (name.toLowerCase()) {
|
|
7864
|
+
case "matrix": {
|
|
7865
|
+
if (args.length < 4) return null;
|
|
7866
|
+
const [a, b, c, d] = args.map(Number.parseFloat);
|
|
7867
|
+
if (![a, b, c, d].every(Number.isFinite)) return null;
|
|
7868
|
+
return { a, b, c, d };
|
|
7869
|
+
}
|
|
7870
|
+
case "matrix3d": {
|
|
7871
|
+
if (args.length < 16) return null;
|
|
7872
|
+
const values = args.map(Number.parseFloat);
|
|
7873
|
+
if (!values.every(Number.isFinite)) return null;
|
|
7874
|
+
return { a: values[0], b: values[1], c: values[4], d: values[5] };
|
|
7875
|
+
}
|
|
7876
|
+
case "scale": {
|
|
7877
|
+
const scaleX = Number.parseFloat(args[0] ?? "1");
|
|
7878
|
+
const scaleY = Number.parseFloat(args[1] ?? args[0] ?? "1");
|
|
7879
|
+
if (!Number.isFinite(scaleX) || !Number.isFinite(scaleY)) return null;
|
|
7880
|
+
return { a: scaleX, b: 0, c: 0, d: scaleY };
|
|
7881
|
+
}
|
|
7882
|
+
case "scalex": {
|
|
7883
|
+
const scaleX = Number.parseFloat(args[0] ?? "1");
|
|
7884
|
+
if (!Number.isFinite(scaleX)) return null;
|
|
7885
|
+
return { a: scaleX, b: 0, c: 0, d: 1 };
|
|
7886
|
+
}
|
|
7887
|
+
case "scaley": {
|
|
7888
|
+
const scaleY = Number.parseFloat(args[0] ?? "1");
|
|
7889
|
+
if (!Number.isFinite(scaleY)) return null;
|
|
7890
|
+
return { a: 1, b: 0, c: 0, d: scaleY };
|
|
7891
|
+
}
|
|
7892
|
+
case "rotate": {
|
|
7893
|
+
const angle = parseAngleRadians(args[0] ?? "0deg");
|
|
7894
|
+
const cos = Math.cos(angle);
|
|
7895
|
+
const sin = Math.sin(angle);
|
|
7896
|
+
return { a: cos, b: sin, c: -sin, d: cos };
|
|
7897
|
+
}
|
|
7898
|
+
case "translate":
|
|
7899
|
+
case "translatex":
|
|
7900
|
+
case "translatey":
|
|
7901
|
+
return { a: 1, b: 0, c: 0, d: 1 };
|
|
7902
|
+
default:
|
|
7903
|
+
return null;
|
|
7904
|
+
}
|
|
7905
|
+
}
|
|
7906
|
+
function parseTransformMatrix(transform) {
|
|
7907
|
+
const functionPattern = /([a-zA-Z0-9]+)\(([^)]*)\)/g;
|
|
7908
|
+
let matrix = { a: 1, b: 0, c: 0, d: 1 };
|
|
7909
|
+
let matched = false;
|
|
7910
|
+
for (const match of transform.matchAll(functionPattern)) {
|
|
7911
|
+
const next = parseTransformFunction(match[1], match[2]);
|
|
7912
|
+
if (!next) return null;
|
|
7913
|
+
matrix = multiplyMatrix(matrix, next);
|
|
7914
|
+
matched = true;
|
|
7915
|
+
}
|
|
7916
|
+
return matched ? matrix : null;
|
|
7917
|
+
}
|
|
7918
|
+
function scaleFromMatrix(matrix) {
|
|
7919
|
+
return {
|
|
7920
|
+
scaleX: Math.hypot(matrix.a, matrix.b) || 1,
|
|
7921
|
+
scaleY: Math.hypot(matrix.c, matrix.d) || 1
|
|
7922
|
+
};
|
|
7923
|
+
}
|
|
7924
|
+
function getRenderedOffsetScale(element) {
|
|
7925
|
+
const rect = element.getBoundingClientRect();
|
|
7926
|
+
const width = element.offsetWidth;
|
|
7927
|
+
const height = element.offsetHeight;
|
|
7928
|
+
if (width <= 0 || height <= 0 || rect.width <= 0 || rect.height <= 0) return null;
|
|
7929
|
+
return {
|
|
7930
|
+
scaleX: rect.width / width,
|
|
7931
|
+
scaleY: rect.height / height
|
|
7932
|
+
};
|
|
7933
|
+
}
|
|
7934
|
+
function clampSize(value, minSize = 1) {
|
|
7935
|
+
const safeMin = Math.max(1, toFinite(minSize, 1));
|
|
7936
|
+
const safeValue = toFinite(value, safeMin);
|
|
7937
|
+
return Math.max(safeMin, safeValue);
|
|
7938
|
+
}
|
|
7939
|
+
function getElementScale(element) {
|
|
7940
|
+
const transform = getComputedStyle(element).transform;
|
|
7941
|
+
if (!transform || transform === "none") {
|
|
7942
|
+
return getRenderedOffsetScale(element) ?? { scaleX: 1, scaleY: 1 };
|
|
7943
|
+
}
|
|
7944
|
+
let transformMatrix = null;
|
|
7945
|
+
if (typeof DOMMatrix !== "undefined") {
|
|
7946
|
+
try {
|
|
7947
|
+
const matrix = new DOMMatrix(transform);
|
|
7948
|
+
transformMatrix = matrix;
|
|
7949
|
+
} catch {
|
|
7950
|
+
}
|
|
7951
|
+
}
|
|
7952
|
+
transformMatrix = transformMatrix ?? parseTransformMatrix(transform);
|
|
7953
|
+
if (!transformMatrix) return getRenderedOffsetScale(element) ?? { scaleX: 1, scaleY: 1 };
|
|
7954
|
+
const localScale = scaleFromMatrix(transformMatrix);
|
|
7955
|
+
const rect = element.getBoundingClientRect();
|
|
7956
|
+
const width = element.offsetWidth;
|
|
7957
|
+
const height = element.offsetHeight;
|
|
7958
|
+
if (width <= 0 || height <= 0 || rect.width <= 0 || rect.height <= 0) return localScale;
|
|
7959
|
+
const transformedWidth = Math.abs(transformMatrix.a) * width + Math.abs(transformMatrix.c) * height;
|
|
7960
|
+
const transformedHeight = Math.abs(transformMatrix.b) * width + Math.abs(transformMatrix.d) * height;
|
|
7961
|
+
if (transformedWidth <= 0 || transformedHeight <= 0) return localScale;
|
|
7962
|
+
return {
|
|
7963
|
+
scaleX: rect.width / transformedWidth * localScale.scaleX,
|
|
7964
|
+
scaleY: rect.height / transformedHeight * localScale.scaleY
|
|
7965
|
+
};
|
|
7966
|
+
}
|
|
7967
|
+
function computeEdgeSize({
|
|
7968
|
+
handle,
|
|
7969
|
+
startWidth,
|
|
7970
|
+
startHeight,
|
|
7971
|
+
dx,
|
|
7972
|
+
dy,
|
|
7973
|
+
minSize = 1
|
|
7974
|
+
}) {
|
|
7975
|
+
const baseWidth = clampSize(startWidth, minSize);
|
|
7976
|
+
const baseHeight = clampSize(startHeight, minSize);
|
|
7977
|
+
switch (handle) {
|
|
7978
|
+
case "right":
|
|
7979
|
+
return { width: clampSize(baseWidth + dx, minSize), height: baseHeight };
|
|
7980
|
+
case "left":
|
|
7981
|
+
return { width: clampSize(baseWidth - dx, minSize), height: baseHeight };
|
|
7982
|
+
case "bottom":
|
|
7983
|
+
return { width: baseWidth, height: clampSize(baseHeight + dy, minSize) };
|
|
7984
|
+
case "top":
|
|
7985
|
+
return { width: baseWidth, height: clampSize(baseHeight - dy, minSize) };
|
|
7986
|
+
}
|
|
7987
|
+
}
|
|
7988
|
+
function computeCornerProportionalSize({
|
|
7989
|
+
handle,
|
|
7990
|
+
startWidth,
|
|
7991
|
+
startHeight,
|
|
7992
|
+
dx,
|
|
7993
|
+
dy,
|
|
7994
|
+
minSize = 1
|
|
7995
|
+
}) {
|
|
7996
|
+
const baseWidth = clampSize(startWidth, minSize);
|
|
7997
|
+
const baseHeight = clampSize(startHeight, minSize);
|
|
7998
|
+
const ratio = baseWidth > 0 && baseHeight > 0 ? baseWidth / baseHeight : 1;
|
|
7999
|
+
const widthSign = handle === "top-left" || handle === "bottom-left" ? -1 : 1;
|
|
8000
|
+
const heightSign = handle === "top-left" || handle === "top-right" ? -1 : 1;
|
|
8001
|
+
const rawWidth = baseWidth + widthSign * dx;
|
|
8002
|
+
const rawHeight = baseHeight + heightSign * dy;
|
|
8003
|
+
const widthIntent = clampSize(rawWidth, minSize);
|
|
8004
|
+
const heightIntent = clampSize(rawHeight, minSize);
|
|
8005
|
+
const widthChange = Math.abs(widthIntent - baseWidth) / Math.max(baseWidth, 1);
|
|
8006
|
+
const heightChange = Math.abs(heightIntent - baseHeight) / Math.max(baseHeight, 1);
|
|
8007
|
+
if (widthChange >= heightChange) {
|
|
8008
|
+
const width2 = clampSize(widthIntent, minSize);
|
|
8009
|
+
const height2 = clampSize(width2 / Math.max(ratio, 1e-4), minSize);
|
|
8010
|
+
return { width: width2, height: height2 };
|
|
8011
|
+
}
|
|
8012
|
+
const height = clampSize(heightIntent, minSize);
|
|
8013
|
+
const width = clampSize(height * ratio, minSize);
|
|
8014
|
+
return { width, height };
|
|
8015
|
+
}
|
|
8016
|
+
function computeFillRenderedWidth(element) {
|
|
8017
|
+
const parent = element.parentElement;
|
|
8018
|
+
if (!parent) return null;
|
|
8019
|
+
const parentComputed = window.getComputedStyle(parent);
|
|
8020
|
+
const elementComputed = window.getComputedStyle(element);
|
|
8021
|
+
const parentClientWidth = parent.clientWidth;
|
|
8022
|
+
const parentPaddingLeft = parseFloat(parentComputed.paddingLeft) || 0;
|
|
8023
|
+
const parentPaddingRight = parseFloat(parentComputed.paddingRight) || 0;
|
|
8024
|
+
const parentContentWidth = parentClientWidth - parentPaddingLeft - parentPaddingRight;
|
|
8025
|
+
if (!Number.isFinite(parentContentWidth) || parentContentWidth <= 0) {
|
|
8026
|
+
return null;
|
|
8027
|
+
}
|
|
8028
|
+
const elementPaddingLeft = parseFloat(elementComputed.paddingLeft) || 0;
|
|
8029
|
+
const elementPaddingRight = parseFloat(elementComputed.paddingRight) || 0;
|
|
8030
|
+
const elementBorderLeft = parseFloat(elementComputed.borderLeftWidth) || 0;
|
|
8031
|
+
const elementBorderRight = parseFloat(elementComputed.borderRightWidth) || 0;
|
|
8032
|
+
if (elementComputed.boxSizing === "border-box") {
|
|
8033
|
+
return clampSize(parentContentWidth, 1);
|
|
8034
|
+
}
|
|
8035
|
+
return clampSize(
|
|
8036
|
+
parentContentWidth + elementPaddingLeft + elementPaddingRight + elementBorderLeft + elementBorderRight,
|
|
8037
|
+
1
|
|
8038
|
+
);
|
|
8039
|
+
}
|
|
8040
|
+
|
|
7764
8041
|
// src/use-move.ts
|
|
7765
8042
|
var INITIAL_DRAG_STATE = {
|
|
7766
8043
|
isDragging: false,
|
|
@@ -7833,9 +8110,12 @@ function useMove({ onMoveComplete }) {
|
|
|
7833
8110
|
const onMoveCompleteRef = React12.useRef(onMoveComplete);
|
|
7834
8111
|
const dragOptionsRef = React12.useRef(DEFAULT_DRAG_OPTIONS);
|
|
7835
8112
|
const dragGuardRef = React12.useRef(createDragInteractionGuard());
|
|
7836
|
-
const initialRectRef = React12.useRef(
|
|
7837
|
-
|
|
7838
|
-
|
|
8113
|
+
const initialRectRef = React12.useRef({
|
|
8114
|
+
x: 0,
|
|
8115
|
+
y: 0,
|
|
8116
|
+
scaleX: 1,
|
|
8117
|
+
scaleY: 1
|
|
8118
|
+
});
|
|
7839
8119
|
const originalTransformRef = React12.useRef("");
|
|
7840
8120
|
const composeBaseRef = React12.useRef("");
|
|
7841
8121
|
const reorderPreviewRef = React12.useRef(/* @__PURE__ */ new Map());
|
|
@@ -7851,79 +8131,85 @@ function useMove({ onMoveComplete }) {
|
|
|
7851
8131
|
}
|
|
7852
8132
|
reorderPreviewRef.current.clear();
|
|
7853
8133
|
}, []);
|
|
7854
|
-
const setReorderPreviewTransform = React12.useCallback(
|
|
7855
|
-
|
|
7856
|
-
|
|
7857
|
-
|
|
7858
|
-
|
|
7859
|
-
|
|
7860
|
-
|
|
7861
|
-
|
|
7862
|
-
|
|
7863
|
-
|
|
7864
|
-
|
|
7865
|
-
|
|
7866
|
-
|
|
7867
|
-
|
|
7868
|
-
|
|
7869
|
-
|
|
7870
|
-
|
|
7871
|
-
|
|
7872
|
-
|
|
7873
|
-
|
|
7874
|
-
|
|
7875
|
-
|
|
7876
|
-
|
|
7877
|
-
|
|
7878
|
-
|
|
7879
|
-
|
|
7880
|
-
|
|
7881
|
-
|
|
7882
|
-
|
|
7883
|
-
|
|
7884
|
-
|
|
7885
|
-
|
|
7886
|
-
|
|
7887
|
-
|
|
7888
|
-
|
|
7889
|
-
|
|
7890
|
-
|
|
7891
|
-
|
|
7892
|
-
|
|
7893
|
-
|
|
7894
|
-
|
|
7895
|
-
|
|
7896
|
-
|
|
7897
|
-
|
|
7898
|
-
|
|
7899
|
-
|
|
7900
|
-
|
|
7901
|
-
|
|
7902
|
-
|
|
7903
|
-
|
|
8134
|
+
const setReorderPreviewTransform = React12.useCallback(
|
|
8135
|
+
(element, transform) => {
|
|
8136
|
+
const existing = reorderPreviewRef.current.get(element);
|
|
8137
|
+
if (!existing) {
|
|
8138
|
+
reorderPreviewRef.current.set(element, {
|
|
8139
|
+
transform: element.style.transform,
|
|
8140
|
+
transition: element.style.transition
|
|
8141
|
+
});
|
|
8142
|
+
}
|
|
8143
|
+
const originalTransition = reorderPreviewRef.current.get(element)?.transition ?? element.style.transition;
|
|
8144
|
+
element.style.transition = withTransformTransition(originalTransition);
|
|
8145
|
+
element.style.transform = transform;
|
|
8146
|
+
},
|
|
8147
|
+
[]
|
|
8148
|
+
);
|
|
8149
|
+
const applyReorderPreview = React12.useCallback(
|
|
8150
|
+
(target, draggedElement, originalParent) => {
|
|
8151
|
+
if (!target || !draggedElement) {
|
|
8152
|
+
clearReorderPreview();
|
|
8153
|
+
return;
|
|
8154
|
+
}
|
|
8155
|
+
const container = target.container;
|
|
8156
|
+
const containerChildren = Array.from(container.children).filter(
|
|
8157
|
+
(child) => child instanceof HTMLElement
|
|
8158
|
+
);
|
|
8159
|
+
const siblings = containerChildren.filter((child) => child !== draggedElement);
|
|
8160
|
+
const insertIndex = getInsertIndex(siblings, target.insertBefore);
|
|
8161
|
+
if (insertIndex === null) {
|
|
8162
|
+
clearReorderPreview();
|
|
8163
|
+
return;
|
|
8164
|
+
}
|
|
8165
|
+
const draggedRect = draggedElement.getBoundingClientRect();
|
|
8166
|
+
const isHorizontal = isHorizontalDirection(target.flexDirection);
|
|
8167
|
+
const dragSize = isHorizontal ? draggedRect.width : draggedRect.height;
|
|
8168
|
+
if (!Number.isFinite(dragSize) || dragSize <= 0) {
|
|
8169
|
+
clearReorderPreview();
|
|
8170
|
+
return;
|
|
8171
|
+
}
|
|
8172
|
+
const sign = forwardVisualSign(target.flexDirection);
|
|
8173
|
+
const shiftedElements = /* @__PURE__ */ new Map();
|
|
8174
|
+
if (container === originalParent) {
|
|
8175
|
+
const originalIndex = containerChildren.indexOf(draggedElement);
|
|
8176
|
+
if (originalIndex >= 0) {
|
|
8177
|
+
if (insertIndex > originalIndex) {
|
|
8178
|
+
const shift = -sign * dragSize;
|
|
8179
|
+
for (let i = originalIndex; i < insertIndex; i++) {
|
|
8180
|
+
const sibling = siblings[i];
|
|
8181
|
+
if (sibling) shiftedElements.set(sibling, shift);
|
|
8182
|
+
}
|
|
8183
|
+
} else if (insertIndex < originalIndex) {
|
|
8184
|
+
const shift = sign * dragSize;
|
|
8185
|
+
for (let i = insertIndex; i < originalIndex; i++) {
|
|
8186
|
+
const sibling = siblings[i];
|
|
8187
|
+
if (sibling) shiftedElements.set(sibling, shift);
|
|
8188
|
+
}
|
|
7904
8189
|
}
|
|
7905
8190
|
}
|
|
8191
|
+
} else {
|
|
8192
|
+
const shift = sign * dragSize;
|
|
8193
|
+
for (let i = insertIndex; i < siblings.length; i++) {
|
|
8194
|
+
shiftedElements.set(siblings[i], shift);
|
|
8195
|
+
}
|
|
7906
8196
|
}
|
|
7907
|
-
|
|
7908
|
-
const
|
|
7909
|
-
for (
|
|
7910
|
-
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
7914
|
-
|
|
7915
|
-
for (const [element, snapshot2] of reorderPreviewRef.current) {
|
|
7916
|
-
if (!keep.has(element)) {
|
|
7917
|
-
element.style.transform = snapshot2.transform;
|
|
7918
|
-
element.style.transition = snapshot2.transition;
|
|
7919
|
-
reorderPreviewRef.current.delete(element);
|
|
8197
|
+
const axis = isHorizontal ? "x" : "y";
|
|
8198
|
+
const keep = new Set(shiftedElements.keys());
|
|
8199
|
+
for (const [element, snapshot2] of reorderPreviewRef.current) {
|
|
8200
|
+
if (!keep.has(element)) {
|
|
8201
|
+
element.style.transform = snapshot2.transform;
|
|
8202
|
+
element.style.transition = snapshot2.transition;
|
|
8203
|
+
reorderPreviewRef.current.delete(element);
|
|
8204
|
+
}
|
|
7920
8205
|
}
|
|
7921
|
-
|
|
7922
|
-
|
|
7923
|
-
|
|
7924
|
-
|
|
7925
|
-
}
|
|
7926
|
-
|
|
8206
|
+
for (const [element, shift] of shiftedElements) {
|
|
8207
|
+
const baseTransform = reorderPreviewRef.current.get(element)?.transform ?? element.style.transform;
|
|
8208
|
+
setReorderPreviewTransform(element, withAxisTranslate(baseTransform, axis, shift));
|
|
8209
|
+
}
|
|
8210
|
+
},
|
|
8211
|
+
[clearReorderPreview, setReorderPreviewTransform]
|
|
8212
|
+
);
|
|
7927
8213
|
const cancelDrag = React12.useCallback(() => {
|
|
7928
8214
|
const current = dragStateRef.current;
|
|
7929
8215
|
if (current.draggedElement) {
|
|
@@ -7983,7 +8269,13 @@ function useMove({ onMoveComplete }) {
|
|
|
7983
8269
|
const deltaX = (current.ghostPosition.x - rect.left) / scaleX;
|
|
7984
8270
|
const deltaY = (current.ghostPosition.y - rect.top) / scaleY;
|
|
7985
8271
|
if ((Math.abs(deltaX) > 0.5 || Math.abs(deltaY) > 0.5) && originalParent) {
|
|
7986
|
-
moveInfo = {
|
|
8272
|
+
moveInfo = {
|
|
8273
|
+
originalParent,
|
|
8274
|
+
originalPreviousSibling,
|
|
8275
|
+
originalNextSibling,
|
|
8276
|
+
mode: "position",
|
|
8277
|
+
positionDelta: { x: deltaX, y: deltaY }
|
|
8278
|
+
};
|
|
7987
8279
|
}
|
|
7988
8280
|
}
|
|
7989
8281
|
} else if (target && tryReparent(draggedElement, target, originalParent, originalNextSibling)) {
|
|
@@ -8009,11 +8301,12 @@ function useMove({ onMoveComplete }) {
|
|
|
8009
8301
|
const previousSibling = element.previousElementSibling;
|
|
8010
8302
|
const nextSibling = element.nextElementSibling;
|
|
8011
8303
|
dragOptionsRef.current = normalizeStartDragOptions(options);
|
|
8304
|
+
const { scaleX, scaleY } = getElementScale(element);
|
|
8012
8305
|
initialRectRef.current = {
|
|
8013
8306
|
x: rect.left,
|
|
8014
8307
|
y: rect.top,
|
|
8015
|
-
scaleX
|
|
8016
|
-
scaleY
|
|
8308
|
+
scaleX,
|
|
8309
|
+
scaleY
|
|
8017
8310
|
};
|
|
8018
8311
|
const inlineTransform = element.style.transform;
|
|
8019
8312
|
originalTransformRef.current = inlineTransform;
|
|
@@ -8097,19 +8390,9 @@ function useMove({ onMoveComplete }) {
|
|
|
8097
8390
|
}
|
|
8098
8391
|
return;
|
|
8099
8392
|
}
|
|
8100
|
-
const container = dragOptionsRef.current.constrainToOriginalParent ? originalParent : findContainerAtPoint(
|
|
8101
|
-
e.clientX,
|
|
8102
|
-
e.clientY,
|
|
8103
|
-
draggedElement,
|
|
8104
|
-
originalParent
|
|
8105
|
-
);
|
|
8393
|
+
const container = dragOptionsRef.current.constrainToOriginalParent ? originalParent : findContainerAtPoint(e.clientX, e.clientY, draggedElement, originalParent);
|
|
8106
8394
|
if (container && draggedElement) {
|
|
8107
|
-
const dropPos = calculateDropPosition(
|
|
8108
|
-
container,
|
|
8109
|
-
e.clientX,
|
|
8110
|
-
e.clientY,
|
|
8111
|
-
draggedElement
|
|
8112
|
-
);
|
|
8395
|
+
const dropPos = calculateDropPosition(container, e.clientX, e.clientY, draggedElement);
|
|
8113
8396
|
if (dropPos) {
|
|
8114
8397
|
const nextTarget = {
|
|
8115
8398
|
container,
|
|
@@ -8482,7 +8765,10 @@ function isSelectableElement(element) {
|
|
|
8482
8765
|
if (!(element instanceof HTMLElement)) return false;
|
|
8483
8766
|
if (!element.isConnected) return false;
|
|
8484
8767
|
if (element === document.body || element === document.documentElement) return false;
|
|
8485
|
-
if (element.matches(
|
|
8768
|
+
if (element.matches(
|
|
8769
|
+
"[data-direct-edit], [data-direct-edit-host], script, style, link, meta, noscript"
|
|
8770
|
+
))
|
|
8771
|
+
return false;
|
|
8486
8772
|
const rect = element.getBoundingClientRect();
|
|
8487
8773
|
if (rect.width <= 0 || rect.height <= 0) return false;
|
|
8488
8774
|
const computed = window.getComputedStyle(element);
|
|
@@ -8500,7 +8786,9 @@ function compareDomOrder2(a, b) {
|
|
|
8500
8786
|
}
|
|
8501
8787
|
function collectMarqueeTargets(rect) {
|
|
8502
8788
|
const hits = Array.from(document.querySelectorAll("*")).filter(isSelectableElement).filter((element) => rectsIntersect(rect, element.getBoundingClientRect()));
|
|
8503
|
-
const deepestHits = hits.filter(
|
|
8789
|
+
const deepestHits = hits.filter(
|
|
8790
|
+
(element) => !hits.some((other) => other !== element && element.contains(other))
|
|
8791
|
+
);
|
|
8504
8792
|
deepestHits.sort(compareDomOrder2);
|
|
8505
8793
|
return deepestHits;
|
|
8506
8794
|
}
|
|
@@ -9091,99 +9379,27 @@ var import_lucide_react2 = require("lucide-react");
|
|
|
9091
9379
|
|
|
9092
9380
|
// src/use-selection-resize.ts
|
|
9093
9381
|
var React18 = __toESM(require("react"));
|
|
9094
|
-
|
|
9095
|
-
// src/utils/resize-geometry.ts
|
|
9096
|
-
function toFinite(value, fallback) {
|
|
9097
|
-
if (!Number.isFinite(value)) return fallback;
|
|
9098
|
-
return value;
|
|
9099
|
-
}
|
|
9100
|
-
function clampSize(value, minSize = 1) {
|
|
9101
|
-
const safeMin = Math.max(1, toFinite(minSize, 1));
|
|
9102
|
-
const safeValue = toFinite(value, safeMin);
|
|
9103
|
-
return Math.max(safeMin, safeValue);
|
|
9104
|
-
}
|
|
9105
|
-
function computeEdgeSize({
|
|
9106
|
-
handle,
|
|
9107
|
-
startWidth,
|
|
9108
|
-
startHeight,
|
|
9109
|
-
dx,
|
|
9110
|
-
dy,
|
|
9111
|
-
minSize = 1
|
|
9112
|
-
}) {
|
|
9113
|
-
const baseWidth = clampSize(startWidth, minSize);
|
|
9114
|
-
const baseHeight = clampSize(startHeight, minSize);
|
|
9115
|
-
switch (handle) {
|
|
9116
|
-
case "right":
|
|
9117
|
-
return { width: clampSize(baseWidth + dx, minSize), height: baseHeight };
|
|
9118
|
-
case "left":
|
|
9119
|
-
return { width: clampSize(baseWidth - dx, minSize), height: baseHeight };
|
|
9120
|
-
case "bottom":
|
|
9121
|
-
return { width: baseWidth, height: clampSize(baseHeight + dy, minSize) };
|
|
9122
|
-
case "top":
|
|
9123
|
-
return { width: baseWidth, height: clampSize(baseHeight - dy, minSize) };
|
|
9124
|
-
}
|
|
9125
|
-
}
|
|
9126
|
-
function computeCornerProportionalSize({
|
|
9127
|
-
handle,
|
|
9128
|
-
startWidth,
|
|
9129
|
-
startHeight,
|
|
9130
|
-
dx,
|
|
9131
|
-
dy,
|
|
9132
|
-
minSize = 1
|
|
9133
|
-
}) {
|
|
9134
|
-
const baseWidth = clampSize(startWidth, minSize);
|
|
9135
|
-
const baseHeight = clampSize(startHeight, minSize);
|
|
9136
|
-
const ratio = baseWidth > 0 && baseHeight > 0 ? baseWidth / baseHeight : 1;
|
|
9137
|
-
const widthSign = handle === "top-left" || handle === "bottom-left" ? -1 : 1;
|
|
9138
|
-
const heightSign = handle === "top-left" || handle === "top-right" ? -1 : 1;
|
|
9139
|
-
const rawWidth = baseWidth + widthSign * dx;
|
|
9140
|
-
const rawHeight = baseHeight + heightSign * dy;
|
|
9141
|
-
const widthIntent = clampSize(rawWidth, minSize);
|
|
9142
|
-
const heightIntent = clampSize(rawHeight, minSize);
|
|
9143
|
-
const widthChange = Math.abs(widthIntent - baseWidth) / Math.max(baseWidth, 1);
|
|
9144
|
-
const heightChange = Math.abs(heightIntent - baseHeight) / Math.max(baseHeight, 1);
|
|
9145
|
-
if (widthChange >= heightChange) {
|
|
9146
|
-
const width2 = clampSize(widthIntent, minSize);
|
|
9147
|
-
const height2 = clampSize(width2 / Math.max(ratio, 1e-4), minSize);
|
|
9148
|
-
return { width: width2, height: height2 };
|
|
9149
|
-
}
|
|
9150
|
-
const height = clampSize(heightIntent, minSize);
|
|
9151
|
-
const width = clampSize(height * ratio, minSize);
|
|
9152
|
-
return { width, height };
|
|
9153
|
-
}
|
|
9154
|
-
function computeFillRenderedWidth(element) {
|
|
9155
|
-
const parent = element.parentElement;
|
|
9156
|
-
if (!parent) return null;
|
|
9157
|
-
const parentComputed = window.getComputedStyle(parent);
|
|
9158
|
-
const elementComputed = window.getComputedStyle(element);
|
|
9159
|
-
const parentClientWidth = parent.clientWidth;
|
|
9160
|
-
const parentPaddingLeft = parseFloat(parentComputed.paddingLeft) || 0;
|
|
9161
|
-
const parentPaddingRight = parseFloat(parentComputed.paddingRight) || 0;
|
|
9162
|
-
const parentContentWidth = parentClientWidth - parentPaddingLeft - parentPaddingRight;
|
|
9163
|
-
if (!Number.isFinite(parentContentWidth) || parentContentWidth <= 0) {
|
|
9164
|
-
return null;
|
|
9165
|
-
}
|
|
9166
|
-
const elementPaddingLeft = parseFloat(elementComputed.paddingLeft) || 0;
|
|
9167
|
-
const elementPaddingRight = parseFloat(elementComputed.paddingRight) || 0;
|
|
9168
|
-
const elementBorderLeft = parseFloat(elementComputed.borderLeftWidth) || 0;
|
|
9169
|
-
const elementBorderRight = parseFloat(elementComputed.borderRightWidth) || 0;
|
|
9170
|
-
if (elementComputed.boxSizing === "border-box") {
|
|
9171
|
-
return clampSize(parentContentWidth, 1);
|
|
9172
|
-
}
|
|
9173
|
-
return clampSize(
|
|
9174
|
-
parentContentWidth + elementPaddingLeft + elementPaddingRight + elementBorderLeft + elementBorderRight,
|
|
9175
|
-
1
|
|
9176
|
-
);
|
|
9177
|
-
}
|
|
9178
|
-
|
|
9179
|
-
// src/use-selection-resize.ts
|
|
9180
9382
|
var MIN_SIZE_PX = 1;
|
|
9181
9383
|
var SNAP_IN_PX = 2;
|
|
9182
9384
|
var SNAP_OUT_PX = 6;
|
|
9183
9385
|
var EPSILON = 1e-4;
|
|
9184
9386
|
var EDGE_HANDLES = /* @__PURE__ */ new Set(["top", "right", "bottom", "left"]);
|
|
9185
|
-
var WIDTH_HANDLES = /* @__PURE__ */ new Set([
|
|
9186
|
-
|
|
9387
|
+
var WIDTH_HANDLES = /* @__PURE__ */ new Set([
|
|
9388
|
+
"left",
|
|
9389
|
+
"right",
|
|
9390
|
+
"top-left",
|
|
9391
|
+
"top-right",
|
|
9392
|
+
"bottom-left",
|
|
9393
|
+
"bottom-right"
|
|
9394
|
+
]);
|
|
9395
|
+
var HEIGHT_HANDLES = /* @__PURE__ */ new Set([
|
|
9396
|
+
"top",
|
|
9397
|
+
"bottom",
|
|
9398
|
+
"top-left",
|
|
9399
|
+
"top-right",
|
|
9400
|
+
"bottom-left",
|
|
9401
|
+
"bottom-right"
|
|
9402
|
+
]);
|
|
9187
9403
|
function createSizingValue(mode, numericValue) {
|
|
9188
9404
|
const rounded = Math.max(MIN_SIZE_PX, Math.round(clampSize(numericValue, MIN_SIZE_PX)));
|
|
9189
9405
|
return {
|
|
@@ -9205,125 +9421,135 @@ function useSelectionResize({
|
|
|
9205
9421
|
}) {
|
|
9206
9422
|
const cleanupRef = React18.useRef(null);
|
|
9207
9423
|
const txCounterRef = React18.useRef(0);
|
|
9208
|
-
const emitSizingChange = React18.useCallback(
|
|
9209
|
-
|
|
9210
|
-
|
|
9424
|
+
const emitSizingChange = React18.useCallback(
|
|
9425
|
+
(changes, options) => {
|
|
9426
|
+
onResizeSizingChange?.(changes, options);
|
|
9427
|
+
},
|
|
9428
|
+
[onResizeSizingChange]
|
|
9429
|
+
);
|
|
9211
9430
|
React18.useEffect(() => {
|
|
9212
9431
|
return () => {
|
|
9213
9432
|
cleanupRef.current?.();
|
|
9214
9433
|
cleanupRef.current = null;
|
|
9215
9434
|
};
|
|
9216
9435
|
}, []);
|
|
9217
|
-
const getResizeHandlePointerDown = React18.useCallback(
|
|
9218
|
-
|
|
9219
|
-
|
|
9220
|
-
|
|
9221
|
-
|
|
9222
|
-
|
|
9223
|
-
|
|
9224
|
-
|
|
9225
|
-
|
|
9226
|
-
|
|
9227
|
-
|
|
9228
|
-
|
|
9229
|
-
|
|
9230
|
-
|
|
9231
|
-
|
|
9232
|
-
|
|
9233
|
-
transactionId
|
|
9234
|
-
|
|
9235
|
-
|
|
9236
|
-
|
|
9237
|
-
|
|
9238
|
-
|
|
9239
|
-
|
|
9240
|
-
|
|
9241
|
-
|
|
9242
|
-
|
|
9243
|
-
|
|
9244
|
-
|
|
9245
|
-
|
|
9246
|
-
|
|
9247
|
-
const
|
|
9248
|
-
|
|
9249
|
-
|
|
9250
|
-
|
|
9251
|
-
|
|
9252
|
-
|
|
9253
|
-
|
|
9254
|
-
|
|
9255
|
-
|
|
9256
|
-
|
|
9257
|
-
|
|
9258
|
-
|
|
9259
|
-
|
|
9260
|
-
|
|
9261
|
-
|
|
9262
|
-
|
|
9263
|
-
|
|
9264
|
-
|
|
9265
|
-
|
|
9266
|
-
|
|
9267
|
-
|
|
9268
|
-
|
|
9269
|
-
if (state.
|
|
9270
|
-
|
|
9271
|
-
|
|
9436
|
+
const getResizeHandlePointerDown = React18.useCallback(
|
|
9437
|
+
(handle) => {
|
|
9438
|
+
return (e) => {
|
|
9439
|
+
if (!enabled || !onResizeSizingChange) return;
|
|
9440
|
+
if (e.button !== 0) return;
|
|
9441
|
+
e.preventDefault();
|
|
9442
|
+
e.stopPropagation();
|
|
9443
|
+
cleanupRef.current?.();
|
|
9444
|
+
const rect = selectedElement.getBoundingClientRect();
|
|
9445
|
+
const offsetWidth = selectedElement.offsetWidth;
|
|
9446
|
+
const offsetHeight = selectedElement.offsetHeight;
|
|
9447
|
+
const startWidth = clampSize(offsetWidth > 0 ? offsetWidth : rect.width, MIN_SIZE_PX);
|
|
9448
|
+
const startHeight = clampSize(offsetHeight > 0 ? offsetHeight : rect.height, MIN_SIZE_PX);
|
|
9449
|
+
const { scaleX: rawScaleX, scaleY: rawScaleY } = getElementScale(selectedElement);
|
|
9450
|
+
const scaleX = Math.max(EPSILON, rawScaleX);
|
|
9451
|
+
const scaleY = Math.max(EPSILON, rawScaleY);
|
|
9452
|
+
const transactionId = `resize-${Date.now()}-${txCounterRef.current++}`;
|
|
9453
|
+
const state = {
|
|
9454
|
+
transactionId,
|
|
9455
|
+
handle,
|
|
9456
|
+
startClientX: e.clientX,
|
|
9457
|
+
startClientY: e.clientY,
|
|
9458
|
+
startWidth,
|
|
9459
|
+
startHeight,
|
|
9460
|
+
scaleX,
|
|
9461
|
+
scaleY,
|
|
9462
|
+
fillTargetWidth: computeFillRenderedWidth(selectedElement),
|
|
9463
|
+
fillLocked: detectSizingMode(selectedElement, "width") === "fill"
|
|
9464
|
+
};
|
|
9465
|
+
emitSizingChange({}, { transactionId: state.transactionId, phase: "start" });
|
|
9466
|
+
const onPointerMove = (moveEvent) => {
|
|
9467
|
+
const dx = (moveEvent.clientX - state.startClientX) / state.scaleX;
|
|
9468
|
+
const dy = (moveEvent.clientY - state.startClientY) / state.scaleY;
|
|
9469
|
+
const nextSize = isEdgeHandle(state.handle) ? computeEdgeSize({
|
|
9470
|
+
handle: state.handle,
|
|
9471
|
+
startWidth: state.startWidth,
|
|
9472
|
+
startHeight: state.startHeight,
|
|
9473
|
+
dx,
|
|
9474
|
+
dy,
|
|
9475
|
+
minSize: MIN_SIZE_PX
|
|
9476
|
+
}) : computeCornerProportionalSize({
|
|
9477
|
+
handle: state.handle,
|
|
9478
|
+
startWidth: state.startWidth,
|
|
9479
|
+
startHeight: state.startHeight,
|
|
9480
|
+
dx,
|
|
9481
|
+
dy,
|
|
9482
|
+
minSize: MIN_SIZE_PX
|
|
9483
|
+
});
|
|
9484
|
+
const nextWidth = Math.max(MIN_SIZE_PX, Math.round(nextSize.width));
|
|
9485
|
+
const nextHeight = Math.max(MIN_SIZE_PX, Math.round(nextSize.height));
|
|
9486
|
+
const changes = {};
|
|
9487
|
+
if (WIDTH_HANDLES.has(state.handle)) {
|
|
9488
|
+
if (state.fillTargetWidth !== null) {
|
|
9489
|
+
const distance = Math.abs(nextWidth - state.fillTargetWidth);
|
|
9490
|
+
if (state.fillLocked) {
|
|
9491
|
+
if (distance > SNAP_OUT_PX) {
|
|
9492
|
+
state.fillLocked = false;
|
|
9493
|
+
}
|
|
9494
|
+
} else if (distance <= SNAP_IN_PX) {
|
|
9495
|
+
state.fillLocked = true;
|
|
9272
9496
|
}
|
|
9273
|
-
} else
|
|
9274
|
-
state.fillLocked =
|
|
9497
|
+
} else {
|
|
9498
|
+
state.fillLocked = false;
|
|
9499
|
+
}
|
|
9500
|
+
if (state.fillLocked) {
|
|
9501
|
+
const fillWidth = state.fillTargetWidth ?? nextWidth;
|
|
9502
|
+
changes.width = createSizingValue("fill", fillWidth);
|
|
9503
|
+
} else {
|
|
9504
|
+
changes.width = createSizingValue("fixed", nextWidth);
|
|
9275
9505
|
}
|
|
9276
|
-
} else {
|
|
9277
|
-
state.fillLocked = false;
|
|
9278
9506
|
}
|
|
9279
|
-
if (state.
|
|
9280
|
-
|
|
9281
|
-
changes.width = createSizingValue("fill", fillWidth);
|
|
9282
|
-
} else {
|
|
9283
|
-
changes.width = createSizingValue("fixed", nextWidth);
|
|
9507
|
+
if (HEIGHT_HANDLES.has(state.handle)) {
|
|
9508
|
+
changes.height = createSizingValue("fixed", nextHeight);
|
|
9284
9509
|
}
|
|
9285
|
-
|
|
9286
|
-
|
|
9287
|
-
|
|
9288
|
-
|
|
9289
|
-
|
|
9290
|
-
|
|
9510
|
+
if (Object.keys(changes).length === 0) return;
|
|
9511
|
+
emitSizingChange(changes, { transactionId: state.transactionId, phase: "update" });
|
|
9512
|
+
};
|
|
9513
|
+
const stop = () => {
|
|
9514
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
9515
|
+
window.removeEventListener("pointerup", stop);
|
|
9516
|
+
window.removeEventListener("pointercancel", stop);
|
|
9517
|
+
window.removeEventListener("blur", stop);
|
|
9518
|
+
cleanupRef.current = null;
|
|
9519
|
+
emitSizingChange({}, { transactionId: state.transactionId, phase: "end" });
|
|
9520
|
+
};
|
|
9521
|
+
cleanupRef.current = stop;
|
|
9522
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
9523
|
+
window.addEventListener("pointerup", stop);
|
|
9524
|
+
window.addEventListener("pointercancel", stop);
|
|
9525
|
+
window.addEventListener("blur", stop);
|
|
9291
9526
|
};
|
|
9292
|
-
|
|
9293
|
-
|
|
9294
|
-
|
|
9295
|
-
|
|
9296
|
-
|
|
9297
|
-
|
|
9298
|
-
|
|
9527
|
+
},
|
|
9528
|
+
[emitSizingChange, enabled, onResizeSizingChange, selectedElement]
|
|
9529
|
+
);
|
|
9530
|
+
const getResizeHandleDoubleClick = React18.useCallback(
|
|
9531
|
+
(handle) => {
|
|
9532
|
+
return (e) => {
|
|
9533
|
+
if (!enabled || !onResizeSizingChange) return;
|
|
9534
|
+
if (!isEdgeHandle(handle)) return;
|
|
9535
|
+
const hasElementChildren = selectedElement.children.length > 0;
|
|
9536
|
+
const hasTextContent = Boolean(selectedElement.textContent?.trim());
|
|
9537
|
+
const isEligibleElement = hasElementChildren || hasTextContent;
|
|
9538
|
+
if (!isEligibleElement) return;
|
|
9539
|
+
e.preventDefault();
|
|
9540
|
+
e.stopPropagation();
|
|
9541
|
+
const rect = selectedElement.getBoundingClientRect();
|
|
9542
|
+
const width = Math.max(MIN_SIZE_PX, Math.round(rect.width));
|
|
9543
|
+
const height = Math.max(MIN_SIZE_PX, Math.round(rect.height));
|
|
9544
|
+
if (handle === "left" || handle === "right") {
|
|
9545
|
+
emitSizingChange({ width: createSizingValue("fit", width) });
|
|
9546
|
+
} else {
|
|
9547
|
+
emitSizingChange({ height: createSizingValue("fit", height) });
|
|
9548
|
+
}
|
|
9299
9549
|
};
|
|
9300
|
-
|
|
9301
|
-
|
|
9302
|
-
|
|
9303
|
-
window.addEventListener("pointercancel", stop);
|
|
9304
|
-
window.addEventListener("blur", stop);
|
|
9305
|
-
};
|
|
9306
|
-
}, [emitSizingChange, enabled, onResizeSizingChange, selectedElement]);
|
|
9307
|
-
const getResizeHandleDoubleClick = React18.useCallback((handle) => {
|
|
9308
|
-
return (e) => {
|
|
9309
|
-
if (!enabled || !onResizeSizingChange) return;
|
|
9310
|
-
if (!isEdgeHandle(handle)) return;
|
|
9311
|
-
const hasElementChildren = selectedElement.children.length > 0;
|
|
9312
|
-
const hasTextContent = Boolean(selectedElement.textContent?.trim());
|
|
9313
|
-
const isEligibleElement = hasElementChildren || hasTextContent;
|
|
9314
|
-
if (!isEligibleElement) return;
|
|
9315
|
-
e.preventDefault();
|
|
9316
|
-
e.stopPropagation();
|
|
9317
|
-
const rect = selectedElement.getBoundingClientRect();
|
|
9318
|
-
const width = Math.max(MIN_SIZE_PX, Math.round(rect.width));
|
|
9319
|
-
const height = Math.max(MIN_SIZE_PX, Math.round(rect.height));
|
|
9320
|
-
if (handle === "left" || handle === "right") {
|
|
9321
|
-
emitSizingChange({ width: createSizingValue("fit", width) });
|
|
9322
|
-
} else {
|
|
9323
|
-
emitSizingChange({ height: createSizingValue("fit", height) });
|
|
9324
|
-
}
|
|
9325
|
-
};
|
|
9326
|
-
}, [emitSizingChange, enabled, onResizeSizingChange, selectedElement]);
|
|
9550
|
+
},
|
|
9551
|
+
[emitSizingChange, enabled, onResizeSizingChange, selectedElement]
|
|
9552
|
+
);
|
|
9327
9553
|
return {
|
|
9328
9554
|
getResizeHandlePointerDown,
|
|
9329
9555
|
getResizeHandleDoubleClick
|
|
@@ -9948,17 +10174,20 @@ function getGroupBounds(rects) {
|
|
|
9948
10174
|
if (rects.length === 0) {
|
|
9949
10175
|
return { left: 0, top: 0, right: 0, bottom: 0 };
|
|
9950
10176
|
}
|
|
9951
|
-
return rects.reduce(
|
|
9952
|
-
|
|
9953
|
-
|
|
9954
|
-
|
|
9955
|
-
|
|
9956
|
-
|
|
9957
|
-
|
|
9958
|
-
|
|
9959
|
-
|
|
9960
|
-
|
|
9961
|
-
|
|
10177
|
+
return rects.reduce(
|
|
10178
|
+
(bounds, rect) => ({
|
|
10179
|
+
left: Math.min(bounds.left, rect.left),
|
|
10180
|
+
top: Math.min(bounds.top, rect.top),
|
|
10181
|
+
right: Math.max(bounds.right, rect.right),
|
|
10182
|
+
bottom: Math.max(bounds.bottom, rect.bottom)
|
|
10183
|
+
}),
|
|
10184
|
+
{
|
|
10185
|
+
left: rects[0].left,
|
|
10186
|
+
top: rects[0].top,
|
|
10187
|
+
right: rects[0].right,
|
|
10188
|
+
bottom: rects[0].bottom
|
|
10189
|
+
}
|
|
10190
|
+
);
|
|
9962
10191
|
}
|
|
9963
10192
|
function MultiSelectionOverlay({ selectedElements }) {
|
|
9964
10193
|
const elements = React20.useMemo(
|
|
@@ -9967,10 +10196,12 @@ function MultiSelectionOverlay({ selectedElements }) {
|
|
|
9967
10196
|
);
|
|
9968
10197
|
const [selectionRects, setSelectionRects] = React20.useState([]);
|
|
9969
10198
|
const updateRects = React20.useCallback(() => {
|
|
9970
|
-
setSelectionRects(
|
|
9971
|
-
element
|
|
9972
|
-
|
|
9973
|
-
|
|
10199
|
+
setSelectionRects(
|
|
10200
|
+
elements.map((element) => ({
|
|
10201
|
+
element,
|
|
10202
|
+
rect: element.getBoundingClientRect()
|
|
10203
|
+
}))
|
|
10204
|
+
);
|
|
9974
10205
|
}, [elements]);
|
|
9975
10206
|
React20.useLayoutEffect(() => {
|
|
9976
10207
|
updateRects();
|
|
@@ -13149,89 +13380,91 @@ function DirectEditPanelInner({
|
|
|
13149
13380
|
sectionRefs
|
|
13150
13381
|
}
|
|
13151
13382
|
),
|
|
13152
|
-
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
13153
|
-
|
|
13154
|
-
|
|
13155
|
-
|
|
13156
|
-
|
|
13157
|
-
|
|
13158
|
-
|
|
13159
|
-
|
|
13160
|
-
|
|
13161
|
-
|
|
13162
|
-
|
|
13163
|
-
|
|
13164
|
-
|
|
13165
|
-
|
|
13166
|
-
|
|
13167
|
-
|
|
13168
|
-
|
|
13169
|
-
|
|
13170
|
-
|
|
13171
|
-
|
|
13172
|
-
|
|
13173
|
-
|
|
13174
|
-
|
|
13175
|
-
|
|
13176
|
-
|
|
13177
|
-
|
|
13178
|
-
|
|
13179
|
-
|
|
13180
|
-
|
|
13181
|
-
|
|
13182
|
-
|
|
13183
|
-
|
|
13184
|
-
|
|
13185
|
-
|
|
13186
|
-
|
|
13187
|
-
|
|
13188
|
-
|
|
13189
|
-
|
|
13190
|
-
|
|
13191
|
-
|
|
13192
|
-
|
|
13193
|
-
|
|
13194
|
-
|
|
13195
|
-
|
|
13196
|
-
|
|
13197
|
-
|
|
13198
|
-
|
|
13199
|
-
|
|
13200
|
-
|
|
13201
|
-
|
|
13202
|
-
|
|
13203
|
-
|
|
13204
|
-
|
|
13205
|
-
|
|
13206
|
-
|
|
13207
|
-
|
|
13208
|
-
|
|
13209
|
-
|
|
13210
|
-
|
|
13211
|
-
|
|
13212
|
-
|
|
13213
|
-
|
|
13214
|
-
|
|
13215
|
-
|
|
13216
|
-
|
|
13217
|
-
|
|
13218
|
-
|
|
13219
|
-
|
|
13220
|
-
|
|
13221
|
-
|
|
13222
|
-
|
|
13223
|
-
|
|
13224
|
-
|
|
13225
|
-
|
|
13226
|
-
|
|
13227
|
-
|
|
13228
|
-
|
|
13229
|
-
|
|
13230
|
-
|
|
13231
|
-
|
|
13232
|
-
|
|
13233
|
-
|
|
13234
|
-
|
|
13383
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
13384
|
+
"div",
|
|
13385
|
+
{
|
|
13386
|
+
className: "flex-1 overflow-y-auto backdrop-blur-xl bg-background/85",
|
|
13387
|
+
ref: scrollRef,
|
|
13388
|
+
onWheelCapture: (e) => e.stopPropagation(),
|
|
13389
|
+
children: [
|
|
13390
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13391
|
+
LayoutSection,
|
|
13392
|
+
{
|
|
13393
|
+
elementInfo,
|
|
13394
|
+
computedFlex,
|
|
13395
|
+
computedSpacing,
|
|
13396
|
+
computedSizing,
|
|
13397
|
+
onToggleFlex,
|
|
13398
|
+
onUpdateFlex,
|
|
13399
|
+
onUpdateSpacing,
|
|
13400
|
+
onUpdateSizing,
|
|
13401
|
+
sectionRef: sectionRefs.layout
|
|
13402
|
+
}
|
|
13403
|
+
),
|
|
13404
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { ref: sectionRefs.radius, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CollapsibleSection, { title: "Radius", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13405
|
+
BorderRadiusInputs,
|
|
13406
|
+
{
|
|
13407
|
+
values: {
|
|
13408
|
+
topLeft: computedBorderRadius.borderTopLeftRadius,
|
|
13409
|
+
topRight: computedBorderRadius.borderTopRightRadius,
|
|
13410
|
+
bottomRight: computedBorderRadius.borderBottomRightRadius,
|
|
13411
|
+
bottomLeft: computedBorderRadius.borderBottomLeftRadius
|
|
13412
|
+
},
|
|
13413
|
+
onChange: onUpdateBorderRadius
|
|
13414
|
+
}
|
|
13415
|
+
) }) }),
|
|
13416
|
+
computedColor && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { ref: sectionRefs.fill, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13417
|
+
BackgroundFillSection,
|
|
13418
|
+
{
|
|
13419
|
+
backgroundColor: computedColor.backgroundColor,
|
|
13420
|
+
onSetCSS,
|
|
13421
|
+
pendingStyles
|
|
13422
|
+
}
|
|
13423
|
+
) }),
|
|
13424
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { ref: sectionRefs.border, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13425
|
+
BorderSection,
|
|
13426
|
+
{
|
|
13427
|
+
border: computedBorder,
|
|
13428
|
+
borderColor: computedColor?.borderColor,
|
|
13429
|
+
outlineColor: computedColor?.outlineColor,
|
|
13430
|
+
borderStyleControlPreference,
|
|
13431
|
+
onChange: onUpdateBorder,
|
|
13432
|
+
onBatchChange: onBatchUpdateBorder,
|
|
13433
|
+
onBorderColorChange: (value) => onUpdateColor("borderColor", value),
|
|
13434
|
+
onOutlineColorChange: (value) => onUpdateColor("outlineColor", value),
|
|
13435
|
+
onSetCSS,
|
|
13436
|
+
pendingStyles
|
|
13437
|
+
}
|
|
13438
|
+
) }),
|
|
13439
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { ref: sectionRefs.shadow, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13440
|
+
ShadowSection,
|
|
13441
|
+
{
|
|
13442
|
+
boxShadow: computedBoxShadow,
|
|
13443
|
+
onSetCSS,
|
|
13444
|
+
pendingStyles
|
|
13445
|
+
}
|
|
13446
|
+
) }),
|
|
13447
|
+
elementInfo.isTextElement && computedTypography && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { ref: sectionRefs.text, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CollapsibleSection, { title: "Text", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(TypographyInputs, { typography: computedTypography, onUpdate: onUpdateTypography }) }) }),
|
|
13448
|
+
computedColor && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { ref: sectionRefs.colors, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CollapsibleSection, { title: "Selection colors", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13449
|
+
FillSection,
|
|
13450
|
+
{
|
|
13451
|
+
textColor: computedColor.color,
|
|
13452
|
+
borderColor: computedColor.borderColor,
|
|
13453
|
+
outlineColor: computedColor.outlineColor,
|
|
13454
|
+
selectionColors,
|
|
13455
|
+
onTextChange: (value) => onUpdateColor("color", value),
|
|
13456
|
+
onBorderColorChange: (value) => onUpdateColor("borderColor", value),
|
|
13457
|
+
onOutlineColorChange: (value) => onUpdateColor("outlineColor", value),
|
|
13458
|
+
onSelectionColorChange: onReplaceSelectionColor,
|
|
13459
|
+
onSelectionColorTarget: onSelectSelectionColorTarget,
|
|
13460
|
+
hasTextContent: elementInfo.isTextElement,
|
|
13461
|
+
showBorderColor: computedColor.borderColor.alpha > 0,
|
|
13462
|
+
showOutlineColor: computedColor.outlineColor.alpha > 0
|
|
13463
|
+
}
|
|
13464
|
+
) }) })
|
|
13465
|
+
]
|
|
13466
|
+
}
|
|
13467
|
+
),
|
|
13235
13468
|
(onExportEdits || showSendButton && onSendToAgent) && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
13236
13469
|
PanelFooter,
|
|
13237
13470
|
{
|
|
@@ -13304,6 +13537,8 @@ function DirectEditPanelContent() {
|
|
|
13304
13537
|
addCommentReply,
|
|
13305
13538
|
deleteComment,
|
|
13306
13539
|
exportComment,
|
|
13540
|
+
exportEdits,
|
|
13541
|
+
sendEditToAgent: sendEditToAgent2,
|
|
13307
13542
|
sendCommentToAgent: sendCommentToAgent2,
|
|
13308
13543
|
setActiveCommentId,
|
|
13309
13544
|
startTextEditing,
|
|
@@ -13337,21 +13572,23 @@ function DirectEditPanelContent() {
|
|
|
13337
13572
|
const activeDraftComment = React34.useMemo(() => {
|
|
13338
13573
|
if (!commentTargetElement || !activeCommentId) return null;
|
|
13339
13574
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13340
|
-
if (!active || active.text.trim().length > 0 || active.element !== commentTargetElement)
|
|
13575
|
+
if (!active || active.text.trim().length > 0 || active.element !== commentTargetElement)
|
|
13576
|
+
return null;
|
|
13341
13577
|
return active;
|
|
13342
13578
|
}, [activeCommentId, commentTargetElement, comments]);
|
|
13343
|
-
const { isActive: measurementActive, hoveredElement, measurements, mousePosition } = useMeasurement(
|
|
13344
|
-
isOpen ? selectedElement : null
|
|
13345
|
-
);
|
|
13346
13579
|
const {
|
|
13347
|
-
|
|
13348
|
-
|
|
13349
|
-
|
|
13350
|
-
|
|
13580
|
+
isActive: measurementActive,
|
|
13581
|
+
hoveredElement,
|
|
13582
|
+
measurements,
|
|
13583
|
+
mousePosition
|
|
13584
|
+
} = useMeasurement(isOpen ? selectedElement : null);
|
|
13585
|
+
const { dragState, dropIndicator, startDrag } = useMove({
|
|
13351
13586
|
onMoveComplete: handleMoveComplete
|
|
13352
13587
|
});
|
|
13353
13588
|
const triggerCommentInputAttention = React34.useCallback((commentId) => {
|
|
13354
|
-
setCommentInputAttention(
|
|
13589
|
+
setCommentInputAttention(
|
|
13590
|
+
(prev) => prev?.commentId === commentId ? { commentId, nonce: prev.nonce + 1 } : { commentId, nonce: 1 }
|
|
13591
|
+
);
|
|
13355
13592
|
}, []);
|
|
13356
13593
|
React34.useEffect(() => {
|
|
13357
13594
|
if (!activeCommentId) {
|
|
@@ -13365,26 +13602,32 @@ function DirectEditPanelContent() {
|
|
|
13365
13602
|
setCommentDraftBlockedHandler(null);
|
|
13366
13603
|
};
|
|
13367
13604
|
}, [activeCommentId, setCommentDraftBlockedHandler, triggerCommentInputAttention]);
|
|
13368
|
-
const hasPendingCommentDraft = React34.useCallback(
|
|
13369
|
-
|
|
13370
|
-
|
|
13371
|
-
|
|
13372
|
-
if (!active) return false;
|
|
13373
|
-
const hasUnsentDraft = active.text.trim().length === 0 && commentDraftRef.current.trim().length > 0;
|
|
13374
|
-
if (!hasUnsentDraft) return false;
|
|
13375
|
-
triggerCommentInputAttention(active.id);
|
|
13376
|
-
return true;
|
|
13377
|
-
}, [activeCommentId, comments, triggerCommentInputAttention]);
|
|
13378
|
-
const handleSetActiveComment = React34.useCallback((id) => {
|
|
13379
|
-
if (hasPendingCommentDraft(id)) return;
|
|
13380
|
-
if (activeCommentId && activeCommentId !== id) {
|
|
13605
|
+
const hasPendingCommentDraft = React34.useCallback(
|
|
13606
|
+
(nextCommentId = null) => {
|
|
13607
|
+
if (!activeCommentId) return false;
|
|
13608
|
+
if (nextCommentId && nextCommentId === activeCommentId) return false;
|
|
13381
13609
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13382
|
-
if (active
|
|
13383
|
-
|
|
13610
|
+
if (!active) return false;
|
|
13611
|
+
const hasUnsentDraft = active.text.trim().length === 0 && commentDraftRef.current.trim().length > 0;
|
|
13612
|
+
if (!hasUnsentDraft) return false;
|
|
13613
|
+
triggerCommentInputAttention(active.id);
|
|
13614
|
+
return true;
|
|
13615
|
+
},
|
|
13616
|
+
[activeCommentId, comments, triggerCommentInputAttention]
|
|
13617
|
+
);
|
|
13618
|
+
const handleSetActiveComment = React34.useCallback(
|
|
13619
|
+
(id) => {
|
|
13620
|
+
if (hasPendingCommentDraft(id)) return;
|
|
13621
|
+
if (activeCommentId && activeCommentId !== id) {
|
|
13622
|
+
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13623
|
+
if (active && active.text.trim().length === 0) {
|
|
13624
|
+
deleteComment(active.id);
|
|
13625
|
+
}
|
|
13384
13626
|
}
|
|
13385
|
-
|
|
13386
|
-
|
|
13387
|
-
|
|
13627
|
+
setActiveCommentId(id);
|
|
13628
|
+
},
|
|
13629
|
+
[activeCommentId, comments, hasPendingCommentDraft, deleteComment, setActiveCommentId]
|
|
13630
|
+
);
|
|
13388
13631
|
const handleCommentPillClick = React34.useCallback(() => {
|
|
13389
13632
|
if (activeDraftComment) {
|
|
13390
13633
|
handleSetActiveComment(null);
|
|
@@ -13392,13 +13635,23 @@ function DirectEditPanelContent() {
|
|
|
13392
13635
|
}
|
|
13393
13636
|
if (hasPendingCommentDraft()) return;
|
|
13394
13637
|
if (!commentTargetElement) return;
|
|
13395
|
-
const existingDraft = comments.find(
|
|
13638
|
+
const existingDraft = comments.find(
|
|
13639
|
+
(comment) => comment.element === commentTargetElement && comment.text.trim().length === 0
|
|
13640
|
+
);
|
|
13396
13641
|
if (existingDraft) {
|
|
13397
13642
|
setActiveCommentId(existingDraft.id);
|
|
13398
13643
|
return;
|
|
13399
13644
|
}
|
|
13400
13645
|
addComment(commentTargetElement, getElementCommentAnchor(commentTargetElement));
|
|
13401
|
-
}, [
|
|
13646
|
+
}, [
|
|
13647
|
+
activeDraftComment,
|
|
13648
|
+
handleSetActiveComment,
|
|
13649
|
+
hasPendingCommentDraft,
|
|
13650
|
+
commentTargetElement,
|
|
13651
|
+
comments,
|
|
13652
|
+
setActiveCommentId,
|
|
13653
|
+
addComment
|
|
13654
|
+
]);
|
|
13402
13655
|
React34.useEffect(() => {
|
|
13403
13656
|
const previous = previousCommentTriggerRef.current;
|
|
13404
13657
|
previousCommentTriggerRef.current = { editModeActive, commentTargetElement };
|
|
@@ -13495,58 +13748,81 @@ function DirectEditPanelContent() {
|
|
|
13495
13748
|
if (pageTitle.length > 0) return pageTitle;
|
|
13496
13749
|
return getElementDisplayName(pageFrameElement);
|
|
13497
13750
|
}, [pageFrameElement]);
|
|
13498
|
-
const handleSelectSelectionColorTarget = React34.useCallback(
|
|
13499
|
-
|
|
13500
|
-
|
|
13501
|
-
|
|
13502
|
-
|
|
13503
|
-
|
|
13504
|
-
|
|
13505
|
-
|
|
13506
|
-
const
|
|
13507
|
-
|
|
13508
|
-
|
|
13509
|
-
|
|
13510
|
-
|
|
13511
|
-
|
|
13512
|
-
const currentTextColor = computed.color;
|
|
13513
|
-
const matches = (raw, fallback) => {
|
|
13514
|
-
const parsed = parseVisibleColor3(raw, fallback);
|
|
13515
|
-
return Boolean(parsed && toKey(parsed) === targetKey);
|
|
13751
|
+
const handleSelectSelectionColorTarget = React34.useCallback(
|
|
13752
|
+
(targetColor) => {
|
|
13753
|
+
if (!selectedElement) return;
|
|
13754
|
+
const toKey = (color) => `${color.hex.toUpperCase()}:${Math.round(color.alpha)}`;
|
|
13755
|
+
const targetKey = toKey(targetColor);
|
|
13756
|
+
const hasOwnText2 = (node) => Array.from(node.childNodes).some(
|
|
13757
|
+
(child) => child.nodeType === Node.TEXT_NODE && (child.textContent ?? "").trim().length > 0
|
|
13758
|
+
);
|
|
13759
|
+
const parseVisibleColor3 = (raw, fallbackCurrentColor) => {
|
|
13760
|
+
const trimmed = raw.trim();
|
|
13761
|
+
if (!trimmed || trimmed === "none" || trimmed === "transparent") return null;
|
|
13762
|
+
const resolved = trimmed.toLowerCase() === "currentcolor" ? fallbackCurrentColor ?? trimmed : trimmed;
|
|
13763
|
+
const parsed = parseColorValue(resolved);
|
|
13764
|
+
return parsed.alpha > 0 ? parsed : null;
|
|
13516
13765
|
};
|
|
13517
|
-
|
|
13518
|
-
|
|
13519
|
-
|
|
13520
|
-
|
|
13521
|
-
|
|
13522
|
-
|
|
13523
|
-
|
|
13524
|
-
|
|
13525
|
-
|
|
13526
|
-
|
|
13766
|
+
const hasMatchingColor = (node) => {
|
|
13767
|
+
const computed = window.getComputedStyle(node);
|
|
13768
|
+
const currentTextColor = computed.color;
|
|
13769
|
+
const matches = (raw, fallback) => {
|
|
13770
|
+
const parsed = parseVisibleColor3(raw, fallback);
|
|
13771
|
+
return Boolean(parsed && toKey(parsed) === targetKey);
|
|
13772
|
+
};
|
|
13773
|
+
if (matches(computed.backgroundColor)) return true;
|
|
13774
|
+
if (hasOwnText2(node) && matches(currentTextColor)) return true;
|
|
13775
|
+
const borderSides = [
|
|
13776
|
+
{
|
|
13777
|
+
style: computed.borderTopStyle,
|
|
13778
|
+
width: computed.borderTopWidth,
|
|
13779
|
+
color: computed.borderTopColor
|
|
13780
|
+
},
|
|
13781
|
+
{
|
|
13782
|
+
style: computed.borderRightStyle,
|
|
13783
|
+
width: computed.borderRightWidth,
|
|
13784
|
+
color: computed.borderRightColor
|
|
13785
|
+
},
|
|
13786
|
+
{
|
|
13787
|
+
style: computed.borderBottomStyle,
|
|
13788
|
+
width: computed.borderBottomWidth,
|
|
13789
|
+
color: computed.borderBottomColor
|
|
13790
|
+
},
|
|
13791
|
+
{
|
|
13792
|
+
style: computed.borderLeftStyle,
|
|
13793
|
+
width: computed.borderLeftWidth,
|
|
13794
|
+
color: computed.borderLeftColor
|
|
13795
|
+
}
|
|
13796
|
+
];
|
|
13797
|
+
for (const side of borderSides) {
|
|
13798
|
+
if (side.style !== "none" && parseFloat(side.width) > 0 && matches(side.color, currentTextColor)) {
|
|
13799
|
+
return true;
|
|
13800
|
+
}
|
|
13801
|
+
}
|
|
13802
|
+
if (computed.outlineStyle !== "none" && parseFloat(computed.outlineWidth) > 0 && matches(computed.outlineColor, currentTextColor)) {
|
|
13527
13803
|
return true;
|
|
13528
13804
|
}
|
|
13805
|
+
if (node instanceof SVGGraphicsElement) {
|
|
13806
|
+
const fillMatch = matches(computed.getPropertyValue("fill"), currentTextColor) || matches(node.getAttribute("fill") ?? "", currentTextColor);
|
|
13807
|
+
const strokeMatch = matches(computed.getPropertyValue("stroke"), currentTextColor) || matches(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
13808
|
+
if (fillMatch || strokeMatch) return true;
|
|
13809
|
+
}
|
|
13810
|
+
return false;
|
|
13811
|
+
};
|
|
13812
|
+
const descendants = Array.from(selectedElement.querySelectorAll("*"));
|
|
13813
|
+
const firstDescendantMatch = descendants.find(
|
|
13814
|
+
(node) => node instanceof HTMLElement && hasMatchingColor(node)
|
|
13815
|
+
);
|
|
13816
|
+
if (firstDescendantMatch) {
|
|
13817
|
+
selectElement(firstDescendantMatch);
|
|
13818
|
+
return;
|
|
13529
13819
|
}
|
|
13530
|
-
if (
|
|
13531
|
-
|
|
13532
|
-
}
|
|
13533
|
-
if (node instanceof SVGGraphicsElement) {
|
|
13534
|
-
const fillMatch = matches(computed.getPropertyValue("fill"), currentTextColor) || matches(node.getAttribute("fill") ?? "", currentTextColor);
|
|
13535
|
-
const strokeMatch = matches(computed.getPropertyValue("stroke"), currentTextColor) || matches(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
13536
|
-
if (fillMatch || strokeMatch) return true;
|
|
13820
|
+
if (hasMatchingColor(selectedElement)) {
|
|
13821
|
+
selectElement(selectedElement);
|
|
13537
13822
|
}
|
|
13538
|
-
|
|
13539
|
-
|
|
13540
|
-
|
|
13541
|
-
const firstDescendantMatch = descendants.find((node) => node instanceof HTMLElement && hasMatchingColor(node));
|
|
13542
|
-
if (firstDescendantMatch) {
|
|
13543
|
-
selectElement(firstDescendantMatch);
|
|
13544
|
-
return;
|
|
13545
|
-
}
|
|
13546
|
-
if (hasMatchingColor(selectedElement)) {
|
|
13547
|
-
selectElement(selectedElement);
|
|
13548
|
-
}
|
|
13549
|
-
}, [selectedElement, selectElement]);
|
|
13823
|
+
},
|
|
13824
|
+
[selectedElement, selectElement]
|
|
13825
|
+
);
|
|
13550
13826
|
const handleMoveStart = (e, targetElement, options) => {
|
|
13551
13827
|
const elementToDrag = targetElement ?? selectedElement;
|
|
13552
13828
|
if (elementToDrag) {
|
|
@@ -13635,7 +13911,11 @@ function DirectEditPanelContent() {
|
|
|
13635
13911
|
hoveredElement,
|
|
13636
13912
|
measurements: [
|
|
13637
13913
|
...measurements,
|
|
13638
|
-
...calculateGuidelineMeasurements(
|
|
13914
|
+
...calculateGuidelineMeasurements(
|
|
13915
|
+
selectedElement,
|
|
13916
|
+
getStoredGuidelines(),
|
|
13917
|
+
mousePosition
|
|
13918
|
+
)
|
|
13639
13919
|
]
|
|
13640
13920
|
}
|
|
13641
13921
|
),
|
|
@@ -13690,6 +13970,9 @@ function DirectEditPanelContent() {
|
|
|
13690
13970
|
onSelectSelectionColorTarget: handleSelectSelectionColorTarget,
|
|
13691
13971
|
onUpdateTypography: updateTypographyProperty,
|
|
13692
13972
|
onReset: resetToOriginal,
|
|
13973
|
+
onExportEdits: exportEdits,
|
|
13974
|
+
onSendToAgent: agentAvailable ? sendEditToAgent2 : void 0,
|
|
13975
|
+
sendFailureReason: lastSendFailure?.reason ?? null,
|
|
13693
13976
|
className: "fixed z-[99999]",
|
|
13694
13977
|
style: {
|
|
13695
13978
|
left: position.x,
|