@vuu-ui/vuu-filters 0.8.7-debug → 0.8.7

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/index.css.map CHANGED
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.css", "../../../packages/vuu-layout/src/dock-layout/Drawer.css", "../../../packages/vuu-layout/src/dock-layout/DockLayout.css", "../../../packages/vuu-layout/src/drag-drop/DropMenu.css", "../../../packages/vuu-layout/src/drag-drop/DropTargetRenderer.css", "../../../packages/vuu-layout/src/DraggableLayout.css", "../../../packages/vuu-layout/src/placeholder/Placeholder.css", "../../../packages/vuu-layout/src/flexbox/Splitter.css", "../../../packages/vuu-layout/src/flexbox/Flexbox.css", "../../../packages/vuu-layout/src/flexbox/FluidGrid.css", "../../../packages/vuu-layout/src/layout-view/View.css", "../../../packages/vuu-layout/src/layout-header/Header.css", "../../../packages/vuu-layout/src/overflow-container/OverflowContainer.css", "../../../packages/vuu-layout/src/palette/Palette.css", "../../../packages/vuu-layout/src/stack/Stack.css", "../../../packages/vuu-layout/src/tools/devtools-box/layout-configurator.css", "../../../packages/vuu-layout/src/tools/devtools-tree/layout-tree-viewer.css", "../../../packages/vuu-shell/src/layout-management/SaveLayoutPanel.css", "../../../packages/vuu-shell/src/left-nav/LeftNav.css", "../../../packages/vuu-shell/src/login/LoginPanel.css", "../../../packages/vuu-shell/src/session-editing-form/SessionEditingForm.css", "../../../packages/vuu-shell/src/user-profile/UserPanel.css", "../../../packages/vuu-shell/src/user-profile/UserProfile.css", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.css", "../../../packages/vuu-shell/src/app-header/AppHeader.css", "../../../packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.css", "../../../packages/vuu-shell/src/shell.css", "../../../packages/vuu-popups/src/dialog/Dialog.css", "../../../packages/vuu-popups/src/menu/MenuList.css", "../../../packages/vuu-popups/src/popup/popup-service.css", "../../../packages/vuu-popups/src/popup-menu/PopupMenu.css", "../../../packages/vuu-ui-controls/src/drag-drop/Draggable.css", "../../../packages/vuu-ui-controls/src/editable-label/EditableLabel.css", "../../../packages/vuu-ui-controls/src/tabstrip/Tabstrip.css", "../../../packages/vuu-ui-controls/src/tabstrip/TabMenu.css", "../../../packages/vuu-ui-controls/src/tabstrip/Tab.css", "../../../packages/vuu-ui-controls/src/tree/Tree.css", "../../../packages/vuu-filters/src/filter-pill-menu/FilterPillMenu.css", "../../../packages/vuu-filters/src/filter-pill/FilterPill.css", "../../../packages/vuu-filters/src/filter-bar/FilterBar.css", "../../../packages/vuu-filters/src/filter-clause/ExpandoCombobox.css", "../../../packages/vuu-filters/src/filter-clause/CloseButton.css", "../../../packages/vuu-filters/src/filter-clause/FilterClauseEditor.css", "../../../packages/vuu-filters/src/filter-input/FilterInput.css"],
4
4
  "sourcesContent": [".vuuStatus-container {\n\tdisplay: flex;\n}\n\n.vuuStatus-text {\n\talign-self: center;\n}\n\n\n.vuuStatus {\n\t--vuu-icon-height: 18px;\n\t--vuu-icon-padding: var(--vuuStatus-padding, 6px);\n\t--vuu-icon-width: var(--vuuStatus-width, auto);\n\t--vuu-icon-min-width: var(--vuuStatus-min-width, 20px);\n\talign-items: center;\n\tdisplay: inline-flex;\n\theight: var(--vuu-icon-height);\n\tjustify-content: center;\n\tmin-width: var(--vuu-icon-min-width);\n\tpadding: 0 var(--vuu-icon-padding);\n\twidth: var(--vuu-icon-width);\n\tposition: relative;\n}\n\n.vuuStatus[data-icon]::after {\n\tinset: 0 0 0 0;\n\tcontent: '';\n\tbox-shadow: 0 0 0 0 black;\n\tposition: absolute;\n\tmask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n\t-webkit-mask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n}\n\n.vuuActiveStatus::after {\n\t--vuu-icon-svg: var(--svg-active-status);\n\tbackground-color: rgb(0, 255, 0);\n}\n\n.vuuConnectingStatus::after {\n\t--vuu-icon-svg: var(--svg-connecting-status);\n\tbackground-color: orange;\n\ttransform: scale(1);\n\tanimation: infinite pulse 1s;\n}\n\n.vuuDisconnectedStatus::after {\n\t--vuu-icon-svg: var(--svg-disconnected-status);\n\tbackground-color: red;\n\ttransform: scale(1);\n\tanimation: infinite pulse 0.5s;\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);\n\t}\n\n\t70% {\n\t\ttransform: scale(1);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n\n\t100% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n}", ".vuuDrawer {\n --drawer-leading-edge-border: solid 1px var(--salt-container-primary-borderColor, none);\n --vuu-close-icon-svg: var(--svg-chevron-double-right);\n\n transition: flex-basis;\n transition-duration: var(--drawer-transition-duration);\n position: relative;\n z-index: 1;\n flex-basis: 0;\n flex-grow: 1;\n flex-shrink: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n}\n\n.vuuDrawer-peekaboo {\n flex-basis: var(--drawer-peek-size);\n flex-grow: 0;\n flex-shrink: 0;\n}\n\n.vuuDrawer-inline.vuuDrawer-open {\n flex-basis: var(--drawer-size);\n flex-grow: 0;\n flex-shrink: 0;\n}\n\n.vuuDrawer-liner {\n background-color: var(--drawer-bg);\n overflow: hidden;\n position: relative;\n}\n\n.vuuDrawer-content {\n height: 100%;\n overflow: hidden;\n position: absolute;\n top: 0;\n right: var(--drawer-peek-size);\n transition: right;\n transition-duration: var(--drawer-transition-duration);\n width: 100%;\n flex: 1 1 100%;\n}\n\n.vuuDrawer-open .vuuDrawer-content {\n right: 0;\n}\n\n/* .vuuDrawer:not(.vuuDrawer-open) .vuuDrawer-liner > * {\n display: none;\n} */\n\n.vuuDrawer-left {\n border-right: var(--drawer-leading-edge-border);\n}\n.vuuDrawer-right {\n border-left: var(--drawer-leading-edge-border);\n}\n.vuuDrawer-top {\n border-bottom: var(--drawer-leading-edge-border);\n}\n.vuuDrawer-bottom {\n border-top: var(--drawer-leading-edge-border);\n}\n\n.vuuDrawer-left .vuuDrawer-liner,\n.vuuDrawer-right .vuuDrawer-liner {\n height: 100%;\n transition: width;\n}\n\n.vuuDrawer-top .vuuDrawer-liner,\n.vuuDrawer-bottom .vuuDrawer-liner {\n width: 100%;\n transition: height;\n}\n\n.vuuDrawer-inline .vuuDrawer-liner {\n width: 100%;\n height: 100%;\n}\n\n.vuuDrawer-over .vuuDrawer-liner {\n position: absolute;\n transition-duration: 0.4s;\n}\n\n.vuuDrawer-over.vuuDrawer-left .vuuDrawer-liner {\n top: 0;\n left: 0;\n width: 0;\n}\n\n.vuuDrawer-over.vuuDrawer-right .vuuDrawer-liner {\n top: 0;\n right: 0;\n width: 0;\n}\n\n.vuuDrawer-over.vuuDrawer-top .vuuDrawer-liner {\n height: 0;\n top: 0;\n left: 0;\n}\n\n.vuuDrawer-over.vuuDrawer-bottom .vuuDrawer-liner {\n bottom: 0;\n height: 0;\n left: 0;\n}\n\n.vuuDrawer-left.vuuDrawer-over.vuuDrawer-peekaboo .vuuDrawer-liner,\n.vuuDrawer-right.vuuDrawer-over.vuuDrawer-peekaboo .vuuDrawer-liner {\n width: var(--drawer-peek-size);\n}\n\n.vuuDrawer-top.vuuDrawer-over.vuuDrawer-peekaboo .vuuDrawer-liner,\n.vuuDrawer-bottom.vuuDrawer-over.vuuDrawer-peekaboo .vuuDrawer-liner {\n height: var(--drawer-peek-size);\n}\n\n.vuuDrawer-left.vuuDrawer-over.vuuDrawer-open .vuuDrawer-liner,\n.vuuDrawer-right.vuuDrawer-over.vuuDrawer-open .vuuDrawer-liner {\n width: var(--drawer-size);\n}\n\n.vuuDrawer-top.vuuDrawer-over.vuuDrawer-open .vuuDrawer-liner,\n.vuuDrawer-bottom.vuuDrawer-over.vuuDrawer-open .vuuDrawer-liner {\n height: var(--drawer-size);\n}\n\n.vuuDrawer-top,\n.vuuDrawer-left {\n order: 0;\n}\n\n.vuuDrawer-bottom,\n.vuuDrawer-right {\n order: 99;\n}\n\n.vuuDrawer-left,\n.vuuDrawer-right {\n flex-direction: column;\n}\n\n.vuuToggleButton-container {\n --saltButton-height: 28px;\n --saltButton-width: 28px;\n --vuu-icon-size: 12px;\n flex: 0 0 28px;\n}\n\n.vuuDrawer-open {\n --vuu-close-icon-svg: var(--svg-chevron-double-left);\n\n}\n", ".vuuDockLayout {\n --chest-bg: var(--hw-chest-bg, inherit);\n --drawer-bg: var(--hw-drawer-bg, inherit);\n --drawer-size: var(--hw-drawer-size, 200px);\n --drawer-peek-size: var(--hw-drawer-peek-size, 32px);\n --drawer-transition-duration: var(--hw-drawer-transition-duration, 0.4s);\n background-color: var(--chest-bg);\n display: flex;\n}\n\n.vuuDockLayout-horizontal {\n flex-direction: row;\n}\n\n.vuuDockLayout-vertical {\n flex-direction: column;\n}\n\n.vuuDockLayout-content {\n background-color: var(--chest-bg);\n flex-grow: 1;\n flex-shrink: 1;\n overflow: hidden;\n /* position: relative; */\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vuuDockLayout-horizontal .vuuDockLayout-content {\n flex-basis: 100%;\n}\n\n.vuuDockLayout-vertical .vuuDockLayout-content {\n flex-basis: 100%;\n}\n", ".vuuDropMenu {\n margin-left: -50%;\n margin-bottom: -50%;\n background-color: white;\n border: solid 1px var(--grey40);\n display: inline-flex;\n justify-content: center;\n align-items: center;\n padding: 3px;\n border-radius: 3px;\n}\n\n.vuuDropMenu-left,\n.vuuDropMenu-right {\n flex-direction: column;\n}\n\n.vuuDropMenu-bottom {\n transform: translate(0, -30px);\n}\n\n.vuuDropMenu-right {\n transform: translate(-20px, 0);\n}\n\n.vuuDropMenu-item {\n --vuu-icon-size: 20px;\n width: 32px;\n height: 32px;\n background-color: var(--grey20);\n border-bottom: solid 1px var(--grey40);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vuuDropMenu-item .Icon {\n transform: scale(1.25);\n transform-origin: center center;\n}\n\n.vuuDropMenu-left .vuuDropMenu-item .hwIcon {\n transform: scale(1.25) rotate(180deg);\n transform-origin: center center;\n}\n\n.vuuDropMenu-top .vuuDropMenu-item .hwIcon {\n transform: scale(1.25) rotate(270deg);\n transform-origin: center center;\n}\n\n.vuuDropMenu-bottom .vuuDropMenu-item .hwIcon {\n transform: scale(1.25) rotate(90deg);\n transform-origin: center center;\n}\n\n.vuuDropMenu-item .hwIcon-path {\n fill: grey;\n}\n.vuuDropMenu-item:hover {\n background-color: rgba(200, 200, 200, 0.5);\n}\n\n.vuuDropMenu-item:hover .hwIcon-path-2 {\n fill: blue;\n}\n\n.vuuDropMenu-item:last-child {\n border-bottom: none;\n}\n", "#hw-drag-canvas {\n visibility: hidden;\n z-index: 1;\n position: absolute;\n top: 0px;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: transparent;\n}\n\n#hw-drag-canvas > svg {\n position: absolute;\n}\n\n.drawing #hw-drag-canvas {\n visibility: visible;\n}\n\npath.drop-target {\n stroke: blue;\n stroke-width: 4px;\n fill: transparent;\n}\n\npath.drop-target.centre {\n stroke: red;\n}\n\n#vuu-drop-outline {\n fill: rgba(0,0,255,.3);\n stroke: none;\n stroke-dasharray: 4 2;\n}\n\n#hw-drop-guides {\n fill: none;\n stroke: rgba(0, 0, 0, 0.3);\n stroke-dasharray: 2 3;\n}\n", ".DraggableLayout {\n display: inline-block;\n outline: none;\n}\n\n[data-dragging='true'] {\n position: absolute !important;\n z-index: 100;\n}\n\n.vuuSimpleDraggableWrapper {\n background-color: white;\n box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);\n}\n.vuuSimpleDraggableWrapper > * {\n height: 100%;\n width: 100%;\n}\n", ".vuuPlaceholder {\n flex-basis: 0;\n flex-grow: 1;\n flex-shrink: 1;\n}\n\n.vuuPlaceholder-shim {\n flex-grow: 0;\n flex-shrink: 0;\n}\n", ".Splitter {\n --splitter-size: 3px;\n --splitter-border-width: 4px;\n --splitter-border-style: none;\n --splitter-border-color: white;\n\n align-items: center;\n background-color: var(--salt-palette-neutral-secondary-separator);\n border-color: var(--splitter-border-color);\n border-style: var(--splitter-border-style);\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n position: relative;\n outline: none;\n z-index: 1;\n}\n\n.Splitter:hover {\n background-color: var(--salt-palette-neutral-primary-separator);\n}\n.active.Splitter {\n background-color: var(--salt-palette-interact-outline);\n}\n\n.Splitter.column {\n cursor: ns-resize;\n height: var(--splitter-size);\n border-width: var(--splitter-border-width) 0;\n}\n\n.Splitter:not(.column) {\n cursor: ew-resize;\n width: var(--splitter-size);\n border-width: 0 var(--splitter-border-width);\n}\n\n.Splitter:before {\n border: none;\n border-radius: 0;\n content: '';\n display: block;\n padding: 0;\n}\n\n.Splitter .grab-zone {\n position: absolute;\n background-color: rgba(255, 0, 0, 0.01);\n cursor: inherit;\n}\n\n.Splitter.column .grab-zone {\n left: 0;\n right: 0;\n top: -5px;\n bottom: -5px;\n}\n\n.Splitter:not(.column) .grab-zone {\n left: -5px;\n right: -5px;\n top: 0;\n bottom: 0;\n}\n\n.active.Splitter:not(.column) .grab-zone {\n background-color: rgba(255,255,255,.05);\n left: -150px;\n right: -150px;\n}\n\n\n.Splitter:not(.column):before {\n width: 1px;\n height: 10px;\n background: linear-gradient(\n to bottom,\n var(--grey900) 10%,\n transparent 10%,\n transparent 30%,\n var(--grey900) 30%,\n var(--grey900) 40%,\n transparent 40%,\n transparent 60%,\n var(--grey900) 60%,\n var(--grey900) 70%,\n transparent 70%,\n transparent 90%,\n var(--grey900) 90%\n );\n}\n\n.active.Splitter.column:before {\n background: linear-gradient(\n to right,\n #ffffff 10%,\n transparent 10%,\n transparent 30%,\n #ffffff 30%,\n #ffffff 40%,\n transparent 40%,\n transparent 60%,\n #ffffff 60%,\n #ffffff 70%,\n transparent 70%,\n transparent 90%,\n #ffffff 90%\n );\n}\n\n.active.Splitter:not(.column):before {\n background: linear-gradient(\n to bottom,\n #ffffff 10%,\n transparent 10%,\n transparent 30%,\n #ffffff 30%,\n #ffffff 40%,\n transparent 40%,\n transparent 60%,\n #ffffff 60%,\n #ffffff 70%,\n transparent 70%,\n transparent 90%,\n #ffffff 90%\n );\n}\n\n.Splitter.column:before {\n width: 10px;\n height: 1px;\n background: linear-gradient(\n to right,\n var(--grey900) 10%,\n transparent 10%,\n transparent 30%,\n var(--grey900) 30%,\n var(--grey900) 40%,\n transparent 40%,\n transparent 60%,\n var(--grey900) 60%,\n var(--grey900) 70%,\n transparent 70%,\n transparent 90%,\n var(--grey900) 90%\n );\n}\n", ":root {\n --hw-space-unit: 4px;\n --hw-flex-gap: 3;\n --hw-fluid-grid-col-bg: rgba(200, 200, 200, 0.3);\n}\n\n.hwFlexbox {\n background-color: var(--container1-background);\n box-sizing: border-box;\n display: flex;\n gap: calc(var(--spacing) * var(--space));\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n}\n\n.hwFlexbox-column {\n flex-direction: column;\n}\n\n.hwFlexbox-row {\n flex-direction: row;\n}\n\n.hwFlexbox > .Splitter {\n flex-basis: auto;\n flex-grow: 0;\n flex-shrink: 0;\n}\n\n.hwFlexbox.full-page {\n height: 100vh;\n width: 100vw;\n}\n\n.flex-fill {\n border-color: red;\n flex: 0;\n flex-grow: 1;\n flex-shrink: 1;\n}\n\n.vuuView.flex-fill {\n border-color: red;\n}\n", ":root {\n --hw-space-unit: 4px;\n --hw-fluid-grid-col-bg: rgba(252, 209, 232, 0.7);\n}\n\n.hwFluidGrid {\n --gap: var(--gutter-width);\n\n display: flex;\n gap: calc(var(--grid-gap) * var(--hw-space-unit));\n flex-wrap: wrap;\n padding: 0;\n}\n\n.hwFluidGrid > * {\n --gutter-width: calc(var(--hw-flex-gap) * var(--hw-space-unit));\n --gutter-count: calc(var(--parent-col-count) - 1);\n --total-gutter-width: calc(var(--gutter-count) * var(--gutter-width));\n --available-width: calc(100% - var(--total-gutter-width));\n\n flex-basis: 0;\n flex-grow: 1;\n flex-shrink: 1;\n position: relative;\n}\n\n.hwFluidGrid > *:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: dashed 2px blue;\n}\n\n.hwFluidGrid > [data-xs] {\n --internal-gutter-count: calc(var(--col-span) - 1);\n --percent-width: calc(var(--col-span) / var(--parent-col-count));\n --internal-gutter-width: calc(var(--internal-gutter-count) * var(--gutter-width));\n flex-basis: calc(var(--available-width) * var(--percent-width) + var(--internal-gutter-width));\n flex-grow: 0;\n}\n\n.hwFluidGrid > [data-xs='1'] {\n --col-span: 1;\n}\n.hwFluidGrid > [data-xs='2'] {\n --col-span: 2;\n}\n.hwFluidGrid > [data-xs='3'] {\n --col-span: 3;\n}\n\n.hwFluidGrid > [data-xs='4'] {\n --col-span: 4;\n}\n\n.hwFluidGrid > [data-xs='6'] {\n --col-span: 6;\n}\n\n.hwFluidGrid > [data-xs='8'] {\n --col-span: 8;\n}\n\n.hwFluidGrid > [data-xs='9'] {\n --col-span: 9;\n}\n.hwFluidGrid > [data-xs='10'] {\n --col-span: 10;\n}\n.hwFluidGrid > [data-xs='11'] {\n --col-span: 11;\n}\n\n.hwFluidGrid > [data-xs='12'] {\n --col-span: 12;\n}\n\n@media (min-width: 600px) {\n .hwFluidGrid > [data-sm='1'] {\n --col-span: 1;\n }\n .hwFluidGrid > [data-sm='2'] {\n --col-span: 2;\n }\n\n .hwFluidGrid > [data-sm='3'] {\n --col-span: 3;\n }\n\n .hwFluidGrid > [data-sm='4'] {\n --col-span: 4;\n }\n\n .hwFluidGrid > [data-sm='6'] {\n --col-span: 6;\n }\n\n .hwFluidGrid > [data-sm='8'] {\n --col-span: 8;\n }\n .hwFluidGrid > [data-sm='9'] {\n --col-span: 9;\n }\n .hwFluidGrid > [data-sm='10'] {\n --col-span: 10;\n }\n .hwFluidGrid > [data-sm='11'] {\n --col-span: 11;\n }\n .hwFluidGrid > [data-sm='12'] {\n --col-span: 12;\n }\n}\n\n/* Display the grid background */\n\n.hwFluidGrid-show-grid {\n --gutter-width: calc(var(--hw-flex-gap) * var(--hw-space-unit));\n --grid-gutter-count: calc(var(--grid-col-count, var(--parent-col-count)) - 1);\n --grid-total-gutter-width: calc(var(--grid-gutter-count) * var(--gutter-width));\n --grid-available-width: calc(100% - var(--grid-total-gutter-width));\n --grid-percent-width: calc(1 / var(--grid-col-count, var(--parent-col-count)));\n --column-width: calc(var(--grid-available-width) * var(--grid-percent-width));\n background: repeating-linear-gradient(\n to right,\n var(--hw-fluid-grid-col-bg) 0,\n var(--hw-fluid-grid-col-bg) var(--column-width),\n white var(--column-width),\n white calc(var(--column-width) + var(--gutter-width))\n );\n}\n", ".vuuView {\n border-color: var(--vuuView-borderColor, var(--salt-container-primary-borderColor));\n border-width: var(--vuuView-borderWidth, 1px);\n border-style: var(--vuuView-borderStyle, none);\n\n display: flex;\n flex-direction: column;\n margin: var(--vuuView-margin, 0px);\n min-height: 50px;\n min-width: 50px;\n outline: none;\n overflow: hidden;\n position: relative;\n}\n\n.vuuView.focus-visible:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: dotted cornflowerblue 2px;\n}\n\n.vuuView.dragging {\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n\n.vuuView-main {\n /* height: var(--view-content-height);\n width: var(--view-content-width); */\n display: flex;\n flex-direction: var(--vuuView-flexDirection, column);\n flex-wrap: var(--vuuView-flex-wrap, nowrap);\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n.vuuView-main > * {\n flex-basis: auto;\n flex-grow: var(--vuuView-flex-grow, 1);\n flex-shrink: var(--vuuView-flex-shrink, 1);\n}\n\n.vuuView-collapsed .vuuView-main {\n display: none;\n}\n\n.vuuView-collapsed + .Splitter {\n display: none;\n}\n\n.vuuView-collapsed .Toolbar-vertical {\n border-right: solid 1px var(--grey40);\n}\n\n.vuuView-collapsed .Toolbar-vertical .toolbar-title {\n display: none;\n}\n", ".vuuHeader {\n --saltButton-height: 24px;\n --saltButton-width: 24px;\n}\n\n.salt-density-high .vuuHeader {\n--saltToolbarField-marginTop: 0;\n}\n\n", ".vuuOverflowContainer {\n --item-gap : 4px;\n --overflow-direction: row; \n --overflow-width: 0px;\n --overflow-order: 99;\n --border-size: calc((var(--overflow-container-height) - 24px) / 2);\n background-color: var(--vuuOverflowContainer-background, black);\n height: var(--overflow-container-height);\n /* padding: 0 10px; */\n}\n\n.vuuOverflowContainer-horizontal {\n --item-align: center;\n --item-margin: 0 0 0 var(--item-gap);\n}\n.vuuOverflowContainer-vertical {\n --item-align: stretch;\n --item-margin: var(--item-gap) 0 0 0;\n --overflow-direction: column; \n \n}\n\n.vuuOverflowContainer-wrapContainer {\n align-items: var(--item-align);\n display: flex;\n flex-direction: var(--overflow-direction);\n flex-wrap: wrap;\n /* gap: 4px; */\n height: var(--overflow-container-height);\n min-width: 44px;\n overflow: hidden;\n position: relative;\n width: 100%;\n\n}\n\n.vuuOverflowContainer-wrapContainer.overflowed {\n --overflow-order: 2;\n --overflow-left: auto;\n --overflow-position: relative;\n --overflow-width: auto;\n}\n\n.vuuOverflowContainer-item:first-child {\n --item-gap: 0;\n}\n\n.vuuOverflowContainer-item:first-child {\n --item-margin: 0;\n}\n\n.vuuOverflowContainer-item {\n align-items: inherit;\n display: flex;\n order: 1;\n position: relative;\n height: var(--overflow-container-height);\n margin: var(--item-margin);\n}\n\n\n.vuuOverflowContainer-item.wrapped {\n --overflow-item-bg: #ccc;\n order: 3;\n}\n\n.vuuOverflowContainer-item:has(.vuuDraggable-dragAway){\n display: none;\n}\n\n.vuuOverflowContainer-item.vuuDropTarget-settling {\n visibility: hidden;\n}\n\n.vuuOverflowContainer-OverflowIndicator {\n align-items: center;\n background-color: transparent;\n display: flex;\n height: var(--overflow-container-height);\n height: var(--overflow-container-height);\n order: var(--overflow-order);\n overflow: hidden;\n left: var(--overflow-left, 100%);\n position: var(--overflow-position, absolute);\n width: var(--overflow-width);\n\n \n}\n\n\n", ".vuuPalette-horizontal {\n align-items: center;\n display: flex;\n}\n\n.vuuPaletteItem {\n --vuu-icon-color: var(--salt-separable-primary-borderColor);\n --vuu-icon-inset: calc(50% - 12px) auto auto -3px;\n --vuu-icon-height: 24px;\n --vuu-icon-width: 24px;\n --list-item-text-padding: 0 0 0 calc(var(--salt-size-unit) * 3);\n}\n\n.vuuPaletteItem[data-draggable]:after {\n height: 22px;\n width: 6px;\n content: \"\";\n position: absolute;\n\n background-image: \n linear-gradient(45deg, rgb(180, 183, 190) 25%, transparent 25%),\n linear-gradient(-45deg, rgb(180, 183, 190) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, rgb(180, 183, 190) 25%),\n linear-gradient(-45deg, transparent 75%, rgb(180, 183, 190) 25%);\n background-size: 4px 4px;\n background-position: 0 0, 2px 0, 2px -2px, 0 2px; \n\n}\n\n.vuuSimpleDraggableWrapper > .vuuPaletteItem {\n --vuu-icon-color: var(--salt-selectable-foreground);\n\n}", ".Tabs {\n display: flex;\n box-sizing: border-box;\n flex-direction: column;\n}\n\n.Tabs-horizontal {\n --vuu-tabs-border-style: none solid none none;\n flex-direction: row;\n}\n\n.Tabs .Toolbar:before {\n left: 0;\n width: 100%;\n bottom: 0;\n height: 1px;\n content: '';\n position: absolute;\n background: var(--grey60);\n}\n\n.vuuTabHeader {\n --saltTabs-activationIndicator-background: transparent;\n --saltToolbarField-marginTop: calc(var(--salt-size-unit) - 1px);\n border-color: var(--salt-container-primary-borderColor);\n border-style: var(--vuu-tabs-border-style, none none solid none);\n border-width: 1px;\n}\n\n.vuuTabHeader + .hwFlexbox,\n.vuuTabHeader + * {\n flex: 1;\n}\n\n.vuuTabHeader + .vuuView > .vuuHeader {\n height: 0;\n overflow: hidden;\n}\n\n.Layout-svg-button {\n --spacing-medium: 5px;\n}\n", "[data-design-mode='true'] .Component {\n filter: grayscale(100%);\n opacity: 0.4;\n}\n\n[data-design-mode='true'] .Component:after {\n color: black;\n content: 'Component';\n height: 12px;\n background-color: yellow;\n}\n\n.LayoutConfigurator {\n --margin-color: #f3cea5;\n --border-color: #fddda0;\n --padding-color: #c6d092;\n --content-color: #8cb6c0;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n background-color: var(--margin-color);\n}\n\n.LayoutConfigurator .layout-outer {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n}\n\n.LayoutBox {\n --hw-control-font-size: 13px;\n --hw-text-input-bg: rgba(255, 255, 255, 0.3);\n --hwTextInput-padding: 3px;\n --hw-text-input-position: absolute;\n --hwTextInput-width: 30px;\n\n flex: 1 1 auto;\n}\n\n.LayoutBox > .layout-top {\n flex: 0 0 40px;\n padding-left: 12px;\n display: flex;\n flex-direction: row;\n align-items: center;\n position: relative;\n}\n\n.LayoutBox > .layout-bottom {\n flex: 0 0 40px;\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.LayoutBox > .layout-inner > .layout-right,\n.LayoutBox > .layout-inner > .layout-left {\n flex: 0 0 40px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\n.layout-top,\n.layout-bottom {\n --hw-text-input-margin: 0 0 0 -15px;\n}\n\n.layout-top > .layout-input,\n.layout-bottom > .layout-input {\n left: 50%;\n}\n\n.LayoutBox > .layout-inner {\n flex: 1 1 auto;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n}\n\n.LayoutBox.layout-margin {\n background-color: var(--margin-color);\n border: dashed 2px black;\n}\n\n.LayoutBox.layout-border {\n background-color: var(--border-color);\n border: solid 2px black;\n}\n\n.LayoutBox.layout-padding {\n background-color: var(--padding-color);\n border: dashed 2px black;\n}\n\n.LayoutBox .layout-content {\n flex: 1 1 auto;\n background-color: var(--content-color);\n border: solid 2px #808080;\n}\n\n.LayoutBox .layout-title {\n color: #161616;\n font-size: 11px;\n left: 4px;\n line-height: 15px;\n position: absolute;\n top: 1px;\n}\n", ".hwLayoutTreeViewer {\n}\n\n.hwLayoutTreeNode {\n cursor: default;\n}\n\n.hwLayoutTreeNode:hover {\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n.hwLayoutTreeNode[aria-selected='true'] {\n background-color: cornflowerblue;\n color: white;\n}\n", ".vuuSaveLayoutPanel {\n background-color: aqua;\n height: 400px;\n width: 600px;\n}", ".vuuLeftNav {\n --salt-navigable-fontWeight-active: 700;\n --vuuTab-background-selected: rgba(255, 255, 255, 0.10);\n --vuuTab-hover-background: rgba(255, 255, 255, 0.10);\n --vuuTab-before-content: none;\n --vuuTab-borderRadius: 6px;\n --vuuTab-height: 40px;\n --vuuTab-padding: 0 0 0 48px;\n --vuuTabstrip-fontWeight: 700;\n --vuuTabstrip-width: 100%;\n --svg-demo: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M11.3333 11C11.52 11 11.6667 10.8533 11.6667 10.6667C11.6667 10.48 11.52 10.3333 11.3333 10.3333C11.1467 10.3333 11 10.48 11 10.6667C11 10.8533 11.1467 11 11.3333 11Z\"/><path d=\"M5.99999 8.66667C6.36818 8.66667 6.66666 8.36819 6.66666 8C6.66666 7.63181 6.36818 7.33334 5.99999 7.33334C5.63181 7.33334 5.33333 7.63181 5.33333 8C5.33333 8.36819 5.63181 8.66667 5.99999 8.66667Z\"/><path d=\"M8.66667 6C9.03486 6 9.33333 5.70152 9.33333 5.33333C9.33333 4.96514 9.03486 4.66667 8.66667 4.66667C8.29848 4.66667 8 4.96514 8 5.33333C8 5.70152 8.29848 6 8.66667 6Z\"/><path d=\"M8.66667 11.3333C9.03486 11.3333 9.33333 11.0349 9.33333 10.6667C9.33333 10.2985 9.03486 10 8.66667 10C8.29848 10 8 10.2985 8 10.6667C8 11.0349 8.29848 11.3333 8.66667 11.3333Z\"/><path d=\"M11.3333 8.33333C11.52 8.33333 11.6667 8.18666 11.6667 8C11.6667 7.81333 11.52 7.66666 11.3333 7.66666C11.1467 7.66666 11 7.81333 11 8C11 8.18666 11.1467 8.33333 11.3333 8.33333Z\"/><path d=\"M8.66667 8.66667C9.03486 8.66667 9.33333 8.36819 9.33333 8C9.33333 7.63181 9.03486 7.33334 8.66667 7.33334C8.29848 7.33334 8 7.63181 8 8C8 8.36819 8.29848 8.66667 8.66667 8.66667Z\"/><path d=\"M2 2H14V3.33333H2V2Z\"/><path d=\"M3.33333 6.33333C3.88561 6.33333 4.33333 5.88562 4.33333 5.33333C4.33333 4.78105 3.88561 4.33333 3.33333 4.33333C2.78104 4.33333 2.33333 4.78105 2.33333 5.33333C2.33333 5.88562 2.78104 6.33333 3.33333 6.33333Z\"/><path d=\"M3.33333 9C3.88561 9 4.33333 8.55228 4.33333 8C4.33333 7.44772 3.88561 7 3.33333 7C2.78104 7 2.33333 7.44772 2.33333 8C2.33333 8.55228 2.78104 9 3.33333 9Z\"/><path d=\"M3.33333 11.6667C3.88561 11.6667 4.33333 11.2189 4.33333 10.6667C4.33333 10.1144 3.88561 9.66666 3.33333 9.66666C2.78104 9.66666 2.33333 10.1144 2.33333 10.6667C2.33333 11.2189 2.78104 11.6667 3.33333 11.6667Z\"/><path d=\"M11.3333 5.66667C11.52 5.66667 11.6667 5.52 11.6667 5.33333C11.6667 5.14667 11.52 5 11.3333 5C11.1467 5 11 5.14667 11 5.33333C11 5.52 11.1467 5.66667 11.3333 5.66667Z\"/><path d=\"M5.99999 11.3333C6.36818 11.3333 6.66666 11.0349 6.66666 10.6667C6.66666 10.2985 6.36818 10 5.99999 10C5.63181 10 5.33333 10.2985 5.33333 10.6667C5.33333 11.0349 5.63181 11.3333 5.99999 11.3333Z\"/><path d=\"M5.99999 6C6.36818 6 6.66666 5.70152 6.66666 5.33333C6.66666 4.96514 6.36818 4.66667 5.99999 4.66667C5.63181 4.66667 5.33333 4.96514 5.33333 5.33333C5.33333 5.70152 5.63181 6 5.99999 6Z\"/><path d=\"M2 12.6667H14V14H2V12.6667Z\"/></svg>');\n --svg-tables: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M2 6H4.66667V3.33334H3.33333C2.6 3.33334 2 3.93334 2 4.66667V6ZM2 9.33334H4.66667V6.66667H2V9.33334ZM5.33333 9.33334H8V6.66667H5.33333V9.33334ZM8.66667 9.33334H11.3333V6.66667H8.66667V9.33334ZM5.33333 6H8V3.33334H5.33333V6ZM8.66667 3.33334V6H11.3333V3.33334H8.66667ZM12 9.33334H14.6667V6.66667H12V9.33334ZM3.33333 12.6667H4.66667V10H2V11.3333C2 12.0667 2.6 12.6667 3.33333 12.6667ZM5.33333 12.6667H8V10H5.33333V12.6667ZM8.66667 12.6667H11.3333V10H8.66667V12.6667ZM12 12.6667H13.3333C14.0667 12.6667 14.6667 12.0667 14.6667 11.3333V10H12V12.6667ZM12 3.33334V6H14.6667V4.66667C14.6667 3.93334 14.0667 3.33334 13.3333 3.33334H12Z\"/></svg>');\n --svg-templates: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M15.3333 12.6667H14L14 3.33334H15.3333L15.3333 12.6667ZM12.6667 12.6667H11.3333L11.3333 3.33334H12.6667L12.6667 12.6667ZM1.33333 12.6667L9.33333 12.6667C9.69999 12.6667 9.99999 12.3667 9.99999 12V4.00001C9.99999 3.63334 9.69999 3.33334 9.33333 3.33334L1.33333 3.33334C0.966661 3.33334 0.666661 3.63334 0.666661 4.00001L0.666661 12C0.666661 12.3667 0.966661 12.6667 1.33333 12.6667ZM1.99999 4.66667L8.66666 4.66667V11.3333L1.99999 11.3333L1.99999 4.66667Z\"/></svg>');\n --svg-layouts: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M15.3333 10H14V11.3333H15.3333V10ZM15.3333 12.6667H14V14H15.3333V12.6667ZM15.3333 7.33333H14V8.66667H15.3333V7.33333ZM10 2H8.66667V3.33333H10V2ZM15.3333 4.66667H14V6H15.3333V4.66667ZM0.666672 14H7.33334V10H0.666672V14ZM2.00001 4.66667H0.666672V6H2.00001V4.66667ZM10 12.6667H8.66667V14H10V12.6667ZM12.6667 2H11.3333V3.33333H12.6667V2ZM15.3333 2H14V3.33333H15.3333V2ZM12.6667 12.6667H11.3333V14H12.6667V12.6667ZM2.00001 7.33333H0.666672V8.66667H2.00001V7.33333ZM7.33334 2H6.00001V3.33333H7.33334V2ZM4.66667 2H3.33334V3.33333H4.66667V2ZM2.00001 2H0.666672V3.33333H2.00001V2Z\"/></svg>');\n --vuu-light-text-primary: #15171b;\n\n display: flex;\n transition: width .3s ease-in-out;\n\n}\n\n.vuuLeftNav-menu-full {\n --menu-width: var(--nav-menu-expanded-width);\n}\n\n.vuuLeftNav-menu-icons {\n --menu-width: var(--nav-menu-collapsed-width);\n}\n\n.vuuLeftNav-menu-content {\n --menu-width: var(--nav-menu-collapsed-width);\n}\n\n.vuuLeftNav-menu-content .vuuLeftNav-menu-secondary {\n display: block;\n}\n\n.vuuLeftNav-menu-primary {\n background-color: #2A015F;\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 32px 16px;\n transition: width ease .3s;\n width: var(--menu-width, 100%);\n}\n\n.vuuLeftNav-menu-secondary {\n flex: 1 1 auto;\n height: 100%;\n display: none;\n}\n\n.vuuLeftNav .vuuTabstrip {\n margin-top: 102px;\n}\n\n.vuuLeftNav .vuuTab {\n --vuuTab-focusVisible-color: pink;\n --vuu-icon-color: white;\n --vuu-icon-left: 12px;\n --vuu-icon-size: 16px;\n border-left: solid 4px transparent;\n}\n\n.vuuLeftNav .vuuTab-selected {\n --vuu-icon-color: var(--salt-navigable-indicator-active);\n border-left: solid 4px var(--salt-navigable-indicator-active);\n}\n\n.vuuLeftNav-logo {\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n}\n\n.vuuLeftNav-main {\n flex: 1 1 auto;\n}\n\n.vuuLeftNav-menu {\n color: white;\n margin-top: 102px;\n padding: 0;\n}\n\n/* .vuuLeftNav [data-icon]:after {\n transition: left ease .3s;\n} */\n\n.vuuLeftNav [data-icon='demo'] {\n --vuu-icon-svg: var(--svg-demo);\n }\n.vuuLeftNav [data-icon='tables'] {\n --vuu-icon-svg: var(--svg-tables);\n }\n.vuuLeftNav [data-icon='templates'] {\n --vuu-icon-svg: var(--svg-templates);\n }\n.vuuLeftNav [data-icon='layouts'] {\n --vuu-icon-svg: var(--svg-layouts);\n}\n\n\n@container (max-width: 100px) {\n .vuuTab {\n /* --vuu-icon-left: 12px !important; */\n --vuuTab-padding: 0 0 0 42px;\n }\n .vuuTab-main {\n display: none !important;\n }\n}\n\n.vuuLeftNav-buttonBar {\n align-items: center;\n display: flex;\n flex: 0 0 100px;\n justify-content: center;;\n}\n\n.vuuLeftNav-toggleButton {\n --vuu-icon-color: var(--vuu-light-text-primary);\n --vuu-icon-left: 11px;\n --vuu-icon-top: 10px;\n --vuu-icon-size: 16px;\n background-color: var(--salt-navigable-indicator-active);\n border-width: 0;\n border-radius: 18px;\n height: 36px;\n position: relative;\n width: 36px\n}\n\n.vuuLeftNav-toggleButton-open {\n --vuu-icon-left: 9px;\n\n}", ".vuuLoginPanel {\n --hwTextInput-border: solid 1px #ccc;\n --hwTextInput-height: 28px;\n --hwTextInput-padding: 0 12px;\n --hwTextInput-width: 100%;\n --login-row-height: 60px;\n align-content: center;\n align-items: center;\n border: solid 1px lightgray;\n display: flex;\n flex-direction: column;\n gap: 24px;\n justify-content: center;\n justify-items: center;\n margin: 0 auto;\n padding: 48px 48px 24px 48px;\n width: fit-content;\n}\n\n.vuuLoginPanel-login {\n grid-column: 2/3;\n align-self: end;\n justify-self: end;\n}\n", ".vuuSessionEditingForm {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 400px;\n padding: 6px;\n}\n\n.vuuSessionEditingForm-content {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 3px;\n overflow: auto;\n}\n\n.vuuSessionEditingForm-field {\n align-items: center;\n display: flex;\n height: 32px;\n}\n\n.vuuSessionEditingForm-fieldLabel {\n flex: 0 0 50%;\n}\n\n.vuuSessionEditingForm-fieldValue {\n max-width: 50%;\n}\n\n.vuuSessionEditingForm-fieldValue.vuuReadOnly {\n font-weight: var(--salt-text-label-fontWeight-strong);\n}\n\n.vuuSessionEditingForm-buttonbar {\n align-items: center;\n border-top: solid 1px var(--salt-container-primary-borderColor);\n display: flex;\n justify-content: flex-end;\n flex: 0 0 autox;\n gap: 6px;\n padding-top: 6px;\n}\n\n.vuuSessionEditingForm-errorBanner {\n --vuu-icon-left: 3px;\n --vuu-icon-size: 18px;\n --vuu-icon-top: 3px;\n border: solid 1px var(--salt-status-error-borderColor);\n line-height: 24px;\n padding: 0 6px 0 26px;\n position: relative;\n}", ".vuuUserPanel {\n background-color: white;\n display: flex;\n flex-direction: column;\n max-height: 400px;\n padding: 12px;\n}\n\nvuuUserPanel-history {\n flex: 1 1 auto;\n}\n\n.vuuUserPanel-buttonBar {\n --saltButton-width: 100%;\n align-items: flex-end;\n border-top: 1px solid var(--surface3);\n display: flex;\n flex: 0 0 32px;\n justify-content: flex-start;\n}\n\n.btn-logout {\n --hwButton-icon-left: 12px;\n --hwButton-padding: 0 6px 0 24px;\n padding-left: 24px;\n}\n", ".vuuUserProfile {\n --svg-icon: var(--svg-user);\n}\n", "\n.vuuThemeSwitch {\n --saltButton-minWidth: 22px;\n --svg-light: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z\"/></svg>');\n --svg-dark: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z\"/></svg>');\n padding: 2px;\n}\n\n.salt-density-high .vuuThemeSwitch {\n --saltButton-minWidth: 16px;\n --saltButton-width: 18px;\n --vuuThemeSwitch-iconSize: 16px;\n}\n\n.vuuThemeSwitch [data-icon] {\n --vuu-icon-size: var(--vuuThemeSwitch-iconSize,18px);\n}\n\n.vuuThemeSwitch [data-icon='light'] {\n --vuu-icon-svg: var(--svg-light);\n}\n.vuuThemeSwitch [data-icon='dark'] {\n --vuu-icon-svg: var(--svg-dark);\n}\n\n.vuuThemeSwitch .saltToggleButton {\n height: 20px;\n width: 20px;\n}\n\n", ".vuuAppHeader {\n align-items: center;\n border-bottom: solid 1px var(--salt-container-secondary-borderColor);\n display: flex;\n height: 40px;\n justify-content: flex-end;\n}\n\n.vuu-theme .vuuAppHeader {\n border-radius: 8px;\n border: 1px solid #D6D7DA; \n height: 44px;\n margin-bottom: 8px;\n}", ".vuuContextPanel {\n position: relative;\n transition: width .3s ease-in-out;\n width: var(--vuu-side-panel-width, 0px) !important;\n z-index: 1;\n}\n\n.vuuContextPanel-expanded {\n --vuu-side-panel-width: 300px !important;\n --vuu-side-panel-shadow: -4px 4px 4px rgba(0, 0, 0, 0.1);\n --vuu-side-panel-padding: 24px;\n}\n\n.vuuContextPanel-overlay {\n width: 0px !important;\n}\n\n.vuuContextPanel-inner {\n background-color: var(--salt-container-primary-background);\n box-shadow: var(--vuu-side-panel-shadow, none);\n height: 100%;\n padding-bottom: 24px;\n padding-top: 24px;\n padding-left: var(--vuu-side-panel-padding, 0);\n padding-right: var(--vuu-side-panel-padding, 0);\n position: absolute;\n right: 0;\n top:0;\n transition-property: padding-left, padding-right, width;\n transition-duration: .3s;\n transition-timing-function: ease-in-out;\n width: var(--vuu-side-panel-width, 0px);\n\n}\n\n.vuuContextPanel-header {\n align-items: center;\n display: flex;\n flex-wrap: nowrap;\n height: 27px;\n justify-content: space-between;\n}\n\n.vuuContextPanel-title {\n font-size: 20px;\n font-weight: 700;\n white-space: nowrap;\n}", ".vuuShell {\n background-color: var(--salt-container-primary-background, ivory);\n height: var(--vuuShell-height, 100vh);\n width: var(--vuuShell-width, 100vw);\n}\n\n.vuuShell-palette {\n --vuuView-border: none;\n --vuuView-margin: 0;\n}\n\n.vuuShell-warningPlaceholder {\n background-color: var(--salt-container-background-high);\n height: 100%;\n}\n", ".vuuDialog {\n background: var(--salt-container-primary-background);\n border: var(--vuuDialog-border, solid 1px #ccc);\n border-radius: 5px;\n padding: var(--vuuDialog-padding, 0);\n box-shadow: var(--salt-overlayable-shadow, none);\n height: var(--vuuDialog-height, fit-content);\n width: var(--vuuDialog-width, fit-content);\n}\n\n.vuuDialog-header {\n --saltButton-height: 28px;\n --saltButton-width: 28px;\n\n --saltToolbar-background: transparent;\n --saltToolbar-height: calc(var(--salt-size-base) + 5px);\n border-bottom: solid 1px var(--salt-container-primary-borderColor);\n}\n\n.vuuDialog-header > .Responsive-inner {\n align-items: center;\n}\n\n.vuuDialog-header > .Responsive-inner > :last-child{\n right: 2px;\n}\n\n\n", ".vuuMenuList {\n --context-menu-color: var(--vuuMenuList-color,#161616);\n --context-menu-padding: var(--hw-list-item-padding, 0 6px);\n --context-menu-shadow: var(--hw-dialog-shadow, 0 6px 12px rgba(0, 0, 0, 0.175));\n --focus-visible-border-color: var(--hw-focus-visible-border-color, rgb(141, 154, 179));\n --context-menu-highlight-bg: #a4d5f4;\n --context-menu-blur-focus-bg: #e0e4e9;\n --menu-item-icon-color: black;\n --menu-item-twisty-color: black;\n --menu-item-twisty-content: '';\n --menu-item-twisty-top: 50%;\n --menu-item-twisty-left: auto;\n --menu-item-twisty-right: 0px;\n --menu-icon-size: 12px;\n\n background-clip: padding-box;\n background-color: white;\n border-radius: 4px;\n border: solid 1px var(--vuuMenuList-borderColor, rgba(0, 0, 0, 0.15));\n box-shadow: var(--context-menu-shadow);\n font-size: var(--vuuMenuList-fontSize, var(--salt-text-label-fontSize));\n font-weight: var(--salt-typography-fontWeight-semiBold);\n list-style: none;\n margin: 2px 0 0;\n outline: 0;\n overflow: hidden;\n padding: var(--vuuMenuList-padding, 0);\n position: absolute;\n}\n\n.vuuMenuItem {\n align-items: center;\n border-width: 1px;\n border-color: var(--vuuMenuItem-borderColor, transparent);\n border-style: var(--vuuMenuItem-borderStyle, none);\n color: var(--context-menu-color);\n display: flex;\n gap: 6px;\n height: var(--vuuMenuItem-height, var(--hw-list-item-height, 24px));\n padding: var(--context-menu-padding);\n padding-right: 24px;\n position: relative;\n white-space: nowrap;\n}\n\n.vuuIconContainer {\n display: inline-block;\n flex: 12px 0 0;\n height: var(--menu-icon-size);\n mask-repeat: no-repeat;\n width: var(--menu-icon-size);\n}\n\n.vuuMenuItem[aria-expanded='true'] {\n background-color: var(--context-menu-blur-focus-bg);\n}\n\n.vuuMenuItem-separator {\n border-top: solid 1px var(--context-menu-blur-focus-bg);\n}\n\n.vuuMenuItem[aria-haspopup='true']:after {\n content: var(--menu-item-twisty-content);\n -webkit-mask: var(--vuu-svg-chevron-right) center center/8px 8px no-repeat;\n mask: var(---vuu-svg-chevron-right) center center/8px 8px no-repeat;\n background-color: var(--menu-item-twisty-color);\n height: 16px;\n left: var(--menu-item-twisty-left);\n right: var(--menu-item-twisty-right);\n margin-top: -8px;\n position: absolute;\n top: var(--menu-item-twisty-top);\n transition: transform 0.3s;\n width: 16px;\n}\n\n.vuuMenuItem[data-highlighted] {\n background-color: var(--context-menu-highlight-bg);\n}\n\n.vuuMenuItem:hover {\n background-color: var(--context-menu-highlight-bg);\n cursor: default;\n}\n\n.vuuMenuList-childMenuShowing .vuuMenuItem[data-highlighted] {\n background-color: var(--context-menu-blur-focus-bg);\n}\n\n.vuuMenuItem.focusVisible:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0px;\n border: dotted var(--focus-visible-border-color) 2px;\n}\n\n.vuuPopupContainer.top-bottom-right-right .popup-menu {\n left: auto;\n right: 0;\n}\n\n.popup-menu .menu-item.showing > button,\n.popup-menu .menu-item > button:focus,\n.popup-menu .menu-item > button:hover {\n text-decoration: none;\n color: rgb(0, 0, 0);\n background-color: rgb(220, 220, 220);\n}\n.vuuMenuItem-button:active,\n.vuuMenuItem-button:hover {\n outline: 0;\n}\n\n.popup-menu .menu-item.disabled > button {\n clear: both;\n font-weight: normal;\n line-height: 1.5;\n color: rgb(120, 120, 120);\n white-space: nowrap;\n text-decoration: none;\n cursor: default;\n}\n", ".vuuPopup {\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n overflow: visible;\n z-index: 1000;\n}\n\n.vuuPopup {\n position: absolute;\n}\n", ".vuuPopupMenu {\n --saltButton-height: 24px;\n --saltButton-width: 24px;\n --vuu-icon-color: #606477;\n --vuu-icon-height: 20px;\n --vuu-icon-left: 2px;\n --vuu-icon-size: 16px;\n --vuu-icon-top: 2px;\n --vuu-icon-width: 20px;\n\n background: var(--vuuPopupMenu-background, transparent);\n border-radius: 4px;\n cursor: pointer;\n display: inline-block;\n margin-top: 2px;\n padding: 2px;\n}\n\n.vuuPopupMenu:hover {\n /* --vuu-icon-color: #15171B; */\n --vuu-icon-color: var(--saltButton-text-color-hover);\n}\n\n.vuuPopupMenu-open {\n --saltButton-background: var(--salt-actionable-secondary-background-active);\n --vuu-icon-color: white;\n}\n\n/* temp references to theme until new theme fully incorporated */\n.vuu-theme .vuuPopupMenu:hover {\n --saltButton-background-hover: #F37880;\n}\n\n.vuu-theme .vuuPopupMenu-open {\n --saltButton-background: #6D18BD;\n}", ".vuuDraggable {\n background: transparent;\n box-shadow: var(--salt-overlayable-shadow-drag);\n cursor: var(--salt-draggable-grab-cursor-active);\n position: absolute;\n opacity: .95;\n z-index: 2000;\n}\n\n.vuuDraggable-spacer {\n display: var(--saltDraggable-display, inline-block);\n height: var(--saltDraggable-spacer-height, var(--tabstrip-height));\n transition: var(--saltDraggable-transitionProp, width) 0.3s ease;\n width: var(--saltDraggable-spacer-width, 0);\n}\n\n.vuuDraggable-dropIndicatorPosition {\n display: var(--saltDraggable-display, inline-block);\n /* height: var(--saltDraggable-spacer-height, var(--tabstrip-height)); */\n /* width: var(--saltDraggable-spacer-width, 0); */\n height: 0px;\n width: 100%;\n}\n\n.vuuDraggable-dropIndicatorContainer {\n transition: var(--saltDraggable-transitionProp, top) 0.2s ease;\n}\n\n.vuuDraggable-dropIndicator {\n /* height: var(--saltDraggable-spacer-height, var(--tabstrip-height)); */\n /* width: var(--saltDraggable-spacer-width, 0); */\n background-color: var(--salt-palette-accent-background);\n height: 2px;\n width: 100%;\n}\n\n.vuuDraggable-dropIndicator:before {\n content: '';\n width: 6px;\n height: 6px;\n border-radius: 3px;\n background-color: var(--salt-palette-accent-background);\n position: absolute;\n top: -2px;\n left: -3px;\n}\n\n.vuuDraggable-settling {\n transition-property: left, top;\n transition-duration: .15s;\n transition-timing-function: ease-out;\n}\n\n.vuuDraggable-spacer {\n order: 1;\n}", ".vuuEditableLabel {\n --saltInput-background: transparent;\n --saltInput-minWidth: 14px;\n --saltInput-position: absolute;\n --editableLabel-padding: var(--saltEditableLabel-padding, 6px);\n --editableLabel-height: var(--saltEditableLabel-height, 26px);\n color: inherit;\n cursor: default;\n display: flex;\n flex-direction: column;\n font-size: var(--salt-text-fontSize);\n height: var(--editableLabel-height);\n justify-content: center;\n outline: none;\n padding: 0 var(--editableLabel-padding);\n position: relative;\n z-index: var(--salt-zIndex-default);\n}\n\n.vuuEditableLabel:before {\n content: attr(data-text);\n display: block;\n height: 0px;\n visibility: hidden;\n white-space: pre-wrap;\n}\n\n.vuuEditableLabel .saltInput {\n font-weight: var(--salt-text-fontWeight);\n left: var(--editableLabel-padding, 0);\n padding: 0;\n outline-style: none;\n position: absolute;\n right: var(--editableLabel-padding, 0);\n top: var(--saltEditableLabel-top, 2px);\n width: auto;\n}\n\n.vuuEditableLabel .saltInput-activationIndicator {\n display: none;\n}\n\n.vuuEditableLabel-input {\n background-color: transparent;\n border: none;\n box-sizing: content-box;\n display: block;\n flex: 1;\n font: inherit;\n height: 20px;\n margin:0;\n min-width:0;\n outline: none;\n padding: 0;\n}\n", "/* Component class applied to the root element */\n.vuuTabstrip {\n --vuuOverflowContainer-background: transparent;\n /* --tabstrip-height: var(--vuuTabstrip-height, var(--salt-size-stackable)); */\n --tabstrip-dragging-display: none;\n --tabstrip-display: inline-flex;\n --tabstrip-background: transparent;\n\n align-self: var(--saltTabs-tabstrip-alignSelf, stretch);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--vuuTabstrip-fontWeight, var(--salt-text-fontWeight));\n position: relative;\n overflow: visible;\n display: flex;\n min-width: 28px;\n width: var(--tabstrip-width);\n}\n\n/* Tabstrip orientation is horizontal */\n.vuuTabstrip-horizontal {\n --tabstrip-height: var(--vuuTabstrip-height, 28px);\n --tabstrip-width: var(--vuuTabstrip-width, 100%);\n --tab-width: auto;\n --tab-thumb-height: 2px;\n --tab-thumb-left: var(--tab-thumb-offset, 0);\n --tab-thumb-top: auto;\n --tab-thumb-width: var(--tab-thumb-size, 100%);\n align-items: flex-start;\n border-bottom: var(--vuuTabstrip-borderBottom, solid 1px var(--salt-container-primary-borderColor));\n}\n\n/* Tabstrip orientation is vertical */\n.vuuTabstrip-vertical {\n --tabstrip-height: var(--vuuTabstrip-height, 100%);\n --tabstrip-width: var(--vuuTabstrip-width, 100px);\n --tab-width: 100%;\n --tab-thumb-height: var(--tab-thumb-size, 100%);\n --tab-thumb-left: 0;\n --tab-thumb-top: var(--tab-thumb-offset, 0);\n --tab-thumb-width: 2px;\n\n align-self: flex-start;\n display: inline-flex;\n}\n\n.vuuTabstrip-draggingTab .vuuTab {\n pointer-events: none;\n}\n\n.vuuTabstrip-addTabButton {\n --saltButton-height: 20px;\n --saltButton-width: 20px;\n}\n\n.vuuTabstrip-overflowMenu.saltDropdown {\n --saltIcon-margin: 2px 0 0 0px;\n}\n\n.vuuTabstrip-overflowMenu-open {\n --saltButton-background: var(--salt-actionable-secondary-background-active);\n --saltButton-text-color: var(--salt-actionable-secondary-text-color-active);\n}\n\n.vuuTabstrip-overflowMenu-open .saltButton {\n --saltIcon-color: var(--salt-actionable-secondary-foreground-active);\n}\n\n.vuuTabstrip-inner {\n width: 100%;\n align-items: center;\n display: flex;\n flex-basis: auto;\n flex-grow: 0;\n flex-shrink: 1;\n flex-wrap: wrap;\n justify-content: flex-start;\n line-height: var(--tabstrip-height);\n}\n\n.vuuTabstrip-vertical .vuuTabstrip-inner {\n flex-direction: column;\n height: auto;\n}\n\n.vuuTabstrip-centered .vuuTabstrip-inner {\n justify-content: center;\n}\n\n/* Styling applied to Draggable wrapper when used to drag a Tab */\n.vuuDraggable[class*=\"vuuTabstrip\"] {\n --tabstrip-display: flex;\n --tabstrip-height: 100%;\n --tabstrip-dragging-display: block;\n\n --tabs-tab-background: var(--salt-navigable-primary-background-hover);\n --tabs-tab-before-content: \"\";\n --tabs-tab-before-background: var(--salt-navigable-indicator-hover);\n --tabs-tab-before-height: var(--tab-activationIndicator-thumb-height);\n --tabs-tab-before-inset: var(--tab-activationIndicator-inset);\n --tabs-tab-before-width: var(--tab-activationIndicator-thumb-width);\n --tabs-tab-cursor: var(--salt-draggable-grab-cursor-active);\n --tabs-tab-position: static;\n\n font-size: 12px;\n}\n\n.vuuDraggable-tabstrip-horizontal {\n --tab-thumb-height: 2px;\n --tabstrip-height: 28px;\n\n line-height: var(--tabstrip-height);\n}\n\n\n.vuuDraggable[class*=\"tabstrip\"] .vuuTab[aria-selected=\"true\"]:before {\n --tabs-tab-before-background: var(--salt-navigable-indicator-active);\n}\n\n/* [data-overflowed] {\n order: 99;\n visibility: hidden;\n} */\n\n.vuuTabstrip-overflowMenu-dropTarget:after {\n background: var(--salt-selectable-background-selected);\n content: \"\";\n position: absolute;\n height: 2px;\n left: 0;\n right: 0;\n bottom: 0;\n}\n", ".vuuTabMenu {\n top: -2px;\n}", "/* Class applied to root Tab element */\n.vuuTab {\n --saltEditableLabel-padding: 0;\n --saltEditableLabel-height: var(--tabstrip-height);\n --saltInputLegacy-minWidth: 4em;\n --saltEditableLabel-top: 3px;\n\n --tab-background: var(--vuuTab-background, var(--salt-navigable-primary-background));\n --tab-cursor: pointer;\n --tab-position: relative;\n}\n\n.vuuTab {\n align-items: center;\n align-self: stretch;\n background: var(--tab-background);\n border: none;\n border-radius: var(--vuuTab-borderRadius, 0);\n color: var(--salt-text-primary-foreground);\n cursor: var(--vuuTab-cursor, var(--tab-cursor));\n display: var(--tabstrip-display);\n gap: 8px;\n height: var(--vuuTab-height, var(--tabstrip-height));\n letter-spacing: var(--vuuTab-letterSpacing, var(--tab-letterSpacing, 0));\n min-width: var(--vuuTab-minWidth, 40px);\n outline: none;\n padding: var(--vuuTab-padding, 0 24px);\n position: var(--vuuTab-position, var(--tab-position));\n user-select: none;\n width: var(--tab-width)\n}\n\n/* Overrides characteristic used in saltFocusVisible */\n/* .vuuTab.saltFocusVisible:after {\n inset: 2px 2px 4px 2px;\n} */\n\n.vuuTab {\n margin: 0 var(--tab-spacing) 0 0;\n}\n\n.vuuTab-selected {\n background: var(--vuuTab-background-selected, var(--tab-background));\n color: var(--salt-text-primary-foreground);\n font-weight: var(--salt-navigable-fontWeight-active);\n}\n\n/* main content aria of Tab */\n.vuuTab-main {\n align-items: center;;\n border: none;\n color: inherit;\n cursor: inherit;\n display: flex;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n height: var(--vuuTabstrip-height, var(--salt-size-stackable));\n outline: none;\n position: relative;\n}\n\n.vuuTab-closeable .vuuTab-main {\n border-right: solid transparent var(--salt-size-unit);\n}\n\n.vuuTab .vuuTab-closeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* the close Button on a closeable Tab*/\n.vuuTab-close-icon {\n display: none;\n}\n\n.salt-density-touch .vuuTab-close-icon,\n.salt-density-low .vuuTab-close-icon {\n display: block;\n}\n\n.salt-density-touch .vuuTab-close-icon-small,\n.salt-density-low .vuuTab-close-icon-small {\n display: none;\n}\n\n.vuuTab .vuuTab-text {\n display: inline-block;\n position: relative;\n overflow: hidden;\n text-align: var(--salt-text-textAlign-embedded);\n text-overflow: ellipsis;\n top: var(--vuuTab-top, var(--tab-top, auto));\n white-space: nowrap;\n /* ensure content sits above focus ring */\n z-index: var(--salt-zIndex-default);\n}\n\n.vuuTab .vuuTab-text:before {\n height: 0;\n content: attr(data-text);\n display: block;\n visibility: hidden;\n font-weight: var(--salt-navigable-fontWeight-active);\n}\n\n/* FIXME: these are all focusVisible styles, but with a bespoke inset */\n.vuuTab-editing:after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 2px;\n outline-color: var(--salt-focused-outlineColor);\n outline-style: var(--salt-focused-outlineStyle);\n outline-width: var(--salt-focused-outlineWidth);\n outline-offset: -2px;\n}\n\n.vuuTab.vuuFocusVisible {\n background: var(--vuuTab-hover-background, var(--salt-navigable-primary-background-hover));\n outline-color: var(--vuuTab-focusVisible-color, var(--salt-focused-outlineColor));\n outline-style: dashed;\n outline-width: 1px;\n outline-offset: -1px;\n}\n\n.vuuTab:before {\n content: var(--tab-before-content, none);\n content: \"\";\n background: var(--tab-before-background);\n height: var(--tab-before-height);\n inset: var(--tab-before-inset);\n position: absolute;\n width: var(--tab-before-width);\n z-index: 1;\n}\n\n.vuuTabstrip-draggingTab .vuuTab-selected:before {\n --tab-before-content: \"\";\n --tab-before-background: var(--salt-navigable-indicator-color-active);\n --tab-before-height: var(--tab-thumb-height);\n --tab-before-inset: var(--tab-activationIndicator-inset);\n --tab-before-width: var(--tab-activationIndicator-thumb-width);\n}\n\n/* .vuuDraggable .vuuTab:before,\n.vuuTab:not(.vuuTab-selected).saltFocusVisible:before,\n.vuuTab:hover:not(.vuuTab-selected):before {\n --tab-before-content: \"\";\n --tab-before-background: var(--salt-navigable-indicator-hover);\n --tab-before-height: var(--tab-thumb-height);\n --tab-before-inset: var(--tab-activationIndicator-inset);\n --tab-before-width: var(--tab-activationIndicator-thumb-width);\n} */\n\n.vuuTab-selected:before {\n --tab-before-content: \"\";\n background: var(--salt-navigable-indicator-active);\n height: var(--tab-thumb-height);\n position: absolute;\n left: var(--tab-thumb-left);\n bottom: 0px; \n top: var(--tab-thumb-top, auto);\n transition: var(--tab-thumb-transition, none);\n width: var(--tab-thumb-width, 100%);\n}\n\n.vuuTab:hover:not(.vuuTab-closeHover) {\n background: var(--vuuTab-hover-background, var(--salt-navigable-primary-background-hover));\n}\n\n/* .vuuTabstrip.vuuTabThumb-noTransition .vuuTab-selected:before {\n transition: none; \n} */", ".vuuTree {\n --tree-node-collapse: var(--vuuTree-toggle-collapse, var(--svg-tree-node-collapse));\n --tree-node-expand: var(--vuuTree-toggle-expand, var(--svg-tree-node-expand));\n --tree-toggle-width: 12px;\n --tree-icon-color: var(--vuuTree-icon-color, #4c505b);\n --tree-node-expanded-transform: var(--vuuTree-node-expanded-transform, none);\n --tree-node-indent: 0px;\n\n --list-hilited-bg: var(--hw-list-hilited-bg, rgba(0, 0, 0, 0.1));\n --list-item-height: var(--hw-list-item-height, 30px);\n --list-item-padding: var(--hw-list-item-padding, 0 6px);\n --list-item-header-bg: var(--hw-list-item-header-bg, black);\n --list-item-header-color: var(--hw-list-item-header-color, white);\n --list-item-header-font-weight: bold;\n --list-item-header-twisty-color: black;\n --list-item-header-twisty-content: '';\n --list-item-header-twisty-top: 50%;\n --list-item-header-twisty-left: -18px;\n --list-item-header-twisty-right: auto;\n --list-item-selected-bg: var(--hw-list-selected-bg, #1ea7fd);\n --list-item-selected-color: white;\n --list-item-text-color: var(--hw-gray-800);\n --focus-visible-border-color: var(--hw-focus-visible-border-color, rgb(141, 154, 179));\n\n list-style: none;\n margin: 0;\n padding: 0 1px;\n font-size: var(--vuuTree-font-size, 14px);\n max-height: inherit;\n outline: none;\n overflow-y: auto;\n position: relative;\n user-select: none;\n}\n\n.vuuTree-viewport {\n --list-item-height: 30px;\n box-sizing: border-box;\n max-height: inherit;\n overflow: auto;\n}\n\n.vuuTree-scrollingContentContainer {\n box-sizing: inherit;\n position: relative;\n}\n\n.vuuTree-scrollingContentContainer .vuuTreeNode {\n line-height: 30px;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n will-change: transform;\n}\n\n.vuuTreeNode {\n list-style: none;\n}\n\n/* Leaf node or the div child of a collapsible node */\n.vuuTreeNode:not([aria-expanded]),\n.vuuTreeNode[aria-expanded] > .vuuTreeNode-label {\n --checkbox-border-color: black;\n --checkbox-border-width: 1px;\n --checkbox-tick: black;\n --list-item-padding-left: 6px;\n --svg-toggle: var(--tree-node-collapse);\n\n align-items: center;\n color: var(--list-item-text-color);\n display: flex;\n flex-wrap: nowrap;\n height: var(--list-item-height);\n line-height: var(--list-item-height);\n padding: var(--list-item-padding);\n padding-left: var(--padding-left);\n position: relative;\n cursor: default;\n margin: 0;\n white-space: nowrap;\n}\n\n.vuuTreeNode:not([aria-expanded]) {\n --padding-left: calc(\n var(--list-item-padding-left) + var(--tree-toggle-width) + var(--tree-node-indent)\n );\n}\n\n.vuuTreeNode[aria-expanded] > .vuuTreeNode-label {\n --padding-left: calc(\n var(--list-item-padding-left) + var(--tree-toggle-width) + var(--tree-node-indent)\n );\n}\n\n.vuuTreeNode-icon {\n background-color: var(--tree-icon-color);\n display: inline-block;\n height: 18px;\n margin-right: 6px;\n -webkit-mask: var(--vuu-icon-svg) center center/12px 12px no-repeat;\n mask: var(--vuu-icon-svg) center center/12px 12px no-repeat;\n flex: 0 0 18px;\n}\n\n.vuuTreeNode[aria-expanded] {\n flex-direction: column;\n}\n\n.vuuTreeNode[aria-expanded] {\n flex-direction: column;\n height: auto;\n}\n\n.vuuTreeNode > *[role='group'] {\n padding-left: 0px;\n}\n\n.vuuTreeNode {\n padding-left: calc(var(--padding-left) + var(--tree-node-indent));\n}\n\n.vuuTreeNode[aria-level='2'] {\n --tree-node-indent: 12px;\n}\n.vuuTreeNode[aria-level='3'] {\n --tree-node-indent: 24px;\n}\n.vuuTreeNode[aria-level='4'] {\n --tree-node-indent: 36px;\n}\n\n.vuuTreeNode:not(.focusVisible):not(.hwListItemHeader):not([aria-expanded])[data-highlighted],\n.vuuTreeNode:not(.focusVisible):not(.hwListItemHeader)[aria-expanded][data-highlighted]\n > div:first-child {\n background-color: var(--list-hilited-bg);\n}\n\n.vuuTreeNode-toggle {\n cursor: pointer;\n}\n\n.vuuTreeNode > .vuuTreeNode-toggle {\n display: inline-block;\n height: 100%;\n left: 0;\n position: absolute;\n width: calc(var(--list-item-padding-left) + var(--tree-toggle-width));\n}\n\n.vuuTreeNode[aria-expanded] > .vuuTreeNode-label:after {\n content: var(--list-item-header-twisty-content);\n -webkit-mask: var(--svg-toggle) center center/8px 8px no-repeat;\n mask: var(--svg-toggle) center center/8px 8px no-repeat;\n background-color: var(--list-item-header-twisty-color);\n height: 18px;\n margin-top: -9px;\n left: var(--tree-node-indent);\n position: absolute;\n top: var(--list-item-header-twisty-top);\n transition: transform 0.3s;\n width: 18px;\n}\n\n.vuuTreeNode[aria-selected='true'] {\n --list-item-header-twisty-color: var(--list-item-selected-color);\n}\n\n\n.vuuTreeNode:not(.focusVisible):focus {\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.vuuTreeNode:not([aria-expanded]).focusVisible:before,\n.vuuTreeNode[aria-expanded].focusVisible > div:first-child:before {\n content: '';\n position: absolute;\n top: 0px;\n left: var(--tree-focus-offset, 0px);\n right: 0;\n bottom: 0px;\n border: dotted var(--focus-visible-border-color) 2px;\n background-color: var(--list-hilited-bg);\n}\n\n\n.vuuTreeNode[aria-expanded='false'] > *:first-child:after {\n --svg-toggle: var(--tree-node-expand);\n}\n\n.vuuTreeNode[aria-expanded='true'] > *:first-child:after {\n transform: var(--tree-node-expanded-transform);\n}\n\n/* Selection */\n\n.vuuTree:not(.checkbox-only) .vuuTreeNode:not([aria-expanded])[aria-selected='true'],\n.vuuTree:not(.checkbox-only) .vuuTreeNode[aria-expanded][aria-selected='true'] > div:first-child {\n --checkbox-border-color: var(--list-item-selected-color);\n --checkbox-tick: var(--list-item-selected-color);\n --focus-visible-border-color: var(--list-item-selected-color);\n background-color: var(--list-item-selected-bg);\n color: var(--list-item-selected-color);\n}\n\n.with-checkbox .vuuTreeNode {\n padding-left: 28px;\n}\n\n.with-checkbox .vuuTreeNode:before {\n border-style: solid;\n border-width: var(--checkbox-border-width);\n border-color: var(--checkbox-border-color);\n content: '';\n height: 12px;\n left: 3px;\n margin-top: -7px;\n position: absolute;\n top: 50%;\n width: 12px;\n}\n", ".vuuFilterPillMenu {\n top: -2px;\n}", ".vuuFilterPill {\n align-items: center;\n border: solid 1px var(--salt-taggable-foreground);\n border-radius: 26px;\n display: flex;\n height: 26px;\n padding: 0 8px;\n position: relative;\n}", "\n.vuuFilterBar {\n --vuu-svg-tune: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 18C3 18.55 3.45 19 4 19H9V17H4C3.45 17 3 17.45 3 18ZM3 6C3 6.55 3.45 7 4 7H13V5H4C3.45 5 3 5.45 3 6ZM13 20V19H20C20.55 19 21 18.55 21 18C21 17.45 20.55 17 20 17H13V16C13 15.45 12.55 15 12 15C11.45 15 11 15.45 11 16V20C11 20.55 11.45 21 12 21C12.55 21 13 20.55 13 20ZM7 10V11H4C3.45 11 3 11.45 3 12C3 12.55 3.45 13 4 13H7V14C7 14.55 7.45 15 8 15C8.55 15 9 14.55 9 14V10C9 9.45 8.55 9 8 9C7.45 9 7 9.45 7 10ZM21 12C21 11.45 20.55 11 20 11H11V13H20C20.55 13 21 12.55 21 12ZM16 9C16.55 9 17 8.55 17 8V7H20C20.55 7 21 6.55 21 6C21 5.45 20.55 5 20 5H17V4C17 3.45 16.55 3 16 3C15.45 3 15 3.45 15 4V8C15 8.55 15.45 9 16 9Z\" /></svg>');\n\n --saltButton-height: 26px;\n --saltButton-width: 26px;\n\n align-items: center;\n background-color: var(--salt-container-secondary-background);\n border-bottom: solid 1px #D6D7DA;\n display: flex;\n gap: 4px;\n height: 33px;\n padding: 4px 8px;\n}\n\n.vuuFilterbar-icon {\n display: inline-block;\n height: 16px;\n width: 16px;\n}\n\n.vuuFilterBar [data-icon='tune']{\n --vuu-icon-size: 16px;\n --vuu-icon-svg: var(--vuu-svg-tune);\n}\n\n.vuuFilterBar [data-icon='plus']{\n --vuu-icon-size: 16px;\n}", ".vuuExpandoCombobox {\n --expando-combobox-height: var(--vuuExpandoCombobox-height, 24px);\n --expando-combobox-fontSize: var(--vuuExpandoCombobox-fontSizew, 12px);\n\n --saltInputLegacy-focused-outlineStyle: none;\n --saltInputLegacy-fontSize: var(--expando-combobox-fontSize);\n --saltInputLegacy-height: var(--expando-combobox-height);\n --saltInputLegacy-minWidth: 14px;\n --saltInputLegacy-position: absolute;\n\n background-color: rgba(255,0,0,.2);\n display: inline-flex;\n flex-direction: column;\n height: var(--expando-combobox-height);\n min-width: 32px;\n padding: 0 6px;\n\n}\n\n.vuuExpandoCombobox .saltDropdown {\n height: 100%;\n}\n\n.vuuExpandoCombobox .saltInputLegacy {\n border: none;\n left:0px;\n margin:0;\n min-height: 100%;\n padding:0;\n right: 0px;\n width: auto;\n}\n\n.vuuExpandoCombobox .saltInputLegacy-input {\n border: none;\n box-sizing: content-box;\n display: block;\n flex: 1;\n font: inherit;\n margin:0;\n min-width:0;\n outline: none;\n padding: 0;\n \n}\n\n.vuuExpandoCombobox:before {\n content: attr(data-text);\n display: block;\n font-size: var(--expando-combobox-fontSize);\n height: 0px;\n overflow: hidden;\n /* visibility: hidden; */\n white-space: pre-wrap;\n /* position: absolute; */\n }\n", ".vuu-theme {\n --salt-actionable-secondary-background: #ffffff;\n --salt-actionable-secondary-background-hover: #f37880;\n --salt-actionable-secondary-background-active: #606477;\n --salt-actionable-secondary-background-disabled: #ffffff;\n --salt-actionable-secondary-foreground: #606477;\n --salt-actionable-secondary-foreground-hover: #15171b;\n --salt-actionable-secondary-foreground-active: #ffffff;\n --salt-actionable-secondary-foreground-disabled: #9b9ea8;\n}\n\n.vuuFilterClause-closeButton {\n height: 16px;\n width: 16px;\n border-radius: 6px;\n padding: 0;\n}\n\n.vuuFilterClause-closeButton:focus-visible {\n outline: 2px dashed var(--vuuPurple-accent2);\n}\n\n.vuuFilterClause-closeButton:not(:hover) {\n background: var(--salt-actionable-secondary-background);\n}\n", "* {\n --vuuPurple-accent2: #6d18bd;\n --vuuPurple-text-primary-foreground: #15171b;\n --vuuPurple-text-secondary-foreground: #606477;\n --salt-selectable-background-hover: #e4e3e7;\n --editable-border-default: #777c94;\n --editable-border-hover: #f37880;\n}\n\n.vuuFilterClause {\n --vuuExpandoCombobox-height: 16px;\n --saltButton-height: 16px;\n --saltButton-width: 16px;\n\n display: flex;\n flex-direction: row;\n width: fit-content;\n border-radius: 6px;\n border: 1px solid var(--editable-border-default);\n background: #ffffff;\n --salt-palelette-interact-outline: var(--vuuPurple-accent2);\n --salt-focused-outlineStyle: dotted;\n}\n\n.vuuFilterClause:focus-visible {\n outline: 2px dashed var(--vuuPurple-accent2);\n}\n\n.vuuFilterClause:hover :not(:focus-visible) {\n border-color: var(--editable-border-hover);\n}\n\n.vuuFilterClause:focus-visible,\n.vuuFilterClause:focus-within {\n border-color: var(--vuuPurple-accent2);\n}\n\n.vuu-density-high .vuuFilterClause {\n padding: 4px 8px;\n gap: 4px;\n --salt-text-lineHeight: 12px;\n --saltInputLegacy-fontSize: 12px;\n --saltInputLegacy-minWidth: 12px;\n}\n\n.vuu-density-high .vuuFilterClause .saltInput {\n padding: 0;\n min-height: 16px;\n height: 16px;\n}\n\n.vuuFilterClause .vuuExpandoCombobox {\n flex-basis: auto;\n flex-shrink: 0;\n flex-grow: 0 \n}\n\n.vuuFilterClause-operator {\n background-color: rgba(0,0,255,.2) !important;\n}\n\n.vuuFilterClause-operator-hidden {\n display: none;\n}\n\n.vuuFilterClause :not(.vuuFilterClause-valueInput) .saltInput {\n color: var(--vuuPurple-text-secondary-foreground);\n}\n\n.vuuFilterClause .saltInput-focused,\n.vuuFilterClause .saltTokenizedInput-focused {\n outline: none;\n color: var(--salt-text-primary-foreground);\n}\n\n.vuuFilterClause .saltInput-input::selection {\n --saltInput-highlight-color: var(--vuuPurple-accent2);\n color: #ffffff;\n}\n\n.vuu-theme .saltList,\n.saltListDeprecated {\n --list-borderWidth: 1px;\n --salt-container-primary-borderColor: var(--vuuPurple-accent2);\n --list-borderStyle: solid;\n border: 1px solid var(--vuuPurple-accent2);\n border-radius: 4px;\n box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.4);\n}\n\n.saltListDeprecated-wrapper {\n border: none;\n}\n\n.saltListItem[aria-selected=\"true\"]:not(.saltListItem-checkbox),\n.saltListItemDeprecated[aria-selected=\"true\"] {\n --list-item-background: var(--list-item-background-active);\n color: var(--list-item-text-color-active);\n border-left: 3px solid var(--vuuPurple-accent2);\n}\n\n.saltTokenizedInput {\n height: 16px;\n min-height: 16px;\n}\n\n.saltTokenizedInput .saltInputPill {\n --pill-fontSize: 12px;\n --saltButton-borderStyle: none;\n --pill-background: none;\n height: 16px;\n margin: 0;\n}\n\n.saltTokenizedInput-pillGroup {\n padding: 0;\n height: 16px;\n}\n", "\n.salt-theme {\n --vuuFilterEditor-lineHeight: 28px;\n}\n\n.salt-density-high {\n --vuuFilterEditor-buttonWidth: 20px;\n --vuuFilterEditor-height: 22px;\n --vuuFilterEditor-lineHeight: 20px;\n}\n\n.vuuFilterInput {\n --vuuFilterEditor-background: var(--salt-container-primary-background);\n --vuuFilterEditor-color: var(--salt-text-primary-foreground);\n --vuuFilterEditor-fontFamily: var(--salt-typography-fontFamily);\n --vuuFilterEditor-fontSize: var(--salt-text-fontSize);\n --vuuFilterEditor-cursorColor: var(--salt-text-secondary-foreground);\n --vuuFilterEditor-selectionBackground: var(--salt-text-background-selected);\n --vuuFilterEditor-tooltipBackground: var(--salt-container-primary-background);\n --vuuFilterEditor-tooltipBorder: var(--tooltip-status-borderColor) var(--salt-container-borderWidth) var(--salt-container-borderStyle); \n --vuuFilterEditor-tooltipElevation: var(--salt-overlayable-shadow-popout);\n --vuuFilterEditor-suggestion-selectedBackground: var(--salt-selectable-background-selected);\n --vuuFilterEditor-suggestion-selectedColor: var(--vuuFilterEditor-color);\n --vuuFilterEditor-suggestion-height: 24px;\n --vuuFilterEditor-variableColor: blue;\n\n align-items: center;\n border-color: var(--salt-container-secondary-borderColor);\n border-style: solid none;\n border-width: 1px;\n box-sizing: border-box;\n display: flex;\n height: var(--vuuFilterEditor-height, 30px);\n}\n\n.vuuFilterInput-Editor {\n flex: 1 1 auto;\n height: 100%;\n}\n\n.vuuFilterInput-FilterButton,\n.vuuFilterInput-ClearButton {\n --vuu-icon-size: 12px;\n --saltButton-width: var(--vuuFilterEditor-buttonWidth, 28px);\n}\n\n.vuuIllustration {\n --vuuFilterEditor-suggestion-selectedBackground:var(--salt-container-secondary-background);\n background: var(--salt-container-secondary-background);\n color: var(--salt-text-secondary-foreground);\n}\n\n\n"],
