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.
Files changed (73) hide show
  1. package/README.md +134 -0
  2. package/dist-lib/index.js +21492 -0
  3. package/dist-lib/index.js.map +1 -0
  4. package/dist-lib/react.js +10790 -0
  5. package/dist-lib/react.js.map +1 -0
  6. package/dist-lib/style.css +1 -0
  7. package/dist-lib/types/components/canvas-area.d.ts +10 -0
  8. package/dist-lib/types/components/dialogs/imaging-upload-confirmation-dialog.d.ts +6 -0
  9. package/dist-lib/types/components/dialogs/remove-dialog.d.ts +6 -0
  10. package/dist-lib/types/components/dialogs/save-dialog.d.ts +14 -0
  11. package/dist-lib/types/components/dialogs/session-delete-confirmation-dialog.d.ts +6 -0
  12. package/dist-lib/types/components/dialogs/settings-dialog.d.ts +6 -0
  13. package/dist-lib/types/components/drag-mode-selector.d.ts +9 -0
  14. package/dist-lib/types/components/file-list.d.ts +12 -0
  15. package/dist-lib/types/components/footer.d.ts +1 -0
  16. package/dist-lib/types/components/freebrowse.d.ts +32 -0
  17. package/dist-lib/types/components/header.d.ts +6 -0
  18. package/dist-lib/types/components/image-canvas.d.ts +7 -0
  19. package/dist-lib/types/components/image-uploader.d.ts +6 -0
  20. package/dist-lib/types/components/sidebar.d.ts +56 -0
  21. package/dist-lib/types/components/tabs/ai-annotation-tab.d.ts +20 -0
  22. package/dist-lib/types/components/tabs/data-tab.d.ts +6 -0
  23. package/dist-lib/types/components/tabs/drawing-tab.d.ts +17 -0
  24. package/dist-lib/types/components/tabs/nvd-tab.d.ts +6 -0
  25. package/dist-lib/types/components/tabs/scene-details-tab.d.ts +22 -0
  26. package/dist-lib/types/components/tabs/surface-details-tab.d.ts +20 -0
  27. package/dist-lib/types/components/ui/button.d.ts +10 -0
  28. package/dist-lib/types/components/ui/checkbox.d.ts +4 -0
  29. package/dist-lib/types/components/ui/dialog.d.ts +15 -0
  30. package/dist-lib/types/components/ui/input.d.ts +5 -0
  31. package/dist-lib/types/components/ui/label.d.ts +4 -0
  32. package/dist-lib/types/components/ui/labeled-slider-with-input.d.ts +14 -0
  33. package/dist-lib/types/components/ui/radio-group.d.ts +5 -0
  34. package/dist-lib/types/components/ui/scroll-area.d.ts +5 -0
  35. package/dist-lib/types/components/ui/select.d.ts +5 -0
  36. package/dist-lib/types/components/ui/slider.d.ts +4 -0
  37. package/dist-lib/types/components/ui/tabs.d.ts +7 -0
  38. package/dist-lib/types/components/ui/toggle-group.d.ts +7 -0
  39. package/dist-lib/types/components/ui/toggle.d.ts +9 -0
  40. package/dist-lib/types/components/view-selector.d.ts +7 -0
  41. package/dist-lib/types/components/viewer-shell.d.ts +13 -0
  42. package/dist-lib/types/hooks/use-ai-capabilities.d.ts +1 -0
  43. package/dist-lib/types/hooks/use-ai-session.d.ts +9 -0
  44. package/dist-lib/types/hooks/use-drawing.d.ts +27 -0
  45. package/dist-lib/types/hooks/use-file-loading.d.ts +15 -0
  46. package/dist-lib/types/hooks/use-magic-wand.d.ts +15 -0
  47. package/dist-lib/types/hooks/use-mesh-layers.d.ts +21 -0
  48. package/dist-lib/types/hooks/use-save.d.ts +12 -0
  49. package/dist-lib/types/hooks/use-surfaces.d.ts +16 -0
  50. package/dist-lib/types/hooks/use-viewer-options.d.ts +42 -0
  51. package/dist-lib/types/hooks/use-volumes.d.ts +39 -0
  52. package/dist-lib/types/lib/confirmations.d.ts +4 -0
  53. package/dist-lib/types/lib/default-niivue-options.d.ts +16 -0
  54. package/dist-lib/types/lib/deployment-config.d.ts +66 -0
  55. package/dist-lib/types/lib/niivue-helpers.d.ts +27 -0
  56. package/dist-lib/types/lib/nvd-volume-urls.d.ts +26 -0
  57. package/dist-lib/types/lib/random-session-name.d.ts +1 -0
  58. package/dist-lib/types/lib/utils.d.ts +2 -0
  59. package/dist-lib/types/lib.d.ts +16 -0
  60. package/dist-lib/types/mount.d.ts +49 -0
  61. package/dist-lib/types/react.d.ts +10 -0
  62. package/dist-lib/types/store/ai-slice.d.ts +25 -0
  63. package/dist-lib/types/store/drawing-slice.d.ts +7 -0
  64. package/dist-lib/types/store/index.d.ts +21 -0
  65. package/dist-lib/types/store/location-slice.d.ts +7 -0
  66. package/dist-lib/types/store/niivue-store-sync.d.ts +41 -0
  67. package/dist-lib/types/store/niivue-sync.d.ts +57 -0
  68. package/dist-lib/types/store/save-slice.d.ts +9 -0
  69. package/dist-lib/types/store/surface-slice.d.ts +15 -0
  70. package/dist-lib/types/store/types.d.ts +69 -0
  71. package/dist-lib/types/store/viewer-slice.d.ts +31 -0
  72. package/dist-lib/types/store/volume-slice.d.ts +13 -0
  73. 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,6 @@
