freebrowse 2.5.0-next.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 +134 -0
- package/dist-lib/index.js +21492 -0
- package/dist-lib/index.js.map +1 -0
- package/dist-lib/react.js +10790 -0
- package/dist-lib/react.js.map +1 -0
- package/dist-lib/style.css +1 -0
- package/dist-lib/types/components/canvas-area.d.ts +10 -0
- package/dist-lib/types/components/dialogs/imaging-upload-confirmation-dialog.d.ts +6 -0
- package/dist-lib/types/components/dialogs/remove-dialog.d.ts +6 -0
- package/dist-lib/types/components/dialogs/save-dialog.d.ts +14 -0
- package/dist-lib/types/components/dialogs/session-delete-confirmation-dialog.d.ts +6 -0
- package/dist-lib/types/components/dialogs/settings-dialog.d.ts +6 -0
- package/dist-lib/types/components/drag-mode-selector.d.ts +9 -0
- package/dist-lib/types/components/file-list.d.ts +12 -0
- package/dist-lib/types/components/footer.d.ts +1 -0
- package/dist-lib/types/components/freebrowse.d.ts +32 -0
- package/dist-lib/types/components/header.d.ts +6 -0
- package/dist-lib/types/components/image-canvas.d.ts +7 -0
- package/dist-lib/types/components/image-uploader.d.ts +6 -0
- package/dist-lib/types/components/sidebar.d.ts +56 -0
- package/dist-lib/types/components/tabs/ai-annotation-tab.d.ts +20 -0
- package/dist-lib/types/components/tabs/data-tab.d.ts +6 -0
- package/dist-lib/types/components/tabs/drawing-tab.d.ts +17 -0
- package/dist-lib/types/components/tabs/nvd-tab.d.ts +6 -0
- package/dist-lib/types/components/tabs/scene-details-tab.d.ts +22 -0
- package/dist-lib/types/components/tabs/surface-details-tab.d.ts +20 -0
- package/dist-lib/types/components/ui/button.d.ts +10 -0
- package/dist-lib/types/components/ui/checkbox.d.ts +4 -0
- package/dist-lib/types/components/ui/dialog.d.ts +15 -0
- package/dist-lib/types/components/ui/input.d.ts +5 -0
- package/dist-lib/types/components/ui/label.d.ts +4 -0
- package/dist-lib/types/components/ui/labeled-slider-with-input.d.ts +14 -0
- package/dist-lib/types/components/ui/radio-group.d.ts +5 -0
- package/dist-lib/types/components/ui/scroll-area.d.ts +5 -0
- package/dist-lib/types/components/ui/select.d.ts +5 -0
- package/dist-lib/types/components/ui/slider.d.ts +4 -0
- package/dist-lib/types/components/ui/tabs.d.ts +7 -0
- package/dist-lib/types/components/ui/toggle-group.d.ts +7 -0
- package/dist-lib/types/components/ui/toggle.d.ts +9 -0
- package/dist-lib/types/components/view-selector.d.ts +7 -0
- package/dist-lib/types/components/viewer-shell.d.ts +13 -0
- package/dist-lib/types/hooks/use-ai-capabilities.d.ts +1 -0
- package/dist-lib/types/hooks/use-ai-session.d.ts +9 -0
- package/dist-lib/types/hooks/use-drawing.d.ts +27 -0
- package/dist-lib/types/hooks/use-file-loading.d.ts +15 -0
- package/dist-lib/types/hooks/use-magic-wand.d.ts +15 -0
- package/dist-lib/types/hooks/use-mesh-layers.d.ts +21 -0
- package/dist-lib/types/hooks/use-save.d.ts +12 -0
- package/dist-lib/types/hooks/use-surfaces.d.ts +16 -0
- package/dist-lib/types/hooks/use-viewer-options.d.ts +42 -0
- package/dist-lib/types/hooks/use-volumes.d.ts +39 -0
- package/dist-lib/types/lib/confirmations.d.ts +4 -0
- package/dist-lib/types/lib/default-niivue-options.d.ts +16 -0
- package/dist-lib/types/lib/deployment-config.d.ts +66 -0
- package/dist-lib/types/lib/niivue-helpers.d.ts +27 -0
- package/dist-lib/types/lib/nvd-volume-urls.d.ts +26 -0
- package/dist-lib/types/lib/random-session-name.d.ts +1 -0
- package/dist-lib/types/lib/utils.d.ts +2 -0
- package/dist-lib/types/lib.d.ts +16 -0
- package/dist-lib/types/mount.d.ts +49 -0
- package/dist-lib/types/react.d.ts +10 -0
- package/dist-lib/types/store/ai-slice.d.ts +25 -0
- package/dist-lib/types/store/drawing-slice.d.ts +7 -0
- package/dist-lib/types/store/index.d.ts +21 -0
- package/dist-lib/types/store/location-slice.d.ts +7 -0
- package/dist-lib/types/store/niivue-store-sync.d.ts +41 -0
- package/dist-lib/types/store/niivue-sync.d.ts +57 -0
- package/dist-lib/types/store/save-slice.d.ts +9 -0
- package/dist-lib/types/store/surface-slice.d.ts +15 -0
- package/dist-lib/types/store/types.d.ts +69 -0
- package/dist-lib/types/store/viewer-slice.d.ts +31 -0
- package/dist-lib/types/store/volume-slice.d.ts +13 -0
- package/package.json +130 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */@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-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-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-blue-100:oklch(93.2% .032 255.585);--color-blue-600:oklch(54.6% .245 262.881);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1)}}@layer base,components,utilities;.pointer-events-none{pointer-events:none!important}.visible{visibility:visible!important}.sr-only{clip-path:inset(50%)!important;white-space:nowrap!important;border-width:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}.absolute{position:absolute!important}.relative{position:relative!important}.inset-0{inset:calc(var(--spacing)*0)!important}.top-0{top:calc(var(--spacing)*0)!important}.top-1\/2{top:50%!important}.top-2{top:calc(var(--spacing)*2)!important}.top-4{top:calc(var(--spacing)*4)!important}.right-4{right:calc(var(--spacing)*4)!important}.left-0{left:calc(var(--spacing)*0)!important}.left-1\/2{left:50%!important}.left-2{left:calc(var(--spacing)*2)!important}.z-50{z-index:50!important}.container{width:100%!important}@media (min-width:40rem){.container{max-width:40rem!important}}@media (min-width:48rem){.container{max-width:48rem!important}}@media (min-width:64rem){.container{max-width:64rem!important}}@media (min-width:80rem){.container{max-width:80rem!important}}@media (min-width:96rem){.container{max-width:96rem!important}}.mx-4{margin-inline:calc(var(--spacing)*4)!important}.mx-auto{margin-inline:auto!important}.-mt-2{margin-top:calc(var(--spacing)*-2)!important}.mt-1{margin-top:calc(var(--spacing)*1)!important}.mt-2{margin-top:calc(var(--spacing)*2)!important}.mt-3{margin-top:calc(var(--spacing)*3)!important}.mt-4{margin-top:calc(var(--spacing)*4)!important}.mt-6{margin-top:calc(var(--spacing)*6)!important}.mr-1{margin-right:calc(var(--spacing)*1)!important}.mr-2{margin-right:calc(var(--spacing)*2)!important}.mb-2{margin-bottom:calc(var(--spacing)*2)!important}.mb-4{margin-bottom:calc(var(--spacing)*4)!important}.block{display:block!important}.contents{display:contents!important}.flex{display:flex!important}.grid{display:grid!important}.hidden{display:none!important}.inline{display:inline!important}.inline-block{display:inline-block!important}.inline-flex{display:inline-flex!important}.aspect-square{aspect-ratio:1!important}.size-2{width:calc(var(--spacing)*2)!important;height:calc(var(--spacing)*2)!important}.size-3\.5{width:calc(var(--spacing)*3.5)!important;height:calc(var(--spacing)*3.5)!important}.size-4{width:calc(var(--spacing)*4)!important;height:calc(var(--spacing)*4)!important}.size-9{width:calc(var(--spacing)*9)!important;height:calc(var(--spacing)*9)!important}.size-full{width:100%!important;height:100%!important}.h-2\.5{height:calc(var(--spacing)*2.5)!important}.h-3{height:calc(var(--spacing)*3)!important}.h-4{height:calc(var(--spacing)*4)!important}.h-6{height:calc(var(--spacing)*6)!important}.h-8{height:calc(var(--spacing)*8)!important}.h-9{height:calc(var(--spacing)*9)!important}.h-10{height:calc(var(--spacing)*10)!important}.h-12{height:calc(var(--spacing)*12)!important}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)!important}.h-full{height:100%!important}.max-h-48{max-height:calc(var(--spacing)*48)!important}.max-h-\[50\%\]{max-height:50%!important}.min-h-0{min-height:calc(var(--spacing)*0)!important}.w-0{width:calc(var(--spacing)*0)!important}.w-2\.5{width:calc(var(--spacing)*2.5)!important}.w-3{width:calc(var(--spacing)*3)!important}.w-4{width:calc(var(--spacing)*4)!important}.w-6{width:calc(var(--spacing)*6)!important}.w-8{width:calc(var(--spacing)*8)!important}.w-10{width:calc(var(--spacing)*10)!important}.w-16{width:calc(var(--spacing)*16)!important}.w-20{width:calc(var(--spacing)*20)!important}.w-80{width:calc(var(--spacing)*80)!important}.w-fit{width:fit-content!important}.w-full{width:100%!important}.max-w-2xl{max-width:var(--container-2xl)!important}.max-w-lg{max-width:var(--container-lg)!important}.max-w-xl{max-width:var(--container-xl)!important}.min-w-0{min-width:calc(var(--spacing)*0)!important}.min-w-8{min-width:calc(var(--spacing)*8)!important}.min-w-9{min-width:calc(var(--spacing)*9)!important}.min-w-10{min-width:calc(var(--spacing)*10)!important}.flex-1{flex:1!important}.flex-shrink-0,.shrink-0{flex-shrink:0!important}.grow{flex-grow:1!important}.-translate-x-1\/2{--tw-translate-x: -50% !important;translate:var(--tw-translate-x)var(--tw-translate-y)!important}.-translate-y-1\/2{--tw-translate-y: -50% !important;translate:var(--tw-translate-x)var(--tw-translate-y)!important}.rotate-180{rotate:180deg!important}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)!important}.cursor-pointer{cursor:pointer!important}.touch-none{touch-action:none!important}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.grid-cols-\[50\%_auto_1fr\]{grid-template-columns:50% auto 1fr!important}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))!important}.flex-col{flex-direction:column!important}.flex-col-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.items-center{align-items:center!important}.justify-between{justify-content:space-between!important}.justify-center{justify-content:center!important}.justify-start{justify-content:flex-start!important}.gap-1{gap:calc(var(--spacing)*1)!important}.gap-1\.5{gap:calc(var(--spacing)*1.5)!important}.gap-2{gap:calc(var(--spacing)*2)!important}.gap-3{gap:calc(var(--spacing)*3)!important}.gap-4{gap:calc(var(--spacing)*4)!important}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0!important;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))!important}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0!important;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))!important}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0!important;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))!important}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0!important;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))!important}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0!important;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))!important}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0!important;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))!important}.gap-x-8{column-gap:calc(var(--spacing)*8)!important}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0!important;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse))!important;margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))!important}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0!important;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse))!important;margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))!important}.gap-y-6{row-gap:calc(var(--spacing)*6)!important}.truncate{text-overflow:ellipsis!important;white-space:nowrap!important;overflow:hidden!important}.overflow-hidden{overflow:hidden!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.rounded{border-radius:.25rem!important}.rounded-\[4px\]{border-radius:4px!important}.rounded-\[inherit\]{border-radius:inherit!important}.rounded-full{border-radius:3.40282e38px!important}.rounded-lg{border-radius:var(--radius)!important}.rounded-md{border-radius:calc(var(--radius) - 2px)!important}.rounded-none{border-radius:0!important}.rounded-sm{border-radius:calc(var(--radius) - 4px)!important}.border{border-style:var(--tw-border-style)!important;border-width:1px!important}.border-2{border-style:var(--tw-border-style)!important;border-width:2px!important}.border-t{border-top-style:var(--tw-border-style)!important;border-top-width:1px!important}.border-b{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:1px!important}.border-l{border-left-style:var(--tw-border-style)!important;border-left-width:1px!important}.border-dashed{--tw-border-style:dashed!important;border-style:dashed!important}.border-border{border-color:var(--border)!important}.border-input{border-color:var(--input)!important}.border-muted-foreground\/25{border-color:var(--muted-foreground)!important}@supports (color:color-mix(in lab,red,red)){.border-muted-foreground\/25{border-color:color-mix(in oklab,var(--muted-foreground)25%,transparent)!important}}.border-primary,.border-primary\/30{border-color:var(--primary)!important}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,var(--primary)30%,transparent)!important}}.border-transparent{border-color:#0000!important}.border-t-transparent{border-top-color:#0000!important}.border-l-transparent{border-left-color:#0000!important}.bg-\[\#111\]{background-color:#111!important}.bg-accent{background-color:var(--accent)!important}.bg-background{background-color:var(--background)!important}.bg-black\/20{background-color:#0003!important}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)!important}}.bg-black\/50{background-color:#00000080!important}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)!important}}.bg-border{background-color:var(--border)!important}.bg-destructive{background-color:var(--destructive)!important}.bg-muted{background-color:var(--muted)!important}.bg-primary,.bg-primary\/5{background-color:var(--primary)!important}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--primary)5%,transparent)!important}}.bg-secondary{background-color:var(--secondary)!important}.bg-transparent{background-color:#0000!important}.fill-primary{fill:var(--primary)!important}.p-0{padding:calc(var(--spacing)*0)!important}.p-2{padding:calc(var(--spacing)*2)!important}.p-3{padding:calc(var(--spacing)*3)!important}.p-4{padding:calc(var(--spacing)*4)!important}.p-6{padding:calc(var(--spacing)*6)!important}.p-12{padding:calc(var(--spacing)*12)!important}.p-\[3px\]{padding:3px!important}.p-px{padding:1px!important}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)!important}.px-2{padding-inline:calc(var(--spacing)*2)!important}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)!important}.px-3{padding-inline:calc(var(--spacing)*3)!important}.px-4{padding-inline:calc(var(--spacing)*4)!important}.px-6{padding-inline:calc(var(--spacing)*6)!important}.py-0\.5{padding-block:calc(var(--spacing)*.5)!important}.py-1{padding-block:calc(var(--spacing)*1)!important}.py-2{padding-block:calc(var(--spacing)*2)!important}.py-3{padding-block:calc(var(--spacing)*3)!important}.py-4{padding-block:calc(var(--spacing)*4)!important}.pt-4{padding-top:calc(var(--spacing)*4)!important}.pb-6{padding-bottom:calc(var(--spacing)*6)!important}.text-center{text-align:center!important}.font-mono{font-family:var(--font-mono)!important}.text-lg{font-size:var(--text-lg)!important;line-height:var(--tw-leading,var(--text-lg--line-height))!important}.text-sm{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.text-xl{font-size:var(--text-xl)!important;line-height:var(--tw-leading,var(--text-xl--line-height))!important}.text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.leading-none{--tw-leading:1!important;line-height:1!important}.font-medium{--tw-font-weight:var(--font-weight-medium)!important;font-weight:var(--font-weight-medium)!important}.font-normal{--tw-font-weight:var(--font-weight-normal)!important;font-weight:var(--font-weight-normal)!important}.font-semibold{--tw-font-weight:var(--font-weight-semibold)!important;font-weight:var(--font-weight-semibold)!important}.tracking-tight{--tw-tracking:var(--tracking-tight)!important;letter-spacing:var(--tracking-tight)!important}.tracking-wide{--tw-tracking:var(--tracking-wide)!important;letter-spacing:var(--tracking-wide)!important}.break-words{overflow-wrap:break-word!important}.whitespace-nowrap{white-space:nowrap!important}.text-current{color:currentColor!important}.text-destructive{color:var(--destructive)!important}.text-foreground{color:var(--foreground)!important}.text-muted-foreground{color:var(--muted-foreground)!important}.text-primary{color:var(--primary)!important}.text-primary-foreground{color:var(--primary-foreground)!important}.text-secondary-foreground{color:var(--secondary-foreground)!important}.text-white{color:var(--color-white)!important}.uppercase{text-transform:uppercase!important}.underline-offset-4{text-underline-offset:4px!important}.opacity-50{opacity:.5!important}.opacity-70{opacity:.7!important}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-none{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.ring-ring\/50{--tw-ring-color:var(--ring)!important}@supports (color:color-mix(in lab,red,red)){.ring-ring\/50{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)!important}}.ring-offset-background{--tw-ring-offset-color:var(--background)!important}.outline{outline-style:var(--tw-outline-style)!important;outline-width:1px!important}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-all{transition-property:all!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-opacity{transition-property:opacity!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-shadow{transition-property:box-shadow!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-none{transition-property:none!important}.fade-in-0{--tw-enter-opacity:0!important}.outline-none{--tw-outline-style:none!important;outline-style:none!important}.select-none{-webkit-user-select:none!important;user-select:none!important}.zoom-in-95{--tw-enter-scale:.95!important}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none!important}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5!important}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed!important}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5!important}.file\:border-0::file-selector-button{border-style:var(--tw-border-style)!important;border-width:0!important}.file\:bg-transparent::file-selector-button{background-color:#0000!important}.file\:text-sm::file-selector-button{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium)!important;font-weight:var(--font-weight-medium)!important}.file\:text-foreground::file-selector-button{color:var(--foreground)!important}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)!important}.first\:rounded-l-md:first-child{border-top-left-radius:calc(var(--radius) - 2px)!important;border-bottom-left-radius:calc(var(--radius) - 2px)!important}.last\:rounded-r-md:last-child{border-top-right-radius:calc(var(--radius) - 2px)!important;border-bottom-right-radius:calc(var(--radius) - 2px)!important}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)!important}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)!important}.hover\:bg-destructive:hover,.hover\:bg-destructive\/90:hover{background-color:var(--destructive)!important}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)!important}}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--muted)!important}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted)50%,transparent)!important}}.hover\:bg-primary\/90:hover{background-color:var(--primary)!important}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)!important}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)!important}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)!important}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)!important}.hover\:text-blue-600:hover{color:var(--color-blue-600)!important}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)!important}.hover\:underline:hover{text-decoration-line:underline!important}.hover\:opacity-100:hover{opacity:1!important}.hover\:ring-4:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}}.focus\:z-10:focus{z-index:10!important}.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)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)!important}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px!important;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)!important}.focus\:outline-none:focus{--tw-outline-style:none!important;outline-style:none!important}.focus-visible\:z-10:focus-visible{z-index:10!important}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)!important}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)!important}@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)!important}}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)!important}@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)!important}}.focus-visible\:outline-hidden:focus-visible{--tw-outline-style:none!important;outline-style:none!important}@media (forced-colors:active){.focus-visible\:outline-hidden:focus-visible{outline-offset:2px!important;outline:2px solid #0000!important}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style)!important;outline-width:1px!important}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)!important}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none!important;outline-style:none!important}.disabled\:pointer-events-none:disabled{pointer-events:none!important}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.disabled\:opacity-50:disabled{opacity:.5!important}@media (hover:hover){.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000!important}}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)!important}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)!important}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)!important}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)!important}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)!important}@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)!important}}.data-\[disabled\]\:text-muted-foreground[data-disabled]{color:var(--muted-foreground)!important}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5!important}.data-\[orientation\=horizontal\]\:h-1\.5[data-orientation=horizontal]{height:calc(var(--spacing)*1.5)!important}.data-\[orientation\=horizontal\]\:h-full[data-orientation=horizontal]{height:100%!important}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%!important}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%!important}.data-\[orientation\=vertical\]\:min-h-44[data-orientation=vertical]{min-height:calc(var(--spacing)*44)!important}.data-\[orientation\=vertical\]\:w-1\.5[data-orientation=vertical]{width:calc(var(--spacing)*1.5)!important}.data-\[orientation\=vertical\]\:w-auto[data-orientation=vertical]{width:auto!important}.data-\[orientation\=vertical\]\:w-full[data-orientation=vertical]{width:100%!important}.data-\[orientation\=vertical\]\:flex-col[data-orientation=vertical]{flex-direction:column!important}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)!important}.data-\[state\=active\]\:bg-muted[data-state=active]{background-color:var(--muted)!important}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)!important}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)!important}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)!important}.data-\[state\=on\]\:bg-accent[data-state=on]{background-color:var(--accent)!important}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:var(--accent-foreground)!important}.data-\[variant\=outline\]\:border-l-0[data-variant=outline]{border-left-style:var(--tw-border-style)!important;border-left-width:0!important}.data-\[variant\=outline\]\:shadow-xs[data-variant=outline]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.data-\[variant\=outline\]\:first\:border-l[data-variant=outline]:first-child{border-left-style:var(--tw-border-style)!important;border-left-width:1px!important}@media (min-width:40rem){.sm\:not-sr-only{clip-path:none!important;white-space:normal!important;width:auto!important;height:auto!important;margin:0!important;padding:0!important;position:static!important;overflow:visible!important}.sm\:inline-block{display:inline-block!important}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:flex-row{flex-direction:row!important}.sm\:justify-end{justify-content:flex-end!important}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0!important;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse))!important;margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))!important}.sm\:text-left{text-align:left!important}}.dark\:border-input:is(.freebrowse-root.dark *){border-color:var(--input)!important}.dark\:bg-destructive\/60:is(.freebrowse-root.dark *){background-color:var(--destructive)!important}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.freebrowse-root.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)!important}}.dark\:bg-input\/30:is(.freebrowse-root.dark *){background-color:var(--input)!important}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.freebrowse-root.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)!important}}.dark\:text-muted-foreground:is(.freebrowse-root.dark *){color:var(--muted-foreground)!important}.dark\:invert:is(.freebrowse-root.dark *){--tw-invert:invert(100%)!important;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,)!important}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.freebrowse-root.dark *):hover{background-color:var(--accent)!important}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.freebrowse-root.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)!important}}.dark\:hover\:bg-input\/50:is(.freebrowse-root.dark *):hover{background-color:var(--input)!important}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.freebrowse-root.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)!important}}}.dark\:focus-visible\:ring-destructive\/40:is(.freebrowse-root.dark *):focus-visible{--tw-ring-color:var(--destructive)!important}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.freebrowse-root.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)!important}}.dark\:aria-invalid\:ring-destructive\/40:is(.freebrowse-root.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)!important}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.freebrowse-root.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)!important}}.dark\:data-\[state\=active\]\:border-input:is(.freebrowse-root.dark *)[data-state=active]{border-color:var(--input)!important}.dark\:data-\[state\=active\]\:bg-input\/30:is(.freebrowse-root.dark *)[data-state=active]{background-color:var(--input)!important}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.freebrowse-root.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input)30%,transparent)!important}}.dark\:data-\[state\=active\]\:text-foreground:is(.freebrowse-root.dark *)[data-state=active]{color:var(--foreground)!important}.dark\:data-\[state\=checked\]\:bg-primary:is(.freebrowse-root.dark *)[data-state=checked]{background-color:var(--primary)!important}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none!important}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0!important}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4)!important;height:calc(var(--spacing)*4)!important}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none!important}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing)*3)!important;height:calc(var(--spacing)*3)!important}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)!important}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)!important}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)!important}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)!important}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)!important}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)!important}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary)90%,transparent)!important}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)!important}}@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}.freebrowse-root,.freebrowse-root *,.freebrowse-root :before,.freebrowse-root :after{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.freebrowse-root,.freebrowse-root *,.freebrowse-root :before,.freebrowse-root :after{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}.freebrowse-root{background-color:var(--background);color:var(--foreground);-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--font-sans);margin:0;font-size:1rem;font-weight:400}.freebrowse-root :is(h1,h2,h3,h4,h5,h6,p,ul,ol,dl,dd,figure,blockquote,pre,hr){color:inherit;font-family:inherit;line-height:inherit;margin:0}.freebrowse-root :is(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}.freebrowse-root :is(ul,ol){padding:0;list-style:none}.freebrowse-root a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.freebrowse-root :is(button,input,optgroup,select,textarea){font:inherit;letter-spacing:inherit;color:inherit;background-color:#0000;border-radius:0;margin:0;padding:0}.freebrowse-root :is(button,[role=button],input:where([type=button],[type=reset],[type=submit])){-webkit-appearance:button;-moz-appearance:button;appearance:button;cursor:pointer}.freebrowse-root :is(input,textarea)::placeholder{opacity:1;color:currentColor}@supports (color:color-mix(in lab,red,red)){.freebrowse-root :is(input,textarea)::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}.freebrowse-root :is(img,svg,video,canvas,audio,iframe,embed,object){vertical-align:middle;display:block}.freebrowse-root :is(img,video){max-width:100%;height:auto}.freebrowse-root table{border-collapse:collapse;text-indent:0;border-color:inherit}.freebrowse-root :disabled{cursor:default}.freebrowse-root [hidden]:where(:not([hidden=until-found])){display:none!important}.freebrowse-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)}.freebrowse-root.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)}.freebrowse-root .niivue-canvas{width:100%;height:100%;position:relative;overflow:hidden}.freebrowse-root .niivue-canvas canvas{width:100%;height:100%;display:block;position:absolute;top:0;right:0;bottom:0;left: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-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ViewMode } from "../store/types.js";
|
|
2
|
+
import type { NiiVue } from "@niivue/niivue";
|
|
3
|
+
interface CanvasAreaProps {
|
|
4
|
+
nvInstance: NiiVue;
|
|
5
|
+
viewMode: ViewMode;
|
|
6
|
+
onFileUpload: (files: File[]) => Promise<void>;
|
|
7
|
+
nvCanvasEmptyState?: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export default function CanvasArea({ nvInstance, viewMode, onFileUpload, nvCanvasEmptyState, }: CanvasAreaProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface ImagingUploadConfirmationDialogProps {
|
|
2
|
+
onConfirm: () => void;
|
|
3
|
+
onCancel: () => void;
|
|
4
|
+
}
|
|
5
|
+
export default function ImagingUploadConfirmationDialog({ onConfirm, onCancel, }: ImagingUploadConfirmationDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NvdFormat } from "../../store/types.js";
|
|
2
|
+
import type { NiiVue } from "@niivue/niivue";
|
|
3
|
+
interface SaveDialogProps {
|
|
4
|
+
nvRef: React.RefObject<NiiVue | null>;
|
|
5
|
+
onConfirm: () => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
onVolumeUrlChange: (index: number, url: string) => void;
|
|
8
|
+
onVolumeCheckboxChange: (index: number, enabled: boolean) => void;
|
|
9
|
+
onDocumentLocationChange: (location: string) => void;
|
|
10
|
+
onDocumentCheckboxChange: (enabled: boolean) => void;
|
|
11
|
+
onDocumentFormatChange: (format: NvdFormat) => void;
|
|
12
|
+
}
|
|
13
|
+
export default function SaveDialog({ nvRef, onConfirm, onCancel, onVolumeUrlChange, onVolumeCheckboxChange, onDocumentLocationChange, onDocumentCheckboxChange, onDocumentFormatChange, }: SaveDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface SessionDeleteConfirmationDialogProps {
|
|
2
|
+
onConfirm: () => void;
|
|
3
|
+
onCancel: () => void;
|
|
4
|
+
}
|
|
5
|
+
export default function SessionDeleteConfirmationDialog({ onConfirm, onCancel, }: SessionDeleteConfirmationDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DRAG_MODE } from '@niivue/niivue';
|
|
2
|
+
export type DragMode = keyof typeof DRAG_MODE;
|
|
3
|
+
interface DragModeSelectorProps {
|
|
4
|
+
currentMode: DragMode;
|
|
5
|
+
onModeChange: (mode: DragMode) => void;
|
|
6
|
+
availableModes?: DragMode[];
|
|
7
|
+
}
|
|
8
|
+
export default function DragModeSelector({ currentMode, onModeChange, availableModes }: DragModeSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface FileItem {
|
|
3
|
+
filename: string;
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
interface FileListProps {
|
|
7
|
+
endpoint: string;
|
|
8
|
+
onFileSelect: (file: FileItem) => void;
|
|
9
|
+
emptyMessage?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const FileList: React.FC<FileListProps>;
|
|
12
|
+
export default FileList;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function Footer(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { NiiVue } from "@niivue/niivue";
|
|
2
|
+
export interface FreeBrowseProps {
|
|
3
|
+
/**
|
|
4
|
+
* The NiiVue instance this UI reflects and drives. The app creates it with
|
|
5
|
+
* `createFreeBrowseInstance()` (`lib/default-niivue-options.ts`); an
|
|
6
|
+
* embedding host may pass its own.
|
|
7
|
+
*/
|
|
8
|
+
nv: NiiVue;
|
|
9
|
+
/**
|
|
10
|
+
* Publish the instance as `window.freebrowse.nv` for external callers
|
|
11
|
+
* (console, embedding pages). Defaults to the configured `exposeGlobal`
|
|
12
|
+
* (app: true; library: false).
|
|
13
|
+
*/
|
|
14
|
+
exposeGlobal?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The instance belongs to the host: FreeBrowse must not push its stored
|
|
17
|
+
* viewer defaults (view mode, crosshair, ruler, …) onto it. The store is
|
|
18
|
+
* seeded FROM the instance instead. Default false (the app owns its instance).
|
|
19
|
+
*/
|
|
20
|
+
hostInstance?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Allow loading by drag-and-drop (niivue's canvas drop and FreeBrowse's
|
|
23
|
+
* drop zone). `false` also skips the drop zone: the canvas is shown from
|
|
24
|
+
* the start, since the host is expected to load data itself. Default true.
|
|
25
|
+
*/
|
|
26
|
+
dragDrop?: boolean;
|
|
27
|
+
/** Show the sidebar initially (the header button still toggles it). Default true. */
|
|
28
|
+
sidebar?: boolean;
|
|
29
|
+
/** Show the footer (coordinate readout) initially. Default true. */
|
|
30
|
+
footer?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export default function FreeBrowse({ nv, exposeGlobal, hostInstance, dragDrop, sidebar, footer, }: FreeBrowseProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NiiVue } from "@niivue/niivue";
|
|
2
|
+
interface ImageCanvasProps {
|
|
3
|
+
viewMode: "axial" | "coronal" | "sagittal" | "ACS" | "ACSR" | "render";
|
|
4
|
+
nvRef: NiiVue;
|
|
5
|
+
}
|
|
6
|
+
export default function ImageCanvas({ viewMode, nvRef }: ImageCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { NiiVue, NVImage, NVMeshLayer } from "@niivue/niivue";
|
|
2
|
+
import type { FileItem } from "./file-list.js";
|
|
3
|
+
interface SidebarProps {
|
|
4
|
+
nvRef: React.RefObject<NiiVue | null>;
|
|
5
|
+
serverlessMode: boolean;
|
|
6
|
+
onNvdFileSelect: (file: FileItem) => void;
|
|
7
|
+
onImagingFileSelect: (file: FileItem) => void;
|
|
8
|
+
onAddMoreFiles: () => void;
|
|
9
|
+
onAddSurfaceFiles: () => void;
|
|
10
|
+
getVolumes: () => NVImage[];
|
|
11
|
+
onToggleImageVisibility: (id: string) => void;
|
|
12
|
+
onEditVolume: (index: number) => void;
|
|
13
|
+
canEditVolume: (index: number) => boolean;
|
|
14
|
+
onRemoveVolumeClick: (index: number) => void;
|
|
15
|
+
onOpacityChange: (value: number) => void;
|
|
16
|
+
onFrameChange: (value: number) => void;
|
|
17
|
+
onContrastMinChange: (value: number) => void;
|
|
18
|
+
onContrastMaxChange: (value: number) => void;
|
|
19
|
+
onColormapChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;
|
|
20
|
+
onMoveVolumeUp: () => void;
|
|
21
|
+
onMoveVolumeDown: () => void;
|
|
22
|
+
onToggleSurfaceVisibility: (index: number) => void;
|
|
23
|
+
onRemoveSurfaceClick: (index: number) => void;
|
|
24
|
+
onSurfaceOpacityChange: (value: number) => void;
|
|
25
|
+
onSurfaceColorChange: (hexColor: string) => void;
|
|
26
|
+
onMeshShaderChange: (shaderName: string) => void;
|
|
27
|
+
getLayers: () => NVMeshLayer[];
|
|
28
|
+
onAddLayerFiles: () => void;
|
|
29
|
+
onRemoveLayer: (index: number) => void;
|
|
30
|
+
onLayerOpacityChange: (value: number) => void;
|
|
31
|
+
onLayerCalMinChange: (value: number) => void;
|
|
32
|
+
onLayerCalMaxChange: (value: number) => void;
|
|
33
|
+
onLayerColormapChange: (colormap: string) => void;
|
|
34
|
+
onLayerUseNegativeCmapChange: (checked: boolean) => void;
|
|
35
|
+
onCreateDrawingLayer: () => void;
|
|
36
|
+
onDrawModeChange: (mode: "none" | "pen" | "wand") => void;
|
|
37
|
+
onDrawingColormapChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;
|
|
38
|
+
onPenFillChange: (checked: boolean) => void;
|
|
39
|
+
onPenErasesChange: (checked: boolean) => void;
|
|
40
|
+
onPenValueChange: (value: number) => void;
|
|
41
|
+
onDrawingOpacityChange: (value: number) => void;
|
|
42
|
+
onMagicWand2dOnlyChange: (checked: boolean) => void;
|
|
43
|
+
onMagicWandMaxDistanceChange: (value: number) => void;
|
|
44
|
+
onMagicWandThresholdChange: (value: number) => void;
|
|
45
|
+
onDrawUndo: () => void;
|
|
46
|
+
onSaveDrawing: () => void;
|
|
47
|
+
onSaveScene: (isDownload: boolean) => void;
|
|
48
|
+
onAiNewSession: (sessionName: string) => Promise<void>;
|
|
49
|
+
onAiLoadSession: (sessionId: string) => Promise<void>;
|
|
50
|
+
onAiRunSegmentation: (mlId: string, labelValue: number) => Promise<void>;
|
|
51
|
+
onAiExitAndSaveSession: () => Promise<void>;
|
|
52
|
+
onAiExitAndDeleteSession: () => Promise<void>;
|
|
53
|
+
onAiRefreshSessions: () => Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
export default function Sidebar(props: SidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface AiAnnotationTabProps {
|
|
2
|
+
volumesCount: number;
|
|
3
|
+
onNewSession: (sessionName: string) => Promise<void>;
|
|
4
|
+
onLoadSession: (sessionId: string) => Promise<void>;
|
|
5
|
+
onRunSegmentation: (mlId: string, labelValue: number) => Promise<void>;
|
|
6
|
+
onExitAndSaveSession: () => Promise<void>;
|
|
7
|
+
onExitAndDeleteSession: () => Promise<void>;
|
|
8
|
+
onRefreshSessions: () => Promise<void>;
|
|
9
|
+
onDrawModeChange: (mode: "none" | "pen" | "wand") => void;
|
|
10
|
+
onDrawingOpacityChange: (value: number) => void;
|
|
11
|
+
onPenValueChange: (value: number) => void;
|
|
12
|
+
onPenFillChange: (checked: boolean) => void;
|
|
13
|
+
onPenErasesChange: (checked: boolean) => void;
|
|
14
|
+
onMagicWand2dOnlyChange: (checked: boolean) => void;
|
|
15
|
+
onMagicWandMaxDistanceChange: (value: number) => void;
|
|
16
|
+
onMagicWandThresholdChange: (value: number) => void;
|
|
17
|
+
onDrawUndo: () => void;
|
|
18
|
+
}
|
|
19
|
+
export default function AiAnnotationTab({ volumesCount, onNewSession, onLoadSession, onRunSegmentation, onExitAndSaveSession, onExitAndDeleteSession, onRefreshSessions, onDrawModeChange, onDrawingOpacityChange, onPenValueChange, onPenFillChange, onPenErasesChange, onMagicWand2dOnlyChange, onMagicWandMaxDistanceChange, onMagicWandThresholdChange, onDrawUndo, }: AiAnnotationTabProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import NiiVue from "@niivue/niivue";
|
|
2
|
+
interface DrawingTabProps {
|
|
3
|
+
nvRef: React.RefObject<NiiVue | null>;
|
|
4
|
+
onDrawModeChange: (mode: "none" | "pen" | "wand") => void;
|
|
5
|
+
onDrawingColormapChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;
|
|
6
|
+
onPenFillChange: (checked: boolean) => void;
|
|
7
|
+
onPenErasesChange: (checked: boolean) => void;
|
|
8
|
+
onPenValueChange: (value: number) => void;
|
|
9
|
+
onDrawingOpacityChange: (value: number) => void;
|
|
10
|
+
onMagicWand2dOnlyChange: (checked: boolean) => void;
|
|
11
|
+
onMagicWandMaxDistanceChange: (value: number) => void;
|
|
12
|
+
onMagicWandThresholdChange: (value: number) => void;
|
|
13
|
+
onDrawUndo: () => void;
|
|
14
|
+
onSaveDrawing: () => void;
|
|
15
|
+
}
|
|
16
|
+
export default function DrawingTab({ nvRef, onDrawModeChange, onDrawingColormapChange, onPenFillChange, onPenErasesChange, onPenValueChange, onDrawingOpacityChange, onMagicWand2dOnlyChange, onMagicWandMaxDistanceChange, onMagicWandThresholdChange, onDrawUndo, onSaveDrawing, }: DrawingTabProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { NiiVue, NVImage } from "@niivue/niivue";
|
|
2
|
+
interface SceneDetailsTabProps {
|
|
3
|
+
nvRef: React.RefObject<NiiVue | null>;
|
|
4
|
+
serverlessMode: boolean;
|
|
5
|
+
getVolumes: () => NVImage[];
|
|
6
|
+
onToggleVisibility: (id: string) => void;
|
|
7
|
+
onEditVolume: (index: number) => void;
|
|
8
|
+
canEditVolume: (index: number) => boolean;
|
|
9
|
+
onRemoveVolume: (index: number) => void;
|
|
10
|
+
onAddMoreFiles: () => void;
|
|
11
|
+
onCreateDrawingLayer: () => void;
|
|
12
|
+
onSaveScene: (isDownload: boolean) => void;
|
|
13
|
+
onOpacityChange: (value: number) => void;
|
|
14
|
+
onFrameChange: (value: number) => void;
|
|
15
|
+
onContrastMinChange: (value: number) => void;
|
|
16
|
+
onContrastMaxChange: (value: number) => void;
|
|
17
|
+
onColormapChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;
|
|
18
|
+
onMoveVolumeUp: () => void;
|
|
19
|
+
onMoveVolumeDown: () => void;
|
|
20
|
+
}
|
|
21
|
+
export default function SceneDetailsTab({ nvRef, serverlessMode, getVolumes, onToggleVisibility, onEditVolume, canEditVolume, onRemoveVolume, onAddMoreFiles, onCreateDrawingLayer, onSaveScene, onOpacityChange, onFrameChange, onContrastMinChange, onContrastMaxChange, onColormapChange, onMoveVolumeUp, onMoveVolumeDown, }: SceneDetailsTabProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NiiVue, NVMeshLayer } from "@niivue/niivue";
|
|
2
|
+
interface SurfaceDetailsTabProps {
|
|
3
|
+
nvRef: React.RefObject<NiiVue | null>;
|
|
4
|
+
onToggleVisibility: (index: number) => void;
|
|
5
|
+
onRemoveSurface: (index: number) => void;
|
|
6
|
+
onAddSurfaceFiles: () => void;
|
|
7
|
+
onOpacityChange: (value: number) => void;
|
|
8
|
+
onColorChange: (hexColor: string) => void;
|
|
9
|
+
onShaderChange: (shaderName: string) => void;
|
|
10
|
+
getLayers: () => NVMeshLayer[];
|
|
11
|
+
onAddLayerFiles: () => void;
|
|
12
|
+
onRemoveLayer: (index: number) => void;
|
|
13
|
+
onLayerOpacityChange: (value: number) => void;
|
|
14
|
+
onLayerCalMinChange: (value: number) => void;
|
|
15
|
+
onLayerCalMaxChange: (value: number) => void;
|
|
16
|
+
onLayerColormapChange: (colormap: string) => void;
|
|
17
|
+
onLayerUseNegativeCmapChange: (checked: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
export default function SurfaceDetailsTab({ nvRef, onToggleVisibility, onRemoveSurface, onAddSurfaceFiles, onOpacityChange, onColorChange, onShaderChange, getLayers, onAddLayerFiles, onRemoveLayer, onLayerOpacityChange, onLayerCalMinChange, onLayerCalMaxChange, onLayerColormapChange, onLayerUseNegativeCmapChange, }: SurfaceDetailsTabProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const buttonVariants: (props?: ({
|
|
4
|
+
variant?: "default" | "outline" | "link" | "destructive" | "secondary" | "ghost" | null | undefined;
|
|
5
|
+
size?: "default" | "sm" | "lg" | "icon" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
interface DialogProps {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
onOpenChange?: (open: boolean) => void;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
declare const Dialog: ({ open, onOpenChange, children }: DialogProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
declare const DialogContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
9
|
+
onClose?: () => void;
|
|
10
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
declare const DialogHeader: ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
declare const DialogTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
13
|
+
declare const DialogDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
14
|
+
declare const DialogFooter: ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface LabeledSliderWithInputProps {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
onValueChange: (value: number) => void;
|
|
6
|
+
min?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
step?: number;
|
|
9
|
+
decimalPlaces?: number;
|
|
10
|
+
className?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare const LabeledSliderWithInput: React.ForwardRefExoticComponent<LabeledSliderWithInputProps & React.RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export { LabeledSliderWithInput };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
|
|
3
|
+
declare function RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare function RadioGroupItem({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Item>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export { RadioGroup, RadioGroupItem };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
|
|
3
|
+
declare function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare function ScrollBar({ className, orientation, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export { ScrollArea, ScrollBar };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as SliderPrimitive from "@radix-ui/react-slider";
|
|
3
|
+
declare function Slider({ className, defaultValue, value, min, max, ...props }: React.ComponentProps<typeof SliderPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export { Slider };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
3
|
+
declare function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
import { toggleVariants } from "./toggle.js";
|
|
5
|
+
declare function ToggleGroup({ className, variant, size, children, ...props }: React.ComponentProps<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants>): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare function ToggleGroupItem({ className, children, variant, size, ...props }: React.ComponentProps<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export { ToggleGroup, ToggleGroupItem };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as TogglePrimitive from "@radix-ui/react-toggle";
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
declare const toggleVariants: (props?: ({
|
|
5
|
+
variant?: "default" | "outline" | null | undefined;
|
|
6
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
7
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
|
+
declare function Toggle({ className, variant, size, ...props }: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export { Toggle, toggleVariants };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ViewMode = "axial" | "coronal" | "sagittal" | "ACS" | "ACSR" | "render";
|
|
2
|
+
interface ViewSelectorProps {
|
|
3
|
+
currentView: ViewMode;
|
|
4
|
+
onViewChange: (view: ViewMode) => void;
|
|
5
|
+
}
|
|
6
|
+
export default function ViewSelector({ currentView, onViewChange }: ViewSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NiiVue } from "@niivue/niivue";
|
|
2
|
+
import type { ViewMode } from "../store/types.js";
|
|
3
|
+
interface ViewerShellProps {
|
|
4
|
+
nvInstance: NiiVue;
|
|
5
|
+
viewMode: ViewMode;
|
|
6
|
+
onFileUpload: (files: File[]) => Promise<void>;
|
|
7
|
+
sidebar?: React.ReactNode;
|
|
8
|
+
dialogs?: React.ReactNode;
|
|
9
|
+
hiddenInputs?: React.ReactNode;
|
|
10
|
+
nvCanvasEmptyState?: React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
export default function ViewerShell({ nvInstance, viewMode, onFileUpload, sidebar, dialogs, hiddenInputs, nvCanvasEmptyState, }: ViewerShellProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useAiCapabilities(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NiiVue } from "@niivue/niivue";
|
|
2
|
+
export declare function useAiSession(nvRef: React.RefObject<NiiVue | null>): {
|
|
3
|
+
refreshSessions: () => Promise<void>;
|
|
4
|
+
handleNewSession: (sessionName: string) => Promise<void>;
|
|
5
|
+
handleLoadSession: (sessionId: string) => Promise<void>;
|
|
6
|
+
handleRunSegmentation: (mlId: string, labelValue: number) => Promise<void>;
|
|
7
|
+
handleExitAndSaveSession: () => Promise<void>;
|
|
8
|
+
handleExitAndDeleteSession: () => Promise<void>;
|
|
9
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import NiiVue from "@niivue/niivue";
|
|
2
|
+
/**
|
|
3
|
+
* Core pen-drawing handlers (Phase 4a). Hybrid store/command model:
|
|
4
|
+
* - Event-mirrored fields (opacity, penFill, colormap, enabled): handlers issue
|
|
5
|
+
* nv.* commands only; the event adapter maps the resulting events into
|
|
6
|
+
* drawingOptions. `enabled` follows drawingChanged (a drawing layer exists),
|
|
7
|
+
* NOT drawIsEnabled (pointer painting) — `mode` is FreeBrowse's abstraction
|
|
8
|
+
* over drawIsEnabled.
|
|
9
|
+
* - Store-owned fields (mode, penErases, penValue): handlers set the store AND
|
|
10
|
+
* drive niivue as a derived value (drawPenValue = penErases ? 0 : penValue),
|
|
11
|
+
* which the adapter does NOT mirror back (mirroring would clobber penValue on
|
|
12
|
+
* erase). Magic-wand params stay store-owned for 4c.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useDrawing(nvRef: React.RefObject<NiiVue | null>, debouncedGLUpdate: () => void): {
|
|
15
|
+
handleCreateDrawingLayer: () => void;
|
|
16
|
+
handleDrawingColormapChange: (event: React.ChangeEvent<HTMLSelectElement>) => void;
|
|
17
|
+
handleDrawModeChange: (mode: "none" | "pen" | "wand") => void;
|
|
18
|
+
handlePenFillChange: (checked: boolean) => void;
|
|
19
|
+
handlePenErasesChange: (checked: boolean) => void;
|
|
20
|
+
handlePenValueChange: (value: number) => void;
|
|
21
|
+
handleDrawingOpacityChange: (opacity: number) => void;
|
|
22
|
+
handleMagicWand2dOnlyChange: (checked: boolean) => void;
|
|
23
|
+
handleMagicWandMaxDistanceChange: (value: number) => void;
|
|
24
|
+
handleMagicWandThresholdChange: (value: number) => void;
|
|
25
|
+
handleDrawUndo: () => void;
|
|
26
|
+
handleSaveDrawing: () => Promise<void>;
|
|
27
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NiiVue } from "@niivue/niivue";
|
|
2
|
+
import type { FileItem } from "../components/file-list.js";
|
|
3
|
+
export declare function useFileLoading(nvRef: React.RefObject<NiiVue | null>, applyViewerOptions: () => void, syncViewerOptionsFromNiiVue: () => void, updateSurfaceDetails: () => void): {
|
|
4
|
+
serverlessMode: boolean;
|
|
5
|
+
fileInputRef: import("react").RefObject<HTMLInputElement | null>;
|
|
6
|
+
surfaceFileInputRef: import("react").RefObject<HTMLInputElement | null>;
|
|
7
|
+
loadNvdData: (data: ArrayBuffer | Uint8Array | Record<string, unknown>) => Promise<void>;
|
|
8
|
+
handleFileUpload: (files: File[]) => Promise<void>;
|
|
9
|
+
handleImagingFileSelect: (file: FileItem) => Promise<void>;
|
|
10
|
+
handleNvdFileSelect: (file: FileItem) => Promise<void>;
|
|
11
|
+
handleFileChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
12
|
+
handleAddMoreFiles: () => void;
|
|
13
|
+
handleAddSurfaceFiles: () => void;
|
|
14
|
+
handleSurfaceFileChange: (e: React.ChangeEvent<HTMLInputElement>) => Promise<void>;
|
|
15
|
+
};
|