@8btc/whiteboard 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +442 -0
- package/dist/index.js +1706 -0
- package/dist/index.umd.js +2 -0
- package/dist/vite.svg +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(d,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("react/jsx-runtime"),require("react"),require("konva"),require("mitt"),require("uuid"),require("@radix-ui/react-slot"),require("class-variance-authority"),require("clsx"),require("tailwind-merge"),require("lucide-react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","konva","mitt","uuid","@radix-ui/react-slot","class-variance-authority","clsx","tailwind-merge","lucide-react"],c):(d=typeof globalThis<"u"?globalThis:d||self,c(d.konvaWhiteboard={},d.jsxRuntime,d.React,d.Konva,d.mitt,d.uuid,d.ReactSlot,d.ClassVarianceAuthority,d.clsx,d.tailwindMerge,d.LucideReact))})(this,(function(d,c,u,E,At,q,Dt,Zt,Yt,Rt,W){"use strict";var le=Object.defineProperty;var Et=d=>{throw TypeError(d)};var ce=(d,c,u)=>c in d?le(d,c,{enumerable:!0,configurable:!0,writable:!0,value:u}):d[c]=u;var U=(d,c,u)=>ce(d,typeof c!="symbol"?c+"":c,u),mt=(d,c,u)=>c.has(d)||Et("Cannot "+u);var r=(d,c,u)=>(mt(d,c,"read from private field"),u?u.call(d):c.get(d)),g=(d,c,u)=>c.has(d)?Et("Cannot add the same private member more than once"):c instanceof WeakSet?c.add(d):c.set(d,u),N=(d,c,u,E)=>(mt(d,c,"write to private field"),E?E.call(d,u):c.set(d,u),u),S=(d,c,u)=>(mt(d,c,"access private method"),u);var x,p,A,$,G,B,J,Q,K,tt,et,It,j,b,rt,it,ot,st,at,nt,lt,Ct,_,Z,ft,yt,Tt,C,vt,zt,wt,xt,V,T,L,F,ct,Pt,y,Y,M,k;var bt=document.createElement("style");bt.textContent=`@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-border-style:solid;--tw-font-weight: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-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@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-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-bold:700;--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)}}@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;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}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.static{position:static}.top-0{top:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.right-4{right:calc(var(--spacing)*4)}.bottom-4{bottom:calc(var(--spacing)*4)}.left-0{left:calc(var(--spacing)*0)}.left-4{left:calc(var(--spacing)*4)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.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}}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-full{width:100%;height:100%}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-\\[500px\\]{height:500px}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing)*40)}.w-\\[700px\\]{width:700px}.w-full{width:100%}.max-w-xs{max-width:var(--container-xs)}.min-w-16{min-width:calc(var(--spacing)*16)}.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.touch-none{touch-action:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.overflow-auto{overflow:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.bg-background{background-color:var(--background)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-destructive{background-color:var(--destructive)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-primary{background-color:var(--primary)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.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))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-gray-400{color:var(--color-gray-400)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.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-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)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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))}.outline-none{--tw-outline-style:none;outline-style:none}@media(hover:hover){.hover\\:bg-accent:hover{background-color:var(--accent)}.hover\\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\\:bg-destructive\\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\\:bg-indigo-600:hover{background-color:var(--color-indigo-600)}.hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\\:underline:hover{text-decoration-line:underline}}.focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + 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-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\\[\\>svg\\]\\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\\[\\>svg\\]\\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.dark\\:border-input:is(.dark *){border-color:var(--input)}.dark\\:bg-destructive\\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\\:bg-destructive\\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}@media(hover:hover){.dark\\:hover\\:bg-accent\\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\\:hover\\:bg-accent\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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}
|
|
2
|
+
/*$vite$:1*/`,document.head.appendChild(bt);class Ut{constructor(s,t){g(this,et);g(this,x);g(this,p);g(this,A,{x:0,y:0,scale:1});g(this,$,s=>{s.evt.preventDefault();const e=r(this,p).getPointerPosition();if(e)if(s.evt.ctrlKey){const i=r(this,A).scale,o={x:(e.x-r(this,A).x)/i,y:(e.y-r(this,A).y)/i},a=1.01,l=s.evt.deltaY>0?-1:1,h=Math.min(Math.abs(s.evt.deltaY),10);let m=i;for(let v=0;v<h;v++)m=l>0?m*a:m/a;const f=Math.max(.1,Math.min(5,m)),I={x:e.x-o.x*f,y:e.y-o.y*f};r(this,x).updateViewport({x:I.x,y:I.y,scale:f})}else{const i=s.evt.shiftKey?s.evt.deltaY:s.evt.deltaX,o=s.evt.shiftKey?0:s.evt.deltaY;r(this,x).updateViewport({x:r(this,A).x-i,y:r(this,A).y-o})}});g(this,G,s=>{const t=r(this,x).getState().toolType;if(s.evt.button!==0||t==="hand")return;const e=s.target===r(this,p),i=r(this,p).getRelativePointerPosition();if(t==="select"&&!e){const o=s.target.id();o&&r(this,x).selectNode(o,s.evt.shiftKey);return}if(t==="rectangle"&&i&&r(this,x).createDraftNode(t,i),t==="image-marker"&&i){const o=r(this,x).findImageAtPosition(i);if(console.log(o,"imageShape"),o){const a=o.width(),l=o.height();if(a&&l){const h={x:o.x(),y:o.y(),width:a,height:l};r(this,x).createDraftNode(t,i,{parent:o.id(),bounds:h,startPosition:i})}}}r(this,x).selectNode()});g(this,B,()=>{const s=r(this,x).getState().toolType;if(s==="hand")return;const t=r(this,p).getRelativePointerPosition();(s==="rectangle"||s==="image-marker")&&t&&r(this,x).updateDraftNode(t)});g(this,J,()=>{const s=r(this,x).getState().toolType;s!=="hand"&&(s==="rectangle"||s==="image-marker")&&r(this,x).finalizeDraftNode()});g(this,Q,s=>{if(s.target!==r(this,p))return;const t=r(this,x).getState().toolType;t==="hand"?this.setCursor("grabbing"):t==="select"&&this.setCursor("all-scroll")});g(this,K,s=>{s.target===r(this,p)&&r(this,x).updateViewport({x:r(this,p).x(),y:r(this,p).y()})});g(this,tt,s=>{s.target===r(this,p)&&(r(this,x).updateViewport({x:r(this,p).x(),y:r(this,p).y()}),this.resetCursor())});N(this,x,s),N(this,p,new E.Stage({container:t.container,width:t.width,height:t.height,x:0,y:0,scaleX:1,scaleY:1,draggable:t.draggable??!1,className:t.className})),S(this,et,It).call(this)}getStage(){return r(this,p)}getViewport(){return{...r(this,A)}}setViewport(s){const t={...r(this,A),...s};N(this,A,t),s.x!==void 0&&r(this,p).x(s.x),s.y!==void 0&&r(this,p).y(s.y),s.scale!==void 0&&(r(this,p).scaleX(s.scale),r(this,p).scaleY(s.scale)),s.width!==void 0&&r(this,p).width(s.width),s.height!==void 0&&r(this,p).height(s.height)}setDraggable(s){r(this,p).draggable(s)}setCursor(s){const t=r(this,p).container();t.style.cursor=s}resetCursor(){const s=r(this,p).container();if(r(this,x).getState().toolType==="hand"){s.style.cursor="grab";return}s.style.cursor="default"}destroy(){r(this,p).destroy()}}x=new WeakMap,p=new WeakMap,A=new WeakMap,$=new WeakMap,G=new WeakMap,B=new WeakMap,J=new WeakMap,Q=new WeakMap,K=new WeakMap,tt=new WeakMap,et=new WeakSet,It=function(){r(this,p).on("wheel",r(this,$)),r(this,p).on("pointerdown",r(this,G)),r(this,p).on("pointermove",r(this,B)),r(this,p).on("pointerup",r(this,J)),r(this,p).on("dragstart",r(this,Q)),r(this,p).on("dragmove",r(this,K)),r(this,p).on("dragend",r(this,tt))};class Vt{constructor(s,t){g(this,lt);g(this,j);g(this,b);g(this,rt,()=>{this.emitPositionChange()});g(this,it,()=>{console.log("transforming..."),this.emitPositionChange()});g(this,ot,()=>{this.emitPositionChange()});g(this,st,()=>{this.emitPositionChange()});g(this,at,()=>{this.emitPositionChange()});g(this,nt,()=>{this.emitPositionChange()});N(this,j,s),N(this,b,new E.Transformer({rotateEnabled:t?.rotateEnabled??!0,ignoreStroke:t?.ignoreStroke??!0,anchorSize:t?.anchorSize??8,borderDash:t?.borderDash??[4,4],anchorCornerRadius:t?.anchorCornerRadius??4,padding:t?.padding??6})),S(this,lt,Ct).call(this)}getTransformer(){return r(this,b)}getPosition(){if(r(this,b).nodes().length===0)return null;const t=r(this,b).getClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height,rotation:r(this,b).rotation()}}setNodes(s){if(s.length===0){this.clearNodes();return}r(this,b).nodes(s),r(this,b).moveToTop(),this.emitPositionChange()}getNodes(){return r(this,b).nodes()}clearNodes(){r(this,b).nodes([]),r(this,b).moveToBottom(),this.emitPositionChange()}emitPositionChange(){const s=this.getPosition();r(this,j).emitEvent("transformer:positionChange",s)}destroy(){r(this,b).destroy()}}j=new WeakMap,b=new WeakMap,rt=new WeakMap,it=new WeakMap,ot=new WeakMap,st=new WeakMap,at=new WeakMap,nt=new WeakMap,lt=new WeakSet,Ct=function(){r(this,b).on("transformstart",r(this,rt)),r(this,b).on("transform",r(this,it)),r(this,b).on("transformend",r(this,ot)),r(this,b).on("dragstart",r(this,st)),r(this,b).on("dragmove",r(this,at)),r(this,b).on("dragend",r(this,nt))};class Xt{constructor(s){U(this,"_past",[]);U(this,"_present");U(this,"_future",[]);U(this,"_emitter");this._present=s,this._emitter=At()}getState(){return{...this._present}}getHistory(){return{past:[...this._past],present:{...this._present},future:[...this._future]}}canUndo(){return this._past.length>0}canRedo(){return this._future.length>0}on(s,t){this._emitter.on(s,t)}off(s,t){this._emitter.off(s,t)}emit(s,t){this._emitter.emit(s,t)}undo(){if(this._past.length===0)return;const s=this._past[this._past.length-1],t=this._past.slice(0,this._past.length-1);this._past=t,this._future=[this._present,...this._future],this._present=s,this._syncState(s),this._emitter.emit("state:undo",s),this._emitter.emit("state:change",s)}redo(){if(this._future.length===0)return;const s=this._future[0],t=this._future.slice(1);this._past=[...this._past,this._present],this._future=t,this._present=s,this._syncState(s),this._emitter.emit("state:redo",s),this._emitter.emit("state:change",s)}resetHistory(){this._past=[],this._future=[],this._emitter.emit("state:reset",this._present),this._emitter.emit("state:change",this._present)}_updateState(s,t=!0){const e={...this._present,...s};t&&(this._past=[...this._past,this._present],this._future=[]),this._present=e,this._emitter.emit("state:change",e)}_syncState(s){}_dispose(){this._emitter.all.clear()}}const dt="shapeNameForSelect",w={CORNER_RADIUS:6,MIN_SIZE:10},X={MIN_SIZE:10},kt={MIN_SIZE:10};function Ot(n,s,t){return 2*(s+n-t*(4-Math.PI))}function Ht(n,s,t){let e=1,i=0,o=0;switch(t){case"dashed":i=Math.min(s*2,n/4);break;case"dotted":e=8,i=s/e;break;default:return[]}let a=Math.floor(n/i/(2*e));return a=Math.max(a,3),i=n/a/(2*e),o=(n-a*i)/a,[i,o]}function jt(n){switch(n){case"small":return 2;case"medium":return 3;case"large":return 5;case"extra-large":return 8;default:return 3}}function Lt(n){return Array.isArray(n)&&n.length>1?n[0]+n[1]:0}function Nt(n){return{width:Math.max(kt.MIN_SIZE,n.width()*n.scaleX()),height:Math.max(kt.MIN_SIZE,n.height()*n.scaleY())}}class pt{constructor(s,t){U(this,"core");U(this,"node");U(this,"element");U(this,"toolTypeChangeHandler");this.core=s,this.node=t,this.element=this.createElement(),this.toolTypeChangeHandler=e=>{const i=e==="select";this.element.listening(i)},this.toolTypeChangeHandler(this.core.getToolType()),this.core.on("toolType:change",this.toolTypeChangeHandler)}getElement(){return this.element}getNode(){return this.node}destroy(){this.core.off("toolType:change",this.toolTypeChangeHandler),this.element.destroy()}}function Ft(n,s){if(!s||s===0)return null;const t=new E.Animation(e=>{if(!e)return;const i=-e.time/10%s;n.dashOffset(i)},n.getLayer());return{start:()=>t.start(),stop:()=>t.stop(),isRunning:()=>t.isRunning()}}class qt extends pt{constructor(t,e){super(t,e);g(this,Z);g(this,_,null);e.style.animated&&S(this,Z,ft).call(this),S(this,Z,Tt).call(this,this.getElement())}createElement(){const t=Math.max(this.node.props.width??w.MIN_SIZE,w.MIN_SIZE),e=Math.max(this.node.props.height??w.MIN_SIZE,w.MIN_SIZE),i={id:this.node.id,...this.node.props,...this.node.style,width:t,height:e,cornerRadius:w.CORNER_RADIUS,name:dt,draggable:!0,stroke:"black",strokeWidth:2},o=new E.Rect(i);return o.setAttrs({width:t,height:e}),o}getElement(){return this.element}updateNode(t){this.node={...this.node,...t,props:{...this.node.props,...t.props},style:{...this.node.style,...t.style}};const e=this.getElement();e.x(this.node.props.x),e.y(this.node.props.y);const i=Math.max(this.node.props.width??w.MIN_SIZE,w.MIN_SIZE),o=Math.max(this.node.props.height??w.MIN_SIZE,w.MIN_SIZE);e.width(i),e.height(o),this.node.style.animated&&!r(this,_)?S(this,Z,ft).call(this):!this.node.style.animated&&r(this,_)&&S(this,Z,yt).call(this)}destroy(){S(this,Z,yt).call(this),super.destroy()}}_=new WeakMap,Z=new WeakSet,ft=function(){const t=this.getElement(),e=t.dash();if(!e||e.length===0)return;const i=Lt(e);N(this,_,Ft(t,i)),r(this,_)&&r(this,_).start()},yt=function(){r(this,_)&&(r(this,_).stop(),N(this,_,null))},Tt=function(t=void 0){const e=t??this.getElement();e.on("transformstart",()=>{this.node.style.animated&&r(this,_)&&r(this,_).stop()}),e.on("transform",i=>{const o=i.target,{width:a,height:l}=Nt(o),h=Ot(a,l,w.CORNER_RADIUS),m=Ht(h,jt(this.node.style.size),this.node.style.line);o.scale({x:1,y:1}),o.width(a),o.height(l),o.dash(m.map(f=>f*this.core.getStageScale()))}),e.on("transformend",i=>{const o=i.target,{width:a,height:l}=Nt(o),h={...this.node.props,x:o.x(),y:o.y(),width:a,height:l,rotation:o.rotation()};this.node.props=h,this.core._syncNodeFromElement(this.node.id,{props:h}),this.node.style.animated&&r(this,_)?.isRunning()===!1&&r(this,_).start()}),e.on("dragend",i=>{const o=i.target,a={...this.node.props,x:o.x(),y:o.y()};this.node.props=a,this.core._syncNodeFromElement(this.node.id,{props:a})})};class Wt extends pt{constructor(t,e){super(t,e);g(this,C);S(this,C,vt).call(this),S(this,C,zt).call(this,this.getElement())}createElement(){const t=document.createElement("canvas");return t.width=1,t.height=1,new E.Image({id:this.node.id,x:this.node.props.x,y:this.node.props.y,name:dt,draggable:!0,image:t})}getElement(){return this.element}updateNode(t){this.node={...this.node,...t,props:{...this.node.props,...t.props},style:{...this.node.style,...t.style},meta:{...this.node.meta,...t.meta}};const e=this.getElement();if(e.x(this.node.props.x),e.y(this.node.props.y),this.node.props.width&&this.node.props.height){const i=Math.max(this.node.props.width,X.MIN_SIZE),o=Math.max(this.node.props.height,X.MIN_SIZE);e.width(i),e.height(o)}this.node.props.rotation!==void 0&&e.rotation(this.node.props.rotation),t.meta?.imageUrl&&t.meta.imageUrl!==this.node.meta.imageUrl&&S(this,C,vt).call(this)}destroy(){super.destroy()}}C=new WeakSet,vt=function(){const t=this.node.meta.imageUrl;if(!t){console.warn("Image URL is missing");return}const e=new window.Image;e.crossOrigin="anonymous",e.src=t,e.onload=()=>{this.getElement().image(e);const i=this.node.props.width??e.width,o=this.node.props.height??e.height;this.getElement().width(Math.max(i,X.MIN_SIZE)),this.getElement().height(Math.max(o,X.MIN_SIZE))},e.onerror=()=>{console.error("Failed to load image:",t)}},zt=function(t){t.on("transform",e=>{const i=e.target,o=Math.max(X.MIN_SIZE,i.width()*i.scaleX()),a=Math.max(X.MIN_SIZE,i.height()*i.scaleY());i.scale({x:1,y:1}),i.width(o),i.height(a),S(this,C,wt).call(this)}),t.on("transformend",e=>{const i=e.target,o={...this.node.props,x:i.x(),y:i.y(),width:i.width(),height:i.height(),rotation:i.rotation()};this.node.props=o,this.core._syncNodeFromElement(this.node.id,{props:o}),S(this,C,xt).call(this)}),t.on("dragmove",()=>{S(this,C,wt).call(this)}),t.on("dragend",e=>{const i=e.target,o={...this.node.props,x:i.x(),y:i.y()};this.node.props=o,this.core._syncNodeFromElement(this.node.id,{props:o}),S(this,C,xt).call(this)})},wt=function(){const t=this.getElement(),e=t.getLayer();if(!e)return;const i=t.x(),o=t.y(),a=t.width(),l=t.height(),h=e.find(f=>f.hasName(this.node.id)),m=this.core.getState().nodes||[];h.forEach(f=>{const I=m.find(v=>v.id===f.id());if(I?.type==="image-marker"&&I.meta.relativePosition){const{start:v,end:z}=I.meta.relativePosition,P=i+v.percentX/100*a,D=o+v.percentY/100*l,O=i+z.percentX/100*a,R=o+z.percentY/100*l,ae=Math.min(P,O),ne=Math.min(D,R),gt=Math.abs(O-P),ut=Math.abs(R-D);f.position({x:ae,y:ne}),f.setAttrs({width:gt,height:ut}),f.getChildren().forEach(ht=>{ht.getClassName()==="Rect"?ht.setAttrs({width:gt,height:ut}):ht.getClassName()==="Group"&&ht.setAttrs({x:gt,y:ut})})}})},xt=function(){const e=this.getElement().getLayer();if(!e)return;e.find(o=>o.hasName(this.node.id)).forEach(o=>{this.core._syncNodeFromElement(o.id(),{props:{x:o.x(),y:o.y(),width:o.width(),height:o.height()}})})};class $t extends pt{constructor(t,e){super(t,e);g(this,ct);g(this,V);g(this,T);g(this,L);g(this,F);const i=this.getElement();N(this,V,i.findOne(".rect")),N(this,T,i.findOne(".marker-group")),N(this,L,r(this,T).findOne("Circle")),N(this,F,r(this,T).findOne("Text")),S(this,ct,Pt).call(this)}createElement(){const t=Math.max(this.node.props.width??w.MIN_SIZE,w.MIN_SIZE),e=Math.max(this.node.props.height??w.MIN_SIZE,w.MIN_SIZE),i=new E.Group({id:this.node.id,name:`static ${this.node.meta.parent}`,x:this.node.props.x,y:this.node.props.y,width:t,height:e}),o=new E.Rect({name:"rect",x:0,y:0,width:t,height:e,stroke:this.node.style.color,strokeWidth:2,dash:[5,5],fill:"transparent",cornerRadius:w.CORNER_RADIUS}),a=new E.Group({name:"marker-group",x:t,y:e}),h=16/this.core.getStageScale(),m=new E.Circle({radius:h,fill:"red",stroke:"black",strokeWidth:2}),f=new E.Text({x:-h,y:-h,width:h*2,height:h*2,text:String(this.node.meta.markerNumber||""),align:"center",verticalAlign:"middle",fontSize:16,fill:"white"});return a.add(m),a.add(f),i.add(o),i.add(a),i}getElement(){return this.element}updateNode(t){this.node={...this.node,...t,props:{...this.node.props,...t.props},style:{...this.node.style,...t.style},meta:{...this.node.meta,...t.meta}};const e=this.getElement();e.x(this.node.props.x),e.y(this.node.props.y);const i=Math.max(this.node.props.width??w.MIN_SIZE,w.MIN_SIZE),o=Math.max(this.node.props.height??w.MIN_SIZE,w.MIN_SIZE);e.width(i),e.height(o),r(this,V).width(i),r(this,V).height(o),r(this,T).x(i),r(this,T).y(o),t.style?.color&&r(this,V).stroke(t.style.color),t.meta?.markerNumber!==void 0&&r(this,F).text(String(t.meta.markerNumber))}destroy(){super.destroy()}setFocusState(t){const e=t?3:2,i=t?1.2:1;r(this,V).strokeWidth(e),r(this,L).strokeWidth(e),r(this,T).scaleX(i),r(this,T).scaleY(i)}}V=new WeakMap,T=new WeakMap,L=new WeakMap,F=new WeakMap,ct=new WeakSet,Pt=function(){r(this,T).on("pointerover",()=>{this.setFocusState(!0),this.core.setCursor("pointer")}),r(this,T).on("pointerout",()=>{const e=(this.core.getState().selectedNodeIds||[]).includes(this.node.id);this.setFocusState(e),this.core.resetCursor()}),r(this,T).on("pointerdown",()=>{this.core.selectNode(this.node.id)})};function St(n,s,t){switch(s){case"rectangle":return new qt(n,t);case"image":return new Wt(n,t);case"image-marker":return new $t(n,t);default:return null}}const Gt=(n,s,t,e)=>{const i={type:n,id:q.v4(),text:null,style:{opacity:1,line:"solid",color:"black",size:"medium",animated:!1},props:{x:s.x,y:s.y,rotation:0,visible:!0},meta:e??{}};return n==="image-marker"?{...i,style:{...i.style,color:"#ff0000",line:"dashed"}}:i};function Bt(n,s,t){let e=s;n.type==="image-marker"&&t&&(e={x:Math.max(t.x,Math.min(t.x+t.width,s.x)),y:Math.max(t.y,Math.min(t.y+t.height,s.y))});const[i,o]=Jt({x:n.props.x,y:n.props.y},e);return n.type==="rectangle"||n.type==="image-marker"?{...n,props:{...n.props,x:i.x,y:i.y,width:Math.max(o.x-i.x,w.MIN_SIZE),height:Math.max(o.y-i.y,w.MIN_SIZE)}}:n}function Jt(n,s){let t=n.x,e=n.y,i=s.x,o=s.y,a;return t>i&&(a=Math.abs(t-i),t=i,i=t+a),e>o&&(a=Math.abs(e-o),e=o,o=e+a),[{x:t,y:e},{x:i,y:o}]}class Qt extends Xt{constructor(t){super({viewport:{x:0,y:0,width:t.clientWidth,height:t.clientHeight,scale:1},toolType:"select",nodes:[]});g(this,y);g(this,Y);g(this,M);g(this,k,null);N(this,y,new Ut(this,{container:t,width:t.clientWidth,height:t.clientHeight,draggable:!1,className:"touch-none"})),N(this,Y,new E.Layer),N(this,M,new Vt(this)),r(this,y).getStage().add(r(this,Y)),r(this,Y).add(r(this,M).getTransformer()),this.updateViewport(this.getState().viewport,!1)}getCanvasStage(){return r(this,y)}getCanvasTransformer(){return r(this,M)}emitEvent(t,e){this.emit(t,e)}getStage(){return r(this,y).getStage()}getContainer(){return r(this,y).getStage().container()}getMainLayer(){return r(this,Y)}getToolType(){return this.getState().toolType}setToolType(t){this.selectNode(),this._updateState({toolType:t},!1),this.emit("toolType:change",t),t==="hand"?(r(this,y).setDraggable(!0),r(this,y).setCursor("grab")):(r(this,y).setDraggable(!1),r(this,y).resetCursor())}setDraggable(t){r(this,y).setDraggable(t)}setCursor(t){r(this,y).setCursor(t)}resetCursor(){r(this,y).resetCursor()}getStageScale(){return r(this,y).getStage().scaleX()}updateViewport(t,e=!1){r(this,y).setViewport(t);const i={...this.getState().viewport,...t};this._updateState({viewport:i},e),this.emit("viewport:change",i),r(this,M).emitPositionChange()}createNodes(t){t.map(o=>St(this,o.type,o)).filter(o=>o!==null).forEach(o=>{r(this,Y).add(o.getElement())});const i=[...this.getState().nodes||[],...t];this._updateState({nodes:i},!0)}_createImageNode(t,e){const i=e??{x:100,y:100},o={id:q.v4(),type:"image",props:{x:i.x,y:i.y,width:void 0,height:void 0,rotation:0,visible:!0},style:{color:"#000000",line:"solid",size:"medium",opacity:1},meta:{imageUrl:t}};this.createNodes([o])}createImageMarkerNode(t,e,i,o){const a=this.getState().nodes||[];let l=0;a.forEach(R=>{R.type==="image-marker"&&R.meta.parent===t&&typeof R.meta.markerNumber=="number"&&(l=Math.max(l,R.meta.markerNumber))});const h=(e.x-o.x)/o.width*100,m=(e.y-o.y)/o.height*100,f=(i.x-o.x)/o.width*100,I=(i.y-o.y)/o.height*100,v=Math.min(e.x,i.x),z=Math.min(e.y,i.y),P=Math.abs(i.x-e.x),D=Math.abs(i.y-e.y),O={id:q.v4(),type:"image-marker",props:{x:v,y:z,width:P,height:D,rotation:0,visible:!0},style:{color:"#ff0000",line:"dashed",size:"medium",opacity:1},meta:{parent:t,markerNumber:l+1,relativePosition:{start:{percentX:Math.max(0,Math.min(100,h)),percentY:Math.max(0,Math.min(100,m))},end:{percentX:Math.max(0,Math.min(100,f)),percentY:Math.max(0,Math.min(100,I))}}}};this.createNodes([O])}findImageAtPosition(t){const e=r(this,y).getStage(),i=e.find(a=>a.getClassName()==="Image"),o=i.map(a=>a.listening());i.forEach(a=>a.listening(!0));try{const l=e.getAllIntersections(t).filter(h=>h.getClassName()==="Image");return l.length===0?null:l[l.length-1]}finally{i.forEach((a,l)=>{a.listening(o[l])})}}createDraftNode(t,e,i){r(this,k)&&r(this,k).destroy();const o=Gt(t,e,void 0,i);N(this,k,St(this,t,o)),console.log(r(this,k)),r(this,k)&&r(this,Y).add(r(this,k).getElement())}updateDraftNode(t,e){if(!r(this,k))return;const i=r(this,k).getNode(),o=Bt(i,t,e);r(this,k).updateNode(o)}finalizeDraftNode(){if(!r(this,k))return;const t=q.v4(),e=r(this,k).getNode();if(e.type==="image-marker"&&e.meta.parent){const o=e.meta.bounds,a=e.meta.startPosition,l={x:e.props.x+(e.props.width||0),y:e.props.y+(e.props.height||0)},h=this.getState().nodes||[];let m=0;h.forEach(D=>{D.type==="image-marker"&&D.meta.parent===e.meta.parent&&typeof D.meta.markerNumber=="number"&&(m=Math.max(m,D.meta.markerNumber))});const f=(a.x-o.x)/o.width*100,I=(a.y-o.y)/o.height*100,v=(l.x-o.x)/o.width*100,z=(l.y-o.y)/o.height*100,P={...e,props:{...e.props},style:{...e.style},meta:{parent:e.meta.parent,markerNumber:m+1,relativePosition:{start:{percentX:Math.max(0,Math.min(100,f)),percentY:Math.max(0,Math.min(100,I))},end:{percentX:Math.max(0,Math.min(100,v)),percentY:Math.max(0,Math.min(100,z))}}},id:t,type:"image-marker"};this.createNodes([P]),r(this,k).destroy(),N(this,k,null),this.setToolType("select");return}const i={...e,props:{...e.props},style:{...e.style},meta:{...e.meta},id:t};this.createNodes([i]),r(this,k).destroy(),N(this,k,null),this.setToolType("select")}selectNode(t,e=!1){const i=this.getState().selectedNodeIds??[];if(i.length===0&&!t)return;if(!t){r(this,M).clearNodes(),this._updateState({selectedNodeIds:[]},!1);return}let o=[];e?o=i.length?[...i,t]:[t]:o=[t];const a=this.getStage().find(`.${dt}`).filter(l=>{const h=l.id();return o.includes(h)});r(this,M).setNodes(a),this._updateState({selectedNodeIds:o},!1)}_syncNodeFromElement(t,e){const i=this.getState().nodes||[],o=i.findIndex(h=>h.id===t);if(o===-1)return;const a={...i[o],...e,props:{...i[o].props,...e.props},style:{...i[o].style,...e.style},meta:{...i[o].meta,...e.meta}},l=[...i];l[o]=a,this._updateState({nodes:l},!0)}_deleteNodes(t){if(t.length===0)return;const e=this.getState().nodes||[],i=new Set(t);t.forEach(a=>{e.find(h=>h.id===a)?.type==="image"&&e.forEach(h=>{h.type==="image-marker"&&h.meta.parent===a&&i.add(h.id)})}),i.forEach(a=>{const l=this.getStage().findOne(`#${a}`);l&&l.destroy()});const o=e.filter(a=>!i.has(a.id));r(this,M).clearNodes(),this._updateState({nodes:o,selectedNodeIds:[]},!0)}_deleteSelectedNodes(){const t=this.getState().selectedNodeIds||[];t.length!==0&&this._deleteNodes(t)}getTransformerPosition(){return r(this,M).getPosition()}_exportAsImage(t){const e=r(this,y).getStage(),i=r(this,M).getTransformer(),o=i.visible();i.visible(!1);try{return e.toDataURL({pixelRatio:t?.pixelRatio??2,mimeType:t?.mimeType??"image/png",quality:t?.quality??1})}finally{i.visible(o)}}_exportSelectionAsImage(t){const e=r(this,M).getPosition();if(!e)return console.warn("No selection to export"),null;const i=r(this,y).getStage(),o=t?.padding??10,a=r(this,M).getTransformer(),l=a.visible();a.visible(!1);try{return i.toDataURL({x:e.x-o,y:e.y-o,width:e.width+o*2,height:e.height+o*2,pixelRatio:t?.pixelRatio??2,mimeType:t?.mimeType??"image/png",quality:t?.quality??1})}finally{a.visible(l)}}_dispose(){r(this,M).destroy(),r(this,y).destroy(),super._dispose()}_syncState(t){r(this,y).setViewport({x:t.viewport.x,y:t.viewport.y,scale:t.viewport.scale,width:t.viewport.width,height:t.viewport.height})}}y=new WeakMap,Y=new WeakMap,M=new WeakMap,k=new WeakMap;class _t extends Qt{getAvailableTools(){return["select","hand","rectangle","image-marker"]}setToolType(s){super.setToolType(s)}updateViewport(s,t=!1){super.updateViewport(s,t)}createImageNode(s,t){this._createImageNode(s,t)}exportAsImage(s){return this._exportAsImage(s)}exportSelectionAsImage(s){return this._exportSelectionAsImage(s)}deleteSelectedNodes(){this._deleteSelectedNodes()}deleteNodes(s){this._deleteNodes(s)}dispose(){super._dispose()}}function Kt(n,s,t,e=!1){const[i,o]=s,[a,l]=t,h=a+(n-i)/(o-i)*(l-a);return e?a<l?Math.max(Math.min(h,l),a):Math.max(Math.min(h,a),l):h}const Mt=[{min:-1,mid:.15,step:64},{min:.05,mid:.375,step:16},{min:.15,mid:1,step:4},{min:.7,mid:2.5,step:1}];function te({viewportX:n,viewportY:s,scale:t,size:e=20,showGrid:i=!0}){const o=n/t,a=s/t,l=t;return i?c.jsxs("svg",{className:"canvas-grid w-full h-full absolute top-0 left-0",version:"1.1",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[c.jsx("defs",{children:Mt.map(({min:h,mid:m,step:f},I)=>{const v=f*e*l,z=.5+o*l,P=.5+a*l,D=z>0?z%v:v+z%v,O=P>0?P%v:v+P%v,R=l<m?Kt(l,[h,m],[0,1]):1;return c.jsx("pattern",{id:`grid_${f}`,width:v,height:v,patternUnits:"userSpaceOnUse",children:c.jsx("circle",{className:"tl-grid-dot",cx:D,cy:O,r:1,opacity:R})},I)})}),Mt.map(({step:h},m)=>c.jsx("rect",{width:"100%",height:"100%",fill:`url(#grid_${h})`},m))]}):null}function ee(...n){return Rt.twMerge(Yt.clsx(n))}const re=Zt.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function H({className:n,variant:s="default",size:t="default",asChild:e=!1,...i}){const o=e?Dt.Slot:"button";return c.jsx(o,{"data-slot":"button","data-variant":s,"data-size":t,className:ee(re({variant:s,size:t,className:n})),...i})}function ie({api:n}){const[s,t]=u.useState(n.getState().viewport);u.useEffect(()=>{n.on("viewport:change",h=>{t(h)})},[t,n]);const e=h=>{const m=s.width/2,f=s.height/2,I=(m-s.x)/s.scale,v=(f-s.y)/s.scale,z=m-I*h,P=f-v*h;n.updateViewport({x:z,y:P,scale:h})},i=()=>{const h=Math.min(s.scale*1.2,5);e(h)},o=()=>{const h=Math.max(s.scale/1.2,.1);e(h)},a=()=>{e(1)},l=Math.round(s.scale*100);return c.jsxs("div",{className:"zoom-panel flex items-center gap-2",children:[c.jsx(H,{size:"sm",variant:"secondary",onClick:o,title:"缩小",children:c.jsx(W.Minus,{})}),c.jsxs(H,{size:"sm",variant:"secondary",onClick:a,title:`${l}%`,className:"min-w-16",children:[l,"%"]}),c.jsx(H,{size:"sm",variant:"secondary",onClick:i,title:"放大",children:c.jsx(W.Plus,{})})]})}function oe({api:n}){const[s,t]=u.useState(n.canUndo()),[e,i]=u.useState(n.canRedo());return u.useEffect(()=>{const o=()=>{t(n.canUndo()),i(n.canRedo())};return n.on("state:change",o),()=>{n.off("state:change",o)}},[n]),c.jsxs("div",{className:"history-panel flex items-center gap-2",children:[c.jsx(H,{size:"sm",variant:"secondary",disabled:!s,onClick:()=>n.undo(),title:"撤销",children:c.jsx(W.Undo2,{})}),c.jsx(H,{size:"sm",variant:"secondary",disabled:!e,onClick:()=>n.redo(),title:"重做",children:c.jsx(W.Redo2,{})})]})}function se({setApi:n}){const s=u.useRef(null),[t,e]=u.useState(null),[i,o]=u.useState({x:0,y:0,scale:1});return u.useEffect(()=>{if(!s.current)return;const a=new _t(s.current);return e(a),n?.(a),a.on("viewport:change",l=>{o(l)}),a.on("transformer:positionChange",l=>{console.log("Transformer position changed:",l)}),()=>{a.dispose()}},[n]),c.jsxs("div",{className:"pure-canvas relative size-full",children:[c.jsx(te,{viewportX:i.x,viewportY:i.y,scale:i.scale}),c.jsx("div",{ref:s,className:"size-full"}),t&&c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"history-panel-wrapper absolute bottom-4 left-4 z-10",children:c.jsx(oe,{api:t})}),c.jsx("div",{className:"zoom-panel-wrapper absolute bottom-4 right-4 z-10",children:c.jsx(ie,{api:t})})]})]})}d.CanvasApi=_t,d.PureCanvas=se,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
package/dist/vite.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@8btc/whiteboard",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.umd.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.umd.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": [
|
|
20
|
+
"**/*.css"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"dev": "vite",
|
|
24
|
+
"build": "tsc -b && vite build",
|
|
25
|
+
"lint": "eslint .",
|
|
26
|
+
"preview": "vite preview",
|
|
27
|
+
"prepublishOnly": "pnpm build",
|
|
28
|
+
"release": "pnpm build && npm publish --access public"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
32
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
33
|
+
"konva": "^10.0.0",
|
|
34
|
+
"lucide-react": "^0.400.0"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
38
|
+
"class-variance-authority": "^0.7.1",
|
|
39
|
+
"clsx": "^2.1.1",
|
|
40
|
+
"jotai": "^2.16.1",
|
|
41
|
+
"konva": "^10.0.12",
|
|
42
|
+
"lucide-react": "^0.562.0",
|
|
43
|
+
"mitt": "^3.0.1",
|
|
44
|
+
"react": "^19.2.0",
|
|
45
|
+
"react-dom": "^19.2.0",
|
|
46
|
+
"react-konva": "^19.2.1",
|
|
47
|
+
"tailwind-merge": "^3.4.0",
|
|
48
|
+
"uuid": "^13.0.0",
|
|
49
|
+
"zod": "^4.3.2",
|
|
50
|
+
"zustand": "^5.0.9"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/js": "^9.39.1",
|
|
54
|
+
"@tailwindcss/vite": "^4.1.18",
|
|
55
|
+
"@types/node": "^24.10.1",
|
|
56
|
+
"@types/react": "^19.2.5",
|
|
57
|
+
"@types/react-dom": "^19.2.3",
|
|
58
|
+
"@vitejs/plugin-react": "^5.1.1",
|
|
59
|
+
"eslint": "^9.39.1",
|
|
60
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
61
|
+
"eslint-plugin-react-refresh": "^0.4.24",
|
|
62
|
+
"globals": "^16.5.0",
|
|
63
|
+
"tailwindcss": "^4.1.18",
|
|
64
|
+
"tw-animate-css": "^1.4.0",
|
|
65
|
+
"typescript": "~5.9.3",
|
|
66
|
+
"typescript-eslint": "^8.46.4",
|
|
67
|
+
"vite": "^7.2.4",
|
|
68
|
+
"vite-plugin-dts": "^4.5.4"
|
|
69
|
+
}
|
|
70
|
+
}
|