1
+ interface RemoveDialogProps {
2
+ onConfirm: () => void;
3
+ onCancel: () => void;
4
+ }
5
+ export default function RemoveDialog({ onConfirm, onCancel }: RemoveDialogProps): 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,6 @@
1
+ import type { NiiVue } from "@niivue/niivue";
2
+ interface SettingsDialogProps {
3
+ nvRef: React.RefObject<NiiVue | null>;
4
+ }
5
+ export default function SettingsDialog({ nvRef }: SettingsDialogProps): 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,6 @@
1
+ import type { NiiVue } from "@niivue/niivue";
2
+ interface HeaderProps {
3
+ nvRef: React.RefObject<NiiVue | null>;
4
+ }
5
+ export default function Header({ nvRef }: HeaderProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -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,6 @@
1
+ interface ImageUploaderProps {
2
+ onUpload: (files: File[]) => Promise<void>;
3
+ compact?: boolean;
4
+ }
5
+ export default function ImageUploader({ onUpload, compact }: ImageUploaderProps): import("react/jsx-runtime").JSX.Element;
6
+ 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,6 @@
1
+ import { type FileItem } from "../file-list.js";
2
+ interface DataTabProps {
3
+ onFileSelect: (file: FileItem) => void;
4
+ }
5
+ export default function DataTab({ onFileSelect }: DataTabProps): import("react/jsx-runtime").JSX.Element;
6
+ 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,6 @@
1
+ import { type FileItem } from "../file-list.js";
2
+ interface NvdTabProps {
3
+ onFileSelect: (file: FileItem) => void;
4
+ }
5
+ export default function NvdTab({ onFileSelect }: NvdTabProps): import("react/jsx-runtime").JSX.Element;
6
+ 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,4 @@
1
+ import * as React from "react";
2
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
3
+ declare function Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ export { Checkbox };
@@ -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,5 @@
1
+ import * as React from "react";
2
+ export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
3
+ }
4
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
5
+ export { Input };
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ import * as LabelPrimitive from "@radix-ui/react-label";
3
+ declare function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ export { Label };
@@ -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,5 @@
1
+ import * as React from "react";
2
+ export interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {
3
+ }
4
+ declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLSelectElement>>;
5
+ export { Select };
@@ -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
+ };