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.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import * as React8 from "react";
|
|
|
7
7
|
import * as React from "react";
|
|
8
8
|
|
|
9
9
|
// dist/styles.css
|
|
10
|
-
var styles_default = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover-foreground:#171717}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.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}}';
|
|
10
|
+
var styles_default = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover-foreground:#171717}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.left-1\\.5{left:calc(var(--spacing)*1.5)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.isolate{isolation:isolate}.z-\\[99990\\]{z-index:99990}.z-\\[99991\\]{z-index:99991}.z-\\[99998\\]{z-index:99998}.z-\\[99999\\]{z-index:99999}.\\!container{width:100%!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}}';
|
|
11
11
|
|
|
12
12
|
// src/portal-container.tsx
|
|
13
13
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -492,14 +492,7 @@ function getReactComponentInfo(element) {
|
|
|
492
492
|
}
|
|
493
493
|
return { ...getRenderStack(fiber), elementSourceFile };
|
|
494
494
|
}
|
|
495
|
-
var EXCLUDED_PROP_KEYS = /* @__PURE__ */ new Set([
|
|
496
|
-
"className",
|
|
497
|
-
"style",
|
|
498
|
-
"children",
|
|
499
|
-
"ref",
|
|
500
|
-
"key",
|
|
501
|
-
"render"
|
|
502
|
-
]);
|
|
495
|
+
var EXCLUDED_PROP_KEYS = /* @__PURE__ */ new Set(["className", "style", "children", "ref", "key", "render"]);
|
|
503
496
|
function serializePropValue(value) {
|
|
504
497
|
if (typeof value === "function") return "[function]";
|
|
505
498
|
if (typeof value === "symbol") return void 0;
|
|
@@ -610,19 +603,7 @@ function classifyComponentFiber(fiber, frames, elementSourceFile) {
|
|
|
610
603
|
return { isComponentPrimitive: false };
|
|
611
604
|
}
|
|
612
605
|
|
|
613
|
-
// src/utils.ts
|
|
614
|
-
function clamp(value, min, max) {
|
|
615
|
-
if (!Number.isFinite(value)) return min;
|
|
616
|
-
if (max < min) return min;
|
|
617
|
-
return Math.max(min, Math.min(max, value));
|
|
618
|
-
}
|
|
619
|
-
function isInputFocused() {
|
|
620
|
-
let active = document.activeElement;
|
|
621
|
-
while (active?.shadowRoot?.activeElement) {
|
|
622
|
-
active = active.shadowRoot.activeElement;
|
|
623
|
-
}
|
|
624
|
-
return active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || active instanceof HTMLElement && active.isContentEditable;
|
|
625
|
-
}
|
|
606
|
+
// src/utils/computed-styles.ts
|
|
626
607
|
function getComputedStyles(element) {
|
|
627
608
|
const computed = window.getComputedStyle(element);
|
|
628
609
|
return {
|
|
@@ -731,6 +712,255 @@ function getOriginalInlineStyles(element) {
|
|
|
731
712
|
}
|
|
732
713
|
return styles;
|
|
733
714
|
}
|
|
715
|
+
function getComputedTypography(element) {
|
|
716
|
+
const computed = window.getComputedStyle(element);
|
|
717
|
+
let textVerticalAlign = "flex-start";
|
|
718
|
+
if (computed.display === "flex" || computed.display === "inline-flex") {
|
|
719
|
+
const alignItems = computed.alignItems;
|
|
720
|
+
if (alignItems === "center") textVerticalAlign = "center";
|
|
721
|
+
else if (alignItems === "flex-end" || alignItems === "end") textVerticalAlign = "flex-end";
|
|
722
|
+
}
|
|
723
|
+
const lineHeight = computed.lineHeight === "normal" ? {
|
|
724
|
+
numericValue: parseFloat(computed.fontSize) * 1.2,
|
|
725
|
+
unit: "px",
|
|
726
|
+
raw: `${Math.round(parseFloat(computed.fontSize) * 1.2)}px`
|
|
727
|
+
} : parsePropertyValue(computed.lineHeight);
|
|
728
|
+
const fontSize = parseFloat(computed.fontSize);
|
|
729
|
+
let letterSpacing;
|
|
730
|
+
if (computed.letterSpacing === "normal") {
|
|
731
|
+
letterSpacing = { numericValue: 0, unit: "em", raw: "0em" };
|
|
732
|
+
} else {
|
|
733
|
+
const parsed = parsePropertyValue(computed.letterSpacing);
|
|
734
|
+
if (parsed.unit === "px" && fontSize > 0) {
|
|
735
|
+
const emValue = Math.round(parsed.numericValue / fontSize * 100) / 100;
|
|
736
|
+
letterSpacing = { numericValue: emValue, unit: "em", raw: `${emValue}em` };
|
|
737
|
+
} else {
|
|
738
|
+
letterSpacing = parsed;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return {
|
|
742
|
+
fontFamily: computed.fontFamily,
|
|
743
|
+
fontWeight: computed.fontWeight,
|
|
744
|
+
fontSize: parsePropertyValue(computed.fontSize),
|
|
745
|
+
lineHeight,
|
|
746
|
+
letterSpacing,
|
|
747
|
+
textAlign: computed.textAlign,
|
|
748
|
+
textVerticalAlign
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
function getComputedSizing(element) {
|
|
752
|
+
return {
|
|
753
|
+
width: getSizingValue(element, "width"),
|
|
754
|
+
height: getSizingValue(element, "height")
|
|
755
|
+
};
|
|
756
|
+
}
|
|
757
|
+
var TEXT_ELEMENT_TAGS = /* @__PURE__ */ new Set([
|
|
758
|
+
"p",
|
|
759
|
+
"h1",
|
|
760
|
+
"h2",
|
|
761
|
+
"h3",
|
|
762
|
+
"h4",
|
|
763
|
+
"h5",
|
|
764
|
+
"h6",
|
|
765
|
+
"span",
|
|
766
|
+
"label",
|
|
767
|
+
"a",
|
|
768
|
+
"strong",
|
|
769
|
+
"em",
|
|
770
|
+
"small",
|
|
771
|
+
"blockquote",
|
|
772
|
+
"li",
|
|
773
|
+
"td",
|
|
774
|
+
"th",
|
|
775
|
+
"caption",
|
|
776
|
+
"figcaption",
|
|
777
|
+
"legend",
|
|
778
|
+
"dt",
|
|
779
|
+
"dd",
|
|
780
|
+
"abbr",
|
|
781
|
+
"cite",
|
|
782
|
+
"code",
|
|
783
|
+
"pre"
|
|
784
|
+
]);
|
|
785
|
+
function hasDirectNonWhitespaceText(element) {
|
|
786
|
+
return Array.from(element.childNodes).some(
|
|
787
|
+
(node) => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
var TRANSPARENT_COLOR = { hex: "000000", alpha: 0, raw: "transparent" };
|
|
791
|
+
function isVisibleBorderSide(side) {
|
|
792
|
+
return side.style !== "none" && side.style !== "hidden" && parseFloat(side.width) > 0;
|
|
793
|
+
}
|
|
794
|
+
function hasVisibleOutline(computed) {
|
|
795
|
+
return computed.outlineStyle !== "none" && parseFloat(computed.outlineWidth) > 0;
|
|
796
|
+
}
|
|
797
|
+
function parseVisibleColor(value, fallbackCurrentColor) {
|
|
798
|
+
const raw = value.trim();
|
|
799
|
+
const lowered = raw.toLowerCase();
|
|
800
|
+
if (!raw || lowered === "none" || lowered === "transparent") {
|
|
801
|
+
return null;
|
|
802
|
+
}
|
|
803
|
+
const resolved = /^currentcolor$/i.test(raw) ? fallbackCurrentColor ?? raw : raw;
|
|
804
|
+
const parsed = parseColorValue(resolved);
|
|
805
|
+
if (parsed.alpha <= 0) {
|
|
806
|
+
return null;
|
|
807
|
+
}
|
|
808
|
+
return parsed;
|
|
809
|
+
}
|
|
810
|
+
function addUniqueColor(colors, color) {
|
|
811
|
+
if (!color) return;
|
|
812
|
+
colors.set(`${color.hex}:${color.alpha}`, color);
|
|
813
|
+
}
|
|
814
|
+
function isTextRenderingFormControl(element) {
|
|
815
|
+
if (element instanceof HTMLTextAreaElement) return true;
|
|
816
|
+
if (element instanceof HTMLSelectElement) return true;
|
|
817
|
+
if (element instanceof HTMLButtonElement) return true;
|
|
818
|
+
if (element instanceof HTMLInputElement) {
|
|
819
|
+
const textlessInputTypes = /* @__PURE__ */ new Set([
|
|
820
|
+
"hidden",
|
|
821
|
+
"checkbox",
|
|
822
|
+
"radio",
|
|
823
|
+
"range",
|
|
824
|
+
"color",
|
|
825
|
+
"file",
|
|
826
|
+
"image"
|
|
827
|
+
]);
|
|
828
|
+
return !textlessInputTypes.has(element.type.toLowerCase());
|
|
829
|
+
}
|
|
830
|
+
return false;
|
|
831
|
+
}
|
|
832
|
+
function hasRenderableTextNode(element) {
|
|
833
|
+
if (element.isContentEditable) return true;
|
|
834
|
+
if (isTextRenderingFormControl(element)) return true;
|
|
835
|
+
if (!element.textContent?.trim()) return false;
|
|
836
|
+
if (hasDirectNonWhitespaceText(element)) return true;
|
|
837
|
+
const tagName = element.tagName.toLowerCase();
|
|
838
|
+
return TEXT_ELEMENT_TAGS.has(tagName) || element.children.length === 0;
|
|
839
|
+
}
|
|
840
|
+
function getComputedBoxShadow(element) {
|
|
841
|
+
const computed = window.getComputedStyle(element);
|
|
842
|
+
const value = computed.boxShadow.trim();
|
|
843
|
+
return value || "none";
|
|
844
|
+
}
|
|
845
|
+
function getComputedColorStyles(element) {
|
|
846
|
+
const computed = window.getComputedStyle(element);
|
|
847
|
+
const borderSides = [
|
|
848
|
+
{
|
|
849
|
+
style: computed.borderTopStyle,
|
|
850
|
+
width: computed.borderTopWidth,
|
|
851
|
+
color: computed.borderTopColor
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
style: computed.borderRightStyle,
|
|
855
|
+
width: computed.borderRightWidth,
|
|
856
|
+
color: computed.borderRightColor
|
|
857
|
+
},
|
|
858
|
+
{
|
|
859
|
+
style: computed.borderBottomStyle,
|
|
860
|
+
width: computed.borderBottomWidth,
|
|
861
|
+
color: computed.borderBottomColor
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
style: computed.borderLeftStyle,
|
|
865
|
+
width: computed.borderLeftWidth,
|
|
866
|
+
color: computed.borderLeftColor
|
|
867
|
+
}
|
|
868
|
+
];
|
|
869
|
+
const visibleBorderSide = borderSides.find((side) => isVisibleBorderSide(side));
|
|
870
|
+
const hasBorder = Boolean(visibleBorderSide);
|
|
871
|
+
const hasOutline = hasVisibleOutline(computed);
|
|
872
|
+
return {
|
|
873
|
+
backgroundColor: parseColorValue(computed.backgroundColor),
|
|
874
|
+
color: parseColorValue(computed.color),
|
|
875
|
+
borderColor: hasBorder && visibleBorderSide ? parseColorValue(visibleBorderSide.color) : TRANSPARENT_COLOR,
|
|
876
|
+
outlineColor: hasOutline ? parseColorValue(computed.outlineColor) : TRANSPARENT_COLOR
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
function getSelectionColors(element) {
|
|
880
|
+
const uniqueColors = /* @__PURE__ */ new Map();
|
|
881
|
+
const queue = [element];
|
|
882
|
+
for (let index = 0; index < queue.length; index++) {
|
|
883
|
+
const node = queue[index];
|
|
884
|
+
const computed = window.getComputedStyle(node);
|
|
885
|
+
if (computed.display === "none") {
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
const isVisibilityHidden = computed.visibility === "hidden" || computed.visibility === "collapse";
|
|
889
|
+
const currentTextColor = computed.color;
|
|
890
|
+
if (!isVisibilityHidden) {
|
|
891
|
+
addUniqueColor(uniqueColors, parseVisibleColor(computed.backgroundColor));
|
|
892
|
+
if (node instanceof HTMLElement && hasRenderableTextNode(node)) {
|
|
893
|
+
addUniqueColor(uniqueColors, parseVisibleColor(currentTextColor));
|
|
894
|
+
}
|
|
895
|
+
const borderSides = [
|
|
896
|
+
{
|
|
897
|
+
style: computed.borderTopStyle,
|
|
898
|
+
width: computed.borderTopWidth,
|
|
899
|
+
color: computed.borderTopColor
|
|
900
|
+
},
|
|
901
|
+
{
|
|
902
|
+
style: computed.borderRightStyle,
|
|
903
|
+
width: computed.borderRightWidth,
|
|
904
|
+
color: computed.borderRightColor
|
|
905
|
+
},
|
|
906
|
+
{
|
|
907
|
+
style: computed.borderBottomStyle,
|
|
908
|
+
width: computed.borderBottomWidth,
|
|
909
|
+
color: computed.borderBottomColor
|
|
910
|
+
},
|
|
911
|
+
{
|
|
912
|
+
style: computed.borderLeftStyle,
|
|
913
|
+
width: computed.borderLeftWidth,
|
|
914
|
+
color: computed.borderLeftColor
|
|
915
|
+
}
|
|
916
|
+
];
|
|
917
|
+
for (const side of borderSides) {
|
|
918
|
+
if (!isVisibleBorderSide(side)) continue;
|
|
919
|
+
addUniqueColor(uniqueColors, parseVisibleColor(side.color, currentTextColor));
|
|
920
|
+
}
|
|
921
|
+
if (hasVisibleOutline(computed)) {
|
|
922
|
+
addUniqueColor(uniqueColors, parseVisibleColor(computed.outlineColor, currentTextColor));
|
|
923
|
+
}
|
|
924
|
+
if (node instanceof SVGElement) {
|
|
925
|
+
const fillColor = parseVisibleColor(computed.getPropertyValue("fill"), currentTextColor) ?? parseVisibleColor(node.getAttribute("fill") ?? "", currentTextColor);
|
|
926
|
+
const strokeColor = parseVisibleColor(computed.getPropertyValue("stroke"), currentTextColor) ?? parseVisibleColor(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
927
|
+
addUniqueColor(uniqueColors, fillColor);
|
|
928
|
+
addUniqueColor(uniqueColors, strokeColor);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
for (const child of node.children) {
|
|
932
|
+
queue.push(child);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
return Array.from(uniqueColors.values());
|
|
936
|
+
}
|
|
937
|
+
function getAllComputedStyles(element) {
|
|
938
|
+
const { spacing, borderRadius, flex } = getComputedStyles(element);
|
|
939
|
+
return {
|
|
940
|
+
spacing,
|
|
941
|
+
borderRadius,
|
|
942
|
+
border: getComputedBorderStyles(element),
|
|
943
|
+
flex,
|
|
944
|
+
sizing: getComputedSizing(element),
|
|
945
|
+
color: getComputedColorStyles(element),
|
|
946
|
+
boxShadow: getComputedBoxShadow(element),
|
|
947
|
+
typography: getComputedTypography(element)
|
|
948
|
+
};
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
// src/utils.ts
|
|
952
|
+
function clamp(value, min, max) {
|
|
953
|
+
if (!Number.isFinite(value)) return min;
|
|
954
|
+
if (max < min) return min;
|
|
955
|
+
return Math.max(min, Math.min(max, value));
|
|
956
|
+
}
|
|
957
|
+
function isInputFocused() {
|
|
958
|
+
let active = document.activeElement;
|
|
959
|
+
while (active?.shadowRoot?.activeElement) {
|
|
960
|
+
active = active.shadowRoot.activeElement;
|
|
961
|
+
}
|
|
962
|
+
return active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || active instanceof HTMLElement && active.isContentEditable;
|
|
963
|
+
}
|
|
734
964
|
var spacingScale = { 0: "0", 1: "px", 2: "0.5", 4: "1", 8: "2", 12: "3", 16: "4", 20: "5", 24: "6", 32: "8" };
|
|
735
965
|
var tailwindClassMap = {
|
|
736
966
|
padding: { prefix: "p", scale: spacingScale },
|
|
@@ -1057,7 +1287,7 @@ var typographyPropertyToCSSMap = {
|
|
|
1057
1287
|
textAlign: "text-align",
|
|
1058
1288
|
textVerticalAlign: "align-items"
|
|
1059
1289
|
};
|
|
1060
|
-
var
|
|
1290
|
+
var TEXT_ELEMENT_TAGS2 = /* @__PURE__ */ new Set([
|
|
1061
1291
|
"p",
|
|
1062
1292
|
"h1",
|
|
1063
1293
|
"h2",
|
|
@@ -1085,17 +1315,17 @@ var TEXT_ELEMENT_TAGS = /* @__PURE__ */ new Set([
|
|
|
1085
1315
|
"code",
|
|
1086
1316
|
"pre"
|
|
1087
1317
|
]);
|
|
1088
|
-
function
|
|
1318
|
+
function hasDirectNonWhitespaceText2(element) {
|
|
1089
1319
|
return Array.from(element.childNodes).some(
|
|
1090
1320
|
(node) => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())
|
|
1091
1321
|
);
|
|
1092
1322
|
}
|
|
1093
1323
|
function isTextElement2(element) {
|
|
1094
1324
|
const tagName = element.tagName.toLowerCase();
|
|
1095
|
-
if (
|
|
1325
|
+
if (TEXT_ELEMENT_TAGS2.has(tagName)) {
|
|
1096
1326
|
return true;
|
|
1097
1327
|
}
|
|
1098
|
-
if (
|
|
1328
|
+
if (hasDirectNonWhitespaceText2(element)) {
|
|
1099
1329
|
return true;
|
|
1100
1330
|
}
|
|
1101
1331
|
if (element.children.length === 0 && element.textContent?.trim()) {
|
|
@@ -1103,38 +1333,6 @@ function isTextElement2(element) {
|
|
|
1103
1333
|
}
|
|
1104
1334
|
return false;
|
|
1105
1335
|
}
|
|
1106
|
-
function getComputedTypography(element) {
|
|
1107
|
-
const computed = window.getComputedStyle(element);
|
|
1108
|
-
let textVerticalAlign = "flex-start";
|
|
1109
|
-
if (computed.display === "flex" || computed.display === "inline-flex") {
|
|
1110
|
-
const alignItems = computed.alignItems;
|
|
1111
|
-
if (alignItems === "center") textVerticalAlign = "center";
|
|
1112
|
-
else if (alignItems === "flex-end" || alignItems === "end") textVerticalAlign = "flex-end";
|
|
1113
|
-
}
|
|
1114
|
-
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);
|
|
1115
|
-
const fontSize = parseFloat(computed.fontSize);
|
|
1116
|
-
let letterSpacing;
|
|
1117
|
-
if (computed.letterSpacing === "normal") {
|
|
1118
|
-
letterSpacing = { numericValue: 0, unit: "em", raw: "0em" };
|
|
1119
|
-
} else {
|
|
1120
|
-
const parsed = parsePropertyValue(computed.letterSpacing);
|
|
1121
|
-
if (parsed.unit === "px" && fontSize > 0) {
|
|
1122
|
-
const emValue = Math.round(parsed.numericValue / fontSize * 100) / 100;
|
|
1123
|
-
letterSpacing = { numericValue: emValue, unit: "em", raw: `${emValue}em` };
|
|
1124
|
-
} else {
|
|
1125
|
-
letterSpacing = parsed;
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
return {
|
|
1129
|
-
fontFamily: computed.fontFamily,
|
|
1130
|
-
fontWeight: computed.fontWeight,
|
|
1131
|
-
fontSize: parsePropertyValue(computed.fontSize),
|
|
1132
|
-
lineHeight,
|
|
1133
|
-
letterSpacing,
|
|
1134
|
-
textAlign: computed.textAlign,
|
|
1135
|
-
textVerticalAlign
|
|
1136
|
-
};
|
|
1137
|
-
}
|
|
1138
1336
|
function detectSizingMode(element, dimension) {
|
|
1139
1337
|
const computed = window.getComputedStyle(element);
|
|
1140
1338
|
const inlineValue = element.style[dimension];
|
|
@@ -1182,12 +1380,6 @@ function getSizingValue(element, dimension) {
|
|
|
1182
1380
|
}
|
|
1183
1381
|
};
|
|
1184
1382
|
}
|
|
1185
|
-
function getComputedSizing(element) {
|
|
1186
|
-
return {
|
|
1187
|
-
width: getSizingValue(element, "width"),
|
|
1188
|
-
height: getSizingValue(element, "height")
|
|
1189
|
-
};
|
|
1190
|
-
}
|
|
1191
1383
|
function sizingValueToCSS(sizing) {
|
|
1192
1384
|
switch (sizing.mode) {
|
|
1193
1385
|
case "fill":
|
|
@@ -1227,202 +1419,74 @@ function parseRgbAlpha(value) {
|
|
|
1227
1419
|
const token = value.trim();
|
|
1228
1420
|
if (token.endsWith("%")) {
|
|
1229
1421
|
const numeric2 = parseFloat(token.slice(0, -1));
|
|
1230
|
-
if (!Number.isFinite(numeric2)) return null;
|
|
1231
|
-
return Math.max(0, Math.min(100, numeric2)) / 100;
|
|
1232
|
-
}
|
|
1233
|
-
const numeric = parseFloat(token);
|
|
1234
|
-
if (!Number.isFinite(numeric)) return null;
|
|
1235
|
-
return Math.max(0, Math.min(1, numeric));
|
|
1236
|
-
}
|
|
1237
|
-
function parseRgbaColor(rgba) {
|
|
1238
|
-
const raw = rgba.trim();
|
|
1239
|
-
const fnMatch = raw.match(/^rgba?\((.*)\)$/i);
|
|
1240
|
-
if (!fnMatch) {
|
|
1241
|
-
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1242
|
-
}
|
|
1243
|
-
const body = fnMatch[1].trim();
|
|
1244
|
-
let channelTokens = null;
|
|
1245
|
-
let alphaToken;
|
|
1246
|
-
const commaParts = body.split(",").map((part) => part.trim()).filter(Boolean);
|
|
1247
|
-
if (commaParts.length === 3 || commaParts.length === 4) {
|
|
1248
|
-
channelTokens = [commaParts[0], commaParts[1], commaParts[2]];
|
|
1249
|
-
alphaToken = commaParts[3];
|
|
1250
|
-
} else {
|
|
1251
|
-
const slashParts = body.split("/");
|
|
1252
|
-
if (slashParts.length === 1 || slashParts.length === 2) {
|
|
1253
|
-
const channels = slashParts[0].trim().split(/\s+/).filter(Boolean);
|
|
1254
|
-
if (channels.length === 3) {
|
|
1255
|
-
channelTokens = [channels[0], channels[1], channels[2]];
|
|
1256
|
-
alphaToken = slashParts[1]?.trim();
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
if (!channelTokens) {
|
|
1261
|
-
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1262
|
-
}
|
|
1263
|
-
const r = parseRgbChannel(channelTokens[0]);
|
|
1264
|
-
const g = parseRgbChannel(channelTokens[1]);
|
|
1265
|
-
const b = parseRgbChannel(channelTokens[2]);
|
|
1266
|
-
const a = parseRgbAlpha(alphaToken);
|
|
1267
|
-
if (r === null || g === null || b === null || a === null) {
|
|
1268
|
-
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1269
|
-
}
|
|
1270
|
-
const hex = [r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1271
|
-
const alpha = Math.round(a * 100);
|
|
1272
|
-
return { hex, alpha, raw: rgba };
|
|
1273
|
-
}
|
|
1274
|
-
function parseNamedColor(name) {
|
|
1275
|
-
const ctx = document.createElement("canvas").getContext("2d");
|
|
1276
|
-
if (!ctx) {
|
|
1277
|
-
return { hex: "000000", alpha: 100, raw: name };
|
|
1278
|
-
}
|
|
1279
|
-
ctx.fillStyle = name;
|
|
1280
|
-
const computed = ctx.fillStyle;
|
|
1281
|
-
if (computed.startsWith("#")) {
|
|
1282
|
-
return parseHexColor(computed);
|
|
1283
|
-
}
|
|
1284
|
-
return parseRgbaColor(computed);
|
|
1285
|
-
}
|
|
1286
|
-
function parseColorValue(cssValue) {
|
|
1287
|
-
const raw = cssValue.trim();
|
|
1288
|
-
if (raw === "transparent") {
|
|
1289
|
-
return { hex: "000000", alpha: 0, raw };
|
|
1290
|
-
}
|
|
1291
|
-
if (raw.startsWith("#")) {
|
|
1292
|
-
return parseHexColor(raw);
|
|
1293
|
-
}
|
|
1294
|
-
if (raw.startsWith("rgb")) {
|
|
1295
|
-
return parseRgbaColor(raw);
|
|
1296
|
-
}
|
|
1297
|
-
return parseNamedColor(raw);
|
|
1298
|
-
}
|
|
1299
|
-
var TRANSPARENT_COLOR = { hex: "000000", alpha: 0, raw: "transparent" };
|
|
1300
|
-
function isVisibleBorderSide(side) {
|
|
1301
|
-
return side.style !== "none" && side.style !== "hidden" && parseFloat(side.width) > 0;
|
|
1302
|
-
}
|
|
1303
|
-
function hasVisibleOutline(computed) {
|
|
1304
|
-
return computed.outlineStyle !== "none" && parseFloat(computed.outlineWidth) > 0;
|
|
1305
|
-
}
|
|
1306
|
-
function parseVisibleColor(value, fallbackCurrentColor) {
|
|
1307
|
-
const raw = value.trim();
|
|
1308
|
-
const lowered = raw.toLowerCase();
|
|
1309
|
-
if (!raw || lowered === "none" || lowered === "transparent") {
|
|
1310
|
-
return null;
|
|
1311
|
-
}
|
|
1312
|
-
const resolved = /^currentcolor$/i.test(raw) ? fallbackCurrentColor ?? raw : raw;
|
|
1313
|
-
const parsed = parseColorValue(resolved);
|
|
1314
|
-
if (parsed.alpha <= 0) {
|
|
1315
|
-
return null;
|
|
1316
|
-
}
|
|
1317
|
-
return parsed;
|
|
1318
|
-
}
|
|
1319
|
-
function addUniqueColor(colors, color) {
|
|
1320
|
-
if (!color) return;
|
|
1321
|
-
colors.set(`${color.hex}:${color.alpha}`, color);
|
|
1322
|
-
}
|
|
1323
|
-
function isTextRenderingFormControl(element) {
|
|
1324
|
-
if (element instanceof HTMLTextAreaElement) return true;
|
|
1325
|
-
if (element instanceof HTMLSelectElement) return true;
|
|
1326
|
-
if (element instanceof HTMLButtonElement) return true;
|
|
1327
|
-
if (element instanceof HTMLInputElement) {
|
|
1328
|
-
const textlessInputTypes = /* @__PURE__ */ new Set([
|
|
1329
|
-
"hidden",
|
|
1330
|
-
"checkbox",
|
|
1331
|
-
"radio",
|
|
1332
|
-
"range",
|
|
1333
|
-
"color",
|
|
1334
|
-
"file",
|
|
1335
|
-
"image"
|
|
1336
|
-
]);
|
|
1337
|
-
return !textlessInputTypes.has(element.type.toLowerCase());
|
|
1338
|
-
}
|
|
1339
|
-
return false;
|
|
1340
|
-
}
|
|
1341
|
-
function hasRenderableTextNode(element) {
|
|
1342
|
-
if (element.isContentEditable) return true;
|
|
1343
|
-
if (isTextRenderingFormControl(element)) return true;
|
|
1344
|
-
if (!element.textContent?.trim()) return false;
|
|
1345
|
-
if (hasDirectNonWhitespaceText(element)) return true;
|
|
1346
|
-
const tagName = element.tagName.toLowerCase();
|
|
1347
|
-
return TEXT_ELEMENT_TAGS.has(tagName) || element.children.length === 0;
|
|
1348
|
-
}
|
|
1349
|
-
function getComputedBoxShadow(element) {
|
|
1350
|
-
const computed = window.getComputedStyle(element);
|
|
1351
|
-
const value = computed.boxShadow.trim();
|
|
1352
|
-
return value || "none";
|
|
1353
|
-
}
|
|
1354
|
-
function getComputedColorStyles(element) {
|
|
1355
|
-
const computed = window.getComputedStyle(element);
|
|
1356
|
-
const borderSides = [
|
|
1357
|
-
{ style: computed.borderTopStyle, width: computed.borderTopWidth, color: computed.borderTopColor },
|
|
1358
|
-
{ style: computed.borderRightStyle, width: computed.borderRightWidth, color: computed.borderRightColor },
|
|
1359
|
-
{ style: computed.borderBottomStyle, width: computed.borderBottomWidth, color: computed.borderBottomColor },
|
|
1360
|
-
{ style: computed.borderLeftStyle, width: computed.borderLeftWidth, color: computed.borderLeftColor }
|
|
1361
|
-
];
|
|
1362
|
-
const visibleBorderSide = borderSides.find((side) => isVisibleBorderSide(side));
|
|
1363
|
-
const hasBorder = Boolean(visibleBorderSide);
|
|
1364
|
-
const hasOutline = hasVisibleOutline(computed);
|
|
1365
|
-
return {
|
|
1366
|
-
backgroundColor: parseColorValue(computed.backgroundColor),
|
|
1367
|
-
color: parseColorValue(computed.color),
|
|
1368
|
-
borderColor: hasBorder && visibleBorderSide ? parseColorValue(visibleBorderSide.color) : TRANSPARENT_COLOR,
|
|
1369
|
-
outlineColor: hasOutline ? parseColorValue(computed.outlineColor) : TRANSPARENT_COLOR
|
|
1370
|
-
};
|
|
1422
|
+
if (!Number.isFinite(numeric2)) return null;
|
|
1423
|
+
return Math.max(0, Math.min(100, numeric2)) / 100;
|
|
1424
|
+
}
|
|
1425
|
+
const numeric = parseFloat(token);
|
|
1426
|
+
if (!Number.isFinite(numeric)) return null;
|
|
1427
|
+
return Math.max(0, Math.min(1, numeric));
|
|
1371
1428
|
}
|
|
1372
|
-
function
|
|
1373
|
-
const
|
|
1374
|
-
const
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
const
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
{ style: computed.borderLeftStyle, width: computed.borderLeftWidth, color: computed.borderLeftColor }
|
|
1393
|
-
];
|
|
1394
|
-
for (const side of borderSides) {
|
|
1395
|
-
if (!isVisibleBorderSide(side)) continue;
|
|
1396
|
-
addUniqueColor(uniqueColors, parseVisibleColor(side.color, currentTextColor));
|
|
1397
|
-
}
|
|
1398
|
-
if (hasVisibleOutline(computed)) {
|
|
1399
|
-
addUniqueColor(uniqueColors, parseVisibleColor(computed.outlineColor, currentTextColor));
|
|
1400
|
-
}
|
|
1401
|
-
if (node instanceof SVGElement) {
|
|
1402
|
-
const fillColor = parseVisibleColor(computed.getPropertyValue("fill"), currentTextColor) ?? parseVisibleColor(node.getAttribute("fill") ?? "", currentTextColor);
|
|
1403
|
-
const strokeColor = parseVisibleColor(computed.getPropertyValue("stroke"), currentTextColor) ?? parseVisibleColor(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
1404
|
-
addUniqueColor(uniqueColors, fillColor);
|
|
1405
|
-
addUniqueColor(uniqueColors, strokeColor);
|
|
1429
|
+
function parseRgbaColor(rgba) {
|
|
1430
|
+
const raw = rgba.trim();
|
|
1431
|
+
const fnMatch = raw.match(/^rgba?\((.*)\)$/i);
|
|
1432
|
+
if (!fnMatch) {
|
|
1433
|
+
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1434
|
+
}
|
|
1435
|
+
const body = fnMatch[1].trim();
|
|
1436
|
+
let channelTokens = null;
|
|
1437
|
+
let alphaToken;
|
|
1438
|
+
const commaParts = body.split(",").map((part) => part.trim()).filter(Boolean);
|
|
1439
|
+
if (commaParts.length === 3 || commaParts.length === 4) {
|
|
1440
|
+
channelTokens = [commaParts[0], commaParts[1], commaParts[2]];
|
|
1441
|
+
alphaToken = commaParts[3];
|
|
1442
|
+
} else {
|
|
1443
|
+
const slashParts = body.split("/");
|
|
1444
|
+
if (slashParts.length === 1 || slashParts.length === 2) {
|
|
1445
|
+
const channels = slashParts[0].trim().split(/\s+/).filter(Boolean);
|
|
1446
|
+
if (channels.length === 3) {
|
|
1447
|
+
channelTokens = [channels[0], channels[1], channels[2]];
|
|
1448
|
+
alphaToken = slashParts[1]?.trim();
|
|
1406
1449
|
}
|
|
1407
1450
|
}
|
|
1408
|
-
for (const child of node.children) {
|
|
1409
|
-
queue.push(child);
|
|
1410
|
-
}
|
|
1411
1451
|
}
|
|
1412
|
-
|
|
1452
|
+
if (!channelTokens) {
|
|
1453
|
+
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1454
|
+
}
|
|
1455
|
+
const r = parseRgbChannel(channelTokens[0]);
|
|
1456
|
+
const g = parseRgbChannel(channelTokens[1]);
|
|
1457
|
+
const b = parseRgbChannel(channelTokens[2]);
|
|
1458
|
+
const a = parseRgbAlpha(alphaToken);
|
|
1459
|
+
if (r === null || g === null || b === null || a === null) {
|
|
1460
|
+
return { hex: "000000", alpha: 100, raw: rgba };
|
|
1461
|
+
}
|
|
1462
|
+
const hex = [r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1463
|
+
const alpha = Math.round(a * 100);
|
|
1464
|
+
return { hex, alpha, raw: rgba };
|
|
1413
1465
|
}
|
|
1414
|
-
function
|
|
1415
|
-
const
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1466
|
+
function parseNamedColor(name) {
|
|
1467
|
+
const ctx = document.createElement("canvas").getContext("2d");
|
|
1468
|
+
if (!ctx) {
|
|
1469
|
+
return { hex: "000000", alpha: 100, raw: name };
|
|
1470
|
+
}
|
|
1471
|
+
ctx.fillStyle = name;
|
|
1472
|
+
const computed = ctx.fillStyle;
|
|
1473
|
+
if (computed.startsWith("#")) {
|
|
1474
|
+
return parseHexColor(computed);
|
|
1475
|
+
}
|
|
1476
|
+
return parseRgbaColor(computed);
|
|
1477
|
+
}
|
|
1478
|
+
function parseColorValue(cssValue) {
|
|
1479
|
+
const raw = cssValue.trim();
|
|
1480
|
+
if (raw === "transparent") {
|
|
1481
|
+
return { hex: "000000", alpha: 0, raw };
|
|
1482
|
+
}
|
|
1483
|
+
if (raw.startsWith("#")) {
|
|
1484
|
+
return parseHexColor(raw);
|
|
1485
|
+
}
|
|
1486
|
+
if (raw.startsWith("rgb")) {
|
|
1487
|
+
return parseRgbaColor(raw);
|
|
1488
|
+
}
|
|
1489
|
+
return parseNamedColor(raw);
|
|
1426
1490
|
}
|
|
1427
1491
|
var colorPropertyToCSSMap = {
|
|
1428
1492
|
backgroundColor: "background-color",
|
|
@@ -1878,7 +1942,7 @@ function findChildAtPoint(parent, clientX, clientY) {
|
|
|
1878
1942
|
return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom;
|
|
1879
1943
|
});
|
|
1880
1944
|
if (hit) return hit;
|
|
1881
|
-
if (children.length === 1 && !
|
|
1945
|
+
if (children.length === 1 && !hasDirectNonWhitespaceText2(parent)) return children[0];
|
|
1882
1946
|
return null;
|
|
1883
1947
|
}
|
|
1884
1948
|
function elementFromPointWithoutOverlays(x, y) {
|
|
@@ -7681,6 +7745,219 @@ function createDragInteractionGuard() {
|
|
|
7681
7745
|
};
|
|
7682
7746
|
}
|
|
7683
7747
|
|
|
7748
|
+
// src/utils/resize-geometry.ts
|
|
7749
|
+
function toFinite(value, fallback) {
|
|
7750
|
+
if (!Number.isFinite(value)) return fallback;
|
|
7751
|
+
return value;
|
|
7752
|
+
}
|
|
7753
|
+
function multiplyMatrix(left, right) {
|
|
7754
|
+
return {
|
|
7755
|
+
a: left.a * right.a + left.c * right.b,
|
|
7756
|
+
b: left.b * right.a + left.d * right.b,
|
|
7757
|
+
c: left.a * right.c + left.c * right.d,
|
|
7758
|
+
d: left.b * right.c + left.d * right.d
|
|
7759
|
+
};
|
|
7760
|
+
}
|
|
7761
|
+
function splitTransformArgs(raw) {
|
|
7762
|
+
return raw.trim().replace(/,/g, " ").split(/\s+/).filter(Boolean);
|
|
7763
|
+
}
|
|
7764
|
+
function parseAngleRadians(value) {
|
|
7765
|
+
const numeric = Number.parseFloat(value);
|
|
7766
|
+
if (!Number.isFinite(numeric)) return 0;
|
|
7767
|
+
const unit = value.trim().replace(String(numeric), "").trim().toLowerCase();
|
|
7768
|
+
switch (unit) {
|
|
7769
|
+
case "rad":
|
|
7770
|
+
return numeric;
|
|
7771
|
+
case "turn":
|
|
7772
|
+
return numeric * Math.PI * 2;
|
|
7773
|
+
case "grad":
|
|
7774
|
+
return numeric * Math.PI / 200;
|
|
7775
|
+
case "deg":
|
|
7776
|
+
case "":
|
|
7777
|
+
default:
|
|
7778
|
+
return numeric * Math.PI / 180;
|
|
7779
|
+
}
|
|
7780
|
+
}
|
|
7781
|
+
function parseTransformFunction(name, rawArgs) {
|
|
7782
|
+
const args = splitTransformArgs(rawArgs);
|
|
7783
|
+
switch (name.toLowerCase()) {
|
|
7784
|
+
case "matrix": {
|
|
7785
|
+
if (args.length < 4) return null;
|
|
7786
|
+
const [a, b, c, d] = args.map(Number.parseFloat);
|
|
7787
|
+
if (![a, b, c, d].every(Number.isFinite)) return null;
|
|
7788
|
+
return { a, b, c, d };
|
|
7789
|
+
}
|
|
7790
|
+
case "matrix3d": {
|
|
7791
|
+
if (args.length < 16) return null;
|
|
7792
|
+
const values = args.map(Number.parseFloat);
|
|
7793
|
+
if (!values.every(Number.isFinite)) return null;
|
|
7794
|
+
return { a: values[0], b: values[1], c: values[4], d: values[5] };
|
|
7795
|
+
}
|
|
7796
|
+
case "scale": {
|
|
7797
|
+
const scaleX = Number.parseFloat(args[0] ?? "1");
|
|
7798
|
+
const scaleY = Number.parseFloat(args[1] ?? args[0] ?? "1");
|
|
7799
|
+
if (!Number.isFinite(scaleX) || !Number.isFinite(scaleY)) return null;
|
|
7800
|
+
return { a: scaleX, b: 0, c: 0, d: scaleY };
|
|
7801
|
+
}
|
|
7802
|
+
case "scalex": {
|
|
7803
|
+
const scaleX = Number.parseFloat(args[0] ?? "1");
|
|
7804
|
+
if (!Number.isFinite(scaleX)) return null;
|
|
7805
|
+
return { a: scaleX, b: 0, c: 0, d: 1 };
|
|
7806
|
+
}
|
|
7807
|
+
case "scaley": {
|
|
7808
|
+
const scaleY = Number.parseFloat(args[0] ?? "1");
|
|
7809
|
+
if (!Number.isFinite(scaleY)) return null;
|
|
7810
|
+
return { a: 1, b: 0, c: 0, d: scaleY };
|
|
7811
|
+
}
|
|
7812
|
+
case "rotate": {
|
|
7813
|
+
const angle = parseAngleRadians(args[0] ?? "0deg");
|
|
7814
|
+
const cos = Math.cos(angle);
|
|
7815
|
+
const sin = Math.sin(angle);
|
|
7816
|
+
return { a: cos, b: sin, c: -sin, d: cos };
|
|
7817
|
+
}
|
|
7818
|
+
case "translate":
|
|
7819
|
+
case "translatex":
|
|
7820
|
+
case "translatey":
|
|
7821
|
+
return { a: 1, b: 0, c: 0, d: 1 };
|
|
7822
|
+
default:
|
|
7823
|
+
return null;
|
|
7824
|
+
}
|
|
7825
|
+
}
|
|
7826
|
+
function parseTransformMatrix(transform) {
|
|
7827
|
+
const functionPattern = /([a-zA-Z0-9]+)\(([^)]*)\)/g;
|
|
7828
|
+
let matrix = { a: 1, b: 0, c: 0, d: 1 };
|
|
7829
|
+
let matched = false;
|
|
7830
|
+
for (const match of transform.matchAll(functionPattern)) {
|
|
7831
|
+
const next = parseTransformFunction(match[1], match[2]);
|
|
7832
|
+
if (!next) return null;
|
|
7833
|
+
matrix = multiplyMatrix(matrix, next);
|
|
7834
|
+
matched = true;
|
|
7835
|
+
}
|
|
7836
|
+
return matched ? matrix : null;
|
|
7837
|
+
}
|
|
7838
|
+
function scaleFromMatrix(matrix) {
|
|
7839
|
+
return {
|
|
7840
|
+
scaleX: Math.hypot(matrix.a, matrix.b) || 1,
|
|
7841
|
+
scaleY: Math.hypot(matrix.c, matrix.d) || 1
|
|
7842
|
+
};
|
|
7843
|
+
}
|
|
7844
|
+
function getRenderedOffsetScale(element) {
|
|
7845
|
+
const rect = element.getBoundingClientRect();
|
|
7846
|
+
const width = element.offsetWidth;
|
|
7847
|
+
const height = element.offsetHeight;
|
|
7848
|
+
if (width <= 0 || height <= 0 || rect.width <= 0 || rect.height <= 0) return null;
|
|
7849
|
+
return {
|
|
7850
|
+
scaleX: rect.width / width,
|
|
7851
|
+
scaleY: rect.height / height
|
|
7852
|
+
};
|
|
7853
|
+
}
|
|
7854
|
+
function clampSize(value, minSize = 1) {
|
|
7855
|
+
const safeMin = Math.max(1, toFinite(minSize, 1));
|
|
7856
|
+
const safeValue = toFinite(value, safeMin);
|
|
7857
|
+
return Math.max(safeMin, safeValue);
|
|
7858
|
+
}
|
|
7859
|
+
function getElementScale(element) {
|
|
7860
|
+
const transform = getComputedStyle(element).transform;
|
|
7861
|
+
if (!transform || transform === "none") {
|
|
7862
|
+
return getRenderedOffsetScale(element) ?? { scaleX: 1, scaleY: 1 };
|
|
7863
|
+
}
|
|
7864
|
+
let transformMatrix = null;
|
|
7865
|
+
if (typeof DOMMatrix !== "undefined") {
|
|
7866
|
+
try {
|
|
7867
|
+
const matrix = new DOMMatrix(transform);
|
|
7868
|
+
transformMatrix = matrix;
|
|
7869
|
+
} catch {
|
|
7870
|
+
}
|
|
7871
|
+
}
|
|
7872
|
+
transformMatrix = transformMatrix ?? parseTransformMatrix(transform);
|
|
7873
|
+
if (!transformMatrix) return getRenderedOffsetScale(element) ?? { scaleX: 1, scaleY: 1 };
|
|
7874
|
+
const localScale = scaleFromMatrix(transformMatrix);
|
|
7875
|
+
const rect = element.getBoundingClientRect();
|
|
7876
|
+
const width = element.offsetWidth;
|
|
7877
|
+
const height = element.offsetHeight;
|
|
7878
|
+
if (width <= 0 || height <= 0 || rect.width <= 0 || rect.height <= 0) return localScale;
|
|
7879
|
+
const transformedWidth = Math.abs(transformMatrix.a) * width + Math.abs(transformMatrix.c) * height;
|
|
7880
|
+
const transformedHeight = Math.abs(transformMatrix.b) * width + Math.abs(transformMatrix.d) * height;
|
|
7881
|
+
if (transformedWidth <= 0 || transformedHeight <= 0) return localScale;
|
|
7882
|
+
return {
|
|
7883
|
+
scaleX: rect.width / transformedWidth * localScale.scaleX,
|
|
7884
|
+
scaleY: rect.height / transformedHeight * localScale.scaleY
|
|
7885
|
+
};
|
|
7886
|
+
}
|
|
7887
|
+
function computeEdgeSize({
|
|
7888
|
+
handle,
|
|
7889
|
+
startWidth,
|
|
7890
|
+
startHeight,
|
|
7891
|
+
dx,
|
|
7892
|
+
dy,
|
|
7893
|
+
minSize = 1
|
|
7894
|
+
}) {
|
|
7895
|
+
const baseWidth = clampSize(startWidth, minSize);
|
|
7896
|
+
const baseHeight = clampSize(startHeight, minSize);
|
|
7897
|
+
switch (handle) {
|
|
7898
|
+
case "right":
|
|
7899
|
+
return { width: clampSize(baseWidth + dx, minSize), height: baseHeight };
|
|
7900
|
+
case "left":
|
|
7901
|
+
return { width: clampSize(baseWidth - dx, minSize), height: baseHeight };
|
|
7902
|
+
case "bottom":
|
|
7903
|
+
return { width: baseWidth, height: clampSize(baseHeight + dy, minSize) };
|
|
7904
|
+
case "top":
|
|
7905
|
+
return { width: baseWidth, height: clampSize(baseHeight - dy, minSize) };
|
|
7906
|
+
}
|
|
7907
|
+
}
|
|
7908
|
+
function computeCornerProportionalSize({
|
|
7909
|
+
handle,
|
|
7910
|
+
startWidth,
|
|
7911
|
+
startHeight,
|
|
7912
|
+
dx,
|
|
7913
|
+
dy,
|
|
7914
|
+
minSize = 1
|
|
7915
|
+
}) {
|
|
7916
|
+
const baseWidth = clampSize(startWidth, minSize);
|
|
7917
|
+
const baseHeight = clampSize(startHeight, minSize);
|
|
7918
|
+
const ratio = baseWidth > 0 && baseHeight > 0 ? baseWidth / baseHeight : 1;
|
|
7919
|
+
const widthSign = handle === "top-left" || handle === "bottom-left" ? -1 : 1;
|
|
7920
|
+
const heightSign = handle === "top-left" || handle === "top-right" ? -1 : 1;
|
|
7921
|
+
const rawWidth = baseWidth + widthSign * dx;
|
|
7922
|
+
const rawHeight = baseHeight + heightSign * dy;
|
|
7923
|
+
const widthIntent = clampSize(rawWidth, minSize);
|
|
7924
|
+
const heightIntent = clampSize(rawHeight, minSize);
|
|
7925
|
+
const widthChange = Math.abs(widthIntent - baseWidth) / Math.max(baseWidth, 1);
|
|
7926
|
+
const heightChange = Math.abs(heightIntent - baseHeight) / Math.max(baseHeight, 1);
|
|
7927
|
+
if (widthChange >= heightChange) {
|
|
7928
|
+
const width2 = clampSize(widthIntent, minSize);
|
|
7929
|
+
const height2 = clampSize(width2 / Math.max(ratio, 1e-4), minSize);
|
|
7930
|
+
return { width: width2, height: height2 };
|
|
7931
|
+
}
|
|
7932
|
+
const height = clampSize(heightIntent, minSize);
|
|
7933
|
+
const width = clampSize(height * ratio, minSize);
|
|
7934
|
+
return { width, height };
|
|
7935
|
+
}
|
|
7936
|
+
function computeFillRenderedWidth(element) {
|
|
7937
|
+
const parent = element.parentElement;
|
|
7938
|
+
if (!parent) return null;
|
|
7939
|
+
const parentComputed = window.getComputedStyle(parent);
|
|
7940
|
+
const elementComputed = window.getComputedStyle(element);
|
|
7941
|
+
const parentClientWidth = parent.clientWidth;
|
|
7942
|
+
const parentPaddingLeft = parseFloat(parentComputed.paddingLeft) || 0;
|
|
7943
|
+
const parentPaddingRight = parseFloat(parentComputed.paddingRight) || 0;
|
|
7944
|
+
const parentContentWidth = parentClientWidth - parentPaddingLeft - parentPaddingRight;
|
|
7945
|
+
if (!Number.isFinite(parentContentWidth) || parentContentWidth <= 0) {
|
|
7946
|
+
return null;
|
|
7947
|
+
}
|
|
7948
|
+
const elementPaddingLeft = parseFloat(elementComputed.paddingLeft) || 0;
|
|
7949
|
+
const elementPaddingRight = parseFloat(elementComputed.paddingRight) || 0;
|
|
7950
|
+
const elementBorderLeft = parseFloat(elementComputed.borderLeftWidth) || 0;
|
|
7951
|
+
const elementBorderRight = parseFloat(elementComputed.borderRightWidth) || 0;
|
|
7952
|
+
if (elementComputed.boxSizing === "border-box") {
|
|
7953
|
+
return clampSize(parentContentWidth, 1);
|
|
7954
|
+
}
|
|
7955
|
+
return clampSize(
|
|
7956
|
+
parentContentWidth + elementPaddingLeft + elementPaddingRight + elementBorderLeft + elementBorderRight,
|
|
7957
|
+
1
|
|
7958
|
+
);
|
|
7959
|
+
}
|
|
7960
|
+
|
|
7684
7961
|
// src/use-move.ts
|
|
7685
7962
|
var INITIAL_DRAG_STATE = {
|
|
7686
7963
|
isDragging: false,
|
|
@@ -7753,9 +8030,12 @@ function useMove({ onMoveComplete }) {
|
|
|
7753
8030
|
const onMoveCompleteRef = React12.useRef(onMoveComplete);
|
|
7754
8031
|
const dragOptionsRef = React12.useRef(DEFAULT_DRAG_OPTIONS);
|
|
7755
8032
|
const dragGuardRef = React12.useRef(createDragInteractionGuard());
|
|
7756
|
-
const initialRectRef = React12.useRef(
|
|
7757
|
-
|
|
7758
|
-
|
|
8033
|
+
const initialRectRef = React12.useRef({
|
|
8034
|
+
x: 0,
|
|
8035
|
+
y: 0,
|
|
8036
|
+
scaleX: 1,
|
|
8037
|
+
scaleY: 1
|
|
8038
|
+
});
|
|
7759
8039
|
const originalTransformRef = React12.useRef("");
|
|
7760
8040
|
const composeBaseRef = React12.useRef("");
|
|
7761
8041
|
const reorderPreviewRef = React12.useRef(/* @__PURE__ */ new Map());
|
|
@@ -7771,79 +8051,85 @@ function useMove({ onMoveComplete }) {
|
|
|
7771
8051
|
}
|
|
7772
8052
|
reorderPreviewRef.current.clear();
|
|
7773
8053
|
}, []);
|
|
7774
|
-
const setReorderPreviewTransform = React12.useCallback(
|
|
7775
|
-
|
|
7776
|
-
|
|
7777
|
-
|
|
7778
|
-
|
|
7779
|
-
|
|
7780
|
-
|
|
7781
|
-
|
|
7782
|
-
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
7786
|
-
|
|
7787
|
-
|
|
7788
|
-
|
|
7789
|
-
|
|
7790
|
-
|
|
7791
|
-
|
|
7792
|
-
|
|
7793
|
-
|
|
7794
|
-
|
|
7795
|
-
|
|
7796
|
-
|
|
7797
|
-
|
|
7798
|
-
|
|
7799
|
-
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
|
|
7804
|
-
|
|
7805
|
-
|
|
7806
|
-
|
|
7807
|
-
|
|
7808
|
-
|
|
7809
|
-
|
|
7810
|
-
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7815
|
-
|
|
7816
|
-
|
|
7817
|
-
|
|
7818
|
-
|
|
7819
|
-
|
|
7820
|
-
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
8054
|
+
const setReorderPreviewTransform = React12.useCallback(
|
|
8055
|
+
(element, transform) => {
|
|
8056
|
+
const existing = reorderPreviewRef.current.get(element);
|
|
8057
|
+
if (!existing) {
|
|
8058
|
+
reorderPreviewRef.current.set(element, {
|
|
8059
|
+
transform: element.style.transform,
|
|
8060
|
+
transition: element.style.transition
|
|
8061
|
+
});
|
|
8062
|
+
}
|
|
8063
|
+
const originalTransition = reorderPreviewRef.current.get(element)?.transition ?? element.style.transition;
|
|
8064
|
+
element.style.transition = withTransformTransition(originalTransition);
|
|
8065
|
+
element.style.transform = transform;
|
|
8066
|
+
},
|
|
8067
|
+
[]
|
|
8068
|
+
);
|
|
8069
|
+
const applyReorderPreview = React12.useCallback(
|
|
8070
|
+
(target, draggedElement, originalParent) => {
|
|
8071
|
+
if (!target || !draggedElement) {
|
|
8072
|
+
clearReorderPreview();
|
|
8073
|
+
return;
|
|
8074
|
+
}
|
|
8075
|
+
const container = target.container;
|
|
8076
|
+
const containerChildren = Array.from(container.children).filter(
|
|
8077
|
+
(child) => child instanceof HTMLElement
|
|
8078
|
+
);
|
|
8079
|
+
const siblings = containerChildren.filter((child) => child !== draggedElement);
|
|
8080
|
+
const insertIndex = getInsertIndex(siblings, target.insertBefore);
|
|
8081
|
+
if (insertIndex === null) {
|
|
8082
|
+
clearReorderPreview();
|
|
8083
|
+
return;
|
|
8084
|
+
}
|
|
8085
|
+
const draggedRect = draggedElement.getBoundingClientRect();
|
|
8086
|
+
const isHorizontal = isHorizontalDirection(target.flexDirection);
|
|
8087
|
+
const dragSize = isHorizontal ? draggedRect.width : draggedRect.height;
|
|
8088
|
+
if (!Number.isFinite(dragSize) || dragSize <= 0) {
|
|
8089
|
+
clearReorderPreview();
|
|
8090
|
+
return;
|
|
8091
|
+
}
|
|
8092
|
+
const sign = forwardVisualSign(target.flexDirection);
|
|
8093
|
+
const shiftedElements = /* @__PURE__ */ new Map();
|
|
8094
|
+
if (container === originalParent) {
|
|
8095
|
+
const originalIndex = containerChildren.indexOf(draggedElement);
|
|
8096
|
+
if (originalIndex >= 0) {
|
|
8097
|
+
if (insertIndex > originalIndex) {
|
|
8098
|
+
const shift = -sign * dragSize;
|
|
8099
|
+
for (let i = originalIndex; i < insertIndex; i++) {
|
|
8100
|
+
const sibling = siblings[i];
|
|
8101
|
+
if (sibling) shiftedElements.set(sibling, shift);
|
|
8102
|
+
}
|
|
8103
|
+
} else if (insertIndex < originalIndex) {
|
|
8104
|
+
const shift = sign * dragSize;
|
|
8105
|
+
for (let i = insertIndex; i < originalIndex; i++) {
|
|
8106
|
+
const sibling = siblings[i];
|
|
8107
|
+
if (sibling) shiftedElements.set(sibling, shift);
|
|
8108
|
+
}
|
|
7824
8109
|
}
|
|
7825
8110
|
}
|
|
8111
|
+
} else {
|
|
8112
|
+
const shift = sign * dragSize;
|
|
8113
|
+
for (let i = insertIndex; i < siblings.length; i++) {
|
|
8114
|
+
shiftedElements.set(siblings[i], shift);
|
|
8115
|
+
}
|
|
7826
8116
|
}
|
|
7827
|
-
|
|
7828
|
-
const
|
|
7829
|
-
for (
|
|
7830
|
-
|
|
7831
|
-
|
|
7832
|
-
|
|
7833
|
-
|
|
7834
|
-
|
|
7835
|
-
for (const [element, snapshot2] of reorderPreviewRef.current) {
|
|
7836
|
-
if (!keep.has(element)) {
|
|
7837
|
-
element.style.transform = snapshot2.transform;
|
|
7838
|
-
element.style.transition = snapshot2.transition;
|
|
7839
|
-
reorderPreviewRef.current.delete(element);
|
|
8117
|
+
const axis = isHorizontal ? "x" : "y";
|
|
8118
|
+
const keep = new Set(shiftedElements.keys());
|
|
8119
|
+
for (const [element, snapshot2] of reorderPreviewRef.current) {
|
|
8120
|
+
if (!keep.has(element)) {
|
|
8121
|
+
element.style.transform = snapshot2.transform;
|
|
8122
|
+
element.style.transition = snapshot2.transition;
|
|
8123
|
+
reorderPreviewRef.current.delete(element);
|
|
8124
|
+
}
|
|
7840
8125
|
}
|
|
7841
|
-
|
|
7842
|
-
|
|
7843
|
-
|
|
7844
|
-
|
|
7845
|
-
}
|
|
7846
|
-
|
|
8126
|
+
for (const [element, shift] of shiftedElements) {
|
|
8127
|
+
const baseTransform = reorderPreviewRef.current.get(element)?.transform ?? element.style.transform;
|
|
8128
|
+
setReorderPreviewTransform(element, withAxisTranslate(baseTransform, axis, shift));
|
|
8129
|
+
}
|
|
8130
|
+
},
|
|
8131
|
+
[clearReorderPreview, setReorderPreviewTransform]
|
|
8132
|
+
);
|
|
7847
8133
|
const cancelDrag = React12.useCallback(() => {
|
|
7848
8134
|
const current = dragStateRef.current;
|
|
7849
8135
|
if (current.draggedElement) {
|
|
@@ -7903,7 +8189,13 @@ function useMove({ onMoveComplete }) {
|
|
|
7903
8189
|
const deltaX = (current.ghostPosition.x - rect.left) / scaleX;
|
|
7904
8190
|
const deltaY = (current.ghostPosition.y - rect.top) / scaleY;
|
|
7905
8191
|
if ((Math.abs(deltaX) > 0.5 || Math.abs(deltaY) > 0.5) && originalParent) {
|
|
7906
|
-
moveInfo = {
|
|
8192
|
+
moveInfo = {
|
|
8193
|
+
originalParent,
|
|
8194
|
+
originalPreviousSibling,
|
|
8195
|
+
originalNextSibling,
|
|
8196
|
+
mode: "position",
|
|
8197
|
+
positionDelta: { x: deltaX, y: deltaY }
|
|
8198
|
+
};
|
|
7907
8199
|
}
|
|
7908
8200
|
}
|
|
7909
8201
|
} else if (target && tryReparent(draggedElement, target, originalParent, originalNextSibling)) {
|
|
@@ -7929,11 +8221,12 @@ function useMove({ onMoveComplete }) {
|
|
|
7929
8221
|
const previousSibling = element.previousElementSibling;
|
|
7930
8222
|
const nextSibling = element.nextElementSibling;
|
|
7931
8223
|
dragOptionsRef.current = normalizeStartDragOptions(options);
|
|
8224
|
+
const { scaleX, scaleY } = getElementScale(element);
|
|
7932
8225
|
initialRectRef.current = {
|
|
7933
8226
|
x: rect.left,
|
|
7934
8227
|
y: rect.top,
|
|
7935
|
-
scaleX
|
|
7936
|
-
scaleY
|
|
8228
|
+
scaleX,
|
|
8229
|
+
scaleY
|
|
7937
8230
|
};
|
|
7938
8231
|
const inlineTransform = element.style.transform;
|
|
7939
8232
|
originalTransformRef.current = inlineTransform;
|
|
@@ -8017,19 +8310,9 @@ function useMove({ onMoveComplete }) {
|
|
|
8017
8310
|
}
|
|
8018
8311
|
return;
|
|
8019
8312
|
}
|
|
8020
|
-
const container = dragOptionsRef.current.constrainToOriginalParent ? originalParent : findContainerAtPoint(
|
|
8021
|
-
e.clientX,
|
|
8022
|
-
e.clientY,
|
|
8023
|
-
draggedElement,
|
|
8024
|
-
originalParent
|
|
8025
|
-
);
|
|
8313
|
+
const container = dragOptionsRef.current.constrainToOriginalParent ? originalParent : findContainerAtPoint(e.clientX, e.clientY, draggedElement, originalParent);
|
|
8026
8314
|
if (container && draggedElement) {
|
|
8027
|
-
const dropPos = calculateDropPosition(
|
|
8028
|
-
container,
|
|
8029
|
-
e.clientX,
|
|
8030
|
-
e.clientY,
|
|
8031
|
-
draggedElement
|
|
8032
|
-
);
|
|
8315
|
+
const dropPos = calculateDropPosition(container, e.clientX, e.clientY, draggedElement);
|
|
8033
8316
|
if (dropPos) {
|
|
8034
8317
|
const nextTarget = {
|
|
8035
8318
|
container,
|
|
@@ -8402,7 +8685,10 @@ function isSelectableElement(element) {
|
|
|
8402
8685
|
if (!(element instanceof HTMLElement)) return false;
|
|
8403
8686
|
if (!element.isConnected) return false;
|
|
8404
8687
|
if (element === document.body || element === document.documentElement) return false;
|
|
8405
|
-
if (element.matches(
|
|
8688
|
+
if (element.matches(
|
|
8689
|
+
"[data-direct-edit], [data-direct-edit-host], script, style, link, meta, noscript"
|
|
8690
|
+
))
|
|
8691
|
+
return false;
|
|
8406
8692
|
const rect = element.getBoundingClientRect();
|
|
8407
8693
|
if (rect.width <= 0 || rect.height <= 0) return false;
|
|
8408
8694
|
const computed = window.getComputedStyle(element);
|
|
@@ -8420,7 +8706,9 @@ function compareDomOrder2(a, b) {
|
|
|
8420
8706
|
}
|
|
8421
8707
|
function collectMarqueeTargets(rect) {
|
|
8422
8708
|
const hits = Array.from(document.querySelectorAll("*")).filter(isSelectableElement).filter((element) => rectsIntersect(rect, element.getBoundingClientRect()));
|
|
8423
|
-
const deepestHits = hits.filter(
|
|
8709
|
+
const deepestHits = hits.filter(
|
|
8710
|
+
(element) => !hits.some((other) => other !== element && element.contains(other))
|
|
8711
|
+
);
|
|
8424
8712
|
deepestHits.sort(compareDomOrder2);
|
|
8425
8713
|
return deepestHits;
|
|
8426
8714
|
}
|
|
@@ -9011,99 +9299,27 @@ import { MessageSquare } from "lucide-react";
|
|
|
9011
9299
|
|
|
9012
9300
|
// src/use-selection-resize.ts
|
|
9013
9301
|
import * as React18 from "react";
|
|
9014
|
-
|
|
9015
|
-
// src/utils/resize-geometry.ts
|
|
9016
|
-
function toFinite(value, fallback) {
|
|
9017
|
-
if (!Number.isFinite(value)) return fallback;
|
|
9018
|
-
return value;
|
|
9019
|
-
}
|
|
9020
|
-
function clampSize(value, minSize = 1) {
|
|
9021
|
-
const safeMin = Math.max(1, toFinite(minSize, 1));
|
|
9022
|
-
const safeValue = toFinite(value, safeMin);
|
|
9023
|
-
return Math.max(safeMin, safeValue);
|
|
9024
|
-
}
|
|
9025
|
-
function computeEdgeSize({
|
|
9026
|
-
handle,
|
|
9027
|
-
startWidth,
|
|
9028
|
-
startHeight,
|
|
9029
|
-
dx,
|
|
9030
|
-
dy,
|
|
9031
|
-
minSize = 1
|
|
9032
|
-
}) {
|
|
9033
|
-
const baseWidth = clampSize(startWidth, minSize);
|
|
9034
|
-
const baseHeight = clampSize(startHeight, minSize);
|
|
9035
|
-
switch (handle) {
|
|
9036
|
-
case "right":
|
|
9037
|
-
return { width: clampSize(baseWidth + dx, minSize), height: baseHeight };
|
|
9038
|
-
case "left":
|
|
9039
|
-
return { width: clampSize(baseWidth - dx, minSize), height: baseHeight };
|
|
9040
|
-
case "bottom":
|
|
9041
|
-
return { width: baseWidth, height: clampSize(baseHeight + dy, minSize) };
|
|
9042
|
-
case "top":
|
|
9043
|
-
return { width: baseWidth, height: clampSize(baseHeight - dy, minSize) };
|
|
9044
|
-
}
|
|
9045
|
-
}
|
|
9046
|
-
function computeCornerProportionalSize({
|
|
9047
|
-
handle,
|
|
9048
|
-
startWidth,
|
|
9049
|
-
startHeight,
|
|
9050
|
-
dx,
|
|
9051
|
-
dy,
|
|
9052
|
-
minSize = 1
|
|
9053
|
-
}) {
|
|
9054
|
-
const baseWidth = clampSize(startWidth, minSize);
|
|
9055
|
-
const baseHeight = clampSize(startHeight, minSize);
|
|
9056
|
-
const ratio = baseWidth > 0 && baseHeight > 0 ? baseWidth / baseHeight : 1;
|
|
9057
|
-
const widthSign = handle === "top-left" || handle === "bottom-left" ? -1 : 1;
|
|
9058
|
-
const heightSign = handle === "top-left" || handle === "top-right" ? -1 : 1;
|
|
9059
|
-
const rawWidth = baseWidth + widthSign * dx;
|
|
9060
|
-
const rawHeight = baseHeight + heightSign * dy;
|
|
9061
|
-
const widthIntent = clampSize(rawWidth, minSize);
|
|
9062
|
-
const heightIntent = clampSize(rawHeight, minSize);
|
|
9063
|
-
const widthChange = Math.abs(widthIntent - baseWidth) / Math.max(baseWidth, 1);
|
|
9064
|
-
const heightChange = Math.abs(heightIntent - baseHeight) / Math.max(baseHeight, 1);
|
|
9065
|
-
if (widthChange >= heightChange) {
|
|
9066
|
-
const width2 = clampSize(widthIntent, minSize);
|
|
9067
|
-
const height2 = clampSize(width2 / Math.max(ratio, 1e-4), minSize);
|
|
9068
|
-
return { width: width2, height: height2 };
|
|
9069
|
-
}
|
|
9070
|
-
const height = clampSize(heightIntent, minSize);
|
|
9071
|
-
const width = clampSize(height * ratio, minSize);
|
|
9072
|
-
return { width, height };
|
|
9073
|
-
}
|
|
9074
|
-
function computeFillRenderedWidth(element) {
|
|
9075
|
-
const parent = element.parentElement;
|
|
9076
|
-
if (!parent) return null;
|
|
9077
|
-
const parentComputed = window.getComputedStyle(parent);
|
|
9078
|
-
const elementComputed = window.getComputedStyle(element);
|
|
9079
|
-
const parentClientWidth = parent.clientWidth;
|
|
9080
|
-
const parentPaddingLeft = parseFloat(parentComputed.paddingLeft) || 0;
|
|
9081
|
-
const parentPaddingRight = parseFloat(parentComputed.paddingRight) || 0;
|
|
9082
|
-
const parentContentWidth = parentClientWidth - parentPaddingLeft - parentPaddingRight;
|
|
9083
|
-
if (!Number.isFinite(parentContentWidth) || parentContentWidth <= 0) {
|
|
9084
|
-
return null;
|
|
9085
|
-
}
|
|
9086
|
-
const elementPaddingLeft = parseFloat(elementComputed.paddingLeft) || 0;
|
|
9087
|
-
const elementPaddingRight = parseFloat(elementComputed.paddingRight) || 0;
|
|
9088
|
-
const elementBorderLeft = parseFloat(elementComputed.borderLeftWidth) || 0;
|
|
9089
|
-
const elementBorderRight = parseFloat(elementComputed.borderRightWidth) || 0;
|
|
9090
|
-
if (elementComputed.boxSizing === "border-box") {
|
|
9091
|
-
return clampSize(parentContentWidth, 1);
|
|
9092
|
-
}
|
|
9093
|
-
return clampSize(
|
|
9094
|
-
parentContentWidth + elementPaddingLeft + elementPaddingRight + elementBorderLeft + elementBorderRight,
|
|
9095
|
-
1
|
|
9096
|
-
);
|
|
9097
|
-
}
|
|
9098
|
-
|
|
9099
|
-
// src/use-selection-resize.ts
|
|
9100
9302
|
var MIN_SIZE_PX = 1;
|
|
9101
9303
|
var SNAP_IN_PX = 2;
|
|
9102
9304
|
var SNAP_OUT_PX = 6;
|
|
9103
9305
|
var EPSILON = 1e-4;
|
|
9104
9306
|
var EDGE_HANDLES = /* @__PURE__ */ new Set(["top", "right", "bottom", "left"]);
|
|
9105
|
-
var WIDTH_HANDLES = /* @__PURE__ */ new Set([
|
|
9106
|
-
|
|
9307
|
+
var WIDTH_HANDLES = /* @__PURE__ */ new Set([
|
|
9308
|
+
"left",
|
|
9309
|
+
"right",
|
|
9310
|
+
"top-left",
|
|
9311
|
+
"top-right",
|
|
9312
|
+
"bottom-left",
|
|
9313
|
+
"bottom-right"
|
|
9314
|
+
]);
|
|
9315
|
+
var HEIGHT_HANDLES = /* @__PURE__ */ new Set([
|
|
9316
|
+
"top",
|
|
9317
|
+
"bottom",
|
|
9318
|
+
"top-left",
|
|
9319
|
+
"top-right",
|
|
9320
|
+
"bottom-left",
|
|
9321
|
+
"bottom-right"
|
|
9322
|
+
]);
|
|
9107
9323
|
function createSizingValue(mode, numericValue) {
|
|
9108
9324
|
const rounded = Math.max(MIN_SIZE_PX, Math.round(clampSize(numericValue, MIN_SIZE_PX)));
|
|
9109
9325
|
return {
|
|
@@ -9125,125 +9341,135 @@ function useSelectionResize({
|
|
|
9125
9341
|
}) {
|
|
9126
9342
|
const cleanupRef = React18.useRef(null);
|
|
9127
9343
|
const txCounterRef = React18.useRef(0);
|
|
9128
|
-
const emitSizingChange = React18.useCallback(
|
|
9129
|
-
|
|
9130
|
-
|
|
9344
|
+
const emitSizingChange = React18.useCallback(
|
|
9345
|
+
(changes, options) => {
|
|
9346
|
+
onResizeSizingChange?.(changes, options);
|
|
9347
|
+
},
|
|
9348
|
+
[onResizeSizingChange]
|
|
9349
|
+
);
|
|
9131
9350
|
React18.useEffect(() => {
|
|
9132
9351
|
return () => {
|
|
9133
9352
|
cleanupRef.current?.();
|
|
9134
9353
|
cleanupRef.current = null;
|
|
9135
9354
|
};
|
|
9136
9355
|
}, []);
|
|
9137
|
-
const getResizeHandlePointerDown = React18.useCallback(
|
|
9138
|
-
|
|
9139
|
-
|
|
9140
|
-
|
|
9141
|
-
|
|
9142
|
-
|
|
9143
|
-
|
|
9144
|
-
|
|
9145
|
-
|
|
9146
|
-
|
|
9147
|
-
|
|
9148
|
-
|
|
9149
|
-
|
|
9150
|
-
|
|
9151
|
-
|
|
9152
|
-
|
|
9153
|
-
transactionId
|
|
9154
|
-
|
|
9155
|
-
|
|
9156
|
-
|
|
9157
|
-
|
|
9158
|
-
|
|
9159
|
-
|
|
9160
|
-
|
|
9161
|
-
|
|
9162
|
-
|
|
9163
|
-
|
|
9164
|
-
|
|
9165
|
-
|
|
9166
|
-
|
|
9167
|
-
const
|
|
9168
|
-
|
|
9169
|
-
|
|
9170
|
-
|
|
9171
|
-
|
|
9172
|
-
|
|
9173
|
-
|
|
9174
|
-
|
|
9175
|
-
|
|
9176
|
-
|
|
9177
|
-
|
|
9178
|
-
|
|
9179
|
-
|
|
9180
|
-
|
|
9181
|
-
|
|
9182
|
-
|
|
9183
|
-
|
|
9184
|
-
|
|
9185
|
-
|
|
9186
|
-
|
|
9187
|
-
|
|
9188
|
-
|
|
9189
|
-
if (state.
|
|
9190
|
-
|
|
9191
|
-
|
|
9356
|
+
const getResizeHandlePointerDown = React18.useCallback(
|
|
9357
|
+
(handle) => {
|
|
9358
|
+
return (e) => {
|
|
9359
|
+
if (!enabled || !onResizeSizingChange) return;
|
|
9360
|
+
if (e.button !== 0) return;
|
|
9361
|
+
e.preventDefault();
|
|
9362
|
+
e.stopPropagation();
|
|
9363
|
+
cleanupRef.current?.();
|
|
9364
|
+
const rect = selectedElement.getBoundingClientRect();
|
|
9365
|
+
const offsetWidth = selectedElement.offsetWidth;
|
|
9366
|
+
const offsetHeight = selectedElement.offsetHeight;
|
|
9367
|
+
const startWidth = clampSize(offsetWidth > 0 ? offsetWidth : rect.width, MIN_SIZE_PX);
|
|
9368
|
+
const startHeight = clampSize(offsetHeight > 0 ? offsetHeight : rect.height, MIN_SIZE_PX);
|
|
9369
|
+
const { scaleX: rawScaleX, scaleY: rawScaleY } = getElementScale(selectedElement);
|
|
9370
|
+
const scaleX = Math.max(EPSILON, rawScaleX);
|
|
9371
|
+
const scaleY = Math.max(EPSILON, rawScaleY);
|
|
9372
|
+
const transactionId = `resize-${Date.now()}-${txCounterRef.current++}`;
|
|
9373
|
+
const state = {
|
|
9374
|
+
transactionId,
|
|
9375
|
+
handle,
|
|
9376
|
+
startClientX: e.clientX,
|
|
9377
|
+
startClientY: e.clientY,
|
|
9378
|
+
startWidth,
|
|
9379
|
+
startHeight,
|
|
9380
|
+
scaleX,
|
|
9381
|
+
scaleY,
|
|
9382
|
+
fillTargetWidth: computeFillRenderedWidth(selectedElement),
|
|
9383
|
+
fillLocked: detectSizingMode(selectedElement, "width") === "fill"
|
|
9384
|
+
};
|
|
9385
|
+
emitSizingChange({}, { transactionId: state.transactionId, phase: "start" });
|
|
9386
|
+
const onPointerMove = (moveEvent) => {
|
|
9387
|
+
const dx = (moveEvent.clientX - state.startClientX) / state.scaleX;
|
|
9388
|
+
const dy = (moveEvent.clientY - state.startClientY) / state.scaleY;
|
|
9389
|
+
const nextSize = isEdgeHandle(state.handle) ? computeEdgeSize({
|
|
9390
|
+
handle: state.handle,
|
|
9391
|
+
startWidth: state.startWidth,
|
|
9392
|
+
startHeight: state.startHeight,
|
|
9393
|
+
dx,
|
|
9394
|
+
dy,
|
|
9395
|
+
minSize: MIN_SIZE_PX
|
|
9396
|
+
}) : computeCornerProportionalSize({
|
|
9397
|
+
handle: state.handle,
|
|
9398
|
+
startWidth: state.startWidth,
|
|
9399
|
+
startHeight: state.startHeight,
|
|
9400
|
+
dx,
|
|
9401
|
+
dy,
|
|
9402
|
+
minSize: MIN_SIZE_PX
|
|
9403
|
+
});
|
|
9404
|
+
const nextWidth = Math.max(MIN_SIZE_PX, Math.round(nextSize.width));
|
|
9405
|
+
const nextHeight = Math.max(MIN_SIZE_PX, Math.round(nextSize.height));
|
|
9406
|
+
const changes = {};
|
|
9407
|
+
if (WIDTH_HANDLES.has(state.handle)) {
|
|
9408
|
+
if (state.fillTargetWidth !== null) {
|
|
9409
|
+
const distance = Math.abs(nextWidth - state.fillTargetWidth);
|
|
9410
|
+
if (state.fillLocked) {
|
|
9411
|
+
if (distance > SNAP_OUT_PX) {
|
|
9412
|
+
state.fillLocked = false;
|
|
9413
|
+
}
|
|
9414
|
+
} else if (distance <= SNAP_IN_PX) {
|
|
9415
|
+
state.fillLocked = true;
|
|
9192
9416
|
}
|
|
9193
|
-
} else
|
|
9194
|
-
state.fillLocked =
|
|
9417
|
+
} else {
|
|
9418
|
+
state.fillLocked = false;
|
|
9419
|
+
}
|
|
9420
|
+
if (state.fillLocked) {
|
|
9421
|
+
const fillWidth = state.fillTargetWidth ?? nextWidth;
|
|
9422
|
+
changes.width = createSizingValue("fill", fillWidth);
|
|
9423
|
+
} else {
|
|
9424
|
+
changes.width = createSizingValue("fixed", nextWidth);
|
|
9195
9425
|
}
|
|
9196
|
-
} else {
|
|
9197
|
-
state.fillLocked = false;
|
|
9198
9426
|
}
|
|
9199
|
-
if (state.
|
|
9200
|
-
|
|
9201
|
-
changes.width = createSizingValue("fill", fillWidth);
|
|
9202
|
-
} else {
|
|
9203
|
-
changes.width = createSizingValue("fixed", nextWidth);
|
|
9427
|
+
if (HEIGHT_HANDLES.has(state.handle)) {
|
|
9428
|
+
changes.height = createSizingValue("fixed", nextHeight);
|
|
9204
9429
|
}
|
|
9205
|
-
|
|
9206
|
-
|
|
9207
|
-
|
|
9208
|
-
|
|
9209
|
-
|
|
9210
|
-
|
|
9430
|
+
if (Object.keys(changes).length === 0) return;
|
|
9431
|
+
emitSizingChange(changes, { transactionId: state.transactionId, phase: "update" });
|
|
9432
|
+
};
|
|
9433
|
+
const stop = () => {
|
|
9434
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
9435
|
+
window.removeEventListener("pointerup", stop);
|
|
9436
|
+
window.removeEventListener("pointercancel", stop);
|
|
9437
|
+
window.removeEventListener("blur", stop);
|
|
9438
|
+
cleanupRef.current = null;
|
|
9439
|
+
emitSizingChange({}, { transactionId: state.transactionId, phase: "end" });
|
|
9440
|
+
};
|
|
9441
|
+
cleanupRef.current = stop;
|
|
9442
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
9443
|
+
window.addEventListener("pointerup", stop);
|
|
9444
|
+
window.addEventListener("pointercancel", stop);
|
|
9445
|
+
window.addEventListener("blur", stop);
|
|
9211
9446
|
};
|
|
9212
|
-
|
|
9213
|
-
|
|
9214
|
-
|
|
9215
|
-
|
|
9216
|
-
|
|
9217
|
-
|
|
9218
|
-
|
|
9447
|
+
},
|
|
9448
|
+
[emitSizingChange, enabled, onResizeSizingChange, selectedElement]
|
|
9449
|
+
);
|
|
9450
|
+
const getResizeHandleDoubleClick = React18.useCallback(
|
|
9451
|
+
(handle) => {
|
|
9452
|
+
return (e) => {
|
|
9453
|
+
if (!enabled || !onResizeSizingChange) return;
|
|
9454
|
+
if (!isEdgeHandle(handle)) return;
|
|
9455
|
+
const hasElementChildren = selectedElement.children.length > 0;
|
|
9456
|
+
const hasTextContent = Boolean(selectedElement.textContent?.trim());
|
|
9457
|
+
const isEligibleElement = hasElementChildren || hasTextContent;
|
|
9458
|
+
if (!isEligibleElement) return;
|
|
9459
|
+
e.preventDefault();
|
|
9460
|
+
e.stopPropagation();
|
|
9461
|
+
const rect = selectedElement.getBoundingClientRect();
|
|
9462
|
+
const width = Math.max(MIN_SIZE_PX, Math.round(rect.width));
|
|
9463
|
+
const height = Math.max(MIN_SIZE_PX, Math.round(rect.height));
|
|
9464
|
+
if (handle === "left" || handle === "right") {
|
|
9465
|
+
emitSizingChange({ width: createSizingValue("fit", width) });
|
|
9466
|
+
} else {
|
|
9467
|
+
emitSizingChange({ height: createSizingValue("fit", height) });
|
|
9468
|
+
}
|
|
9219
9469
|
};
|
|
9220
|
-
|
|
9221
|
-
|
|
9222
|
-
|
|
9223
|
-
window.addEventListener("pointercancel", stop);
|
|
9224
|
-
window.addEventListener("blur", stop);
|
|
9225
|
-
};
|
|
9226
|
-
}, [emitSizingChange, enabled, onResizeSizingChange, selectedElement]);
|
|
9227
|
-
const getResizeHandleDoubleClick = React18.useCallback((handle) => {
|
|
9228
|
-
return (e) => {
|
|
9229
|
-
if (!enabled || !onResizeSizingChange) return;
|
|
9230
|
-
if (!isEdgeHandle(handle)) return;
|
|
9231
|
-
const hasElementChildren = selectedElement.children.length > 0;
|
|
9232
|
-
const hasTextContent = Boolean(selectedElement.textContent?.trim());
|
|
9233
|
-
const isEligibleElement = hasElementChildren || hasTextContent;
|
|
9234
|
-
if (!isEligibleElement) return;
|
|
9235
|
-
e.preventDefault();
|
|
9236
|
-
e.stopPropagation();
|
|
9237
|
-
const rect = selectedElement.getBoundingClientRect();
|
|
9238
|
-
const width = Math.max(MIN_SIZE_PX, Math.round(rect.width));
|
|
9239
|
-
const height = Math.max(MIN_SIZE_PX, Math.round(rect.height));
|
|
9240
|
-
if (handle === "left" || handle === "right") {
|
|
9241
|
-
emitSizingChange({ width: createSizingValue("fit", width) });
|
|
9242
|
-
} else {
|
|
9243
|
-
emitSizingChange({ height: createSizingValue("fit", height) });
|
|
9244
|
-
}
|
|
9245
|
-
};
|
|
9246
|
-
}, [emitSizingChange, enabled, onResizeSizingChange, selectedElement]);
|
|
9470
|
+
},
|
|
9471
|
+
[emitSizingChange, enabled, onResizeSizingChange, selectedElement]
|
|
9472
|
+
);
|
|
9247
9473
|
return {
|
|
9248
9474
|
getResizeHandlePointerDown,
|
|
9249
9475
|
getResizeHandleDoubleClick
|
|
@@ -9868,17 +10094,20 @@ function getGroupBounds(rects) {
|
|
|
9868
10094
|
if (rects.length === 0) {
|
|
9869
10095
|
return { left: 0, top: 0, right: 0, bottom: 0 };
|
|
9870
10096
|
}
|
|
9871
|
-
return rects.reduce(
|
|
9872
|
-
|
|
9873
|
-
|
|
9874
|
-
|
|
9875
|
-
|
|
9876
|
-
|
|
9877
|
-
|
|
9878
|
-
|
|
9879
|
-
|
|
9880
|
-
|
|
9881
|
-
|
|
10097
|
+
return rects.reduce(
|
|
10098
|
+
(bounds, rect) => ({
|
|
10099
|
+
left: Math.min(bounds.left, rect.left),
|
|
10100
|
+
top: Math.min(bounds.top, rect.top),
|
|
10101
|
+
right: Math.max(bounds.right, rect.right),
|
|
10102
|
+
bottom: Math.max(bounds.bottom, rect.bottom)
|
|
10103
|
+
}),
|
|
10104
|
+
{
|
|
10105
|
+
left: rects[0].left,
|
|
10106
|
+
top: rects[0].top,
|
|
10107
|
+
right: rects[0].right,
|
|
10108
|
+
bottom: rects[0].bottom
|
|
10109
|
+
}
|
|
10110
|
+
);
|
|
9882
10111
|
}
|
|
9883
10112
|
function MultiSelectionOverlay({ selectedElements }) {
|
|
9884
10113
|
const elements = React20.useMemo(
|
|
@@ -9887,10 +10116,12 @@ function MultiSelectionOverlay({ selectedElements }) {
|
|
|
9887
10116
|
);
|
|
9888
10117
|
const [selectionRects, setSelectionRects] = React20.useState([]);
|
|
9889
10118
|
const updateRects = React20.useCallback(() => {
|
|
9890
|
-
setSelectionRects(
|
|
9891
|
-
element
|
|
9892
|
-
|
|
9893
|
-
|
|
10119
|
+
setSelectionRects(
|
|
10120
|
+
elements.map((element) => ({
|
|
10121
|
+
element,
|
|
10122
|
+
rect: element.getBoundingClientRect()
|
|
10123
|
+
}))
|
|
10124
|
+
);
|
|
9894
10125
|
}, [elements]);
|
|
9895
10126
|
React20.useLayoutEffect(() => {
|
|
9896
10127
|
updateRects();
|
|
@@ -13120,89 +13351,91 @@ function DirectEditPanelInner({
|
|
|
13120
13351
|
sectionRefs
|
|
13121
13352
|
}
|
|
13122
13353
|
),
|
|
13123
|
-
/* @__PURE__ */ jsxs23(
|
|
13124
|
-
|
|
13125
|
-
|
|
13126
|
-
|
|
13127
|
-
|
|
13128
|
-
|
|
13129
|
-
|
|
13130
|
-
|
|
13131
|
-
|
|
13132
|
-
|
|
13133
|
-
|
|
13134
|
-
|
|
13135
|
-
|
|
13136
|
-
|
|
13137
|
-
|
|
13138
|
-
|
|
13139
|
-
|
|
13140
|
-
|
|
13141
|
-
|
|
13142
|
-
|
|
13143
|
-
|
|
13144
|
-
|
|
13145
|
-
|
|
13146
|
-
|
|
13147
|
-
|
|
13148
|
-
|
|
13149
|
-
|
|
13150
|
-
|
|
13151
|
-
|
|
13152
|
-
|
|
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
|
-
|
|
13354
|
+
/* @__PURE__ */ jsxs23(
|
|
13355
|
+
"div",
|
|
13356
|
+
{
|
|
13357
|
+
className: "flex-1 overflow-y-auto backdrop-blur-xl bg-background/85",
|
|
13358
|
+
ref: scrollRef,
|
|
13359
|
+
onWheelCapture: (e) => e.stopPropagation(),
|
|
13360
|
+
children: [
|
|
13361
|
+
/* @__PURE__ */ jsx29(
|
|
13362
|
+
LayoutSection,
|
|
13363
|
+
{
|
|
13364
|
+
elementInfo,
|
|
13365
|
+
computedFlex,
|
|
13366
|
+
computedSpacing,
|
|
13367
|
+
computedSizing,
|
|
13368
|
+
onToggleFlex,
|
|
13369
|
+
onUpdateFlex,
|
|
13370
|
+
onUpdateSpacing,
|
|
13371
|
+
onUpdateSizing,
|
|
13372
|
+
sectionRef: sectionRefs.layout
|
|
13373
|
+
}
|
|
13374
|
+
),
|
|
13375
|
+
/* @__PURE__ */ jsx29("div", { ref: sectionRefs.radius, children: /* @__PURE__ */ jsx29(CollapsibleSection, { title: "Radius", children: /* @__PURE__ */ jsx29(
|
|
13376
|
+
BorderRadiusInputs,
|
|
13377
|
+
{
|
|
13378
|
+
values: {
|
|
13379
|
+
topLeft: computedBorderRadius.borderTopLeftRadius,
|
|
13380
|
+
topRight: computedBorderRadius.borderTopRightRadius,
|
|
13381
|
+
bottomRight: computedBorderRadius.borderBottomRightRadius,
|
|
13382
|
+
bottomLeft: computedBorderRadius.borderBottomLeftRadius
|
|
13383
|
+
},
|
|
13384
|
+
onChange: onUpdateBorderRadius
|
|
13385
|
+
}
|
|
13386
|
+
) }) }),
|
|
13387
|
+
computedColor && /* @__PURE__ */ jsx29("div", { ref: sectionRefs.fill, children: /* @__PURE__ */ jsx29(
|
|
13388
|
+
BackgroundFillSection,
|
|
13389
|
+
{
|
|
13390
|
+
backgroundColor: computedColor.backgroundColor,
|
|
13391
|
+
onSetCSS,
|
|
13392
|
+
pendingStyles
|
|
13393
|
+
}
|
|
13394
|
+
) }),
|
|
13395
|
+
/* @__PURE__ */ jsx29("div", { ref: sectionRefs.border, children: /* @__PURE__ */ jsx29(
|
|
13396
|
+
BorderSection,
|
|
13397
|
+
{
|
|
13398
|
+
border: computedBorder,
|
|
13399
|
+
borderColor: computedColor?.borderColor,
|
|
13400
|
+
outlineColor: computedColor?.outlineColor,
|
|
13401
|
+
borderStyleControlPreference,
|
|
13402
|
+
onChange: onUpdateBorder,
|
|
13403
|
+
onBatchChange: onBatchUpdateBorder,
|
|
13404
|
+
onBorderColorChange: (value) => onUpdateColor("borderColor", value),
|
|
13405
|
+
onOutlineColorChange: (value) => onUpdateColor("outlineColor", value),
|
|
13406
|
+
onSetCSS,
|
|
13407
|
+
pendingStyles
|
|
13408
|
+
}
|
|
13409
|
+
) }),
|
|
13410
|
+
/* @__PURE__ */ jsx29("div", { ref: sectionRefs.shadow, children: /* @__PURE__ */ jsx29(
|
|
13411
|
+
ShadowSection,
|
|
13412
|
+
{
|
|
13413
|
+
boxShadow: computedBoxShadow,
|
|
13414
|
+
onSetCSS,
|
|
13415
|
+
pendingStyles
|
|
13416
|
+
}
|
|
13417
|
+
) }),
|
|
13418
|
+
elementInfo.isTextElement && computedTypography && /* @__PURE__ */ jsx29("div", { ref: sectionRefs.text, children: /* @__PURE__ */ jsx29(CollapsibleSection, { title: "Text", children: /* @__PURE__ */ jsx29(TypographyInputs, { typography: computedTypography, onUpdate: onUpdateTypography }) }) }),
|
|
13419
|
+
computedColor && /* @__PURE__ */ jsx29("div", { ref: sectionRefs.colors, children: /* @__PURE__ */ jsx29(CollapsibleSection, { title: "Selection colors", children: /* @__PURE__ */ jsx29(
|
|
13420
|
+
FillSection,
|
|
13421
|
+
{
|
|
13422
|
+
textColor: computedColor.color,
|
|
13423
|
+
borderColor: computedColor.borderColor,
|
|
13424
|
+
outlineColor: computedColor.outlineColor,
|
|
13425
|
+
selectionColors,
|
|
13426
|
+
onTextChange: (value) => onUpdateColor("color", value),
|
|
13427
|
+
onBorderColorChange: (value) => onUpdateColor("borderColor", value),
|
|
13428
|
+
onOutlineColorChange: (value) => onUpdateColor("outlineColor", value),
|
|
13429
|
+
onSelectionColorChange: onReplaceSelectionColor,
|
|
13430
|
+
onSelectionColorTarget: onSelectSelectionColorTarget,
|
|
13431
|
+
hasTextContent: elementInfo.isTextElement,
|
|
13432
|
+
showBorderColor: computedColor.borderColor.alpha > 0,
|
|
13433
|
+
showOutlineColor: computedColor.outlineColor.alpha > 0
|
|
13434
|
+
}
|
|
13435
|
+
) }) })
|
|
13436
|
+
]
|
|
13437
|
+
}
|
|
13438
|
+
),
|
|
13206
13439
|
(onExportEdits || showSendButton && onSendToAgent) && /* @__PURE__ */ jsx29(
|
|
13207
13440
|
PanelFooter,
|
|
13208
13441
|
{
|
|
@@ -13275,6 +13508,8 @@ function DirectEditPanelContent() {
|
|
|
13275
13508
|
addCommentReply,
|
|
13276
13509
|
deleteComment,
|
|
13277
13510
|
exportComment,
|
|
13511
|
+
exportEdits,
|
|
13512
|
+
sendEditToAgent: sendEditToAgent2,
|
|
13278
13513
|
sendCommentToAgent: sendCommentToAgent2,
|
|
13279
13514
|
setActiveCommentId,
|
|
13280
13515
|
startTextEditing,
|
|
@@ -13308,21 +13543,23 @@ function DirectEditPanelContent() {
|
|
|
13308
13543
|
const activeDraftComment = React34.useMemo(() => {
|
|
13309
13544
|
if (!commentTargetElement || !activeCommentId) return null;
|
|
13310
13545
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13311
|
-
if (!active || active.text.trim().length > 0 || active.element !== commentTargetElement)
|
|
13546
|
+
if (!active || active.text.trim().length > 0 || active.element !== commentTargetElement)
|
|
13547
|
+
return null;
|
|
13312
13548
|
return active;
|
|
13313
13549
|
}, [activeCommentId, commentTargetElement, comments]);
|
|
13314
|
-
const { isActive: measurementActive, hoveredElement, measurements, mousePosition } = useMeasurement(
|
|
13315
|
-
isOpen ? selectedElement : null
|
|
13316
|
-
);
|
|
13317
13550
|
const {
|
|
13318
|
-
|
|
13319
|
-
|
|
13320
|
-
|
|
13321
|
-
|
|
13551
|
+
isActive: measurementActive,
|
|
13552
|
+
hoveredElement,
|
|
13553
|
+
measurements,
|
|
13554
|
+
mousePosition
|
|
13555
|
+
} = useMeasurement(isOpen ? selectedElement : null);
|
|
13556
|
+
const { dragState, dropIndicator, startDrag } = useMove({
|
|
13322
13557
|
onMoveComplete: handleMoveComplete
|
|
13323
13558
|
});
|
|
13324
13559
|
const triggerCommentInputAttention = React34.useCallback((commentId) => {
|
|
13325
|
-
setCommentInputAttention(
|
|
13560
|
+
setCommentInputAttention(
|
|
13561
|
+
(prev) => prev?.commentId === commentId ? { commentId, nonce: prev.nonce + 1 } : { commentId, nonce: 1 }
|
|
13562
|
+
);
|
|
13326
13563
|
}, []);
|
|
13327
13564
|
React34.useEffect(() => {
|
|
13328
13565
|
if (!activeCommentId) {
|
|
@@ -13336,26 +13573,32 @@ function DirectEditPanelContent() {
|
|
|
13336
13573
|
setCommentDraftBlockedHandler(null);
|
|
13337
13574
|
};
|
|
13338
13575
|
}, [activeCommentId, setCommentDraftBlockedHandler, triggerCommentInputAttention]);
|
|
13339
|
-
const hasPendingCommentDraft = React34.useCallback(
|
|
13340
|
-
|
|
13341
|
-
|
|
13342
|
-
|
|
13343
|
-
if (!active) return false;
|
|
13344
|
-
const hasUnsentDraft = active.text.trim().length === 0 && commentDraftRef.current.trim().length > 0;
|
|
13345
|
-
if (!hasUnsentDraft) return false;
|
|
13346
|
-
triggerCommentInputAttention(active.id);
|
|
13347
|
-
return true;
|
|
13348
|
-
}, [activeCommentId, comments, triggerCommentInputAttention]);
|
|
13349
|
-
const handleSetActiveComment = React34.useCallback((id) => {
|
|
13350
|
-
if (hasPendingCommentDraft(id)) return;
|
|
13351
|
-
if (activeCommentId && activeCommentId !== id) {
|
|
13576
|
+
const hasPendingCommentDraft = React34.useCallback(
|
|
13577
|
+
(nextCommentId = null) => {
|
|
13578
|
+
if (!activeCommentId) return false;
|
|
13579
|
+
if (nextCommentId && nextCommentId === activeCommentId) return false;
|
|
13352
13580
|
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13353
|
-
if (active
|
|
13354
|
-
|
|
13581
|
+
if (!active) return false;
|
|
13582
|
+
const hasUnsentDraft = active.text.trim().length === 0 && commentDraftRef.current.trim().length > 0;
|
|
13583
|
+
if (!hasUnsentDraft) return false;
|
|
13584
|
+
triggerCommentInputAttention(active.id);
|
|
13585
|
+
return true;
|
|
13586
|
+
},
|
|
13587
|
+
[activeCommentId, comments, triggerCommentInputAttention]
|
|
13588
|
+
);
|
|
13589
|
+
const handleSetActiveComment = React34.useCallback(
|
|
13590
|
+
(id) => {
|
|
13591
|
+
if (hasPendingCommentDraft(id)) return;
|
|
13592
|
+
if (activeCommentId && activeCommentId !== id) {
|
|
13593
|
+
const active = comments.find((comment) => comment.id === activeCommentId);
|
|
13594
|
+
if (active && active.text.trim().length === 0) {
|
|
13595
|
+
deleteComment(active.id);
|
|
13596
|
+
}
|
|
13355
13597
|
}
|
|
13356
|
-
|
|
13357
|
-
|
|
13358
|
-
|
|
13598
|
+
setActiveCommentId(id);
|
|
13599
|
+
},
|
|
13600
|
+
[activeCommentId, comments, hasPendingCommentDraft, deleteComment, setActiveCommentId]
|
|
13601
|
+
);
|
|
13359
13602
|
const handleCommentPillClick = React34.useCallback(() => {
|
|
13360
13603
|
if (activeDraftComment) {
|
|
13361
13604
|
handleSetActiveComment(null);
|
|
@@ -13363,13 +13606,23 @@ function DirectEditPanelContent() {
|
|
|
13363
13606
|
}
|
|
13364
13607
|
if (hasPendingCommentDraft()) return;
|
|
13365
13608
|
if (!commentTargetElement) return;
|
|
13366
|
-
const existingDraft = comments.find(
|
|
13609
|
+
const existingDraft = comments.find(
|
|
13610
|
+
(comment) => comment.element === commentTargetElement && comment.text.trim().length === 0
|
|
13611
|
+
);
|
|
13367
13612
|
if (existingDraft) {
|
|
13368
13613
|
setActiveCommentId(existingDraft.id);
|
|
13369
13614
|
return;
|
|
13370
13615
|
}
|
|
13371
13616
|
addComment(commentTargetElement, getElementCommentAnchor(commentTargetElement));
|
|
13372
|
-
}, [
|
|
13617
|
+
}, [
|
|
13618
|
+
activeDraftComment,
|
|
13619
|
+
handleSetActiveComment,
|
|
13620
|
+
hasPendingCommentDraft,
|
|
13621
|
+
commentTargetElement,
|
|
13622
|
+
comments,
|
|
13623
|
+
setActiveCommentId,
|
|
13624
|
+
addComment
|
|
13625
|
+
]);
|
|
13373
13626
|
React34.useEffect(() => {
|
|
13374
13627
|
const previous = previousCommentTriggerRef.current;
|
|
13375
13628
|
previousCommentTriggerRef.current = { editModeActive, commentTargetElement };
|
|
@@ -13466,58 +13719,81 @@ function DirectEditPanelContent() {
|
|
|
13466
13719
|
if (pageTitle.length > 0) return pageTitle;
|
|
13467
13720
|
return getElementDisplayName(pageFrameElement);
|
|
13468
13721
|
}, [pageFrameElement]);
|
|
13469
|
-
const handleSelectSelectionColorTarget = React34.useCallback(
|
|
13470
|
-
|
|
13471
|
-
|
|
13472
|
-
|
|
13473
|
-
|
|
13474
|
-
|
|
13475
|
-
|
|
13476
|
-
|
|
13477
|
-
const
|
|
13478
|
-
|
|
13479
|
-
|
|
13480
|
-
|
|
13481
|
-
|
|
13482
|
-
|
|
13483
|
-
const currentTextColor = computed.color;
|
|
13484
|
-
const matches = (raw, fallback) => {
|
|
13485
|
-
const parsed = parseVisibleColor3(raw, fallback);
|
|
13486
|
-
return Boolean(parsed && toKey(parsed) === targetKey);
|
|
13722
|
+
const handleSelectSelectionColorTarget = React34.useCallback(
|
|
13723
|
+
(targetColor) => {
|
|
13724
|
+
if (!selectedElement) return;
|
|
13725
|
+
const toKey = (color) => `${color.hex.toUpperCase()}:${Math.round(color.alpha)}`;
|
|
13726
|
+
const targetKey = toKey(targetColor);
|
|
13727
|
+
const hasOwnText2 = (node) => Array.from(node.childNodes).some(
|
|
13728
|
+
(child) => child.nodeType === Node.TEXT_NODE && (child.textContent ?? "").trim().length > 0
|
|
13729
|
+
);
|
|
13730
|
+
const parseVisibleColor3 = (raw, fallbackCurrentColor) => {
|
|
13731
|
+
const trimmed = raw.trim();
|
|
13732
|
+
if (!trimmed || trimmed === "none" || trimmed === "transparent") return null;
|
|
13733
|
+
const resolved = trimmed.toLowerCase() === "currentcolor" ? fallbackCurrentColor ?? trimmed : trimmed;
|
|
13734
|
+
const parsed = parseColorValue(resolved);
|
|
13735
|
+
return parsed.alpha > 0 ? parsed : null;
|
|
13487
13736
|
};
|
|
13488
|
-
|
|
13489
|
-
|
|
13490
|
-
|
|
13491
|
-
|
|
13492
|
-
|
|
13493
|
-
|
|
13494
|
-
|
|
13495
|
-
|
|
13496
|
-
|
|
13497
|
-
|
|
13737
|
+
const hasMatchingColor = (node) => {
|
|
13738
|
+
const computed = window.getComputedStyle(node);
|
|
13739
|
+
const currentTextColor = computed.color;
|
|
13740
|
+
const matches = (raw, fallback) => {
|
|
13741
|
+
const parsed = parseVisibleColor3(raw, fallback);
|
|
13742
|
+
return Boolean(parsed && toKey(parsed) === targetKey);
|
|
13743
|
+
};
|
|
13744
|
+
if (matches(computed.backgroundColor)) return true;
|
|
13745
|
+
if (hasOwnText2(node) && matches(currentTextColor)) return true;
|
|
13746
|
+
const borderSides = [
|
|
13747
|
+
{
|
|
13748
|
+
style: computed.borderTopStyle,
|
|
13749
|
+
width: computed.borderTopWidth,
|
|
13750
|
+
color: computed.borderTopColor
|
|
13751
|
+
},
|
|
13752
|
+
{
|
|
13753
|
+
style: computed.borderRightStyle,
|
|
13754
|
+
width: computed.borderRightWidth,
|
|
13755
|
+
color: computed.borderRightColor
|
|
13756
|
+
},
|
|
13757
|
+
{
|
|
13758
|
+
style: computed.borderBottomStyle,
|
|
13759
|
+
width: computed.borderBottomWidth,
|
|
13760
|
+
color: computed.borderBottomColor
|
|
13761
|
+
},
|
|
13762
|
+
{
|
|
13763
|
+
style: computed.borderLeftStyle,
|
|
13764
|
+
width: computed.borderLeftWidth,
|
|
13765
|
+
color: computed.borderLeftColor
|
|
13766
|
+
}
|
|
13767
|
+
];
|
|
13768
|
+
for (const side of borderSides) {
|
|
13769
|
+
if (side.style !== "none" && parseFloat(side.width) > 0 && matches(side.color, currentTextColor)) {
|
|
13770
|
+
return true;
|
|
13771
|
+
}
|
|
13772
|
+
}
|
|
13773
|
+
if (computed.outlineStyle !== "none" && parseFloat(computed.outlineWidth) > 0 && matches(computed.outlineColor, currentTextColor)) {
|
|
13498
13774
|
return true;
|
|
13499
13775
|
}
|
|
13776
|
+
if (node instanceof SVGGraphicsElement) {
|
|
13777
|
+
const fillMatch = matches(computed.getPropertyValue("fill"), currentTextColor) || matches(node.getAttribute("fill") ?? "", currentTextColor);
|
|
13778
|
+
const strokeMatch = matches(computed.getPropertyValue("stroke"), currentTextColor) || matches(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
13779
|
+
if (fillMatch || strokeMatch) return true;
|
|
13780
|
+
}
|
|
13781
|
+
return false;
|
|
13782
|
+
};
|
|
13783
|
+
const descendants = Array.from(selectedElement.querySelectorAll("*"));
|
|
13784
|
+
const firstDescendantMatch = descendants.find(
|
|
13785
|
+
(node) => node instanceof HTMLElement && hasMatchingColor(node)
|
|
13786
|
+
);
|
|
13787
|
+
if (firstDescendantMatch) {
|
|
13788
|
+
selectElement(firstDescendantMatch);
|
|
13789
|
+
return;
|
|
13500
13790
|
}
|
|
13501
|
-
if (
|
|
13502
|
-
|
|
13503
|
-
}
|
|
13504
|
-
if (node instanceof SVGGraphicsElement) {
|
|
13505
|
-
const fillMatch = matches(computed.getPropertyValue("fill"), currentTextColor) || matches(node.getAttribute("fill") ?? "", currentTextColor);
|
|
13506
|
-
const strokeMatch = matches(computed.getPropertyValue("stroke"), currentTextColor) || matches(node.getAttribute("stroke") ?? "", currentTextColor);
|
|
13507
|
-
if (fillMatch || strokeMatch) return true;
|
|
13791
|
+
if (hasMatchingColor(selectedElement)) {
|
|
13792
|
+
selectElement(selectedElement);
|
|
13508
13793
|
}
|
|
13509
|
-
|
|
13510
|
-
|
|
13511
|
-
|
|
13512
|
-
const firstDescendantMatch = descendants.find((node) => node instanceof HTMLElement && hasMatchingColor(node));
|
|
13513
|
-
if (firstDescendantMatch) {
|
|
13514
|
-
selectElement(firstDescendantMatch);
|
|
13515
|
-
return;
|
|
13516
|
-
}
|
|
13517
|
-
if (hasMatchingColor(selectedElement)) {
|
|
13518
|
-
selectElement(selectedElement);
|
|
13519
|
-
}
|
|
13520
|
-
}, [selectedElement, selectElement]);
|
|
13794
|
+
},
|
|
13795
|
+
[selectedElement, selectElement]
|
|
13796
|
+
);
|
|
13521
13797
|
const handleMoveStart = (e, targetElement, options) => {
|
|
13522
13798
|
const elementToDrag = targetElement ?? selectedElement;
|
|
13523
13799
|
if (elementToDrag) {
|
|
@@ -13606,7 +13882,11 @@ function DirectEditPanelContent() {
|
|
|
13606
13882
|
hoveredElement,
|
|
13607
13883
|
measurements: [
|
|
13608
13884
|
...measurements,
|
|
13609
|
-
...calculateGuidelineMeasurements(
|
|
13885
|
+
...calculateGuidelineMeasurements(
|
|
13886
|
+
selectedElement,
|
|
13887
|
+
getStoredGuidelines(),
|
|
13888
|
+
mousePosition
|
|
13889
|
+
)
|
|
13610
13890
|
]
|
|
13611
13891
|
}
|
|
13612
13892
|
),
|
|
@@ -13661,6 +13941,9 @@ function DirectEditPanelContent() {
|
|
|
13661
13941
|
onSelectSelectionColorTarget: handleSelectSelectionColorTarget,
|
|
13662
13942
|
onUpdateTypography: updateTypographyProperty,
|
|
13663
13943
|
onReset: resetToOriginal,
|
|
13944
|
+
onExportEdits: exportEdits,
|
|
13945
|
+
onSendToAgent: agentAvailable ? sendEditToAgent2 : void 0,
|
|
13946
|
+
sendFailureReason: lastSendFailure?.reason ?? null,
|
|
13664
13947
|
className: "fixed z-[99999]",
|
|
13665
13948
|
style: {
|
|
13666
13949
|
left: position.x,
|