5
- "mappings": ";AAAA;AACC;AAAA;AAGD;AACC;AAAA;AAID;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGD;AACC;AACA;AACA;AACA;AACA;AACA;AAAA;AAGD;AACC;AACA;AAAA;AAGD;AACC;AACA;AACA;AACA;AAAA;AAGD;AACC;AACA;AACA;AACA;AAAA;AAGD;AAAA;AAEE;AACA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;;;ACjEF;AACE;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAOF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AAAA;AAEE;AACA;AAAA;AAGF;AAAA;AAEE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;;;AC5JF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;;;;;AClCF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;;;ACrEF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;;;ACtCF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAEF;AACE;AACA;AAAA;;;AChBF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;;;ACRF;AACE;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAIF;AACE;AACA;AACA;AAAA;AAiBF;AACE;AAAA;AAiBF;AACE;AAAA;AAiBF;AACE;AACA;AACA;AAAA;;;ACnIF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;;;AC3CF;AACE;AACA;AAAA;AAGF;AACE;AAEA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAAA;AAMJ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;AC9HF;AACE;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AAGE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;;;AC3DF;AACE;AACA;AAAA;AAGF;AACA;AAAA;;;ACNA;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIJ;AACI;AACA;AAAA;AAEJ;AACI;AACA;AACA;AAAA;AAIJ;AACI;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAIJ;AACI;AACA;AACA;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AAAA;AAIJ;AACI;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;ACpFJ;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIF;AACE;AAAA;;;AC9BF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;;;ACxCF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAEA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AAAA;AAEE;AACA;AACA;AACA;AACA;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AAAA;;;AC9GF;AAAA;AAGA;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AAAA;;;ACbF;AACI;AACA;AACA;AAAA;;;ACHJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAIJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAOJ;AACI;AAAA;AAEJ;AACI;AAAA;AAEJ;AACI;AAAA;AAEJ;AACI;AAAA;AAIJ;AACI;AAEI;AAAA;AAEJ;AACI;AAAA;AAAA;AAIR;AACI;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AAAA;;;ACxIJ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;;;ACtBF;AACI;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;ACnDJ;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;;;ACxBF;AACE;AAAA;;;ACAF;AACI;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AAAA;AAEJ;AACI;AAAA;AAGJ;AACI;AACA;AAAA;;;AC3BJ;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;;;ACZF;AACI;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAIJ;AACI;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;;;AC9CJ;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AAAA;;;ACbF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAEA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;;;ACxBF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AAAA;AAAA;AAGE;AACA;AACA;AAAA;AAEF;AAAA;AAEE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;AC3HF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;;;ACZF;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AAEI;AAAA;AAGJ;AACI;AACA;AAAA;AAIJ;AACI;AAAA;AAGJ;AACI;AAAA;;;AClCJ;AACE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AAGA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AAGE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AAAA;;;ACtDF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;ACpDF;AACE;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;AAIF;AACE;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAGF;AACE;AACA;AAEA;AAAA;AAIF;AACE;AAAA;AAQF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;AClIF;AACI;AAAA;;;ACAJ;AACE;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAQF;AACE;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAIF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAIF;AACE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAIF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAaF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;;;AC3KF;AACE;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAIF;AAAA;AAEE;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAKF;AACE;AAAA;AAKF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAEF;AACE;AAAA;AAEF;AACE;AAAA;AAGF;AAAA;AAGE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAIF;AACE;AAAA;AAGF;AAAA;AAEE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIF;AACE;AAAA;AAGF;AACE;AAAA;AAKF;AAAA;AAEE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;AC3NF;AACI;AAAA;;;ACDJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;ACNJ;AACI;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AACA;AAAA;AAGJ;AACI;AAAA;;;AC5BJ;AACI;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIJ;AACI;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIF;AACI;AACA;AACA;AACA;AACA;AAEA;AAAA;;;ACrDJ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;;;ACvBF;AACE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AAAA;AAEE;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AACE;AAAA;AAGF;AAAA;AAEE;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AAAA;AAEE;AACA;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AAAA;AAGF;AAAA;AAEE;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;AAGF;AACE;AACA;AACA;AACA;AACA;AAAA;AAGF;AACE;AACA;AAAA;;;ACnHF;AACI;AAAA;AAGJ;AACI;AACA;AACA;AAAA;AAGJ;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGJ;AACI;AACA;AAAA;AAGJ;AAAA;AAEI;AACA;AAAA;AAGJ;AACI;AACA;AACA;AAAA;",
5
+ "mappings": "AAAA,qBACC,aAGD,gBACC,kBAID,WACC,wBACA,kDACA,+CACA,uDACA,mBACA,oBACA,8BACA,uBACA,oCACA,kCACA,4BACA,kBAGD,4BACC,cACA,WACA,oBACA,kBACA,2DACA,mEAGD,uBACC,yCACA,sBAGD,2BACC,6CACA,wBACA,mBACA,4BAGD,6BACC,+CACA,qBACA,mBACA,6BAGD,oBAEE,qBACA,6BAIA,mBACA,wBAIA,qBACA,sBCjEF,WACE,wFACA,sDAEA,sBACA,sDACA,kBACA,UACA,aACA,YACA,cACA,YACA,aACA,aAGF,oBACE,mCACA,YACA,cAGF,iCACE,8BACA,YACA,cAGF,iBACE,kCACA,gBACA,kBAGF,mBACE,YACA,gBACA,kBACA,MACA,8BACA,iBACA,sDACA,WACA,cAGF,mCACE,QAOF,gBACE,+CAEF,iBACE,8CAEF,eACE,gDAEF,kBACE,6CAGF,mEAEE,YACA,iBAGF,mEAEE,WACA,kBAGF,mCACE,WACA,YAGF,iCACE,kBACA,wBAGF,gDACE,MACA,OACA,QAGF,iDACE,MACA,QACA,QAGF,+CACE,SACA,MACA,OAGF,kDACE,SACA,SACA,OAGF,uIAEE,8BAGF,uIAEE,+BAGF,+HAEE,yBAGF,+HAEE,0BAGF,+BAEE,QAGF,mCAEE,SAGF,iCAEE,sBAGF,2BACE,0BACA,yBACA,sBACA,cAGF,gBACE,qDC5JF,eACE,wCACA,0CACA,4CACA,qDACA,wEACA,iCACA,aAGF,0BACE,mBAGF,wBACE,sBAGF,uBACE,iCACA,YACA,cACA,gBAEA,aACA,mBACA,uBAGF,gGACE,gBC9BF,aACE,iBACA,mBACA,sBACA,+BACA,oBACA,uBACA,mBAPF,8BAYA,qCAEE,sBAGF,oBACE,4BAGF,mBACE,2BAGF,kBACE,sBACA,WACA,YACA,+BACA,sCACA,eACA,aACA,mBACA,uBAGF,wBACE,sBACA,+BAGF,4CACE,qCACA,+BAGF,2CACE,qCACA,+BAGF,8CACE,oCACA,+BAGF,+BACE,UAEF,wBACE,2BAGF,uCACE,UAGF,6BACE,mBCrEF,gBACE,kBACA,UACA,kBACA,QACA,OACA,QACA,SACA,6BAGF,oBACE,kBAGF,yBACE,mBAGF,iBACE,YACA,iBACA,iBAGF,wBACE,WAGF,kBACE,eACA,YACA,qBAGF,gBACE,UACA,iBACA,qBCtCF,iBACE,qBACA,aAGF,qBACE,4BACA,YAGF,2BACE,sBACA,4BAEF,6BACE,YACA,WChBF,gBACE,aACA,YACA,cAGF,qBACE,YACA,cCRF,UACE,qBACA,6BACA,8BACA,+BAEA,mBACA,iEACA,0CACA,0CACA,sBACA,aACA,uBACA,kBACA,aACA,UAGF,gBACE,+DAEF,iBACE,sDAGF,iBACE,iBACA,4BACA,4CAGF,uBACE,iBACA,2BACA,4CAGF,iBACE,YAtCF,gBAwCE,WACA,cAzCF,UA6CA,qBACE,kBACA,2BACA,eAGF,4BACE,OACA,QACA,SACA,YAGF,kCACE,UACA,WACA,MACA,SAGF,yCACE,2BACA,YACA,aAIF,8BACE,UACA,YACA,wPAiBF,+BACE,6MAiBF,qCACE,8MAiBF,wBACE,WACA,WACA,uPCnIF,MACE,qBACA,iBACA,gDAGF,WACE,8CACA,sBACA,aACA,wCACA,aACA,YACA,gBAGF,kBACE,sBAGF,eACE,mBAGF,qBACE,gBACA,YACA,cAGF,qBACE,aACA,YAGF,WACE,iBACA,OACA,YACA,cAGF,mBACE,iBC3CF,MACE,qBACA,gDAGF,aACE,2BAEA,aACA,iDACA,eAVF,UAcA,eACE,gEACA,kDACA,sEACA,0DAEA,aACA,YACA,cACA,kBAGF,qBACE,WACA,kBACA,MACA,OACA,QACA,SACA,uBAGF,uBACE,mDACA,iEACA,kFACA,8FACA,YAGF,2BACE,cAEF,2BACE,cAEF,2BACE,cAGF,2BACE,cAGF,2BACE,cAGF,2BACE,cAGF,2BACE,cAEF,4BACE,eAEF,4BACE,eAGF,4BACE,eAGF,0BACE,2BACE,cAEF,2BACE,cAGF,2BACE,cAGF,2BACE,cAGF,2BACE,cAGF,2BACE,cAEF,2BACE,cAEF,4BACE,eAEF,4BACE,eAEF,4BACE,gBAMJ,uBACE,gEACA,8EACA,gFACA,oEACA,+EACA,8EACA,6MC9HF,SACE,mFACA,6CACA,8CAEA,aACA,sBACA,kCACA,gBACA,eACA,aACA,gBACA,kBAGF,6BACE,WACA,kBACA,MACA,OACA,QACA,SACA,iCAGF,kBACE,gCAGF,cAGE,aACA,oDACA,2CACA,OACA,gBACA,kBAGF,gBACE,gBACA,sCACA,0CAGF,iCACE,aAGF,6BACE,aAGF,qCACE,qCAGF,oDACE,aC3DF,WACE,0BACA,yBAGF,8BACA,gCCNA,sBACI,gBACA,0BACA,sBACA,qBACA,mEACA,+DACA,wCAIJ,iCACI,qBACA,qCAEJ,+BACI,sBACA,qCACA,6BAIJ,oCACI,8BACA,aACA,yCACA,eAEA,wCACA,eACA,gBACA,kBACA,WAIJ,+CACI,oBACA,sBACA,8BACA,uBAGJ,uCACI,cAGJ,uCACI,iBAGJ,2BACI,oBACA,aACA,QACA,kBACA,wCACA,0BAIJ,mCACI,yBACA,QAGJ,uDACI,aAGJ,kDACI,kBAGJ,wCACI,mBACA,6BACA,aAEA,wCACA,4BACA,gBACA,gCACA,4CACA,4BCpFJ,uBACE,mBACA,aAGF,gBACE,4DACA,iDACA,wBACA,uBACA,gEAGF,sCACE,YACA,UACA,WACA,kBAEA,mQAKA,wBACA,6CAIF,2CACE,oDC9BF,MACE,aACA,sBACA,sBAGF,iBACE,8CACA,mBAGF,sBACE,OACA,WACA,SACA,WACA,WACA,kBACA,yBAGF,cACE,uDACA,gEACA,uDACA,gEACA,iBAGF,yCAEE,OAGF,kCACE,SACA,gBAGF,mBACE,sBCxCF,mCACE,uBACA,WAGF,yCACE,WACA,oBACA,YACA,sBAGF,oBACE,wBACA,wBACA,yBACA,yBACA,aACA,sBACA,oBACA,qCAGF,kCACE,cACA,aACA,sBACA,oBAGF,WACE,6BACA,4CACA,2BACA,mCACA,0BAEA,cAGF,uBACE,cACA,kBACA,aACA,mBACA,mBACA,kBAGF,0BACE,cACA,kBACA,aACA,mBACA,mBAGF,6EAEE,cACA,aACA,sBACA,uBACA,mBAGF,2BAEE,oCAGF,uDAEE,SAGF,yBACE,cACA,aACA,mBACA,oBAGF,yBACE,qCACA,wBAGF,yBACE,qCACA,uBAGF,0BACE,sCACA,wBAGF,2BACE,cACA,sCACA,yBAGF,yBACE,cACA,eACA,SACA,iBACA,kBACA,QC3GF,kBACE,eAGF,wBACE,uBAGF,sCACE,yBACA,WCbF,oBACI,sBACA,aACA,YCHJ,YACI,wCACA,sDACA,mDACA,8BACA,2BACA,sBACA,6BACA,8BACA,0BACA,08EACA,8uBACA,qkBACA,wrBACA,kCAEA,aACA,iCAIJ,sBACI,6CAGJ,gDACI,8CAOJ,oDACI,cAGJ,yBACI,yBACA,2BACA,aACA,sBACA,YA1CJ,kBA4CI,0BACA,8BAGJ,2BACI,cACA,YACA,aAGJ,yBACI,iBAGJ,oBACI,kCACA,wBACA,sBACA,sBACA,kCAGJ,6BACI,yDACA,6DAGJ,iBACI,aACA,cACA,uBAGJ,iBACI,cAGJ,iBACI,WACA,iBAnFJ,UA2FA,6BACI,gCAEJ,+BACI,kCAEJ,kCACI,qCAEJ,gCACI,mCAIJ,8BACI,QAEI,6BAEJ,aACI,wBAIR,sBACI,mBACA,aACA,eACA,uBAGJ,yBACI,gDACA,sBACA,qBACA,sBACA,wDACA,eAhIJ,mBAkII,YACA,kBACA,WAGJ,8BACI,qBCxIJ,eACE,qCACA,2BACA,8BACA,0BACA,yBACA,qBACA,mBACA,2BACA,aACA,sBACA,SACA,uBACA,qBAbF,qCAgBE,kBAGF,qBACE,gBACA,eACA,iBCtBF,uBACI,aACA,sBACA,QACA,gBAJJ,YAQA,+BACI,aACA,sBACA,cACA,QACA,cAGJ,6BACI,mBACA,aACA,YAGJ,kCACI,aAGJ,kCACI,cAGJ,8CACI,qDAGJ,iCACI,mBACA,+DACA,aACA,yBACA,eACA,QACA,gBAGJ,mCACI,qBACA,sBACA,oBACA,sDACA,iBAjDJ,qBAmDI,kBCnDJ,cACE,sBACA,aACA,sBACA,iBAJF,aAQA,qBACE,cAGF,wBACE,yBACA,qBACA,qCACA,aACA,cACA,2BAGF,YACE,2BACA,iCACA,kBCxBF,gBACE,4BCAF,gBACI,4BACA,kgDACA,miBAJJ,YAQA,mCACI,4BACA,yBACA,gCAGJ,4BACI,qDAGJ,kCACI,iCAEJ,iCACI,gCAGJ,kCACI,YACA,WC3BJ,cACE,mBACA,oEACA,aACA,YACA,yBAGF,yBARA,kBAUE,yBACA,YACA,kBCZF,iBACI,kBACA,iCACA,iDACA,UAGJ,0BACI,yCACA,wDACA,+BAGJ,yBACI,oBAGJ,uBACI,0DACA,8CACA,YACA,oBACA,iBACA,8CACA,+CACA,kBACA,QACA,MACA,qDACA,wBACA,uCACA,uCAIJ,wBACI,mBACA,aACA,iBACA,YACA,8BAGJ,uBACI,eACA,gBACA,mBC9CJ,UACE,iEACA,qCACA,mCAGF,kBACE,uBACA,oBAGF,6BACE,uDACA,YCbF,WACE,oDACA,+CAFF,kBAIE,oCACA,gDACA,4CACA,0CAGF,kBACE,0BACA,yBAEA,sCACA,wDACA,kEAGF,oCACE,mBAGF,gDACE,UCxBF,aACE,uDACA,2DACA,+EACA,uFACA,qCACA,sCACA,8BACA,gCACA,+BACA,4BACA,8BACA,8BACA,uBAEA,4BACA,sBAhBF,kBAkBE,oEACA,sCACA,uEACA,uDACA,gBAtBF,eAwBE,UACA,gBACA,sCACA,kBAGF,aACE,mBACA,iBACA,yDACA,kDACA,gCACA,aACA,QACA,mEACA,oCACA,mBACA,kBACA,mBAGF,kBACE,qBACA,cACA,6BACA,sBACA,4BAGF,iCACE,mDAGF,uBACE,uDAGF,uCACE,wCACA,0EACA,mEACA,+CACA,YACA,kCACA,oCACA,gBACA,kBACA,gCACA,yBACA,WAGF,+BACE,kDAGF,mBACE,kDACA,eAGF,6DACE,mDAGF,iCACE,WACA,kBACA,MACA,OACA,QACA,WACA,oDAGF,sDACE,UACA,QAGF,8GAGE,qBACA,WACA,yBAEF,qDAEE,UAGF,uCACE,WACA,gBACA,gBACA,cACA,mBACA,qBACA,eC3HF,UACE,gCACA,kBACA,MACA,OACA,QACA,SACA,iBACA,aAGF,UACE,kBCZF,cACI,0BACA,yBACA,0BACA,wBACA,qBACA,sBACA,oBACA,uBAEA,uDAVJ,kBAYI,eACA,qBACA,eAdJ,YAkBA,oBAEI,qDAGJ,mBACI,4EACA,wBAIJ,+BACI,uCAGJ,8BACI,iCClCJ,cACE,uBACA,+CACA,gDACA,kBACA,YACA,aAGF,qBACE,mDACA,kEACA,+DACA,2CAGF,oCACE,mDAGA,WACA,WAGF,qCACE,6DAGF,4BAGE,uDACA,WACA,WAGF,mCACE,WACA,UACA,WAvCF,kBAyCE,uDACA,kBACA,SACA,UAGF,uBACE,6BACA,yBACA,oCAGF,qBACE,QCtDF,kBACE,oCACA,2BACA,+BACA,+DACA,8DACA,cACA,eACA,aACA,sBACA,oCACA,mCACA,uBACA,aACA,uCACA,kBACA,mCAGF,yBACE,wBACA,cACA,WACA,kBACA,qBAGF,6BACE,wCACA,qCA7BF,UA+BE,mBACA,kBACA,sCACA,sCACA,WAGF,iDACE,aAGF,wBACE,6BACA,YACA,uBACA,cACA,OACA,aACA,YAjDF,SAmDE,YACA,aApDF,UCCA,aACE,+CAEA,kCACA,gCACA,mCAEA,uDACA,oCACA,uEACA,kBACA,iBACA,aACA,eACA,4BAIF,wBACE,mDACA,iDACA,kBACA,wBACA,6CACA,sBACA,+CACA,uBACA,mGAIF,sBACE,mDACA,kDACA,kBACA,gDACA,oBACA,4CACA,uBAEA,sBACA,oBAGF,iCACE,oBAGF,0BACE,0BACA,yBAGF,uCACE,+BAGF,+BACE,4EACA,4EAGF,2CACE,qEAGF,mBACE,WACA,mBACA,aACA,gBACA,YACA,cACA,eACA,2BACA,mCAGF,yCACE,sBACA,YAGF,yCACE,uBAIF,kCACE,yBACA,wBACA,mCAEA,sEACA,8BACA,oEACA,sEACA,8DACA,oEACA,4DACA,4BAEA,eAGF,kCACE,wBACA,wBAEA,mCAIF,kEACE,qEAQF,2CACE,sDACA,WACA,kBACA,WACA,OACA,QACA,SClIF,YACI,SCAJ,QACE,+BACA,mDACA,gCACA,6BAEA,qFACA,sBACA,yBAGF,QACE,mBACA,mBACA,iCACA,YACA,4CACA,0CACA,+CACA,gCACA,QACA,oDACA,wEACA,uCACA,aACA,sCACA,qDACA,iBACA,uBAQF,QACE,gCAGF,iBACE,oEACA,0CACA,oDAIF,aACE,mBACA,YACA,cACA,eACA,aACA,oBACA,kBACA,oBACA,6DACA,aACA,kBAGF,+BACE,qDAGF,4BACE,aACA,mBACA,uBAIF,mBACE,aAGF,4EAEE,cAGF,wFAEE,aAGF,qBACE,qBACA,kBACA,gBACA,+CACA,uBACA,4CACA,mBAEA,mCAGF,4BACE,SACA,wBACA,cACA,kBACA,oDAIF,sBACE,WACA,kBACA,MACA,OACA,QACA,WACA,+CACA,+CACA,+CACA,oBAGF,wBACE,0FACA,iFACA,qBACA,kBACA,oBAGF,eACE,wCACA,WACA,wCACA,gCACA,8BACA,kBACA,8BACA,UAGF,iDACE,yBACA,sEACA,6CACA,yDACA,+DAaF,wBACE,yBACA,kDACA,+BACA,kBACA,2BACA,WACA,+BACA,6CACA,mCAGF,sCACE,0FC3KF,SACE,oFACA,8EACA,0BACA,sDACA,6EACA,wBAEA,gEACA,qDACA,wDACA,4DACA,kEACA,qCACA,uCACA,sCACA,mCACA,sCACA,sCACA,6DACA,kCACA,2CACA,uFAEA,gBAxBF,uBA2BE,yCACA,mBACA,aACA,gBACA,kBACA,iBAGF,kBACE,yBACA,sBACA,mBACA,cAGF,mCACE,mBACA,kBAGF,gDACE,iBACA,kBACA,MACA,OACA,QACA,sBAGF,aACE,gBAIF,iFAEE,+BACA,6BACA,uBACA,8BACA,wCAEA,mBACA,kCACA,aACA,iBACA,+BACA,oCACA,iCACA,iCACA,kBACA,eA9EF,SAgFE,mBAGF,kCACE,2GAKF,+CACE,2GAKF,kBACE,wCACA,qBACA,YACA,iBACA,mEACA,2DACA,cAGF,4BACE,sBAGF,4BACE,sBACA,YAGF,2BACE,eAGF,aACE,iEAGF,6BACE,yBAEF,6BACE,yBAEF,6BACE,yBAGF,sMAGE,wCAGF,oBACE,eAGF,iCACE,qBACA,YACA,OACA,kBACA,qEAGF,qDACE,+CACA,+DACA,uDACA,sDACA,YACA,gBACA,6BACA,kBACA,uCACA,yBACA,WAGF,iCACE,iEAIF,sCACE,2BAGF,sHAEE,WACA,kBACA,QACA,mCACA,QACA,WACA,oDACA,wCAIF,sDACE,sCAGF,qDACE,8CAKF,gLAEE,yDACA,iDACA,8DACA,8CACA,sCAGF,4BACE,kBAGF,mCACE,mBACA,0CACA,0CACA,WACA,YACA,SACA,gBACA,kBACA,QACA,WC3NF,mBACI,SCDJ,eACI,mBACA,iDAFJ,mBAII,aACA,YALJ,cAOI,kBCNJ,cACI,wuBAEA,0BACA,yBAEA,mBACA,4DACA,gCACA,aACA,QACA,YAZJ,gBAgBA,mBACI,qBACA,YACA,WAGJ,+BACI,sBACA,oCAGJ,+BACI,sBC5BJ,oBACI,kEACA,uEAEA,6CACA,6DACA,yDACA,iCACA,qCAEA,uBACA,oBACA,sBACA,sCACA,eAdJ,cAmBA,kCACI,YAGJ,qCACI,YACA,SAzBJ,SA2BI,gBA3BJ,UA6BI,UACA,WAGJ,2CACE,YACA,uBACA,cACA,OACA,aAtCF,SAwCE,YACA,aAzCF,UA8CA,2BACI,wBACA,cACA,2CACA,WACA,gBAEA,qBCrDJ,WACE,gDACA,sDACA,uDACA,yDACA,gDACA,sDACA,uDACA,yDAGF,6BACE,YACA,WAbF,4BAkBA,2CACE,4CAGF,yCACE,uDCvBF,EACE,6BACA,6CACA,+CACA,4CACA,mCACA,iCAGF,iBACE,kCACA,0BACA,yBAEA,aACA,mBACA,kBAhBF,kBAkBE,gDACA,mBACA,4DACA,oCAGF,+BACE,4CAGF,4CACE,0CAGF,6DAEE,sCAGF,mCArCA,gBAuCE,QACA,6BACA,iCACA,iCAGF,8CA7CA,UA+CE,gBACA,YAGF,qCACE,gBACA,cACA,YAGF,0BACE,iCAGF,iCACE,aAGF,8DACE,iDAGF,iFAEE,aACA,0CAGF,6CACE,sDACA,WAGF,yCAEE,wBACA,+DACA,0BACA,0CArFF,kBAuFE,2BAGF,4BACE,YAGF,0GAEE,2DACA,yCACA,+CAGF,oBACE,YACA,gBAGF,mCACE,sBACA,+BACA,wBACA,YA9GF,SAkHA,8BAlHA,UAoHE,YCnHF,YACI,mCAGJ,mBACI,oCACA,+BACA,mCAGJ,gBACI,uEACA,6DACA,gEACA,sDACA,qEACA,4EACA,8EACA,uIACA,0EACA,4FACA,yEACA,0CACA,sCAEA,mBACA,yDACA,wBACA,iBACA,sBACA,aACA,2CAGJ,uBACI,cACA,YAGJ,yDAEI,sBACA,6DAGJ,iBACI,2FACA,sDACA",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-filters",
3
- "version": "0.8.7-debug",
3
+ "version": "0.8.7",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@vuu-ui/vuu-codemirror": "0.8.7-debug",
9
- "@vuu-ui/vuu-data-react": "0.8.7-debug",
10
- "@vuu-ui/vuu-data-types": "0.8.7-debug",
11
- "@vuu-ui/vuu-utils": "0.8.7-debug",
8
+ "@vuu-ui/vuu-codemirror": "0.8.7",
9
+ "@vuu-ui/vuu-data-react": "0.8.7",
10
+ "@vuu-ui/vuu-data-types": "0.8.7",
11
+ "@vuu-ui/vuu-utils": "0.8.7",
12
12
  "@salt-ds/core": "1.8.0-rc.5",
