@uxbertlabs/reportly 1.0.20 → 1.0.22
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/components/IssueModal.d.ts.map +1 -1
- package/dist/components/Reportly.d.ts.map +1 -1
- package/dist/components/ReportlyProvider.d.ts.map +1 -1
- package/dist/features/annotation.d.ts +9 -1
- package/dist/features/annotation.d.ts.map +1 -1
- package/dist/features/export.d.ts.map +1 -1
- package/dist/index.cjs.js +270 -39
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.esm.js +271 -40
- package/dist/index.esm.js.map +1 -1
- package/dist/index.min.js +6 -6
- package/dist/index.min.js.map +1 -1
- package/dist/lib/utils.d.ts +6 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--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-black:#000;--spacing:0.25rem;--container-xs:20rem;--container-2xl:42rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-lg:1.125rem;--text-lg--line-height:1.55556;--text-xl:1.25rem;--text-xl--line-height:1.4;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:0.025em;--radius-md:0.375rem;--radius-lg:0.5rem;--ease-in-out:cubic-bezier(0.4,0,0.2,1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius:0.5rem;--color-border:oklch(0.9 0 0);--color-input:oklch(0.9 0 0);--color-ring:oklch(0.1 0 0);--color-background:oklch(1 0 0);--color-foreground:oklch(0.09 0 0);--color-primary:oklch(0.1 0 0);--color-muted:oklch(0.96 0 0);--color-muted-foreground:oklch(0.45 0 0);--color-destructive:oklch(0.6 0.2 25);--uxbert-z-canvas:999997;--uxbert-z-button:999998;--uxbert-z-toolbar:999999;--uxbert-z-modal:1000000}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:var(--default-font-feature-settings,normal);-webkit-tap-highlight-color:transparent;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-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}hr{border-top-width:1px;color:inherit;height:0}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,pre,samp{font-feature-settings:var(--default-mono-font-feature-settings,normal);font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{font-feature-settings:inherit;background-color:transparent;border-radius:0;color:inherit;font:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}: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}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){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,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-6{top:calc(var(--spacing)*6)}.right-6{right:calc(var(--spacing)*6)}.bottom-6{bottom:calc(var(--spacing)*6)}.left-6{left:calc(var(--spacing)*6)}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.mx-auto{margin-inline:auto}.mt-3{margin-top:calc(var(--spacing)*3)}.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)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-auto{height:auto}.max-h-72{max-height:calc(var(--spacing)*72)}.max-h-\[90vh\]{max-height:90vh}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[220px\]{max-width:220px}.max-w-xs{max-width:var(--container-xs)}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.-translate-y-1\/2{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.space-y-2{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}}.space-y-5{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*5*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*5*var(--tw-space-y-reverse))}}.space-y-6{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*6*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*6*var(--tw-space-y-reverse))}}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-3{border-style:var(--tw-border-style);border-width:3px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.border-destructive\/50{border-color:color-mix(in srgb,oklch(.6 .2 25) 50%,transparent);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-destructive) 50%,transparent)}}.border-foreground{border-color:var(--color-foreground)}.border-input{border-color:var(--color-input)}.border-transparent{border-color:transparent}.bg-background{background-color:var(--color-background)}.bg-black\/50{background-color:color-mix(in srgb,#000 50%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\/5{background-color:color-mix(in srgb,oklch(.09 0 0) 5%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 5%,transparent)}}.bg-foreground\/10{background-color:color-mix(in srgb,oklch(.09 0 0) 10%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.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)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-4{padding-top:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.text-center{text-align:center}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-background{color:var(--color-background)}.text-current{color:currentcolor}.text-destructive{color:var(--color-destructive)}.text-muted-foreground{color:var(--color-muted-foreground)}.uppercase{text-transform:uppercase}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,rgba(0,0,0,.25))}.shadow-2xl,.shadow-lg{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,rgba(0,0,0,.1)),0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1))}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,rgba(0,0,0,.1)),0 8px 10px -6px var(--tw-shadow-color,rgba(0,0,0,.1))}.ring,.shadow-xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.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-foreground{--tw-ring-color:var(--color-foreground)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm))}.backdrop-blur-sm,.backdrop-filter{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-duration:var(--tw-duration,var(--default-transition-duration));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,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-all{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));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))}.duration-200{--tw-duration:200ms;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.placeholder\:text-muted-foreground{&::-moz-placeholder{color:var(--color-muted-foreground)}&::placeholder{color:var(--color-muted-foreground)}}.hover\:scale-110{&:hover{@media (hover:hover){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.hover\:border-foreground\/50{&:hover{@media (hover:hover){border-bottom-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);border-left-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);border-right-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);border-top-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-foreground) 50%,transparent)}}}}.hover\:bg-destructive\/10{&:hover{@media (hover:hover){background-color:color-mix(in srgb,oklch(.6 .2 25) 10%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}}}.hover\:bg-foreground\/90{&:hover{@media (hover:hover){background-color:color-mix(in srgb,oklch(.09 0 0) 90%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 90%,transparent)}}}}.hover\:bg-muted{&:hover{@media (hover:hover){background-color:var(--color-muted)}}}.focus\:border-transparent{&:focus{border-color:transparent}}.focus\:ring-2{&:focus{--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)}}.focus\:ring-ring{&:focus{--tw-ring-color:var(--color-ring)}}.focus\:ring-offset-2{&:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}}.focus\:outline-none{&:focus{--tw-outline-style:none;outline-style:none}}.active\:scale-95{&:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.disabled\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\:opacity-50{&:disabled{opacity:50%}}}@layer base{#demo-root div,button,input,select,textarea{color:var(--color-foreground)}}[data-theme=dark]{--color-background:oklch(0.09 0 0);--color-foreground:oklch(0.98 0 0);--color-card:oklch(0.09 0 0);--color-card-foreground:oklch(0.98 0 0);--color-popover:oklch(0.09 0 0);--color-popover-foreground:oklch(0.98 0 0);--color-primary:oklch(0.98 0 0);--color-primary-foreground:oklch(0.1 0 0);--color-secondary:oklch(0.16 0 0);--color-secondary-foreground:oklch(0.98 0 0);--color-muted:oklch(0.16 0 0);--color-muted-foreground:oklch(0.64 0 0);--color-accent:oklch(0.16 0 0);--color-accent-foreground:oklch(0.98 0 0);--color-destructive:oklch(0.3 0.2 25);--color-destructive-foreground:oklch(0.98 0 0);--color-border:oklch(0.16 0 0);--color-input:oklch(0.16 0 0);--color-ring:oklch(0.83 0 0)}.uxbert-canvas-overlay{cursor:crosshair;display:none;height:100%;left:0;pointer-events:none;position:fixed;top:0;width:100%;z-index:var(--uxbert-z-canvas)}.uxbert-canvas-overlay.active{display:block;pointer-events:auto}.uxbert-canvas-overlay.viewport-mode{position:fixed}.uxbert-text-input{background:var(--color-background);border:2px solid var(--color-primary);border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.2);color:var(--color-foreground);font-family:Arial,sans-serif;font-size:16px;padding:8px 12px;position:fixed;z-index:calc(var(--uxbert-z-canvas) + 1)}@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-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}@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-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-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}@keyframes spin{to{transform:rotate(1turn)}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--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-tracking: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-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}}}
|
|
1
|
+
/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--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-black:#000;--spacing:0.25rem;--container-xs:20rem;--container-2xl:42rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-lg:1.125rem;--text-lg--line-height:1.55556;--text-xl:1.25rem;--text-xl--line-height:1.4;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:0.025em;--radius-md:0.375rem;--radius-lg:0.5rem;--ease-in-out:cubic-bezier(0.4,0,0.2,1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius:0.5rem;--color-border:oklch(0.9 0 0);--color-input:oklch(0.9 0 0);--color-ring:oklch(0.1 0 0);--color-background:oklch(1 0 0);--color-foreground:oklch(0.09 0 0);--color-primary:oklch(0.1 0 0);--color-muted:oklch(0.96 0 0);--color-muted-foreground:oklch(0.45 0 0);--color-destructive:oklch(0.6 0.2 25);--uxbert-z-canvas:999997;--uxbert-z-button:999998;--uxbert-z-toolbar:999999;--uxbert-z-modal:1000000}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:var(--default-font-feature-settings,normal);-webkit-tap-highlight-color:transparent;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-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}hr{border-top-width:1px;color:inherit;height:0}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,pre,samp{font-feature-settings:var(--default-mono-font-feature-settings,normal);font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{font-feature-settings:inherit;background-color:transparent;border-radius:0;color:inherit;font:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}: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}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){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,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-6{top:calc(var(--spacing)*6)}.right-6{right:calc(var(--spacing)*6)}.bottom-6{bottom:calc(var(--spacing)*6)}.left-6{left:calc(var(--spacing)*6)}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.mx-auto{margin-inline:auto}.mt-3{margin-top:calc(var(--spacing)*3)}.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)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-auto{height:auto}.max-h-72{max-height:calc(var(--spacing)*72)}.max-h-\[90vh\]{max-height:90vh}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[220px\]{max-width:220px}.max-w-xs{max-width:var(--container-xs)}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.-translate-y-1\/2{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.space-y-2{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}}.space-y-5{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*5*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*5*var(--tw-space-y-reverse))}}.space-y-6{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*6*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*6*var(--tw-space-y-reverse))}}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-3{border-style:var(--tw-border-style);border-width:3px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.border-destructive\/50{border-color:color-mix(in srgb,oklch(.6 .2 25) 50%,transparent);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-destructive) 50%,transparent)}}.border-foreground{border-color:var(--color-foreground)}.border-input{border-color:var(--color-input)}.border-transparent{border-color:transparent}.bg-background{background-color:var(--color-background)}.bg-black\/50{background-color:color-mix(in srgb,#000 50%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\/5{background-color:color-mix(in srgb,oklch(.09 0 0) 5%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 5%,transparent)}}.bg-foreground\/10{background-color:color-mix(in srgb,oklch(.09 0 0) 10%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.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)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-4{padding-top:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.text-center{text-align:center}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-background{color:var(--color-background)}.text-current{color:currentcolor}.text-destructive{color:var(--color-destructive)}.text-muted-foreground{color:var(--color-muted-foreground)}.uppercase{text-transform:uppercase}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,rgba(0,0,0,.25))}.shadow-2xl,.shadow-lg{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,rgba(0,0,0,.1)),0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1))}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,rgba(0,0,0,.1)),0 8px 10px -6px var(--tw-shadow-color,rgba(0,0,0,.1))}.ring,.shadow-xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.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-foreground{--tw-ring-color:var(--color-foreground)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm))}.backdrop-blur-sm,.backdrop-filter{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-duration:var(--tw-duration,var(--default-transition-duration));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,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-all{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));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))}.duration-200{--tw-duration:200ms;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.placeholder\:text-muted-foreground{&::-moz-placeholder{color:var(--color-muted-foreground)}&::placeholder{color:var(--color-muted-foreground)}}.hover\:scale-110{&:hover{@media (hover:hover){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.hover\:border-foreground\/50{&:hover{@media (hover:hover){border-bottom-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);border-left-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);border-right-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);border-top-color:color-mix(in srgb,oklch(.09 0 0) 50%,transparent);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-foreground) 50%,transparent)}}}}.hover\:bg-destructive\/10{&:hover{@media (hover:hover){background-color:color-mix(in srgb,oklch(.6 .2 25) 10%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}}}.hover\:bg-foreground\/90{&:hover{@media (hover:hover){background-color:color-mix(in srgb,oklch(.09 0 0) 90%,transparent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 90%,transparent)}}}}.hover\:bg-muted{&:hover{@media (hover:hover){background-color:var(--color-muted)}}}.focus\:border-transparent{&:focus{border-color:transparent}}.focus\:ring-2{&:focus{--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)}}.focus\:ring-ring{&:focus{--tw-ring-color:var(--color-ring)}}.focus\:ring-offset-2{&:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}}.focus\:outline-none{&:focus{--tw-outline-style:none;outline-style:none}}.active\:scale-95{&:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.disabled\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\:opacity-50{&:disabled{opacity:50%}}}@layer base{#demo-root div,button,input,select,textarea{color:var(--color-foreground)}}[data-theme=dark]{--color-background:oklch(0.09 0 0);--color-foreground:oklch(0.98 0 0);--color-card:oklch(0.09 0 0);--color-card-foreground:oklch(0.98 0 0);--color-popover:oklch(0.09 0 0);--color-popover-foreground:oklch(0.98 0 0);--color-primary:oklch(0.98 0 0);--color-primary-foreground:oklch(0.1 0 0);--color-secondary:oklch(0.16 0 0);--color-secondary-foreground:oklch(0.98 0 0);--color-muted:oklch(0.16 0 0);--color-muted-foreground:oklch(0.64 0 0);--color-accent:oklch(0.16 0 0);--color-accent-foreground:oklch(0.98 0 0);--color-destructive:oklch(0.3 0.2 25);--color-destructive-foreground:oklch(0.98 0 0);--color-border:oklch(0.16 0 0);--color-input:oklch(0.16 0 0);--color-ring:oklch(0.83 0 0)}.uxbert-canvas-overlay{cursor:crosshair;display:none;left:0;pointer-events:none;position:absolute;top:0;z-index:var(--uxbert-z-canvas)}.uxbert-canvas-overlay.active{display:block;pointer-events:auto}.uxbert-canvas-overlay.viewport-mode{height:100vh!important;position:fixed;width:100vw!important}.uxbert-text-input{background:var(--color-background);border:2px solid var(--color-primary);border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.2);color:var(--color-foreground);font-family:Arial,sans-serif;font-size:16px;padding:8px 12px;position:absolute;z-index:calc(var(--uxbert-z-canvas) + 1)}@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-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}@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-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-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}@keyframes spin{to{transform:rotate(1turn)}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--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-tracking: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-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}}}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useReducer, useCallback, createContext, useContext, forwardRef, createElement, useState, useRef, useEffect } from 'react';
|
|
1
|
+
import React, { useReducer, useMemo, useCallback, createContext, useContext, forwardRef, createElement, useState, useRef, useEffect } from 'react';
|
|
2
2
|
|
|
3
3
|
class DeviceInfo {
|
|
4
4
|
constructor() {
|
|
@@ -294,29 +294,40 @@ class N8nIntegration {
|
|
|
294
294
|
|
|
295
295
|
class Export {
|
|
296
296
|
constructor(n8nConfig) {
|
|
297
|
-
this.savedIssues =
|
|
297
|
+
this.savedIssues = [];
|
|
298
298
|
this.n8nIntegration = new N8nIntegration(n8nConfig);
|
|
299
|
+
// Defer localStorage access to avoid SSR issues
|
|
300
|
+
if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
|
|
301
|
+
this.savedIssues = this.loadSavedIssues();
|
|
302
|
+
}
|
|
299
303
|
}
|
|
300
304
|
exportToJSON(issueData) {
|
|
301
305
|
const json = JSON.stringify(issueData, null, 2);
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
306
|
+
// Check if we're in a browser environment
|
|
307
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
308
|
+
const blob = new Blob([json], {
|
|
309
|
+
type: 'application/json'
|
|
310
|
+
});
|
|
311
|
+
const url = URL.createObjectURL(blob);
|
|
312
|
+
// Create download link
|
|
313
|
+
const link = document.createElement('a');
|
|
314
|
+
link.href = url;
|
|
315
|
+
link.download = `issue-${Date.now()}.json`;
|
|
316
|
+
document.body.appendChild(link);
|
|
317
|
+
link.click();
|
|
318
|
+
document.body.removeChild(link);
|
|
319
|
+
// Clean up
|
|
320
|
+
URL.revokeObjectURL(url);
|
|
321
|
+
// Save to localStorage
|
|
322
|
+
this.saveIssue(issueData);
|
|
323
|
+
}
|
|
317
324
|
return json;
|
|
318
325
|
}
|
|
319
326
|
saveIssue(issueData) {
|
|
327
|
+
// Check if we're in a browser environment
|
|
328
|
+
if (typeof window === 'undefined' || typeof localStorage === 'undefined') {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
320
331
|
try {
|
|
321
332
|
this.savedIssues.push({
|
|
322
333
|
...issueData,
|
|
@@ -333,6 +344,10 @@ class Export {
|
|
|
333
344
|
}
|
|
334
345
|
}
|
|
335
346
|
loadSavedIssues() {
|
|
347
|
+
// Check if we're in a browser environment
|
|
348
|
+
if (typeof window === 'undefined' || typeof localStorage === 'undefined') {
|
|
349
|
+
return [];
|
|
350
|
+
}
|
|
336
351
|
try {
|
|
337
352
|
const saved = localStorage.getItem('uxbert-saved-issues');
|
|
338
353
|
return saved ? JSON.parse(saved) : [];
|
|
@@ -346,13 +361,23 @@ class Export {
|
|
|
346
361
|
}
|
|
347
362
|
deleteSavedIssue(issueId) {
|
|
348
363
|
this.savedIssues = this.savedIssues.filter(issue => issue.id !== issueId);
|
|
349
|
-
|
|
364
|
+
// Check if we're in a browser environment
|
|
365
|
+
if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
|
|
366
|
+
localStorage.setItem('uxbert-saved-issues', JSON.stringify(this.savedIssues));
|
|
367
|
+
}
|
|
350
368
|
}
|
|
351
369
|
clearSavedIssues() {
|
|
352
370
|
this.savedIssues = [];
|
|
353
|
-
|
|
371
|
+
// Check if we're in a browser environment
|
|
372
|
+
if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
|
|
373
|
+
localStorage.removeItem('uxbert-saved-issues');
|
|
374
|
+
}
|
|
354
375
|
}
|
|
355
376
|
exportAllIssues() {
|
|
377
|
+
// Check if we're in a browser environment
|
|
378
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
356
381
|
const json = JSON.stringify(this.savedIssues, null, 2);
|
|
357
382
|
const blob = new Blob([json], {
|
|
358
383
|
type: 'application/json'
|
|
@@ -9468,6 +9493,11 @@ class Screenshot {
|
|
|
9468
9493
|
}
|
|
9469
9494
|
}
|
|
9470
9495
|
|
|
9496
|
+
var screenshot = /*#__PURE__*/Object.freeze({
|
|
9497
|
+
__proto__: null,
|
|
9498
|
+
default: Screenshot
|
|
9499
|
+
});
|
|
9500
|
+
|
|
9471
9501
|
const initialState = {
|
|
9472
9502
|
isOpen: false,
|
|
9473
9503
|
isAnnotating: false,
|
|
@@ -9575,10 +9605,10 @@ function ReportlyProvider({
|
|
|
9575
9605
|
});
|
|
9576
9606
|
// Annotation manager state - will be set by Reportly component
|
|
9577
9607
|
const [annotationManager, setAnnotationManagerState] = React.useState(null);
|
|
9578
|
-
// Initialize services
|
|
9579
|
-
const deviceInfo = new DeviceInfo();
|
|
9580
|
-
const exportService = new Export(config.integrations?.n8n);
|
|
9581
|
-
const screenshot = new Screenshot();
|
|
9608
|
+
// Initialize services with useMemo to ensure they're only created once and support SSR
|
|
9609
|
+
const deviceInfo = useMemo(() => new DeviceInfo(), []);
|
|
9610
|
+
const exportService = useMemo(() => new Export(config.integrations?.n8n), [config.integrations?.n8n]);
|
|
9611
|
+
const screenshot = useMemo(() => new Screenshot(), []);
|
|
9582
9612
|
const openModal = useCallback(() => {
|
|
9583
9613
|
dispatch({
|
|
9584
9614
|
type: 'OPEN_MODAL'
|
|
@@ -13078,7 +13108,7 @@ function FloatingButton({
|
|
|
13078
13108
|
}) {
|
|
13079
13109
|
const {
|
|
13080
13110
|
state,
|
|
13081
|
-
|
|
13111
|
+
startAnnotation
|
|
13082
13112
|
} = useReportly();
|
|
13083
13113
|
const {
|
|
13084
13114
|
config
|
|
@@ -13097,7 +13127,7 @@ function FloatingButton({
|
|
|
13097
13127
|
style: {
|
|
13098
13128
|
zIndex: "var(--uxbert-z-button)"
|
|
13099
13129
|
},
|
|
13100
|
-
onClick:
|
|
13130
|
+
onClick: startAnnotation,
|
|
13101
13131
|
title: "Report an issue",
|
|
13102
13132
|
"aria-label": "Report an issue"
|
|
13103
13133
|
}, /*#__PURE__*/React.createElement(Bug, {
|
|
@@ -13134,7 +13164,8 @@ function IssueModal({
|
|
|
13134
13164
|
retakeScreenshot,
|
|
13135
13165
|
startAnnotation,
|
|
13136
13166
|
submitIssue,
|
|
13137
|
-
submitToN8n
|
|
13167
|
+
submitToN8n,
|
|
13168
|
+
reset
|
|
13138
13169
|
} = useReportly();
|
|
13139
13170
|
const [formData, setFormData] = useState({
|
|
13140
13171
|
title: "",
|
|
@@ -13151,6 +13182,27 @@ function IssueModal({
|
|
|
13151
13182
|
[field]: value
|
|
13152
13183
|
}));
|
|
13153
13184
|
}, []);
|
|
13185
|
+
const handleClose = useCallback(() => {
|
|
13186
|
+
// Check if there's any data that would be lost
|
|
13187
|
+
const hasData = state.screenshot !== null || formData.title.trim() !== "" || formData.description.trim() !== "";
|
|
13188
|
+
if (hasData) {
|
|
13189
|
+
const confirmed = window.confirm("Are you sure you want to close? All unsaved data (screenshot, title, description) will be lost.");
|
|
13190
|
+
if (confirmed) {
|
|
13191
|
+
// Clear all data
|
|
13192
|
+
reset();
|
|
13193
|
+
setFormData({
|
|
13194
|
+
title: "",
|
|
13195
|
+
description: "",
|
|
13196
|
+
priority: "Medium",
|
|
13197
|
+
deviceType: "desktop"
|
|
13198
|
+
});
|
|
13199
|
+
closeModal();
|
|
13200
|
+
}
|
|
13201
|
+
} else {
|
|
13202
|
+
// No data to lose, just close
|
|
13203
|
+
closeModal();
|
|
13204
|
+
}
|
|
13205
|
+
}, [state.screenshot, formData.title, formData.description, reset, closeModal]);
|
|
13154
13206
|
const handleCapture = useCallback(async () => {
|
|
13155
13207
|
try {
|
|
13156
13208
|
await captureScreenshot(captureMode);
|
|
@@ -13180,6 +13232,7 @@ function IssueModal({
|
|
|
13180
13232
|
try {
|
|
13181
13233
|
setIsSubmitting(true);
|
|
13182
13234
|
submitIssue(formData);
|
|
13235
|
+
// Form data is cleared by the submitIssue function which calls reset()
|
|
13183
13236
|
setFormData({
|
|
13184
13237
|
title: "",
|
|
13185
13238
|
description: "",
|
|
@@ -13249,7 +13302,7 @@ function IssueModal({
|
|
|
13249
13302
|
})), /*#__PURE__*/React.createElement("h2", {
|
|
13250
13303
|
className: "text-xl font-semibold"
|
|
13251
13304
|
}, "Report Issue")), /*#__PURE__*/React.createElement("button", {
|
|
13252
|
-
onClick:
|
|
13305
|
+
onClick: handleClose,
|
|
13253
13306
|
className: "p-2 rounded-md hover:bg-muted transition-colors cursor-pointer",
|
|
13254
13307
|
"aria-label": "Close"
|
|
13255
13308
|
}, /*#__PURE__*/React.createElement(X, {
|
|
@@ -13614,12 +13667,20 @@ class AnnotationManager {
|
|
|
13614
13667
|
this.currentPath = [];
|
|
13615
13668
|
this.textInput = null;
|
|
13616
13669
|
this.currentTextAnnotation = null;
|
|
13670
|
+
this.drawingBounds = null;
|
|
13671
|
+
this.currentMode = 'fullpage';
|
|
13672
|
+
this.scrollListener = null;
|
|
13673
|
+
this.initialScrollPosition = null;
|
|
13617
13674
|
}
|
|
13618
13675
|
createCanvas() {
|
|
13676
|
+
// Calculate page dimensions BEFORE creating canvas
|
|
13677
|
+
const fullPageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
|
|
13678
|
+
const fullPageWidth = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);
|
|
13679
|
+
// Create canvas with calculated dimensions
|
|
13619
13680
|
this.canvas = document.createElement('canvas');
|
|
13620
13681
|
this.canvas.className = 'uxbert-canvas-overlay';
|
|
13621
|
-
|
|
13622
|
-
this.
|
|
13682
|
+
this.canvas.width = fullPageWidth;
|
|
13683
|
+
this.canvas.height = fullPageHeight;
|
|
13623
13684
|
this.ctx = this.canvas.getContext('2d');
|
|
13624
13685
|
if (this.ctx) {
|
|
13625
13686
|
// Set canvas styles
|
|
@@ -13639,6 +13700,8 @@ class AnnotationManager {
|
|
|
13639
13700
|
className: this.canvas.className,
|
|
13640
13701
|
width: this.canvas.width,
|
|
13641
13702
|
height: this.canvas.height,
|
|
13703
|
+
fullPageHeight: fullPageHeight,
|
|
13704
|
+
fullPageWidth: fullPageWidth,
|
|
13642
13705
|
inDOM: document.body.contains(this.canvas)
|
|
13643
13706
|
});
|
|
13644
13707
|
return this.canvas;
|
|
@@ -13657,8 +13720,80 @@ class AnnotationManager {
|
|
|
13657
13720
|
this.canvas.height = fullPageHeight;
|
|
13658
13721
|
}
|
|
13659
13722
|
}
|
|
13723
|
+
updateDrawingBounds(x, y) {
|
|
13724
|
+
if (!this.drawingBounds) {
|
|
13725
|
+
this.drawingBounds = {
|
|
13726
|
+
minX: x,
|
|
13727
|
+
minY: y,
|
|
13728
|
+
maxX: x,
|
|
13729
|
+
maxY: y
|
|
13730
|
+
};
|
|
13731
|
+
} else {
|
|
13732
|
+
this.drawingBounds.minX = Math.min(this.drawingBounds.minX, x);
|
|
13733
|
+
this.drawingBounds.minY = Math.min(this.drawingBounds.minY, y);
|
|
13734
|
+
this.drawingBounds.maxX = Math.max(this.drawingBounds.maxX, x);
|
|
13735
|
+
this.drawingBounds.maxY = Math.max(this.drawingBounds.maxY, y);
|
|
13736
|
+
}
|
|
13737
|
+
}
|
|
13738
|
+
checkAndAdjustCanvasMode() {
|
|
13739
|
+
if (!this.drawingBounds || !this.canvas) return;
|
|
13740
|
+
// Get current viewport bounds (accounting for scroll position)
|
|
13741
|
+
const viewportBounds = {
|
|
13742
|
+
minX: window.scrollX,
|
|
13743
|
+
minY: window.scrollY,
|
|
13744
|
+
maxX: window.scrollX + window.innerWidth,
|
|
13745
|
+
maxY: window.scrollY + window.innerHeight
|
|
13746
|
+
};
|
|
13747
|
+
// Check if all drawings are within viewport
|
|
13748
|
+
const isWithinViewport = this.drawingBounds.minX >= viewportBounds.minX && this.drawingBounds.maxX <= viewportBounds.maxX && this.drawingBounds.minY >= viewportBounds.minY && this.drawingBounds.maxY <= viewportBounds.maxY;
|
|
13749
|
+
// If currently in fullpage mode and drawings are within viewport, switch to viewport mode
|
|
13750
|
+
if (this.currentMode === 'fullpage' && isWithinViewport && this.annotations.length > 0) {
|
|
13751
|
+
console.log('🔄 Switching to viewport mode - all drawings within viewport', {
|
|
13752
|
+
drawingBounds: this.drawingBounds,
|
|
13753
|
+
viewportBounds
|
|
13754
|
+
});
|
|
13755
|
+
this.currentMode = 'viewport';
|
|
13756
|
+
this.updateCanvasSize('viewport');
|
|
13757
|
+
this.canvas.classList.add('viewport-mode');
|
|
13758
|
+
// Reset context properties after resize
|
|
13759
|
+
if (this.ctx) {
|
|
13760
|
+
this.ctx.lineCap = 'round';
|
|
13761
|
+
this.ctx.lineJoin = 'round';
|
|
13762
|
+
}
|
|
13763
|
+
this.redraw();
|
|
13764
|
+
}
|
|
13765
|
+
// If currently in viewport mode but drawings extend beyond, switch to fullpage mode
|
|
13766
|
+
else if (this.currentMode === 'viewport' && !isWithinViewport) {
|
|
13767
|
+
console.log('🔄 Switching to fullpage mode - drawings extend beyond viewport', {
|
|
13768
|
+
drawingBounds: this.drawingBounds,
|
|
13769
|
+
viewportBounds
|
|
13770
|
+
});
|
|
13771
|
+
this.currentMode = 'fullpage';
|
|
13772
|
+
this.updateCanvasSize('fullpage');
|
|
13773
|
+
this.canvas.classList.remove('viewport-mode');
|
|
13774
|
+
// Reset context properties after resize
|
|
13775
|
+
if (this.ctx) {
|
|
13776
|
+
this.ctx.lineCap = 'round';
|
|
13777
|
+
this.ctx.lineJoin = 'round';
|
|
13778
|
+
}
|
|
13779
|
+
this.redraw();
|
|
13780
|
+
}
|
|
13781
|
+
}
|
|
13660
13782
|
show(mode = 'fullpage') {
|
|
13661
13783
|
if (this.canvas && this.ctx) {
|
|
13784
|
+
// Set the current mode and reset drawing bounds for new annotation session
|
|
13785
|
+
this.currentMode = mode;
|
|
13786
|
+
this.drawingBounds = null;
|
|
13787
|
+
// Store initial scroll position
|
|
13788
|
+
this.initialScrollPosition = {
|
|
13789
|
+
x: window.scrollX,
|
|
13790
|
+
y: window.scrollY
|
|
13791
|
+
};
|
|
13792
|
+
// Add scroll listener to detect scrolling
|
|
13793
|
+
this.scrollListener = this.handleScroll.bind(this);
|
|
13794
|
+
window.addEventListener('scroll', this.scrollListener, {
|
|
13795
|
+
passive: true
|
|
13796
|
+
});
|
|
13662
13797
|
// Update canvas size to match current page dimensions
|
|
13663
13798
|
this.updateCanvasSize(mode);
|
|
13664
13799
|
// Reset context properties after resize
|
|
@@ -13685,11 +13820,51 @@ class AnnotationManager {
|
|
|
13685
13820
|
this.redraw();
|
|
13686
13821
|
}
|
|
13687
13822
|
}
|
|
13823
|
+
handleScroll() {
|
|
13824
|
+
if (!this.initialScrollPosition) return;
|
|
13825
|
+
// Check if user has scrolled significantly (more than 10 pixels)
|
|
13826
|
+
const scrollThreshold = 10;
|
|
13827
|
+
const scrollDeltaX = Math.abs(window.scrollX - this.initialScrollPosition.x);
|
|
13828
|
+
const scrollDeltaY = Math.abs(window.scrollY - this.initialScrollPosition.y);
|
|
13829
|
+
if (scrollDeltaX > scrollThreshold || scrollDeltaY > scrollThreshold) {
|
|
13830
|
+
// User scrolled - switch to fullpage mode if not already
|
|
13831
|
+
if (this.currentMode === 'viewport') {
|
|
13832
|
+
console.log('📜 User scrolled - switching to fullpage mode', {
|
|
13833
|
+
scrollDelta: {
|
|
13834
|
+
x: scrollDeltaX,
|
|
13835
|
+
y: scrollDeltaY
|
|
13836
|
+
},
|
|
13837
|
+
initialScroll: this.initialScrollPosition,
|
|
13838
|
+
currentScroll: {
|
|
13839
|
+
x: window.scrollX,
|
|
13840
|
+
y: window.scrollY
|
|
13841
|
+
}
|
|
13842
|
+
});
|
|
13843
|
+
this.currentMode = 'fullpage';
|
|
13844
|
+
this.updateCanvasSize('fullpage');
|
|
13845
|
+
if (this.canvas) {
|
|
13846
|
+
this.canvas.classList.remove('viewport-mode');
|
|
13847
|
+
}
|
|
13848
|
+
// Reset context properties after resize
|
|
13849
|
+
if (this.ctx) {
|
|
13850
|
+
this.ctx.lineCap = 'round';
|
|
13851
|
+
this.ctx.lineJoin = 'round';
|
|
13852
|
+
}
|
|
13853
|
+
this.redraw();
|
|
13854
|
+
}
|
|
13855
|
+
}
|
|
13856
|
+
}
|
|
13688
13857
|
hide() {
|
|
13689
13858
|
if (this.canvas) {
|
|
13690
13859
|
this.canvas.classList.remove('active');
|
|
13691
13860
|
this.canvas.classList.remove('viewport-mode');
|
|
13692
13861
|
}
|
|
13862
|
+
// Remove scroll listener
|
|
13863
|
+
if (this.scrollListener) {
|
|
13864
|
+
window.removeEventListener('scroll', this.scrollListener);
|
|
13865
|
+
this.scrollListener = null;
|
|
13866
|
+
}
|
|
13867
|
+
this.initialScrollPosition = null;
|
|
13693
13868
|
// Clean up any active text input
|
|
13694
13869
|
this.removeTextInput();
|
|
13695
13870
|
this.currentTextAnnotation = null;
|
|
@@ -13702,12 +13877,16 @@ class AnnotationManager {
|
|
|
13702
13877
|
}
|
|
13703
13878
|
handleMouseDown(e) {
|
|
13704
13879
|
const isViewportMode = this.canvas?.classList.contains('viewport-mode');
|
|
13880
|
+
// For fullpage mode (absolute positioning), we need to add scroll offset
|
|
13881
|
+
// For viewport mode (fixed positioning), we don't need scroll offset
|
|
13705
13882
|
const scrollOffsetX = isViewportMode ? 0 : window.scrollX;
|
|
13706
13883
|
const scrollOffsetY = isViewportMode ? 0 : window.scrollY;
|
|
13707
13884
|
// Handle text tool separately
|
|
13708
13885
|
if (this.currentTool === 'text') {
|
|
13709
13886
|
const x = e.clientX + scrollOffsetX;
|
|
13710
13887
|
const y = e.clientY + scrollOffsetY;
|
|
13888
|
+
// Update drawing bounds for text
|
|
13889
|
+
this.updateDrawingBounds(x, y);
|
|
13711
13890
|
// Check if clicking on existing text to edit
|
|
13712
13891
|
const clickedText = this.getTextAnnotationAt(x, y);
|
|
13713
13892
|
if (clickedText) {
|
|
@@ -13725,6 +13904,8 @@ class AnnotationManager {
|
|
|
13725
13904
|
x: this.startX,
|
|
13726
13905
|
y: this.startY
|
|
13727
13906
|
}];
|
|
13907
|
+
// Update drawing bounds with start position
|
|
13908
|
+
this.updateDrawingBounds(this.startX, this.startY);
|
|
13728
13909
|
}
|
|
13729
13910
|
handleMouseMove(e) {
|
|
13730
13911
|
if (!this.isDrawing || !this.ctx) return;
|
|
@@ -13733,6 +13914,8 @@ class AnnotationManager {
|
|
|
13733
13914
|
const scrollOffsetY = isViewportMode ? 0 : window.scrollY;
|
|
13734
13915
|
const x = e.clientX + scrollOffsetX;
|
|
13735
13916
|
const y = e.clientY + scrollOffsetY;
|
|
13917
|
+
// Update drawing bounds with current position
|
|
13918
|
+
this.updateDrawingBounds(x, y);
|
|
13736
13919
|
if (this.currentTool === 'pen') {
|
|
13737
13920
|
this.currentPath.push({
|
|
13738
13921
|
x,
|
|
@@ -13757,6 +13940,8 @@ class AnnotationManager {
|
|
|
13757
13940
|
const scrollOffsetY = isViewportMode ? 0 : window.scrollY;
|
|
13758
13941
|
const x = e.clientX + scrollOffsetX;
|
|
13759
13942
|
const y = e.clientY + scrollOffsetY;
|
|
13943
|
+
// Update drawing bounds with final position
|
|
13944
|
+
this.updateDrawingBounds(x, y);
|
|
13760
13945
|
// Save the annotation
|
|
13761
13946
|
if (this.currentTool === 'pen') {
|
|
13762
13947
|
this.annotations.push({
|
|
@@ -13784,6 +13969,8 @@ class AnnotationManager {
|
|
|
13784
13969
|
color: this.currentColor
|
|
13785
13970
|
});
|
|
13786
13971
|
}
|
|
13972
|
+
// Check if we need to adjust canvas mode based on drawing location
|
|
13973
|
+
this.checkAndAdjustCanvasMode();
|
|
13787
13974
|
this.redraw();
|
|
13788
13975
|
}
|
|
13789
13976
|
handleTouchStart(e) {
|
|
@@ -13854,8 +14041,7 @@ class AnnotationManager {
|
|
|
13854
14041
|
this.textInput = document.createElement('input');
|
|
13855
14042
|
this.textInput.type = 'text';
|
|
13856
14043
|
this.textInput.className = 'uxbert-text-input';
|
|
13857
|
-
|
|
13858
|
-
// Position relative to the document, accounting for scroll
|
|
14044
|
+
// Position relative to the document (absolute positioning)
|
|
13859
14045
|
this.textInput.style.left = `${x}px`;
|
|
13860
14046
|
this.textInput.style.top = `${y}px`;
|
|
13861
14047
|
this.textInput.style.transform = 'translate(0, 0)';
|
|
@@ -13919,6 +14105,8 @@ class AnnotationManager {
|
|
|
13919
14105
|
if (text) {
|
|
13920
14106
|
this.currentTextAnnotation.text = text;
|
|
13921
14107
|
this.annotations.push(this.currentTextAnnotation);
|
|
14108
|
+
// Check if we need to adjust canvas mode based on drawing location
|
|
14109
|
+
this.checkAndAdjustCanvasMode();
|
|
13922
14110
|
this.redraw();
|
|
13923
14111
|
}
|
|
13924
14112
|
}
|
|
@@ -13999,9 +14187,13 @@ class AnnotationManager {
|
|
|
13999
14187
|
}
|
|
14000
14188
|
clear() {
|
|
14001
14189
|
this.annotations = [];
|
|
14190
|
+
this.drawingBounds = null;
|
|
14002
14191
|
this.redraw();
|
|
14003
14192
|
}
|
|
14004
|
-
|
|
14193
|
+
getCurrentMode() {
|
|
14194
|
+
return this.currentMode;
|
|
14195
|
+
}
|
|
14196
|
+
async exportAnnotatedScreenshot(baseScreenshot, mode) {
|
|
14005
14197
|
// Create a temporary canvas to combine screenshot + annotations
|
|
14006
14198
|
const tempCanvas = document.createElement('canvas');
|
|
14007
14199
|
const img = new Image();
|
|
@@ -14015,8 +14207,29 @@ class AnnotationManager {
|
|
|
14015
14207
|
if (tempCtx && this.canvas) {
|
|
14016
14208
|
// Draw the base screenshot
|
|
14017
14209
|
tempCtx.drawImage(img, 0, 0);
|
|
14018
|
-
//
|
|
14019
|
-
|
|
14210
|
+
// If mode is specified and different from current canvas mode, we need to adjust
|
|
14211
|
+
const isCanvasInViewportMode = this.canvas.classList.contains('viewport-mode');
|
|
14212
|
+
const isTargetFullpage = mode === 'fullpage';
|
|
14213
|
+
if (isCanvasInViewportMode && isTargetFullpage) {
|
|
14214
|
+
// User drew in viewport mode, but we're capturing fullpage
|
|
14215
|
+
// Need to offset annotations by current scroll position
|
|
14216
|
+
const scrollOffsetX = window.scrollX;
|
|
14217
|
+
const scrollOffsetY = window.scrollY;
|
|
14218
|
+
// Create a temporary canvas for adjusted annotations
|
|
14219
|
+
const adjustedCanvas = document.createElement('canvas');
|
|
14220
|
+
adjustedCanvas.width = tempCanvas.width;
|
|
14221
|
+
adjustedCanvas.height = tempCanvas.height;
|
|
14222
|
+
const adjustedCtx = adjustedCanvas.getContext('2d');
|
|
14223
|
+
if (adjustedCtx) {
|
|
14224
|
+
// Draw annotations with scroll offset
|
|
14225
|
+
adjustedCtx.drawImage(this.canvas, scrollOffsetX, scrollOffsetY);
|
|
14226
|
+
// Draw the adjusted annotations on top of screenshot
|
|
14227
|
+
tempCtx.drawImage(adjustedCanvas, 0, 0);
|
|
14228
|
+
}
|
|
14229
|
+
} else {
|
|
14230
|
+
// Draw annotations directly on top
|
|
14231
|
+
tempCtx.drawImage(this.canvas, 0, 0);
|
|
14232
|
+
}
|
|
14020
14233
|
resolve(tempCanvas.toDataURL('image/png'));
|
|
14021
14234
|
}
|
|
14022
14235
|
};
|
|
@@ -14062,14 +14275,15 @@ function ReportlyInner() {
|
|
|
14062
14275
|
useEffect(() => {
|
|
14063
14276
|
if (annotationRef.current) {
|
|
14064
14277
|
if (state.isAnnotating) {
|
|
14065
|
-
|
|
14066
|
-
|
|
14278
|
+
// Start in fullpage mode - it will auto-switch to viewport if drawings stay within viewport
|
|
14279
|
+
console.log('Showing canvas in fullpage mode (will auto-adjust based on drawing location)');
|
|
14280
|
+
annotationRef.current.show('fullpage');
|
|
14067
14281
|
} else {
|
|
14068
14282
|
console.log('Hiding canvas');
|
|
14069
14283
|
annotationRef.current.hide();
|
|
14070
14284
|
}
|
|
14071
14285
|
}
|
|
14072
|
-
}, [state.isAnnotating
|
|
14286
|
+
}, [state.isAnnotating]);
|
|
14073
14287
|
const handleUndo = () => {
|
|
14074
14288
|
annotationRef.current?.undo();
|
|
14075
14289
|
};
|
|
@@ -14077,14 +14291,31 @@ function ReportlyInner() {
|
|
|
14077
14291
|
annotationRef.current?.clear();
|
|
14078
14292
|
};
|
|
14079
14293
|
const handleDone = async () => {
|
|
14080
|
-
if (!annotationRef.current
|
|
14294
|
+
if (!annotationRef.current) return;
|
|
14081
14295
|
try {
|
|
14082
|
-
const
|
|
14296
|
+
const Screenshot = (await Promise.resolve().then(function () { return screenshot; })).default;
|
|
14297
|
+
// Use the current mode from annotation manager (it has auto-adjusted based on drawing location)
|
|
14298
|
+
const captureMode = annotationRef.current.getCurrentMode();
|
|
14299
|
+
console.log('Using capture mode from annotation manager:', captureMode);
|
|
14300
|
+
// Hide the annotation canvas temporarily
|
|
14301
|
+
annotationRef.current.hide();
|
|
14302
|
+
// Capture the screenshot
|
|
14303
|
+
const screenshotService = new Screenshot();
|
|
14304
|
+
const baseScreenshot = await screenshotService.capture(captureMode);
|
|
14305
|
+
// Export the annotated screenshot (combine base screenshot + annotations)
|
|
14306
|
+
// Pass the capture mode so annotations can be positioned correctly
|
|
14307
|
+
const annotatedScreenshot = await annotationRef.current.exportAnnotatedScreenshot(baseScreenshot, captureMode);
|
|
14308
|
+
// Update the screenshot in state
|
|
14083
14309
|
updateScreenshot(annotatedScreenshot);
|
|
14310
|
+
// End annotation mode and show the modal
|
|
14084
14311
|
endAnnotation();
|
|
14085
14312
|
} catch (error) {
|
|
14086
14313
|
console.error('Failed to finish annotation:', error);
|
|
14087
|
-
alert('Failed to
|
|
14314
|
+
alert('Failed to capture screenshot. Please try again.');
|
|
14315
|
+
// Show canvas again in case of error
|
|
14316
|
+
if (annotationRef.current) {
|
|
14317
|
+
annotationRef.current.show('fullpage'); // Default back to fullpage mode on error
|
|
14318
|
+
}
|
|
14088
14319
|
}
|
|
14089
14320
|
};
|
|
14090
14321
|
const handleExit = () => {
|