13
13
  "@salt-ds/lab": "1.0.0-alpha.14",
14
14
  "uuid": "9.0.0"
@@ -1 +1 @@
1
- export const workerSourceCode: "\nvar __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\n\n// ../vuu-utils/src/array-utils.ts\nfunction partition(array, test, pass = [], fail = []) {\n for (let i = 0, len = array.length; i < len; i++) {\n (test(array[i], i) ? pass : fail).push(array[i]);\n }\n return [pass, fail];\n}\n\n// ../vuu-utils/src/column-utils.ts\nvar metadataKeys = {\n IDX: 0,\n RENDER_IDX: 1,\n IS_LEAF: 2,\n IS_EXPANDED: 3,\n DEPTH: 4,\n COUNT: 5,\n KEY: 6,\n SELECTED: 7,\n count: 8,\n // TODO following only used in datamodel\n PARENT_IDX: \"parent_idx\",\n IDX_POINTER: \"idx_pointer\",\n FILTER_COUNT: \"filter_count\",\n NEXT_FILTER_IDX: \"next_filter_idx\"\n};\nvar { DEPTH, IS_LEAF } = metadataKeys;\n\n// ../vuu-utils/src/cookie-utils.ts\nvar getCookieValue = (name) => {\n var _a, _b;\n if (((_a = globalThis.document) == null ? void 0 : _a.cookie) !== void 0) {\n return (_b = globalThis.document.cookie.split(\"; \").find((row) => row.startsWith(`${name}=`))) == null ? void 0 : _b.split(\"=\")[1];\n }\n};\n\n// ../vuu-utils/src/range-utils.ts\nfunction getFullRange({ from, to }, bufferSize = 0, rowCount = Number.MAX_SAFE_INTEGER) {\n if (bufferSize === 0) {\n if (rowCount < from) {\n return { from: 0, to: 0 };\n } else {\n return { from, to: Math.min(to, rowCount) };\n }\n } else if (from === 0) {\n return { from, to: Math.min(to + bufferSize, rowCount) };\n } else {\n const rangeSize = to - from;\n const buff = Math.round(bufferSize / 2);\n const shortfallBefore = from - buff < 0;\n const shortFallAfter = rowCount - (to + buff) < 0;\n if (shortfallBefore && shortFallAfter) {\n return { from: 0, to: rowCount };\n } else if (shortfallBefore) {\n return { from: 0, to: rangeSize + bufferSize };\n } else if (shortFallAfter) {\n return {\n from: Math.max(0, rowCount - (rangeSize + bufferSize)),\n to: rowCount\n };\n } else {\n return { from: from - buff, to: to + buff };\n }\n }\n}\nvar withinRange = (value, { from, to }) => value >= from && value < to;\nvar WindowRange = class {\n constructor(from, to) {\n this.from = from;\n this.to = to;\n }\n isWithin(index) {\n return withinRange(index, this);\n }\n //find the overlap of this range and a new one\n overlap(from, to) {\n return from >= this.to || to < this.from ? [0, 0] : [Math.max(from, this.from), Math.min(to, this.to)];\n }\n copy() {\n return new WindowRange(this.from, this.to);\n }\n};\n\n// ../vuu-utils/src/DataWindow.ts\nvar { KEY } = metadataKeys;\n\n// ../vuu-utils/src/logging-utils.ts\nvar logLevels = [\"error\", \"warn\", \"info\", \"debug\"];\nvar isValidLogLevel = (value) => typeof value === \"string\" && logLevels.includes(value);\nvar DEFAULT_LOG_LEVEL = \"error\";\nvar NO_OP = () => void 0;\nvar DEFAULT_DEBUG_LEVEL = false ? \"error\" : \"info\";\nvar { loggingLevel = DEFAULT_DEBUG_LEVEL } = getLoggingSettings();\nvar logger = (category) => {\n const debugEnabled5 = loggingLevel === \"debug\";\n const infoEnabled5 = debugEnabled5 || loggingLevel === \"info\";\n const warnEnabled = infoEnabled5 || loggingLevel === \"warn\";\n const errorEnabled = warnEnabled || loggingLevel === \"error\";\n const info5 = infoEnabled5 ? (message) => console.info(`[${category}] ${message}`) : NO_OP;\n const warn4 = warnEnabled ? (message) => console.warn(`[${category}] ${message}`) : NO_OP;\n const debug5 = debugEnabled5 ? (message) => console.debug(`[${category}] ${message}`) : NO_OP;\n const error4 = errorEnabled ? (message) => console.error(`[${category}] ${message}`) : NO_OP;\n if (false) {\n return {\n errorEnabled,\n error: error4\n };\n } else {\n return {\n debugEnabled: debugEnabled5,\n infoEnabled: infoEnabled5,\n warnEnabled,\n errorEnabled,\n info: info5,\n warn: warn4,\n debug: debug5,\n error: error4\n };\n }\n};\nfunction getLoggingSettings() {\n if (typeof loggingSettings !== \"undefined\") {\n return loggingSettings;\n } else {\n return {\n loggingLevel: getLoggingLevelFromCookie()\n };\n }\n}\nfunction getLoggingLevelFromCookie() {\n const value = getCookieValue(\"vuu-logging-level\");\n if (isValidLogLevel(value)) {\n return value;\n } else {\n return DEFAULT_LOG_LEVEL;\n }\n}\n\n// ../vuu-utils/src/debug-utils.ts\nvar { debug, debugEnabled } = logger(\"range-monitor\");\nvar RangeMonitor = class {\n constructor(source) {\n this.source = source;\n this.range = { from: 0, to: 0 };\n this.timestamp = 0;\n }\n isSet() {\n return this.timestamp !== 0;\n }\n set({ from, to }) {\n const { timestamp } = this;\n this.range.from = from;\n this.range.to = to;\n this.timestamp = performance.now();\n if (timestamp) {\n debugEnabled && debug(\n `<${this.source}> [${from}-${to}], ${(this.timestamp - timestamp).toFixed(0)} ms elapsed`\n );\n } else {\n return 0;\n }\n }\n};\n\n// ../vuu-utils/src/event-emitter.ts\nfunction isArrayOfListeners(listeners) {\n return Array.isArray(listeners);\n}\nfunction isOnlyListener(listeners) {\n return !Array.isArray(listeners);\n}\nvar _events;\nvar EventEmitter = class {\n constructor() {\n __privateAdd(this, _events, /* @__PURE__ */ new Map());\n }\n addListener(event, listener) {\n const listeners = __privateGet(this, _events).get(event);\n if (!listeners) {\n __privateGet(this, _events).set(event, listener);\n } else if (isArrayOfListeners(listeners)) {\n listeners.push(listener);\n } else if (isOnlyListener(listeners)) {\n __privateGet(this, _events).set(event, [listeners, listener]);\n }\n }\n removeListener(event, listener) {\n if (!__privateGet(this, _events).has(event)) {\n return;\n }\n const listenerOrListeners = __privateGet(this, _events).get(event);\n let position = -1;\n if (listenerOrListeners === listener) {\n __privateGet(this, _events).delete(event);\n } else if (Array.isArray(listenerOrListeners)) {\n for (let i = length; i-- > 0; ) {\n if (listenerOrListeners[i] === listener) {\n position = i;\n break;\n }\n }\n if (position < 0) {\n return;\n }\n if (listenerOrListeners.length === 1) {\n listenerOrListeners.length = 0;\n __privateGet(this, _events).delete(event);\n } else {\n listenerOrListeners.splice(position, 1);\n }\n }\n }\n removeAllListeners(event) {\n if (event && __privateGet(this, _events).has(event)) {\n __privateGet(this, _events).delete(event);\n } else if (event === void 0) {\n __privateGet(this, _events).clear();\n }\n }\n emit(event, ...args) {\n if (__privateGet(this, _events)) {\n const handler = __privateGet(this, _events).get(event);\n if (handler) {\n this.invokeHandler(handler, args);\n }\n }\n }\n once(event, listener) {\n const handler = (...args) => {\n this.removeListener(event, handler);\n listener(...args);\n };\n this.on(event, handler);\n }\n on(event, listener) {\n this.addListener(event, listener);\n }\n invokeHandler(handler, args) {\n if (isArrayOfListeners(handler)) {\n handler.slice().forEach((listener) => this.invokeHandler(listener, args));\n } else {\n switch (args.length) {\n case 0:\n handler();\n break;\n case 1:\n handler(args[0]);\n break;\n case 2:\n handler(args[0], args[1]);\n break;\n default:\n handler.call(null, ...args);\n }\n }\n }\n};\n_events = new WeakMap();\n\n// ../vuu-utils/src/round-decimal.ts\nvar PUNCTUATION_STR = String.fromCharCode(8200);\nvar DIGIT_STR = String.fromCharCode(8199);\nvar Space = {\n DIGIT: DIGIT_STR,\n TWO_DIGITS: DIGIT_STR + DIGIT_STR,\n THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,\n FULL_PADDING: [\n null,\n PUNCTUATION_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,\n PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR\n ]\n};\nvar LEADING_FILL = DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR;\n\n// ../vuu-utils/src/input-utils.ts\nvar actionKeys = {\n Enter: \"Enter\",\n Delete: \"Delete\"\n};\nvar navigationKeys = {\n Home: \"Home\",\n End: \"End\",\n ArrowRight: \"ArrowRight\",\n ArrowLeft: \"ArrowLeft\",\n ArrowDown: \"ArrowDown\",\n ArrowUp: \"ArrowUp\",\n Tab: \"Tab\"\n};\nvar functionKeys = {\n F1: \"F1\",\n F2: \"F2\",\n F3: \"F3\",\n F4: \"F4\",\n F5: \"F5\",\n F6: \"F6\",\n F7: \"F7\",\n F8: \"F8\",\n F9: \"F9\",\n F10: \"F10\",\n F11: \"F11\",\n F12: \"F12\"\n};\nvar specialKeys = {\n ...actionKeys,\n ...navigationKeys,\n ...functionKeys\n};\n\n// ../vuu-utils/src/json-utils.ts\nvar { COUNT } = metadataKeys;\n\n// ../vuu-utils/src/keyset.ts\nvar KeySet = class {\n constructor(range) {\n this.keys = /* @__PURE__ */ new Map();\n this.free = [];\n this.nextKeyValue = 0;\n this.reset(range);\n }\n next() {\n if (this.free.length > 0) {\n return this.free.pop();\n } else {\n return this.nextKeyValue++;\n }\n }\n reset({ from, to }) {\n this.keys.forEach((keyValue, rowIndex) => {\n if (rowIndex < from || rowIndex >= to) {\n this.free.push(keyValue);\n this.keys.delete(rowIndex);\n }\n });\n const size = to - from;\n if (this.keys.size + this.free.length > size) {\n this.free.length = Math.max(0, size - this.keys.size);\n }\n for (let rowIndex = from; rowIndex < to; rowIndex++) {\n if (!this.keys.has(rowIndex)) {\n const nextKeyValue = this.next();\n this.keys.set(rowIndex, nextKeyValue);\n }\n }\n if (this.nextKeyValue > this.keys.size) {\n this.nextKeyValue = this.keys.size;\n }\n }\n keyFor(rowIndex) {\n const key = this.keys.get(rowIndex);\n if (key === void 0) {\n console.log(`key not found\n keys: ${this.toDebugString()}\n free : ${this.free.join(\",\")} \n `);\n throw Error(`KeySet, no key found for rowIndex ${rowIndex}`);\n }\n return key;\n }\n toDebugString() {\n return Array.from(this.keys.entries()).map((k, v) => `${k}=>${v}`).join(\",\");\n }\n};\n\n// ../vuu-utils/src/row-utils.ts\nvar { IDX } = metadataKeys;\n\n// ../vuu-utils/src/selection-utils.ts\nvar { SELECTED } = metadataKeys;\nvar RowSelected = {\n False: 0,\n True: 1,\n First: 2,\n Last: 4\n};\nvar SINGLE_SELECTED_ROW = RowSelected.True + RowSelected.First + RowSelected.Last;\nvar FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First;\nvar LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last;\nvar expandSelection = (selected) => {\n if (selected.every((selectedItem) => typeof selectedItem === \"number\")) {\n return selected;\n }\n const expandedSelected = [];\n for (const selectedItem of selected) {\n if (typeof selectedItem === \"number\") {\n expandedSelected.push(selectedItem);\n } else {\n for (let i = selectedItem[0]; i <= selectedItem[1]; i++) {\n expandedSelected.push(i);\n }\n }\n }\n return expandedSelected;\n};\n\n// src/websocket-connection.ts\nvar { debug: debug2, debugEnabled: debugEnabled2, error, info, infoEnabled, warn } = logger(\n \"websocket-connection\"\n);\nvar WS = \"ws\";\nvar isWebsocketUrl = (url) => url.startsWith(WS + \"://\") || url.startsWith(WS + \"s://\");\nvar connectionAttempts = {};\nvar setWebsocket = Symbol(\"setWebsocket\");\nvar connectionCallback = Symbol(\"connectionCallback\");\nasync function connect(connectionString, protocol, callback) {\n return makeConnection(connectionString, protocol, callback);\n}\nasync function reconnect(connection) {\n makeConnection(\n connection.url,\n connection.protocol,\n connection[connectionCallback],\n connection\n );\n}\nasync function makeConnection(url, protocol, callback, connection) {\n const connectionStatus = connectionAttempts[url] || (connectionAttempts[url] = {\n attemptsRemaining: 5,\n status: \"disconnected\"\n });\n try {\n callback({ type: \"connection-status\", status: \"connecting\" });\n const reconnecting = typeof connection !== \"undefined\";\n const ws = await createWebsocket(url, protocol);\n console.info(\n \"%c⚡ %cconnected\",\n \"font-size: 24px;color: green;font-weight: bold;\",\n \"color:green; font-size: 14px;\"\n );\n if (connection !== void 0) {\n connection[setWebsocket](ws);\n }\n const websocketConnection = connection != null ? connection : new WebsocketConnection(ws, url, protocol, callback);\n const status = reconnecting ? \"reconnected\" : \"connection-open-awaiting-session\";\n callback({ type: \"connection-status\", status });\n websocketConnection.status = status;\n return websocketConnection;\n } catch (evt) {\n console.log({ evt });\n const retry = --connectionStatus.attemptsRemaining > 0;\n callback({\n type: \"connection-status\",\n status: \"disconnected\",\n reason: \"failed to connect\",\n retry\n });\n if (retry) {\n return makeConnectionIn(url, protocol, callback, connection, 1e4);\n } else {\n throw Error(\"Failed to establish connection\");\n }\n }\n}\nvar makeConnectionIn = (url, protocol, callback, connection, delay) => new Promise((resolve) => {\n setTimeout(() => {\n resolve(makeConnection(url, protocol, callback, connection));\n }, delay);\n});\nvar createWebsocket = (connectionString, protocol) => new Promise((resolve, reject) => {\n const websocketUrl = isWebsocketUrl(connectionString) ? connectionString : `wss://${connectionString}`;\n if (infoEnabled && protocol !== void 0) {\n info(`WebSocket Protocol ${protocol == null ? void 0 : protocol.toString()}`);\n }\n const ws = new WebSocket(websocketUrl, protocol);\n ws.onopen = () => resolve(ws);\n ws.onerror = (evt) => reject(evt);\n});\nvar closeWarn = () => {\n warn == null ? void 0 : warn(`Connection cannot be closed, socket not yet opened`);\n};\nvar sendWarn = (msg) => {\n warn == null ? void 0 : warn(`Message cannot be sent, socket closed ${msg.body.type}`);\n};\nvar parseMessage = (message) => {\n try {\n return JSON.parse(message);\n } catch (e) {\n throw Error(`Error parsing JSON response from server ${message}`);\n }\n};\nvar WebsocketConnection = class {\n constructor(ws, url, protocol, callback) {\n this.close = closeWarn;\n this.requiresLogin = true;\n this.send = sendWarn;\n this.status = \"ready\";\n this.messagesCount = 0;\n this.connectionMetricsInterval = null;\n this.handleWebsocketMessage = (evt) => {\n const vuuMessageFromServer = parseMessage(evt.data);\n this.messagesCount += 1;\n if (true) {\n if (debugEnabled2 && vuuMessageFromServer.body.type !== \"HB\") {\n debug2 == null ? void 0 : debug2(`<<< ${vuuMessageFromServer.body.type}`);\n }\n }\n this[connectionCallback](vuuMessageFromServer);\n };\n this.url = url;\n this.protocol = protocol;\n this[connectionCallback] = callback;\n this[setWebsocket](ws);\n }\n reconnect() {\n reconnect(this);\n }\n [(connectionCallback, setWebsocket)](ws) {\n const callback = this[connectionCallback];\n ws.onmessage = (evt) => {\n this.status = \"connected\";\n ws.onmessage = this.handleWebsocketMessage;\n this.handleWebsocketMessage(evt);\n };\n this.connectionMetricsInterval = setInterval(() => {\n callback({\n type: \"connection-metrics\",\n messagesLength: this.messagesCount\n });\n this.messagesCount = 0;\n }, 1e3);\n ws.onerror = () => {\n error(`⚡ connection error`);\n callback({\n type: \"connection-status\",\n status: \"disconnected\",\n reason: \"error\"\n });\n if (this.connectionMetricsInterval) {\n clearInterval(this.connectionMetricsInterval);\n this.connectionMetricsInterval = null;\n }\n if (this.status === \"connection-open-awaiting-session\") {\n error(\n `Websocket connection lost before Vuu session established, check websocket configuration`\n );\n } else if (this.status !== \"closed\") {\n reconnect(this);\n this.send = queue;\n }\n };\n ws.onclose = () => {\n info == null ? void 0 : info(`⚡ connection close`);\n callback({\n type: \"connection-status\",\n status: \"disconnected\",\n reason: \"close\"\n });\n if (this.connectionMetricsInterval) {\n clearInterval(this.connectionMetricsInterval);\n this.connectionMetricsInterval = null;\n }\n if (this.status !== \"closed\") {\n reconnect(this);\n this.send = queue;\n }\n };\n const send = (msg) => {\n if (true) {\n if (debugEnabled2 && msg.body.type !== \"HB_RESP\") {\n debug2 == null ? void 0 : debug2(`>>> ${msg.body.type}`);\n }\n }\n ws.send(JSON.stringify(msg));\n };\n const queue = (msg) => {\n info == null ? void 0 : info(`TODO queue message until websocket reconnected ${msg.body.type}`);\n };\n this.send = send;\n this.close = () => {\n this.status = \"closed\";\n ws.close();\n this.close = closeWarn;\n this.send = sendWarn;\n info == null ? void 0 : info(\"close websocket\");\n };\n }\n};\n\n// src/message-utils.ts\nvar MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n \"VP_EDIT_CELL_RPC\",\n \"VP_EDIT_ROW_RPC\",\n \"VP_EDIT_ADD_ROW_RPC\",\n \"VP_EDIT_DELETE_CELL_RPC\",\n \"VP_EDIT_DELETE_ROW_RPC\",\n \"VP_EDIT_SUBMIT_FORM_RPC\"\n];\nvar isVuuMenuRpcRequest = (message) => MENU_RPC_TYPES.includes(message[\"type\"]);\nvar stripRequestId = ({\n requestId,\n ...rest\n}) => [requestId, rest];\nvar getFirstAndLastRows = (rows) => {\n let firstRow = rows.at(0);\n if (firstRow.updateType === \"SIZE\") {\n if (rows.length === 1) {\n return rows;\n } else {\n firstRow = rows.at(1);\n }\n }\n const lastRow = rows.at(-1);\n return [firstRow, lastRow];\n};\nvar groupRowsByViewport = (rows) => {\n const result = {};\n for (const row of rows) {\n const rowsForViewport = result[row.viewPortId] || (result[row.viewPortId] = []);\n rowsForViewport.push(row);\n }\n return result;\n};\nvar createSchemaFromTableMetadata = ({\n columns,\n dataTypes,\n key,\n table\n}) => {\n return {\n table,\n columns: columns.map((col, idx) => ({\n name: col,\n serverDataType: dataTypes[idx]\n })),\n key\n };\n};\n\n// src/vuuUIMessageTypes.ts\nvar isConnectionStatusMessage = (msg) => msg.type === \"connection-status\";\nvar isConnectionQualityMetrics = (msg) => msg.type === \"connection-metrics\";\nvar isViewporttMessage = (msg) => \"viewport\" in msg;\nvar isSessionTableActionMessage = (messageBody) => messageBody.type === \"VIEW_PORT_MENU_RESP\" && messageBody.action !== null && isSessionTable(messageBody.action.table);\nvar isSessionTable = (table) => {\n if (table !== null && typeof table === \"object\" && \"table\" in table && \"module\" in table) {\n return table.table.startsWith(\"session\");\n }\n return false;\n};\n\n// src/server-proxy/messages.ts\nvar CHANGE_VP_SUCCESS = \"CHANGE_VP_SUCCESS\";\nvar CHANGE_VP_RANGE_SUCCESS = \"CHANGE_VP_RANGE_SUCCESS\";\nvar CLOSE_TREE_NODE = \"CLOSE_TREE_NODE\";\nvar CLOSE_TREE_SUCCESS = \"CLOSE_TREE_SUCCESS\";\nvar CREATE_VP = \"CREATE_VP\";\nvar CREATE_VP_SUCCESS = \"CREATE_VP_SUCCESS\";\nvar DISABLE_VP = \"DISABLE_VP\";\nvar DISABLE_VP_SUCCESS = \"DISABLE_VP_SUCCESS\";\nvar ENABLE_VP = \"ENABLE_VP\";\nvar ENABLE_VP_SUCCESS = \"ENABLE_VP_SUCCESS\";\nvar GET_VP_VISUAL_LINKS = \"GET_VP_VISUAL_LINKS\";\nvar GET_VIEW_PORT_MENUS = \"GET_VIEW_PORT_MENUS\";\nvar HB = \"HB\";\nvar HB_RESP = \"HB_RESP\";\nvar LOGIN = \"LOGIN\";\nvar LOGIN_SUCCESS = \"LOGIN_SUCCESS\";\nvar OPEN_TREE_NODE = \"OPEN_TREE_NODE\";\nvar OPEN_TREE_SUCCESS = \"OPEN_TREE_SUCCESS\";\nvar REMOVE_VP = \"REMOVE_VP\";\nvar RPC_RESP = \"RPC_RESP\";\nvar SET_SELECTION_SUCCESS = \"SET_SELECTION_SUCCESS\";\nvar TABLE_META_RESP = \"TABLE_META_RESP\";\nvar TABLE_LIST_RESP = \"TABLE_LIST_RESP\";\nvar TABLE_ROW = \"TABLE_ROW\";\n\n// src/server-proxy/rpc-services.ts\nvar getRpcServiceModule = (service) => {\n switch (service) {\n case \"TypeAheadRpcHandler\":\n return \"TYPEAHEAD\";\n default:\n return \"SIMUL\";\n }\n};\n\n// src/server-proxy/array-backed-moving-window.ts\nvar EMPTY_ARRAY = [];\nvar log = logger(\"array-backed-moving-window\");\nvar _range;\nvar ArrayBackedMovingWindow = class {\n // Note, the buffer is already accounted for in the range passed in here\n constructor({ from: clientFrom, to: clientTo }, { from, to }, bufferSize) {\n __privateAdd(this, _range, void 0);\n this.setRowCount = (rowCount) => {\n var _a;\n (_a = log.info) == null ? void 0 : _a.call(log, `setRowCount ${rowCount}`);\n if (rowCount < this.internalData.length) {\n this.internalData.length = rowCount;\n }\n if (rowCount < this.rowCount) {\n this.rowsWithinRange = 0;\n const end = Math.min(rowCount, this.clientRange.to);\n for (let i = this.clientRange.from; i < end; i++) {\n const rowIndex = i - __privateGet(this, _range).from;\n if (this.internalData[rowIndex] !== void 0) {\n this.rowsWithinRange += 1;\n }\n }\n }\n this.rowCount = rowCount;\n };\n this.bufferBreakout = (from, to) => {\n const bufferPerimeter = this.bufferSize * 0.25;\n if (__privateGet(this, _range).to - to < bufferPerimeter) {\n return true;\n } else if (__privateGet(this, _range).from > 0 && from - __privateGet(this, _range).from < bufferPerimeter) {\n return true;\n } else {\n return false;\n }\n };\n this.bufferSize = bufferSize;\n this.clientRange = new WindowRange(clientFrom, clientTo);\n __privateSet(this, _range, new WindowRange(from, to));\n this.internalData = new Array(bufferSize);\n this.rowsWithinRange = 0;\n this.rowCount = 0;\n }\n get range() {\n return __privateGet(this, _range);\n }\n // TODO we shpuld probably have a hasAllClientRowsWithinRange\n get hasAllRowsWithinRange() {\n return this.rowsWithinRange === this.clientRange.to - this.clientRange.from || // this.rowsWithinRange === this.range.to - this.range.from ||\n this.rowCount > 0 && this.clientRange.from + this.rowsWithinRange === this.rowCount;\n }\n // Check to see if set of rows is outside the current viewport range, indicating\n // that veiwport is being scrolled quickly and server is not able to keep up.\n outOfRange(firstIndex, lastIndex) {\n const { from, to } = this.range;\n if (lastIndex < from) {\n return true;\n }\n if (firstIndex >= to) {\n return true;\n }\n }\n setAtIndex(row) {\n const { rowIndex: index } = row;\n const isWithinClientRange = this.isWithinClientRange(index);\n if (isWithinClientRange || this.isWithinRange(index)) {\n const internalIndex = index - __privateGet(this, _range).from;\n if (!this.internalData[internalIndex] && isWithinClientRange) {\n this.rowsWithinRange += 1;\n }\n this.internalData[internalIndex] = row;\n }\n return isWithinClientRange;\n }\n getAtIndex(index) {\n return __privateGet(this, _range).isWithin(index) && this.internalData[index - __privateGet(this, _range).from] != null ? this.internalData[index - __privateGet(this, _range).from] : void 0;\n }\n isWithinRange(index) {\n return __privateGet(this, _range).isWithin(index);\n }\n isWithinClientRange(index) {\n return this.clientRange.isWithin(index);\n }\n // Returns [false] or [serverDataRequired, clientRows, holdingRows]\n setClientRange(from, to) {\n var _a;\n (_a = log.debug) == null ? void 0 : _a.call(log, `setClientRange ${from} - ${to}`);\n const currentFrom = this.clientRange.from;\n const currentTo = Math.min(this.clientRange.to, this.rowCount);\n if (from === currentFrom && to === currentTo) {\n return [\n false,\n EMPTY_ARRAY\n /*, EMPTY_ARRAY*/\n ];\n }\n const originalRange = this.clientRange.copy();\n this.clientRange.from = from;\n this.clientRange.to = to;\n this.rowsWithinRange = 0;\n for (let i = from; i < to; i++) {\n const internalIndex = i - __privateGet(this, _range).from;\n if (this.internalData[internalIndex]) {\n this.rowsWithinRange += 1;\n }\n }\n let clientRows = EMPTY_ARRAY;\n const offset = __privateGet(this, _range).from;\n if (this.hasAllRowsWithinRange) {\n if (to > originalRange.to) {\n const start = Math.max(from, originalRange.to);\n clientRows = this.internalData.slice(start - offset, to - offset);\n } else {\n const end = Math.min(originalRange.from, to);\n clientRows = this.internalData.slice(from - offset, end - offset);\n }\n }\n const serverDataRequired = this.bufferBreakout(from, to);\n return [serverDataRequired, clientRows];\n }\n setRange(from, to) {\n var _a;\n (_a = log.debug) == null ? void 0 : _a.call(log, `setRange ${from} - ${to}`);\n const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to);\n const newData = new Array(to - from + this.bufferSize);\n this.rowsWithinRange = 0;\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n if (this.isWithinClientRange(i)) {\n this.rowsWithinRange += 1;\n }\n }\n }\n this.internalData = newData;\n __privateGet(this, _range).from = from;\n __privateGet(this, _range).to = to;\n }\n getData() {\n var _a;\n const { from, to } = __privateGet(this, _range);\n const { from: clientFrom, to: clientTo } = this.clientRange;\n const startOffset = Math.max(0, clientFrom - from);\n const endOffset = Math.min(\n to - from,\n to,\n clientTo - from,\n (_a = this.rowCount) != null ? _a : to\n );\n return this.internalData.slice(startOffset, endOffset);\n }\n clear() {\n var _a;\n (_a = log.debug) == null ? void 0 : _a.call(log, \"clear\");\n this.internalData.length = 0;\n this.rowsWithinRange = 0;\n this.setRowCount(0);\n }\n // used only for debugging\n getCurrentDataRange() {\n const rows = this.internalData;\n const len = rows.length;\n let [firstRow] = this.internalData;\n let lastRow = this.internalData[len - 1];\n if (firstRow && lastRow) {\n return [firstRow.rowIndex, lastRow.rowIndex];\n } else {\n for (let i = 0; i < len; i++) {\n if (rows[i] !== void 0) {\n firstRow = rows[i];\n break;\n }\n }\n for (let i = len - 1; i >= 0; i--) {\n if (rows[i] !== void 0) {\n lastRow = rows[i];\n break;\n }\n }\n if (firstRow && lastRow) {\n return [firstRow.rowIndex, lastRow.rowIndex];\n } else {\n return [-1, -1];\n }\n }\n }\n};\n_range = new WeakMap();\n\n// src/server-proxy/viewport.ts\nvar EMPTY_GROUPBY = [];\nvar { debug: debug3, debugEnabled: debugEnabled3, error: error2, info: info2, infoEnabled: infoEnabled2, warn: warn2 } = logger(\"viewport\");\nvar isLeafUpdate = ({ rowKey, updateType }) => updateType === \"U\" && !rowKey.startsWith(\"$root\");\nvar NO_DATA_UPDATE = [\n void 0,\n void 0\n];\nvar NO_UPDATE_STATUS = {\n count: 0,\n mode: void 0,\n size: 0,\n ts: 0\n};\nvar Viewport = class {\n constructor({\n aggregations,\n bufferSize = 50,\n columns,\n filter,\n groupBy = [],\n table,\n range,\n sort,\n title,\n viewport,\n visualLink\n }, postMessageToClient) {\n // TODO create this in constructor so we don't have to mark is as optional\n this.dataWindow = void 0;\n this.hasUpdates = false;\n this.pendingUpdates = [];\n this.pendingOperations = /* @__PURE__ */ new Map();\n this.pendingRangeRequests = [];\n this.rowCountChanged = false;\n this.tableSchema = null;\n this.batchMode = true;\n this.useBatchMode = true;\n this.lastUpdateStatus = NO_UPDATE_STATUS;\n this.updateThrottleTimer = void 0;\n this.rangeMonitor = new RangeMonitor(\"ViewPort\");\n this.disabled = false;\n this.isTree = false;\n // TODO roll disabled/suspended into status\n this.status = \"\";\n this.suspended = false;\n this.suspendTimer = null;\n // Records SIZE only updates\n this.setLastSizeOnlyUpdateSize = (size) => {\n this.lastUpdateStatus.size = size;\n };\n this.setLastUpdate = (mode) => {\n const { ts: lastTS, mode: lastMode } = this.lastUpdateStatus;\n let elapsedTime = 0;\n if (lastMode === mode) {\n const ts = Date.now();\n this.lastUpdateStatus.count += 1;\n this.lastUpdateStatus.ts = ts;\n elapsedTime = lastTS === 0 ? 0 : ts - lastTS;\n } else {\n this.lastUpdateStatus.count = 1;\n this.lastUpdateStatus.ts = 0;\n elapsedTime = 0;\n }\n this.lastUpdateStatus.mode = mode;\n return elapsedTime;\n };\n this.rangeRequestAlreadyPending = (range) => {\n const { bufferSize } = this;\n const bufferThreshold = bufferSize * 0.25;\n let { from: stillPendingFrom } = range;\n for (const { from, to } of this.pendingRangeRequests) {\n if (stillPendingFrom >= from && stillPendingFrom < to) {\n if (range.to + bufferThreshold <= to) {\n return true;\n } else {\n stillPendingFrom = to;\n }\n }\n }\n return false;\n };\n this.sendThrottledSizeMessage = () => {\n this.updateThrottleTimer = void 0;\n this.lastUpdateStatus.count = 3;\n this.postMessageToClient({\n clientViewportId: this.clientViewportId,\n mode: \"size-only\",\n size: this.lastUpdateStatus.size,\n type: \"viewport-update\"\n });\n };\n // If we are receiving multiple SIZE updates but no data, table is loading rows\n // outside of our viewport. We can safely throttle these requests. Doing so will\n // alleviate pressure on UI DataTable.\n this.shouldThrottleMessage = (mode) => {\n const elapsedTime = this.setLastUpdate(mode);\n return mode === \"size-only\" && elapsedTime > 0 && elapsedTime < 500 && this.lastUpdateStatus.count > 3;\n };\n this.throttleMessage = (mode) => {\n if (this.shouldThrottleMessage(mode)) {\n if (this.updateThrottleTimer === void 0) {\n this.updateThrottleTimer = setTimeout(\n this.sendThrottledSizeMessage,\n 2e3\n );\n }\n return true;\n } else if (this.updateThrottleTimer !== void 0) {\n clearTimeout(this.updateThrottleTimer);\n this.updateThrottleTimer = void 0;\n }\n return false;\n };\n this.getNewRowCount = () => {\n if (this.rowCountChanged && this.dataWindow) {\n this.rowCountChanged = false;\n return this.dataWindow.rowCount;\n }\n };\n this.aggregations = aggregations;\n this.bufferSize = bufferSize;\n this.clientRange = range;\n this.clientViewportId = viewport;\n this.columns = columns;\n this.filter = filter;\n this.groupBy = groupBy;\n this.keys = new KeySet(range);\n this.pendingLinkedParent = visualLink;\n this.table = table;\n this.sort = sort;\n this.title = title;\n infoEnabled2 && (info2 == null ? void 0 : info2(\n `constructor #${viewport} ${table.table} bufferSize=${bufferSize}`\n ));\n this.postMessageToClient = postMessageToClient;\n }\n get hasUpdatesToProcess() {\n if (this.suspended) {\n return false;\n }\n return this.rowCountChanged || this.hasUpdates;\n }\n get size() {\n var _a, _b;\n return (_b = (_a = this.dataWindow) == null ? void 0 : _a.rowCount) != null ? _b : 0;\n }\n subscribe() {\n const { filter } = this.filter;\n this.status = this.status === \"subscribed\" ? \"resubscribing\" : \"subscribing\";\n return {\n type: CREATE_VP,\n table: this.table,\n range: getFullRange(this.clientRange, this.bufferSize),\n aggregations: this.aggregations,\n columns: this.columns,\n sort: this.sort,\n groupBy: this.groupBy,\n filterSpec: { filter }\n };\n }\n handleSubscribed({\n viewPortId,\n aggregations,\n columns,\n filterSpec: filter,\n range,\n sort,\n groupBy\n }) {\n this.serverViewportId = viewPortId;\n this.status = \"subscribed\";\n this.aggregations = aggregations;\n this.columns = columns;\n this.groupBy = groupBy;\n this.isTree = groupBy && groupBy.length > 0;\n this.dataWindow = new ArrayBackedMovingWindow(\n this.clientRange,\n range,\n this.bufferSize\n );\n return {\n aggregations,\n type: \"subscribed\",\n clientViewportId: this.clientViewportId,\n columns,\n filter,\n groupBy,\n range,\n sort,\n tableSchema: this.tableSchema\n };\n }\n awaitOperation(requestId, msg) {\n this.pendingOperations.set(requestId, msg);\n }\n // Return a message if we need to communicate this to client UI\n completeOperation(requestId, ...params) {\n var _a;\n const { clientViewportId, pendingOperations } = this;\n const pendingOperation = pendingOperations.get(requestId);\n if (!pendingOperation) {\n error2(\"no matching operation found to complete\");\n return;\n }\n const { type } = pendingOperation;\n info2 == null ? void 0 : info2(`completeOperation ${type}`);\n pendingOperations.delete(requestId);\n if (type === \"CHANGE_VP_RANGE\") {\n const [from, to] = params;\n (_a = this.dataWindow) == null ? void 0 : _a.setRange(from, to);\n for (let i = this.pendingRangeRequests.length - 1; i >= 0; i--) {\n const pendingRangeRequest = this.pendingRangeRequests[i];\n if (pendingRangeRequest.requestId === requestId) {\n pendingRangeRequest.acked = true;\n break;\n } else {\n warn2 == null ? void 0 : warn2(\"range requests sent faster than they are being ACKed\");\n }\n }\n } else if (type === \"config\") {\n const { aggregations, columns, filter, groupBy, sort } = pendingOperation.data;\n this.aggregations = aggregations;\n this.columns = columns;\n this.filter = filter;\n this.groupBy = groupBy;\n this.sort = sort;\n if (groupBy.length > 0) {\n this.isTree = true;\n } else if (this.isTree) {\n this.isTree = false;\n }\n debug3 == null ? void 0 : debug3(`config change confirmed, isTree : ${this.isTree}`);\n return {\n clientViewportId,\n type,\n config: pendingOperation.data\n };\n } else if (type === \"groupBy\") {\n this.isTree = pendingOperation.data.length > 0;\n this.groupBy = pendingOperation.data;\n debug3 == null ? void 0 : debug3(`groupBy change confirmed, isTree : ${this.isTree}`);\n return {\n clientViewportId,\n type,\n groupBy: pendingOperation.data\n };\n } else if (type === \"columns\") {\n this.columns = pendingOperation.data;\n return {\n clientViewportId,\n type,\n columns: pendingOperation.data\n };\n } else if (type === \"filter\") {\n this.filter = pendingOperation.data;\n return {\n clientViewportId,\n type,\n filter: pendingOperation.data\n };\n } else if (type === \"aggregate\") {\n this.aggregations = pendingOperation.data;\n return {\n clientViewportId,\n type: \"aggregate\",\n aggregations: this.aggregations\n };\n } else if (type === \"sort\") {\n this.sort = pendingOperation.data;\n return {\n clientViewportId,\n type,\n sort: this.sort\n };\n } else if (type === \"selection\") {\n } else if (type === \"disable\") {\n this.disabled = true;\n return {\n type: \"disabled\",\n clientViewportId\n };\n } else if (type === \"enable\") {\n this.disabled = false;\n return {\n type: \"enabled\",\n clientViewportId\n };\n } else if (type === \"CREATE_VISUAL_LINK\") {\n const [colName, parentViewportId, parentColName] = params;\n this.linkedParent = {\n colName,\n parentViewportId,\n parentColName\n };\n this.pendingLinkedParent = void 0;\n return {\n type: \"vuu-link-created\",\n clientViewportId,\n colName,\n parentViewportId,\n parentColName\n };\n } else if (type === \"REMOVE_VISUAL_LINK\") {\n this.linkedParent = void 0;\n return {\n type: \"vuu-link-removed\",\n clientViewportId\n };\n }\n }\n // TODO when a range request arrives, consider the viewport to be scrolling\n // until data arrives and we have the full range.\n // When not scrolling, any server data is an update\n // When scrolling, we are in batch mode\n rangeRequest(requestId, range) {\n if (debugEnabled3) {\n this.rangeMonitor.set(range);\n }\n const type = \"CHANGE_VP_RANGE\";\n if (this.dataWindow) {\n const [serverDataRequired, clientRows] = this.dataWindow.setClientRange(\n range.from,\n range.to\n );\n let debounceRequest;\n const maxRange = this.dataWindow.rowCount || void 0;\n const serverRequest = serverDataRequired && !this.rangeRequestAlreadyPending(range) ? {\n type,\n viewPortId: this.serverViewportId,\n ...getFullRange(range, this.bufferSize, maxRange)\n } : null;\n if (serverRequest) {\n debugEnabled3 && (debug3 == null ? void 0 : debug3(\n `create CHANGE_VP_RANGE: [${serverRequest.from} - ${serverRequest.to}]`\n ));\n this.awaitOperation(requestId, { type });\n const pendingRequest = this.pendingRangeRequests.at(-1);\n if (pendingRequest) {\n if (pendingRequest.acked) {\n console.warn(\"Range Request before previous request is filled\");\n } else {\n const { from, to } = pendingRequest;\n if (this.dataWindow.outOfRange(from, to)) {\n debounceRequest = {\n clientViewportId: this.clientViewportId,\n type: \"debounce-begin\"\n };\n } else {\n warn2 == null ? void 0 : warn2(\"Range Request before previous request is acked\");\n }\n }\n }\n this.pendingRangeRequests.push({ ...serverRequest, requestId });\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n } else if (clientRows.length > 0) {\n this.batchMode = false;\n }\n this.keys.reset(this.dataWindow.clientRange);\n const toClient = this.isTree ? toClientRowTree : toClientRow;\n if (clientRows.length) {\n return [\n serverRequest,\n clientRows.map((row) => {\n return toClient(row, this.keys);\n })\n ];\n } else if (debounceRequest) {\n return [serverRequest, void 0, debounceRequest];\n } else {\n return [serverRequest];\n }\n } else {\n return [null];\n }\n }\n setLinks(links) {\n this.links = links;\n return [\n {\n type: \"vuu-links\",\n links,\n clientViewportId: this.clientViewportId\n },\n this.pendingLinkedParent\n ];\n }\n setMenu(menu) {\n return {\n type: \"vuu-menu\",\n menu,\n clientViewportId: this.clientViewportId\n };\n }\n setTableSchema(tableSchema) {\n this.tableSchema = tableSchema;\n }\n openTreeNode(requestId, message) {\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n return {\n type: OPEN_TREE_NODE,\n vpId: this.serverViewportId,\n treeKey: message.key\n };\n }\n closeTreeNode(requestId, message) {\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n return {\n type: CLOSE_TREE_NODE,\n vpId: this.serverViewportId,\n treeKey: message.key\n };\n }\n createLink(requestId, colName, parentVpId, parentColumnName) {\n const message = {\n type: \"CREATE_VISUAL_LINK\",\n parentVpId,\n childVpId: this.serverViewportId,\n parentColumnName,\n childColumnName: colName\n };\n this.awaitOperation(requestId, message);\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n return message;\n }\n removeLink(requestId) {\n const message = {\n type: \"REMOVE_VISUAL_LINK\",\n childVpId: this.serverViewportId\n };\n this.awaitOperation(requestId, message);\n return message;\n }\n suspend() {\n this.suspended = true;\n info2 == null ? void 0 : info2(\"suspend\");\n }\n resume() {\n this.suspended = false;\n if (debugEnabled3) {\n debug3 == null ? void 0 : debug3(`resume: ${this.currentData()}`);\n }\n return this.currentData();\n }\n currentData() {\n const out = [];\n if (this.dataWindow) {\n const records = this.dataWindow.getData();\n const { keys } = this;\n const toClient = this.isTree ? toClientRowTree : toClientRow;\n for (const row of records) {\n if (row) {\n out.push(toClient(row, keys));\n }\n }\n }\n return out;\n }\n enable(requestId) {\n this.awaitOperation(requestId, { type: \"enable\" });\n info2 == null ? void 0 : info2(`enable: ${this.serverViewportId}`);\n return {\n type: ENABLE_VP,\n viewPortId: this.serverViewportId\n };\n }\n disable(requestId) {\n this.awaitOperation(requestId, { type: \"disable\" });\n info2 == null ? void 0 : info2(`disable: ${this.serverViewportId}`);\n this.suspended = false;\n return {\n type: DISABLE_VP,\n viewPortId: this.serverViewportId\n };\n }\n columnRequest(requestId, columns) {\n this.awaitOperation(requestId, {\n type: \"columns\",\n data: columns\n });\n debug3 == null ? void 0 : debug3(`columnRequest: ${columns}`);\n return this.createRequest({ columns });\n }\n filterRequest(requestId, dataSourceFilter) {\n this.awaitOperation(requestId, {\n type: \"filter\",\n data: dataSourceFilter\n });\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n const { filter } = dataSourceFilter;\n info2 == null ? void 0 : info2(`filterRequest: ${filter}`);\n return this.createRequest({ filterSpec: { filter } });\n }\n setConfig(requestId, config) {\n this.awaitOperation(requestId, { type: \"config\", data: config });\n const { filter, ...remainingConfig } = config;\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n debugEnabled3 ? debug3 == null ? void 0 : debug3(`setConfig ${JSON.stringify(config)}`) : info2 == null ? void 0 : info2(`setConfig`);\n return this.createRequest(\n {\n ...remainingConfig,\n filterSpec: typeof (filter == null ? void 0 : filter.filter) === \"string\" ? {\n filter: filter.filter\n } : {\n filter: \"\"\n }\n },\n true\n );\n }\n aggregateRequest(requestId, aggregations) {\n this.awaitOperation(requestId, { type: \"aggregate\", data: aggregations });\n info2 == null ? void 0 : info2(`aggregateRequest: ${aggregations}`);\n return this.createRequest({ aggregations });\n }\n sortRequest(requestId, sort) {\n this.awaitOperation(requestId, { type: \"sort\", data: sort });\n info2 == null ? void 0 : info2(`sortRequest: ${JSON.stringify(sort.sortDefs)}`);\n return this.createRequest({ sort });\n }\n groupByRequest(requestId, groupBy = EMPTY_GROUPBY) {\n var _a;\n this.awaitOperation(requestId, { type: \"groupBy\", data: groupBy });\n if (this.useBatchMode) {\n this.batchMode = true;\n }\n if (!this.isTree) {\n (_a = this.dataWindow) == null ? void 0 : _a.clear();\n }\n return this.createRequest({ groupBy });\n }\n selectRequest(requestId, selected) {\n this.awaitOperation(requestId, { type: \"selection\", data: selected });\n info2 == null ? void 0 : info2(`selectRequest: ${selected}`);\n return {\n type: \"SET_SELECTION\",\n vpId: this.serverViewportId,\n selection: expandSelection(selected)\n };\n }\n removePendingRangeRequest(firstIndex, lastIndex) {\n for (let i = this.pendingRangeRequests.length - 1; i >= 0; i--) {\n const { from, to } = this.pendingRangeRequests[i];\n let isLast = true;\n if (firstIndex >= from && firstIndex < to || lastIndex > from && lastIndex < to) {\n if (!isLast) {\n console.warn(\n \"removePendingRangeRequest TABLE_ROWS are not for latest request\"\n );\n }\n this.pendingRangeRequests.splice(i, 1);\n break;\n } else {\n isLast = false;\n }\n }\n }\n updateRows(rows) {\n var _a, _b, _c;\n const [firstRow, lastRow] = getFirstAndLastRows(rows);\n if (firstRow && lastRow) {\n this.removePendingRangeRequest(firstRow.rowIndex, lastRow.rowIndex);\n }\n if (rows.length === 1) {\n if (firstRow.vpSize === 0 && this.disabled) {\n debug3 == null ? void 0 : debug3(\n `ignore a SIZE=0 message on disabled viewport (${rows.length} rows)`\n );\n return;\n } else if (firstRow.updateType === \"SIZE\") {\n this.setLastSizeOnlyUpdateSize(firstRow.vpSize);\n }\n }\n for (const row of rows) {\n if (this.isTree && isLeafUpdate(row)) {\n continue;\n } else {\n if (row.updateType === \"SIZE\" || ((_a = this.dataWindow) == null ? void 0 : _a.rowCount) !== row.vpSize) {\n (_b = this.dataWindow) == null ? void 0 : _b.setRowCount(row.vpSize);\n this.rowCountChanged = true;\n }\n if (row.updateType === \"U\") {\n if ((_c = this.dataWindow) == null ? void 0 : _c.setAtIndex(row)) {\n this.hasUpdates = true;\n if (!this.batchMode) {\n this.pendingUpdates.push(row);\n }\n }\n }\n }\n }\n }\n // This is called only after new data has been received from server - data\n // returned direcly from buffer does not use this.\n getClientRows() {\n let out = void 0;\n let mode = \"size-only\";\n if (!this.hasUpdates && !this.rowCountChanged) {\n return NO_DATA_UPDATE;\n }\n if (this.hasUpdates && this.dataWindow) {\n const { keys } = this;\n const toClient = this.isTree ? toClientRowTree : toClientRow;\n if (this.updateThrottleTimer) {\n self.clearTimeout(this.updateThrottleTimer);\n this.updateThrottleTimer = void 0;\n }\n if (this.pendingUpdates.length > 0) {\n out = [];\n mode = \"update\";\n for (const row of this.pendingUpdates) {\n out.push(toClient(row, keys));\n }\n this.pendingUpdates.length = 0;\n } else {\n const records = this.dataWindow.getData();\n if (this.dataWindow.hasAllRowsWithinRange) {\n out = [];\n mode = \"batch\";\n for (const row of records) {\n out.push(toClient(row, keys));\n }\n this.batchMode = false;\n }\n }\n this.hasUpdates = false;\n }\n if (this.throttleMessage(mode)) {\n return NO_DATA_UPDATE;\n } else {\n return [out, mode];\n }\n }\n createRequest(params, overWrite = false) {\n if (overWrite) {\n return {\n type: \"CHANGE_VP\",\n viewPortId: this.serverViewportId,\n ...params\n };\n } else {\n return {\n type: \"CHANGE_VP\",\n viewPortId: this.serverViewportId,\n aggregations: this.aggregations,\n columns: this.columns,\n sort: this.sort,\n groupBy: this.groupBy,\n filterSpec: {\n filter: this.filter.filter\n },\n ...params\n };\n }\n }\n};\nvar toClientRow = ({ rowIndex, rowKey, sel: isSelected, data }, keys) => {\n return [\n rowIndex,\n keys.keyFor(rowIndex),\n true,\n false,\n 0,\n 0,\n rowKey,\n isSelected\n ].concat(data);\n};\nvar toClientRowTree = ({ rowIndex, rowKey, sel: isSelected, data }, keys) => {\n const [depth, isExpanded, , isLeaf, , count, ...rest] = data;\n return [\n rowIndex,\n keys.keyFor(rowIndex),\n isLeaf,\n isExpanded,\n depth,\n count,\n rowKey,\n isSelected\n ].concat(rest);\n};\n\n// src/server-proxy/server-proxy.ts\nvar _requestId = 1;\nvar { debug: debug4, debugEnabled: debugEnabled4, error: error3, info: info3, infoEnabled: infoEnabled3, warn: warn3 } = logger(\"server-proxy\");\nvar nextRequestId = () => `${_requestId++}`;\nvar DEFAULT_OPTIONS = {};\nvar isActiveViewport = (viewPort) => viewPort.disabled !== true && viewPort.suspended !== true;\nvar NO_ACTION = {\n type: \"NO_ACTION\"\n};\nvar addTitleToLinks = (links, serverViewportId, label) => links.map(\n (link) => link.parentVpId === serverViewportId ? { ...link, label } : link\n);\nfunction addLabelsToLinks(links, viewports) {\n return links.map((linkDescriptor) => {\n const { parentVpId } = linkDescriptor;\n const viewport = viewports.get(parentVpId);\n if (viewport) {\n return {\n ...linkDescriptor,\n parentClientVpId: viewport.clientViewportId,\n label: viewport.title\n };\n } else {\n throw Error(\"addLabelsToLinks viewport not found\");\n }\n });\n}\nvar ServerProxy = class {\n constructor(connection, callback) {\n this.authToken = \"\";\n this.user = \"user\";\n this.pendingTableMetaRequests = /* @__PURE__ */ new Map();\n this.pendingRequests = /* @__PURE__ */ new Map();\n this.queuedRequests = [];\n this.cachedTableSchemas = /* @__PURE__ */ new Map();\n this.connection = connection;\n this.postMessageToClient = callback;\n this.viewports = /* @__PURE__ */ new Map();\n this.mapClientToServerViewport = /* @__PURE__ */ new Map();\n }\n async reconnect() {\n await this.login(this.authToken);\n const [activeViewports, inactiveViewports] = partition(\n Array.from(this.viewports.values()),\n isActiveViewport\n );\n this.viewports.clear();\n this.mapClientToServerViewport.clear();\n const reconnectViewports = (viewports) => {\n viewports.forEach((viewport) => {\n const { clientViewportId } = viewport;\n this.viewports.set(clientViewportId, viewport);\n this.sendMessageToServer(viewport.subscribe(), clientViewportId);\n });\n };\n reconnectViewports(activeViewports);\n setTimeout(() => {\n reconnectViewports(inactiveViewports);\n }, 2e3);\n }\n async login(authToken, user = \"user\") {\n if (authToken) {\n this.authToken = authToken;\n this.user = user;\n return new Promise((resolve, reject) => {\n this.sendMessageToServer(\n { type: LOGIN, token: this.authToken, user },\n \"\"\n );\n this.pendingLogin = { resolve, reject };\n });\n } else if (this.authToken === \"\") {\n error3(\"login, cannot login until auth token has been obtained\");\n }\n }\n subscribe(message) {\n if (!this.mapClientToServerViewport.has(message.viewport)) {\n if (!this.hasSchemaForTable(message.table) && // A Session table is never cached - it is limited to a single workflow interaction\n // The metadata for a session table is requested even before the subscribe call.\n !isSessionTable(message.table)) {\n info3 == null ? void 0 : info3(\n `subscribe to ${message.table.table}, no metadata yet, request metadata`\n );\n const requestId = nextRequestId();\n this.sendMessageToServer(\n { type: \"GET_TABLE_META\", table: message.table },\n requestId\n );\n this.pendingTableMetaRequests.set(requestId, message.viewport);\n }\n const viewport = new Viewport(message, this.postMessageToClient);\n this.viewports.set(message.viewport, viewport);\n this.sendIfReady(\n viewport.subscribe(),\n message.viewport,\n this.sessionId !== \"\"\n );\n } else {\n error3(`spurious subscribe call ${message.viewport}`);\n }\n }\n unsubscribe(clientViewportId) {\n const serverViewportId = this.mapClientToServerViewport.get(clientViewportId);\n if (serverViewportId) {\n info3 == null ? void 0 : info3(\n `Unsubscribe Message (Client to Server):\n ${serverViewportId}`\n );\n this.sendMessageToServer({\n type: REMOVE_VP,\n viewPortId: serverViewportId\n });\n } else {\n error3(\n `failed to unsubscribe client viewport ${clientViewportId}, viewport not found`\n );\n }\n }\n getViewportForClient(clientViewportId, throws = true) {\n const serverViewportId = this.mapClientToServerViewport.get(clientViewportId);\n if (serverViewportId) {\n const viewport = this.viewports.get(serverViewportId);\n if (viewport) {\n return viewport;\n } else if (throws) {\n throw Error(\n `Viewport not found for client viewport ${clientViewportId}`\n );\n } else {\n return null;\n }\n } else if (this.viewports.has(clientViewportId)) {\n return this.viewports.get(clientViewportId);\n } else if (throws) {\n throw Error(\n `Viewport server id not found for client viewport ${clientViewportId}`\n );\n } else {\n return null;\n }\n }\n /**********************************************************************/\n /* Handle messages from client */\n /**********************************************************************/\n setViewRange(viewport, message) {\n const requestId = nextRequestId();\n const [serverRequest, rows, debounceRequest] = viewport.rangeRequest(\n requestId,\n message.range\n );\n if (serverRequest) {\n if (true) {\n info3 == null ? void 0 : info3(\n `CHANGE_VP_RANGE [${message.range.from}-${message.range.to}] => [${serverRequest.from}-${serverRequest.to}]`\n );\n }\n this.sendIfReady(\n serverRequest,\n requestId,\n viewport.status === \"subscribed\"\n );\n }\n if (rows) {\n this.postMessageToClient({\n mode: \"batch\",\n type: \"viewport-update\",\n clientViewportId: viewport.clientViewportId,\n rows\n });\n } else if (debounceRequest) {\n this.postMessageToClient(debounceRequest);\n }\n }\n setConfig(viewport, message) {\n const requestId = nextRequestId();\n const request = viewport.setConfig(requestId, message.config);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n aggregate(viewport, message) {\n const requestId = nextRequestId();\n const request = viewport.aggregateRequest(requestId, message.aggregations);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n sort(viewport, message) {\n const requestId = nextRequestId();\n const request = viewport.sortRequest(requestId, message.sort);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n groupBy(viewport, message) {\n const requestId = nextRequestId();\n const request = viewport.groupByRequest(requestId, message.groupBy);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n filter(viewport, message) {\n const requestId = nextRequestId();\n const { filter } = message;\n const request = viewport.filterRequest(requestId, filter);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n setColumns(viewport, message) {\n const requestId = nextRequestId();\n const { columns } = message;\n const request = viewport.columnRequest(requestId, columns);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n setTitle(viewport, message) {\n if (viewport) {\n viewport.title = message.title;\n this.updateTitleOnVisualLinks(viewport);\n }\n }\n select(viewport, message) {\n const requestId = nextRequestId();\n const { selected } = message;\n const request = viewport.selectRequest(requestId, selected);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n disableViewport(viewport) {\n const requestId = nextRequestId();\n const request = viewport.disable(requestId);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n enableViewport(viewport) {\n if (viewport.disabled) {\n const requestId = nextRequestId();\n const request = viewport.enable(requestId);\n this.sendIfReady(request, requestId, viewport.status === \"subscribed\");\n }\n }\n suspendViewport(viewport) {\n viewport.suspend();\n viewport.suspendTimer = setTimeout(() => {\n info3 == null ? void 0 : info3(\"suspendTimer expired, escalate suspend to disable\");\n this.disableViewport(viewport);\n }, 3e3);\n }\n resumeViewport(viewport) {\n if (viewport.suspendTimer) {\n debug4 == null ? void 0 : debug4(\"clear suspend timer\");\n clearTimeout(viewport.suspendTimer);\n viewport.suspendTimer = null;\n }\n const rows = viewport.resume();\n this.postMessageToClient({\n clientViewportId: viewport.clientViewportId,\n mode: \"batch\",\n rows,\n type: \"viewport-update\"\n });\n }\n openTreeNode(viewport, message) {\n if (viewport.serverViewportId) {\n const requestId = nextRequestId();\n this.sendIfReady(\n viewport.openTreeNode(requestId, message),\n requestId,\n viewport.status === \"subscribed\"\n );\n }\n }\n closeTreeNode(viewport, message) {\n if (viewport.serverViewportId) {\n const requestId = nextRequestId();\n this.sendIfReady(\n viewport.closeTreeNode(requestId, message),\n requestId,\n viewport.status === \"subscribed\"\n );\n }\n }\n createLink(viewport, message) {\n const { parentClientVpId, parentColumnName, childColumnName } = message;\n const requestId = nextRequestId();\n const parentVpId = this.mapClientToServerViewport.get(parentClientVpId);\n if (parentVpId) {\n const request = viewport.createLink(\n requestId,\n childColumnName,\n parentVpId,\n parentColumnName\n );\n this.sendMessageToServer(request, requestId);\n } else {\n error3(\"ServerProxy unable to create link, viewport not found\");\n }\n }\n removeLink(viewport) {\n const requestId = nextRequestId();\n const request = viewport.removeLink(requestId);\n this.sendMessageToServer(request, requestId);\n }\n updateTitleOnVisualLinks(viewport) {\n var _a;\n const { serverViewportId, title } = viewport;\n for (const vp of this.viewports.values()) {\n if (vp !== viewport && vp.links && serverViewportId && title) {\n if ((_a = vp.links) == null ? void 0 : _a.some((link) => link.parentVpId === serverViewportId)) {\n const [messageToClient] = vp.setLinks(\n addTitleToLinks(vp.links, serverViewportId, title)\n );\n this.postMessageToClient(messageToClient);\n }\n }\n }\n }\n removeViewportFromVisualLinks(serverViewportId) {\n var _a;\n for (const vp of this.viewports.values()) {\n if ((_a = vp.links) == null ? void 0 : _a.some(({ parentVpId }) => parentVpId === serverViewportId)) {\n const [messageToClient] = vp.setLinks(\n vp.links.filter(({ parentVpId }) => parentVpId !== serverViewportId)\n );\n this.postMessageToClient(messageToClient);\n }\n }\n }\n menuRpcCall(message) {\n const viewport = this.getViewportForClient(message.vpId, false);\n if (viewport == null ? void 0 : viewport.serverViewportId) {\n const [requestId, rpcRequest] = stripRequestId(message);\n this.sendMessageToServer(\n {\n ...rpcRequest,\n vpId: viewport.serverViewportId\n },\n requestId\n );\n }\n }\n rpcCall(message) {\n const [requestId, rpcRequest] = stripRequestId(message);\n const module = getRpcServiceModule(rpcRequest.service);\n this.sendMessageToServer(rpcRequest, requestId, { module });\n }\n handleMessageFromClient(message) {\n debug4 == null ? void 0 : debug4(`handleMessageFromClient: ${message.type}`);\n if (isViewporttMessage(message)) {\n if (message.type === \"disable\") {\n const viewport = this.getViewportForClient(message.viewport, false);\n if (viewport !== null) {\n return this.disableViewport(viewport);\n } else {\n return;\n }\n } else {\n const viewport = this.getViewportForClient(message.viewport);\n switch (message.type) {\n case \"setViewRange\":\n return this.setViewRange(viewport, message);\n case \"config\":\n return this.setConfig(viewport, message);\n case \"aggregate\":\n return this.aggregate(viewport, message);\n case \"sort\":\n return this.sort(viewport, message);\n case \"groupBy\":\n return this.groupBy(viewport, message);\n case \"filter\":\n return this.filter(viewport, message);\n case \"select\":\n return this.select(viewport, message);\n case \"suspend\":\n return this.suspendViewport(viewport);\n case \"resume\":\n return this.resumeViewport(viewport);\n case \"enable\":\n return this.enableViewport(viewport);\n case \"openTreeNode\":\n return this.openTreeNode(viewport, message);\n case \"closeTreeNode\":\n return this.closeTreeNode(viewport, message);\n case \"createLink\":\n return this.createLink(viewport, message);\n case \"removeLink\":\n return this.removeLink(viewport);\n case \"setColumns\":\n return this.setColumns(viewport, message);\n case \"setTitle\":\n return this.setTitle(viewport, message);\n default:\n }\n }\n } else if (isVuuMenuRpcRequest(message)) {\n return this.menuRpcCall(message);\n } else {\n const { type, requestId } = message;\n switch (type) {\n case \"GET_TABLE_LIST\":\n return this.sendMessageToServer({ type }, requestId);\n case \"GET_TABLE_META\":\n return this.sendMessageToServer(\n { type, table: message.table },\n requestId\n );\n case \"RPC_CALL\":\n return this.rpcCall(message);\n default:\n }\n }\n error3(\n `Vuu ServerProxy Unexpected message from client ${JSON.stringify(\n message\n )}`\n );\n }\n awaitResponseToMessage(message) {\n return new Promise((resolve, reject) => {\n const requestId = nextRequestId();\n this.sendMessageToServer(message, requestId);\n this.pendingRequests.set(requestId, { reject, resolve });\n });\n }\n sendIfReady(message, requestId, isReady = true) {\n if (isReady) {\n this.sendMessageToServer(message, requestId);\n } else {\n this.queuedRequests.push(message);\n }\n return isReady;\n }\n sendMessageToServer(body, requestId = `${_requestId++}`, options = DEFAULT_OPTIONS) {\n const { module = \"CORE\" } = options;\n if (this.authToken) {\n this.connection.send({\n requestId,\n sessionId: this.sessionId,\n token: this.authToken,\n user: this.user,\n module,\n body\n });\n }\n }\n handleMessageFromServer(message) {\n var _a, _b, _c;\n const { body, requestId, sessionId } = message;\n const pendingRequest = this.pendingRequests.get(requestId);\n if (pendingRequest) {\n const { resolve } = pendingRequest;\n this.pendingRequests.delete(requestId);\n resolve(body);\n return;\n }\n const { viewports } = this;\n switch (body.type) {\n case HB:\n this.sendMessageToServer(\n { type: HB_RESP, ts: +/* @__PURE__ */ new Date() },\n \"NA\"\n );\n break;\n case LOGIN_SUCCESS:\n if (sessionId) {\n this.sessionId = sessionId;\n (_a = this.pendingLogin) == null ? void 0 : _a.resolve(sessionId);\n this.pendingLogin = void 0;\n } else {\n throw Error(\"LOGIN_SUCCESS did not provide sessionId\");\n }\n break;\n case CREATE_VP_SUCCESS:\n {\n const viewport = viewports.get(requestId);\n if (viewport) {\n const { status: viewportStatus } = viewport;\n const { viewPortId: serverViewportId } = body;\n if (requestId !== serverViewportId) {\n viewports.delete(requestId);\n viewports.set(serverViewportId, viewport);\n }\n this.mapClientToServerViewport.set(requestId, serverViewportId);\n const response = viewport.handleSubscribed(body);\n if (response) {\n this.postMessageToClient(response);\n if (debugEnabled4) {\n debug4(\n `post DataSourceSubscribedMessage to client: ${JSON.stringify(\n response\n )}`\n );\n }\n }\n if (viewport.disabled) {\n this.disableViewport(viewport);\n }\n if (viewportStatus === \"subscribing\" && // A session table will never have Visual Links, nor Context Menus\n !isSessionTable(viewport.table)) {\n this.sendMessageToServer({\n type: GET_VP_VISUAL_LINKS,\n vpId: serverViewportId\n });\n this.sendMessageToServer({\n type: GET_VIEW_PORT_MENUS,\n vpId: serverViewportId\n });\n Array.from(viewports.entries()).filter(\n ([id, { disabled }]) => id !== serverViewportId && !disabled\n ).forEach(([vpId]) => {\n this.sendMessageToServer({\n type: GET_VP_VISUAL_LINKS,\n vpId\n });\n });\n }\n }\n }\n break;\n case \"REMOVE_VP_SUCCESS\":\n {\n const viewport = this.viewports.get(body.viewPortId);\n if (viewport) {\n this.mapClientToServerViewport.delete(viewport.clientViewportId);\n viewports.delete(body.viewPortId);\n this.removeViewportFromVisualLinks(body.viewPortId);\n }\n }\n break;\n case SET_SELECTION_SUCCESS:\n {\n const viewport = this.viewports.get(body.vpId);\n if (viewport) {\n viewport.completeOperation(requestId);\n }\n }\n break;\n case CHANGE_VP_SUCCESS:\n case DISABLE_VP_SUCCESS:\n if (viewports.has(body.viewPortId)) {\n const viewport = this.viewports.get(body.viewPortId);\n if (viewport) {\n const response = viewport.completeOperation(requestId);\n if (response !== void 0) {\n this.postMessageToClient(response);\n if (debugEnabled4) {\n debug4(`postMessageToClient ${JSON.stringify(response)}`);\n }\n }\n }\n }\n break;\n case ENABLE_VP_SUCCESS:\n {\n const viewport = this.viewports.get(body.viewPortId);\n if (viewport) {\n const response = viewport.completeOperation(requestId);\n if (response) {\n this.postMessageToClient(response);\n const rows = viewport.currentData();\n debugEnabled4 && debug4(\n `Enable Response (ServerProxy to Client): ${JSON.stringify(\n response\n )}`\n );\n if (viewport.size === 0) {\n debugEnabled4 && debug4(`Viewport Enabled but size 0, resend to server`);\n } else {\n this.postMessageToClient({\n clientViewportId: viewport.clientViewportId,\n mode: \"batch\",\n rows,\n size: viewport.size,\n type: \"viewport-update\"\n });\n debugEnabled4 && debug4(\n `Enable Response (ServerProxy to Client): send size ${viewport.size} ${rows.length} rows from cache`\n );\n }\n }\n }\n }\n break;\n case TABLE_ROW:\n {\n const viewportRowMap = groupRowsByViewport(body.rows);\n if (debugEnabled4) {\n const [firstRow, secondRow] = body.rows;\n if (body.rows.length === 0) {\n debug4(\"handleMessageFromServer TABLE_ROW 0 rows\");\n } else if ((firstRow == null ? void 0 : firstRow.rowIndex) === -1) {\n if (body.rows.length === 1) {\n if (firstRow.updateType === \"SIZE\") {\n debug4(\n `handleMessageFromServer [${firstRow.viewPortId}] TABLE_ROW SIZE ONLY ${firstRow.vpSize}`\n );\n } else {\n debug4(\n `handleMessageFromServer [${firstRow.viewPortId}] TABLE_ROW SIZE ${firstRow.vpSize} rowIdx ${firstRow.rowIndex}`\n );\n }\n } else {\n debug4(\n `handleMessageFromServer TABLE_ROW ${body.rows.length} rows, SIZE ${firstRow.vpSize}, [${secondRow == null ? void 0 : secondRow.rowIndex}] - [${(_b = body.rows[body.rows.length - 1]) == null ? void 0 : _b.rowIndex}]`\n );\n }\n } else {\n debug4(\n `handleMessageFromServer TABLE_ROW ${body.rows.length} rows [${firstRow == null ? void 0 : firstRow.rowIndex}] - [${(_c = body.rows[body.rows.length - 1]) == null ? void 0 : _c.rowIndex}]`\n );\n }\n }\n for (const [viewportId, rows] of Object.entries(viewportRowMap)) {\n const viewport = viewports.get(viewportId);\n if (viewport) {\n viewport.updateRows(rows);\n } else {\n warn3 == null ? void 0 : warn3(\n `TABLE_ROW message received for non registered viewport ${viewportId}`\n );\n }\n }\n this.processUpdates();\n }\n break;\n case CHANGE_VP_RANGE_SUCCESS:\n {\n const viewport = this.viewports.get(body.viewPortId);\n if (viewport) {\n const { from, to } = body;\n if (true) {\n info3 == null ? void 0 : info3(`CHANGE_VP_RANGE_SUCCESS ${from} - ${to}`);\n }\n viewport.completeOperation(requestId, from, to);\n }\n }\n break;\n case OPEN_TREE_SUCCESS:\n case CLOSE_TREE_SUCCESS:\n break;\n case \"CREATE_VISUAL_LINK_SUCCESS\":\n {\n const viewport = this.viewports.get(body.childVpId);\n const parentViewport = this.viewports.get(body.parentVpId);\n if (viewport && parentViewport) {\n const { childColumnName, parentColumnName } = body;\n const response = viewport.completeOperation(\n requestId,\n childColumnName,\n parentViewport.clientViewportId,\n parentColumnName\n );\n if (response) {\n this.postMessageToClient(response);\n }\n }\n }\n break;\n case \"REMOVE_VISUAL_LINK_SUCCESS\":\n {\n const viewport = this.viewports.get(body.childVpId);\n if (viewport) {\n const response = viewport.completeOperation(\n requestId\n );\n if (response) {\n this.postMessageToClient(response);\n }\n }\n }\n break;\n case TABLE_LIST_RESP:\n this.postMessageToClient({\n type: TABLE_LIST_RESP,\n tables: body.tables,\n requestId\n });\n break;\n case TABLE_META_RESP:\n {\n const tableSchema = this.cacheTableMeta(body);\n const clientViewportId = this.pendingTableMetaRequests.get(requestId);\n if (clientViewportId) {\n this.pendingTableMetaRequests.delete(requestId);\n const viewport = this.viewports.get(clientViewportId);\n if (viewport) {\n viewport.setTableSchema(tableSchema);\n } else {\n warn3 == null ? void 0 : warn3(\n \"Message has come back AFTER CREATE_VP_SUCCESS, what do we do now\"\n );\n }\n } else {\n this.postMessageToClient({\n type: TABLE_META_RESP,\n tableSchema,\n requestId\n });\n }\n }\n break;\n case \"VP_VISUAL_LINKS_RESP\":\n {\n const activeLinkDescriptors = this.getActiveLinks(body.links);\n const viewport = this.viewports.get(body.vpId);\n if (activeLinkDescriptors.length && viewport) {\n const linkDescriptorsWithLabels = addLabelsToLinks(\n activeLinkDescriptors,\n this.viewports\n );\n const [clientMessage, pendingLink] = viewport.setLinks(\n linkDescriptorsWithLabels\n );\n this.postMessageToClient(clientMessage);\n if (pendingLink) {\n const { link, parentClientVpId } = pendingLink;\n const requestId2 = nextRequestId();\n const serverViewportId = this.mapClientToServerViewport.get(parentClientVpId);\n if (serverViewportId) {\n const message2 = viewport.createLink(\n requestId2,\n link.fromColumn,\n serverViewportId,\n link.toColumn\n );\n this.sendMessageToServer(message2, requestId2);\n }\n }\n }\n }\n break;\n case \"VIEW_PORT_MENUS_RESP\":\n if (body.menu.name) {\n const viewport = this.viewports.get(body.vpId);\n if (viewport) {\n const clientMessage = viewport.setMenu(body.menu);\n this.postMessageToClient(clientMessage);\n }\n }\n break;\n case \"VP_EDIT_RPC_RESPONSE\":\n {\n this.postMessageToClient({\n action: body.action,\n requestId,\n rpcName: body.rpcName,\n type: \"VP_EDIT_RPC_RESPONSE\"\n });\n }\n break;\n case \"VP_EDIT_RPC_REJECT\":\n {\n const viewport = this.viewports.get(body.vpId);\n if (viewport) {\n this.postMessageToClient({\n requestId,\n type: \"VP_EDIT_RPC_REJECT\",\n error: body.error\n });\n }\n }\n break;\n case \"VIEW_PORT_MENU_RESP\":\n {\n if (isSessionTableActionMessage(body)) {\n const { action, rpcName } = body;\n this.awaitResponseToMessage({\n type: \"GET_TABLE_META\",\n table: action.table\n }).then((response) => {\n const tableSchema = createSchemaFromTableMetadata(\n response\n );\n this.postMessageToClient({\n rpcName,\n type: \"VIEW_PORT_MENU_RESP\",\n action: {\n ...action,\n tableSchema\n },\n tableAlreadyOpen: this.isTableOpen(action.table),\n requestId\n });\n });\n } else {\n const { action } = body;\n this.postMessageToClient({\n type: \"VIEW_PORT_MENU_RESP\",\n action: action || NO_ACTION,\n tableAlreadyOpen: action !== null && this.isTableOpen(action.table),\n requestId\n });\n }\n }\n break;\n case RPC_RESP:\n {\n const { method, result } = body;\n this.postMessageToClient({\n type: RPC_RESP,\n method,\n result,\n requestId\n });\n }\n break;\n case \"ERROR\":\n error3(body.msg);\n break;\n default:\n infoEnabled3 && info3(`handleMessageFromServer ${body[\"type\"]}.`);\n }\n }\n hasSchemaForTable(table) {\n return this.cachedTableSchemas.has(`${table.module}:${table.table}`);\n }\n cacheTableMeta(messageBody) {\n const { module, table } = messageBody.table;\n const key = `${module}:${table}`;\n let tableSchema = this.cachedTableSchemas.get(key);\n if (!tableSchema) {\n tableSchema = createSchemaFromTableMetadata(messageBody);\n this.cachedTableSchemas.set(key, tableSchema);\n }\n return tableSchema;\n }\n isTableOpen(table) {\n if (table) {\n const tableName = table.table;\n for (const viewport of this.viewports.values()) {\n if (!viewport.suspended && viewport.table.table === tableName) {\n return true;\n }\n }\n }\n }\n // Eliminate links to suspended viewports\n getActiveLinks(linkDescriptors) {\n return linkDescriptors.filter((linkDescriptor) => {\n const viewport = this.viewports.get(linkDescriptor.parentVpId);\n return viewport && !viewport.suspended;\n });\n }\n processUpdates() {\n this.viewports.forEach((viewport) => {\n var _a;\n if (viewport.hasUpdatesToProcess) {\n const result = viewport.getClientRows();\n if (result !== NO_DATA_UPDATE) {\n const [rows, mode] = result;\n const size = viewport.getNewRowCount();\n if (size !== void 0 || rows && rows.length > 0) {\n debugEnabled4 && debug4(\n `postMessageToClient #${viewport.clientViewportId} viewport-update ${mode}, ${(_a = rows == null ? void 0 : rows.length) != null ? _a : \"no\"} rows, size ${size}`\n );\n if (size) {\n console.log(\n `send size to client (along with ${rows == null ? void 0 : rows.length} rows)`\n );\n }\n if (mode) {\n this.postMessageToClient({\n clientViewportId: viewport.clientViewportId,\n mode,\n rows,\n size,\n type: \"viewport-update\"\n });\n }\n }\n }\n }\n });\n }\n};\n\n// src/worker.ts\nvar server;\nvar { info: info4, infoEnabled: infoEnabled4 } = logger(\"worker\");\nasync function connectToServer(url, protocol, token, username, onConnectionStatusChange) {\n const connection = await connect(\n url,\n protocol,\n // if this was called during connect, we would get a ReferenceError, but it will\n // never be called until subscriptions have been made, so this is safe.\n //TODO do we need to listen in to the connection messages here so we can lock back in, in the event of a reconnenct ?\n (msg) => {\n if (isConnectionQualityMetrics(msg))\n postMessage({ type: \"connection-metrics\", messages: msg });\n else if (isConnectionStatusMessage(msg)) {\n onConnectionStatusChange(msg);\n if (msg.status === \"reconnected\") {\n server.reconnect();\n }\n } else {\n server.handleMessageFromServer(msg);\n }\n }\n );\n server = new ServerProxy(connection, (msg) => sendMessageToClient(msg));\n if (connection.requiresLogin) {\n await server.login(token, username);\n }\n}\nfunction sendMessageToClient(message) {\n postMessage(message);\n}\nvar handleMessageFromClient = async ({\n data: message\n}) => {\n switch (message.type) {\n case \"connect\":\n await connectToServer(\n message.url,\n message.protocol,\n message.token,\n message.username,\n postMessage\n );\n postMessage({ type: \"connected\" });\n break;\n case \"subscribe\":\n infoEnabled4 && info4(`client subscribe: ${JSON.stringify(message)}`);\n server.subscribe(message);\n break;\n case \"unsubscribe\":\n infoEnabled4 && info4(`client unsubscribe: ${JSON.stringify(message)}`);\n server.unsubscribe(message.viewport);\n break;\n default:\n infoEnabled4 && info4(`client message: ${JSON.stringify(message)}`);\n server.handleMessageFromClient(message);\n }\n};\nself.addEventListener(\"message\", handleMessageFromClient);\npostMessage({ type: \"ready\" });\n\n";
1
+ export const workerSourceCode: "\nvar de=(r,e,t)=>{if(!e.has(r))throw TypeError(\"Cannot \"+t)};var c=(r,e,t)=>(de(r,e,\"read from private field\"),t?t.call(r):e.get(r)),N=(r,e,t)=>{if(e.has(r))throw TypeError(\"Cannot add the same private member more than once\");e instanceof WeakSet?e.add(r):e.set(r,t)},fe=(r,e,t,s)=>(de(r,e,\"write to private field\"),s?s.call(r,t):e.set(r,t),t);function he(r,e,t=[],s=[]){for(let n=0,o=r.length;n<o;n++)(e(r[n],n)?t:s).push(r[n]);return[t,s]}var I={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:6,SELECTED:7,count:8,PARENT_IDX:\"parent_idx\",IDX_POINTER:\"idx_pointer\",FILTER_COUNT:\"filter_count\",NEXT_FILTER_IDX:\"next_filter_idx\"};var{DEPTH:Bt,IS_LEAF:Kt}=I;var me=r=>{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split(\"; \").find(s=>s.startsWith(`${r}=`)))==null?void 0:t.split(\"=\")[1]};function Y({from:r,to:e},t=0,s=Number.MAX_SAFE_INTEGER){if(t===0)return s<r?{from:0,to:0}:{from:r,to:Math.min(e,s)};if(r===0)return{from:r,to:Math.min(e+t,s)};{let n=e-r,o=Math.round(t/2),i=r-o<0,u=s-(e+o)<0;return i&&u?{from:0,to:s}:i?{from:0,to:n+t}:u?{from:Math.max(0,s-(n+t)),to:s}:{from:r-o,to:e+o}}}var ot=(r,{from:e,to:t})=>r>=e&&r<t;var v=class{constructor(e,t){this.from=e,this.to=t}isWithin(e){return ot(e,this)}overlap(e,t){return e>=this.to||t<this.from?[0,0]:[Math.max(e,this.from),Math.min(t,this.to)]}copy(){return new v(this.from,this.to)}};var{KEY:Qt}=I;var it=[\"error\",\"warn\",\"info\",\"debug\"],at=r=>typeof r==\"string\"&&it.includes(r),ut=\"error\",F=()=>{},lt=\"error\",{loggingLevel:W=lt}=ct(),R=r=>{let e=W===\"debug\",t=e||W===\"info\",s=t||W===\"warn\",n=s||W===\"error\",o=t?f=>console.info(`[${r}] ${f}`):F,i=s?f=>console.warn(`[${r}] ${f}`):F,u=e?f=>console.debug(`[${r}] ${f}`):F;return{errorEnabled:n,error:n?f=>console.error(`[${r}] ${f}`):F}};function ct(){return typeof loggingSettings<\"u\"?loggingSettings:{loggingLevel:pt()}}function pt(){let r=me(\"vuu-logging-level\");return at(r)?r:ut}var{debug:gt,debugEnabled:dt}=R(\"range-monitor\"),q=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:s}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),s)dt&&gt(`<${this.source}> [${e}-${t}], ${(this.timestamp-s).toFixed(0)} ms elapsed`);else return 0}};function Ce(r){return Array.isArray(r)}function ft(r){return!Array.isArray(r)}var S,be=class{constructor(){N(this,S,new Map)}addListener(e,t){let s=c(this,S).get(e);s?Ce(s)?s.push(t):ft(s)&&c(this,S).set(e,[s,t]):c(this,S).set(e,t)}removeListener(e,t){if(!c(this,S).has(e))return;let s=c(this,S).get(e),n=-1;if(s===t)c(this,S).delete(e);else if(Array.isArray(s)){for(let o=length;o-- >0;)if(s[o]===t){n=o;break}if(n<0)return;s.length===1?(s.length=0,c(this,S).delete(e)):s.splice(n,1)}}removeAllListeners(e){e&&c(this,S).has(e)?c(this,S).delete(e):e===void 0&&c(this,S).clear()}emit(e,...t){if(c(this,S)){let s=c(this,S).get(e);s&&this.invokeHandler(s,t)}}once(e,t){let s=(...n)=>{this.removeListener(e,s),t(...n)};this.on(e,s)}on(e,t){this.addListener(e,t)}invokeHandler(e,t){if(Ce(e))e.slice().forEach(s=>this.invokeHandler(s,t));else switch(t.length){case 0:e();break;case 1:e(t[0]);break;case 2:e(t[0],t[1]);break;default:e.call(null,...t)}}};S=new WeakMap;var $=String.fromCharCode(8200),h=String.fromCharCode(8199);var cs={DIGIT:h,TWO_DIGITS:h+h,THREE_DIGITS:h+h+h,FULL_PADDING:[null,$+h,$+h+h,$+h+h+h,$+h+h+h+h]};var ps=h+h+h+h+h+h+h+h+h;var ht={Enter:\"Enter\",Delete:\"Delete\"},mt={Home:\"Home\",End:\"End\",ArrowRight:\"ArrowRight\",ArrowLeft:\"ArrowLeft\",ArrowDown:\"ArrowDown\",ArrowUp:\"ArrowUp\",Tab:\"Tab\"},Ct={F1:\"F1\",F2:\"F2\",F3:\"F3\",F4:\"F4\",F5:\"F5\",F6:\"F6\",F7:\"F7\",F8:\"F8\",F9:\"F9\",F10:\"F10\",F11:\"F11\",F12:\"F12\"},Ms={...ht,...mt,...Ct};var{COUNT:xs}=I;var G=class{constructor(e){this.keys=new Map,this.free=[],this.nextKeyValue=0,this.reset(e)}next(){return this.free.length>0?this.free.pop():this.nextKeyValue++}reset({from:e,to:t}){this.keys.forEach((n,o)=>{(o<e||o>=t)&&(this.free.push(n),this.keys.delete(o))});let s=t-e;this.keys.size+this.free.length>s&&(this.free.length=Math.max(0,s-this.keys.size));for(let n=e;n<t;n++)if(!this.keys.has(n)){let o=this.next();this.keys.set(n,o)}this.nextKeyValue>this.keys.size&&(this.nextKeyValue=this.keys.size)}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(`key not found\n keys: ${this.toDebugString()}\n free : ${this.free.join(\",\")} \n `),Error(`KeySet, no key found for rowIndex ${e}`);return t}toDebugString(){return Array.from(this.keys.entries()).map((e,t)=>`${e}=>${t}`).join(\",\")}};var{IDX:Fs}=I;var{SELECTED:$s}=I,_={False:0,True:1,First:2,Last:4};var Gs=_.True+_.First+_.Last,Bs=_.True+_.First,Ks=_.True+_.Last;var Se=r=>{if(r.every(t=>typeof t==\"number\"))return r;let e=[];for(let t of r)if(typeof t==\"number\")e.push(t);else for(let s=t[0];s<=t[1];s++)e.push(s);return e};var{debug:xn,debugEnabled:Pn,error:Te,info:V,infoEnabled:bt,warn:x}=R(\"websocket-connection\"),Re=\"ws\",St=r=>r.startsWith(Re+\"://\")||r.startsWith(Re+\"s://\"),ye={},Q=Symbol(\"setWebsocket\"),A=Symbol(\"connectionCallback\");async function we(r,e,t){return ee(r,e,t)}async function Z(r){ee(r.url,r.protocol,r[A],r)}async function ee(r,e,t,s){let n=ye[r]||(ye[r]={attemptsRemaining:5,status:\"disconnected\"});try{t({type:\"connection-status\",status:\"connecting\"});let o=typeof s<\"u\",i=await Rt(r,e);console.info(\"%c⚡ %cconnected\",\"font-size: 24px;color: green;font-weight: bold;\",\"color:green; font-size: 14px;\"),s!==void 0&&s[Q](i);let u=s!=null?s:new X(i,r,e,t),d=o?\"reconnected\":\"connection-open-awaiting-session\";return t({type:\"connection-status\",status:d}),u.status=d,u}catch(o){console.log({evt:o});let i=--n.attemptsRemaining>0;if(t({type:\"connection-status\",status:\"disconnected\",reason:\"failed to connect\",retry:i}),i)return Tt(r,e,t,s,1e4);throw Error(\"Failed to establish connection\")}}var Tt=(r,e,t,s,n)=>new Promise(o=>{setTimeout(()=>{o(ee(r,e,t,s))},n)}),Rt=(r,e)=>new Promise((t,s)=>{let n=St(r)?r:`wss://${r}`;bt&&e!==void 0&&V(`WebSocket Protocol ${e==null?void 0:e.toString()}`);let o=new WebSocket(n,e);o.onopen=()=>t(o),o.onerror=i=>s(i)}),Ee=()=>{x==null||x(\"Connection cannot be closed, socket not yet opened\")},Ve=r=>{x==null||x(`Message cannot be sent, socket closed ${r.body.type}`)},yt=r=>{try{return JSON.parse(r)}catch{throw Error(`Error parsing JSON response from server ${r}`)}},X=class{constructor(e,t,s,n){this.close=Ee;this.requiresLogin=!0;this.send=Ve;this.status=\"ready\";this.messagesCount=0;this.connectionMetricsInterval=null;this.handleWebsocketMessage=e=>{let t=yt(e.data);this.messagesCount+=1,this[A](t)};this.url=t,this.protocol=s,this[A]=n,this[Q](e)}reconnect(){Z(this)}[(A,Q)](e){let t=this[A];e.onmessage=o=>{this.status=\"connected\",e.onmessage=this.handleWebsocketMessage,this.handleWebsocketMessage(o)},this.connectionMetricsInterval=setInterval(()=>{t({type:\"connection-metrics\",messagesLength:this.messagesCount}),this.messagesCount=0},1e3),e.onerror=()=>{Te(\"⚡ connection error\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"error\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status===\"connection-open-awaiting-session\"?Te(\"Websocket connection lost before Vuu session established, check websocket configuration\"):this.status!==\"closed\"&&(Z(this),this.send=n)},e.onclose=()=>{V==null||V(\"⚡ connection close\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"close\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!==\"closed\"&&(Z(this),this.send=n)};let s=o=>{e.send(JSON.stringify(o))},n=o=>{V==null||V(`TODO queue message until websocket reconnected ${o.body.type}`)};this.send=s,this.close=()=>{this.status=\"closed\",e.close(),this.close=Ee,this.send=Ve,V==null||V(\"close websocket\")}}};var Et=[\"VIEW_PORT_MENUS_SELECT_RPC\",\"VIEW_PORT_MENU_TABLE_RPC\",\"VIEW_PORT_MENU_ROW_RPC\",\"VIEW_PORT_MENU_CELL_RPC\",\"VP_EDIT_CELL_RPC\",\"VP_EDIT_ROW_RPC\",\"VP_EDIT_ADD_ROW_RPC\",\"VP_EDIT_DELETE_CELL_RPC\",\"VP_EDIT_DELETE_ROW_RPC\",\"VP_EDIT_SUBMIT_FORM_RPC\"],Me=r=>Et.includes(r.type),te=({requestId:r,...e})=>[r,e],Ie=r=>{let e=r.at(0);if(e.updateType===\"SIZE\"){if(r.length===1)return r;e=r.at(1)}let t=r.at(-1);return[e,t]},ve=r=>{let e={};for(let t of r)(e[t.viewPortId]||(e[t.viewPortId]=[])).push(t);return e};var se=({columns:r,dataTypes:e,key:t,table:s})=>({table:s,columns:r.map((n,o)=>({name:n,serverDataType:e[o]})),key:t});var _e=r=>r.type===\"connection-status\",De=r=>r.type===\"connection-metrics\";var xe=r=>\"viewport\"in r,Pe=r=>r.type===\"VIEW_PORT_MENU_RESP\"&&r.action!==null&&B(r.action.table),B=r=>r!==null&&typeof r==\"object\"&&\"table\"in r&&\"module\"in r?r.table.startsWith(\"session\"):!1;var Oe=\"CHANGE_VP_SUCCESS\",Le=\"CHANGE_VP_RANGE_SUCCESS\",ke=\"CLOSE_TREE_NODE\",Ae=\"CLOSE_TREE_SUCCESS\";var Ue=\"CREATE_VP\",Ne=\"CREATE_VP_SUCCESS\",Fe=\"DISABLE_VP\",We=\"DISABLE_VP_SUCCESS\";var qe=\"ENABLE_VP\",$e=\"ENABLE_VP_SUCCESS\";var ne=\"GET_VP_VISUAL_LINKS\",Ge=\"GET_VIEW_PORT_MENUS\";var Be=\"HB\",Ke=\"HB_RESP\",He=\"LOGIN\",ze=\"LOGIN_SUCCESS\",je=\"OPEN_TREE_NODE\",Je=\"OPEN_TREE_SUCCESS\";var Ye=\"REMOVE_VP\";var re=\"RPC_RESP\";var Ze=\"SET_SELECTION_SUCCESS\",oe=\"TABLE_META_RESP\",ie=\"TABLE_LIST_RESP\",Qe=\"TABLE_ROW\";var et=r=>{switch(r){case\"TypeAheadRpcHandler\":return\"TYPEAHEAD\";default:return\"SIMUL\"}};var tt=[],y=R(\"array-backed-moving-window\"),C,K=class{constructor({from:e,to:t},{from:s,to:n},o){N(this,C,void 0);this.setRowCount=e=>{var t;if((t=y.info)==null||t.call(y,`setRowCount ${e}`),e<this.internalData.length&&(this.internalData.length=e),e<this.rowCount){this.rowsWithinRange=0;let s=Math.min(e,this.clientRange.to);for(let n=this.clientRange.from;n<s;n++){let o=n-c(this,C).from;this.internalData[o]!==void 0&&(this.rowsWithinRange+=1)}}this.rowCount=e};this.bufferBreakout=(e,t)=>{let s=this.bufferSize*.25;return c(this,C).to-t<s?!0:c(this,C).from>0&&e-c(this,C).from<s};this.bufferSize=o,this.clientRange=new v(e,t),fe(this,C,new v(s,n)),this.internalData=new Array(o),this.rowsWithinRange=0,this.rowCount=0}get range(){return c(this,C)}get hasAllRowsWithinRange(){return this.rowsWithinRange===this.clientRange.to-this.clientRange.from||this.rowCount>0&&this.clientRange.from+this.rowsWithinRange===this.rowCount}outOfRange(e,t){let{from:s,to:n}=this.range;if(t<s||e>=n)return!0}setAtIndex(e){let{rowIndex:t}=e,s=this.isWithinClientRange(t);if(s||this.isWithinRange(t)){let n=t-c(this,C).from;!this.internalData[n]&&s&&(this.rowsWithinRange+=1),this.internalData[n]=e}return s}getAtIndex(e){return c(this,C).isWithin(e)&&this.internalData[e-c(this,C).from]!=null?this.internalData[e-c(this,C).from]:void 0}isWithinRange(e){return c(this,C).isWithin(e)}isWithinClientRange(e){return this.clientRange.isWithin(e)}setClientRange(e,t){var f;(f=y.debug)==null||f.call(y,`setClientRange ${e} - ${t}`);let s=this.clientRange.from,n=Math.min(this.clientRange.to,this.rowCount);if(e===s&&t===n)return[!1,tt];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let a=e;a<t;a++){let l=a-c(this,C).from;this.internalData[l]&&(this.rowsWithinRange+=1)}let i=tt,u=c(this,C).from;if(this.hasAllRowsWithinRange)if(t>o.to){let a=Math.max(e,o.to);i=this.internalData.slice(a-u,t-u)}else{let a=Math.min(o.from,t);i=this.internalData.slice(e-u,a-u)}return[this.bufferBreakout(e,t),i]}setRange(e,t){var i;(i=y.debug)==null||i.call(y,`setRange ${e} - ${t}`);let[s,n]=c(this,C).overlap(e,t),o=new Array(t-e+this.bufferSize);this.rowsWithinRange=0;for(let u=s;u<n;u++){let d=this.getAtIndex(u);if(d){let f=u-e;o[f]=d,this.isWithinClientRange(u)&&(this.rowsWithinRange+=1)}}this.internalData=o,c(this,C).from=e,c(this,C).to=t}getData(){var u;let{from:e,to:t}=c(this,C),{from:s,to:n}=this.clientRange,o=Math.max(0,s-e),i=Math.min(t-e,t,n-e,(u=this.rowCount)!=null?u:t);return this.internalData.slice(o,i)}clear(){var e;(e=y.debug)==null||e.call(y,\"clear\"),this.internalData.length=0,this.rowsWithinRange=0,this.setRowCount(0)}getCurrentDataRange(){let e=this.internalData,t=e.length,[s]=this.internalData,n=this.internalData[t-1];if(s&&n)return[s.rowIndex,n.rowIndex];for(let o=0;o<t;o++)if(e[o]!==void 0){s=e[o];break}for(let o=t-1;o>=0;o--)if(e[o]!==void 0){n=e[o];break}return s&&n?[s.rowIndex,n.rowIndex]:[-1,-1]}};C=new WeakMap;var Vt=[],{debug:m,debugEnabled:H,error:wt,info:p,infoEnabled:Mt,warn:P}=R(\"viewport\"),It=({rowKey:r,updateType:e})=>e===\"U\"&&!r.startsWith(\"$root\"),z=[void 0,void 0],vt={count:0,mode:void 0,size:0,ts:0},j=class{constructor({aggregations:e,bufferSize:t=50,columns:s,filter:n,groupBy:o=[],table:i,range:u,sort:d,title:f,viewport:a,visualLink:l},g){this.dataWindow=void 0;this.hasUpdates=!1;this.pendingUpdates=[];this.pendingOperations=new Map;this.pendingRangeRequests=[];this.rowCountChanged=!1;this.tableSchema=null;this.batchMode=!0;this.useBatchMode=!0;this.lastUpdateStatus=vt;this.updateThrottleTimer=void 0;this.rangeMonitor=new q(\"ViewPort\");this.disabled=!1;this.isTree=!1;this.status=\"\";this.suspended=!1;this.suspendTimer=null;this.setLastSizeOnlyUpdateSize=e=>{this.lastUpdateStatus.size=e};this.setLastUpdate=e=>{let{ts:t,mode:s}=this.lastUpdateStatus,n=0;if(s===e){let o=Date.now();this.lastUpdateStatus.count+=1,this.lastUpdateStatus.ts=o,n=t===0?0:o-t}else this.lastUpdateStatus.count=1,this.lastUpdateStatus.ts=0,n=0;return this.lastUpdateStatus.mode=e,n};this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,s=t*.25,{from:n}=e;for(let{from:o,to:i}of this.pendingRangeRequests)if(n>=o&&n<i){if(e.to+s<=i)return!0;n=i}return!1};this.sendThrottledSizeMessage=()=>{this.updateThrottleTimer=void 0,this.lastUpdateStatus.count=3,this.postMessageToClient({clientViewportId:this.clientViewportId,mode:\"size-only\",size:this.lastUpdateStatus.size,type:\"viewport-update\"})};this.shouldThrottleMessage=e=>{let t=this.setLastUpdate(e);return e===\"size-only\"&&t>0&&t<500&&this.lastUpdateStatus.count>3};this.throttleMessage=e=>this.shouldThrottleMessage(e)?(this.updateThrottleTimer===void 0&&(this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,2e3)),!0):(this.updateThrottleTimer!==void 0&&(clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),!1);this.getNewRowCount=()=>{if(this.rowCountChanged&&this.dataWindow)return this.rowCountChanged=!1,this.dataWindow.rowCount};this.aggregations=e,this.bufferSize=t,this.clientRange=u,this.clientViewportId=a,this.columns=s,this.filter=n,this.groupBy=o,this.keys=new G(u),this.pendingLinkedParent=l,this.table=i,this.sort=d,this.title=f,Mt&&(p==null||p(`constructor #${a} ${i.table} bufferSize=${t}`)),this.postMessageToClient=g}get hasUpdatesToProcess(){return this.suspended?!1:this.rowCountChanged||this.hasUpdates}get size(){var e,t;return(t=(e=this.dataWindow)==null?void 0:e.rowCount)!=null?t:0}subscribe(){let{filter:e}=this.filter;return this.status=this.status===\"subscribed\"?\"resubscribing\":\"subscribing\",{type:Ue,table:this.table,range:Y(this.clientRange,this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:e}}}handleSubscribed({viewPortId:e,aggregations:t,columns:s,filterSpec:n,range:o,sort:i,groupBy:u}){return this.serverViewportId=e,this.status=\"subscribed\",this.aggregations=t,this.columns=s,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow=new K(this.clientRange,o,this.bufferSize),{aggregations:t,type:\"subscribed\",clientViewportId:this.clientViewportId,columns:s,filter:n,groupBy:u,range:o,sort:i,tableSchema:this.tableSchema}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:s,pendingOperations:n}=this,o=n.get(e);if(!o){wt(\"no matching operation found to complete\");return}let{type:i}=o;if(p==null||p(`completeOperation ${i}`),n.delete(e),i===\"CHANGE_VP_RANGE\"){let[d,f]=t;(u=this.dataWindow)==null||u.setRange(d,f);for(let a=this.pendingRangeRequests.length-1;a>=0;a--){let l=this.pendingRangeRequests[a];if(l.requestId===e){l.acked=!0;break}else P==null||P(\"range requests sent faster than they are being ACKed\")}}else if(i===\"config\"){let{aggregations:d,columns:f,filter:a,groupBy:l,sort:g}=o.data;return this.aggregations=d,this.columns=f,this.filter=a,this.groupBy=l,this.sort=g,l.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),m==null||m(`config change confirmed, isTree : ${this.isTree}`),{clientViewportId:s,type:i,config:o.data}}else{if(i===\"groupBy\")return this.isTree=o.data.length>0,this.groupBy=o.data,m==null||m(`groupBy change confirmed, isTree : ${this.isTree}`),{clientViewportId:s,type:i,groupBy:o.data};if(i===\"columns\")return this.columns=o.data,{clientViewportId:s,type:i,columns:o.data};if(i===\"filter\")return this.filter=o.data,{clientViewportId:s,type:i,filter:o.data};if(i===\"aggregate\")return this.aggregations=o.data,{clientViewportId:s,type:\"aggregate\",aggregations:this.aggregations};if(i===\"sort\")return this.sort=o.data,{clientViewportId:s,type:i,sort:this.sort};if(i!==\"selection\"){if(i===\"disable\")return this.disabled=!0,{type:\"disabled\",clientViewportId:s};if(i===\"enable\")return this.disabled=!1,{type:\"enabled\",clientViewportId:s};if(i===\"CREATE_VISUAL_LINK\"){let[d,f,a]=t;return this.linkedParent={colName:d,parentViewportId:f,parentColName:a},this.pendingLinkedParent=void 0,{type:\"vuu-link-created\",clientViewportId:s,colName:d,parentViewportId:f,parentColName:a}}else if(i===\"REMOVE_VISUAL_LINK\")return this.linkedParent=void 0,{type:\"vuu-link-removed\",clientViewportId:s}}}}rangeRequest(e,t){H&&this.rangeMonitor.set(t);let s=\"CHANGE_VP_RANGE\";if(this.dataWindow){let[n,o]=this.dataWindow.setClientRange(t.from,t.to),i,u=this.dataWindow.rowCount||void 0,d=n&&!this.rangeRequestAlreadyPending(t)?{type:s,viewPortId:this.serverViewportId,...Y(t,this.bufferSize,u)}:null;if(d){H&&(m==null||m(`create CHANGE_VP_RANGE: [${d.from} - ${d.to}]`)),this.awaitOperation(e,{type:s});let a=this.pendingRangeRequests.at(-1);if(a)if(a.acked)console.warn(\"Range Request before previous request is filled\");else{let{from:l,to:g}=a;this.dataWindow.outOfRange(l,g)?i={clientViewportId:this.clientViewportId,type:\"debounce-begin\"}:P==null||P(\"Range Request before previous request is acked\")}this.pendingRangeRequests.push({...d,requestId:e}),this.useBatchMode&&(this.batchMode=!0)}else o.length>0&&(this.batchMode=!1);this.keys.reset(this.dataWindow.clientRange);let f=this.isTree?ue:ae;return o.length?[d,o.map(a=>f(a,this.keys))]:i?[d,void 0,i]:[d]}else return[null]}setLinks(e){return this.links=e,[{type:\"vuu-links\",links:e,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(e){return{type:\"vuu-menu\",menu:e,clientViewportId:this.clientViewportId}}setTableSchema(e){this.tableSchema=e}openTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:je,vpId:this.serverViewportId,treeKey:t.key}}closeTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:ke,vpId:this.serverViewportId,treeKey:t.key}}createLink(e,t,s,n){let o={type:\"CREATE_VISUAL_LINK\",parentVpId:s,childVpId:this.serverViewportId,parentColumnName:n,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:\"REMOVE_VISUAL_LINK\",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,p==null||p(\"suspend\")}resume(){return this.suspended=!1,H&&(m==null||m(`resume: ${this.currentData()}`)),this.currentData()}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:s}=this,n=this.isTree?ue:ae;for(let o of t)o&&e.push(n(o,s))}return e}enable(e){return this.awaitOperation(e,{type:\"enable\"}),p==null||p(`enable: ${this.serverViewportId}`),{type:qe,viewPortId:this.serverViewportId}}disable(e){return this.awaitOperation(e,{type:\"disable\"}),p==null||p(`disable: ${this.serverViewportId}`),this.suspended=!1,{type:Fe,viewPortId:this.serverViewportId}}columnRequest(e,t){return this.awaitOperation(e,{type:\"columns\",data:t}),m==null||m(`columnRequest: ${t}`),this.createRequest({columns:t})}filterRequest(e,t){this.awaitOperation(e,{type:\"filter\",data:t}),this.useBatchMode&&(this.batchMode=!0);let{filter:s}=t;return p==null||p(`filterRequest: ${s}`),this.createRequest({filterSpec:{filter:s}})}setConfig(e,t){this.awaitOperation(e,{type:\"config\",data:t});let{filter:s,...n}=t;return this.useBatchMode&&(this.batchMode=!0),H?m==null||m(`setConfig ${JSON.stringify(t)}`):p==null||p(\"setConfig\"),this.createRequest({...n,filterSpec:typeof(s==null?void 0:s.filter)==\"string\"?{filter:s.filter}:{filter:\"\"}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:\"aggregate\",data:t}),p==null||p(`aggregateRequest: ${t}`),this.createRequest({aggregations:t})}sortRequest(e,t){return this.awaitOperation(e,{type:\"sort\",data:t}),p==null||p(`sortRequest: ${JSON.stringify(t.sortDefs)}`),this.createRequest({sort:t})}groupByRequest(e,t=Vt){var s;return this.awaitOperation(e,{type:\"groupBy\",data:t}),this.useBatchMode&&(this.batchMode=!0),this.isTree||(s=this.dataWindow)==null||s.clear(),this.createRequest({groupBy:t})}selectRequest(e,t){return this.awaitOperation(e,{type:\"selection\",data:t}),p==null||p(`selectRequest: ${t}`),{type:\"SET_SELECTION\",vpId:this.serverViewportId,selection:Se(t)}}removePendingRangeRequest(e,t){for(let s=this.pendingRangeRequests.length-1;s>=0;s--){let{from:n,to:o}=this.pendingRangeRequests[s],i=!0;if(e>=n&&e<o||t>n&&t<o){i||console.warn(\"removePendingRangeRequest TABLE_ROWS are not for latest request\"),this.pendingRangeRequests.splice(s,1);break}else i=!1}}updateRows(e){var n,o,i;let[t,s]=Ie(e);if(t&&s&&this.removePendingRangeRequest(t.rowIndex,s.rowIndex),e.length===1)if(t.vpSize===0&&this.disabled){m==null||m(`ignore a SIZE=0 message on disabled viewport (${e.length} rows)`);return}else t.updateType===\"SIZE\"&&this.setLastSizeOnlyUpdateSize(t.vpSize);for(let u of e)this.isTree&&It(u)||((u.updateType===\"SIZE\"||((n=this.dataWindow)==null?void 0:n.rowCount)!==u.vpSize)&&((o=this.dataWindow)==null||o.setRowCount(u.vpSize),this.rowCountChanged=!0),u.updateType===\"U\"&&(i=this.dataWindow)!=null&&i.setAtIndex(u)&&(this.hasUpdates=!0,this.batchMode||this.pendingUpdates.push(u)))}getClientRows(){let e,t=\"size-only\";if(!this.hasUpdates&&!this.rowCountChanged)return z;if(this.hasUpdates&&this.dataWindow){let{keys:s}=this,n=this.isTree?ue:ae;if(this.updateThrottleTimer&&(self.clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),this.pendingUpdates.length>0){e=[],t=\"update\";for(let o of this.pendingUpdates)e.push(n(o,s));this.pendingUpdates.length=0}else{let o=this.dataWindow.getData();if(this.dataWindow.hasAllRowsWithinRange){e=[],t=\"batch\";for(let i of o)e.push(n(i,s));this.batchMode=!1}}this.hasUpdates=!1}return this.throttleMessage(t)?z:[e,t]}createRequest(e,t=!1){return t?{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,...e}:{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...e}}},ae=({rowIndex:r,rowKey:e,sel:t,data:s},n)=>[r,n.keyFor(r),!0,!1,0,0,e,t].concat(s),ue=({rowIndex:r,rowKey:e,sel:t,data:s},n)=>{let[o,i,,u,,d,...f]=s;return[r,n.keyFor(r),u,i,o,d,e,t].concat(f)};var st=1;var{debug:E,debugEnabled:O,error:L,info:w,infoEnabled:_t,warn:k}=R(\"server-proxy\"),b=()=>`${st++}`,Dt={},xt=r=>r.disabled!==!0&&r.suspended!==!0,Pt={type:\"NO_ACTION\"},Ot=(r,e,t)=>r.map(s=>s.parentVpId===e?{...s,label:t}:s);function Lt(r,e){return r.map(t=>{let{parentVpId:s}=t,n=e.get(s);if(n)return{...t,parentClientVpId:n.clientViewportId,label:n.title};throw Error(\"addLabelsToLinks viewport not found\")})}var J=class{constructor(e,t){this.authToken=\"\";this.user=\"user\";this.pendingTableMetaRequests=new Map;this.pendingRequests=new Map;this.queuedRequests=[];this.cachedTableSchemas=new Map;this.connection=e,this.postMessageToClient=t,this.viewports=new Map,this.mapClientToServerViewport=new Map}async reconnect(){await this.login(this.authToken);let[e,t]=he(Array.from(this.viewports.values()),xt);this.viewports.clear(),this.mapClientToServerViewport.clear();let s=n=>{n.forEach(o=>{let{clientViewportId:i}=o;this.viewports.set(i,o),this.sendMessageToServer(o.subscribe(),i)})};s(e),setTimeout(()=>{s(t)},2e3)}async login(e,t=\"user\"){if(e)return this.authToken=e,this.user=t,new Promise((s,n)=>{this.sendMessageToServer({type:He,token:this.authToken,user:t},\"\"),this.pendingLogin={resolve:s,reject:n}});this.authToken===\"\"&&L(\"login, cannot login until auth token has been obtained\")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))L(`spurious subscribe call ${e.viewport}`);else{if(!this.hasSchemaForTable(e.table)&&!B(e.table)){w==null||w(`subscribe to ${e.table.table}, no metadata yet, request metadata`);let s=b();this.sendMessageToServer({type:\"GET_TABLE_META\",table:e.table},s),this.pendingTableMetaRequests.set(s,e.viewport)}let t=new j(e,this.postMessageToClient);this.viewports.set(e.viewport,t),this.sendIfReady(t.subscribe(),e.viewport,this.sessionId!==\"\")}}unsubscribe(e){let t=this.mapClientToServerViewport.get(e);t?(w==null||w(`Unsubscribe Message (Client to Server):\n ${t}`),this.sendMessageToServer({type:Ye,viewPortId:t})):L(`failed to unsubscribe client viewport ${e}, viewport not found`)}getViewportForClient(e,t=!0){let s=this.mapClientToServerViewport.get(e);if(s){let n=this.viewports.get(s);if(n)return n;if(t)throw Error(`Viewport not found for client viewport ${e}`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(`Viewport server id not found for client viewport ${e}`);return null}}setViewRange(e,t){let s=b(),[n,o,i]=e.rangeRequest(s,t.range);n&&this.sendIfReady(n,s,e.status===\"subscribed\"),o?this.postMessageToClient({mode:\"batch\",type:\"viewport-update\",clientViewportId:e.clientViewportId,rows:o}):i&&this.postMessageToClient(i)}setConfig(e,t){let s=b(),n=e.setConfig(s,t.config);this.sendIfReady(n,s,e.status===\"subscribed\")}aggregate(e,t){let s=b(),n=e.aggregateRequest(s,t.aggregations);this.sendIfReady(n,s,e.status===\"subscribed\")}sort(e,t){let s=b(),n=e.sortRequest(s,t.sort);this.sendIfReady(n,s,e.status===\"subscribed\")}groupBy(e,t){let s=b(),n=e.groupByRequest(s,t.groupBy);this.sendIfReady(n,s,e.status===\"subscribed\")}filter(e,t){let s=b(),{filter:n}=t,o=e.filterRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}setColumns(e,t){let s=b(),{columns:n}=t,o=e.columnRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let s=b(),{selected:n}=t,o=e.selectRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}disableViewport(e){let t=b(),s=e.disable(t);this.sendIfReady(s,t,e.status===\"subscribed\")}enableViewport(e){if(e.disabled){let t=b(),s=e.enable(t);this.sendIfReady(s,t,e.status===\"subscribed\")}}suspendViewport(e){e.suspend(),e.suspendTimer=setTimeout(()=>{w==null||w(\"suspendTimer expired, escalate suspend to disable\"),this.disableViewport(e)},3e3)}resumeViewport(e){e.suspendTimer&&(E==null||E(\"clear suspend timer\"),clearTimeout(e.suspendTimer),e.suspendTimer=null);let t=e.resume();this.postMessageToClient({clientViewportId:e.clientViewportId,mode:\"batch\",rows:t,type:\"viewport-update\"})}openTreeNode(e,t){if(e.serverViewportId){let s=b();this.sendIfReady(e.openTreeNode(s,t),s,e.status===\"subscribed\")}}closeTreeNode(e,t){if(e.serverViewportId){let s=b();this.sendIfReady(e.closeTreeNode(s,t),s,e.status===\"subscribed\")}}createLink(e,t){let{parentClientVpId:s,parentColumnName:n,childColumnName:o}=t,i=b(),u=this.mapClientToServerViewport.get(s);if(u){let d=e.createLink(i,o,u,n);this.sendMessageToServer(d,i)}else L(\"ServerProxy unable to create link, viewport not found\")}removeLink(e){let t=b(),s=e.removeLink(t);this.sendMessageToServer(s,t)}updateTitleOnVisualLinks(e){var n;let{serverViewportId:t,title:s}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&s&&(n=o.links)!=null&&n.some(i=>i.parentVpId===t)){let[i]=o.setLinks(Ot(o.links,t,s));this.postMessageToClient(i)}}removeViewportFromVisualLinks(e){var t;for(let s of this.viewports.values())if((t=s.links)!=null&&t.some(({parentVpId:n})=>n===e)){let[n]=s.setLinks(s.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(n)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[s,n]=te(e);this.sendMessageToServer({...n,vpId:t.serverViewportId},s)}}rpcCall(e){let[t,s]=te(e),n=et(s.service);this.sendMessageToServer(s,t,{module:n})}handleMessageFromClient(e){if(E==null||E(`handleMessageFromClient: ${e.type}`),xe(e))if(e.type===\"disable\"){let t=this.getViewportForClient(e.viewport,!1);return t!==null?this.disableViewport(t):void 0}else{let t=this.getViewportForClient(e.viewport);switch(e.type){case\"setViewRange\":return this.setViewRange(t,e);case\"config\":return this.setConfig(t,e);case\"aggregate\":return this.aggregate(t,e);case\"sort\":return this.sort(t,e);case\"groupBy\":return this.groupBy(t,e);case\"filter\":return this.filter(t,e);case\"select\":return this.select(t,e);case\"suspend\":return this.suspendViewport(t);case\"resume\":return this.resumeViewport(t);case\"enable\":return this.enableViewport(t);case\"openTreeNode\":return this.openTreeNode(t,e);case\"closeTreeNode\":return this.closeTreeNode(t,e);case\"createLink\":return this.createLink(t,e);case\"removeLink\":return this.removeLink(t);case\"setColumns\":return this.setColumns(t,e);case\"setTitle\":return this.setTitle(t,e);default:}}else{if(Me(e))return this.menuRpcCall(e);{let{type:t,requestId:s}=e;switch(t){case\"GET_TABLE_LIST\":return this.sendMessageToServer({type:t},s);case\"GET_TABLE_META\":return this.sendMessageToServer({type:t,table:e.table},s);case\"RPC_CALL\":return this.rpcCall(e);default:}}}L(`Vuu ServerProxy Unexpected message from client ${JSON.stringify(e)}`)}awaitResponseToMessage(e){return new Promise((t,s)=>{let n=b();this.sendMessageToServer(e,n),this.pendingRequests.set(n,{reject:s,resolve:t})})}sendIfReady(e,t,s=!0){return s?this.sendMessageToServer(e,t):this.queuedRequests.push(e),s}sendMessageToServer(e,t=`${st++}`,s=Dt){let{module:n=\"CORE\"}=s;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:n,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:s,sessionId:n}=e,o=this.pendingRequests.get(s);if(o){let{resolve:a}=o;this.pendingRequests.delete(s),a(t);return}let{viewports:i}=this;switch(t.type){case Be:this.sendMessageToServer({type:Ke,ts:+new Date},\"NA\");break;case ze:if(n)this.sessionId=n,(u=this.pendingLogin)==null||u.resolve(n),this.pendingLogin=void 0;else throw Error(\"LOGIN_SUCCESS did not provide sessionId\");break;case Ne:{let a=i.get(s);if(a){let{status:l}=a,{viewPortId:g}=t;s!==g&&(i.delete(s),i.set(g,a)),this.mapClientToServerViewport.set(s,g);let T=a.handleSubscribed(t);T&&(this.postMessageToClient(T),O&&E(`post DataSourceSubscribedMessage to client: ${JSON.stringify(T)}`)),a.disabled&&this.disableViewport(a),l===\"subscribing\"&&!B(a.table)&&(this.sendMessageToServer({type:ne,vpId:g}),this.sendMessageToServer({type:Ge,vpId:g}),Array.from(i.entries()).filter(([M,{disabled:U}])=>M!==g&&!U).forEach(([M])=>{this.sendMessageToServer({type:ne,vpId:M})}))}}break;case\"REMOVE_VP_SUCCESS\":{let a=this.viewports.get(t.viewPortId);a&&(this.mapClientToServerViewport.delete(a.clientViewportId),i.delete(t.viewPortId),this.removeViewportFromVisualLinks(t.viewPortId))}break;case Ze:{let a=this.viewports.get(t.vpId);a&&a.completeOperation(s)}break;case Oe:case We:if(i.has(t.viewPortId)){let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(s);l!==void 0&&(this.postMessageToClient(l),O&&E(`postMessageToClient ${JSON.stringify(l)}`))}}break;case $e:{let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(s);if(l){this.postMessageToClient(l);let g=a.currentData();O&&E(`Enable Response (ServerProxy to Client): ${JSON.stringify(l)}`),a.size===0?O&&E(\"Viewport Enabled but size 0, resend to server\"):(this.postMessageToClient({clientViewportId:a.clientViewportId,mode:\"batch\",rows:g,size:a.size,type:\"viewport-update\"}),O&&E(`Enable Response (ServerProxy to Client): send size ${a.size} ${g.length} rows from cache`))}}}break;case Qe:{let a=ve(t.rows);for(let[l,g]of Object.entries(a)){let T=i.get(l);T?T.updateRows(g):k==null||k(`TABLE_ROW message received for non registered viewport ${l}`)}this.processUpdates()}break;case Le:{let a=this.viewports.get(t.viewPortId);if(a){let{from:l,to:g}=t;a.completeOperation(s,l,g)}}break;case Je:case Ae:break;case\"CREATE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId),l=this.viewports.get(t.parentVpId);if(a&&l){let{childColumnName:g,parentColumnName:T}=t,M=a.completeOperation(s,g,l.clientViewportId,T);M&&this.postMessageToClient(M)}}break;case\"REMOVE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId);if(a){let l=a.completeOperation(s);l&&this.postMessageToClient(l)}}break;case ie:this.postMessageToClient({type:ie,tables:t.tables,requestId:s});break;case oe:{let a=this.cacheTableMeta(t),l=this.pendingTableMetaRequests.get(s);if(l){this.pendingTableMetaRequests.delete(s);let g=this.viewports.get(l);g?g.setTableSchema(a):k==null||k(\"Message has come back AFTER CREATE_VP_SUCCESS, what do we do now\")}else this.postMessageToClient({type:oe,tableSchema:a,requestId:s})}break;case\"VP_VISUAL_LINKS_RESP\":{let a=this.getActiveLinks(t.links),l=this.viewports.get(t.vpId);if(a.length&&l){let g=Lt(a,this.viewports),[T,M]=l.setLinks(g);if(this.postMessageToClient(T),M){let{link:U,parentClientVpId:nt}=M,pe=b(),ge=this.mapClientToServerViewport.get(nt);if(ge){let rt=l.createLink(pe,U.fromColumn,ge,U.toColumn);this.sendMessageToServer(rt,pe)}}}}break;case\"VIEW_PORT_MENUS_RESP\":if(t.menu.name){let a=this.viewports.get(t.vpId);if(a){let l=a.setMenu(t.menu);this.postMessageToClient(l)}}break;case\"VP_EDIT_RPC_RESPONSE\":this.postMessageToClient({action:t.action,requestId:s,rpcName:t.rpcName,type:\"VP_EDIT_RPC_RESPONSE\"});break;case\"VP_EDIT_RPC_REJECT\":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:s,type:\"VP_EDIT_RPC_REJECT\",error:t.error});break;case\"VIEW_PORT_MENU_RESP\":if(Pe(t)){let{action:a,rpcName:l}=t;this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:a.table}).then(g=>{let T=se(g);this.postMessageToClient({rpcName:l,type:\"VIEW_PORT_MENU_RESP\",action:{...a,tableSchema:T},tableAlreadyOpen:this.isTableOpen(a.table),requestId:s})})}else{let{action:a}=t;this.postMessageToClient({type:\"VIEW_PORT_MENU_RESP\",action:a||Pt,tableAlreadyOpen:a!==null&&this.isTableOpen(a.table),requestId:s})}break;case re:{let{method:a,result:l}=t;this.postMessageToClient({type:re,method:a,result:l,requestId:s})}break;case\"ERROR\":L(t.msg);break;default:_t&&w(`handleMessageFromServer ${t.type}.`)}}hasSchemaForTable(e){return this.cachedTableSchemas.has(`${e.module}:${e.table}`)}cacheTableMeta(e){let{module:t,table:s}=e.table,n=`${t}:${s}`,o=this.cachedTableSchemas.get(n);return o||(o=se(e),this.cachedTableSchemas.set(n,o)),o}isTableOpen(e){if(e){let t=e.table;for(let s of this.viewports.values())if(!s.suspended&&s.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let s=this.viewports.get(t.parentVpId);return s&&!s.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let s=e.getClientRows();if(s!==z){let[n,o]=s,i=e.getNewRowCount();(i!==void 0||n&&n.length>0)&&(O&&E(`postMessageToClient #${e.clientViewportId} viewport-update ${o}, ${(t=n==null?void 0:n.length)!=null?t:\"no\"} rows, size ${i}`),i&&console.log(`send size to client (along with ${n==null?void 0:n.length} rows)`),o&&this.postMessageToClient({clientViewportId:e.clientViewportId,mode:o,rows:n,size:i,type:\"viewport-update\"}))}}})}};var D,{info:le,infoEnabled:ce}=R(\"worker\");async function kt(r,e,t,s,n){let o=await we(r,e,i=>{De(i)?postMessage({type:\"connection-metrics\",messages:i}):_e(i)?(n(i),i.status===\"reconnected\"&&D.reconnect()):D.handleMessageFromServer(i)});D=new J(o,i=>At(i)),o.requiresLogin&&await D.login(t,s)}function At(r){postMessage(r)}var Ut=async({data:r})=>{switch(r.type){case\"connect\":await kt(r.url,r.protocol,r.token,r.username,postMessage),postMessage({type:\"connected\"});break;case\"subscribe\":ce&&le(`client subscribe: ${JSON.stringify(r)}`),D.subscribe(r);break;case\"unsubscribe\":ce&&le(`client unsubscribe: ${JSON.stringify(r)}`),D.unsubscribe(r.viewport);break;default:ce&&le(`client message: ${JSON.stringify(r)}`),D.handleMessageFromClient(r)}};self.addEventListener(\"message\",Ut);postMessage({type:\"ready\"});\n\n";