@vuu-ui/vuu-layout 0.8.17-debug → 0.8.18-debug
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/cjs/index.js +3195 -12250
- package/cjs/index.js.map +4 -4
- package/esm/index.js +3169 -12295
- package/esm/index.js.map +4 -4
- package/index.css +129 -788
- package/index.css.map +3 -3
- package/package.json +11 -9
- package/types/index.d.ts +0 -1
- package/types/layout-header/ActionButton.d.ts +4 -4
- package/types/layout-reducer/layoutTypes.d.ts +1 -1
- package/types/placeholder/Placeholder.d.ts +1 -1
- package/types/toolbar/Toolbar.d.ts +1 -1
- package/types/toolbar/useToolbar.d.ts +2 -1
- package/types/utils/react-utils.d.ts +1 -3
- package/types/layout-persistence/LayoutPersistenceManager.d.ts +0 -55
- package/types/layout-persistence/LocalLayoutPersistenceManager.d.ts +0 -17
- package/types/layout-persistence/RemoteLayoutPersistenceManager.d.ts +0 -21
- package/types/layout-persistence/defaultApplicationJson.d.ts +0 -4
- package/types/layout-persistence/index.d.ts +0 -5
- package/types/layout-persistence/useLayoutContextMenuItems.d.ts +0 -6
package/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/vuu-layout/src/index.ts", "../../../packages/vuu-layout/src/dock-layout/DockLayout.tsx", "../../../packages/vuu-layout/src/registry/ComponentRegistry.ts", "../../../packages/vuu-layout/src/dock-layout/Drawer.tsx", "../../../packages/vuu-layout/src/Component.tsx", "../../../packages/vuu-layout/src/utils/pathUtils.ts", "../../../packages/vuu-layout/src/utils/propUtils.ts", "../../../packages/vuu-layout/src/utils/typeOf.ts", "../../../packages/vuu-layout/src/utils/refUtils.ts", "../../../packages/vuu-layout/src/utils/react-utils.ts", "../../../packages/vuu-layout/src/utils/styleUtils.ts", "../../../packages/vuu-layout/src/drag-drop/BoxModel.ts", "../../../packages/vuu-layout/src/drag-drop/DragState.ts", "../../../packages/vuu-layout/src/drag-drop/DropTarget.ts", "../../../packages/vuu-layout/src/drag-drop/DropTargetRenderer.tsx", "../../../packages/vuu-layout/src/drag-drop/DropMenu.tsx", "../../../packages/vuu-layout/src/drag-drop/Draggable.ts", "../../../packages/vuu-layout/src/DraggableLayout.tsx", "../../../packages/vuu-layout/src/flexbox/Flexbox.tsx", "../../../packages/vuu-layout/src/flexbox/useSplitterResizing.ts", "../../../packages/vuu-layout/src/placeholder/Placeholder.tsx", "../../../packages/vuu-layout/src/placeholder/LayoutStartPanel.tsx", "../../../packages/vuu-layout/src/
|
|
4
|
-
"sourcesContent": ["export * from \"./dock-layout\";\nexport { default as Component } from \"./Component\";\nexport * from \"./drag-drop\";\nexport * from \"./DraggableLayout\";\nexport * from \"./flexbox\";\nexport { Action } from \"./layout-action\";\nexport * from \"./layout-header\";\nexport * from \"./layout-persistence\";\nexport * from \"./layout-provider\";\nexport * from \"./layout-reducer\";\nexport * from \"./layout-view\";\nexport * from \"./measured-container\";\nexport * from \"./overflow-container\";\nexport * from \"./palette\";\nexport * from \"./placeholder\";\nexport * from \"./registry\";\nexport * from \"./responsive\";\nexport * from \"./stack\";\nexport * from \"./toolbar\";\nexport * from \"./tools\";\nexport * from \"./use-persistent-state\";\nexport * from \"./utils\";\n", "import { partition } from \"@vuu-ui/vuu-utils\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, ReactElement } from \"react\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport Drawer from \"./Drawer\";\n\nimport \"./DockLayout.css\";\n\nconst isDrawer = (component: ReactElement) => component.type === Drawer;\nconst isVertical = ({ props: { position = \"left\" } }: ReactElement) =>\n position.match(/top|bottom/);\n\nexport interface DockLayoutProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactElement[];\n}\n\nconst DockLayout = (props: DockLayoutProps) => {\n const { children, className: classNameProp, id, style } = props;\n const classBase = \"vuuDockLayout\";\n const [drawers, content] = partition(children, isDrawer);\n const [verticalDrawers, horizontalDrawers] = partition(drawers, isVertical);\n const orientation =\n verticalDrawers.length === 0\n ? \"horizontal\"\n : horizontalDrawers.length === 0\n ? \"vertical\"\n : \"both\";\n\n const className = cx(classBase, classNameProp, `${classBase}-${orientation}`);\n\n return (\n <div className={className} id={id} style={style}>\n {drawers}\n <div className={`${classBase}-content`}>{content}</div>\n </div>\n );\n};\nDockLayout.displayName = \"DockLayout\";\n\nexport default DockLayout;\n\nregisterComponent(\"DockLayout\", DockLayout, \"container\");\n", "import { FunctionComponent } from \"react\";\n\nconst _containers: { [key: string]: boolean } = {};\nconst _views: { [key: string]: boolean } = {};\n\nexport type layoutComponentType = \"component\" | \"container\" | \"view\";\n\nexport interface ComponentWithId {\n id: string;\n [key: string]: unknown;\n}\n\nexport const ComponentRegistry: {\n [key: string]: FunctionComponent<ComponentWithId>;\n} = {};\n\nexport function isContainer(componentType: string) {\n return _containers[componentType] === true;\n}\n\nexport function isView(componentType: string) {\n return _views[componentType] === true;\n}\n\nexport const isLayoutComponent = (type: string) =>\n isContainer(type) || isView(type);\n\n// export const isRegistered = (className: string) =>\n// !!ComponentRegistry[className];\n\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FunctionComponent<any>,\n type: layoutComponentType = \"component\"\n) {\n ComponentRegistry[componentName] = component;\n\n if (type === \"container\") {\n _containers[componentName] = true;\n } else if (type === \"view\") {\n _views[componentName] = true;\n }\n}\n", "import { Button, useControlled } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { CSSProperties, HTMLAttributes, useCallback } from \"react\";\n\nimport \"./Drawer.css\";\n\nconst classBase = \"vuuDrawer\";\n\nconst sizeAttribute = (value: string | number) => {\n return typeof value === \"string\" ? value : value + \"px\";\n};\n\nconst getStyle = (\n styleProp?: CSSProperties,\n sizeOpen?: number,\n sizeClosed?: number\n) => {\n const hasSizeOpen = sizeOpen !== undefined;\n const hasSizeClosed = sizeClosed !== undefined;\n\n if (!styleProp && !hasSizeClosed && !hasSizeOpen) {\n return undefined;\n }\n\n if (!hasSizeClosed && !hasSizeOpen) {\n return styleProp;\n }\n\n return {\n ...styleProp,\n \"--drawer-size\": hasSizeOpen ? sizeAttribute(sizeOpen) : undefined,\n \"--drawer-peek-size\": hasSizeClosed ? sizeAttribute(sizeClosed) : undefined,\n };\n};\n\nexport interface DrawerProps extends HTMLAttributes<HTMLDivElement> {\n clickToOpen?: boolean;\n defaultOpen?: boolean;\n inline?: boolean;\n open?: boolean;\n peekaboo?: boolean;\n position?: \"left\" | \"right\" | \"top\" | \"bottom\";\n sizeOpen?: number;\n sizeClosed?: number;\n toggleButton?: \"start\" | \"end\";\n}\nconst Drawer = ({\n children,\n className: classNameProp,\n clickToOpen,\n defaultOpen,\n sizeOpen,\n sizeClosed,\n style: styleProp,\n open: openProp,\n position = \"left\",\n inline,\n onClick,\n peekaboo = false,\n toggleButton,\n ...props\n}: DrawerProps) => {\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: defaultOpen ?? false,\n name: \"Drawer\",\n state: \"open\",\n });\n\n console.log(`Drawer sizeOpen ${sizeOpen} sizeClosed ${sizeClosed}`);\n\n const className = cx(classBase, classNameProp, `${classBase}-${position}`, {\n [`${classBase}-open`]: open,\n [`${classBase}-inline`]: inline,\n [`${classBase}-over`]: !inline,\n [`${classBase}-peekaboo`]: peekaboo,\n });\n\n const toggleDrawer = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const style = getStyle(styleProp, sizeOpen, sizeClosed);\n\n const handleClick = clickToOpen ? toggleDrawer : onClick;\n\n const renderToggleButton = () => (\n <div className={cx(\"vuuToggleButton-container\")}>\n {open ? (\n <Button\n aria-label=\"close\"\n onClick={toggleDrawer}\n data-icon=\"close\"\n variant=\"secondary\"\n />\n ) : (\n <Button\n aria-label=\"open\"\n onClick={toggleDrawer}\n data-icon=\"close\"\n variant=\"secondary\"\n />\n )}\n </div>\n );\n\n return (\n <div {...props} className={className} onClick={handleClick} style={style}>\n {toggleButton == \"start\" ? renderToggleButton() : null}\n <div className={`${classBase}-liner`}>\n <div className={`${classBase}-content`}>{children}</div>\n </div>\n {toggleButton == \"end\" ? renderToggleButton() : null}\n </div>\n );\n};\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n", "import React, { forwardRef, HTMLAttributes } from 'react';\nimport { registerComponent } from './registry/ComponentRegistry';\n\nimport './Component.css';\n\nexport interface ComponentProps extends HTMLAttributes<HTMLDivElement> {\n resizeable?: boolean;\n}\n\nconst Component = forwardRef(function Component(\n { resizeable, ...props }: ComponentProps,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n return <div {...props} className=\"Component\" ref={ref} />;\n}) as React.FunctionComponent<ComponentProps>;\nComponent.displayName = 'Component';\n\nexport default Component;\n\nregisterComponent('Component', Component);\n", "import React, { isValidElement, ReactElement } from \"react\";\nimport { LayoutJSON, LayoutModel, WithActive } from \"../layout-reducer\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport { getProp, getProps } from \"./propUtils\";\nimport { typeOf } from \"./typeOf\";\n\nconst removeFinalPathSegment = (path: string) => {\n const pos = path.lastIndexOf(\".\");\n if (pos === -1) {\n return path;\n } else {\n return path.slice(0, pos);\n }\n};\n\nconst getChildren = (c: ReactElement) =>\n React.isValidElement(c.props.children)\n ? [c.props.children]\n : c.props.children;\n\n/**\n * This is a very specific function at the moment. It resolves a path of the form\n * '#{componentid}.ACTIVE_CHILD'\n * It allows a templated path to be resolved to a concrete path at runtime.\n * The above pattern is used to identify a layout drop target. Further patterns\n * will be added if needed.\n */\nexport const resolvePath = (source: ReactElement, path = \"\"): string => {\n const [step1, ...steps] = path.split(\".\");\n if (step1?.startsWith(\"#\")) {\n const node = findTargetById(source, step1.slice(1), true);\n if (node && steps.length) {\n return resolvePath(node, steps.join(\".\"));\n }\n } else if (step1 === \"ACTIVE_CHILD\") {\n const { active } = getProps(source);\n const children = getChildren(source);\n const { path } = getProps(children[active]);\n return path;\n }\n\n return \"\";\n};\n\n/**\n * Similar to resolvePath but operates on a JSON\n * layout structure and returns the matching JSON node.\n */\nexport const resolveJSONPath = (\n source: LayoutJSON,\n path = \"\"\n): LayoutJSON | undefined => {\n const [step1, ...steps] = path.split(\".\");\n if (step1?.startsWith(\"#\")) {\n const node = findTargetJSONById(source, step1.slice(1), true);\n if (node && steps.length) {\n return resolveJSONPath(node, steps.join(\".\"));\n }\n } else if (step1 === \"ACTIVE_CHILD\") {\n const { children, props } = source;\n const { active } = props as WithActive;\n if (typeof active === \"number\" && children?.[active]) {\n return children[active];\n }\n }\n return;\n};\n\nexport function followPathToParent(\n source: ReactElement,\n path: string\n): ReactElement | null {\n const { \"data-path\": dataPath, path: sourcePath = dataPath } =\n getProps(source);\n\n if (path === \"0\") return null;\n if (path === sourcePath) return null;\n\n return followPath(source, removeFinalPathSegment(path), true);\n}\n\nexport function findTarget(\n source: LayoutModel,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n test: (props: any) => boolean\n): LayoutModel | undefined {\n const { children, ...props } = getProps(source);\n if (test(props)) {\n return source;\n }\n if (React.Children.count(children) > 0) {\n const array = React.isValidElement(children) ? [children] : children;\n for (const child of array) {\n const target = findTarget(child, test);\n if (target) {\n return target;\n }\n }\n }\n}\n\nexport function containerOf(\n source: LayoutModel,\n target: LayoutModel\n): LayoutModel | null {\n if (target === source) {\n return null;\n }\n const { path: sourcePath, children } = getProps(source);\n const { idx, finalStep } = nextStep(sourcePath, getProp(target, \"path\"));\n if (finalStep) {\n return source;\n }\n if (children === undefined || children[idx] === undefined) {\n return null;\n }\n return containerOf(children[idx], target);\n}\n\nexport const getChild = (\n children: ReactElement[],\n idx: number\n): ReactElement | undefined => {\n if (React.isValidElement(children) && idx == 0) {\n return children;\n }\n if (Array.isArray(children)) {\n return children[idx];\n }\n};\n\nexport function followPathToComponent(component: ReactElement, path: string) {\n const paths = path.split(\".\");\n let children = [component];\n\n for (let i = 0; i < paths.length; i++) {\n const idx = parseInt(paths[i]);\n const child = children[idx];\n if (i === paths.length - 1) {\n return child;\n }\n children = getChildren(child);\n }\n}\n\nconst findTargetById = (\n source: ReactElement,\n id: string,\n throwIfNotFound = true\n): ReactElement | undefined => {\n const { children, id: idProp } = source.props;\n if (idProp === id) {\n return source;\n }\n\n if (React.Children.count(children) > 0) {\n const childArray = isValidElement(children) ? [children] : children;\n for (const child of childArray) {\n if (isValidElement(child)) {\n const target = findTargetById(child, id, false);\n if (target) {\n return target;\n }\n }\n }\n }\n\n if (throwIfNotFound === true) {\n throw Error(`pathUtils.findTargetById id #${id} not found in source`);\n }\n};\n\nconst findTargetJSONById = (\n source: LayoutJSON,\n id: string,\n throwIfNotFound = true\n): LayoutJSON | undefined => {\n const { children, id: idProp } = source;\n if (idProp === id) {\n return source;\n }\n\n if (Array.isArray(children) && children.length > 0) {\n for (const child of children) {\n if (child !== null && typeof child === \"object\") {\n const target = findTargetJSONById(child, id, false);\n if (target) {\n return target;\n }\n }\n }\n }\n\n if (throwIfNotFound === true) {\n throw Error(`pathUtils.findTargetJSONById id #${id} not found in source`);\n }\n};\n\nexport function followPath(\n source: LayoutModel,\n path: string\n): LayoutModel | undefined;\nexport function followPath(\n source: ReactElement,\n path: string,\n throwIfNotFound: true\n): ReactElement;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function followPath(source: any, path: any, throwIfNotFound = false) {\n if (path.startsWith(\"#\")) {\n return findTargetById(source, path.slice(1), throwIfNotFound);\n }\n\n const { \"data-path\": dataPath, path: sourcePath = dataPath } =\n getProps(source);\n if (path.indexOf(sourcePath) !== 0) {\n throw Error(\n `pathUtils.followPath path ${path} is not within source path ${sourcePath}`\n );\n }\n const route = path.slice(sourcePath.length + 1);\n if (route === \"\") {\n return source;\n }\n\n let target = source;\n const paths = route.split(\".\");\n\n for (let i = 0; i < paths.length; i++) {\n if (React.Children.count(target.props.children) === 0) {\n const message = `element at 0.${paths\n .slice(0, i)\n .join(\".\")} has no children, so cannot fulfill rest of path ${paths\n .slice(i)\n .join(\".\")}`;\n\n if (throwIfNotFound) {\n throw Error(message);\n } else {\n console.warn(message);\n return;\n }\n }\n\n target = getChild(target.props.children, parseInt(paths[i]));\n\n if (target === undefined) {\n const message = `model at 0.${paths\n .slice(0, i)\n .join(\".\")} has no children that fulfill next step of path ${paths\n .slice(i)\n .join(\".\")}`;\n\n if (throwIfNotFound) {\n throw Error(message);\n } else {\n console.warn(message);\n }\n }\n }\n return target;\n}\n\nexport function nextLeaf(root: ReactElement, path: string) {\n const parent = followPathToParent(root, path);\n let pathIndices = path.split(\".\").map((idx) => parseInt(idx, 10));\n if (parent) {\n const lastIdx = pathIndices.pop();\n const { children } = parent.props;\n if (children.length - 1 > lastIdx!) {\n return firstLeaf(children[lastIdx! + 1]);\n } else {\n const parentIdx = pathIndices.pop();\n const nextParent = followPathToParent(root, getProp(parent, \"path\"));\n if (nextParent && typeof parentIdx === \"number\") {\n pathIndices = nextParent.props.path\n .split(\".\")\n .map((idx: string) => parseInt(idx, 10));\n if (nextParent.props.children.length - 1 > parentIdx) {\n const nextStep = nextParent.props.children[parentIdx + 1];\n if (isContainer(typeOf(nextStep) as string)) {\n return firstLeaf(nextStep);\n } else {\n return nextStep;\n }\n }\n }\n }\n }\n\n return firstLeaf(root);\n}\n\nexport function previousLeaf(root: ReactElement, path: string) {\n const pathIndices = path.split(\".\").map((idx) => parseInt(idx, 10));\n let lastIdx = pathIndices.pop();\n let parent = followPathToParent(root, path);\n if (parent != null && typeof lastIdx === \"number\") {\n const { children } = parent.props;\n if (lastIdx > 0) {\n return lastLeaf(children[lastIdx - 1]);\n } else {\n while (pathIndices.length > 1) {\n lastIdx = pathIndices.pop() as number;\n parent = followPathToParent(\n root,\n getProp(parent, \"path\")\n ) as ReactElement;\n if (lastIdx > 0) {\n const nextStep = parent.props.children[lastIdx - 1];\n if (isContainer(typeOf(nextStep) as string)) {\n return lastLeaf(nextStep);\n }\n return nextStep;\n }\n }\n }\n }\n return lastLeaf(root);\n}\n\nfunction firstLeaf(layoutRoot: ReactElement): ReactElement {\n if (isContainer(typeOf(layoutRoot) as string)) {\n const { children } = layoutRoot.props || layoutRoot;\n return firstLeaf(children[0]);\n }\n return layoutRoot;\n}\n\nfunction lastLeaf(root: ReactElement): ReactElement {\n if (isContainer(typeOf(root) as string)) {\n const { children } = root.props || root;\n return lastLeaf(children[children.length - 1]);\n }\n return root;\n}\n\ntype NextStepResult = {\n idx: number;\n finalStep: boolean;\n};\n\nexport function nextStep(\n pathSoFar: string,\n targetPath: string,\n followPathToEnd = false\n): NextStepResult {\n if (pathSoFar === targetPath) {\n return { idx: -1, finalStep: true };\n }\n\n const pathVisited = `${pathSoFar}.`;\n if (!targetPath.startsWith(pathVisited)) {\n throw Error(\"pathUtils nextStep has strayed from the path\");\n }\n\n const endOfTheLine = followPathToEnd ? 0 : 1;\n const paths = targetPath\n .replace(pathVisited, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10));\n return { idx: paths[0], finalStep: paths.length === endOfTheLine };\n}\n\nexport function resetPath(\n model: ReactElement,\n path: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalProps?: any\n): ReactElement {\n if (getProp(model, \"path\") === path) {\n return model;\n }\n const children: ReactElement[] = [];\n React.Children.forEach(model.props.children, (child, i) => {\n if (!getProp(child, \"path\")) {\n children.push(child);\n } else {\n children.push(resetPath(child, `${path}.${i}`));\n }\n });\n const pathPropName = model.props[\"data-path\"] ? \"data-path\" : \"path\";\n return React.cloneElement(\n model,\n { [pathPropName]: path, ...additionalProps },\n children\n );\n}\n", "import { ReactElement } from \"react\";\nimport { LayoutModel } from \"../layout-reducer\";\n\nconst NO_PROPS = {};\nexport const getProp = (\n component: LayoutModel | undefined,\n propName: string\n) => {\n const props = getProps(component);\n return props[propName] ?? props[`data-${propName}`];\n};\n\nexport const getProps = (component?: LayoutModel) =>\n component?.props || component || NO_PROPS;\n\nexport const getChildProp = (container: LayoutModel) => {\n const props = getProps(container);\n if (props.children) {\n const {\n children: [target, ...rest],\n } = props;\n if (rest.length > 0) {\n console.warn(\n `getChild expected a single child, found ${rest.length + 1}`\n );\n }\n return target as ReactElement;\n }\n};\n", "import { ReactElement } from 'react';\nimport { LayoutModel, WithType } from '../layout-reducer';\n\nexport function typeOf(element?: LayoutModel | WithType): string | undefined {\n if (element) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const type = element.type as any;\n if (typeof type === 'function' || typeof type === 'object') {\n const elementName = type.displayName || type.name || type.type?.name;\n if (typeof elementName === 'string') {\n return elementName;\n }\n }\n if (typeof element.type === 'string') {\n return element.type;\n }\n if (element.constructor) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (element.constructor as any).displayName as string;\n }\n throw Error(`typeOf unable to determine type of element`);\n }\n}\n\nexport const isTypeOf = (element: ReactElement, type: string) => typeOf(element) === type;\n", "import { MutableRefObject } from \"react\";\n\nexport function setRef<T>(\n ref:\n | MutableRefObject<T | null>\n | ((instance: T | null) => void)\n | null\n | undefined,\n value: T | null\n): void {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n", "import {\n Children,\n DependencyList,\n EffectCallback,\n isValidElement,\n ReactElement,\n ReactNode,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\n\nconst EMPTY_ARRAY: ReactElement[] = [];\n\nlet vuuComponentIdCount = 0;\n\nexport const asReactElements = (children: ReactNode): ReactElement[] => {\n const isArray = Array.isArray(children);\n const count = isArray ? children.length : Children.count(children);\n if (isArray && children.every(isValidElement)) {\n return children;\n } else if (count === 1 && !isArray && isValidElement(children)) {\n return [children];\n } else if (count > 1) {\n return children as ReactElement[];\n } else {\n return EMPTY_ARRAY;\n }\n};\n\nexport const useLayoutEffectSkipFirst = (\n func: EffectCallback,\n deps: DependencyList\n) => {\n const goodToGo = useRef(false);\n useLayoutEffect(() => {\n if (goodToGo.current) {\n func();\n } else {\n goodToGo.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n};\n\nexport const useId = (id?: string) =>\n useMemo(() => id ?? `vuu-${++vuuComponentIdCount}`, [id]);\n", "import { CSSProperties } from 'react';\nexport type CSSFlexProperties = Pick<CSSProperties, 'flexBasis' | 'flexGrow' | 'flexShrink'>;\n\nexport const expandFlex = (flex: number | CSSFlexProperties): CSSFlexProperties => {\n if (typeof flex !== 'number') {\n throw Error(`\"no support yet for flex value ${flex}`);\n }\n return {\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1\n };\n};\n", "import { ReactElement } from \"react\";\nimport { boxContainsPoint } from \"@vuu-ui/vuu-utils\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport { getProps, typeOf } from \"../utils\";\nimport { DragDropRect, DropPos, RelativePosition } from \"./dragDropTypes\";\n\nexport const positionValues = {\n north: 1,\n east: 2,\n south: 4,\n west: 8,\n header: 16,\n centre: 32,\n absolute: 64,\n};\n\nexport const RelativeDropPosition = {\n AFTER: \"after\" as RelativePosition,\n BEFORE: \"before\" as RelativePosition,\n};\n\nexport const Position = Object.freeze({\n North: _position(\"north\"),\n East: _position(\"east\"),\n South: _position(\"south\"),\n West: _position(\"west\"),\n Header: _position(\"header\"),\n Centre: _position(\"centre\"),\n Absolute: _position(\"absolute\"),\n});\n\nfunction _position(str: keyof typeof positionValues) {\n return Object.freeze({\n offset:\n str === \"north\" || str === \"west\"\n ? 0\n : str === \"south\" || str === \"east\"\n ? 1\n : NaN,\n valueOf: function () {\n return positionValues[str];\n },\n toString: function () {\n return str;\n },\n North: str === \"north\",\n South: str === \"south\",\n East: str === \"east\",\n West: str === \"west\",\n Header: str === \"header\",\n Centre: str === \"centre\",\n NorthOrSouth: str === \"north\" || str === \"south\",\n EastOrWest: str === \"east\" || str === \"west\",\n NorthOrWest: str === \"north\" || str === \"west\",\n SouthOrEast: str === \"east\" || str === \"south\",\n Absolute: str === \"absolute\",\n });\n}\n\nconst NORTH = Position.North,\n SOUTH = Position.South,\n EAST = Position.East,\n WEST = Position.West,\n HEADER = Position.Header,\n CENTRE = Position.Centre;\n\nexport interface Measurements {\n [key: string]: DragDropRect;\n}\n\nexport class BoxModel {\n //TODO we should accept initial let,top offsets here\n // if dropTargets are supplied, we will only allow drop operations directly on these targets\n // TODO we will need to make this more flexible e.g allowing drop anywhere within these target\n static measure(\n model: ReactElement,\n dropTargetPaths: string[] = []\n ): Measurements {\n const measurements: Measurements = {};\n measureRootComponent(model, measurements, dropTargetPaths);\n return measurements;\n }\n\n static allBoxesContainingPoint(\n layout: LayoutModel,\n measurements: Measurements,\n x: number,\n y: number,\n validDropTargets?: string[]\n ) {\n return allBoxesContainingPoint(\n layout,\n measurements,\n x,\n y,\n validDropTargets\n ).reverse();\n }\n}\n\nexport function pointPositionWithinRect(\n x: number,\n y: number,\n rect: DragDropRect,\n borderZone = 30\n) {\n const width = rect.right - rect.left;\n const height = rect.bottom - rect.top;\n const posX = x - rect.left;\n const posY = y - rect.top;\n let closeToTheEdge = 0;\n\n if (posX < borderZone) closeToTheEdge += 8;\n if (posX > width - borderZone) closeToTheEdge += 2;\n if (posY < borderZone) closeToTheEdge += 1;\n if (posY > height - borderZone) closeToTheEdge += 4;\n\n return { pctX: posX / width, pctY: posY / height, closeToTheEdge };\n}\n\nexport function getPosition(\n x: number,\n y: number,\n rect: DragDropRect,\n targetOrientation?: \"row\" | \"column\"\n): DropPos {\n const { BEFORE, AFTER } = RelativeDropPosition;\n const { pctX, pctY, closeToTheEdge } = pointPositionWithinRect(x, y, rect);\n let position;\n let tab;\n\n if (targetOrientation === \"row\") {\n position = pctX < 0.5 ? WEST : EAST;\n } else if (rect.header && boxContainsPoint(rect.header, x, y)) {\n position = HEADER;\n\n if (rect.Stack) {\n const tabCount = rect.Stack.length;\n if (tabCount === 0) {\n tab = {\n index: -1,\n left: rect.left,\n positionRelativeToTab: AFTER,\n width: 0,\n };\n } else {\n //TODO account for gaps between tabs\n const targetTab = rect.Stack.find(\n ({ left, right }) => x >= left && x <= right\n );\n if (targetTab) {\n const tabWidth = targetTab.right - targetTab.left;\n tab = {\n index: rect.Stack.indexOf(targetTab),\n left: targetTab.left,\n positionRelativeToTab:\n (x - targetTab.left) / tabWidth < 0.5 ? BEFORE : AFTER,\n width: tabWidth,\n };\n } else {\n const lastTab = rect.Stack[tabCount - 1];\n tab = {\n left: lastTab.right,\n width: 0,\n index: tabCount,\n positionRelativeToTab: AFTER,\n };\n }\n }\n } else if (rect.header.titleWidth) {\n const tabWidth = rect.header.titleWidth;\n tab = {\n index: -1,\n left: rect.left,\n positionRelativeToTab:\n (x - rect.left) / tabWidth < 0.5 ? BEFORE : AFTER,\n width: tabWidth,\n };\n } else {\n tab = {\n left: rect.left,\n width: 0,\n positionRelativeToTab: BEFORE,\n index: -1,\n };\n }\n } else {\n position = getPositionWithinBox(x, y, rect, pctX, pctY);\n }\n return { position: position!, x, y, closeToTheEdge, tab };\n}\n\nfunction getPositionWithinBox(\n x: number,\n y: number,\n rect: DragDropRect,\n pctX: number,\n pctY: number\n) {\n const centerBox = getCenteredBox(rect, 0.2);\n if (boxContainsPoint(centerBox, x, y)) {\n return CENTRE;\n } else {\n const quadrant = `${pctY < 0.5 ? \"north\" : \"south\"}${\n pctX < 0.5 ? \"west\" : \"east\"\n }`;\n\n switch (quadrant) {\n case \"northwest\":\n return pctX > pctY ? NORTH : WEST;\n case \"northeast\":\n return 1 - pctX > pctY ? NORTH : EAST;\n case \"southeast\":\n return pctX > pctY ? EAST : SOUTH;\n case \"southwest\":\n return 1 - pctX > pctY ? WEST : SOUTH;\n default:\n }\n }\n}\n\nfunction getCenteredBox(\n { right, left, top, bottom }: DragDropRect,\n pctSize: number\n) {\n const pctOffset = (1 - pctSize) / 2;\n const w = (right - left) * pctOffset;\n const h = (bottom - top) * pctOffset;\n return { left: left + w, top: top + h, right: right - w, bottom: bottom - h };\n}\n\nfunction measureRootComponent(\n rootComponent: ReactElement,\n measurements: Measurements,\n dropTargets: string[]\n) {\n const {\n id,\n \"data-path\": dataPath,\n path = dataPath,\n } = getProps(rootComponent);\n const type = typeOf(rootComponent) as string;\n\n if (id && path) {\n const [rect, el] = measureComponentDomElement(rootComponent);\n measureComponent(rootComponent, rect, el, measurements);\n if (isContainer(type)) {\n collectChildMeasurements(rootComponent, measurements, dropTargets);\n }\n }\n}\n\nfunction measureComponent(\n component: LayoutModel,\n rect: DragDropRect,\n el: HTMLElement,\n measurements: Measurements\n) {\n const {\n \"data-path\": dataPath,\n path = dataPath,\n header,\n } = getProps(component);\n\n measurements[path] = rect;\n\n const type = typeOf(component);\n if (header || type === \"Stack\") {\n const query = type === \"Stack\" ? \".vuuTabstrip\" : \".vuuHeader\";\n const headerEl = el.querySelector(query);\n if (headerEl) {\n const { top, left, right, bottom } = headerEl.getBoundingClientRect();\n measurements[path].header = {\n top: Math.round(top),\n left: Math.round(left),\n right: Math.round(right),\n bottom: Math.round(bottom),\n };\n if (type === \"Stack\") {\n measurements[path].Stack = Array.from(\n headerEl.querySelectorAll(\".vuuTab\")\n )\n .map((tab) => tab.getBoundingClientRect())\n .map(({ left, right }) => ({ left, right }));\n } else {\n const titleEl = headerEl.querySelector('[class^=\"vuuHeader-title\"]');\n const { header } = measurements[path];\n if (titleEl && header) {\n header.titleWidth = titleEl.clientWidth;\n }\n }\n }\n }\n\n return measurements[path];\n}\n\nfunction collectChildMeasurements(\n component: LayoutModel,\n measurements: Measurements,\n dropTargets: string[],\n preX = 0,\n posX = 0,\n preY = 0,\n posY = 0\n) {\n const {\n children,\n \"data-path\": dataPath,\n path = dataPath,\n style,\n active = 0,\n } = getProps(component);\n\n const type = typeOf(component);\n const isFlexbox = type === \"Flexbox\";\n const isStack = type === \"Stack\";\n const isTower = isFlexbox && style.flexDirection === \"column\";\n const isTerrace = isFlexbox && style.flexDirection === \"row\";\n\n const childrenToMeasure = isStack\n ? children.filter((_child: ReactElement, idx: number) => idx === active)\n : children.filter(omitDragging);\n\n type measuredTuple = [DragDropRect, HTMLElement, ReactElement];\n // Collect all the measurements in first pass ...\n const childMeasurements: measuredTuple[] = childrenToMeasure.map(\n (child: ReactElement) => {\n const [rect, el] = measureComponentDomElement(child);\n\n return [\n {\n ...rect,\n top: rect.top - preY,\n right: rect.right + posX,\n bottom: rect.bottom + posY,\n left: rect.left - preX,\n },\n el,\n child,\n ];\n }\n );\n\n // ...so that, in the second pass, we can identify gaps ...\n const expandedMeasurements = childMeasurements.map(\n ([rect, el, child], i, all) => {\n // generate a 'local' splitter adjustment for children adjacent to splitters\n let localPreX;\n let localPosX;\n let localPreY;\n let localPosY;\n let gapPre;\n let gapPos;\n const n = all.length - 1;\n if (isTerrace) {\n gapPre = i === 0 ? 0 : rect.left - all[i - 1][0].right;\n gapPos = i === n ? 0 : all[i + 1][0].left - rect.right;\n // we don't need to divide the leading gap, as half the gap will\n // already have been assigned to the preceeding child in the\n // previous loop iteration.\n localPreX = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;\n localPosX = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;\n rect.left -= localPreX;\n rect.right += localPosX;\n localPreY = preY;\n localPosY = posY;\n } else if (isTower) {\n gapPre = i === 0 ? 0 : rect.top - all[i - 1][0].bottom;\n gapPos = i === n ? 0 : all[i + 1][0].top - rect.bottom;\n // we don't need to divide the leading gap, as half the gap will\n // already have been assigned to the preceeding child in the\n // previous loop iteration.\n localPreY = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;\n localPosY = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;\n rect.top -= localPreY;\n rect.bottom += localPosY;\n localPreX = preX;\n localPosX = posX;\n }\n\n const componentMeasurements = measureComponent(\n child,\n rect,\n el,\n measurements\n );\n\n const childType = typeOf(child) as string;\n if (isContainer(childType)) {\n collectChildMeasurements(\n child,\n measurements,\n dropTargets,\n localPreX,\n localPosX,\n localPreY,\n localPosY\n );\n }\n return componentMeasurements;\n }\n );\n if (childMeasurements.length) {\n measurements[path].children = expandedMeasurements;\n }\n}\n\nfunction omitDragging(component: ReactElement) {\n const { id } = getProps(component);\n const el = document.getElementById(id);\n if (el) {\n return el.dataset.dragging !== \"true\";\n } else {\n console.warn(`BoxModel: no element found with id #${id}`);\n return false;\n }\n}\n\nfunction measureComponentDomElement(\n component: LayoutModel\n): [DragDropRect, HTMLElement, LayoutModel] {\n const { id } = getProps(component) as { id: string };\n if (id === undefined) {\n throw Error(\"`BoxModel.measureComponentElement, component has no id\");\n }\n const el = document.getElementById(id);\n if (!el) {\n throw Error(\n \"BoxModel.measureComponentElement, no DOM element found for component\"\n );\n }\n // Note: height and width are not required for dropTarget identification, but\n // are used in sizing calculations on drop\n const { top, left, right, bottom, height, width } =\n el.getBoundingClientRect();\n let scrolling = undefined;\n const type = typeOf(component) as string;\n if (isContainer(type)) {\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > height) {\n scrolling = { id, scrollHeight, scrollTop: el.scrollTop };\n }\n }\n return [\n {\n top: Math.round(top),\n left: Math.round(left),\n right: Math.round(right),\n bottom: Math.round(bottom),\n height: Math.round(height),\n width: Math.round(width),\n scrolling,\n },\n el,\n component,\n ];\n}\n\nfunction allBoxesContainingPoint(\n component: LayoutModel,\n measurements: Measurements,\n x: number,\n y: number,\n dropTargets?: string[],\n boxes: LayoutModel[] = []\n): LayoutModel[] {\n const {\n children,\n \"data-path\": dataPath,\n path = dataPath,\n } = getProps(component);\n\n const type = typeOf(component) as string;\n const rect = measurements[path];\n if (!boxContainsPoint(rect, x, y)) return boxes;\n\n if (dropTargets && dropTargets.length) {\n if (dropTargets.includes(path)) {\n boxes.push(component);\n } else if (\n dropTargets.some((dropTargetPath) => dropTargetPath.startsWith(path))\n ) {\n // keep going\n } else {\n return boxes;\n }\n } else {\n boxes.push(component);\n }\n\n if (!isContainer(type)) {\n return boxes;\n }\n\n if (rect.header && boxContainsPoint(rect.header, x, y)) {\n return boxes;\n }\n\n if (rect.scrolling) {\n scrollIntoViewIfNeccesary(rect, x, y);\n }\n\n for (let i = 0; i < children.length; i++) {\n if (type === \"Stack\" && component.props.active !== i) {\n continue;\n }\n const nestedBoxes = allBoxesContainingPoint(\n children[i],\n measurements,\n x,\n y,\n dropTargets\n );\n if (nestedBoxes.length) {\n return boxes.concat(nestedBoxes);\n }\n }\n return boxes;\n}\n\nfunction scrollIntoViewIfNeccesary(\n { top, bottom, scrolling }: DragDropRect,\n x: number,\n y: number\n) {\n if (scrolling) {\n const { id, scrollTop, scrollHeight } = scrolling;\n const height = bottom - top;\n if (scrollTop === 0 && bottom - y < 50) {\n const scrollMax = scrollHeight - height;\n const el = document.getElementById(id) as HTMLElement;\n el.scrollTo({ left: 0, top: scrollMax, behavior: \"smooth\" });\n scrolling.scrollTop = scrollMax;\n } else if (scrollTop > 0 && y - top < 50) {\n const el = document.getElementById(id) as HTMLElement;\n el.scrollTo({ left: 0, top: 0, behavior: \"smooth\" });\n scrolling.scrollTop = 0;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n", "import { pointPositionWithinRect } from './BoxModel';\nimport { DragDropRect } from './dragDropTypes';\n\nconst SCALE_FACTOR = 0.4;\n\nexport type IntrinsicSizes = {\n height?: number;\n width?: number;\n};\n\ninterface ZoneRange {\n hi: number;\n lo: number;\n}\ntype DragConstraint = {\n zone: {\n x: ZoneRange;\n y: ZoneRange;\n };\n pos: {\n x: ZoneRange;\n y: ZoneRange;\n };\n mouse: {\n x: ZoneRange;\n y: ZoneRange;\n };\n};\n\ninterface ExtendedZoneRange {\n lo: boolean;\n hi: boolean;\n mousePct: number;\n mousePos: number;\n pos: number;\n}\n\nexport class DragState {\n public constraint!: DragConstraint;\n public x!: ExtendedZoneRange;\n public y!: ExtendedZoneRange;\n public intrinsicSize: IntrinsicSizes | undefined;\n\n constructor(\n zone: DragDropRect,\n mouseX: number,\n mouseY: number,\n measurements: DragDropRect,\n intrinsicSize?: IntrinsicSizes\n ) {\n this.init(zone, mouseX, mouseY, measurements, intrinsicSize);\n }\n\n init(\n zone: DragDropRect,\n mouseX: number,\n mouseY: number,\n rect: DragDropRect,\n intrinsicSize?: IntrinsicSizes\n ) {\n const { left: x, top: y } = rect;\n\n const { pctX, pctY } = pointPositionWithinRect(mouseX, mouseY, rect);\n\n // We are applying a scale factor of 0.4 to the draggee. This is purely a visual\n // effect - the actual box size remains the original size. The 'leading' values\n // represent the difference between the visual scaled down box and the actual box.\n\n const scaleFactor = SCALE_FACTOR;\n\n const leadX = pctX * rect.width;\n const trailX = rect.width - leadX;\n const leadY = pctY * rect.height;\n const trailY = rect.height - leadY;\n\n // When we assign position to rect using css. positioning units are applied to the\n // unscaled shape, so we have to adjust values to take scaling into account.\n const scaledWidth = rect.width * scaleFactor,\n scaledHeight = rect.height * scaleFactor;\n\n const scaleDiff = 1 - scaleFactor;\n const leadXScaleDiff = leadX * scaleDiff;\n const leadYScaleDiff = leadY * scaleDiff;\n const trailXScaleDiff = trailX * scaleDiff;\n const trailYScaleDiff = trailY * scaleDiff;\n\n this.intrinsicSize = intrinsicSize;\n\n this.constraint = {\n zone: {\n x: {\n lo: zone.left,\n hi: zone.right\n },\n y: {\n lo: zone.top,\n hi: zone.bottom\n }\n },\n\n pos: {\n x: {\n lo: /* left */ zone.left - leadXScaleDiff,\n hi: /* right */ zone.right - rect.width + trailXScaleDiff\n },\n y: {\n lo: /* top */ zone.top - leadYScaleDiff,\n hi: /* bottom */ zone.bottom - rect.height + trailYScaleDiff\n }\n },\n mouse: {\n x: {\n lo: /* left */ zone.left + scaledWidth * pctX,\n hi: /* right */ zone.right - scaledWidth * (1 - pctX)\n },\n y: {\n lo: /* top */ zone.top + scaledHeight * pctY,\n hi: /* bottom */ zone.bottom - scaledHeight * (1 - pctY)\n }\n }\n };\n\n this.x = {\n pos: x,\n lo: false,\n hi: false,\n mousePos: mouseX,\n mousePct: pctX\n };\n this.y = {\n pos: y,\n lo: false,\n hi: false,\n mousePos: mouseY,\n mousePct: pctY\n };\n }\n\n outOfBounds() {\n return this.x.lo || this.x.hi || this.y.lo || this.y.hi;\n }\n\n inBounds() {\n return !this.outOfBounds();\n }\n\n dropX() {\n return this.dropXY('x');\n }\n\n dropY() {\n return this.dropXY('y');\n }\n\n hasIntrinsicSize(): number | undefined {\n return this?.intrinsicSize?.height && this?.intrinsicSize?.width;\n }\n\n /*\n * diff = mouse movement, signed int\n * xy = 'x' or 'y'\n */\n //todo, diff can be calculated in here\n update(xy: 'x' | 'y', mousePos: number) {\n const state = this[xy],\n mouseConstraint = this.constraint.mouse[xy],\n posConstraint = this.constraint.pos[xy],\n previousPos = state.pos;\n\n const diff = mousePos - state.mousePos;\n\n //xy==='x' && console.log(`update: state.lo=${state.lo}, mPos=${mousePos}, mC.lo=${mouseConstraint.lo}, prevPos=${previousPos}, diff=${diff} ` );\n\n if (diff < 0) {\n if (state.lo) {\n /* do nothing */\n } else if (mousePos < mouseConstraint.lo) {\n state.lo = true;\n state.pos = posConstraint.lo;\n } else if (state.hi) {\n if (mousePos < mouseConstraint.hi) {\n state.hi = false;\n state.pos += diff;\n }\n } else {\n state.pos += diff;\n }\n } else if (diff > 0) {\n if (state.hi) {\n /* do nothing */\n } else if (mousePos > mouseConstraint.hi) {\n state.hi = true;\n state.pos = posConstraint.hi;\n } else if (state.lo) {\n if (mousePos > mouseConstraint.lo) {\n state.lo = false;\n state.pos += diff;\n }\n } else {\n state.pos += diff;\n }\n }\n\n state.mousePos = mousePos;\n\n return previousPos !== state.pos;\n }\n\n private dropXY(this: DragState, dir: 'x' | 'y') {\n const pos = this[dir],\n rect = this.constraint.zone[dir];\n // why not do the rounding +/- 1 on the rect initially - this is all it is usef for\n return pos.lo\n ? Math.max(rect.lo, pos.mousePos)\n : pos.hi\n ? Math.min(pos.mousePos, Math.round(rect.hi) - 1)\n : pos.mousePos;\n }\n}\n", "import { rect, rectTuple } from \"@vuu-ui/vuu-utils\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { getProps, typeOf } from \"../utils\";\nimport {\n BoxModel,\n getPosition,\n Measurements,\n Position,\n positionValues,\n RelativeDropPosition,\n} from \"./BoxModel\";\nimport { DragDropRect, DropPos, DropPosTab } from \"./dragDropTypes\";\nimport { DragState } from \"./DragState\";\n\nexport const isTabstrip = (dropTarget: DropTarget) =>\n dropTarget.pos.tab &&\n typeOf(dropTarget.component) === \"Stack\" &&\n dropTarget.pos.position.Header;\n\nconst { north, south, east, west } = positionValues;\nconst eastwest = east + west;\nconst northsouth = north + south;\n\nexport interface DropTargetProps {\n component: LayoutModel;\n pos: DropPos;\n clientRect: DragDropRect;\n nextDropTarget: DropTarget | null;\n}\n\nexport type GuideLine = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number\n];\nexport interface TargetDropOutline {\n l: number;\n r: number;\n t: number;\n b: number;\n tabLeft?: number;\n tabWidth?: number;\n tabHeight?: number;\n guideLines?: GuideLine;\n}\n\nexport class DropTarget {\n private active: boolean;\n\n public box: unknown;\n public clientRect: DragDropRect;\n public component: LayoutModel;\n public dropRect: rectTuple | undefined;\n public nextDropTarget: DropTarget | null;\n public pos: DropPos;\n\n constructor({\n component,\n pos,\n clientRect /*, closeToTheEdge*/,\n nextDropTarget,\n }: DropTargetProps) {\n this.component = component;\n this.pos = pos;\n this.clientRect = clientRect;\n this.nextDropTarget = nextDropTarget;\n this.active = false;\n this.dropRect = undefined;\n }\n\n targetTabPos(tab: DropPosTab) {\n const { left: tabLeft, width: tabWidth, positionRelativeToTab } = tab;\n return positionRelativeToTab === RelativeDropPosition.BEFORE\n ? tabLeft\n : tabLeft + tabWidth;\n }\n\n /**\n * Determine what will be rendered by the dropTargetRenderer\n *\n * @param {*} lineWidth\n * @param {*} dragState\n * @returns {l, t, r, b, tabLeft, tabWidth, tabHeight}\n */\n getTargetDropOutline(\n lineWidth: number,\n dragState?: DragState\n ): TargetDropOutline {\n if (this.pos.tab) {\n return this.getDropTabOutline(lineWidth, this.pos.tab);\n } else if (dragState && dragState.hasIntrinsicSize()) {\n return this.getIntrinsicDropRect(dragState);\n } else {\n const [l, t, r, b] = this.getDropRectOutline(\n lineWidth,\n dragState\n ) as rectTuple;\n return { l, t, r, b };\n }\n }\n\n getDropTabOutline(lineWidth: number, tab: DropPosTab): TargetDropOutline {\n const {\n clientRect: { top, left, right, bottom, header },\n } = this;\n\n const inset = 0;\n const gap = Math.round(lineWidth / 2) + inset;\n\n const t = Math.round(top);\n const l = Math.round(left + gap);\n const r = Math.round(right - gap);\n const b = Math.round(bottom - gap);\n const tabLeft = this.targetTabPos(tab);\n const tabWidth = 60; // should really measure text\n const tabHeight = (header?.bottom ?? 0) - (header?.top ?? 0);\n return { l, t, r, b, tabLeft, tabWidth, tabHeight };\n }\n\n getIntrinsicDropRect(dragState: DragState): TargetDropOutline {\n const { pos, clientRect: rect } = this;\n\n const { x, y } = dragState;\n\n let height = dragState.intrinsicSize?.height ?? 0;\n let width = dragState.intrinsicSize?.height ?? 0;\n\n if (height && height > rect.height) {\n console.log(`DropTarget: we're going to blow the gaff`);\n height = rect.height;\n } else if (width && width > rect.width) {\n console.log(`DropTarget: we're going to blow the gaff`);\n width = rect.width;\n }\n\n const left = Math.min(\n rect.right - width,\n Math.max(rect.left, Math.round(pos.x - x.mousePct * width))\n );\n const top = Math.min(\n rect.bottom - height,\n Math.max(rect.top, Math.round(pos.y - y.mousePct * height))\n );\n const [l, t, r, b] = (this.dropRect = [\n left,\n top,\n left + width,\n top + height,\n ]);\n\n const guideLines: GuideLine = pos.position.EastOrWest\n ? [l, rect.top, l, rect.bottom, r, rect.top, r, rect.bottom]\n : [rect.left, t, rect.right, t, rect.left, b, rect.right, b];\n\n return { l, r, t, b, guideLines };\n }\n\n /**\n * @returns [left, top, right, bottom]\n */\n getDropRectOutline(lineWidth: number, dragState?: DragState) {\n const { pos, clientRect: rect } = this;\n const { width: suggestedWidth, height: suggestedHeight, position } = pos;\n\n const { width: intrinsicWidth, height: intrinsicHeight } =\n dragState?.intrinsicSize ?? {};\n const sizeHeight = intrinsicHeight ?? suggestedHeight ?? 0;\n const sizeWidth = intrinsicWidth ?? suggestedWidth ?? 0;\n\n this.dropRect = undefined;\n\n const { top: t, left: l, right: r, bottom: b } = rect;\n\n const inset = 0;\n const gap = Math.round(lineWidth / 2) + inset;\n\n switch (position) {\n case Position.North:\n case Position.Header: {\n const halfHeight = Math.round((b - t) / 2);\n const height = sizeHeight\n ? Math.min(halfHeight, Math.round(sizeHeight))\n : halfHeight;\n return sizeWidth && l + sizeWidth < r\n ? [l + gap, t + gap, l + sizeWidth - gap, t + gap + height] // need flex direction indicator\n : [l + gap, t + gap, r - gap, t + gap + height];\n }\n case Position.West: {\n const halfWidth = Math.round((r - l) / 2);\n const width = sizeWidth\n ? Math.min(halfWidth, Math.round(sizeWidth))\n : halfWidth;\n return sizeHeight && t + sizeHeight < b\n ? [l + gap, t + gap, l - gap + width, t + sizeHeight + gap] // need flex direction indicator\n : [l + gap, t + gap, l - gap + width, b - gap];\n }\n case Position.East: {\n const halfWidth = Math.round((r - l) / 2);\n const width = sizeWidth\n ? Math.min(halfWidth, Math.round(sizeWidth))\n : halfWidth;\n return sizeHeight && t + sizeHeight < b\n ? [r - gap - width, t + gap, r - gap, t + sizeHeight + gap] // need flex direction indicator\n : [r - gap - width, t + gap, r - gap, b - gap];\n }\n case Position.South: {\n const halfHeight = Math.round((b - t) / 2);\n const height = sizeHeight\n ? Math.min(halfHeight, Math.round(sizeHeight))\n : halfHeight;\n\n return sizeWidth && l + sizeWidth < r\n ? [l + gap, b - gap - height, l + sizeWidth - gap, b - gap] // need flex direction indicator\n : [l + gap, b - gap - height, r - gap, b - gap];\n }\n case Position.Centre: {\n return [l + gap, t + gap, r - gap, b - gap];\n }\n default:\n console.warn(`DropTarget does not recognize position ${position}`);\n return null;\n }\n }\n\n activate() {\n this.active = true;\n return this;\n }\n\n toArray(this: DropTarget) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let dropTarget: DropTarget | null = this;\n const dropTargets = [dropTarget];\n // eslint-disable-next-line no-cond-assign\n while ((dropTarget = dropTarget.nextDropTarget)) {\n dropTargets.push(dropTarget);\n }\n return dropTargets;\n }\n\n static getActiveDropTarget(dropTarget: DropTarget | null): DropTarget | null {\n return dropTarget === null\n ? null\n : dropTarget?.active\n ? dropTarget\n : DropTarget.getActiveDropTarget(dropTarget.nextDropTarget);\n }\n}\n\n// Initial entry to this method is always via the app (may be it should be *on* the app)\nexport function identifyDropTarget(\n x: number,\n y: number,\n rootLayout: LayoutModel,\n measurements: Measurements,\n intrinsicSize?: number,\n validDropTargets?: string[]\n) {\n let dropTarget = null;\n\n const allBoxesContainingPoint = BoxModel.allBoxesContainingPoint(\n rootLayout,\n measurements,\n x,\n y,\n validDropTargets\n );\n\n if (allBoxesContainingPoint.length) {\n const [component, ...containers] = allBoxesContainingPoint;\n const {\n \"data-path\": dataPath,\n path = dataPath,\n \"data-row-placeholder\": isRowPlaceholder,\n } = getProps(component);\n const clientRect = measurements[path];\n const placeholderOrientation =\n intrinsicSize && isRowPlaceholder ? \"row\" : undefined;\n const pos = getPosition(x, y, clientRect, placeholderOrientation);\n const box = measurements[path];\n\n const nextDropTarget = ([nextTarget, ...targets]: LayoutModel[]):\n | DropTarget\n | undefined => {\n if (pos.position?.Header || pos.closeToTheEdge) {\n const targetPosition = getTargetPosition(\n nextTarget,\n pos,\n box,\n measurements,\n x,\n y\n );\n if (targetPosition) {\n const [containerPos, clientRect] = targetPosition;\n\n return new DropTarget({\n component: nextTarget,\n pos: containerPos,\n clientRect,\n nextDropTarget: nextDropTarget(targets) ?? null,\n });\n } else if (targets.length) {\n return nextDropTarget(targets);\n }\n }\n };\n dropTarget = new DropTarget({\n component,\n pos,\n clientRect,\n nextDropTarget: nextDropTarget(containers) ?? null,\n }).activate();\n }\n\n return dropTarget;\n}\n\nfunction getTargetPosition(\n container: LayoutModel,\n { closeToTheEdge, position }: DropPos,\n box: rect,\n measurements: Measurements,\n x: number,\n y: number\n): [DropPos, DragDropRect] | undefined {\n if (!container || container.type === \"DraggableLayout\") {\n return;\n }\n\n const containingBox = measurements[container.props.path];\n const closeToTop = closeToTheEdge & positionValues.north;\n const closeToRight = closeToTheEdge & positionValues.east;\n const closeToBottom = closeToTheEdge & positionValues.south;\n const closeToLeft = closeToTheEdge & positionValues.west;\n\n const atTop =\n (closeToTop || position.Header) &&\n Math.round(box.top) === Math.round(containingBox.top);\n const atRight =\n closeToRight && Math.round(box.right) === Math.round(containingBox.right);\n const atBottom =\n closeToBottom &&\n Math.round(box.bottom) === Math.round(containingBox.bottom);\n const atLeft =\n closeToLeft && Math.round(box.left) === Math.round(containingBox.left);\n\n if (atTop || atRight || atBottom || atLeft) {\n const { \"data-path\": dataPath, path = dataPath } = container.props;\n const clientRect = measurements[path];\n const containerPos = getPosition(x, y, clientRect);\n\n // if its a VBox and we're close to left or right ...\n if (\n (isVBox(container) || isTabbedContainer(container)) &&\n closeToTheEdge & eastwest\n ) {\n containerPos.width = 120;\n return [containerPos, clientRect];\n }\n // if it's a HBox and we're close to top or bottom ...\n else if (\n (isHBox(container) || isTabbedContainer(container)) &&\n (position.Header || closeToTheEdge & northsouth)\n ) {\n containerPos.height = 120;\n return [containerPos, clientRect];\n }\n }\n}\n\nfunction isTabbedContainer(component: LayoutModel) {\n return typeOf(component) === \"Stack\";\n}\n\nfunction isVBox(component: LayoutModel) {\n return (\n typeOf(component) === \"Flexbox\" &&\n component.props.style.flexDirection === \"column\"\n );\n}\n\nfunction isHBox(component: LayoutModel) {\n return (\n typeOf(component) === \"Flexbox\" &&\n component.props.style.flexDirection === \"row\"\n );\n}\n", "import { PopupService } from \"@vuu-ui/vuu-popups\";\nimport { RelativeDropPosition } from \"./BoxModel\";\nimport { DragDropRect } from \"./dragDropTypes\";\nimport { DragState } from \"./DragState\";\nimport { computeMenuPosition, DropMenu } from \"./DropMenu\";\nimport { DropTarget, GuideLine } from \"./DropTarget\";\n\nimport \"./DropTargetRenderer.css\";\n\ntype Point = [number, number];\ntype TabMode = \"full-view\" | \"tab-only\";\n\nlet _multiDropOptions = false;\nlet _hoverDropTarget: DropTarget | null = null;\nlet _shiftedTab: HTMLElement | null = null;\n\nconst onHoverDropTarget = (dropTarget: DropTarget | null) =>\n (_hoverDropTarget = dropTarget);\n\nconst start = ([x, y]: Point) => `M${x},${y}`;\nconst point = ([x, y]: Point) => `L${x},${y}`;\nconst pathFromPoints = ([p1, ...points]: Point[]) =>\n `${start(p1)} ${points.map(point)}Z`;\n\nconst pathFromGuideLines = (guideLines?: GuideLine) => {\n if (guideLines) {\n const [x1, y1, x2, y2, x3, y3, x4, y4] = guideLines;\n return `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`;\n } else {\n return \"\";\n }\n};\n\nfunction insertSVGRoot() {\n if (document.getElementById(\"hw-drag-canvas\") === null) {\n const root = document.getElementById(\"root\");\n const container = document.createElement(\"div\");\n container.id = \"hw-drag-canvas\";\n container.innerHTML = `\n <svg width=\"100%\" height=\"100%\">\n <path id=\"hw-drop-guides\" />\n <path\n id=\"vuu-drop-outline\"\n d=\"M300,132 L380,132 L380,100 L460,100 L460,132, L550,132 L550,350 L300,350z\">\n <animate\n attributeName=\"d\"\n id=\"hw-drop-outline-animate\"\n begin=\"indefinite\"\n dur=\"300ms\"\n fill=\"freeze\"\n to=\"M255,33 L255,33,L255,1,L315,1,L315,1,L794,1,L794,164,L255,164Z\"\n />\n </path>\n </svg>\n `;\n document.body.insertBefore(container, root);\n }\n}\nexport default class DropTargetCanvas {\n private currentPath: string | null = null;\n private tabMode: TabMode | null = null;\n\n constructor() {\n insertSVGRoot();\n }\n\n prepare(dragRect: DragDropRect, tabMode: TabMode = \"full-view\") {\n // don't do this on body\n document.body.classList.add(\"drawing\");\n this.currentPath = null;\n this.tabMode = tabMode;\n\n const points = this.getPoints(0, 0, 0, 0);\n // const points = this.getPoints(left, top, width, height);\n const d = pathFromPoints(points);\n\n const dropOutlinePath = document.getElementById(\"vuu-drop-outline\");\n dropOutlinePath?.setAttribute(\"d\", d);\n this.currentPath = d;\n }\n\n clear() {\n // don't do this on body\n _hoverDropTarget = null;\n clearShiftedTab();\n document.body.classList.remove(\"drawing\");\n PopupService.hidePopup();\n }\n\n get hoverDropTarget() {\n return _hoverDropTarget;\n }\n\n getPoints(\n x: number,\n y: number,\n width: number,\n height: number,\n tabLeft = 0,\n tabWidth = 0,\n tabHeight = 0\n ): Point[] {\n const tabOnly = this.tabMode === \"tab-only\";\n if (tabWidth === 0) {\n return [\n [x, y + tabHeight],\n [x, y + tabHeight],\n [x, y],\n [x + tabWidth, y],\n [x + tabWidth, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n ];\n } else if (tabOnly) {\n const left = tabLeft;\n return [\n [left, y],\n [left, y],\n [left + tabWidth, y],\n [left + tabWidth, y],\n [left + tabWidth, y + tabHeight],\n [left + tabWidth, y + tabHeight],\n [left, y + tabHeight],\n [left, y + tabHeight],\n ];\n } else if (tabLeft === 0) {\n return [\n [x, y + tabHeight],\n [x, y + tabHeight],\n [x, y],\n [x + tabWidth, y],\n [x + tabWidth, y + tabHeight],\n [x + width, y + tabHeight],\n [x + width, y + height],\n [x, y + height],\n ];\n } else {\n return [\n [x, y + tabHeight],\n [x + tabLeft, y + tabHeight],\n [x + tabLeft, y],\n [x + tabLeft, y],\n [x + tabLeft, y + tabHeight],\n [x + width, y + tabHeight],\n [x + width, y + height],\n [x, y + height],\n ];\n }\n }\n\n draw(dropTarget: DropTarget, dragState: DragState) {\n const sameDropTarget = false;\n const wasMultiDrop = _multiDropOptions;\n\n if (_hoverDropTarget !== null) {\n this.drawTarget(_hoverDropTarget);\n } else {\n if (sameDropTarget === false) {\n _multiDropOptions = dropTarget.nextDropTarget != null;\n if (dropTarget.pos.tab) {\n moveExistingTabs(dropTarget);\n } else if (_shiftedTab) {\n clearShiftedTab();\n }\n this.drawTarget(dropTarget, dragState);\n }\n\n if (_multiDropOptions) {\n const [left, top, orientation] = computeMenuPosition(dropTarget);\n if (!wasMultiDrop || !sameDropTarget) {\n const component = (\n <DropMenu\n dropTarget={dropTarget}\n onHover={onHoverDropTarget}\n orientation={orientation}\n />\n );\n PopupService.showPopup({\n left,\n top,\n component,\n });\n }\n } else {\n PopupService.hidePopup();\n }\n }\n }\n\n drawTarget(dropTarget: DropTarget, dragState?: DragState) {\n const lineWidth = 6;\n\n const targetDropOutline = dropTarget.getTargetDropOutline(\n lineWidth,\n dragState\n );\n\n if (targetDropOutline) {\n const { l, t, r, b, tabLeft, tabWidth, tabHeight, guideLines } =\n targetDropOutline;\n const w = r - l;\n const h = b - t;\n\n if (this.currentPath) {\n const path = document.getElementById(\"vuu-drop-outline\");\n path?.setAttribute(\"d\", this.currentPath);\n }\n\n const points = this.getPoints(l, t, w, h, tabLeft, tabWidth, tabHeight);\n const path = pathFromPoints(points);\n const animation = document.getElementById(\n \"hw-drop-outline-animate\"\n ) as unknown as SVGAnimateElement;\n animation?.setAttribute(\"to\", path);\n animation?.beginElement();\n this.currentPath = path;\n\n const dropGuidePath = document.getElementById(\"hw-drop-guides\");\n dropGuidePath?.setAttribute(\"d\", pathFromGuideLines(guideLines));\n }\n }\n}\n\nconst cssShiftRight = \"transition:margin-left .4s ease-out;margin-left: 63px\";\nconst cssShiftBack = \"transition:margin-left .4s ease-out;margin-left: 0px\";\n\nfunction moveExistingTabs(dropTarget: DropTarget) {\n const { AFTER, BEFORE } = RelativeDropPosition;\n const {\n clientRect: { Stack },\n pos: {\n // tab: { index: tabIndex, positionRelativeToTab }\n tab,\n },\n } = dropTarget;\n\n const { id } = dropTarget.component.props;\n let tabEl = null;\n // console.log(`tabPos = ${tabPos} (width=${tabWidth}) x=${x}`)\n if (Stack && tab && tab.positionRelativeToTab !== AFTER) {\n const tabOffset = tab.positionRelativeToTab === BEFORE ? 1 : 2;\n const selector = `:scope .hwTabstrip > .hwTabstrip-inner > .hwTab:nth-child(${\n tab.index + tabOffset\n })`;\n tabEl = document.getElementById(id)?.querySelector(selector) as HTMLElement;\n if (tabEl) {\n if (_shiftedTab === null || _shiftedTab !== tabEl) {\n tabEl.style.cssText = cssShiftRight;\n if (_shiftedTab) {\n _shiftedTab.style.cssText = cssShiftBack;\n }\n _shiftedTab = tabEl;\n }\n } else {\n clearShiftedTab();\n }\n } else if (tab?.positionRelativeToTab === BEFORE) {\n if (_shiftedTab === null) {\n const selector = \".vuuHeader-title\";\n tabEl = document\n .getElementById(id)\n ?.querySelector(selector) as HTMLElement;\n tabEl.style.cssText = cssShiftRight;\n _shiftedTab = tabEl;\n }\n } else {\n clearShiftedTab();\n }\n}\n\nfunction clearShiftedTab() {\n if (_shiftedTab) {\n _shiftedTab.style.cssText = cssShiftBack;\n _shiftedTab = null;\n }\n}\n", "import cx from \"classnames\";\nimport { HTMLAttributes } from \"react\";\nimport { DropTarget } from \"./DropTarget\";\n\nimport \"./DropMenu.css\";\n\nexport function computeMenuPosition(\n dropTarget: DropTarget,\n offsetTop = 0,\n offsetLeft = 0\n): [number, number, \"left\" | \"bottom\" | \"right\" | \"top\"] {\n const { pos, clientRect: box } = dropTarget;\n const menuOffset = 20;\n\n return pos.position.West\n ? [box.left - offsetLeft + menuOffset, pos.y - offsetTop, \"left\"]\n : pos.position.South\n ? [pos.x - offsetLeft, box.bottom - offsetTop - menuOffset, \"bottom\"]\n : pos.position.East\n ? [box.right - offsetLeft - menuOffset, pos.y - offsetTop, \"right\"]\n : /* North | Header*/ [\n pos.x - offsetLeft,\n box.top - offsetTop + menuOffset,\n \"top\",\n ];\n}\n\nconst classBase = \"vuuDropMenu\";\n\nexport interface DropMenuProps extends HTMLAttributes<HTMLDivElement> {\n dropTarget: DropTarget;\n onHover: (target: DropTarget | null) => void;\n orientation?: \"left\" | \"top\" | \"right\" | \"bottom\";\n}\n\nexport const DropMenu = ({\n className,\n dropTarget,\n onHover,\n orientation,\n}: DropMenuProps) => {\n const dropTargets = dropTarget.toArray();\n // TODO we have all the information here to draw a mini target map\n // but maybe thats overkill ...\n\n return (\n <div\n className={cx(classBase, className, `${classBase}-${orientation}`)}\n onMouseLeave={() => onHover(null)}\n >\n {dropTargets.map((target, i) => (\n <div\n key={i}\n className={`${classBase}-item`}\n data-icon={i === 0 ? \"column-2A\" : \"column-2B\"}\n onMouseEnter={() => onHover(target)}\n />\n ))}\n </div>\n );\n};\n", "import { rect } from \"@vuu-ui/vuu-utils\";\nimport { ReactElement } from \"react\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { findTarget, followPath, getProps } from \"../utils\";\nimport { BoxModel, Measurements } from \"./BoxModel\";\nimport { DragDropRect } from \"./dragDropTypes\";\nimport { DragState, IntrinsicSizes } from \"./DragState\";\nimport { DropTarget, identifyDropTarget } from \"./DropTarget\";\nimport DropTargetRenderer from \"./DropTargetRenderer\";\n\nexport type DragStartCallback = (e: MouseEvent, x: number, y: number) => void;\nexport type DragMoveCallback = (\n x: number | undefined,\n y: number | undefined\n) => void;\nexport type DragEndCallback = (droppedTarget?: Partial<DropTarget>) => void;\nexport type DragInstructions = {\n DoNotRemove?: boolean;\n DoNotTransform?: boolean;\n dragThreshold?: number;\n DriftHomeIfNoDropTarget?: boolean;\n RemoveDraggableOnDragEnd?: boolean;\n};\n\nlet _dragStartCallback: DragStartCallback | null;\nlet _dragMoveCallback: DragMoveCallback | null;\nlet _dragEndCallback: DragEndCallback | null;\n\nlet _dragStartX: number;\nlet _dragStartY: number;\nlet _dragContainer: ReactElement | undefined;\nlet _dragState: DragState;\nlet _dropTarget: DropTarget | null = null;\nlet _validDropTargetPaths: string[] | undefined;\nlet _dragInstructions: DragInstructions;\nlet _measurements: Measurements;\nlet _simpleDrag: boolean;\nlet _dragThreshold: number;\nlet _mouseDownTimer: number | null = null;\n\nconst DEFAULT_DRAG_THRESHOLD = 3;\nconst _dropTargetRenderer = new DropTargetRenderer();\nconst SCALE_FACTOR = 0.4;\n\nfunction getDragContainer(\n rootContainer: ReactElement,\n dragContainerPath: string\n) {\n if (dragContainerPath) {\n return followPath(rootContainer, dragContainerPath) as ReactElement;\n } else {\n return findTarget(\n rootContainer,\n // TODO dropTarget is not good\n (props) => props.dropTarget\n ) as ReactElement;\n }\n}\n\nexport const Draggable = {\n handleMousedown(\n e: MouseEvent,\n dragStartCallback: DragStartCallback,\n dragInstructions: DragInstructions = {}\n ) {\n _dragStartCallback = dragStartCallback;\n _dragInstructions = dragInstructions;\n\n _dragStartX = e.clientX;\n _dragStartY = e.clientY;\n\n _dragThreshold =\n dragInstructions.dragThreshold === undefined\n ? DEFAULT_DRAG_THRESHOLD\n : dragInstructions.dragThreshold;\n\n if (_dragThreshold === 0) {\n // maybe this should be -1\n _dragStartCallback(e, 0, 0);\n } else {\n window.addEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.addEventListener(\"mouseup\", preDragMouseupHandler, false);\n\n _mouseDownTimer = window.setTimeout(() => {\n window.removeEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", preDragMouseupHandler, false);\n _dragStartCallback?.(e, 0, 0);\n }, 500);\n }\n\n e.preventDefault();\n },\n\n // called from handleDragStart (_dragCallback)\n initDrag(\n rootContainer: ReactElement,\n dragContainerPath: string,\n { top, left, right, bottom }: rect,\n dragPos: { x: number; y: number },\n dragHandler: {\n drag: DragMoveCallback;\n drop: DragEndCallback;\n },\n intrinsicSize?: IntrinsicSizes,\n dropTargets?: string[]\n ) {\n ({ drag: _dragMoveCallback, drop: _dragEndCallback } = dragHandler);\n return initDrag(\n rootContainer,\n dragContainerPath,\n { top, left, right, bottom } as DragDropRect,\n dragPos,\n intrinsicSize,\n dropTargets\n );\n },\n};\n\nfunction preDragMousemoveHandler(e: MouseEvent) {\n const x = true;\n const y = true;\n\n const x_diff = x ? e.clientX - _dragStartX : 0;\n const y_diff = y ? e.clientY - _dragStartY : 0;\n const mouseMoveDistance = Math.max(Math.abs(x_diff), Math.abs(y_diff));\n\n // when we do finally move the draggee, we are going to 'jump' by the amount of the drag threshold, should we\n // attempt to animate this ?\n if (mouseMoveDistance > _dragThreshold) {\n window.removeEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", preDragMouseupHandler, false);\n _dragStartCallback?.(e, x_diff, y_diff);\n _dragStartCallback = null;\n }\n}\n\nfunction preDragMouseupHandler() {\n if (_mouseDownTimer) {\n window.clearTimeout(_mouseDownTimer);\n _mouseDownTimer = null;\n }\n window.removeEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", preDragMouseupHandler, false);\n}\n\nfunction initDrag(\n rootContainer: ReactElement,\n dragContainerPath: string,\n dragRect: DragDropRect,\n dragPos: { x: number; y: number },\n intrinsicSize?: IntrinsicSizes,\n dropTargets?: string[]\n) {\n _dragContainer = getDragContainer(rootContainer, dragContainerPath);\n\n const { \"data-path\": dataPath, path = dataPath } = getProps(_dragContainer);\n\n if (dropTargets) {\n const dropPaths = dropTargets\n .map((id) => findTarget(rootContainer, (props) => props.id === id))\n .map((target) => (target as LayoutModel).props.path);\n _validDropTargetPaths = dropPaths;\n }\n\n // const start = window.performance.now();\n // translate the layout $position to drag-oriented co-ordinates, ignoring splitters\n\n _measurements = BoxModel.measure(_dragContainer, dropTargets);\n // console.log({ _measurements });\n // onsole.log({ measurements: _measurements });\n // const end = window.performance.now();\n // console.log(`[Draggable] measurements took ${end - start}ms`, _measurements);\n\n const dragZone = _measurements[path];\n\n _dragState = new DragState(\n dragZone,\n dragPos.x,\n dragPos.y,\n dragRect,\n intrinsicSize\n );\n\n const pctX = Math.round(_dragState.x.mousePct * 100);\n const pctY = Math.round(_dragState.y.mousePct * 100);\n\n window.addEventListener(\"mousemove\", dragMousemoveHandler, false);\n window.addEventListener(\"mouseup\", dragMouseupHandler, false);\n window.addEventListener(\"keydown\", dragKeydownHandler, false);\n\n _simpleDrag = false;\n\n _dropTargetRenderer.prepare(dragRect, \"tab-only\");\n\n return _dragInstructions.DoNotTransform\n ? \"transform:none\"\n : // scale factor should be applied in caller, not here\n `transform:scale(${SCALE_FACTOR},${SCALE_FACTOR});transform-origin:${pctX}% ${pctY}%;`;\n}\n\nfunction dragMousemoveHandler(evt: MouseEvent) {\n const x = evt.clientX;\n const y = evt.clientY;\n const dragState = _dragState;\n const currentDropTarget = _dropTarget;\n let dropTarget;\n let newX, newY;\n\n if (dragState.update(\"x\", x)) {\n newX = dragState.x.pos;\n }\n\n if (dragState.update(\"y\", y)) {\n newY = dragState.y.pos;\n }\n\n if (newX === undefined && newY === undefined) {\n //onsole.log('both x and y are unchanged');\n } else {\n _dragMoveCallback?.(newX, newY);\n }\n\n if (_simpleDrag || _dragContainer === undefined) {\n return;\n }\n\n if (dragState.inBounds()) {\n dropTarget = identifyDropTarget(\n x,\n y,\n _dragContainer,\n _measurements,\n dragState.hasIntrinsicSize(),\n _validDropTargetPaths\n );\n } else {\n dropTarget = identifyDropTarget(\n dragState.dropX(),\n dragState.dropY(),\n _dragContainer,\n _measurements\n );\n }\n\n // did we have an existing droptarget which is no longer such ...\n if (currentDropTarget) {\n if (dropTarget == null || dropTarget.box !== currentDropTarget.box) {\n _dropTarget = null;\n }\n }\n\n if (dropTarget) {\n _dropTargetRenderer.draw(dropTarget, dragState);\n _dropTarget = dropTarget;\n }\n}\n\nfunction dragKeydownHandler(evt: KeyboardEvent) {\n if (evt.key === \"Escape\") {\n _dropTarget = null;\n onDragEnd();\n }\n}\n\nfunction dragMouseupHandler() {\n onDragEnd();\n}\n\nfunction onDragEnd() {\n if (_dropTarget) {\n const dropTarget =\n _dropTargetRenderer.hoverDropTarget ||\n DropTarget.getActiveDropTarget(_dropTarget);\n\n _dragEndCallback?.(dropTarget as DropTarget);\n\n _dropTarget = null;\n } else {\n _dragEndCallback?.();\n }\n\n _dragMoveCallback = null;\n _dragEndCallback = null;\n\n _dragContainer = undefined;\n _dropTargetRenderer.clear();\n _validDropTargetPaths = undefined;\n window.removeEventListener(\"mousemove\", dragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", dragMouseupHandler, false);\n window.removeEventListener(\"keydown\", dragKeydownHandler, false);\n}\n", "import classnames from \"classnames\";\nimport { ForwardedRef, forwardRef, HTMLAttributes } from \"react\";\nimport { registerComponent } from \"./registry/ComponentRegistry\";\n\nimport \"./DraggableLayout.css\";\n\nexport interface DraggableLayoutProps extends HTMLAttributes<HTMLDivElement> {\n dropTarget?: boolean;\n resizeable?: boolean;\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const DraggableLayout = forwardRef(function DraggableLayout(\n {\n children,\n className: classNameProp,\n dropTarget,\n resizeable: _, // ignore, its just a marker used by the layout system\n ...htmlAttributes\n }: DraggableLayoutProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const className = classnames(\"DraggableLayout\", classNameProp);\n return (\n <div className={className} ref={forwardedRef} {...htmlAttributes}>\n {children}\n </div>\n );\n});\n\nconst componentName = \"DraggableLayout\";\n\nDraggableLayout.displayName = componentName;\n\nregisterComponent(componentName, DraggableLayout, \"container\");\n", "import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { CSSProperties, ForwardedRef, forwardRef } from \"react\";\nimport { FlexboxProps } from \"./flexboxTypes\";\nimport { useSplitterResizing } from \"./useSplitterResizing\";\n\nimport \"./Flexbox.css\";\n\nconst classBase = \"hwFlexbox\";\n\nconst Flexbox = forwardRef(function Flexbox(\n props: FlexboxProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const {\n breakPoints,\n children,\n // cols: colsProp,\n column,\n className: classNameProp,\n flexFill,\n gap,\n fullPage,\n id,\n onSplitterMoved,\n resizeable,\n row,\n spacing,\n splitterSize,\n style,\n ...rest\n } = props;\n\n const { content, rootRef } = useSplitterResizing({\n children,\n // cols: colsProp,\n onSplitterMoved,\n style,\n });\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-column`]: column,\n [`${classBase}-row`]: row,\n \"flex-fill\": flexFill,\n \"full-page\": fullPage,\n });\n\n return (\n <div\n {...rest}\n className={className}\n // data-cols={cols}\n data-resizeable={resizeable || undefined}\n id={id}\n ref={useForkRef(rootRef, ref)}\n style={\n {\n ...style,\n gap,\n \"--spacing\": spacing,\n } as CSSProperties\n }\n >\n {content}\n </div>\n );\n});\nFlexbox.displayName = \"Flexbox\";\n\nexport default Flexbox;\n", "import { getUniqueId } from \"@vuu-ui/vuu-utils\";\nimport React, {\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Placeholder } from \"../placeholder\";\nimport { Splitter } from \"./Splitter\";\n\nimport {\n findSplitterAndPlaceholderPositions,\n gatherChildMeta,\n identifyResizeParties,\n PLACEHOLDER,\n SPLITTER,\n} from \"./flexbox-utils\";\nimport {\n ContentMeta,\n FlexSize,\n SplitterFactory,\n SplitterHookProps,\n SplitterHookResult,\n} from \"./flexboxTypes\";\n\nconst originalContentOnly = (meta: ContentMeta) =>\n !meta.splitter && !meta.placeholder;\n\nexport const useSplitterResizing = ({\n children: childrenProp,\n onSplitterMoved,\n style,\n}: SplitterHookProps): SplitterHookResult => {\n const rootRef = useRef<HTMLDivElement>(null);\n const metaRef = useRef<ContentMeta[]>();\n const contentRef = useRef<ReactElement[]>();\n const assignedKeys = useRef([]);\n const [, forceUpdate] = useState({});\n\n const setContent = (content: ReactElement[]) => {\n contentRef.current = content;\n forceUpdate({});\n };\n\n const isColumn = style?.flexDirection === \"column\";\n const dimension = isColumn ? \"height\" : \"width\";\n const children = useMemo(\n () =>\n Array.isArray(childrenProp)\n ? childrenProp\n : React.isValidElement(childrenProp)\n ? [childrenProp]\n : [],\n [childrenProp]\n );\n\n const handleDragStart = useCallback(\n (index) => {\n const { current: contentMeta } = metaRef;\n if (contentMeta) {\n const [participants, bystanders] = identifyResizeParties(\n contentMeta,\n index\n );\n if (participants) {\n participants.forEach((index) => {\n const el = rootRef.current?.childNodes[index] as HTMLElement;\n if (el) {\n const { size, minSize } = measureElement(el, dimension);\n contentMeta[index].currentSize = size;\n contentMeta[index].minSize = minSize;\n }\n });\n if (bystanders) {\n bystanders.forEach((index) => {\n const el = rootRef.current?.childNodes[index] as HTMLElement;\n if (el) {\n const { [dimension]: size } = el.getBoundingClientRect();\n contentMeta[index].flexBasis = size;\n }\n });\n }\n }\n }\n },\n [dimension]\n );\n\n const handleDrag = useCallback(\n (idx, distance) => {\n if (contentRef.current && metaRef.current) {\n setContent(\n resizeContent(\n contentRef.current,\n metaRef.current,\n distance,\n dimension\n )\n );\n }\n },\n [dimension]\n );\n\n const handleDragEnd = useCallback(() => {\n const contentMeta = metaRef.current;\n if (contentMeta) {\n onSplitterMoved?.(contentMeta.filter(originalContentOnly));\n }\n contentMeta?.forEach((meta) => {\n meta.currentSize = undefined;\n meta.flexBasis = undefined;\n meta.flexOpen = false;\n });\n }, [onSplitterMoved]);\n\n const createSplitter: SplitterFactory = useCallback(\n (i) => {\n return React.createElement(Splitter, {\n column: isColumn,\n index: i,\n key: `splitter-${i}`,\n onDrag: handleDrag,\n onDragEnd: handleDragEnd,\n onDragStart: handleDragStart,\n });\n },\n [handleDrag, handleDragEnd, handleDragStart, isColumn]\n );\n\n useMemo(() => {\n const [content, meta] = buildContent(\n children,\n dimension,\n createSplitter,\n assignedKeys.current\n );\n metaRef.current = meta;\n contentRef.current = content;\n }, [children, createSplitter, dimension]);\n\n return {\n content: contentRef.current || [],\n rootRef,\n };\n};\n\nfunction buildContent(\n children: ReactElement[],\n dimension: \"width\" | \"height\",\n createSplitter: SplitterFactory,\n keys: any[]\n): [any[], ContentMeta[]] {\n const childMeta = gatherChildMeta(children, dimension);\n const splitterAndPlaceholderPositions =\n findSplitterAndPlaceholderPositions(childMeta);\n const content = [];\n const meta: ContentMeta[] = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (i === 0 && splitterAndPlaceholderPositions[i] & PLACEHOLDER) {\n content.push(createPlaceholder(i));\n meta.push({ placeholder: true, shim: true });\n }\n if (child.key == null) {\n const key = keys[i] || (keys[i] = getUniqueId());\n content.push(React.cloneElement(child, { key }));\n } else {\n content.push(child);\n }\n meta.push(childMeta[i]);\n\n if (i > 0 && splitterAndPlaceholderPositions[i] & PLACEHOLDER) {\n content.push(createPlaceholder(i));\n meta.push({ placeholder: true });\n } else if (splitterAndPlaceholderPositions[i] & SPLITTER) {\n content.push(createSplitter(content.length));\n meta.push({ splitter: true });\n }\n }\n return [content, meta];\n}\n\nfunction resizeContent(\n content: ReactElement[],\n contentMeta: ContentMeta[],\n distance: number,\n dimension: \"width\" | \"height\"\n) {\n const metaUpdated = updateMeta(contentMeta, distance);\n if (!metaUpdated) {\n return content;\n }\n\n return content.map((child, idx) => {\n const meta = contentMeta[idx];\n const { currentSize, flexOpen, flexBasis } = meta;\n const hasCurrentSize = currentSize !== undefined;\n if (hasCurrentSize || flexOpen) {\n const { flexBasis: actualFlexBasis } = child.props.style || {};\n const size = hasCurrentSize ? meta.currentSize : flexBasis;\n if (size !== actualFlexBasis) {\n return React.cloneElement(child, {\n style: {\n ...child.props.style,\n flexBasis: size,\n [dimension]: \"auto\",\n },\n });\n } else {\n return child;\n }\n } else {\n return child;\n }\n });\n}\n\n//TODO detect cursor move beyond drag limit and suspend further resize until cursoe re-engages with splitter\nfunction updateMeta(contentMeta: ContentMeta[], distance: number) {\n const resizeTargets: number[] = [];\n\n contentMeta.forEach((meta, idx) => {\n if (meta.currentSize !== undefined) {\n resizeTargets.push(idx);\n }\n });\n\n // we want the target being reduced first, this may limit the distance we can apply\n const target1 = distance < 0 ? resizeTargets[0] : resizeTargets[1];\n\n const { currentSize = 0, minSize = 0 } = contentMeta[target1];\n if (currentSize === minSize) {\n // size is already 0, we cannot go further\n return false;\n } else if (Math.abs(distance) > currentSize - minSize) {\n // reduce to 0\n const multiplier = distance < 0 ? -1 : 1;\n distance = Math.max(0, currentSize - minSize) * multiplier;\n }\n\n const leadingItem = contentMeta[resizeTargets[0]] as ContentMeta;\n const { currentSize: leadingSize = 0 } = leadingItem;\n leadingItem.currentSize = leadingSize + distance;\n\n const trailingItem = contentMeta[resizeTargets[1]] as ContentMeta;\n const { currentSize: trailingSize = 0 } = trailingItem;\n trailingItem.currentSize = trailingSize - distance;\n\n return true;\n}\n\nfunction createPlaceholder(index: number) {\n return React.createElement(Placeholder, {\n shim: index === 0,\n key: `placeholder-${index}`,\n } as any);\n}\n\nfunction measureElement(\n el: HTMLElement,\n dimension: \"width\" | \"height\"\n): FlexSize {\n const { [dimension]: size } = el.getBoundingClientRect();\n const style = getComputedStyle(el);\n const minSizeVal = style.getPropertyValue(`min-${dimension}`);\n const minSize = minSizeVal.endsWith(\"px\") ? parseInt(minSizeVal, 10) : 0;\n return { size, minSize };\n}\n", "import cx from \"classnames\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { LayoutStartPanel } from \"./LayoutStartPanel\";\nimport { View, ViewProps } from \"@vuu-ui/vuu-layout\";\n\nimport \"./Placeholder.css\";\n\nconst classBase = \"vuuPlaceholder\";\n\nexport interface PlaceholderProps extends ViewProps {\n closeable?: boolean;\n flexFill?: boolean;\n resizeable?: boolean;\n showStartMenu?: boolean;\n /**\n * shim is only when we're dealing with intrinsically sized children, which is never\n * in an actual application. Intrinsic sizing is still experimental.\n */\n shim?: boolean;\n}\n\nconst PlaceholderCore = ({ showStartMenu = true }: PlaceholderProps) => {\n return <>{showStartMenu ? <LayoutStartPanel /> : null}</>;\n};\n\nexport const Placeholder = ({\n className: classNameProp,\n showStartMenu,\n ...viewProps\n}: PlaceholderProps) => {\n const className = cx(classBase, classNameProp);\n\n return (\n <View {...viewProps} className={className} data-placeholder resizeable>\n <PlaceholderCore showStartMenu={showStartMenu} />\n </View>\n );\n};\n\nPlaceholder.displayName = \"Placeholder\";\nregisterComponent(\"Placeholder\", Placeholder);\n", "import { Button } from \"@salt-ds/core\";\nimport { HTMLAttributes, useMemo, useState } from \"react\";\nimport { QueryReponse, useViewContext } from \"@vuu-ui/vuu-layout\";\n\nimport \"./LayoutStartPanel.css\";\n\nconst classBase = \"vuuLayoutStartPanel\";\n\nexport interface LayoutStartPanelProps extends HTMLAttributes<HTMLDivElement> {\n label?: string;\n}\n\nexport const LayoutStartPanel = (htmlAttributes: LayoutStartPanelProps) => {\n const { dispatch, path } = useViewContext();\n const [displayState, setDisplayState] = useState<\n \"initial\" | \"nested\" | undefined\n >();\n\n useMemo(() => {\n dispatch?.({\n type: \"query\",\n path,\n query: \"PARENT_CONTAINER\",\n }).then((response) => {\n if ((response as QueryReponse)?.parentContainerId === \"main-tabs\") {\n setDisplayState(\"initial\");\n } else {\n setDisplayState(\"nested\");\n }\n });\n }, [dispatch, path]);\n\n if (displayState === undefined) {\n return null;\n }\n\n const showInitialState = displayState === \"initial\";\n\n return (\n <div {...htmlAttributes} className={classBase}>\n {showInitialState ? (\n <>\n <header className={`${classBase}-title`}>\n Start by adding a table\n </header>\n <div className={`${classBase}-text`}>\n To add a table, drag any of the Vuu Tables to this area or click the\n button below\n </div>\n </>\n ) : null}\n <Button\n className={`${classBase}-addButton`}\n data-icon=\"add\"\n variant=\"cta\"\n />\n </div>\n );\n};\n", "import cx from \"classnames\";\nimport React, {\n HTMLAttributes,\n KeyboardEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport \"./Splitter.css\";\n\nconst classBase = \"vuuSplitter\";\n\nexport type SplitterDragStartHandler = (index: number) => void;\nexport type SplitterDragHandler = (index: number, distance: number) => void;\nexport type SplitterDragEndHandler = () => void;\n\nexport interface SplitterProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onDrag\" | \"onDragStart\"> {\n //TODO change to alignment (vertical | horizontal)\n column: boolean;\n index: number;\n onDragStart: SplitterDragStartHandler;\n onDrag: SplitterDragHandler;\n onDragEnd: SplitterDragEndHandler;\n}\n\nexport const Splitter = React.memo(function Splitter({\n column,\n index,\n onDrag,\n onDragEnd,\n onDragStart,\n style,\n}: SplitterProps) {\n const ignoreClick = useRef<boolean>();\n const rootRef = useRef<HTMLDivElement>(null);\n const lastPos = useRef<number>(0);\n\n const [active, setActive] = useState(false);\n\n const handleKeyDownDrag = useCallback(\n ({ key, shiftKey }) => {\n const distance = shiftKey ? 10 : 1;\n if (column && key === \"ArrowDown\") {\n onDrag(index, distance);\n } else if (column && key === \"ArrowUp\") {\n onDrag(index, -distance);\n } else if (!column && key === \"ArrowLeft\") {\n onDrag(index, -distance);\n } else if (!column && key === \"ArrowRight\") {\n onDrag(index, distance);\n }\n },\n [column, index, onDrag]\n );\n\n const handleKeyDownInitDrag = useCallback(\n (evt) => {\n const { key } = evt;\n const horizontalMove = key === \"ArrowLeft\" || key === \"ArrowRight\";\n const verticalMove = key === \"ArrowUp\" || key === \"ArrowDown\";\n if ((column && verticalMove) || (!column && horizontalMove)) {\n onDragStart(index);\n handleKeyDownDrag(evt);\n keyDownHandlerRef.current = handleKeyDownDrag;\n }\n },\n [column, handleKeyDownDrag, index, onDragStart]\n );\n\n const keyDownHandlerRef = useRef(handleKeyDownInitDrag);\n const handleKeyDown = (evt: KeyboardEvent) => keyDownHandlerRef.current(evt);\n\n const handleMouseMove = useCallback(\n (e) => {\n ignoreClick.current = true;\n const pos = e[column ? \"clientY\" : \"clientX\"];\n const diff = pos - lastPos.current;\n if (pos && pos !== lastPos.current) {\n onDrag(index, diff);\n }\n lastPos.current = pos;\n },\n [column, index, onDrag]\n );\n\n const handleMouseUp = useCallback(() => {\n window.removeEventListener(\"mousemove\", handleMouseMove, false);\n window.removeEventListener(\"mouseup\", handleMouseUp, false);\n onDragEnd();\n setActive(false);\n rootRef.current?.focus();\n }, [handleMouseMove, onDragEnd, setActive]);\n\n const handleMouseDown = useCallback(\n (e) => {\n lastPos.current = column ? e.clientY : e.clientX;\n onDragStart(index);\n window.addEventListener(\"mousemove\", handleMouseMove, false);\n window.addEventListener(\"mouseup\", handleMouseUp, false);\n e.preventDefault();\n setActive(true);\n },\n [column, handleMouseMove, handleMouseUp, index, onDragStart, setActive]\n );\n\n const handleClick = () => {\n if (ignoreClick.current) {\n ignoreClick.current = false;\n } else {\n rootRef.current?.focus();\n }\n };\n\n const handleBlur = () => {\n keyDownHandlerRef.current = handleKeyDownInitDrag;\n };\n\n const className = cx(classBase, {\n [`${classBase}-active`]: active,\n [`${classBase}-column`]: column,\n });\n return (\n <div\n className={className}\n data-splitter\n ref={rootRef}\n role=\"separator\"\n style={style}\n onBlur={handleBlur}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n tabIndex={0}\n >\n <div className={`${classBase}-grab-zone`} />\n </div>\n );\n});\n", "import { dimension, rect, rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { getProps, resetPath } from \"../utils\";\nconst placeHolderProps = { \"data-placeholder\": true, \"data-resizeable\": true };\n\nconst NO_STYLE = {};\nconst auto = \"auto\";\nconst defaultFlexStyle = {\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n height: auto,\n width: auto,\n};\n\nconst CROSS_DIMENSION = {\n height: \"width\",\n width: \"height\",\n};\n\nexport type flexDirection = \"row\" | \"column\";\n\ntype contraDimension = dimension;\ntype flexDimensionTuple = [dimension, contraDimension, flexDirection];\nexport type position = {\n height?: number;\n width?: number;\n};\n\nexport const getFlexDimensions = (flexDirection: flexDirection = \"row\") => {\n if (flexDirection === \"row\") {\n return [\"width\", \"height\", \"column\"] as flexDimensionTuple;\n } else {\n return [\"height\", \"width\", \"row\"] as flexDimensionTuple;\n }\n};\n\nconst isPercentageSize = (value: string | number) =>\n typeof value === \"string\" && value.endsWith(\"%\");\n\nexport const getIntrinsicSize = (\n component: ReactElement\n): { height?: number; width?: number } | undefined => {\n const { style: { width = auto, height = auto } = NO_STYLE } = component.props;\n\n const numHeight = typeof height === \"number\";\n const numWidth = typeof width === \"number\";\n\n if (numHeight && numWidth) {\n return { height, width };\n } else if (numHeight) {\n return { height };\n } else if (numWidth) {\n return { width };\n } else {\n return undefined;\n }\n};\n\nexport function getFlexStyle(\n component: ReactElement,\n dimension: dimension,\n pos?: DropPos\n) {\n const crossDimension = CROSS_DIMENSION[dimension];\n const {\n style: {\n [crossDimension]: intrinsicCrossSize = auto,\n ...intrinsicStyles\n } = NO_STYLE,\n } = component.props;\n\n if (pos && pos[dimension]) {\n return {\n ...intrinsicStyles,\n ...defaultFlexStyle,\n flexBasis: pos[dimension],\n flexGrow: 0,\n flexShrink: 0,\n };\n } else {\n return {\n ...intrinsicStyles,\n ...defaultFlexStyle,\n [crossDimension]: intrinsicCrossSize,\n };\n }\n}\n\nexport function hasUnboundedFlexStyle(component: ReactElement) {\n const { style: { flex, flexGrow, flexShrink, flexBasis } = NO_STYLE } =\n component.props;\n if (typeof flex === \"number\") {\n return true;\n }\n if (flexBasis === 0 && flexGrow === 1 && flexShrink === 1) {\n return true;\n }\n if (typeof flexBasis === \"number\") {\n return false;\n }\n return true;\n}\n\nexport function getFlexOrIntrinsicStyle(\n component: ReactElement,\n dimension: dimension,\n pos: position\n) {\n const crossDimension = CROSS_DIMENSION[dimension];\n const {\n style: {\n [dimension]: intrinsicSize = auto,\n [crossDimension]: intrinsicCrossSize = auto,\n ...intrinsicStyles\n } = NO_STYLE,\n } = component.props;\n\n if (intrinsicSize !== auto) {\n if (isPercentageSize(intrinsicSize)) {\n return {\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n [dimension]: undefined,\n [crossDimension]: intrinsicCrossSize,\n };\n }\n return {\n flexBasis: intrinsicSize,\n flexGrow: 0,\n flexShrink: 0,\n [dimension]: intrinsicSize,\n [crossDimension]: intrinsicCrossSize,\n };\n }\n if (pos && pos[dimension]) {\n return {\n ...intrinsicStyles,\n ...defaultFlexStyle,\n flexBasis: pos[dimension],\n flexGrow: 0,\n flexShrink: 0,\n };\n }\n return {\n ...intrinsicStyles,\n [crossDimension]: intrinsicCrossSize,\n };\n}\n\nexport function wrapIntrinsicSizeComponentWithFlexbox(\n component: ReactElement,\n flexDirection: flexDirection,\n path: string,\n clientRect?: rect,\n dropRect?: rectTuple\n) {\n const wrappedChildren = [];\n let pathIndex = 0;\n let endPlaceholder;\n\n if (clientRect && dropRect) {\n let startPlaceholder;\n const [dropLeft, dropTop, dropRight, dropBottom] = dropRect;\n [startPlaceholder, endPlaceholder] =\n flexDirection === \"column\"\n ? [dropTop - clientRect.top, clientRect.bottom - dropBottom]\n : [dropLeft - clientRect.left, clientRect.right - dropRight];\n\n if (startPlaceholder) {\n wrappedChildren.push(\n createPlaceHolder(`${path}.${pathIndex++}`, startPlaceholder, {\n flexGrow: 0,\n flexShrink: 0,\n })\n );\n }\n } else {\n endPlaceholder = true;\n }\n\n const { version = 0, style } = getProps(component);\n\n wrappedChildren.push(\n resetPath(component, `${path}.${pathIndex++}`, {\n version: version + 1,\n style: {\n ...style,\n flexBasis: \"auto\",\n flexGrow: 0,\n flexShrink: 0,\n },\n })\n );\n\n if (endPlaceholder) {\n wrappedChildren.push(\n createPlaceHolder(`${path}.${pathIndex++}`, 0, undefined, {\n [`data-${flexDirection}-placeholder`]: true,\n })\n );\n }\n\n return createFlexbox(\n flexDirection,\n { resizeable: false, style: { flexBasis: \"auto\" } },\n wrappedChildren,\n path\n );\n}\n\nconst getFlexValue = (\n flexBasis: number,\n flexFill: boolean\n): number | undefined => {\n if (flexFill) {\n return undefined;\n }\n return flexBasis === 0 ? 1 : 0;\n};\n\nexport function createFlexbox(\n flexDirection: flexDirection,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: any,\n children: ReactNode,\n path: string\n) {\n const id = uuid();\n const { flexFill, style, resizeable = true } = props;\n const { flexBasis = flexFill ? undefined : \"auto\" } = style;\n const flex = getFlexValue(flexBasis, flexFill);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return React.createElement<any>(\n ComponentRegistry.Flexbox,\n {\n id,\n key: id,\n path,\n flexFill,\n style: {\n ...style,\n flexDirection,\n flexBasis,\n flexGrow: flex,\n flexShrink: flex,\n },\n resizeable,\n },\n children\n );\n}\n\nconst baseStyle = { flexGrow: 1, flexShrink: 1 };\n\nexport function createPlaceHolder(\n path: string,\n size: number,\n style?: CSSProperties,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props?: any\n) {\n const id = uuid();\n return React.createElement(\"div\", {\n ...placeHolderProps,\n ...props,\n \"data-path\": path,\n id,\n key: id,\n style: { ...baseStyle, ...style, flexBasis: size },\n });\n}\n", "import { ReactElement } from \"react\";\nimport {\n getIntrinsicSize,\n hasUnboundedFlexStyle,\n} from \"../layout-reducer/flexUtils\";\nimport { getProp } from \"../utils\";\nimport type { BreakPoint, ContentMeta } from \"./flexboxTypes\";\n\nconst NO_INTRINSIC_SIZE: {\n height?: number;\n width?: number;\n} = {};\n\nexport const SPLITTER = 1;\nexport const PLACEHOLDER = 2;\n\nconst isIntrinsicallySized = (item: ContentMeta) =>\n typeof item.intrinsicSize === \"number\";\n\nconst getBreakPointValues = (\n breakPoints: BreakPoint[],\n component: ReactElement\n) => {\n const values: { [key: string]: number | undefined } = {};\n breakPoints.forEach((breakPoint) => {\n values[breakPoint] = getProp(component, breakPoint);\n });\n return values;\n};\n\nexport const gatherChildMeta = (\n children: ReactElement[],\n dimension: \"width\" | \"height\",\n breakPoints?: BreakPoint[]\n) => {\n return children.map((child, index) => {\n const resizeable = getProp(child, \"resizeable\");\n const { [dimension]: intrinsicSize } =\n getIntrinsicSize(child) ?? NO_INTRINSIC_SIZE;\n const flexOpen = hasUnboundedFlexStyle(child);\n if (breakPoints) {\n return {\n index,\n flexOpen,\n intrinsicSize,\n resizeable,\n ...getBreakPointValues(breakPoints, child),\n };\n } else {\n return { index, flexOpen, intrinsicSize, resizeable };\n }\n });\n};\n\n// Splitters are inserted AFTER the associated index, so\n// never a splitter in last position.\n// Placeholder goes before (first) OR after(last) index\nexport const findSplitterAndPlaceholderPositions = (\n childMeta: ContentMeta[]\n) => {\n const count = childMeta.length;\n const allIntrinsic = childMeta.every(isIntrinsicallySized);\n const splitterPositions = Array(count).fill(0);\n if (allIntrinsic && count > 0) {\n splitterPositions[0] = PLACEHOLDER;\n splitterPositions[count - 1] = PLACEHOLDER;\n }\n if (count < 2) {\n return splitterPositions;\n } else {\n // 1) From the left, check each item.\n // Once we hit a resizable item, set this index and all subsequent indices,\n // except for last, to SPLITTER\n for (let i = 0, resizeablesLeft = 0; i < count - 1; i++) {\n if (childMeta[i].resizeable && !resizeablesLeft) {\n resizeablesLeft = SPLITTER;\n }\n splitterPositions[i] += resizeablesLeft;\n }\n // 2) Now check from the right. Undo splitter insertion until we reach a point\n // where there is a resizeable to our right.\n for (let i = count - 1; i > 0; i--) {\n if (splitterPositions[i] & SPLITTER) {\n splitterPositions[i] -= SPLITTER;\n }\n if (childMeta[i].resizeable) {\n break;\n }\n }\n return splitterPositions;\n }\n};\n\nexport const identifyResizeParties = (\n contentMeta: ContentMeta[],\n idx: number\n) => {\n const idx1 = getLeadingResizeablePos(contentMeta, idx);\n const idx2 = getTrailingResizeablePos(contentMeta, idx);\n const participants = idx1 !== -1 && idx2 !== -1 ? [idx1, idx2] : undefined;\n const bystanders = identifyResizeBystanders(contentMeta, participants);\n return [participants, bystanders];\n};\n\nfunction identifyResizeBystanders(\n contentMeta: ContentMeta[],\n participants?: number[]\n) {\n if (participants) {\n const bystanders = [];\n for (let i = 0; i < contentMeta.length; i++) {\n if (contentMeta[i].flexOpen && !participants.includes(i)) {\n bystanders.push(i);\n }\n }\n return bystanders;\n }\n}\n\nfunction getLeadingResizeablePos(contentMeta: ContentMeta[], idx: number) {\n let pos = idx,\n resizeable = false;\n while (pos >= 1 && !resizeable) {\n pos = pos - 1;\n resizeable = isResizeable(contentMeta, pos);\n }\n return pos;\n}\n\nfunction getTrailingResizeablePos(contentMeta: ContentMeta[], idx: number) {\n let pos = idx,\n resizeable = false;\n const count = contentMeta.length;\n while (pos < count - 1 && !resizeable) {\n pos = pos + 1;\n resizeable = isResizeable(contentMeta, pos);\n }\n return pos === count ? -1 : pos;\n}\n\nfunction isResizeable(contentMeta: ContentMeta[], idx: number): boolean {\n const { placeholder, splitter, resizeable, intrinsicSize } = contentMeta[idx];\n return Boolean(!splitter && !intrinsicSize && (placeholder || resizeable));\n}\n", "import { useCallback } from \"react\";\nimport { Action } from \"../layout-action\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { SplitterResizeAction } from \"../layout-reducer\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport Flexbox from \"./Flexbox\";\nimport { FlexboxLayoutProps } from \"./flexboxTypes\";\n\nexport const FlexboxLayout = function FlexboxLayout(props: FlexboxLayoutProps) {\n const { path } = props;\n const dispatch = useLayoutProviderDispatch();\n\n const handleSplitterMoved = useCallback(\n (sizes) => {\n dispatch({\n type: Action.SPLITTER_RESIZE,\n path,\n sizes,\n } as SplitterResizeAction);\n },\n [dispatch, path]\n );\n\n return <Flexbox {...props} onSplitterMoved={handleSplitterMoved} />;\n};\nFlexboxLayout.displayName = \"Flexbox\";\n\nregisterComponent(\"Flexbox\", FlexboxLayout, \"container\");\n", "export const Action = {\n ADD: \"add\",\n BLUR: \"blur\",\n BLUR_SPLITTER: \"blur-splitter\",\n DRAG_START: \"drag-start\",\n DRAG_STARTED: \"drag-started\",\n DRAG_DROP: \"drag-drop\",\n FOCUS: \"focus\",\n FOCUS_SPLITTER: \"focus-splitter\",\n INITIALIZE: \"initialize\",\n LAYOUT_RESIZE: \"layout-resize\",\n MAXIMIZE: \"maximize\",\n MINIMIZE: \"minimize\",\n REMOVE: \"remove\",\n REPLACE: \"replace\",\n RESTORE: \"restore\",\n SAVE: \"save\",\n SET_TITLE: \"set-title\",\n SPLITTER_RESIZE: \"splitter-resize\",\n SWITCH_TAB: \"switch-tab\",\n TEAR_OUT: \"tear-out\",\n};\n", "import {\n MutableRefObject,\n ReactElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n LayoutActionType,\n LayoutChangeHandler,\n LayoutChangeReason,\n layoutFromJson,\n LayoutJSON,\n layoutQuery,\n layoutReducer,\n LayoutReducerAction,\n layoutToJSON,\n processLayoutElement,\n SaveAction,\n} from \"../layout-reducer\";\nimport { findTarget, getChildProp, getProp, getProps, typeOf } from \"../utils\";\nimport {\n LayoutProviderContext,\n LayoutProviderDispatch,\n} from \"./LayoutProviderContext\";\nimport { useLayoutDragDrop } from \"./useLayoutDragDrop\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst withDropTarget = (props: any) => props.dropTarget;\nconst shouldSave = (action: LayoutReducerAction) =>\n [\n \"drag-drop\",\n \"remove\",\n \"set-title\",\n \"splitter-resize\",\n \"switch-tab\",\n ].includes(action.type);\n\nconst getLayoutChangeReason = (\n action: LayoutReducerAction | SaveAction\n): LayoutChangeReason => {\n switch (action.type) {\n case \"switch-tab\":\n // TODO how can we make this more robust, shouldn't rely on 'main-tabs'\n if (action.id === \"main-tabs\") {\n return \"switch-active-layout\";\n } else {\n return \"switch-active-tab\";\n }\n case \"save\":\n return \"save-feature-props\";\n case \"drag-drop\":\n return \"drag-drop-operation\";\n case \"remove\":\n return \"remove-component\";\n case \"splitter-resize\":\n return \"resize-component\";\n case \"set-title\":\n return \"edit-feature-title\";\n default:\n throw Error(\"unknown layout action\");\n }\n};\n\nexport interface LayoutProviderProps {\n children: ReactElement;\n createNewChild?: (index?: number) => ReactElement;\n pathToDropTarget?: string;\n layout?: LayoutJSON;\n onLayoutChange?: LayoutChangeHandler;\n}\n\nexport const LayoutProviderVersion = () => {\n const version = useLayoutProviderVersion();\n return <div>{`Context: ${version} `}</div>;\n};\n\nexport const LayoutProvider = (props: LayoutProviderProps): ReactElement => {\n const { children, createNewChild, pathToDropTarget, layout, onLayoutChange } =\n props;\n const state = useRef<ReactElement | undefined>(undefined);\n const childrenRef = useRef<ReactElement>(children);\n\n const [, forceRefresh] = useState<unknown>(null);\n\n const serializeState = useCallback(\n (source, layoutChangeReason: LayoutChangeReason) => {\n if (onLayoutChange) {\n const targetContainer =\n findTarget(source, withDropTarget) || state.current;\n const isDraggableLayout = typeOf(targetContainer) === \"DraggableLayout\";\n const target = isDraggableLayout\n ? getProps(targetContainer).children[0]\n : targetContainer;\n const serializedModel = layoutToJSON(target);\n onLayoutChange(serializedModel, layoutChangeReason);\n }\n },\n [onLayoutChange]\n );\n\n const dispatchLayoutAction = useCallback(\n (action: LayoutReducerAction, suppressSave = false) => {\n const nextState = layoutReducer(state.current as ReactElement, action);\n if (nextState !== state.current) {\n state.current = nextState;\n forceRefresh({});\n if (!suppressSave && shouldSave(action)) {\n serializeState(nextState, getLayoutChangeReason(action));\n }\n }\n },\n [forceRefresh, serializeState]\n );\n\n const layoutActionDispatcher = useCallback<LayoutProviderDispatch>(\n (action) => {\n switch (action.type) {\n case \"drag-start\": {\n prepareToDragLayout(action);\n break;\n }\n case \"save\": {\n serializeState(state.current, getLayoutChangeReason(action));\n break;\n }\n case \"query\":\n if (action.query === \"PARENT_CONTAINER\") {\n return layoutQuery(action.query, action.path, state.current);\n }\n break;\n\n default: {\n dispatchLayoutAction(action);\n break;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatchLayoutAction, serializeState]\n );\n\n const prepareToDragLayout = useLayoutDragDrop(\n state as MutableRefObject<ReactElement>,\n layoutActionDispatcher,\n pathToDropTarget\n );\n\n useEffect(() => {\n if (layout) {\n const targetContainer = findTarget(\n state.current as never,\n withDropTarget\n ) as ReactElement;\n if (targetContainer) {\n const target = getChildProp(targetContainer);\n const newLayout = layoutFromJson(\n layout,\n `${targetContainer.props.path}.0`\n );\n const action = target\n ? {\n type: LayoutActionType.REPLACE,\n target,\n replacement: newLayout,\n }\n : {\n type: LayoutActionType.ADD,\n path: targetContainer.props.path,\n component: newLayout,\n };\n dispatchLayoutAction(action, true);\n } else if (layout.id === getProp(state.current, \"id\")) {\n const newLayout = layoutFromJson(layout, \"0\");\n const action = {\n type: LayoutActionType.REPLACE,\n target: state.current,\n replacement: newLayout,\n };\n dispatchLayoutAction(action, true);\n }\n }\n }, [dispatchLayoutAction, layout]);\n\n if (state.current === undefined) {\n state.current = processLayoutElement(children);\n } else if (children !== childrenRef.current) {\n state.current = processLayoutElement(children, state.current);\n childrenRef.current = children;\n }\n\n return (\n <LayoutProviderContext.Provider\n value={{\n createNewChild,\n dispatchLayoutProvider: layoutActionDispatcher,\n version: 0,\n }}\n >\n {state.current}\n </LayoutProviderContext.Provider>\n );\n};\n\nexport const useLayoutProviderDispatch = () => {\n const { dispatchLayoutProvider } = useContext(LayoutProviderContext);\n return dispatchLayoutProvider;\n};\n\nexport const useLayoutCreateNewChild = () => {\n const { createNewChild } = useContext(LayoutProviderContext);\n return createNewChild;\n};\n\nexport const useLayoutProviderVersion = () => {\n const { version } = useContext(LayoutProviderContext);\n return version;\n};\n", "import React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport {\n findTarget,\n followPath,\n followPathToParent,\n getProp,\n getProps,\n typeOf,\n} from \"../utils\";\nimport { getIntrinsicSize } from \"./flexUtils\";\nimport {\n getInsertTabBeforeAfter,\n insertBesideChild,\n insertIntoContainer,\n} from \"./insert-layout-element\";\nimport { moveChild } from \"./move-layout-element\";\nimport {\n AddAction,\n DragDropAction,\n LayoutActionType,\n LayoutReducerAction,\n MaximizeAction,\n SetPropAction,\n SetPropsAction,\n SwitchTabAction,\n} from \"./layoutTypes\";\nimport { LayoutProps } from \"./layoutUtils\";\nimport { removeChild } from \"./remove-layout-element\";\nimport {\n replaceChild,\n swapChild,\n _replaceChild,\n} from \"./replace-layout-element\";\nimport { resizeFlexChild, resizeFlexChildren } from \"./resize-flex-children\";\nimport { wrap } from \"./wrap-layout-element\";\n\nexport const layoutReducer = (\n state: ReactElement,\n action: LayoutReducerAction\n): ReactElement => {\n switch (action.type) {\n case LayoutActionType.ADD:\n return addChild(state, action);\n case LayoutActionType.DRAG_DROP:\n return dragDrop(state, action);\n case LayoutActionType.MAXIMIZE:\n return setChildProps(state, action);\n case LayoutActionType.REMOVE:\n return removeChild(state, action);\n case LayoutActionType.REPLACE:\n return replaceChild(state, action);\n case LayoutActionType.SET_PROP:\n return setProp(state, action);\n case LayoutActionType.SET_PROPS:\n return setProps(state, action);\n case LayoutActionType.SET_TITLE:\n return setProp(state, {\n type: \"set-prop\",\n path: action.path,\n propName: \"title\",\n propValue: action.title,\n });\n case LayoutActionType.SPLITTER_RESIZE:\n return resizeFlexChildren(state, action);\n case LayoutActionType.LAYOUT_RESIZE:\n return resizeFlexChild(state, action);\n case LayoutActionType.SWITCH_TAB:\n return switchTab(state, action);\n case LayoutActionType.MOVE_CHILD:\n return moveChild(state, action);\n default:\n return state;\n }\n};\n\nconst switchTab = (state: ReactElement, { path, nextIdx }: SwitchTabAction) => {\n const target = followPath(state, path, true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const replacement = React.cloneElement<any>(target, {\n active: nextIdx,\n });\n return swapChild(state, target, replacement);\n};\n\nconst setProp = (\n state: ReactElement,\n { path, propName, propValue }: SetPropAction\n) => {\n const target = followPath(state, path, true);\n const replacement = React.cloneElement(target, {\n [propName]: propValue,\n });\n return swapChild(state, target, replacement);\n};\n\nconst setProps = (state: ReactElement, { path, props }: SetPropsAction) => {\n const target = followPath(state, path, true);\n const replacement = React.cloneElement(target, props);\n return swapChild(state, target, replacement);\n};\n\nconst setChildProps = (state: ReactElement, { path, type }: MaximizeAction) => {\n if (path) {\n const target = followPath(state, path, true);\n return swapChild(state, target, target, type);\n } else {\n return state;\n }\n};\n\nconst dragDrop = (\n layoutRoot: ReactElement,\n action: DragDropAction\n): ReactElement => {\n const {\n draggedReactElement: newComponent,\n dragInstructions,\n dropTarget,\n } = action;\n const existingComponent = dropTarget.component as ReactElement;\n const { pos } = dropTarget;\n const destinationTabstrip =\n pos?.position?.Header && typeOf(existingComponent) === \"Stack\";\n const { id, version } = getProps(newComponent);\n const intrinsicSize = getIntrinsicSize(newComponent);\n let newLayoutRoot: ReactElement;\n if (destinationTabstrip) {\n const [targetTab, insertionPosition] = getInsertTabBeforeAfter(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n existingComponent!,\n pos\n );\n if (targetTab === undefined) {\n newLayoutRoot = insertIntoContainer(\n layoutRoot,\n existingComponent,\n newComponent\n );\n } else {\n newLayoutRoot = insertBesideChild(\n layoutRoot,\n targetTab,\n newComponent,\n insertionPosition\n );\n }\n } else if (!intrinsicSize && pos?.position?.Centre) {\n newLayoutRoot = _replaceChild(\n layoutRoot,\n existingComponent as ReactElement,\n newComponent\n );\n } else {\n newLayoutRoot = dropLayoutIntoContainer(\n layoutRoot,\n dropTarget as DropTarget,\n newComponent\n );\n }\n\n if (dragInstructions.DoNotRemove) {\n return newLayoutRoot;\n }\n\n const finalTarget = findTarget(\n newLayoutRoot,\n (props: LayoutProps) => props.id === id && props.version === version\n ) as ReactElement;\n const finalPath = getProp(finalTarget, \"path\");\n return removeChild(newLayoutRoot, { path: finalPath, type: \"remove\" });\n};\n\nconst addChild = (\n layoutRoot: ReactElement,\n { path: containerPath, component }: AddAction\n) => {\n return insertIntoContainer(\n layoutRoot,\n followPath(layoutRoot, containerPath) as ReactElement,\n component\n );\n};\n\nconst dropLayoutIntoContainer = (\n layoutRoot: ReactElement,\n dropTarget: DropTarget,\n newComponent: ReactElement\n): ReactElement => {\n const { component, pos, clientRect, dropRect } = dropTarget;\n const existingComponent = component as ReactElement;\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n\n if (existingComponentPath === \"0.0\") {\n return wrap(\n layoutRoot,\n existingComponent as ReactElement,\n newComponent,\n pos\n );\n }\n\n const targetContainer = followPathToParent(\n layoutRoot,\n existingComponentPath\n ) as ReactElement;\n\n if (withTheGrain(pos, targetContainer)) {\n const insertionPosition = pos.position.SouthOrEast ? \"after\" : \"before\";\n return insertBesideChild(\n layoutRoot,\n existingComponent,\n newComponent,\n insertionPosition,\n pos,\n clientRect,\n dropRect\n );\n }\n\n if (!withTheGrain(pos, targetContainer)) {\n return wrap(\n layoutRoot,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n );\n }\n\n if (isContainer(typeOf(targetContainer) as string)) {\n return wrap(layoutRoot, existingComponent, newComponent, pos);\n }\n\n throw Error(`no support right now for position = ${pos.position}`);\n};\n\nconst withTheGrain = (pos: DropPos, container: ReactElement) => {\n if (pos.position.Centre) {\n return isTerrace(container) || isTower(container);\n }\n\n return pos.position.NorthOrSouth\n ? isTower(container)\n : pos.position.EastOrWest\n ? isTerrace(container)\n : false;\n};\n\nconst isTower = (container: ReactElement) => {\n return (\n typeOf(container) === \"Flexbox\" &&\n container.props.style.flexDirection === \"column\"\n );\n};\n\nconst isTerrace = (container: ReactElement) => {\n return (\n typeOf(container) === \"Flexbox\" &&\n container.props.style.flexDirection !== \"column\"\n );\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { getProp, getProps, nextStep, resetPath, typeOf } from \"../utils\";\nimport {\n createPlaceHolder,\n flexDirection,\n getFlexDimensions,\n getFlexOrIntrinsicStyle,\n getIntrinsicSize,\n wrapIntrinsicSizeComponentWithFlexbox,\n} from \"./flexUtils\";\nimport { LayoutModel } from \"./layoutTypes\";\nimport {\n getDefaultTabLabel,\n getManagedDimension,\n LayoutProps,\n} from \"./layoutUtils\";\n\ntype insertionPosition = \"before\" | \"after\";\n\nexport function getInsertTabBeforeAfter(stack: LayoutModel, pos: DropPos) {\n const tabs = stack.props.children;\n const tabCount = tabs.length;\n const { index = -1, positionRelativeToTab = \"after\" } = pos.tab || {};\n return index === -1 || index >= tabCount\n ? [tabs[tabCount - 1], \"after\"]\n : [tabs[index] ?? null, positionRelativeToTab];\n}\n\nexport function insertIntoContainer(\n container: ReactElement,\n targetContainer: ReactElement,\n newComponent: ReactElement\n): ReactElement {\n const {\n active: containerActive,\n children: containerChildren = [],\n path: containerPath,\n } = getProps(container) as LayoutProps;\n\n const existingComponentPath = getProp(targetContainer, \"path\");\n const { idx, finalStep } = nextStep(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n containerPath!,\n existingComponentPath,\n true\n );\n const [insertedIdx, children] = finalStep\n ? insertIntoChildren(container, containerChildren, newComponent)\n : [\n containerActive,\n containerChildren?.map((child, index) =>\n index === idx\n ? (insertIntoContainer(\n child,\n targetContainer,\n newComponent\n ) as ReactElement)\n : child\n ),\n ];\n const active =\n typeOf(container) === \"Stack\"\n ? Array.isArray(insertedIdx)\n ? (insertedIdx[0] as number)\n : insertedIdx\n : containerActive;\n\n return React.cloneElement(container, { active }, children);\n}\n\nconst getDefaultTitle = (\n containerType: string | undefined,\n component: ReactElement,\n index: number,\n existingLabels: string[]\n) =>\n containerType === \"Stack\"\n ? getDefaultTabLabel(component, index, existingLabels)\n : undefined;\n\nconst getChildrenTitles = (children: ReactElement[]) =>\n children.map((child) => child.props.title);\n\nfunction insertIntoChildren(\n container: ReactElement,\n containerChildren: ReactElement[],\n newComponent: ReactElement\n): [number, ReactElement[]] {\n const containerPath = getProp(container, \"path\");\n const count = containerChildren?.length;\n const {\n id = uuid(),\n title = getDefaultTitle(\n typeOf(container),\n newComponent,\n count ?? 0,\n getChildrenTitles(containerChildren)\n ),\n } = getProps(newComponent);\n\n if (count) {\n return [\n count,\n containerChildren.concat(\n resetPath(newComponent, `${containerPath}.${count}`, {\n id,\n key: id,\n title,\n })\n ),\n ];\n } else {\n return [0, [resetPath(newComponent, `${containerPath}.0`, { id, title })]];\n }\n}\n\nexport function insertBesideChild(\n container: ReactElement,\n existingComponent: any,\n newComponent: any,\n insertionPosition: insertionPosition,\n pos?: DropPos,\n clientRect?: any,\n dropRect?: any\n): ReactElement {\n const {\n active: containerActive,\n children: containerChildren,\n path: containerPath,\n } = getProps(container);\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n const { idx, finalStep } = nextStep(containerPath, existingComponentPath);\n const [insertedIdx, children] = finalStep\n ? updateChildren(\n container,\n containerChildren,\n idx,\n newComponent,\n insertionPosition,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n pos!,\n clientRect,\n dropRect\n )\n : [\n containerActive,\n containerChildren.map((child: ReactElement, index: number) =>\n index === idx\n ? insertBesideChild(\n child,\n existingComponent,\n newComponent,\n insertionPosition,\n pos,\n clientRect,\n dropRect\n )\n : child\n ),\n ];\n\n const active = typeOf(container) === \"Stack\" ? insertedIdx : containerActive;\n return React.cloneElement(container, { active }, children);\n}\n\nfunction updateChildren(\n container: LayoutModel,\n containerChildren: ReactElement[],\n idx: number,\n newComponent: ReactElement,\n insertionPosition: insertionPosition,\n pos: DropPos,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: DropTarget[\"dropRect\"]\n) {\n const intrinsicSize = getIntrinsicSize(newComponent);\n if (intrinsicSize?.width && intrinsicSize?.height) {\n return insertIntrinsicSizedComponent(\n container,\n containerChildren,\n idx,\n newComponent,\n insertionPosition,\n clientRect,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n dropRect!\n );\n } else {\n return insertFlexComponent(\n container,\n containerChildren,\n idx,\n newComponent,\n insertionPosition,\n pos?.width || pos?.height,\n clientRect\n );\n }\n}\n\nconst getLeadingPlaceholderSize = (\n flexDirection: flexDirection,\n insertionPosition: insertionPosition,\n { top, right, bottom, left }: DropTarget[\"clientRect\"],\n [rectLeft, rectTop, rectRight, rectBottom]: rectTuple\n) => {\n if (flexDirection === \"column\" && insertionPosition === \"before\") {\n return rectTop - top;\n } else if (flexDirection === \"column\") {\n return bottom - rectBottom;\n } else if (flexDirection === \"row\" && insertionPosition === \"before\") {\n return rectLeft - left;\n } else if (flexDirection === \"row\") {\n return right - rectRight;\n }\n};\n\nfunction insertIntrinsicSizedComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n idx: number,\n newComponent: ReactElement,\n insertionPosition: insertionPosition,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: rectTuple\n) {\n const {\n style: { flexDirection },\n } = getProps(container);\n const [dimension, crossDimension, contraDirection] =\n getFlexDimensions(flexDirection);\n const { [crossDimension]: intrinsicCrossSize, [dimension]: intrinsicSize } =\n getIntrinsicSize(newComponent) as { height: number; width: number };\n const path = getProp(containerChildren[idx], \"path\");\n\n const placeholderSize = getLeadingPlaceholderSize(\n flexDirection,\n insertionPosition,\n clientRect,\n dropRect\n );\n\n const [itemToInsert, size] =\n intrinsicCrossSize < clientRect[crossDimension]\n ? [\n wrapIntrinsicSizeComponentWithFlexbox(\n newComponent,\n contraDirection,\n path,\n clientRect,\n dropRect\n ),\n intrinsicSize,\n ]\n : [newComponent, undefined];\n\n const placeholder = placeholderSize\n ? createPlaceHolder(path, placeholderSize, { flexGrow: 0, flexShrink: 0 })\n : undefined;\n\n if (intrinsicCrossSize > clientRect[crossDimension]) {\n containerChildren = containerChildren.map((child) => {\n if (getProp(child, \"placeholder\")) {\n return child;\n } else {\n const { [crossDimension]: intrinsicCrossChildSize } = getIntrinsicSize(\n child\n ) as {\n height: number;\n width: number;\n };\n if (\n intrinsicCrossChildSize &&\n intrinsicCrossChildSize < intrinsicCrossSize\n ) {\n return wrapIntrinsicSizeComponentWithFlexbox(\n child,\n contraDirection,\n getProp(child, \"path\")\n );\n } else {\n return child;\n }\n }\n });\n }\n\n return insertFlexComponent(\n container,\n containerChildren,\n idx,\n itemToInsert,\n insertionPosition,\n size,\n clientRect,\n placeholder\n );\n}\n\nfunction insertFlexComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n idx: number,\n newComponent: ReactElement,\n insertionPosition: \"before\" | \"after\",\n size: number | undefined,\n targetRect: DropTarget[\"clientRect\"],\n placeholder?: ReactElement\n) {\n const containerPath = getProp(container, \"path\");\n let insertedIdx = 0;\n const children =\n !containerChildren || containerChildren.length === 0\n ? [newComponent]\n : containerChildren\n .reduce<ReactElement[]>((arr, child, i) => {\n if (idx === i) {\n const [existingComponent, insertedComponent] =\n getStyledComponents(container, child, newComponent, targetRect);\n if (insertionPosition === \"before\") {\n if (placeholder) {\n arr.push(placeholder, insertedComponent, existingComponent);\n } else {\n arr.push(insertedComponent, existingComponent);\n }\n } else {\n if (placeholder) {\n arr.push(existingComponent, insertedComponent, placeholder);\n } else {\n arr.push(existingComponent, insertedComponent);\n }\n }\n insertedIdx = arr.indexOf(insertedComponent);\n } else {\n arr.push(child);\n }\n return arr;\n }, [])\n .map((child, i) =>\n i < insertedIdx ? child : resetPath(child, `${containerPath}.${i}`)\n );\n\n return [insertedIdx, children];\n}\n\nfunction getStyledComponents(\n container: LayoutModel,\n existingComponent: ReactElement,\n newComponent: ReactElement,\n targetRect: DropTarget[\"clientRect\"]\n): [ReactElement, ReactElement] {\n const id = uuid();\n let { version = 0 } = getProps(newComponent);\n version += 1;\n if (typeOf(container) === \"Flexbox\") {\n const [dim] = getManagedDimension(container.props.style);\n const splitterSize = 6;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const size = { [dim]: (targetRect[dim] - splitterSize) / 2 };\n const existingComponentStyle = getFlexOrIntrinsicStyle(\n existingComponent,\n dim,\n size\n );\n const newComponentStyle = getFlexOrIntrinsicStyle(newComponent, dim, size);\n\n return [\n React.cloneElement(existingComponent, {\n style: existingComponentStyle,\n }),\n React.cloneElement(newComponent, {\n id,\n version,\n style: newComponentStyle,\n }),\n ];\n } else {\n const {\n style: { left: _1, top: _2, flex: _3, ...style } = {\n left: undefined,\n top: undefined,\n flex: undefined,\n },\n } = getProps(newComponent);\n return [\n existingComponent,\n React.cloneElement(newComponent, {\n id,\n version,\n style: { ...style, flex: \"1 1 0px\" },\n }),\n ];\n }\n}\n", "import { dimension, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { cloneElement, CSSProperties, ReactElement } from \"react\";\nimport {\n ComponentWithId,\n ComponentRegistry,\n isContainer,\n isLayoutComponent,\n} from \"../registry/ComponentRegistry\";\nimport { TabLabelFactory } from \"../stack\";\nimport {\n getPersistentState,\n hasPersistentState,\n setPersistentState,\n} from \"../use-persistent-state\";\nimport { expandFlex, followPathToParent, getProps, typeOf } from \"../utils\";\nimport { LayoutJSON, LayoutModel, layoutType } from \"./layoutTypes\";\n\nexport const getManagedDimension = (\n style: CSSProperties\n): [dimension, dimension] =>\n style.flexDirection === \"column\" ? [\"height\", \"width\"] : [\"width\", \"height\"];\n\nconst theKidHasNoStyle: CSSProperties = {};\n\nexport const applyLayoutProps = (component: ReactElement, path = \"0\") => {\n const [layoutProps, children] = getChildLayoutProps(\n typeOf(component) as string,\n component.props,\n path\n );\n return React.cloneElement(component, layoutProps, children);\n};\n\nexport interface LayoutProps extends ComponentWithId {\n active?: number;\n \"data-path\"?: string;\n children?: ReactElement[];\n column?: any;\n dropTarget?: any;\n key: string;\n layout?: any;\n path?: string;\n resizeable?: boolean;\n style: CSSProperties;\n type?: string;\n version?: number;\n}\n\n/**\n * parse the declarative JSX and clone adding layout attributes\n */\nexport const processLayoutElement = (\n layoutElement: ReactElement,\n previousLayout?: ReactElement\n): ReactElement => {\n const type = typeOf(layoutElement) as string;\n const [layoutProps, children] = getChildLayoutProps(\n type,\n layoutElement.props,\n \"0\",\n undefined,\n previousLayout\n );\n return cloneElement(layoutElement, layoutProps, children);\n};\n\nexport const applyLayout = (\n type: layoutType,\n props: LayoutProps,\n previousLayout?: LayoutModel\n): LayoutModel => {\n const [layoutProps, children] = getChildLayoutProps(\n type,\n props,\n \"0\",\n undefined,\n previousLayout\n );\n return {\n ...props,\n ...layoutProps,\n type,\n children,\n };\n};\n\nfunction getLayoutProps(\n type: string,\n props: LayoutProps,\n path = \"0\",\n parentType: string | null = null,\n previousLayout?: LayoutModel\n): LayoutProps {\n const {\n active: prevActive = 0,\n \"data-path\": dataPath,\n path: prevPath = dataPath,\n id: prevId,\n style: prevStyle,\n } = getProps(previousLayout);\n\n const prevMatch = typeOf(previousLayout) === type && path === prevPath;\n const id = prevMatch ? prevId : props.id ?? uuid();\n const active = type === \"Stack\" ? props.active ?? prevActive : undefined;\n\n const key = id;\n const style = prevMatch ? prevStyle : getStyle(type, props, parentType);\n return isLayoutComponent(type)\n ? { id, key, path, style, type, active }\n : { id, key, style, \"data-path\": path };\n}\n\nfunction getChildLayoutProps(\n type: string,\n props: LayoutProps,\n path: string,\n parentType: string | null = null,\n previousLayout?: LayoutModel\n): [LayoutProps, ReactElement[]] {\n const layoutProps = getLayoutProps(\n type,\n props,\n path,\n parentType,\n previousLayout\n );\n\n if (props.layout && !previousLayout) {\n return [layoutProps, [layoutFromJson(props.layout, `${path}.0`)]];\n }\n\n const previousChildren =\n (previousLayout as any)?.children ?? previousLayout?.props?.children;\n const hasDynamicChildren = props.dropTarget && previousChildren;\n const children = hasDynamicChildren\n ? previousChildren\n : getLayoutChildren(type, props.children, path, previousChildren);\n return [layoutProps, children];\n}\n\nfunction getLayoutChildren(\n type: string,\n children?: ReactElement[],\n path = \"0\",\n previousChildren?: ReactElement[]\n) {\n const kids = Array.isArray(children)\n ? children\n : React.isValidElement(children)\n ? [children]\n : [];\n return isContainer(type)\n ? kids.map((child, i) => {\n const childType = typeOf(child) as string;\n const previousType = typeOf(previousChildren?.[i]);\n\n if (!previousType || childType === previousType) {\n const [layoutProps, children] = getChildLayoutProps(\n childType,\n child.props,\n `${path}.${i}`,\n type,\n previousChildren?.[i]\n );\n return React.cloneElement(child, layoutProps, children);\n }\n\n return previousChildren?.[i];\n })\n : children;\n}\n\nconst getStyle = (\n type: string,\n props: LayoutProps,\n parentType?: string | null\n) => {\n let { style = theKidHasNoStyle } = props;\n if (type === \"Flexbox\") {\n style = {\n flexDirection: props.column ? \"column\" : \"row\",\n ...style,\n display: \"flex\",\n };\n }\n\n if (style.flex) {\n const { flex, ...otherStyles } = style;\n style = {\n ...otherStyles,\n ...expandFlex(typeof flex === \"number\" ? flex : 0),\n };\n } else if (parentType === \"Stack\") {\n style = {\n ...style,\n ...expandFlex(1),\n };\n } else if (\n parentType === \"Flexbox\" &&\n (style.width || style.height) &&\n style.flexBasis === undefined\n ) {\n style = {\n ...style,\n flexBasis: \"auto\",\n flexGrow: 0,\n flexShrink: 0,\n };\n }\n\n return style;\n};\n\nexport function layoutFromJson(\n { id = uuid(), type, children, props, state }: LayoutJSON,\n path: string\n): ReactElement {\n const componentType = type.match(/^[a-z]/) ? type : ComponentRegistry[type];\n\n if (componentType === undefined) {\n throw Error(\n `layoutUtils unable to create component from JSON, unknown type ${type}`\n );\n }\n\n if (state) {\n setPersistentState(id, state);\n }\n\n return React.createElement(\n componentType,\n {\n id,\n ...props,\n key: id,\n path,\n },\n children\n ? children.map((child, i) => layoutFromJson(child, `${path}.${i}`))\n : undefined\n );\n}\n\nexport function layoutToJSON(component: ReactElement) {\n return componentToJson(component);\n}\n\nexport function componentToJson(component: ReactElement): LayoutJSON {\n const type = typeOf(component) as string;\n const { id, children, type: _omit, ...props } = getProps(component);\n\n const state = hasPersistentState(id) ? getPersistentState(id) : undefined;\n\n return {\n id,\n type,\n props: serializeProps(props as LayoutProps),\n state,\n children: React.Children.map(children, componentToJson),\n };\n}\n\nexport function serializeProps(props?: LayoutProps) {\n if (props) {\n const { path, ...otherProps } = props;\n const result: { [key: string]: any } = {};\n for (const [key, value] of Object.entries(otherProps)) {\n result[key] = serializeValue(value);\n }\n return result;\n }\n}\n\nfunction serializeValue(value: unknown): any {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n } else if (Array.isArray(value)) {\n return value.map(serializeValue);\n } else if (typeof value === \"object\" && value !== null) {\n const result: { [key: string]: any } = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = serializeValue(v);\n }\n return result;\n }\n}\n\n// This is experimental and the only query we support to start off with is\n// PARENT_CONTAINER\nexport type LayoutQuery = \"PARENT_CONTAINER\";\n\nexport const layoutQuery = (\n query: LayoutQuery,\n path?: string,\n layoutRoot?: ReactElement\n) => {\n if (path && layoutRoot) {\n const parentElement = followPathToParent(layoutRoot, path);\n if (parentElement) {\n const { id: parentContainerId } = getProps(parentElement);\n const parentContainerType = typeOf(parentElement);\n return {\n parentContainerId,\n parentContainerType,\n };\n }\n return {\n parentContainerType: \"Stack\",\n parentContainerId: \"blah\",\n };\n }\n};\n\nexport const getDefaultTabLabel: TabLabelFactory = (\n component,\n tabIndex,\n existingLabels = []\n): string => {\n let label = component.props?.title ?? component.props?.[\"data-tab-title\"];\n if (label) {\n return label;\n } else {\n let count = tabIndex;\n do {\n label = `Tab ${++count}`;\n } while (existingLabels.includes(label));\n return label;\n }\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback } from \"react\";\n\n/**\n * Persistent state is stored at module level (i.e singleton-style)\n * It is kept at this level, rather than passed to the target component(s)\n * so that it endures across the unmount/mount lifecycle journey of any\n * individual component. e.g when switching between tabs, components are\n * unmounted and mounted. They re-request their persistent state on re-mount.\n * Persistent state is populated as the serialized layout schema is processed\n * (see layoutFromJSON).\n */\nconst persistentState = new Map<string, any>();\nconst sessionState = new Map<string, any>();\n\nexport const getPersistentState = (id: string) => persistentState.get(id);\nexport const hasPersistentState = (id: string) => persistentState.has(id);\nexport const setPersistentState = (id: string, value: any) =>\n persistentState.set(id, value);\n\nexport const usePersistentState = () => {\n const loadSessionState = useCallback((id, key) => {\n const state = sessionState.get(id);\n if (state) {\n if (key !== undefined && state[key] !== undefined) {\n return state[key];\n }\n if (key !== undefined) {\n return undefined;\n }\n return state;\n }\n }, []);\n\n const saveSessionState = useCallback((id, key, data) => {\n if (key === undefined) {\n sessionState.set(id, data);\n } else if (sessionState.has(id)) {\n const state = sessionState.get(id);\n sessionState.set(id, {\n ...state,\n [key]: data,\n });\n } else {\n sessionState.set(id, { [key]: data });\n }\n }, []);\n\n const purgeSessionState = useCallback((id: string, key?: string) => {\n if (sessionState.has(id)) {\n if (key === undefined) {\n sessionState.delete(id);\n } else {\n const state = sessionState.get(id);\n if (state[key]) {\n const { [key]: _doomedState, ...rest } = sessionState.get(id);\n if (Object.keys(rest).length > 0) {\n sessionState.set(id, rest);\n } else {\n sessionState.delete(id);\n }\n }\n }\n }\n }, []);\n\n const loadState = useCallback((id: string, key?: string) => {\n const state = persistentState.get(id);\n if (state) {\n if (key !== undefined) {\n return state[key];\n }\n return state;\n }\n }, []);\n\n const saveState = useCallback(\n (id: string, key: string | undefined, data: unknown) => {\n if (key === undefined) {\n persistentState.set(id, data);\n } else if (persistentState.has(id)) {\n const state = persistentState.get(id);\n persistentState.set(id, {\n ...state,\n [key]: data,\n });\n } else {\n persistentState.set(id, { [key]: data });\n }\n },\n []\n );\n\n const purgeState = useCallback((id: string, key?: string) => {\n if (persistentState.has(id)) {\n if (key === undefined) {\n persistentState.delete(id);\n } else {\n const state = persistentState.get(id);\n if (state[key]) {\n const { [key]: _doomedState, ...rest } = persistentState.get(id);\n if (Object.keys(rest).length > 0) {\n persistentState.set(id, rest);\n } else {\n persistentState.delete(id);\n }\n }\n }\n }\n }, []);\n\n return {\n loadSessionState,\n loadState,\n saveSessionState,\n saveState,\n purgeState,\n purgeSessionState,\n };\n};\n", "import { cloneElement, ReactElement } from \"react\";\nimport { followPath, getProps } from \"../utils\";\nimport { MoveChildAction } from \"./layoutTypes\";\nimport { swapChild } from \"./replace-layout-element\";\n\nexport function moveChild(\n layoutRoot: ReactElement,\n { fromIndex, path, toIndex }: MoveChildAction\n) {\n const target = followPath(layoutRoot, path, true);\n const { children } = getProps(target);\n const replacementChildren = moveChildWithinChildren(\n children,\n fromIndex,\n toIndex\n );\n const replacement = cloneElement(target, undefined, replacementChildren);\n return swapChild(layoutRoot, target, replacement);\n}\n\nfunction moveChildWithinChildren(\n children: ReactElement[],\n fromIndex: number,\n toIndex: number\n) {\n const newChildren = children.slice();\n const [child] = newChildren.splice(fromIndex, 1);\n if (toIndex === -1) {\n return newChildren.concat(child);\n } else {\n newChildren.splice(toIndex, 0, child);\n return newChildren;\n }\n}\n", "import React, { ReactElement } from 'react';\nimport { Action } from '../layout-action';\nimport { getProp, getProps, nextStep } from '../utils';\nimport { ReplaceAction } from './layoutTypes';\nimport { applyLayoutProps, LayoutProps } from './layoutUtils';\n\nexport function replaceChild(model: ReactElement, { target, replacement }: ReplaceAction) {\n return _replaceChild(model, target, replacement);\n}\n\nexport function _replaceChild(\n model: ReactElement,\n child: ReactElement,\n replacement: ReactElement<LayoutProps>\n) {\n const path = getProp(child, 'path');\n const resizeable = getProp(child, 'resizeable');\n const { style } = getProps(child);\n const newChild =\n applyLayoutProps(\n React.cloneElement(replacement, {\n resizeable,\n style: {\n ...style,\n ...replacement.props.style\n }\n }),\n path\n );\n\n return swapChild(model, child, newChild);\n}\n\nexport function swapChild(\n model: ReactElement,\n child: ReactElement,\n replacement: ReactElement,\n op?: 'maximize' | 'minimize' | 'restore'\n): ReactElement {\n if (model === child) {\n return replacement;\n }\n \n const { idx, finalStep } = nextStep(getProp(model, 'path'), getProp(child, 'path'));\n const children = model.props.children.slice();\n \n if (finalStep) {\n if (!op) {\n children[idx] = replacement;\n } else if (op === Action.MINIMIZE) {\n children[idx] = minimize(model, children[idx]);\n } else if (op === Action.RESTORE) {\n children[idx] = restore(children[idx]);\n }\n } else {\n children[idx] = swapChild(children[idx], child, replacement, op);\n }\n return React.cloneElement(model, undefined, children);\n}\n\nfunction minimize(parent: ReactElement, child: ReactElement) {\n const { style: parentStyle } = getProps(parent);\n const { style: childStyle } = getProps(child);\n\n const { width, height, flexBasis, flexShrink, flexGrow, ...rest } = childStyle;\n\n const restoreStyle = {\n width,\n height,\n flexBasis,\n flexShrink,\n flexGrow\n };\n\n const style = {\n ...rest,\n flexBasis: 0,\n flexGrow: 0,\n flexShrink: 0\n };\n const collapsed =\n parentStyle.flexDirection === 'row'\n ? 'vertical'\n : parentStyle.flexDirection === 'column'\n ? 'horizontal'\n : false;\n\n if (collapsed) {\n return React.cloneElement(child, {\n collapsed,\n restoreStyle,\n style\n });\n }\n return child;\n}\n\nfunction restore(child: ReactElement) {\n const { style: childStyle, restoreStyle } = getProps(child);\n\n const { flexBasis, flexShrink, flexGrow, ...rest } = childStyle;\n\n const style = {\n ...rest,\n ...restoreStyle\n };\n\n return React.cloneElement(child, {\n collapsed: false,\n style,\n restoreStyle: undefined\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NamedFilter } from \"packages/vuu-filter-types\";\nimport { CSSProperties, ReactElement } from \"react\";\nimport { DragDropRect, DragInstructions } from \"../drag-drop\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { ContributionLocation } from \"../layout-view\";\n\nexport interface WithProps {\n props?: { [key: string]: any };\n}\n\nexport interface WithType {\n props?: any;\n title?: string;\n type: string;\n}\n\nexport interface LayoutRoot extends WithProps {\n active?: number;\n children?: ReactElement[];\n type: string;\n}\n\nexport type ValueOf<T> = T[keyof T];\nexport interface ApplicationSettings {\n leftNav?: {\n activeTabIndex: number;\n expanded: boolean;\n };\n /**\n * filters are keyed by MODULE:tablename\n */\n filters?: { [key: string]: NamedFilter[] };\n}\nexport type ApplicationSetting = ValueOf<ApplicationSettings>;\n\nexport interface ApplicationJSON {\n layout: LayoutJSON;\n settings?: ApplicationSettings;\n}\n\nexport interface LayoutJSON extends WithType {\n active?: number;\n children?: LayoutJSON[];\n id?: string;\n props?: { [key: string]: any };\n state?: any;\n type: string;\n style?: CSSProperties;\n}\n\nexport interface WithActive {\n active?: number;\n}\n\nexport type LayoutModel = LayoutRoot | ReactElement | WithType;\n\nexport type layoutType = \"Flexbox\" | \"View\" | \"DraggableLayout\" | \"Stack\";\n\n// TODO duplicated in layout-action\nexport const LayoutActionType = {\n ADD: \"add\",\n DRAG_START: \"drag-start\",\n DRAG_DROP: \"drag-drop\",\n LAYOUT_RESIZE: \"layout-resize\",\n MAXIMIZE: \"maximize\",\n MINIMIZE: \"minimize\",\n MOVE_CHILD: \"move-child\",\n QUERY: \"query\",\n REMOVE: \"remove\",\n REPLACE: \"replace\",\n RESTORE: \"restore\",\n SAVE: \"save\",\n SET_PROP: \"set-prop\",\n SET_PROPS: \"set-props\",\n SET_TITLE: \"set-title\",\n SPLITTER_RESIZE: \"splitter-resize\",\n SWITCH_TAB: \"switch-tab\",\n TEAROUT: \"tearout\",\n} as const;\n\nexport type AddAction = {\n component: any;\n path: string;\n type: typeof LayoutActionType.ADD;\n};\n\nexport type DragDropAction = {\n draggedReactElement: ReactElement;\n dragInstructions: any;\n dropTarget: Partial<DropTarget>;\n type: typeof LayoutActionType.DRAG_DROP;\n};\n\nexport type MaximizeAction = {\n path?: string;\n type: typeof LayoutActionType.MAXIMIZE;\n};\n\nexport type MinimizeAction = {\n path?: string;\n type: typeof LayoutActionType.MINIMIZE;\n};\n\nexport type MoveChildAction = {\n fromIndex: number;\n toIndex: number;\n path: string;\n type: typeof LayoutActionType.MOVE_CHILD;\n};\n\nexport type QueryAction = {\n path?: string;\n query: string;\n type: typeof LayoutActionType.QUERY;\n};\n\nexport type RemoveAction = {\n path?: string;\n type: typeof LayoutActionType.REMOVE;\n};\n\nexport type ReplaceAction = {\n replacement: any;\n target: any;\n type: typeof LayoutActionType.REPLACE;\n};\n\nexport type RestoreAction = {\n path?: string;\n type: typeof LayoutActionType.RESTORE;\n};\n\nexport type SetPropAction = {\n path: string;\n propName: string;\n propValue: string | number | boolean;\n type: typeof LayoutActionType.SET_PROP;\n};\n\nexport type SetPropsAction = {\n path: string;\n props: { [key: string]: unknown };\n type: typeof LayoutActionType.SET_PROPS;\n};\n\nexport type SetTitleAction = {\n path: string;\n title: string;\n type: typeof LayoutActionType.SET_TITLE;\n};\n\nexport type SplitterResizeAction = {\n path: string;\n sizes: { currentSize: number; flexBasis: number }[];\n type: typeof LayoutActionType.SPLITTER_RESIZE;\n};\n\nexport type LayoutResizeAction = {\n path: string;\n size: number;\n type: typeof LayoutActionType.LAYOUT_RESIZE;\n};\n\nexport type SwitchTabAction = {\n id?: string;\n nextIdx: number;\n path: string;\n type: typeof LayoutActionType.SWITCH_TAB;\n};\n\nexport type TearoutAction = {\n path?: string;\n type: typeof LayoutActionType.TEAROUT;\n};\n\nexport type LayoutReducerAction =\n | AddAction\n | DragDropAction\n | LayoutResizeAction\n | MaximizeAction\n | MinimizeAction\n | MoveChildAction\n | RemoveAction\n | ReplaceAction\n | RestoreAction\n | SetPropAction\n | SetPropsAction\n | SetTitleAction\n | SplitterResizeAction\n | SwitchTabAction;\n\nexport type SaveAction = {\n type: typeof LayoutActionType.SAVE;\n};\n\nexport type AddToolbarContributionViewAction = {\n content: ReactElement;\n location: ContributionLocation;\n type: \"add-toolbar-contribution\";\n};\n\nexport type RemoveToolbarContributionViewAction = {\n location: ContributionLocation;\n type: \"remove-toolbar-contribution\";\n};\n\nexport type MousedownViewAction = {\n preDragActivity?: any;\n index?: number;\n type: \"mousedown\";\n};\n\nexport type DragStartAction = {\n payload?: ReactElement;\n dragContainerPath?: string;\n dragElement?: HTMLElement;\n dragRect: DragDropRect;\n dropTargets?: string[];\n evt: MouseEvent;\n instructions?: DragInstructions;\n path: string;\n type: typeof LayoutActionType.DRAG_START;\n};\n\nexport type LayoutLevelChange =\n | \"switch-active-tab\"\n | \"edit-feature-title\"\n | \"save-feature-props\"\n | \"resize-component\"\n | \"remove-component\"\n | \"drag-drop-operation\";\n\nexport type ApplicationLevelChange =\n | \"switch-active-layout\"\n | \"open-layout\"\n | \"close-layout\"\n | \"rename-layout\"\n | \"resize-application-chrome\";\n\nexport type LayoutChangeReason = LayoutLevelChange | ApplicationLevelChange;\n\nexport type LayoutChangeHandler = (\n layout: LayoutJSON,\n layoutChangeReason: LayoutChangeReason\n) => void;\n\nexport const isApplicationLevelChange = (\n layoutChangeReason: LayoutChangeReason\n): layoutChangeReason is ApplicationLevelChange =>\n [\n \"switch-active-layout\",\n \"open-layout\",\n \"close-layout\",\n \"rename-layout\",\n ].includes(layoutChangeReason);\n\nexport const isLayoutLevelChange = (\n layoutChangeReason: LayoutChangeReason\n): layoutChangeReason is LayoutLevelChange =>\n [\n \"switch-active-tab\",\n \"edit-feature-title\",\n \"save-feature-props\",\n \"remove-component\",\n \"resize-component\",\n \"drag-drop-operation\",\n ].includes(layoutChangeReason);\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport React, { ReactElement } from \"react\";\nimport { createPlaceHolder } from \"./flexUtils\";\nimport { layoutFromJson } from \"./layoutUtils\";\nimport { swapChild } from \"./replace-layout-element\";\n\nimport {\n followPath,\n followPathToParent,\n getProp,\n getProps,\n nextStep,\n resetPath,\n typeOf,\n} from \"../utils\";\nimport { RemoveAction } from \"./layoutTypes\";\n\nexport function removeChild(layoutRoot: ReactElement, { path }: RemoveAction) {\n const target = followPath(layoutRoot, path!) as ReactElement;\n let targetParent = followPathToParent(layoutRoot, path!);\n if (targetParent === null) {\n return layoutRoot;\n }\n const { children } = getProps(targetParent);\n if (\n // this is very specific to explicitly sized components\n children.length > 1 &&\n typeOf(targetParent) !== \"Stack\" &&\n allOtherChildrenArePlaceholders(children, path)\n ) {\n const {\n style: { flexBasis, display, flexDirection, ...style },\n } = getProps(targetParent);\n let containerPath = getProp(targetParent, \"path\");\n let newLayout = swapChild(\n layoutRoot,\n targetParent,\n createPlaceHolder(containerPath, flexBasis, style)\n );\n while ((targetParent = followPathToParent(newLayout, containerPath))) {\n if (getProp(targetParent, \"path\") === \"0\") {\n break;\n }\n const { children } = getProps(targetParent);\n if (allOtherChildrenArePlaceholders(children)) {\n containerPath = getProp(targetParent, \"path\");\n const {\n style: { flexBasis, display, flexDirection, ...style },\n } = getProps(targetParent);\n newLayout = swapChild(\n layoutRoot,\n targetParent,\n createPlaceHolder(containerPath, flexBasis, style)\n );\n } else if (hasAdjacentPlaceholders(children)) {\n newLayout = collapsePlaceholders(\n layoutRoot,\n targetParent as ReactElement\n );\n } else {\n break;\n }\n }\n return newLayout;\n }\n return _removeChild(layoutRoot, target);\n}\n\nfunction _removeChild(\n container: ReactElement,\n child: ReactElement\n): ReactElement {\n const props = getProps(container);\n const { children: componentChildren, path, preserve } = props;\n let { active, id: containerId } = props;\n const { idx, finalStep } = nextStep(path, getProp(child, \"path\"));\n const type = typeOf(container) as string;\n let children = componentChildren.slice() as ReactElement[];\n\n if (finalStep) {\n children.splice(idx, 1);\n\n if (active !== undefined && active >= idx) {\n active = Math.max(0, active - 1);\n }\n\n if (children.length === 0 && preserve && type === \"Stack\") {\n const {\n path,\n style: { flexBasis },\n } = getProps(child);\n const placeHolder =\n containerId === \"main-tabs\"\n ? layoutFromJson(\n {\n props: {\n style: { flexGrow: 1, flexShrink: 1, flexBasis },\n title: \"Tab 1\",\n },\n type: \"Placeholder\",\n },\n path\n )\n : createPlaceHolder(path, flexBasis);\n children.push(placeHolder);\n } else if (\n children.length === 1 &&\n !preserve &&\n path !== \"0\" &&\n type.match(/Flexbox|Stack/)\n ) {\n return unwrap(container, children[0]);\n }\n\n if (!children.some(isFlexible) && children.some(canBeMadeFlexible)) {\n children = makeFlexible(children);\n }\n } else {\n children[idx] = _removeChild(children[idx], child) as ReactElement;\n }\n\n children = children.map((child, i) => resetPath(child, `${path}.${i}`));\n return React.cloneElement(container, { active }, children);\n}\n\nfunction unwrap(container: ReactElement, child: ReactElement) {\n const type = typeOf(container);\n const {\n path,\n style: { flexBasis, flexGrow, flexShrink, width, height },\n } = getProps(container);\n\n let unwrappedChild = resetPath(child, path);\n if (path === \"0\") {\n unwrappedChild = React.cloneElement(unwrappedChild, {\n style: {\n ...child.props.style,\n width,\n height,\n },\n });\n } else if (type === \"Flexbox\") {\n const dim =\n container.props.style.flexDirection === \"column\" ? \"height\" : \"width\";\n const {\n style: { [dim]: size, ...style },\n } = unwrappedChild.props;\n unwrappedChild = React.cloneElement(unwrappedChild, {\n flexFill: undefined,\n style: {\n ...style,\n flexGrow,\n flexShrink,\n flexBasis,\n width,\n height,\n },\n });\n }\n return unwrappedChild;\n}\n\nconst isFlexible = (element: ReactElement) => {\n return element.props.style.flexGrow > 0;\n};\n\nconst canBeMadeFlexible = (element: ReactElement) => {\n const { width, height, flexGrow } = element.props.style;\n return (\n flexGrow === 0 && typeof width !== \"number\" && typeof height !== \"number\"\n );\n};\n\nconst makeFlexible = (children: ReactElement[]) => {\n return children.map((child) =>\n canBeMadeFlexible(child)\n ? React.cloneElement(child, {\n style: {\n ...child.props.style,\n flexGrow: 1,\n },\n })\n : child\n );\n};\n\nconst hasAdjacentPlaceholders = (children: ReactElement[]) => {\n if (children && children.length > 0) {\n let wasPlaceholder = getProp(children[0], \"placeholder\");\n let isPlaceholder = false;\n for (let i = 1; i < children.length; i++) {\n isPlaceholder = getProp(children[i], \"placeholder\");\n if (wasPlaceholder && isPlaceholder) {\n return true;\n }\n wasPlaceholder = isPlaceholder;\n }\n }\n};\n\nconst collapsePlaceholders = (\n container: ReactElement,\n target: ReactElement\n) => {\n const { children: componentChildren, path } = getProps(container);\n const { idx, finalStep } = nextStep(path, getProp(target, \"path\"));\n let children = componentChildren.slice() as ReactElement[];\n if (finalStep) {\n children[idx] = _collapsePlaceHolders(target);\n } else {\n children[idx] = collapsePlaceholders(children[idx], target) as ReactElement;\n }\n\n children = children.map((child, i) => resetPath(child, `${path}.${i}`));\n return React.cloneElement(container, undefined, children);\n};\n\nconst _collapsePlaceHolders = (container: ReactElement) => {\n const { children } = getProps(container);\n const newChildren = [];\n const placeholders: ReactElement[] = [];\n\n for (let i = 0; i < children.length; i++) {\n if (getProp(children[i], \"placeholder\")) {\n placeholders.push(children[i]);\n } else {\n if (placeholders.length === 1) {\n newChildren.push(placeholders.pop());\n } else if (placeholders.length > 0) {\n newChildren.push(mergePlaceholders(placeholders));\n placeholders.length = 0;\n }\n newChildren.push(children[i]);\n }\n }\n\n if (placeholders.length === 1) {\n newChildren.push(placeholders.pop());\n } else if (placeholders.length > 0) {\n newChildren.push(mergePlaceholders(placeholders));\n }\n\n const containerPath = getProp(container, \"path\");\n return React.cloneElement(\n container,\n undefined,\n newChildren.map((child, i) => resetPath(child, `${containerPath}.${i}`))\n );\n};\n\nconst mergePlaceholders = ([placeholder, ...placeholders]: ReactElement[]) => {\n const targetStyle = getProp(placeholder, \"style\");\n let { flexBasis, flexGrow, flexShrink } = targetStyle;\n for (const {\n props: { style },\n } of placeholders) {\n flexBasis += style.flexBasis;\n flexGrow = Math.max(flexGrow, style.flexGrow);\n flexShrink = Math.max(flexShrink, style.flexShrink);\n }\n return React.cloneElement(placeholder, {\n style: { ...targetStyle, flexBasis, flexGrow, flexShrink },\n });\n};\n\nconst allOtherChildrenArePlaceholders = (\n children: ReactElement[],\n path?: string\n) =>\n children.every(\n (child) =>\n getProp(child, \"placeholder\") || (path && getProp(child, \"path\") === path)\n );\n", "import { dimension } from \"@vuu-ui/vuu-utils\";\nimport React, { CSSProperties, ReactElement } from \"react\";\nimport { followPath, getProps } from \"../utils\";\nimport { LayoutResizeAction, SplitterResizeAction } from \"./layoutTypes\";\nimport { swapChild } from \"./replace-layout-element\";\n\nexport function resizeFlexChild(\n layoutRoot: ReactElement,\n { path, size }: LayoutResizeAction\n) {\n const target = followPath(layoutRoot, path, true);\n\n const { style } = getProps(target);\n\n const newStyle = {\n ...style,\n width: size,\n };\n\n // const dimension = style.flexDirection === \"column\" ? \"height\" : \"width\";\n // const replacementChildren = applySizesToChildren(children, sizes, dimension);\n\n const replacement = React.cloneElement(target, { style: newStyle });\n\n return swapChild(layoutRoot, target, replacement);\n}\n\nexport function resizeFlexChildren(\n layoutRoot: ReactElement,\n { path, sizes }: SplitterResizeAction\n) {\n const target = followPath(layoutRoot, path, true);\n const { children, style } = getProps(target);\n\n const dimension = style.flexDirection === \"column\" ? \"height\" : \"width\";\n const replacementChildren = applySizesToChildren(children, sizes, dimension);\n\n const replacement = React.cloneElement(\n target,\n undefined,\n replacementChildren\n );\n\n return swapChild(layoutRoot, target, replacement);\n}\n\nfunction applySizesToChildren(\n children: ReactElement[],\n sizes: { currentSize: number; flexBasis: number }[],\n dimension: dimension\n) {\n return children.map((child, i) => {\n const {\n style: { [dimension]: size, flexBasis: actualFlexBasis },\n } = getProps(child);\n const meta = sizes[i];\n const { currentSize, flexBasis } = meta;\n const hasCurrentSize = currentSize !== undefined;\n const newSize = hasCurrentSize ? meta.currentSize : flexBasis;\n\n if (\n newSize === undefined ||\n size === newSize ||\n actualFlexBasis === newSize\n ) {\n return child;\n }\n return React.cloneElement(child, {\n style: applySizeToChild(child.props.style, dimension, newSize),\n });\n });\n}\n\nfunction applySizeToChild(\n style: CSSProperties,\n dimension: dimension,\n newSize: number\n) {\n const hasSize = typeof style[dimension] === \"number\";\n const { flexShrink = 1, flexGrow = 1 } = style;\n return {\n ...style,\n [dimension]: hasSize ? newSize : \"auto\",\n flexBasis: hasSize ? \"auto\" : newSize,\n flexShrink,\n flexGrow,\n };\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { getProp, getProps, nextStep, resetPath, typeOf } from \"../utils\";\nimport {\n createFlexbox,\n createPlaceHolder,\n flexDirection,\n getFlexStyle,\n getIntrinsicSize,\n wrapIntrinsicSizeComponentWithFlexbox,\n} from \"./flexUtils\";\nimport { LayoutModel } from \"./layoutTypes\";\nimport { applyLayoutProps, LayoutProps } from \"./layoutUtils\";\n\nexport interface LayoutSpec {\n type: \"Stack\" | \"Flexbox\";\n flexDirection: \"column\" | \"row\";\n showTabs?: boolean;\n}\n\nconst isHtmlElement = (component: LayoutModel) => {\n const [firstLetter] = typeOf(component) as string;\n return firstLetter === firstLetter.toLowerCase();\n};\n\nexport function wrap(\n container: ReactElement,\n existingComponent: ReactElement,\n newComponent: any,\n pos: DropPos,\n clientRect?: DropTarget[\"clientRect\"],\n dropRect?: DropTarget[\"dropRect\"]\n): ReactElement {\n const { children: containerChildren, path: containerPath } =\n getProps(container);\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n const { idx, finalStep } = nextStep(containerPath, existingComponentPath);\n const children = finalStep\n ? updateChildren(\n container,\n containerChildren,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n )\n : containerChildren.map((child: ReactElement, index: number) =>\n index === idx\n ? wrap(\n child,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n )\n : child\n );\n\n return React.cloneElement(container, undefined, children);\n}\n\nfunction updateChildren(\n container: LayoutModel,\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos,\n clientRect?: DropTarget[\"clientRect\"],\n dropRect?: rectTuple\n) {\n const intrinsicSize = getIntrinsicSize(newComponent);\n\n if (intrinsicSize?.width && intrinsicSize?.height) {\n if (clientRect === undefined || dropRect === undefined) {\n throw Error(\n \"wrap-layout-element, updateChildren clientRect and dropRect must both be available\"\n );\n }\n return wrapIntrinsicSizedComponent(\n containerChildren,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n );\n }\n return wrapFlexComponent(\n container,\n containerChildren,\n existingComponent,\n newComponent,\n pos\n );\n}\n\nfunction wrapFlexComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos\n) {\n const { version = 0 } = getProps(newComponent);\n const { path: existingComponentPath, title } = getProps(existingComponent);\n const {\n type,\n flexDirection,\n showTabs: showTabsProp,\n } = getLayoutSpecForWrapper(pos);\n const [style, existingComponentStyle, newComponentStyle] =\n getWrappedFlexStyles(\n type,\n existingComponent,\n newComponent,\n flexDirection,\n pos\n );\n const targetFirst = isTargetFirst(pos);\n const active = targetFirst ? 1 : 0;\n\n const newComponentProps = {\n resizeable: true,\n style: newComponentStyle,\n version: version + 1,\n };\n const resizeProp = isHtmlElement(existingComponent)\n ? \"data-resizeable\"\n : \"resizeable\";\n\n const existingComponentProps = {\n [resizeProp]: true,\n style: existingComponentStyle,\n };\n\n const showTabs = type === \"Stack\" ? { showTabs: showTabsProp } : undefined;\n const splitterSize =\n type === \"Flexbox\"\n ? {\n splitterSize:\n (typeOf(container) === \"Flexbox\" && container.props.splitterSize) ??\n undefined,\n }\n : undefined;\n\n const id = uuid();\n const wrapper = React.createElement(\n ComponentRegistry[type],\n {\n active,\n id,\n key: id,\n path: getProp(existingComponent, \"path\"),\n flexFill: getProp(existingComponent, \"flexFill\"),\n ...splitterSize,\n ...showTabs,\n style,\n title,\n resizeable: getProp(existingComponent, \"resizeable\"),\n } as LayoutProps,\n targetFirst\n ? [\n resetPath(\n existingComponent,\n `${existingComponentPath}.0`,\n existingComponentProps\n ),\n applyLayoutProps(\n React.cloneElement(newComponent, newComponentProps),\n `${existingComponentPath}.1`\n ),\n ]\n : [\n applyLayoutProps(\n React.cloneElement(newComponent, newComponentProps),\n `${existingComponentPath}.0`\n ),\n resetPath(\n existingComponent,\n `${existingComponentPath}.1`,\n existingComponentProps\n ),\n ]\n );\n return containerChildren.map((child: ReactElement) =>\n child === existingComponent ? wrapper : child\n );\n}\n\nfunction wrapIntrinsicSizedComponent(\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: rectTuple\n) {\n const { flexDirection } = getLayoutSpecForWrapper(pos);\n const contraDirection = flexDirection === \"column\" ? \"row\" : \"column\";\n const targetFirst = isTargetFirst(pos);\n\n const [dropLeft, dropTop, dropRight, dropBottom] = dropRect;\n const [startPlaceholder, endPlaceholder] =\n flexDirection === \"column\"\n ? [dropTop - clientRect.top, clientRect.bottom - dropBottom]\n : [dropLeft - clientRect.left, clientRect.right - dropRight];\n const pathRoot = getProp(existingComponent, \"path\");\n let pathIndex = 0;\n\n const resizeProp = isHtmlElement(existingComponent)\n ? \"data-resizeable\"\n : \"resizeable\";\n\n const wrappedChildren = [];\n if (startPlaceholder) {\n wrappedChildren.push(\n targetFirst\n ? resetPath(existingComponent, `${pathRoot}.${pathIndex++}`, {\n [resizeProp]: true,\n style: { flexBasis: startPlaceholder, flexGrow: 1, flexShrink: 1 },\n })\n : createPlaceHolder(`${pathRoot}.${pathIndex++}`, startPlaceholder, {\n flexGrow: 0,\n flexShrink: 0,\n })\n );\n }\n wrappedChildren.push(\n wrapIntrinsicSizeComponentWithFlexbox(\n newComponent,\n contraDirection,\n `${pathRoot}.${pathIndex++}`,\n clientRect,\n dropRect\n )\n );\n if (endPlaceholder) {\n wrappedChildren.push(\n targetFirst\n ? createPlaceHolder(`${pathRoot}.${pathIndex++}`, 0)\n : resetPath(existingComponent, `${pathRoot}.${pathIndex++}`, {\n [resizeProp]: true,\n style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },\n })\n );\n }\n\n const wrapper = createFlexbox(\n flexDirection,\n existingComponent.props,\n wrappedChildren,\n pathRoot\n );\n return containerChildren.map((child) =>\n child === existingComponent ? wrapper : child\n );\n}\n\nfunction getWrappedFlexStyles(\n type: string,\n existingComponent: ReactElement,\n newComponent: ReactElement,\n flexDirection: flexDirection,\n pos: DropPos\n) {\n const style = {\n ...existingComponent.props.style,\n flexDirection,\n };\n\n const dimension =\n type === \"Flexbox\" && flexDirection === \"column\" ? \"height\" : \"width\";\n const newComponentStyle = getFlexStyle(newComponent, dimension, pos);\n const existingComponentStyle = getFlexStyle(existingComponent, dimension);\n\n return [style, existingComponentStyle, newComponentStyle];\n}\n\nconst isTargetFirst = (pos: DropPos) =>\n pos.position.SouthOrEast\n ? true\n : pos?.tab?.positionRelativeToTab === \"before\"\n ? false\n : pos.position.Header\n ? true\n : false;\n\nfunction getLayoutSpecForWrapper(pos: DropPos): LayoutSpec {\n if (pos.position.Header) {\n return {\n type: \"Stack\",\n flexDirection: \"column\",\n showTabs: true,\n };\n } else {\n return {\n type: \"Flexbox\",\n flexDirection: pos.position.EastOrWest ? \"row\" : \"column\",\n };\n }\n}\n", "import { createContext, Dispatch, ReactElement } from \"react\";\nimport {\n DragStartAction,\n LayoutReducerAction,\n QueryAction,\n SaveAction,\n} from \"../layout-reducer\";\n\nconst unconfiguredLayoutProviderDispatch: LayoutProviderDispatch = (action) =>\n console.log(\n `dispatch ${action.type}, have you forgotten to provide a LayoutProvider ?`\n );\n\nexport type LayoutProviderDispatch = Dispatch<\n LayoutReducerAction | SaveAction | DragStartAction | QueryAction\n>;\n\nexport interface LayoutProviderContextProps {\n createNewChild?: (index?: number) => ReactElement;\n dispatchLayoutProvider: LayoutProviderDispatch;\n version: number;\n}\n\nexport const LayoutProviderContext = createContext<LayoutProviderContextProps>({\n dispatchLayoutProvider: unconfiguredLayoutProviderDispatch,\n version: -1,\n});\n", "import { MutableRefObject, ReactElement, useCallback, useRef } from \"react\";\nimport {\n DragDropRect,\n DragEndCallback,\n Draggable,\n DragInstructions,\n} from \"../drag-drop\";\nimport { DragStartAction } from \"../layout-reducer\";\nimport { getIntrinsicSize } from \"../layout-reducer/flexUtils\";\nimport { followPath, resolvePath } from \"../utils\";\nimport { LayoutProviderDispatch } from \"./LayoutProviderContext\";\n\nconst NO_INSTRUCTIONS = {} as DragInstructions;\nconst NO_OFFSETS: [number, number] = [0, 0];\n\ninterface CurrentDragAction extends Omit<DragStartAction, \"evt\" | \"type\"> {\n dragContainerPath: string;\n}\n\ninterface DragOperation {\n payload: ReactElement;\n originalCSS: string;\n dragRect: unknown;\n dragInstructions: DragInstructions;\n dragOffsets: [number, number];\n targetPosition: { left: number; top: number };\n}\n\nconst getDragElement = (\n rect: DragDropRect,\n id: string,\n dragElement?: HTMLElement\n): [HTMLElement, string, number, number] => {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"vuuSimpleDraggableWrapper\";\n wrapper.classList.add(\n \"vuuSimpleDraggableWrapper\",\n \"salt-theme\",\n \"salt-density-medium\"\n );\n wrapper.dataset.dragging = \"true\";\n\n const div = dragElement ?? document.createElement(\"div\");\n div.id = id;\n\n wrapper.appendChild(div);\n document.body.appendChild(wrapper);\n const cssText = `top:${rect.top}px;left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;`;\n return [wrapper, cssText, rect.left, rect.top];\n};\n\nconst determineDragOffsets = (\n draggedElement: HTMLElement\n): [number, number] => {\n const { offsetParent } = draggedElement;\n if (offsetParent === null) {\n return NO_OFFSETS;\n } else {\n const { left: offsetLeft, top: offsetTop } =\n offsetParent.getBoundingClientRect();\n return [offsetLeft, offsetTop];\n }\n};\n\nexport const useLayoutDragDrop = (\n rootLayoutRef: MutableRefObject<ReactElement>,\n dispatch: LayoutProviderDispatch,\n pathToDropTarget?: string\n) => {\n const dragActionRef = useRef<CurrentDragAction>();\n const dragOperationRef = useRef<DragOperation>();\n const draggableHTMLElementRef = useRef<HTMLElement>();\n\n const handleDrag = useCallback((x, y) => {\n if (dragOperationRef.current && draggableHTMLElementRef.current) {\n const {\n dragOffsets: [offsetX, offsetY],\n targetPosition,\n } = dragOperationRef.current;\n const left = typeof x === \"number\" ? x - offsetX : targetPosition.left;\n const top = typeof y === \"number\" ? y - offsetY : targetPosition.top;\n if (left !== targetPosition.left || top !== targetPosition.top) {\n dragOperationRef.current.targetPosition.left = left;\n dragOperationRef.current.targetPosition.top = top;\n draggableHTMLElementRef.current.style.top = top + \"px\";\n draggableHTMLElementRef.current.style.left = left + \"px\";\n }\n }\n }, []);\n\n const handleDrop: DragEndCallback = useCallback(\n (dropTarget) => {\n if (dragOperationRef.current) {\n const {\n dragInstructions,\n payload: draggedReactElement,\n originalCSS,\n } = dragOperationRef.current;\n\n if (dropTarget) {\n dispatch({\n type: \"drag-drop\",\n draggedReactElement,\n dragInstructions,\n dropTarget,\n });\n }\n\n if (draggableHTMLElementRef.current) {\n if (!dropTarget && dragInstructions.DriftHomeIfNoDropTarget) {\n console.log(\"drift back to start\");\n document.body.removeChild(draggableHTMLElementRef.current);\n } else if (dragInstructions.RemoveDraggableOnDragEnd) {\n document.body.removeChild(draggableHTMLElementRef.current);\n } else {\n draggableHTMLElementRef.current.style.cssText = originalCSS;\n delete draggableHTMLElementRef.current.dataset.dragging;\n }\n }\n\n dragActionRef.current = undefined;\n dragOperationRef.current = undefined;\n draggableHTMLElementRef.current = undefined;\n }\n },\n [dispatch]\n );\n\n const handleDragStart = useCallback(\n (evt: MouseEvent) => {\n if (dragActionRef.current) {\n const {\n payload: component,\n dragContainerPath,\n dragElement,\n dragRect,\n instructions = NO_INSTRUCTIONS,\n path,\n } = dragActionRef.current;\n const { current: rootLayout } = rootLayoutRef;\n const dragPos = { x: evt.clientX, y: evt.clientY };\n const dragPayload = component ?? followPath(rootLayout, path, true);\n const { id: dragPayloadId } = dragPayload.props;\n const intrinsicSize = getIntrinsicSize(dragPayload);\n let originalCSS = \"\",\n dragCSS = \"\",\n dragTransform = \"\";\n\n let dragStartLeft = -1;\n let dragStartTop = -1;\n let dragOffsets: [number, number] = NO_OFFSETS;\n\n let element = document.getElementById(dragPayloadId);\n\n if (element === null) {\n [element, dragCSS, dragStartLeft, dragStartTop] = getDragElement(\n dragRect,\n dragPayloadId,\n dragElement\n );\n } else {\n dragOffsets = determineDragOffsets(element);\n const [offsetLeft, offsetTop] = dragOffsets;\n const { width, height, left, top } = element.getBoundingClientRect();\n dragStartLeft = left - offsetLeft;\n dragStartTop = top - offsetTop;\n dragCSS = `width:${width}px;height:${height}px;left:${dragStartLeft}px;top:${dragStartTop}px;z-index: 100;background-color:#ccc;opacity: 0.6;`;\n element.dataset.dragging = \"true\";\n originalCSS = element.style.cssText;\n }\n\n dragTransform = Draggable.initDrag(\n rootLayoutRef.current,\n dragContainerPath,\n dragRect,\n dragPos,\n {\n drag: handleDrag,\n drop: handleDrop,\n },\n intrinsicSize\n // dropTargets\n );\n\n element.style.cssText = dragCSS + dragTransform;\n draggableHTMLElementRef.current = element;\n\n dragOperationRef.current = {\n payload: dragPayload,\n originalCSS,\n dragRect,\n dragOffsets,\n dragInstructions: instructions,\n targetPosition: { left: dragStartLeft, top: dragStartTop },\n };\n }\n },\n [handleDrag, handleDrop, rootLayoutRef]\n );\n\n const prepareToDrag = useCallback(\n (action: DragStartAction) => {\n const { evt, ...options } = action;\n dragActionRef.current = {\n ...options,\n dragContainerPath: resolvePath(rootLayoutRef.current, pathToDropTarget),\n };\n Draggable.handleMousedown(evt, handleDragStart, options.instructions);\n },\n [handleDragStart, pathToDropTarget, rootLayoutRef]\n );\n\n return prepareToDrag;\n};\n", "import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { ForwardedRef, forwardRef, useMemo } from \"react\";\nimport { useBreakpoints } from \"../responsive\";\nimport { asReactElements } from \"../utils\";\nimport { FlexboxProps } from \"./flexboxTypes\";\nimport \"./FluidGrid.css\";\nimport { useResponsiveSizing } from \"./useResponsiveSizing\";\n\nconst classBase = \"hwFluidGrid\";\n\nexport interface FluidGridProps extends FlexboxProps {\n showGrid?: boolean;\n}\n\nexport const FluidGrid = forwardRef(function FluidGrid(\n props: FluidGridProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const {\n breakPoints,\n children: childrenProp,\n column,\n cols: colsProp = 12,\n className: classNameProp,\n flexFill,\n gap = 3,\n fullPage,\n id,\n onSplitterMoved,\n resizeable,\n row,\n showGrid,\n spacing,\n splitterSize,\n style: styleProp,\n ...rest\n } = props;\n\n //TODO does thie useMemo serve any actual purpose or will childrenProp\n // always be new anyway ?\n const children = useMemo(() => {\n return asReactElements(childrenProp);\n }, [childrenProp]);\n\n const { cols, content, rootRef } = useResponsiveSizing({\n children,\n cols: colsProp,\n style: styleProp,\n });\n\n const breakpoint = useBreakpoints(\n {\n breakPoints,\n },\n rootRef\n );\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-column`]: column,\n [`${classBase}-row`]: row,\n [`${classBase}-show-grid`]: showGrid,\n \"flex-fill\": flexFill,\n \"full-page\": fullPage,\n });\n\n const style = {\n ...styleProp,\n \"--spacing\": spacing,\n \"--grid-col-count\": cols,\n \"--grid-gap\": gap,\n };\n\n return (\n <div\n {...rest}\n className={className}\n data-breakpoint={breakpoint}\n data-cols={cols}\n data-resizeable={resizeable || undefined}\n id={id}\n ref={useForkRef(rootRef, ref)}\n style={style}\n >\n {content}\n </div>\n );\n});\nFluidGrid.displayName = \"FluidGrid\";\n", "import { RefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useResizeObserver } from \"./useResizeObserver\";\nimport {\n BreakPointRamp,\n breakpointRamp,\n getBreakPoints as getDocumentBreakpoints,\n} from \"./breakpoints\";\nimport { BreakPoint, BreakPointsProp } from \"../flexbox/flexboxTypes\";\n\nconst EMPTY_ARRAY: BreakPoint[] = [];\n\nexport interface BreakpointsHookProps {\n breakPoints?: BreakPointsProp;\n smallerThan?: string;\n}\n\n// TODO how do we cater for smallerThan/greaterThan breakpoints\nexport const useBreakpoints = (\n { breakPoints: breakPointsProp, smallerThan }: BreakpointsHookProps,\n ref: RefObject<HTMLElement>\n) => {\n const [breakpointMatch, setBreakpointmatch] = useState(\n smallerThan ? false : \"lg\"\n );\n const bodyRef = useRef(document.body);\n const breakPointsRef = useRef<BreakPointRamp[]>(\n breakPointsProp ? breakpointRamp(breakPointsProp) : getDocumentBreakpoints()\n );\n\n // TODO how do we identify the default\n const sizeRef = useRef(\"lg\");\n\n const stopFromMinWidth = useCallback(\n (w) => {\n if (breakPointsRef.current) {\n for (const [name, size] of breakPointsRef.current) {\n if (w >= size) {\n return name;\n }\n }\n }\n },\n [breakPointsRef]\n );\n\n const matchSizeAgainstBreakpoints = useCallback(\n (width) => {\n if (smallerThan) {\n const breakPointRamp = breakPointsRef.current.find(\n ([name]: BreakPointRamp) => name === smallerThan\n );\n if (breakPointRamp) {\n const [, , maxValue] = breakPointRamp;\n return width < maxValue;\n }\n } else {\n return stopFromMinWidth(width);\n }\n // is this right ?\n return width;\n },\n [smallerThan, stopFromMinWidth]\n );\n\n // TODO need to make the dimension a config\n useResizeObserver(\n ref || bodyRef,\n breakPointsRef.current ? [\"width\"] : EMPTY_ARRAY,\n ({ width: measuredWidth }: { width?: number }) => {\n const result = matchSizeAgainstBreakpoints(measuredWidth);\n if (result !== sizeRef.current) {\n sizeRef.current = result;\n setBreakpointmatch(result);\n }\n },\n true\n );\n\n useEffect(() => {\n const target = ref || bodyRef;\n if (target.current) {\n const prevSize = sizeRef.current;\n if (breakPointsRef.current) {\n // We're measuring here when the resizeObserver has also measured\n // There isn't a convenient way to get the Resizeobserver to\n // notify initial size - that's not really its job, unless we\n // set a flag ?\n const { clientWidth } = target.current;\n const result = matchSizeAgainstBreakpoints(clientWidth);\n sizeRef.current = result;\n // If initial size of ref does not match the default, notify client after render\n if (result !== prevSize) {\n setBreakpointmatch(result);\n }\n }\n }\n }, [setBreakpointmatch, matchSizeAgainstBreakpoints, ref]);\n\n // No, just ass the class directly to the ref, no need to render\n return breakpointMatch;\n};\n", "/* eslint-disable no-restricted-syntax */\nimport { useCallback, useLayoutEffect, useRef, RefObject } from \"react\";\nexport const WidthHeight = [\"height\", \"width\"];\nexport const HeightOnly = [\"height\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n scrollHeight?: T;\n scrollWidth?: T;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new WeakMap<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n contentRect: DOMRectReadOnly,\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return contentRect.height;\n case \"scrollHeight\":\n return element.scrollHeight;\n case \"scrollWidth\":\n return element.scrollWidth;\n case \"width\":\n return contentRect.width;\n default:\n return 0;\n }\n};\n\nexport const resizeObserver = new ResizeObserver(\n (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, contentRect } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n contentRect,\n dimension as measuredDimension\n );\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n onResize && onResize(measurements);\n }\n }\n }\n }\n);\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\n// Note asking for scrollHeight alone will not trigger onResize, this is only triggered by height,\n// with scrollHeight returned as an auxilliary value\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n): void {\n const dimensionsRef = useRef(dimensions);\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const rect = target.getBoundingClientRect();\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(target, rect, dim as measuredDimension);\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useLayoutEffect(() => {\n const target = ref.current as HTMLElement;\n let cleanedUp = false;\n\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n cleanedUp = false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { fonts } = document as any;\n if (fonts) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n await fonts.ready;\n }\n if (!cleanedUp) {\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n }\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n throw Error(\n \"useResizeObserver attemping to observe same element twice\"\n );\n }\n void registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n cleanedUp = true;\n }\n };\n }, [ref, measure, reportInitialSize, onResize]);\n\n useLayoutEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n\n // TODO might be a good idea to ref and return the current measurememnts. That way, derived hooks\n // e.g useBreakpoints don't have to measure and client cn make onResize callback simpler\n}\n", "// should we have some global; defaults ?\n\nimport { BreakPointsProp } from \"../flexbox/flexboxTypes\";\n\nexport type BreakPointRamp = [string, number, number];\n\nfunction breakpointReader(\n themeName: string,\n defaultBreakpoints?: BreakPointsProp\n) {\n //TODO ownerDocument\n const themeRoot = document.body.querySelector(`.${themeName}`);\n const handler = {\n get: function (style: CSSStyleDeclaration, stopName: string) {\n const val = style.getPropertyValue(\n // lets assume we have the following naming convention\n `--${themeName}-breakpoint-${stopName}`\n );\n return val ? parseInt(val) : undefined;\n },\n };\n\n return themeRoot\n ? new Proxy(getComputedStyle(themeRoot), handler)\n : defaultBreakpoints ?? {};\n}\n\nconst byDescendingStopSize = (\n [, s1]: [string, number],\n [, s2]: [string, number]\n) => s2 - s1;\n\n// These are assumed to be min-width (aka mobile-first) stops, we could take a\n// paramneter to support max-width as well ?\n// return [stopName, minWidth, maxWidth]\nexport const breakpointRamp = (\n breakpoints: BreakPointsProp\n): BreakPointRamp[] =>\n Object.entries(breakpoints)\n .sort(byDescendingStopSize)\n .map(([name, value], i, all) => [\n name,\n value,\n i < all.length - 1 ? all[i + 1][1] : 9999,\n ]);\n\nlet documentBreakpoints: BreakPointRamp[] | null = null;\n\nconst loadBreakpoints = (themeName = \"salt\") => {\n // TODO would be nice to read these breakpoint labels from a css variable to\n // avoid hard-coding them here ?\n const { xs, sm, md, lg, xl } = breakpointReader(themeName) as BreakPointsProp;\n return breakpointRamp({ xs, sm, md, lg, xl });\n};\n\n//TODO support multiple themes loaded\nexport const getBreakPoints = (themeName?: string) => {\n if (documentBreakpoints === null) {\n documentBreakpoints = loadBreakpoints(themeName);\n }\n return documentBreakpoints;\n};\n", "const COLLAPSIBLE = 'data-collapsible';\n\nconst RESPONSIVE_ATTRIBUTE: { [key: string]: boolean } = {\n [COLLAPSIBLE]: true,\n 'data-pad-start': true,\n 'data-pad-end': true\n};\n\nexport const isResponsiveAttribute = (propName: string): boolean =>\n RESPONSIVE_ATTRIBUTE[propName] ?? false;\n\nconst isCollapsible = (propName: string) => propName === COLLAPSIBLE;\n\nconst COLLAPSIBLE_VALUE: { [key: string]: string } = {\n dynamic: 'dynamic',\n instant: 'instant',\n true: 'instant'\n};\n\nconst collapsibleValue = (value: string) => COLLAPSIBLE_VALUE[value] ?? 'none';\n\ntype Props = { [key: string]: any };\nexport const extractResponsiveProps = (props: Props) => {\n return Object.keys(props).reduce<[Props, Props]>(\n (result, propName) => {\n const [toolbarProps, rest] = result;\n if (isResponsiveAttribute(propName)) {\n const value = isCollapsible(propName) ? collapsibleValue(props[propName]) : props[propName];\n\n toolbarProps[propName] = value;\n rest[propName] = undefined;\n }\n return result;\n },\n [{}, {}]\n );\n};\n", "import { getUniqueId } from \"@vuu-ui/vuu-utils\";\nimport {\n cloneElement,\n CSSProperties,\n isValidElement,\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport { gatherChildMeta } from \"./flexbox-utils\";\nimport { BreakPoint } from \"./flexboxTypes\";\n\nconst breakPoints: BreakPoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"];\n\nconst DEFAULT_COLS = 12;\n\nexport const useResponsiveSizing = ({\n children: childrenProp,\n cols: colsProp,\n style,\n}: {\n children: ReactElement[];\n cols?: number;\n style?: CSSProperties;\n}) => {\n const rootRef = useRef(null);\n const metaRef = useRef(null);\n const contentRef = useRef<ReactElement[]>();\n const cols = colsProp ?? DEFAULT_COLS;\n\n const isColumn = style?.flexDirection === \"column\";\n const dimension = isColumn ? \"height\" : \"width\";\n\n const children = useMemo(\n () =>\n Array.isArray(childrenProp)\n ? childrenProp\n : isValidElement(childrenProp)\n ? [childrenProp]\n : [],\n [childrenProp]\n );\n\n const buildContent = useCallback(\n (children, dimension): [ReactElement[], any] => {\n const childMeta = gatherChildMeta(children, dimension, breakPoints);\n const content = [];\n const meta = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const {\n style: { flex, ...rest },\n } = child.props;\n content.push(\n cloneElement(child, {\n key: getUniqueId(),\n style: {\n ...rest,\n \"--parent-col-count\": cols,\n },\n })\n );\n meta.push(childMeta[i]);\n }\n return [content, meta];\n },\n [cols]\n );\n\n useMemo(() => {\n const [content, meta] = buildContent(children, dimension);\n metaRef.current = meta;\n contentRef.current = content;\n }, [buildContent, children, dimension]);\n\n return {\n cols,\n content: contentRef.current,\n rootRef,\n };\n};\n", "import { registerComponent } from '../registry/ComponentRegistry';\nimport { FluidGrid, FluidGridProps } from './FluidGrid';\n\nexport const FluidGridLayout = function FluidGridLayout(props: FluidGridProps) {\n return <FluidGrid {...props} />;\n};\nFluidGridLayout.displayName = 'FluidGrid';\n\nregisterComponent('FluidGrid', FluidGridLayout, 'container');\n", "import { EditableLabel } from \"@vuu-ui/vuu-ui-controls\";\nimport { Button } from \"@salt-ds/core\";\nimport { default as classnames, default as cx } from \"classnames\";\nimport {\n cloneElement,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n useRef,\n useState,\n} from \"react\";\nimport { Contribution, useViewDispatch } from \"../layout-view\";\n\nimport \"./Header.css\";\n\nexport interface HeaderProps extends HTMLAttributes<HTMLDivElement> {\n collapsed?: boolean;\n contributions?: Contribution[];\n expanded?: boolean;\n closeable?: boolean;\n onEditTitle: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n tearOut?: boolean;\n}\n\nconst classBase = \"vuuHeader\";\n\nexport const Header = ({\n className: classNameProp,\n contributions,\n collapsed,\n closeable,\n onEditTitle,\n orientation: orientationProp = \"horizontal\",\n style,\n title = \"Untitled\",\n}: HeaderProps) => {\n const labelFieldRef = useRef<HTMLDivElement>(null);\n const [value, setValue] = useState<string>(title);\n const [editing, setEditing] = useState<boolean>(false);\n\n const viewDispatch = useViewDispatch();\n const handleClose = (evt: MouseEvent) =>\n viewDispatch?.({ type: \"remove\" }, evt);\n\n const handleTitleMouseDown = () => {\n labelFieldRef.current?.focus();\n };\n\n const handleButtonMouseDown = (evt: MouseEvent) => {\n // do not allow drag to be initiated\n evt.stopPropagation();\n };\n\n const orientation = collapsed || orientationProp;\n\n const className = classnames(\n classBase,\n classNameProp,\n `${classBase}-${orientation}`\n );\n\n const handleEnterEditMode = () => {\n setEditing(true);\n };\n\n const handleTitleKeyDown = (evt: KeyboardEvent<HTMLDivElement>) => {\n if (evt.key === \"Enter\") {\n setEditing(true);\n }\n };\n\n const handleExitEditMode = (\n originalValue = \"\",\n finalValue = \"\",\n allowDeactivation = true,\n editCancelled = false\n ) => {\n setEditing(false);\n if (editCancelled) {\n setValue(originalValue);\n } else if (finalValue !== originalValue) {\n setValue(finalValue);\n onEditTitle?.(finalValue);\n }\n if (allowDeactivation === false) {\n labelFieldRef.current?.focus();\n }\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n viewDispatch?.({ type: \"mousedown\" }, e);\n };\n\n const toolbarItems: ReactElement[] = [];\n const postTitleContributedItems: ReactElement[] = [];\n const actionButtons: ReactElement[] = [];\n\n contributions?.forEach((contribution, i) => {\n switch (contribution.location) {\n case \"pre-title\":\n toolbarItems.push(cloneElement(contribution.content, { key: i }));\n break;\n default:\n postTitleContributedItems.push(\n cloneElement(contribution.content, { key: i })\n );\n }\n });\n\n title &&\n toolbarItems.push(\n <EditableLabel\n className={`${classBase}-title`}\n editing={editing}\n key=\"title\"\n value={value}\n onChange={setValue}\n onMouseDownCapture={handleTitleMouseDown}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n onKeyDown={handleTitleKeyDown}\n ref={labelFieldRef}\n tabIndex={0}\n />\n );\n\n closeable &&\n actionButtons.push(\n <Button\n data-icon=\"close\"\n key=\"close\"\n onClick={handleClose}\n onMouseDown={handleButtonMouseDown}\n variant=\"secondary\"\n />\n );\n\n postTitleContributedItems.length > 0 &&\n toolbarItems.push(\n <div className=\"vuuTooltrayProxy\" data-align=\"end\" key=\"contributions\">\n {postTitleContributedItems}\n </div>\n );\n\n actionButtons.length > 0 &&\n toolbarItems.push(\n <div className=\"vuuTooltrayProxy\" data-align=\"end\" key=\"actions\">\n {actionButtons}\n </div>\n );\n\n return (\n <div\n className={cx(\"vuuToolbarProxy\", className)}\n style={style}\n onMouseDown={handleMouseDown}\n >\n {toolbarItems}\n {/* \n {collapsed === false ? (\n <ActionButton\n aria-label=\"Minimize View\"\n actionId=\"minimize\"\n iconName=\"minimize\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {collapsed ? (\n <ActionButton\n aria-label=\"Restore View\"\n actionId=\"restore\"\n iconName=\"double-chevron-right\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {expanded === false ? (\n <ActionButton\n aria-label=\"Maximize View\"\n actionId=\"maximize\"\n iconName=\"maximize\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {expanded ? (\n <ActionButton\n aria-label=\"Restore View\"\n actionId=\"restore\"\n iconName=\"restore\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {tearOut ? (\n <ActionButton\n aria-label=\"Tear out View\"\n actionId=\"tearout\"\n iconName=\"tear-out\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {closeable ? (\n <Button\n aria-label=\"close\"\n data-icon\n onClick={handleClose}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null} */}\n </div>\n );\n};\n", "import { DataSource } from \"@vuu-ui/vuu-data\";\nimport {\n ReactElement,\n RefObject,\n SyntheticEvent,\n useCallback,\n useState,\n} from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { DragStartAction } from \"../layout-reducer\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { QueryReponse, ViewDispatch } from \"./ViewContext\";\nimport { ViewAction } from \"./viewTypes\";\n\nexport type ContributionLocation = \"post-title\" | \"pre-title\";\n\nexport type Contribution = {\n index?: number;\n location?: ContributionLocation;\n content: ReactElement;\n};\n\nexport const useViewActionDispatcher = (\n id: string,\n root: RefObject<HTMLDivElement>,\n viewPath?: string,\n dropTargets?: string[]\n): [ViewDispatch, Contribution[] | undefined] => {\n const { loadSessionState, purgeSessionState, purgeState, saveSessionState } =\n usePersistentState();\n\n const [contributions, setContributions] = useState<Contribution[]>(\n loadSessionState(id, \"contributions\") ?? []\n );\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const updateContributions = useCallback(\n (location: ContributionLocation, content: ReactElement) => {\n const updatedContributions = contributions.concat([\n { location, content },\n ]);\n saveSessionState(id, \"contributions\", updatedContributions);\n setContributions(updatedContributions);\n },\n [contributions, id, saveSessionState]\n );\n\n const clearContributions = useCallback(() => {\n purgeSessionState(id, \"contributions\");\n setContributions([]);\n }, [id, purgeSessionState]);\n\n const handleRemove = useCallback(() => {\n const ds = loadSessionState(id, \"data-source\") as DataSource;\n if (ds) {\n ds.unsubscribe();\n }\n purgeSessionState(id);\n purgeState(id);\n dispatchLayoutAction({ type: \"remove\", path: viewPath });\n }, [\n dispatchLayoutAction,\n id,\n loadSessionState,\n purgeSessionState,\n purgeState,\n viewPath,\n ]);\n\n const handleMouseDown = useCallback(\n async (evt, index, preDragActivity): Promise<boolean> => {\n evt.stopPropagation();\n const dragRect = root.current?.getBoundingClientRect();\n return new Promise((resolve, reject) => {\n dispatchLayoutAction({\n type: \"drag-start\",\n evt,\n path: index === undefined ? viewPath : `${viewPath}.${index}`,\n dragRect,\n preDragActivity,\n dropTargets,\n resolveDragStart: resolve,\n rejectDragStart: reject,\n } as DragStartAction);\n });\n },\n [root, dispatchLayoutAction, viewPath, dropTargets]\n );\n\n const dispatchAction = useCallback(\n async <A extends ViewAction = ViewAction>(\n action: A,\n evt?: SyntheticEvent\n ): Promise<boolean | QueryReponse | void> => {\n const { type } = action;\n switch (type) {\n case \"maximize\":\n case \"minimize\":\n case \"restore\":\n return dispatchLayoutAction({ type, path: action.path ?? viewPath });\n case \"remove\":\n return handleRemove();\n case \"mousedown\":\n return handleMouseDown(evt, action.index, action.preDragActivity);\n case \"add-toolbar-contribution\":\n return updateContributions(action.location, action.content);\n case \"remove-toolbar-contribution\":\n return clearContributions();\n case \"query\":\n return dispatchLayoutAction({\n type,\n path: action.path,\n query: action.query,\n });\n return;\n default: {\n return undefined;\n }\n }\n },\n [\n dispatchLayoutAction,\n viewPath,\n handleRemove,\n handleMouseDown,\n updateContributions,\n clearContributions,\n ]\n );\n\n return [dispatchAction, contributions];\n};\n", "import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Header as VuuHeader } from \"../layout-header/Header\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { useId } from \"../utils\";\nimport { useView } from \"./useView\";\nimport { useViewResize } from \"./useViewResize\";\nimport { ViewContext, ViewContextAPI } from \"./ViewContext\";\nimport { ViewProps } from \"./viewTypes\";\n\nimport \"./View.css\";\n\nconst classBase = \"vuuView\";\n\ntype Props = { [key: string]: unknown };\n\nconst getProps = (state?: Props, props?: Props) => {\n if (state && props) {\n return {\n ...state,\n ...props,\n };\n } else return state || props;\n};\n\n/**\n * View is the leaf-level entity managed by the Vuu layout system. It may represent a component\n * or a group of components. It also offers an API (via useViewContext) for persistence.\n */\nconst View = forwardRef(function View(\n props: ViewProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n Header = VuuHeader,\n children,\n className,\n collapsed,\n closeable,\n \"data-path\": dataPath,\n \"data-resizeable\": dataResizeable,\n dropTargets,\n expanded,\n flexFill,\n id: idProp,\n header,\n orientation = \"horizontal\",\n path = dataPath,\n resize = \"responsive\",\n resizeable = dataResizeable,\n tearOut,\n style = {},\n title: titleProp,\n ...restProps\n } = props;\n\n const id = useId(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const [componentProps, _setComponentProps] = useState<Props>();\n const {\n contributions,\n dispatchViewAction,\n load,\n loadSession,\n onConfigChange,\n onEditTitle,\n purge,\n restoredState,\n save,\n saveSession,\n title,\n } = useView({\n id,\n rootRef,\n path,\n dropTargets,\n title: titleProp,\n });\n\n useViewResize({ mainRef, resize, rootRef });\n\n const setComponentProps = useCallback((props?: Props) => {\n _setComponentProps(props);\n }, []);\n\n const getContent = () => {\n if (React.isValidElement(children) && (restoredState || componentProps)) {\n return React.cloneElement(\n children,\n getProps(restoredState, componentProps)\n );\n }\n return children;\n };\n\n const viewContextValue: ViewContextAPI = useMemo(\n () => ({\n dispatch: dispatchViewAction,\n id,\n path,\n title,\n load,\n loadSession,\n onConfigChange,\n purge,\n save,\n saveSession,\n setComponentProps,\n }),\n [\n dispatchViewAction,\n id,\n load,\n loadSession,\n onConfigChange,\n path,\n purge,\n save,\n saveSession,\n setComponentProps,\n title,\n ]\n );\n\n const headerProps = typeof header === \"object\" ? header : {};\n\n return (\n <div\n {...restProps}\n className={cx(classBase, className, {\n [`${classBase}-collapsed`]: collapsed,\n [`${classBase}-expanded`]: expanded,\n [`${classBase}-resize-defer`]: resize === \"defer\",\n })}\n data-resizeable={resizeable}\n id={id}\n ref={useForkRef(forwardedRef, rootRef)}\n style={style}\n tabIndex={-1}\n >\n <ViewContext.Provider value={viewContextValue}>\n {header ? (\n <Header\n {...headerProps}\n collapsed={collapsed}\n contributions={contributions}\n expanded={expanded}\n closeable={closeable}\n onEditTitle={onEditTitle}\n orientation={orientation}\n tearOut={tearOut}\n title={title}\n />\n ) : null}\n <div className={`${classBase}-main`} ref={mainRef}>\n {getContent()}\n </div>\n </ViewContext.Provider>\n </div>\n );\n});\nView.displayName = \"View\";\n\ninterface ViewComponentType {\n (\n props: ViewProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n }\n ): ReactElement<ViewProps>;\n displayName?: string;\n}\n\nconst MemoView = React.memo(View) as ViewComponentType;\n\nMemoView.displayName = \"View\";\n\nregisterComponent(\"View\", MemoView, \"view\");\n\nexport { MemoView as View };\n", "import { RefObject, useCallback, useMemo } from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { useViewActionDispatcher } from \"./useViewActionDispatcher\";\n\nexport interface ViewHookProps {\n id: string;\n rootRef: RefObject<HTMLDivElement>;\n path?: string;\n dropTargets?: string[];\n title?: string;\n}\n\nexport const useView = ({\n id,\n rootRef,\n path,\n dropTargets,\n title: titleProp,\n}: ViewHookProps) => {\n const layoutDispatch = useLayoutProviderDispatch();\n\n const {\n loadState,\n loadSessionState,\n purgeState,\n saveState,\n saveSessionState,\n } = usePersistentState();\n\n const [dispatchViewAction, contributions] = useViewActionDispatcher(\n id,\n rootRef,\n path,\n dropTargets\n );\n\n const title = useMemo(\n () => loadState(\"view-title\") ?? titleProp,\n [loadState, titleProp]\n );\n\n const onEditTitle = useCallback(\n (title: string) => {\n if (path) {\n layoutDispatch({ type: \"set-title\", path, title });\n }\n },\n [layoutDispatch, path]\n );\n\n const restoredState = useMemo(() => loadState(id), [id, loadState]);\n\n const load = useCallback(\n (key?: string) => loadState(id, key),\n [id, loadState]\n );\n\n const purge = useCallback(\n (key) => {\n purgeState(id, key);\n layoutDispatch({ type: \"save\" });\n },\n [id, layoutDispatch, purgeState]\n );\n\n const save = useCallback(\n (state, key) => {\n saveState(id, key, state);\n layoutDispatch({ type: \"save\" });\n },\n [id, layoutDispatch, saveState]\n );\n const loadSession = useCallback(\n (key?: string) => loadSessionState(id, key),\n [id, loadSessionState]\n );\n const saveSession = useCallback(\n (state, key) => saveSessionState(id, key, state),\n [id, saveSessionState]\n );\n\n const onConfigChange = useCallback(\n ({ type: key, ...config }) => {\n const { [key]: data } = config;\n save(data, key);\n },\n [save]\n );\n\n return {\n contributions,\n dispatchViewAction,\n load,\n loadSession,\n onConfigChange,\n onEditTitle,\n purge,\n restoredState,\n save,\n saveSession,\n title,\n };\n};\n", "import { useResizeObserver, WidthHeight } from \"../responsive\";\nimport { RefObject, useCallback, useRef } from \"react\";\n\nconst NO_MEASUREMENT: string[] = [];\n\ntype size = {\n height?: number;\n width?: number;\n};\n\nexport interface ViewResizeHookProps {\n mainRef: RefObject<HTMLDivElement>;\n resize?: \"defer\" | \"responsive\";\n rootRef: RefObject<HTMLDivElement>;\n}\n\nexport const useViewResize = ({\n mainRef,\n resize = \"responsive\",\n rootRef,\n}: ViewResizeHookProps) => {\n const deferResize = resize === \"defer\";\n\n const mainSize = useRef<size>({});\n const resizeHandle = useRef<number>();\n\n const setMainSize = useCallback(() => {\n if (mainRef.current) {\n mainRef.current.style.height = mainSize.current.height + \"px\";\n mainRef.current.style.width = mainSize.current.width + \"px\";\n }\n resizeHandle.current = undefined;\n }, [mainRef]);\n\n const onResize = useCallback(\n ({ height, width }) => {\n mainSize.current.height = height;\n mainSize.current.width = width;\n if (resizeHandle.current !== null) {\n clearTimeout(resizeHandle.current);\n }\n resizeHandle.current = window.setTimeout(setMainSize, 40);\n },\n [setMainSize]\n );\n\n useResizeObserver(\n rootRef,\n deferResize ? WidthHeight : NO_MEASUREMENT,\n onResize,\n deferResize\n );\n};\n", "import React, { SyntheticEvent, useContext } from \"react\";\nimport { ViewAction } from \"./viewTypes\";\n\nexport type QueryReponse = { [key: string]: unknown };\n\nexport type ViewDispatch = <Action extends ViewAction = ViewAction>(\n action: Action,\n evt?: SyntheticEvent\n) => Promise<boolean | QueryReponse | void>;\n\n/**\n * This API is available to any Feature hosted within Vuu (as all Features are wrapped\n * with View component). It offers metadata about the View as well as access to the\n * Vuu persistencew API;\n */\nexport interface ViewContextAPI {\n /**\n * dispatcher for View actions. These are a subset of LayoutActions, specifically for\n * View manipulation\n */\n dispatch?: ViewDispatch | null;\n id?: string;\n load?: (key?: string) => unknown;\n loadSession?: (key?: string) => unknown;\n onConfigChange?: (config: unknown) => void;\n path?: string;\n purge?: (key: string) => void;\n save?: (state: unknown, key: string) => void;\n saveSession?: (state: unknown, key: string) => void;\n setComponentProps: (props: { [key: string]: unknown }) => void;\n title?: string;\n}\n\nconst NO_CONTEXT = { dispatch: null } as ViewContextAPI;\nexport const ViewContext = React.createContext<ViewContextAPI>(NO_CONTEXT);\n\nexport const useViewDispatch = () => {\n const context = useContext(ViewContext);\n return context?.dispatch ?? null;\n};\n\nexport const useViewContext = () => useContext(ViewContext);\n", "import { ApplicationJSON, LayoutJSON } from \"../layout-reducer\";\n\nexport const warningLayout: LayoutJSON = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport const loadingApplicationJson: Readonly<ApplicationJSON> = {\n layout: {\n type: \"Component\",\n id: \"loading-main\",\n props: {},\n },\n};\n\nexport const defaultApplicationJson: ApplicationJSON = {\n layout: {\n type: \"Stack\",\n id: \"main-tabs\",\n props: {\n className: \"vuuShell-mainTabs\",\n TabstripProps: {\n allowAddTab: true,\n allowCloseTab: true,\n allowRenameTab: true,\n animateSelectionThumb: false,\n location: \"main-tab\",\n tabClassName: \"MainTab\",\n },\n preserve: true,\n active: 0,\n },\n children: [\n {\n props: {\n id: \"tab1\",\n title: \"Tab 1\",\n className: \"vuuShell-Placeholder\",\n },\n type: \"Placeholder\",\n },\n ],\n },\n};\n", "import {\n Layout,\n LayoutMetadata,\n LayoutMetadataDto,\n WithId,\n} from \"@vuu-ui/vuu-shell\";\nimport {\n ApplicationJSON,\n LayoutJSON,\n LayoutPersistenceManager,\n} from \"@vuu-ui/vuu-layout\";\nimport { getLocalEntity, saveLocalEntity } from \"@vuu-ui/vuu-filters\";\nimport { formatDate, getUniqueId } from \"@vuu-ui/vuu-utils\";\n\nimport { defaultApplicationJson } from \"./defaultApplicationJson\";\n\nconst metadataSaveLocation = \"layouts/metadata\";\nconst layoutsSaveLocation = \"layouts/layouts\";\n\nexport class LocalLayoutPersistenceManager implements LayoutPersistenceManager {\n #urlKey = \"api/vui\";\n constructor(urlKey?: string) {\n if (urlKey) {\n this.#urlKey = urlKey;\n }\n }\n createLayout(\n metadata: LayoutMetadataDto,\n layout: LayoutJSON\n ): Promise<LayoutMetadata> {\n return new Promise((resolve) => {\n Promise.all([this.loadLayouts(), this.loadMetadata()]).then(\n ([existingLayouts, existingMetadata]) => {\n const id = getUniqueId();\n const newMetadata: LayoutMetadata = {\n ...metadata,\n id,\n created: formatDate(\"dd.mm.yyyy\")(new Date()),\n };\n\n this.saveLayoutsWithMetadata(\n [...existingLayouts, { id, json: layout }],\n [...existingMetadata, newMetadata]\n );\n resolve(newMetadata);\n }\n );\n });\n }\n\n updateLayout(\n id: string,\n newMetadata: LayoutMetadataDto,\n newLayout: LayoutJSON\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n this.validateIds(id)\n .then(() => Promise.all([this.loadLayouts(), this.loadMetadata()]))\n .then(([existingLayouts, existingMetadata]) => {\n const updatedLayouts = existingLayouts.map((layout) =>\n layout.id === id ? { ...layout, json: newLayout } : layout\n );\n const updatedMetadata = existingMetadata.map((metadata) =>\n metadata.id === id ? { ...metadata, ...newMetadata } : metadata\n );\n this.saveLayoutsWithMetadata(updatedLayouts, updatedMetadata);\n resolve();\n })\n .catch((e) => reject(e));\n });\n }\n\n deleteLayout(id: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.validateIds(id)\n .then(() => Promise.all([this.loadLayouts(), this.loadMetadata()]))\n .then(([existingLayouts, existingMetadata]) => {\n const layouts = existingLayouts.filter((layout) => layout.id !== id);\n const metadata = existingMetadata.filter(\n (metadata) => metadata.id !== id\n );\n this.saveLayoutsWithMetadata(layouts, metadata);\n resolve();\n })\n .catch((e) => reject(e));\n });\n }\n\n loadLayout(id: string): Promise<LayoutJSON> {\n return new Promise((resolve, reject) => {\n this.validateId(id, \"layout\")\n .then(() => this.loadLayouts())\n .then((existingLayouts) => {\n const foundLayout = existingLayouts.find(\n (layout) => layout.id === id\n );\n if (foundLayout) {\n resolve(foundLayout.json);\n } else {\n reject(new Error(`no layout found matching id ${id}`));\n }\n })\n .catch((e) => reject(e));\n });\n }\n\n loadMetadata(): Promise<LayoutMetadata[]> {\n return new Promise((resolve) => {\n const metadata = getLocalEntity<LayoutMetadata[]>(metadataSaveLocation);\n resolve(metadata || []);\n });\n }\n\n loadApplicationJSON(): Promise<ApplicationJSON> {\n return new Promise((resolve) => {\n const applicationJSON = getLocalEntity<ApplicationJSON>(this.#urlKey);\n if (applicationJSON) {\n resolve(applicationJSON);\n } else {\n resolve(defaultApplicationJson);\n }\n });\n }\n\n saveApplicationJSON(applicationJSON: ApplicationJSON): Promise<void> {\n return new Promise((resolve, reject) => {\n const savedLayout = saveLocalEntity<ApplicationJSON>(\n this.#urlKey,\n applicationJSON\n );\n if (savedLayout) {\n resolve();\n } else {\n reject(new Error(\"Application Json failed to save\"));\n }\n });\n }\n\n private loadLayouts(): Promise<Layout[]> {\n return new Promise((resolve) => {\n const layouts = getLocalEntity<Layout[]>(layoutsSaveLocation);\n resolve(layouts || []);\n });\n }\n\n private saveLayoutsWithMetadata(\n layouts: Layout[],\n metadata: LayoutMetadata[]\n ): void {\n saveLocalEntity<Layout[]>(layoutsSaveLocation, layouts);\n saveLocalEntity<LayoutMetadata[]>(metadataSaveLocation, metadata);\n }\n\n // Ensures that there is exactly one Layout entry and exactly one Metadata\n // entry in local storage corresponding to the provided ID.\n private async validateIds(id: string): Promise<void> {\n return Promise.all([\n this.validateId(id, \"metadata\").catch((error) => error.message),\n this.validateId(id, \"layout\").catch((error) => error.message),\n ]).then((errorMessages: string[]) => {\n // filter() is used to remove any blank messages before joining.\n // Avoids orphaned delimiters in combined messages, e.g. \"; \" or \"; error 2\"\n const combinedMessage = errorMessages\n .filter((msg) => msg !== undefined)\n .join(\"; \");\n if (combinedMessage) {\n throw new Error(combinedMessage);\n }\n });\n }\n\n // Ensures that there is exactly one element (Layout or Metadata) in local\n // storage corresponding to the provided ID.\n private validateId(\n id: string,\n dataType: \"metadata\" | \"layout\"\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const loadFunc =\n dataType === \"metadata\" ? this.loadMetadata : this.loadLayouts;\n\n loadFunc().then((array: WithId[]) => {\n const count = array.filter((element) => element.id === id).length;\n switch (count) {\n case 1: {\n resolve();\n break;\n }\n case 0: {\n reject(new Error(`No ${dataType} with ID ${id}`));\n break;\n }\n default:\n reject(new Error(`Non-unique ${dataType} with ID ${id}`));\n }\n });\n });\n }\n}\n", "import { LayoutMetadata, LayoutMetadataDto } from \"@vuu-ui/vuu-shell\";\nimport { LayoutPersistenceManager } from \"./LayoutPersistenceManager\";\nimport { ApplicationJSON, LayoutJSON } from \"../layout-reducer\";\n\nconst baseURL = process.env.LAYOUT_BASE_URL;\nconst metadataSaveLocation = \"layouts/metadata\";\nconst layoutsSaveLocation = \"layouts\";\nconst applicationLayoutsSaveLocation = \"application-layouts\";\n\nexport type CreateLayoutResponseDto = { metadata: LayoutMetadata };\nexport type GetLayoutResponseDto = { definition: LayoutJSON };\nexport type GetApplicationResponseDto = { definition: ApplicationJSON };\n\nexport class RemoteLayoutPersistenceManager\n implements LayoutPersistenceManager\n{\n createLayout(\n metadata: LayoutMetadataDto,\n layout: LayoutJSON\n ): Promise<LayoutMetadata> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({\n metadata,\n definition: layout,\n }),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then(({ metadata }: CreateLayoutResponseDto) => {\n if (!metadata) {\n reject(new Error(\"Response did not contain valid metadata\"));\n }\n resolve(metadata);\n });\n })\n .catch((error: Error) => {\n reject(error);\n })\n );\n }\n\n updateLayout(\n id: string,\n metadata: LayoutMetadataDto,\n newLayoutJson: LayoutJSON\n ): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"PUT\",\n body: JSON.stringify({\n metadata,\n layout: newLayoutJson,\n }),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n })\n );\n }\n\n deleteLayout(id: string): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"DELETE\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n })\n );\n }\n\n loadLayout(id: string): Promise<LayoutJSON> {\n return new Promise((resolve, reject) => {\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"GET\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then(({ definition }: GetLayoutResponseDto) => {\n if (!definition) {\n reject(new Error(\"Response did not contain a valid layout\"));\n }\n resolve(definition);\n });\n })\n .catch((error: Error) => {\n reject(error);\n });\n });\n }\n\n loadMetadata(): Promise<LayoutMetadata[]> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${metadataSaveLocation}`, {\n method: \"GET\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then((metadata: LayoutMetadata[]) => {\n if (!metadata) {\n reject(new Error(\"Response did not contain valid metadata\"));\n }\n resolve(metadata);\n });\n })\n .catch((error: Error) => {\n reject(error);\n })\n );\n }\n\n saveApplicationJSON(applicationJSON: ApplicationJSON): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n username: \"vuu-user\",\n },\n body: JSON.stringify(applicationJSON),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n })\n );\n }\n\n loadApplicationJSON(): Promise<ApplicationJSON> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {\n method: \"GET\",\n headers: {\n username: \"vuu-user\",\n },\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then((applicationJSON: GetApplicationResponseDto) => {\n if (!applicationJSON) {\n reject(\n new Error(\n \"Response did not contain valid application layout information\"\n )\n );\n }\n resolve(applicationJSON.definition);\n });\n })\n .catch((error: Error) => {\n reject(error);\n })\n );\n }\n}\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\n// import { UserProfile } from \"../user-profile\";\n// import { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\nimport { Toolbar } from \"@vuu-ui/vuu-layout\";\nimport { logout } from \"../login\";\n\nimport \"./AppHeader.css\";\nimport { Button } from \"@salt-ds/core\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp);\n // const handleSwitchTheme = useCallback(\n // (mode: ThemeMode) => onSwitchTheme?.(mode),\n // [onSwitchTheme]\n // );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\n height={36}\n showSeparators\n {...htmlAttributes}\n >\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n Help\n </Button>\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n History <span data-icon=\"history\" />\n </Button>\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n View <span data-icon=\"settings\" />\n </Button>\n <Button\n className={`${classBase}-menuItem`}\n onClick={handleLogout}\n variant=\"secondary\"\n >\n Log out\n </Button>\n {/* <ThemeSwitch\n data-align=\"right\"\n defaultMode={themeMode}\n onChange={handleSwitchTheme}\n /> */}\n {/* <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n /> */}\n </Toolbar>\n );\n};\n", "import {\n ChangeEvent,\n HTMLAttributes,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { Button, FormField, FormFieldLabel } from \"@salt-ds/core\";\nimport { VuuInput } from \"@vuu-ui/vuu-ui-controls\";\nimport { VuuLogo } from \"./VuuLogo\";\nimport cx from \"classnames\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n appName?: string;\n onSubmit: (username: string, password?: string) => void;\n requirePassword?: boolean;\n}\n\nexport const LoginPanel = ({\n appName = \"Demo App\",\n className,\n requirePassword = true,\n onSubmit,\n ...htmlAttributes\n}: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (evt: ChangeEvent<HTMLInputElement>) => {\n setUserName(evt.target.value);\n };\n\n const handlePassword = (evt: ChangeEvent<HTMLInputElement>) => {\n setPassword(evt.target.value);\n };\n\n const handleCommitName = useCallback(() => {\n if (!requirePassword) {\n onSubmit(username);\n }\n }, [onSubmit, requirePassword, username]);\n\n const handleCommitPassword = useCallback(() => {\n if (username) {\n onSubmit(username, password);\n }\n }, [onSubmit, password, username]);\n\n const dataIsValid =\n username.trim() !== \"\" &&\n (requirePassword === false || password.trim() !== \"\");\n\n useEffect(() => {\n console.log(`inputRef`, {\n input: inputRef.current,\n });\n inputRef.current?.focus();\n }, []);\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <div className={`${classBase}-branding`}>\n <VuuLogo />\n <div className={`${classBase}-appName`}>{appName}</div>\n </div>\n <div className={`${classBase}-form`}>\n <div className={`${classBase}-title`}>Welcome Back</div>\n <FormField>\n <FormFieldLabel>Username</FormFieldLabel>\n <VuuInput\n value={username}\n id=\"text-username\"\n inputRef={inputRef}\n onChange={handleUsername}\n onCommit={handleCommitName}\n />\n </FormField>\n\n {requirePassword ? (\n <FormField>\n <FormFieldLabel>Password</FormFieldLabel>\n <VuuInput\n className={`${classBase}-password`}\n inputProps={{\n type: \"password\",\n }}\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n onCommit={handleCommitPassword}\n endAdornment={\n <span data-icon=\"eye\" style={{ cursor: \"pointer\" }} />\n }\n />\n </FormField>\n ) : null}\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n </div>\n );\n};\n", "import { useMemo } from \"react\";\n\nexport const VuuLogo = () => {\n const logo = useMemo(\n () => (\n <svg\n width=\"184\"\n height=\"90\"\n viewBox=\"0 0 184 90\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_1173_59965)\">\n <path\n d=\"M77.0775 31.1019L69.4572 15.1795L66.3997 13.7093L47.6353 44.165L75.7224 61.2361L81.8124 51.2694L77.0775 31.1019Z\"\n fill=\"url(#paint0_linear_1173_59965)\"\n />\n <path\n d=\"M82.4101 49.7431C81.0488 51.8314 79.1993 53.648 76.8897 54.9809C74.2954 56.4792 71.4601 57.194 68.6623 57.194C63.3422 57.194 58.1597 54.6188 55.0209 49.971L30.5358 7.8193L30.5232 7.84116C25.8791 0.274825 16.0118 -2.26289 8.27258 2.21011C0.411306 6.74866 -2.26753 16.7872 2.28587 24.625L35.5054 81.8189C36.9856 84.3691 39.0542 86.3668 41.4358 87.7527C41.4545 87.7652 41.4733 87.7777 41.4921 87.7902C41.5015 87.7964 41.514 87.8027 41.5234 87.8089C42.6312 88.4457 43.8079 88.942 45.0253 89.3072C45.116 89.3353 45.2099 89.3634 45.3007 89.3883C45.7388 89.5101 46.1801 89.6193 46.6276 89.7067C46.7121 89.7223 46.7966 89.7317 46.8811 89.7473C47.241 89.8097 47.604 89.8628 47.967 89.9003C48.111 89.9159 48.2549 89.9315 48.3989 89.9408C48.8151 89.9752 49.2313 89.997 49.6507 90.0001C49.6726 90.0001 49.6945 90.0001 49.7132 90.0001C49.7195 90.0001 49.7226 90.0001 49.7289 90.0001C49.7352 90.0001 49.7383 90.0001 49.7445 90.0001C50.1983 90.0001 50.6552 89.9752 51.109 89.9377C51.2123 89.9283 51.3155 89.919 51.422 89.9065C51.8663 89.8597 52.3107 89.8004 52.7551 89.7192C52.7614 89.7192 52.7676 89.7192 52.7739 89.7192C53.2621 89.6287 53.7503 89.5101 54.2322 89.3727C54.2635 89.3634 54.2917 89.354 54.323 89.3446C55.024 89.1418 55.7156 88.8889 56.3978 88.5861C56.4104 88.5799 56.426 88.5736 56.4385 88.5674C56.958 88.3364 57.4712 88.0836 57.9751 87.7933C58.4852 87.4999 58.9703 87.1815 59.4334 86.8413C59.8371 86.5478 60.2252 86.2357 60.6039 85.9048C61.0639 85.499 61.4989 85.0745 61.9026 84.6282C62.2062 84.2942 62.4972 83.9446 62.7757 83.5825C62.8665 83.4639 62.951 83.3421 63.0355 83.2235C63.2264 82.9613 63.4079 82.6929 63.5831 82.4182C63.6739 82.2746 63.7646 82.1342 63.8523 81.9906C63.8867 81.9344 63.9242 81.8813 63.9555 81.8251L82.5854 49.7525H82.4039L82.4101 49.7431Z\"\n fill=\"url(#paint1_linear_1173_59965)\"\n />\n <path\n d=\"M82.8264 32.8436L81.4181 30.4464L75.3375 19.1687L72.5178 14.3929C71.9858 13.1225 70.7309 12.2266 69.26 12.2266C67.3104 12.2266 65.7331 13.8029 65.7331 15.7445C65.7331 16.4031 65.924 17.0086 66.2401 17.5362L66.2025 17.5611L77.1557 36.1617C78.4764 38.4372 78.83 41.0873 78.1509 43.6281C77.4718 46.169 75.8445 48.2915 73.5631 49.6119C72.0609 50.4797 70.3553 50.9385 68.6341 50.9385C65.1166 50.9385 61.84 49.0563 60.0812 46.0285L44.3368 19.2654H44.3681L37.7179 7.81917L37.7054 7.84102C37.5896 7.65061 37.455 7.47893 37.333 7.29477L37.1452 6.97326C37.1452 6.97326 37.1296 6.98262 37.1233 6.98887C34.0001 2.55332 29.0054 0.0780356 23.8512 0.0187285V0H15.3515V0.0436999C21.2881 -0.368328 27.2247 2.46593 30.5232 7.84102L30.5357 7.81917L55.0177 49.974C58.1566 54.6187 63.3422 57.197 68.6592 57.197C71.4569 57.197 74.2922 56.4853 76.8866 54.9839C79.1961 53.651 81.0425 51.8312 82.407 49.7461H82.5885L82.5259 49.8523C83.399 48.4695 84.0687 46.9462 84.5006 45.3231C85.6304 41.0904 85.042 36.6705 82.8201 32.8467L82.8264 32.8436Z\"\n fill=\"#F37880\"\n />\n <g opacity=\"0.86\">\n <path\n d=\"M66.1994 17.5642L77.1526 36.1648C78.4732 38.4403 78.8269 41.0904 78.1478 43.6313C77.7347 45.1795 76.9648 46.5716 75.9133 47.7234C77.2903 46.4686 78.2823 44.8486 78.7737 43.007C79.4527 40.4661 79.0991 37.816 77.7785 35.5405L66.8253 16.94L66.8628 16.915C66.5467 16.3875 66.3558 15.7819 66.3558 15.1233C66.3558 14.3117 66.6344 13.5657 67.0975 12.9695C66.2651 13.6125 65.7299 14.6176 65.7299 15.7476C65.7299 16.4062 65.9208 17.0118 66.2369 17.5393L66.1994 17.5642Z\"\n fill=\"white\"\n />\n <path\n d=\"M82.5382 49.8335L82.5291 49.8487C82.5291 49.8487 82.5352 49.8365 82.5413 49.8304C82.5413 49.8304 82.5413 49.8304 82.5413 49.8335H82.5382Z\"\n fill=\"white\"\n />\n <path\n d=\"M77.5156 54.3596C74.9213 55.8579 72.0859 56.5727 69.2882 56.5727C63.9681 56.5727 58.7856 53.9975 55.6467 49.3497L31.1616 7.19488L31.1491 7.21673C28.9053 3.56154 25.4441 1.08626 21.5917 0H15.3515V0.0436999C21.2881 -0.368328 27.2247 2.46593 30.5232 7.84102L30.5357 7.81917L55.0177 49.974C58.1566 54.6187 63.3422 57.197 68.6592 57.197C71.4569 57.197 74.2922 56.4853 76.8866 54.9839C78.2698 54.1848 79.4809 53.2109 80.5293 52.1122C79.6311 52.9581 78.6266 53.7166 77.5125 54.3596H77.5156Z\"\n fill=\"white\"\n />\n </g>\n </g>\n <path\n d=\"M117.046 58.661C116.362 58.661 115.792 58.509 115.336 58.205C114.906 57.8757 114.551 57.3943 114.272 56.761L104.354 34.493C104.076 33.8597 104 33.3023 104.126 32.821C104.253 32.3397 104.519 31.9597 104.924 31.681C105.33 31.4023 105.811 31.263 106.368 31.263C107.103 31.263 107.648 31.4277 108.002 31.757C108.382 32.061 108.699 32.5297 108.952 33.163L117.958 54.025H116.324L125.292 33.125C125.571 32.517 125.9 32.061 126.28 31.757C126.66 31.4277 127.192 31.263 127.876 31.263C128.434 31.263 128.89 31.4023 129.244 31.681C129.624 31.9597 129.865 32.3397 129.966 32.821C130.068 33.3023 129.979 33.8597 129.7 34.493L119.782 56.761C119.504 57.3943 119.149 57.8757 118.718 58.205C118.313 58.509 117.756 58.661 117.046 58.661Z\"\n fill=\"white\"\n />\n <path\n d=\"M144.63 58.737C142.781 58.737 141.147 58.4963 139.728 58.015C138.335 57.5337 137.157 56.8243 136.194 55.887C135.232 54.9243 134.51 53.7337 134.028 52.315C133.547 50.8963 133.306 49.2497 133.306 47.375V33.733C133.306 32.897 133.509 32.2763 133.914 31.871C134.345 31.4657 134.953 31.263 135.738 31.263C136.524 31.263 137.119 31.4657 137.524 31.871C137.955 32.2763 138.17 32.897 138.17 33.733V47.337C138.17 49.7437 138.715 51.555 139.804 52.771C140.919 53.9617 142.528 54.557 144.63 54.557C146.733 54.557 148.329 53.9617 149.418 52.771C150.508 51.555 151.052 49.7437 151.052 47.337V33.733C151.052 32.897 151.255 32.2763 151.66 31.871C152.091 31.4657 152.699 31.263 153.484 31.263C154.244 31.263 154.827 31.4657 155.232 31.871C155.663 32.2763 155.878 32.897 155.878 33.733V47.375C155.878 49.8577 155.448 51.9477 154.586 53.645C153.75 55.3423 152.496 56.6217 150.824 57.483C149.152 58.319 147.088 58.737 144.63 58.737Z\"\n fill=\"white\"\n />\n <path\n d=\"M172.685 58.737C170.836 58.737 169.202 58.4963 167.783 58.015C166.39 57.5337 165.212 56.8243 164.249 55.887C163.286 54.9243 162.564 53.7337 162.083 52.315C161.602 50.8963 161.361 49.2497 161.361 47.375V33.733C161.361 32.897 161.564 32.2763 161.969 31.871C162.4 31.4657 163.008 31.263 163.793 31.263C164.578 31.263 165.174 31.4657 165.579 31.871C166.01 32.2763 166.225 32.897 166.225 33.733V47.337C166.225 49.7437 166.77 51.555 167.859 52.771C168.974 53.9617 170.582 54.557 172.685 54.557C174.788 54.557 176.384 53.9617 177.473 52.771C178.562 51.555 179.107 49.7437 179.107 47.337V33.733C179.107 32.897 179.31 32.2763 179.715 31.871C180.146 31.4657 180.754 31.263 181.539 31.263C182.299 31.263 182.882 31.4657 183.287 31.871C183.718 32.2763 183.933 32.897 183.933 33.733V47.375C183.933 49.8577 183.502 51.9477 182.641 53.645C181.805 55.3423 180.551 56.6217 178.879 57.483C177.207 58.319 175.142 58.737 172.685 58.737Z\"\n fill=\"white\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_1173_59965\"\n x1=\"47.6353\"\n y1=\"37.4727\"\n x2=\"81.8124\"\n y2=\"37.4727\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#4906A5\" />\n <stop offset=\"1\" stopColor=\"#D3423A\" />\n </linearGradient>\n <linearGradient\n id=\"paint1_linear_1173_59965\"\n x1=\"0.0670626\"\n y1=\"45.0017\"\n x2=\"82.5916\"\n y2=\"45.0017\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#7C06A5\" />\n <stop offset=\"1\" stopColor=\"#D3423A\" />\n </linearGradient>\n <clipPath id=\"clip0_1173_59965\">\n <rect\n width=\"85\"\n height=\"90\"\n fill=\"white\"\n transform=\"translate(0.0670471)\"\n />\n </clipPath>\n </defs>\n </svg>\n ),\n []\n );\n\n return logo;\n};\n", "import { getCookieValue } from \"@vuu-ui/vuu-utils\";\n\nexport const getAuthModeFromCookies = (): string => {\n const mode = getCookieValue(\"vuu-auth-mode\") as string;\n return mode ?? \"\";\n};\n\nexport const getAuthDetailsFromCookies = (): [string, string] => {\n const username = getCookieValue(\"vuu-username\") as string;\n const token = getCookieValue(\"vuu-auth-token\") as string;\n return [username, token];\n};\n\nconst getDefaultLoginUrl = () => {\n const authMode = getAuthModeFromCookies();\n return authMode === \"login\" ? \"login.html\" : \"demo.html\";\n};\n\nexport const redirectToLogin = (loginUrl = getDefaultLoginUrl()) => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import React, { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport './ConnectionStatusIcon.css';\n\ntype connectionStatus = 'connected' | 'reconnected' | 'connecting' | 'disconnected';\n\ninterface ConnectionStatusProps {\n\tconnectionStatus: connectionStatus\n\tclassName?: string;\n\tprops?: unknown;\n\telement?: string;\n}\n\nexport const ConnectionStatusIcon = ({ connectionStatus, className, element = 'span', ...props}: ConnectionStatusProps) => {\n\tconst [classBase, setClassBase] = useState<string>('vuuConnectingStatus');\n\tuseEffect(() => {\n\t\tswitch(connectionStatus) {\n\t\t\tcase 'connected':\n\t\t\tcase 'reconnected':\n\t\t\t\tsetClassBase('vuuActiveStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'connecting':\n\t\t\t\tsetClassBase('vuuConnectingStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'disconnected':\n\t\t\t\tsetClassBase('vuuDisconnectedStatus');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}, [connectionStatus]);\n\n\tconst statusIcon = React.createElement (\n\t\telement,\n\t\t{\n\t\t\t...props,\n\t\t\tclassName: cx('vuuStatus vuuIcon', classBase, className)\n\t\t},\n\t)\n\n\treturn (\n\t\t<>\n\t\t\t<div className='vuuStatus-container salt-theme'>\n\t\t\t\t{statusIcon}\n\t\t\t\t<div\tclassName='vuuStatus-text'>Status: {connectionStatus.toUpperCase()}</div>\n\t\t\t</div>\n\t\t</>\n\t)\n}", "import { Dropdown } from \"@salt-ds/lab\";\nimport { Density } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport cx from \"classnames\";\n\nconst classBase = \"vuuDensitySwitch\";\n\nconst densities: Density[] = [\"high\", \"medium\", \"low\", \"touch\"];\nconst DEFAULT_DENSITY = \"high\";\n\nexport interface DensitySwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultDensity?: Density;\n density?: Density;\n onChange: (density: Density) => void;\n}\n\nexport const DensitySwitch = ({\n className: classNameProp,\n defaultDensity = DEFAULT_DENSITY,\n onChange,\n}: DensitySwitchProps) => {\n const handleSelectionChange = useCallback(\n (_event, selectedItem) => {\n onChange(selectedItem);\n },\n [onChange]\n );\n\n const className = cx(classBase, classNameProp);\n\n return (\n <Dropdown<Density>\n className={className}\n source={densities}\n defaultSelected={defaultDensity}\n onSelectionChange={handleSelectionChange}\n />\n );\n};\n", "import React, { Suspense, useEffect } from \"react\";\nimport { registerComponent, ViewProps } from \"@vuu-ui/vuu-layout\";\nimport { FeatureErrorBoundary } from \"./FeatureErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\n/**\n * Ensure we never lazy load the same component more than once\n */\nconst componentsMap = new Map<string, ReturnType<typeof React.lazy>>();\nconst useCachedFeature = (url: string) => {\n useEffect(\n () => () => {\n componentsMap.delete(url);\n },\n [url]\n );\n\n if (!componentsMap.has(url)) {\n componentsMap.set(\n url,\n React.lazy(() => import(/* @vite-ignore */ url))\n );\n }\n\n const lazyFeature = componentsMap.get(url);\n\n if (!lazyFeature) {\n throw Error(`Unable to load Lazy Feature at url ${url}`);\n } else {\n return lazyFeature;\n }\n};\n\nexport interface FeatureProps<P extends object | undefined = any> {\n /**\n props that will be passed to the lazily loaded component.\n */\n ComponentProps?: P;\n ViewProps?: Partial<Pick<ViewProps, \"closeable\" | \"header\">>;\n css?: string;\n height?: number;\n title?: string;\n /** \n The url of javascript bundle to lazily load. Bundle must provide a default export\n and that export must be a React component.\n */\n url: string;\n width?: number;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n ComponentProps: params,\n ...props\n}: FeatureProps<Params>) {\n // useEffect(() => {\n // console.log(\"%cFeature mount\", \"color: green;\");\n // return () => {\n // console.log(\"%cFeature unmount\", \"color:red;\");\n // };\n // }, []);\n\n if (css) {\n // import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n // (cssModule) => {\n // console.log(\"%cInject Styles\", \"color: blue;font-weight: bold\");\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // cssModule.default,\n // ];\n // }\n // );\n // Polyfill until cypress build supports import assertions\n // Note: already fully supported in esbuild and vite\n importCSS(css).then((styleSheet) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n styleSheet,\n ];\n });\n }\n\n const LazyFeature = useCachedFeature(url);\n return (\n <FeatureErrorBoundary url={url}>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </FeatureErrorBoundary>\n );\n}\n\n/**\n Feature is a wrapper around React Lazy Loading. It will load a component\n from the given url. That url must resolve to a javascript bundle with a\n single default export. That export must be a React component.\n */\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React, { ErrorInfo, ReactNode } from \"react\";\nimport { FeatureProps } from \"./Feature\";\n\nexport interface FeatureErrorBoundaryProps extends FeatureProps {\n children: ReactNode;\n}\n\nexport class FeatureErrorBoundary extends React.Component<\n FeatureErrorBoundaryProps,\n any\n> {\n constructor(props: FeatureErrorBoundaryProps) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // You can also log the error to an error reporting service\n console.log(`error creating component at ${this.props.url}`);\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>An error occured while creating component.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\"></div>;\n", "export const importCSS = async (path: string) => {\n const container = new CSSStyleSheet();\n return fetch(path)\n .then((x) => x.text())\n .then((x) => container.replace(x));\n};\n", "import { ChangeEvent, useEffect, useState } from \"react\";\nimport { Input, Button, FormField, FormFieldLabel, Text } from \"@salt-ds/core\";\nimport { ComboBox, Checkbox, RadioButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { takeScreenshot } from \"@vuu-ui/vuu-utils\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\n\nimport \"./SaveLayoutPanel.css\";\n\nconst classBase = \"saveLayoutPanel\";\nconst formField = `${classBase}-formField`;\n\nconst groups = [\"Group 1\", \"Group 2\", \"Group 3\", \"Group 4\", \"Group 5\"];\n\nconst checkboxValues = [\"Value 1\", \"Value 2\", \"Value 3\"];\n\nconst radioValues = [\"Value 1\", \"Value 2\", \"Value 3\"] as const;\n\ntype RadioValue = (typeof radioValues)[number];\n\ntype SaveLayoutPanelProps = {\n componentId?: string;\n defaultTitle?: string;\n onCancel: () => void;\n onSave: (layoutMetadata: LayoutMetadataDto) => void;\n};\n\nexport const SaveLayoutPanel = (props: SaveLayoutPanelProps) => {\n const { defaultTitle = \"\", onCancel, onSave, componentId } = props;\n\n const [layoutName, setLayoutName] = useState<string>(defaultTitle);\n const [group, setGroup] = useState<string>(\"\");\n const [checkValues, setCheckValues] = useState<string[]>([]);\n const [radioValue, setRadioValue] = useState<RadioValue>(radioValues[0]);\n const [screenshot, setScreenshot] = useState<string | undefined>();\n\n useEffect(() => {\n if (componentId) {\n takeScreenshot(document.getElementById(componentId) as HTMLElement).then(\n (screenshot) => setScreenshot(screenshot)\n );\n }\n }, [componentId]);\n\n const handleSubmit = () => {\n onSave({\n name: layoutName,\n group,\n screenshot: screenshot ?? \"\",\n user: \"User\",\n });\n };\n\n return (\n <div className={`${classBase}-panelContainer`}>\n <div className={`${classBase}-panelContent`}>\n <div className={`${classBase}-formContainer`}>\n <FormField className={formField}>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n source={groups}\n allowFreeText\n InputProps={{\n inputProps: {\n className: `${classBase}-inputText`,\n placeholder: \"Select Group or Enter New Name\",\n onChange: (event: ChangeEvent<HTMLInputElement>) =>\n setGroup(event.target.value),\n },\n }}\n width=\"100%\"\n onSelectionChange={(_, value) => setGroup(value || \"\")}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n inputProps={{\n className: `${classBase}-inputText`,\n placeholder: \"Enter Layout Name\",\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setLayoutName(event.target.value)\n }\n value={layoutName}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {checkboxValues.map((value, i) => (\n <Checkbox\n key={i}\n onToggle={() =>\n setCheckValues((prev) =>\n prev.includes(value)\n ? prev.filter((entry) => entry !== value)\n : [...prev, value]\n )\n }\n checked={checkValues.includes(value)}\n label={value}\n />\n ))}\n </div>\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {radioValues.map((value, i) => (\n <RadioButton\n key={i}\n onClick={() => setRadioValue(value)}\n checked={radioValue === value}\n label={value}\n groupName=\"radioGroup\"\n />\n ))}\n </div>\n </FormField>\n </div>\n <div className={`${classBase}-screenshotContainer`}>\n {screenshot ? (\n <img\n className={`${classBase}-screenshot`}\n src={screenshot}\n alt=\"screenshot of current layout\"\n />\n ) : (\n <Text className=\"screenshot\">No screenshot available</Text>\n )}\n </div>\n </div>\n <div className={`${classBase}-buttonsContainer`}>\n <Button className={`${classBase}-cancelButton`} onClick={onCancel}>\n Cancel\n </Button>\n <Button\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n", "import { HTMLAttributes } from \"react\";\nimport { List } from \"@vuu-ui/vuu-ui-controls\";\nimport { LayoutMetadata } from \"./layoutTypes\";\nimport { useLayoutManager } from \"./useLayoutManager\";\n\nimport \"./LayoutList.css\";\n\ntype LayoutGroups = {\n [groupName: string]: LayoutMetadata[];\n};\n\nconst classBase = \"vuuLayoutList\";\n\nexport const LayoutsList = (props: HTMLAttributes<HTMLDivElement>) => {\n const { layoutMetadata, loadLayoutById } = useLayoutManager();\n\n const handleLoadLayout = (layoutId?: string) => {\n if (layoutId) {\n loadLayoutById(layoutId);\n }\n };\n\n const layoutsByGroup = layoutMetadata.reduce((acc: LayoutGroups, cur) => {\n if (acc[cur.group]) {\n return {\n ...acc,\n [cur.group]: [...acc[cur.group], cur],\n };\n }\n return {\n ...acc,\n [cur.group]: [cur],\n };\n }, {});\n\n return (\n <div className={classBase} {...props}>\n <div className={`${classBase}-header`}>My Layouts</div>\n <List<[string, LayoutMetadata[]]>\n height=\"auto\"\n source={Object.entries(layoutsByGroup)}\n ListItem={({ item }) => {\n if (!item) return <></>;\n const [groupName, layoutMetadata] = item;\n return (\n <>\n <div className={`${classBase}-groupName`}>{groupName}</div>\n {layoutMetadata.map((metadata) => (\n <div\n className={`${classBase}-layoutContainer`}\n key={metadata?.id}\n onClick={() => handleLoadLayout(metadata?.id)}\n >\n <img\n className={`${classBase}-screenshot`}\n src={metadata?.screenshot}\n />\n <div>\n <div className={`${classBase}-layoutName`}>\n {metadata?.name}\n </div>\n <div className={`${classBase}-layoutDetails`}>\n <div>{`${metadata?.user}, ${metadata?.created}`}</div>\n </div>\n </div>\n </div>\n ))}\n </>\n );\n }}\n />\n </div>\n );\n};\n", "import React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n ApplicationJSON,\n ApplicationSettings,\n loadingApplicationJson,\n LayoutJSON,\n LayoutPersistenceManager,\n LocalLayoutPersistenceManager,\n RemoteLayoutPersistenceManager,\n resolveJSONPath,\n defaultApplicationJson,\n ApplicationSetting,\n} from \"@vuu-ui/vuu-layout\";\nimport { NotificationLevel, useNotifications } from \"@vuu-ui/vuu-popups\";\nimport { LayoutMetadata, LayoutMetadataDto } from \"./layoutTypes\";\n\nlet _persistenceManager: LayoutPersistenceManager;\n\nconst getPersistenceManager = () => {\n if (_persistenceManager === undefined) {\n _persistenceManager = process.env.LOCAL\n ? new LocalLayoutPersistenceManager()\n : new RemoteLayoutPersistenceManager();\n }\n return _persistenceManager;\n};\n\nexport const LayoutManagementContext = React.createContext<{\n layoutMetadata: LayoutMetadata[];\n saveLayout: (n: LayoutMetadataDto) => void;\n applicationJson: ApplicationJSON;\n saveApplicationLayout: (layout: LayoutJSON) => void;\n getApplicationSettings: (\n key?: keyof ApplicationSettings\n ) => ApplicationSettings | ApplicationSetting | undefined;\n saveApplicationSettings: (\n settings: ApplicationSettings | ApplicationSetting,\n key?: keyof ApplicationSettings\n ) => void;\n loadLayoutById: (id: string) => void;\n}>({\n getApplicationSettings: () => undefined,\n layoutMetadata: [],\n saveLayout: () => undefined,\n // The default Application JSON will be served if no LayoutManagementProvider\n applicationJson: defaultApplicationJson,\n saveApplicationLayout: () => undefined,\n saveApplicationSettings: () => undefined,\n loadLayoutById: () => undefined,\n});\n\ntype LayoutManagementProviderProps = {\n children: JSX.Element | JSX.Element[];\n};\n\nconst ensureLayoutHasTitle = (\n layout: LayoutJSON,\n layoutMetadata: LayoutMetadataDto\n) => {\n if (layout.props?.title !== undefined) {\n return layout;\n } else {\n return {\n ...layout,\n props: {\n ...layout.props,\n title: layoutMetadata.name,\n },\n };\n }\n};\n\nexport const LayoutManagementProvider = (\n props: LayoutManagementProviderProps\n) => {\n const [layoutMetadata, setLayoutMetadata] = useState<LayoutMetadata[]>([]);\n // TODO this default should probably be a loading state rather than the placeholder\n // It will be replaced as soon as the localStorage/remote layout is resolved\n const [, forceRefresh] = useState({});\n const { notify } = useNotifications();\n const applicationJSONRef = useRef<ApplicationJSON>(loadingApplicationJson);\n\n const setApplicationJSON = useCallback(\n (applicationJSON: ApplicationJSON, rerender = true) => {\n applicationJSONRef.current = applicationJSON;\n if (rerender) {\n forceRefresh({});\n }\n },\n []\n );\n\n const setApplicationLayout = useCallback(\n (layout: LayoutJSON, rerender = true) => {\n setApplicationJSON(\n {\n ...applicationJSONRef.current,\n layout,\n },\n rerender\n );\n },\n [setApplicationJSON]\n );\n\n const setApplicationSettings = useCallback(\n (settings: ApplicationSettings) => {\n setApplicationJSON(\n {\n ...applicationJSONRef.current,\n settings: {\n ...applicationJSONRef.current.settings,\n ...settings,\n },\n },\n false\n );\n },\n [setApplicationJSON]\n );\n\n useEffect(() => {\n const persistenceManager = getPersistenceManager();\n\n persistenceManager\n .loadMetadata()\n .then((metadata) => {\n setLayoutMetadata(metadata);\n })\n .catch((error: Error) => {\n notify({\n type: NotificationLevel.Error,\n header: \"Failed to Load Layouts\",\n body: \"Could not load list of available layouts\",\n });\n console.error(\"Error occurred while retrieving metadata\", error);\n });\n\n persistenceManager\n .loadApplicationJSON()\n .then((applicationJSON: ApplicationJSON) => {\n setApplicationJSON(applicationJSON);\n })\n .catch((error: Error) => {\n notify({\n type: NotificationLevel.Error,\n header: \"Failed to Load Layout\",\n body: \"Could not load your latest view\",\n });\n console.error(\n \"Error occurred while retrieving application layout\",\n error\n );\n });\n }, [notify, setApplicationJSON]);\n\n const saveApplicationLayout = useCallback(\n (layout: LayoutJSON) => {\n setApplicationLayout(layout, false);\n getPersistenceManager().saveApplicationJSON(applicationJSONRef.current);\n },\n [setApplicationLayout]\n );\n\n const saveLayout = useCallback(\n (metadata: LayoutMetadataDto) => {\n const layoutToSave = resolveJSONPath(\n applicationJSONRef.current.layout,\n \"#main-tabs.ACTIVE_CHILD\"\n );\n\n if (layoutToSave) {\n getPersistenceManager()\n .createLayout(metadata, ensureLayoutHasTitle(layoutToSave, metadata))\n .then((metadata) => {\n notify({\n type: NotificationLevel.Success,\n header: \"Layout Saved Successfully\",\n body: `${metadata.name} saved successfully`,\n });\n setLayoutMetadata((prev) => [...prev, metadata]);\n })\n .catch((error: Error) => {\n notify({\n type: NotificationLevel.Error,\n header: \"Failed to Save Layout\",\n body: `Failed to save layout ${metadata.name}`,\n });\n console.error(\"Error occurred while saving layout\", error);\n });\n } else {\n notify({\n type: NotificationLevel.Error,\n header: \"Failed to Save Layout\",\n body: \"Cannot save undefined layout\",\n });\n }\n },\n [notify]\n );\n\n const saveApplicationSettings = useCallback(\n (\n settings: ApplicationSettings | ApplicationSetting,\n key?: keyof ApplicationSettings\n ) => {\n const { settings: applicationSettings } = applicationJSONRef.current;\n if (key) {\n setApplicationSettings({\n ...applicationSettings,\n [key]: settings,\n });\n } else {\n setApplicationSettings(settings as ApplicationSettings);\n }\n getPersistenceManager().saveApplicationJSON(applicationJSONRef.current);\n },\n [setApplicationSettings]\n );\n\n const getApplicationSettings = useCallback(\n (key?: keyof ApplicationSettings) => {\n const { settings } = applicationJSONRef.current;\n return key ? settings?.[key] : settings;\n },\n []\n );\n\n const loadLayoutById = useCallback(\n (id: string) => {\n getPersistenceManager()\n .loadLayout(id)\n .then((layoutJson) => {\n const { layout: currentLayout } = applicationJSONRef.current;\n setApplicationLayout({\n ...currentLayout,\n children: (currentLayout.children || []).concat(layoutJson),\n props: {\n ...currentLayout.props,\n active: currentLayout.children?.length ?? 0,\n },\n });\n })\n .catch((error: Error) => {\n notify({\n type: NotificationLevel.Error,\n header: \"Failed to Load Layout\",\n body: \"Failed to load the requested layout\",\n });\n console.error(\"Error occurred while loading layout\", error);\n });\n },\n [notify, setApplicationLayout]\n );\n\n return (\n <LayoutManagementContext.Provider\n value={{\n getApplicationSettings,\n layoutMetadata,\n saveLayout,\n applicationJson: applicationJSONRef.current,\n saveApplicationLayout,\n saveApplicationSettings,\n loadLayoutById,\n }}\n >\n {props.children}\n </LayoutManagementContext.Provider>\n );\n};\n\nexport const useLayoutManager = () => useContext(LayoutManagementContext);\n", "import { memo } from \"react\";\n\nexport const VuuLogo = memo(() => {\n return (\n <svg\n width=\"44\"\n height=\"45\"\n viewBox=\"0 0 44 45\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_217_6990)\">\n <path\n d=\"M39.8642 15.5509L35.9196 7.58974L34.3369 6.85464L24.6235 22.0825L39.1628 30.618L42.3152 25.6347L39.8642 15.5509Z\"\n fill=\"url(#paint0_linear_217_6990)\"\n />\n <path\n d=\"M42.6246 24.8716C41.9199 25.9157 40.9625 26.824 39.767 27.4905C38.424 28.2396 36.9563 28.597 35.5081 28.597C32.7541 28.597 30.0715 27.3094 28.4466 24.9855L15.772 3.90967L15.7655 3.9206C13.3615 0.137431 8.25372 -1.13143 4.24754 1.10507C0.178173 3.37435 -1.20852 8.39359 1.14854 12.3125L18.3445 40.9095C19.1108 42.1846 20.1816 43.1834 21.4144 43.8764C21.4241 43.8826 21.4338 43.8889 21.4435 43.8951C21.4484 43.8982 21.4549 43.9013 21.4597 43.9045C22.0332 44.2228 22.6423 44.471 23.2725 44.6536C23.3194 44.6677 23.368 44.6817 23.415 44.6942C23.6418 44.7551 23.8702 44.8097 24.1019 44.8534C24.1456 44.8612 24.1894 44.8659 24.2331 44.8737C24.4194 44.9049 24.6073 44.9314 24.7952 44.9501C24.8698 44.9579 24.9443 44.9658 25.0188 44.9704C25.2342 44.9876 25.4497 44.9985 25.6668 45.0001C25.6781 45.0001 25.6895 45.0001 25.6992 45.0001C25.7024 45.0001 25.704 45.0001 25.7073 45.0001C25.7105 45.0001 25.7121 45.0001 25.7154 45.0001C25.9503 45.0001 26.1868 44.9876 26.4217 44.9689C26.4751 44.9642 26.5286 44.9595 26.5837 44.9533C26.8137 44.9299 27.0438 44.9002 27.2738 44.8596C27.277 44.8596 27.2803 44.8596 27.2835 44.8596C27.5362 44.8144 27.7889 44.7551 28.0384 44.6864C28.0546 44.6817 28.0692 44.677 28.0854 44.6723C28.4483 44.5709 28.8063 44.4445 29.1594 44.2931C29.1659 44.29 29.174 44.2868 29.1805 44.2837C29.4494 44.1682 29.7151 44.0418 29.9759 43.8967C30.24 43.75 30.491 43.5908 30.7308 43.4206C30.9398 43.2739 31.1407 43.1179 31.3367 42.9524C31.5748 42.7495 31.8 42.5373 32.009 42.3141C32.1661 42.1471 32.3168 41.9723 32.4609 41.7913C32.5079 41.732 32.5517 41.6711 32.5954 41.6118C32.6942 41.4807 32.7882 41.3465 32.8789 41.2091C32.9259 41.1373 32.9728 41.0671 33.0182 40.9953C33.036 40.9672 33.0555 40.9407 33.0717 40.9126L42.7153 24.8763H42.6214L42.6246 24.8716Z\"\n fill=\"url(#paint1_linear_217_6990)\"\n />\n <path\n d=\"M42.8402 16.4218L42.1112 15.2232L38.9636 9.58433L37.504 7.19644C37.2286 6.56123 36.579 6.11331 35.8176 6.11331C34.8083 6.11331 33.9919 6.90147 33.9919 7.87223C33.9919 8.20154 34.0907 8.50432 34.2543 8.76808L34.2349 8.78056L39.9048 18.0808C40.5884 19.2186 40.7715 20.5437 40.4199 21.8141C40.0684 23.0845 39.226 24.1458 38.045 24.806C37.2675 25.2398 36.3846 25.4693 35.4936 25.4693C33.6727 25.4693 31.9766 24.5281 31.0662 23.0143L22.9161 9.63271H22.9323L19.4899 3.90958L19.4834 3.92051C19.4235 3.8253 19.3538 3.73947 19.2907 3.64738L19.1935 3.48663C19.1935 3.48663 19.1854 3.49131 19.1821 3.49443C17.5654 1.27666 14.9799 0.0390178 12.3118 0.00936427V0H7.91199V0.02185C10.9851 -0.184164 14.0582 1.23296 15.7656 3.92051L15.7721 3.90958L28.4451 24.987C30.0699 27.3093 32.7542 28.5985 35.5066 28.5985C36.9548 28.5985 38.4225 28.2426 39.7655 27.4919C40.961 26.8255 41.9168 25.9156 42.6231 24.8731H42.717L42.6846 24.9261C43.1366 24.2347 43.4833 23.4731 43.7068 22.6615C44.2916 20.5452 43.9871 18.3352 42.8369 16.4234L42.8402 16.4218Z\"\n fill=\"#F37880\"\n />\n <g opacity=\"0.86\">\n <path\n d=\"M34.2332 8.78212L39.9031 18.0824C40.5868 19.2202 40.7698 20.5452 40.4183 21.8156C40.2044 22.5897 39.8059 23.2858 39.2616 23.8617C39.9744 23.2343 40.4879 22.4243 40.7423 21.5035C41.0938 20.2331 40.9107 18.908 40.2271 17.7703L34.5572 8.46998L34.5767 8.4575C34.413 8.19374 34.3142 7.89096 34.3142 7.56165C34.3142 7.15586 34.4584 6.78285 34.6982 6.48476C34.2672 6.80626 33.9902 7.30881 33.9902 7.87379C33.9902 8.2031 34.0891 8.50588 34.2527 8.76964L34.2332 8.78212Z\"\n fill=\"white\"\n />\n <path\n d=\"M42.6917 24.9169L42.6863 24.9256C42.6863 24.9256 42.6899 24.9187 42.6935 24.9152C42.6935 24.9152 42.6935 24.9152 42.6935 24.9169H42.6917Z\"\n fill=\"white\"\n />\n <path\n d=\"M40.0911 27.1798C38.7481 27.9289 37.2804 28.2863 35.8322 28.2863C33.0782 28.2863 30.3955 26.9988 28.7707 24.6749L16.0961 3.59744L16.0896 3.60837C14.9281 1.78077 13.1364 0.543128 11.1422 0H7.91199V0.02185C10.9851 -0.184164 14.0582 1.23296 15.7656 3.92051L15.7721 3.90958L28.4451 24.987C30.0699 27.3093 32.7542 28.5985 35.5066 28.5985C36.9548 28.5985 38.4225 28.2426 39.7655 27.4919C40.4815 27.0924 41.1084 26.6055 41.6511 26.0561C41.1862 26.479 40.6662 26.8583 40.0894 27.1798H40.0911Z\"\n fill=\"white\"\n />\n </g>\n </g>\n <defs>\n <linearGradient\n id=\"paint0_linear_217_6990\"\n x1=\"24.6235\"\n y1=\"18.7363\"\n x2=\"42.3152\"\n y2=\"18.7363\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#4906A5\" />\n <stop offset=\"1\" stopColor=\"#D3423A\" />\n </linearGradient>\n <linearGradient\n id=\"paint1_linear_217_6990\"\n x1=\"-2.35794e-05\"\n y1=\"22.5009\"\n x2=\"42.7186\"\n y2=\"22.5009\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#7C06A5\" />\n <stop offset=\"1\" stopColor=\"#D3423A\" />\n </linearGradient>\n <clipPath id=\"clip0_217_6990\">\n <rect width=\"44\" height=\"45\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n});\nVuuLogo.displayName = \"VuuLogo\";\n", "import { VuuLogo } from \"@vuu-ui/vuu-icons\";\nimport { Stack, useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport { LayoutResizeAction } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { Tab, Tabstrip } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"classnames\";\nimport { LayoutsList } from \"../layout-management\";\nimport { CSSProperties, HTMLAttributes, useCallback, useState } from \"react\";\nimport { FeatureProps } from \"../feature\";\nimport { FeatureList } from \"../feature-list\";\nimport { useThemeAttributes } from \"../theme-provider\";\n\nimport \"./LeftNav.css\";\n\nconst classBase = \"vuuLeftNav\";\n\nexport type NavDisplayStatus =\n | \"menu-full\"\n | \"menu-icons\"\n | \"menu-full-content\"\n | \"menu-icons-content\";\n\nconst getDisplayStatus = (\n activeTabIndex: number,\n expanded: boolean\n): NavDisplayStatus => {\n if (activeTabIndex === 0) {\n return expanded ? \"menu-full\" : \"menu-icons\";\n } else {\n return expanded ? \"menu-full-content\" : \"menu-icons-content\";\n }\n};\n\nexport type NavDisplayStatusHandler = (\n navDisplayStatus: NavDisplayStatus\n) => void;\nexport interface LeftNavProps extends HTMLAttributes<HTMLDivElement> {\n \"data-path\"?: string;\n defaultActiveTabIndex?: number;\n defaultExpanded?: boolean;\n features: FeatureProps[];\n onActiveChange?: (activeTabIndex: number) => void;\n onTogglePrimaryMenu?: (expanded: boolean) => void;\n sizeCollapsed?: number;\n sizeContent?: number;\n sizeExpanded?: number;\n tableFeatures: FeatureProps[];\n}\n\ntype NavState = {\n activeTabIndex: number;\n expanded: boolean;\n};\n\nexport const LeftNav = (props: LeftNavProps) => {\n const dispatch = useLayoutProviderDispatch();\n const [themeClass] = useThemeAttributes();\n const {\n \"data-path\": path,\n defaultExpanded = true,\n defaultActiveTabIndex = 0,\n features,\n onActiveChange,\n onTogglePrimaryMenu,\n sizeCollapsed = 80,\n sizeContent = 300,\n sizeExpanded = 240,\n style: styleProp,\n tableFeatures,\n ...htmlAttributes\n } = props;\n\n const [navState, setNavState] = useState<NavState>({\n activeTabIndex: defaultActiveTabIndex,\n expanded: defaultExpanded,\n });\n\n const getFullWidth = useCallback(\n (tabIndex: number, expanded: boolean): number => {\n if (tabIndex === 0) {\n return expanded ? sizeExpanded : sizeCollapsed;\n } else {\n return expanded\n ? sizeExpanded + sizeContent\n : sizeCollapsed + sizeContent;\n }\n },\n [sizeCollapsed, sizeContent, sizeExpanded]\n );\n\n const handleTabSelection = useCallback(\n (activeTabIndex: number) => {\n const { activeTabIndex: currentIndex, expanded } = navState;\n const newState = { activeTabIndex, expanded };\n setNavState(newState);\n if (activeTabIndex === 0 || currentIndex === 0) {\n const width = getFullWidth(activeTabIndex, expanded);\n dispatch({\n type: \"layout-resize\",\n path: \"#vuu-side-panel\",\n size: width,\n } as LayoutResizeAction);\n }\n onActiveChange?.(activeTabIndex);\n },\n [dispatch, getFullWidth, navState, onActiveChange]\n );\n\n const displayStatus = getDisplayStatus(\n navState.activeTabIndex,\n navState.expanded\n );\n\n const toggleExpanded = useCallback(() => {\n const { activeTabIndex, expanded } = navState;\n const primaryMenuExpanded = !expanded;\n const newState = { activeTabIndex, expanded: primaryMenuExpanded };\n setNavState(newState);\n dispatch({\n type: \"layout-resize\",\n path: \"#vuu-side-panel\",\n size: getFullWidth(activeTabIndex, primaryMenuExpanded),\n } as LayoutResizeAction);\n onTogglePrimaryMenu?.(primaryMenuExpanded);\n }, [dispatch, getFullWidth, navState, onTogglePrimaryMenu]);\n\n const style = {\n ...styleProp,\n \"--nav-menu-collapsed-width\": `${sizeCollapsed}px`,\n \"--nav-menu-expanded-width\": `${sizeExpanded}px`,\n \"--nav-menu-content-width\": `${sizeContent}px`,\n } as CSSProperties;\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, `${classBase}-${displayStatus}`)}\n style={style}\n >\n <div\n className={cx(`${classBase}-menu-primary`, themeClass)}\n data-mode=\"dark\"\n >\n <div className=\"vuuLeftNav-logo\">\n <VuuLogo />\n </div>\n <div className={`${classBase}-main`}>\n <Tabstrip\n activeTabIndex={navState.activeTabIndex}\n animateSelectionThumb={false}\n className={`${classBase}-Tabstrip`}\n onActiveChange={handleTabSelection}\n orientation=\"vertical\"\n >\n <Tab data-icon=\"demo\" label=\"DEMO\"></Tab>\n <Tab data-icon=\"features\" label=\"VUU FEATURES\"></Tab>\n <Tab data-icon=\"tables\" label=\"VUU TABLES\"></Tab>\n <Tab data-icon=\"layouts\" label=\"MY LAYOUTS\"></Tab>\n </Tabstrip>\n </div>\n <div className=\"vuuLeftNav-buttonBar\">\n <button\n className={cx(\"vuuLeftNav-toggleButton\", {\n \"vuuLeftNav-toggleButton-open\":\n displayStatus.startsWith(\"menu-full\"),\n \"vuuLeftNav-toggleButton-closed\":\n displayStatus.startsWith(\"menu-icons\"),\n })}\n data-icon={\n displayStatus.startsWith(\"menu-full\")\n ? \"chevron-left\"\n : \"chevron-right\"\n }\n onClick={toggleExpanded}\n />\n </div>\n </div>\n <Stack\n active={navState.activeTabIndex - 1}\n className={`${classBase}-menu-secondary`}\n showTabs={false}\n >\n <FeatureList features={features} title=\"VUU FEATURES\" />\n <FeatureList features={tableFeatures} title=\"VUU TABLES\" />\n <div className=\"vuuLeftNav-drawer\">\n <LayoutsList />\n </div>\n </Stack>\n </div>\n );\n};\n", "import { Palette, PaletteItem } from \"@vuu-ui/vuu-layout\";\nimport { ListProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { HTMLAttributes } from \"react\";\nimport { Feature, FeatureProps } from \"../feature/Feature\";\n\nimport \"./FeatureList.css\";\n\nconst classBase = \"vuuFeatureList\";\n\nexport interface FeatureListProps extends HTMLAttributes<HTMLDivElement> {\n features: FeatureProps[];\n}\n\nexport const FeatureList = ({\n features,\n title = \"VUU TABLES\",\n ...htmlAttributes\n}: FeatureListProps) => {\n const ViewProps = {};\n\n const listProps: Partial<ListProps> = {\n height: \"100%\",\n };\n\n return (\n <div {...htmlAttributes} className={classBase}>\n <div className={`${classBase}-header`}>{title}</div>\n <div className={`${classBase}-content`}>\n <Palette\n orientation=\"vertical\"\n ListProps={listProps}\n ViewProps={ViewProps}\n >\n {features.map((featureProps, i) => (\n <PaletteItem\n closeable\n key={i}\n label={featureProps.title}\n resizeable\n resize=\"defer\"\n header\n >\n <Feature {...featureProps} />\n </PaletteItem>\n ))}\n </Palette>\n </div>\n </div>\n );\n};\n", "import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"vuu-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `${context.theme}-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `${theme}-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n", "import {\n ChangeEvent,\n FocusEvent,\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport cx from \"classnames\";\nimport {\n VuuColumnDataType,\n VuuDataRow,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useIdMemo } from \"@salt-ds/core\";\nimport { Button } from \"@salt-ds/core\";\nimport {\n DataSource,\n hasAction,\n isErrorResponse,\n RemoteDataSource,\n TableSchema,\n} from \"@vuu-ui/vuu-data\";\nimport {\n buildColumnMap,\n isValidNumber,\n shallowEquals,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./SessionEditingForm.css\";\n\nexport type FormFieldDescriptor = {\n isKeyField?: boolean;\n label?: string;\n name: string;\n type: VuuColumnDataType;\n description: string;\n readonly?: boolean;\n required?: boolean;\n};\n\nexport type FormConfig = {\n title: string;\n key: string;\n fields: FormFieldDescriptor[];\n};\n\nexport interface SessionEditingFormProps\n extends HTMLAttributes<HTMLDivElement> {\n config: FormConfig;\n onClose: () => void;\n dataSource?: DataSource;\n schema?: TableSchema;\n}\n\nconst classBase = \"vuuSessionEditingForm\";\n\nconst getField = (\n fields: FormFieldDescriptor[],\n name: string\n): FormFieldDescriptor => {\n const field = fields.find((f) => f.name === name);\n if (field) {\n return field;\n } else {\n throw Error(`SessionEditingForm, no field '${name}' found`);\n }\n};\n\nconst getFieldNameAndValue = (\n evt: ChangeEvent | FocusEvent\n): [string, string] => {\n const {\n dataset: { field },\n value,\n } = evt.target as HTMLInputElement;\n if (field === undefined) {\n throw Error(\"SessionEditingForm, form field has no field name\");\n }\n return [field, value];\n};\n\nconst Status = {\n uninitialised: 0,\n unchanged: 1,\n changed: 2,\n invalid: 3,\n};\n\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined?: false\n): VuuRowDataItemType | undefined;\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined: true\n): VuuRowDataItemType;\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined = false\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n const typedValue = parseInt(value, 10);\n if (isValidNumber(typedValue)) {\n return typedValue;\n } else if (throwIfUndefined) {\n throw Error(\"SessionEditingForm getTypedValue\");\n } else {\n return undefined;\n }\n }\n\n case \"double\": {\n const typedValue = parseFloat(value);\n if (isValidNumber(typedValue)) {\n return typedValue;\n }\n return undefined;\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n default:\n return value;\n }\n}\n\nconst getDataSource = (\n dataSource?: DataSource,\n schema?: TableSchema\n): DataSource => {\n if (dataSource) {\n return dataSource;\n } else if (schema) {\n return new RemoteDataSource({\n bufferSize: 0,\n table: schema.table,\n columns: schema.columns.map((col) => col.name),\n }) as DataSource;\n } else {\n throw Error(\n \"SessionEditingForm: either a DataSource or a TableSchema must be provided\"\n );\n }\n};\n\ntype FormValues = { [key: string]: VuuRowDataItemType | undefined };\n\nexport const SessionEditingForm = ({\n className,\n config: { fields, key: keyField },\n dataSource: dataSourceProp,\n id: idProp,\n onClose,\n schema,\n ...htmlAttributes\n}: SessionEditingFormProps) => {\n const [values, setValues] = useState<FormValues>();\n const [errorMessage, setErrorMessage] = useState(\"\");\n const formContentRef = useRef<HTMLDivElement>(null);\n const initialDataRef = useRef<FormValues>();\n const dataStatusRef = useRef(Status.uninitialised);\n\n const dataSource = useMemo(() => {\n const applyServerData = (data: VuuDataRow) => {\n if (columnMap) {\n const values: { [key: string]: VuuRowDataItemType } = {};\n for (const column of dataSource.columns) {\n values[column] = data[columnMap[column]];\n }\n if (dataStatusRef.current === Status.uninitialised) {\n dataStatusRef.current = Status.unchanged;\n initialDataRef.current = values;\n }\n setValues(values);\n }\n };\n\n const ds = getDataSource(dataSourceProp, schema);\n const columnMap = buildColumnMap(ds.columns);\n ds.subscribe({ range: { from: 0, to: 5 } }, (message) => {\n if (message.type === \"viewport-update\" && message.rows) {\n if (dataStatusRef.current === Status.uninitialised) {\n applyServerData(message.rows[0]);\n } else {\n console.log(\"what do we do with server updates\");\n }\n }\n });\n return ds;\n }, [dataSourceProp, schema]);\n\n const id = useIdMemo(idProp);\n\n const handleChange = useCallback(\n (evt) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n const typedValue = getTypedValue(value, type);\n setValues((values = {}) => {\n const newValues = {\n ...values,\n [field]: typedValue,\n };\n const notUpdated = shallowEquals(newValues, initialDataRef.current);\n dataStatusRef.current = notUpdated\n ? Status.unchanged\n : typedValue !== undefined\n ? Status.changed\n : Status.invalid;\n return newValues;\n });\n },\n [fields]\n );\n\n const handleBlur = useCallback(\n (evt: FocusEvent) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n const rowKey = values?.[keyField];\n const typedValue = getTypedValue(value, type, true);\n if (typeof rowKey === \"string\") {\n dataSource.menuRpcCall({\n rowKey,\n field: field,\n value: typedValue,\n type: \"VP_EDIT_CELL_RPC\",\n });\n }\n },\n [dataSource, fields, keyField, values]\n );\n\n const applyAction = useCallback(\n (action: unknown) => {\n if (typeof action === \"object\" && action !== null) {\n if (\"type\" in action && action.type === \"CLOSE_DIALOG_ACTION\") {\n onClose();\n }\n }\n },\n [onClose]\n );\n\n const handleSubmit = useCallback(async () => {\n const response = await dataSource.menuRpcCall({\n type: \"VP_EDIT_SUBMIT_FORM_RPC\",\n });\n if (isErrorResponse(response)) {\n setErrorMessage(response.error);\n } else if (hasAction(response)) {\n applyAction(response.action);\n }\n }, [applyAction, dataSource]);\n\n const handleKeyDown = useCallback(\n (evt) => {\n if (evt.key === \"Enter\" && dataStatusRef.current === Status.changed) {\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const getFormControl = (field: FormFieldDescriptor) => {\n const value = String(values?.[field.name] ?? \"\");\n if (field.readonly || field.name === keyField) {\n return (\n <div className={`${classBase}-fieldValue vuuReadOnly`}>{value}</div>\n );\n } else {\n return (\n <input\n className={`${classBase}-fieldValue`}\n data-field={field.name}\n onBlur={handleBlur}\n onChange={handleChange}\n type=\"text\"\n value={value}\n id={`${id}-input-${field.name}`}\n />\n );\n }\n };\n\n useEffect(() => {\n if (formContentRef.current) {\n const firstInput = formContentRef.current.querySelector(\n \"input\"\n ) as HTMLInputElement;\n if (firstInput) {\n setTimeout(() => {\n firstInput.focus();\n firstInput.select();\n }, 100);\n }\n }\n }, []);\n\n useEffect(() => {\n return () => {\n if (dataSource) {\n dataSource.unsubscribe();\n }\n };\n }, [dataSource]);\n\n const isDirty = dataStatusRef.current === Status.changed;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {errorMessage ? (\n <div\n className={`${classBase}-errorBanner`}\n data-icon=\"error\"\n title={errorMessage}\n >\n Error, edit(s) not saved\n </div>\n ) : undefined}\n <div\n className={`${classBase}-content`}\n ref={formContentRef}\n onKeyDown={handleKeyDown}\n >\n {fields.map((field) => (\n <div className={`${classBase}-field`} key={field.name}>\n <label\n className={cx(`${classBase}-fieldLabel`, {\n [`${classBase}-required`]: field.required,\n })}\n htmlFor={`${id}-input-${field.name}`}\n >\n {field?.label ?? field.description}\n </label>\n {getFormControl(field)}\n </div>\n ))}\n </div>\n <div className={`${classBase}-buttonbar salt-theme salt-density-high`}>\n <Button\n type=\"submit\"\n variant=\"cta\"\n disabled={!isDirty}\n onClick={handleSubmit}\n >\n Submit\n </Button>\n <Button variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n </div>\n </div>\n );\n};\n", "import {\n ClientToServerMenuRPC,\n ClientToServerTableList,\n ClientToServerTableMeta,\n ClientToServerViewportRpcCall,\n VuuRpcRequest,\n VuuTable,\n VuuTableList,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n EventEmitter,\n getLoggingConfigForWorker,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n DataSourceCallbackMessage,\n shouldMessageBeRoutedToDataSource as messageShouldBeRoutedToDataSource,\n} from \"./data-source\";\nimport * as Message from \"./server-proxy/messages\";\nimport {\n ConnectionStatusMessage,\n isConnectionQualityMetrics,\n isConnectionStatusMessage,\n isTableSchema,\n messageHasResult,\n ServerProxySubscribeMessage,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInTableList,\n VuuUIMessageInTableMeta,\n VuuUIMessageOut,\n} from \"./vuuUIMessageTypes\";\n\n// Note: inlined-worker is a generated file, it must be built\nimport { workerSourceCode } from \"./inlined-worker\";\nimport { ConnectionQualityMetrics } from \"./vuuUIMessageTypes\";\nimport { WebSocketProtocol } from \"./websocket-connection\";\nimport { TableSchema } from \"./message-utils\";\n\nconst workerBlob = new Blob([getLoggingConfigForWorker() + workerSourceCode], {\n type: \"text/javascript\",\n});\nconst workerBlobUrl = URL.createObjectURL(workerBlob);\n\ntype WorkerResolver = {\n resolve: (value: Worker | PromiseLike<Worker>) => void;\n};\n\nlet worker: Worker;\nlet pendingWorker: Promise<Worker>;\nconst pendingWorkerNoToken: WorkerResolver[] = [];\n\nlet resolveServer: (server: ServerAPI) => void;\nlet rejectServer: (err: unknown) => void;\n\nconst serverAPI = new Promise<ServerAPI>((resolve, reject) => {\n resolveServer = resolve;\n rejectServer = reject;\n});\n\nexport const getServerAPI = () => serverAPI;\n\nexport type PostMessageToClientCallback = (\n msg: DataSourceCallbackMessage\n) => void;\n\nconst viewports = new Map<\n string,\n {\n postMessageToClientDataSource: PostMessageToClientCallback;\n request: ServerProxySubscribeMessage;\n status: \"subscribing\";\n }\n>();\nconst pendingRequests = new Map();\n\ntype WorkerOptions = {\n protocol: WebSocketProtocol;\n retryLimitDisconnect?: number;\n retryLimitStartup?: number;\n url: string;\n token?: string;\n username: string | undefined;\n handleConnectionStatusChange: (msg: {\n data: ConnectionStatusMessage;\n }) => void;\n};\n\n// We do not resolve the worker until we have a connection, but we will get\n// connection status messages before that, so we forward them to caller\n// while they wait for worker.\nconst getWorker = async ({\n handleConnectionStatusChange,\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n token = \"\",\n username,\n url,\n}: WorkerOptions) => {\n if (token === \"\" && pendingWorker === undefined) {\n return new Promise<Worker>((resolve) => {\n pendingWorkerNoToken.push({ resolve });\n });\n }\n //FIXME If we have a pending request already and a new request arrives with a DIFFERENT\n // token, this would cause us to ignore the new request and ultimately resolve it with\n // the original request.\n return (\n pendingWorker ||\n // we get this far when we receive the first request with auth token\n (pendingWorker = new Promise((resolve) => {\n const worker = new Worker(workerBlobUrl);\n\n const timer: number | null = window.setTimeout(() => {\n console.error(\"timed out waiting for worker to load\");\n }, 1000);\n\n // This is the inial message handler only, it processes messages whilst we are\n // establishing a connection. When we resolve the worker, a runtime message\n // handler will replace this (see below)\n worker.onmessage = (msg: MessageEvent<VuuUIMessageIn>) => {\n const { data: message } = msg;\n if (message.type === \"ready\") {\n window.clearTimeout(timer);\n worker.postMessage({\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n token,\n type: \"connect\",\n url,\n username,\n });\n } else if (message.type === \"connected\") {\n worker.onmessage = handleMessageFromWorker;\n resolve(worker);\n for (const pendingWorkerRequest of pendingWorkerNoToken) {\n pendingWorkerRequest.resolve(worker);\n }\n pendingWorkerNoToken.length = 0;\n } else if (isConnectionStatusMessage(message)) {\n handleConnectionStatusChange({ data: message });\n } else {\n console.warn(\"ConnectionManager: Unexpected message from the worker\");\n }\n };\n // TODO handle error\n }))\n );\n};\n\nfunction handleMessageFromWorker({\n data: message,\n}: MessageEvent<VuuUIMessageIn | DataSourceCallbackMessage>) {\n if (messageShouldBeRoutedToDataSource(message)) {\n const viewport = viewports.get(message.clientViewportId);\n if (viewport) {\n viewport.postMessageToClientDataSource(message);\n } else {\n console.error(\n `[ConnectionManager] ${message.type} message received, viewport not found`\n );\n }\n } else if (isConnectionStatusMessage(message)) {\n ConnectionManager.emit(\"connection-status\", message);\n } else if (isConnectionQualityMetrics(message)) {\n ConnectionManager.emit(\"connection-metrics\", message);\n } else {\n const requestId = (message as VuuUIMessageInRPC).requestId;\n if (pendingRequests.has(requestId)) {\n const { resolve } = pendingRequests.get(requestId);\n pendingRequests.delete(requestId);\n const {\n type: _1,\n requestId: _2,\n ...rest\n } = message as\n | VuuUIMessageInRPC\n | VuuUIMessageInTableList\n | VuuUIMessageInTableMeta;\n\n if (messageHasResult(message)) {\n resolve(message.result);\n } else if (\n message.type === \"VP_EDIT_RPC_RESPONSE\" ||\n message.type === \"VP_EDIT_RPC_REJECT\"\n ) {\n resolve(message);\n } else if (isTableSchema(message)) {\n resolve(message.tableSchema);\n } else {\n resolve(rest);\n }\n } else {\n console.warn(\n \"%cConnectionManager Unexpected message from the worker\",\n \"color:red;font-weight:bold;\"\n );\n }\n }\n}\n\nconst asyncRequest = <T = unknown>(\n msg:\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerTableList\n | ClientToServerTableMeta\n | ClientToServerViewportRpcCall\n): Promise<T> => {\n const requestId = uuid();\n worker.postMessage({\n requestId,\n ...msg,\n });\n return new Promise((resolve, reject) => {\n pendingRequests.set(requestId, { resolve, reject });\n });\n};\n\nexport interface ServerAPI {\n destroy: (viewportId?: string) => void;\n getTableSchema: (table: VuuTable) => Promise<TableSchema>;\n getTableList: () => Promise<VuuTableList>;\n rpcCall: <T = unknown>(\n msg: VuuRpcRequest | ClientToServerMenuRPC | ClientToServerViewportRpcCall\n ) => Promise<T>;\n send: (message: VuuUIMessageOut) => void;\n subscribe: (\n message: ServerProxySubscribeMessage,\n callback: PostMessageToClientCallback\n ) => void;\n unsubscribe: (viewport: string) => void;\n}\n\nconst connectedServerAPI: ServerAPI = {\n subscribe: (message, callback) => {\n if (viewports.get(message.viewport)) {\n throw Error(\n `ConnectionManager attempting to subscribe with an existing viewport id`\n );\n }\n // TODO we never use this status\n viewports.set(message.viewport, {\n status: \"subscribing\",\n request: message,\n postMessageToClientDataSource: callback,\n });\n worker.postMessage({ type: \"subscribe\", ...message });\n },\n\n unsubscribe: (viewport) => {\n worker.postMessage({ type: \"unsubscribe\", viewport });\n },\n\n send: (message) => {\n worker.postMessage(message);\n },\n\n destroy: (viewportId?: string) => {\n if (viewportId && viewports.has(viewportId)) {\n viewports.delete(viewportId);\n }\n },\n\n rpcCall: async <T = unknown>(\n message:\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerViewportRpcCall\n ) => asyncRequest<T>(message),\n\n getTableList: async () =>\n asyncRequest<VuuTableList>({ type: \"GET_TABLE_LIST\" }),\n\n getTableSchema: async (table) =>\n asyncRequest<TableSchema>({\n type: Message.GET_TABLE_META,\n table,\n }),\n};\n\nexport type ConnectionEvents = {\n \"connection-status\": (message: ConnectionStatusMessage) => void;\n \"connection-metrics\": (message: ConnectionQualityMetrics) => void;\n};\n\nexport type ConnectOptions = {\n url: string;\n authToken?: string;\n username?: string;\n protocol?: WebSocketProtocol;\n /** Max number of reconnect attempts in the event of unsuccessful websocket connection at startup */\n retryLimitStartup?: number;\n /** Max number of reconnect attempts in the event of a disconnected websocket connection */\n retryLimitDisconnect?: number;\n};\n\nclass _ConnectionManager extends EventEmitter<ConnectionEvents> {\n // The first request must have the token. We can change this to block others until\n // the request with token is received.\n async connect({\n url,\n authToken,\n username,\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n }: ConnectOptions): Promise<ServerAPI> {\n // By passing handleMessageFromWorker here, we can get connection status\n //messages while we wait for worker to resolve.\n worker = await getWorker({\n protocol,\n url,\n token: authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n handleConnectionStatusChange: handleMessageFromWorker,\n });\n return connectedServerAPI;\n }\n\n destroy() {\n worker.terminate();\n }\n}\n\nexport const ConnectionManager = new _ConnectionManager();\n\n/**\n * Open a connection to the VuuServer. This method opens the websocket connection\n * and logs in. It can be called from whichever client code has access to the auth\n * token (eg. the login page, or just a hardcoded login script in a sample).\n * This will unblock any DataSources which may have already tried to subscribe to data,\n * but lacked access to the auth token.\n *\n * @param serverUrl\n * @param token\n */\nexport const connectToServer = async ({\n url,\n protocol = undefined,\n authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n}: ConnectOptions) => {\n try {\n const serverAPI = await ConnectionManager.connect({\n protocol,\n url,\n authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n });\n resolveServer(serverAPI);\n } catch (err: unknown) {\n console.error(\"Connection Error\", err);\n rejectServer(err);\n }\n};\n\nexport const makeRpcCall = async <T = unknown>(rpcRequest: VuuRpcRequest) => {\n try {\n return (await serverAPI).rpcCall<T>(rpcRequest);\n } catch (err) {\n throw Error(\"Error accessing server api\");\n }\n};\n", "import { DataSourceFilter, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnDescriptor,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuColumns,\n VuuDataRowDto,\n VuuFilter,\n VuuGroupBy,\n VuuLinkDescriptor,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuSort,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { TableSchema } from \"./message-utils\";\nimport {\n MenuRpcResponse,\n ViewportRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"./vuuUIMessageTypes\";\n\nexport interface MessageWithClientViewportId {\n clientViewportId: string;\n}\n// GridModelActions\nexport interface DataSourceAggregateMessage\n extends MessageWithClientViewportId {\n aggregations: VuuAggregation[];\n type: \"aggregate\";\n}\n\nexport type DataUpdateMode = \"batch\" | \"update\" | \"size-only\";\nexport interface DataSourceDataMessage extends MessageWithClientViewportId {\n mode: DataUpdateMode;\n rows?: DataSourceRow[];\n size?: number;\n type: \"viewport-update\";\n}\n\nexport interface DataSourceDataSizeMessage extends MessageWithClientViewportId {\n mode: \"size-only\";\n size: number;\n type: \"viewport-update\";\n}\n\nexport interface DataSourceDebounceRequest extends MessageWithClientViewportId {\n type: \"debounce-begin\";\n}\n\nexport const isSizeOnly = (\n message: DataSourceCallbackMessage\n): message is DataSourceDataSizeMessage =>\n message.type === \"viewport-update\" && message.mode === \"size-only\";\n\nexport interface DataSourceDisabledMessage extends MessageWithClientViewportId {\n type: \"disabled\";\n}\n\nexport interface DataSourceEnabledMessage extends MessageWithClientViewportId {\n type: \"enabled\";\n}\n\nexport interface DataSourceColumnsMessage extends MessageWithClientViewportId {\n type: \"columns\";\n columns: VuuColumns;\n}\nexport interface DataSourceFilterMessage extends MessageWithClientViewportId {\n type: \"filter\";\n filter: DataSourceFilter;\n}\nexport interface DataSourceGroupByMessage extends MessageWithClientViewportId {\n type: \"groupBy\";\n groupBy: VuuGroupBy | undefined;\n}\nexport interface DataSourceSetConfigMessage\n extends MessageWithClientViewportId {\n type: \"config\";\n config: WithFullConfig;\n}\n\nexport interface DataSourceMenusMessage extends MessageWithClientViewportId {\n type: \"vuu-menu\";\n menu: VuuMenu;\n}\n\nexport interface DataSourceSortMessage extends MessageWithClientViewportId {\n type: \"sort\";\n sort: VuuSort;\n}\n\nexport type DataSourceConfigMessage =\n | DataSourceAggregateMessage\n | DataSourceColumnsMessage\n | DataSourceFilterMessage\n | DataSourceGroupByMessage\n | DataSourceSortMessage\n | DataSourceSetConfigMessage;\n\nexport const toDataSourceConfig = (\n message: DataSourceConfigMessage\n): DataSourceConfig => {\n switch (message.type) {\n case \"aggregate\":\n return { aggregations: message.aggregations };\n case \"columns\":\n return { columns: message.columns };\n case \"filter\":\n return { filter: message.filter };\n case \"groupBy\":\n return { groupBy: message.groupBy };\n case \"sort\":\n return { sort: message.sort };\n case \"config\":\n return message.config;\n }\n};\n\nconst exactlyTheSame = (a: unknown, b: unknown) => {\n if (a === b) {\n return true;\n } else if (a === undefined && b === undefined) {\n return true;\n } else {\n return false;\n }\n};\n\ntype DataConfigPredicate = (\n config: DataSourceConfig,\n newConfig: DataSourceConfig\n) => boolean;\n\nconst equivalentFilter: DataConfigPredicate = (\n { filter: f1 },\n { filter: f2 }\n) =>\n (f1 === undefined && f2?.filter === \"\") ||\n (f2 === undefined && f1?.filter === \"\");\n\nexport const filterChanged: DataConfigPredicate = (c1, c2) => {\n if (equivalentFilter(c1, c2)) {\n return false;\n } else {\n return c1.filter?.filter !== c2.filter?.filter;\n }\n};\n\nconst equivalentSort: DataConfigPredicate = ({ sort: s1 }, { sort: s2 }) =>\n (s1 === undefined && s2?.sortDefs.length === 0) ||\n (s2 === undefined && s1?.sortDefs.length === 0);\n\nconst sortChanged: DataConfigPredicate = (config, newConfig) => {\n const { sort: s1 } = config;\n const { sort: s2 } = newConfig;\n if (exactlyTheSame(s1, s2) || equivalentSort(config, newConfig)) {\n return false;\n } else if (s1 === undefined || s2 === undefined) {\n return true;\n } else if (s1?.sortDefs.length !== s2?.sortDefs.length) {\n return true;\n }\n return s1.sortDefs.some(\n ({ column, sortType }, i) =>\n column !== s2.sortDefs[i].column || sortType !== s2.sortDefs[i].sortType\n );\n};\n\nexport const hasGroupBy = (config?: DataSourceConfig): config is WithGroupBy =>\n config !== undefined &&\n config.groupBy !== undefined &&\n config.groupBy.length > 0;\n\nexport const hasFilter = (config?: DataSourceConfig): config is WithFilter =>\n config?.filter !== undefined && config.filter.filter.length > 0;\n\nexport const hasSort = (config?: DataSourceConfig): config is WithSort =>\n config?.sort !== undefined &&\n Array.isArray(config.sort?.sortDefs) &&\n config.sort.sortDefs.length > 0;\n\nconst equivalentGroupBy: DataConfigPredicate = (\n { groupBy: val1 },\n { groupBy: val2 }\n) =>\n (val1 === undefined && val2?.length === 0) ||\n (val2 === undefined && val1?.length === 0);\n\nexport const groupByChanged: DataConfigPredicate = (config, newConfig) => {\n const { groupBy: g1 } = config;\n const { groupBy: g2 } = newConfig;\n if (exactlyTheSame(g1, g2) || equivalentGroupBy(config, newConfig)) {\n return false;\n } else if (g1 === undefined || g2 === undefined) {\n return true;\n } else if (g1?.length !== g2?.length) {\n return true;\n }\n return g1.some((column, i) => column !== g2?.[i]);\n};\n\nconst equivalentColumns: DataConfigPredicate = (\n { columns: cols1 },\n { columns: cols2 }\n) =>\n (cols1 === undefined && cols2?.length === 0) ||\n (cols2 === undefined && cols1?.length === 0);\n\nexport const columnsChanged: DataConfigPredicate = (config, newConfig) => {\n const { columns: cols1 } = config;\n const { columns: cols2 } = newConfig;\n\n if (exactlyTheSame(cols1, cols2) || equivalentColumns(config, newConfig)) {\n return false;\n } else if (cols1 === undefined || cols2 === undefined) {\n return true;\n } else if (cols1?.length !== cols2?.length) {\n return true;\n }\n return cols1.some((column, i) => column !== cols2?.[i]);\n};\n\nconst equivalentAggregations: DataConfigPredicate = (\n { aggregations: agg1 },\n { aggregations: agg2 }\n) =>\n (agg1 === undefined && agg2?.length === 0) ||\n (agg2 === undefined && agg1?.length === 0);\n\nconst aggregationsChanged: DataConfigPredicate = (config, newConfig) => {\n const { aggregations: agg1 } = config;\n const { aggregations: agg2 } = newConfig;\n if (exactlyTheSame(agg1, agg2) || equivalentAggregations(config, newConfig)) {\n return false;\n } else if (agg1 === undefined || agg2 === undefined) {\n return true;\n } else if (agg1.length !== agg2.length) {\n return true;\n }\n return agg1.some(\n ({ column, aggType }, i) =>\n column !== agg2[i].column || aggType !== agg2[i].aggType\n );\n};\nconst visualLinkChanged: DataConfigPredicate = () => {\n // TODO\n return false;\n};\n\nexport const configChanged = (\n config: DataSourceConfig | undefined,\n newConfig: DataSourceConfig | undefined\n) => {\n if (exactlyTheSame(config, newConfig)) {\n return false;\n }\n\n if (config === undefined || newConfig === undefined) {\n return true;\n }\n\n return (\n columnsChanged(config, newConfig) ||\n filterChanged(config, newConfig) ||\n sortChanged(config, newConfig) ||\n groupByChanged(config, newConfig) ||\n aggregationsChanged(config, newConfig) ||\n visualLinkChanged(config, newConfig)\n );\n};\n\nexport interface DataSourceSubscribedMessage\n extends MessageWithClientViewportId,\n MessageWithClientViewportId {\n aggregations: VuuAggregation[];\n columns: VuuColumns;\n filter: DataSourceFilter;\n groupBy: VuuGroupBy;\n range: VuuRange;\n sort: VuuSort;\n tableSchema: Readonly<TableSchema>;\n type: \"subscribed\";\n}\n\nexport interface DataSourceVisualLinkCreatedMessage\n extends MessageWithClientViewportId {\n colName: string;\n parentViewportId: string;\n parentColName: string;\n type: \"vuu-link-created\";\n}\n\nexport interface DataSourceVisualLinkRemovedMessage\n extends MessageWithClientViewportId {\n type: \"vuu-link-removed\";\n}\n\nexport interface DataSourceVisualLinksMessage\n extends MessageWithClientViewportId {\n type: \"vuu-links\";\n links: VuuLinkDescriptor[];\n}\n\nexport type VuuFeatureMessage =\n | DataSourceMenusMessage\n | DataSourceVisualLinksMessage;\n\nexport type VuuFeatureInvocationMessage =\n | DataSourceVisualLinkCreatedMessage\n | DataSourceVisualLinkRemovedMessage;\n\nexport type DataSourceCallbackMessage =\n | DataSourceConfigMessage\n | DataSourceColumnsMessage\n | DataSourceDataMessage\n | DataSourceDebounceRequest\n | DataSourceDisabledMessage\n | DataSourceEnabledMessage\n | DataSourceMenusMessage\n | DataSourceSubscribedMessage\n | DataSourceVisualLinkCreatedMessage\n | DataSourceVisualLinkRemovedMessage\n | DataSourceVisualLinksMessage;\n\nconst datasourceMessages = [\n \"config\",\n \"aggregate\",\n \"viewport-update\",\n \"columns\",\n \"debounce-begin\",\n \"disabled\",\n \"enabled\",\n \"filter\",\n \"groupBy\",\n \"vuu-link-created\",\n \"vuu-link-removed\",\n \"vuu-links\",\n \"vuu-menu\",\n \"sort\",\n \"subscribed\",\n];\n\nexport type ConfigChangeColumnsMessage = {\n type: \"columns\";\n columns?: ColumnDescriptor[];\n};\n\nexport type ConfigChangeMessage =\n | ConfigChangeColumnsMessage\n | DataSourceAggregateMessage\n | DataSourceFilterMessage\n | DataSourceGroupByMessage\n | DataSourceSortMessage\n | DataSourceVisualLinkCreatedMessage\n | DataSourceVisualLinkRemovedMessage;\n\nexport type ConfigChangeHandler = (msg: ConfigChangeMessage) => void;\n\nexport const shouldMessageBeRoutedToDataSource = (\n message: unknown\n): message is DataSourceCallbackMessage => {\n const type = (message as DataSourceCallbackMessage).type;\n return datasourceMessages.includes(type);\n};\n\nexport const isDataSourceConfigMessage = (\n message: DataSourceCallbackMessage\n): message is DataSourceConfigMessage =>\n [\"config\", \"aggregate\", \"columns\", \"filter\", \"groupBy\", \"sort\"].includes(\n message.type\n );\n\n/**\n * Described the configuration values that should typically be\n * persisted across sessions.\n */\nexport interface WithFullConfig {\n readonly aggregations: VuuAggregation[];\n readonly columns: string[];\n readonly filter: DataSourceFilter;\n readonly groupBy: VuuGroupBy;\n readonly sort: VuuSort;\n readonly visualLink?: LinkDescriptorWithLabel;\n}\n\nexport const NoFilter: VuuFilter = { filter: \"\" };\nexport const NoSort: VuuSort = { sortDefs: [] };\n\nexport const vanillaConfig: WithFullConfig = {\n aggregations: [],\n columns: [],\n filter: NoFilter,\n groupBy: [],\n sort: NoSort,\n};\n\nexport const withConfigDefaults = (\n config: DataSourceConfig\n): WithFullConfig & { visualLink?: LinkDescriptorWithLabel } => {\n if (\n config.aggregations &&\n config.columns &&\n config.filter &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n\nexport interface DataSourceConfig extends Partial<WithFullConfig> {\n visualLink?: LinkDescriptorWithLabel;\n}\n\nexport interface WithGroupBy extends DataSourceConfig {\n groupBy: VuuGroupBy;\n}\nexport interface WithFilter extends DataSourceConfig {\n filter: DataSourceFilter;\n}\nexport interface WithSort extends DataSourceConfig {\n sort: VuuSort;\n}\n\nexport interface DataSourceConstructorProps extends DataSourceConfig {\n bufferSize?: number;\n table: VuuTable;\n title?: string;\n viewport?: string;\n}\n\nexport interface SubscribeProps {\n viewport?: string;\n columns?: string[];\n aggregations?: VuuAggregation[];\n range?: VuuRange;\n sort?: VuuSort;\n groupBy?: VuuGroupBy;\n filter?: DataSourceFilter;\n title?: string;\n}\n\nexport type SubscribeCallback = (message: DataSourceCallbackMessage) => void;\nexport type OptimizeStrategy = \"none\" | \"throttle\" | \"debounce\";\n\nexport type DataSourceEvents = {\n config: (config: DataSourceConfig | undefined, confirmed?: boolean) => void;\n optimize: (optimize: OptimizeStrategy) => void;\n range: (range: VuuRange) => void;\n resize: (size: number) => void;\n};\n\n/**\n * return Promise<true> indicates success\n * return Promise<errorMessage> indicates failure\n */\nexport type DataSourceEditHandler = (\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n) => Promise<true | string>;\n\nexport type DataSourceDeleteHandler = (key: string) => Promise<true | string>;\nexport type DataSourceInsertHandler = (\n key: string,\n data: VuuDataRowDto\n) => Promise<true | string>;\n\nexport type RpcResponse =\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | ViewportRpcResponse;\n\nexport type RpcResponseHandler = (response: RpcResponse) => boolean;\n\nexport type RowSearchPredicate = (row: DataSourceRow) => boolean;\n\nexport type DataSourceStatus =\n | \"disabled\"\n | \"disabling\"\n | \"enabled\"\n | \"enabling\"\n | \"initialising\"\n | \"subscribing\"\n | \"subscribed\"\n | \"suspended\"\n | \"unsubscribed\";\n\nexport interface TypeaheadSuggestionProvider {\n getTypeaheadSuggestions: (\n columnName: string,\n pattern?: string\n ) => Promise<string[]>;\n}\n\nexport const isTypeaheadSuggestionProvider = (\n source: unknown\n): source is TypeaheadSuggestionProvider =>\n typeof (source as TypeaheadSuggestionProvider)[\"getTypeaheadSuggestions\"] ===\n \"function\";\n\nexport interface DataSource\n extends EventEmitter<DataSourceEvents>,\n Partial<TypeaheadSuggestionProvider> {\n aggregations: VuuAggregation[];\n applyEdit: DataSourceEditHandler;\n /**\n * set config without triggering config event. Use this method when initialising\n * a dataSource that has been restored from session state. The dataSource will\n * not yet be subscribed. Triggering the config event is unnecessary and might\n * cause a React exception if the event were to cause a render.\n * @param config DataSourceConfig\n * @returns true if config has been applied (will not be if existig config is same)\n */\n applyConfig: (config: DataSourceConfig) => true | undefined;\n closeTreeNode: (key: string, cascade?: boolean) => void;\n columns: string[];\n config: DataSourceConfig;\n status: DataSourceStatus;\n /**\n *\n * Similar to disable but intended for pauses of very short duration (default is 3 seconds). Although\n * the dataSource will stop sending messages until resumed, it will not disconnect from a remote server.\n * It will preserve subscription to the remote server and continue to apply updates to cached data. It\n * just won't send updates through to the UI thread (until resumed). Useful in edge cases such as where a\n * component is dragged to a new location. When dropped, the component will be unmounted and very quickly\n * remounted by React. For the duration of this operation, we suspend updates . Updating an unmounted\n * React component would cause a React error.\n * If an suspend is requested and not resumed within 3 seconds, it will automatically be promoted to a disable.,\n */\n suspend?: () => void;\n resume?: () => void;\n\n deleteRow?: DataSourceDeleteHandler;\n\n /**\n * For a dataSource that has been previously disabled and is currently in disabled state , this will restore\n * the subscription to active status. Fresh data will be dispatched to client. The enable call optionally\n * accepts the same subscribe callback as subscribe. This allows a completely new instance of a component to\n * assume ownership of a subscription and receive all messages.\n */\n enable?: (callback?: SubscribeCallback) => void;\n /**\n * Disables this subscription. A datasource will send no further messages until re-enabled. Example usage\n * might be for a component displayed within a set of Tabs. If user switches to another tab, the dataSource\n * of the component that is no longer visible can be disabled until it is made visible again.\n */\n disable?: () => void;\n filter: DataSourceFilter;\n groupBy: VuuGroupBy;\n insertRow?: DataSourceInsertHandler;\n links?: LinkDescriptorWithLabel[];\n menu?: VuuMenu;\n menuRpcCall: (\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ) => Promise<RpcResponse | undefined>;\n rpcCall?: <T extends RpcResponse = RpcResponse>(\n message: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ) => Promise<T | undefined>;\n openTreeNode: (key: string) => void;\n range: VuuRange;\n select: SelectionChangeHandler;\n readonly selectedRowsCount: number;\n readonly size: number;\n sort: VuuSort;\n subscribe: (\n props: SubscribeProps,\n callback: SubscribeCallback\n ) => Promise<void>;\n table?: VuuTable;\n readonly tableSchema?: TableSchema;\n title?: string;\n unsubscribe: () => void;\n viewport?: string;\n visualLink?: LinkDescriptorWithLabel;\n}\n", "export const CHANGE_VP_SUCCESS = \"CHANGE_VP_SUCCESS\";\nexport const CHANGE_VP_RANGE_SUCCESS = \"CHANGE_VP_RANGE_SUCCESS\";\nexport const CLOSE_TREE_NODE = \"CLOSE_TREE_NODE\";\nexport const CLOSE_TREE_SUCCESS = \"CLOSE_TREE_SUCCESS\";\nexport const CLOSE_TREE_REJECT = \"CLOSE_TREE_REJECT\";\nexport const CREATE_VISUAL_LINK = \"CREATE_VISUAL_LINK\";\nexport const CREATE_VP = \"CREATE_VP\";\nexport const DISABLE_VP = \"DISABLE_VP\";\nexport const DISABLE_VP_SUCCESS = \"DISABLE_VP_SUCCESS\";\nexport const DISABLE_VP_REJECT = \"DISABLE_VP_REJECT\";\nexport const ENABLE_VP = \"ENABLE_VP\";\nexport const ENABLE_VP_SUCCESS = \"ENABLE_VP_SUCCESS\";\nexport const ENABLE_VP_REJECT = \"ENABLE_VP_REJECT\";\nexport const GET_TABLE_META = \"GET_TABLE_META\";\nexport const GET_VP_VISUAL_LINKS = \"GET_VP_VISUAL_LINKS\";\nexport const GET_VIEW_PORT_MENUS = \"GET_VIEW_PORT_MENUS\";\nexport const VIEW_PORT_MENUS_SELECT_RPC = \"VIEW_PORT_MENUS_SELECT_RPC\";\nexport const VIEW_PORT_MENU_CELL_RPC = \"VIEW_PORT_MENU_CELL_RPC\";\nexport const VIEW_PORT_MENU_TABLE_RPC = \"VIEW_PORT_MENU_TABLE_RPC\";\nexport const VIEW_PORT_MENU_ROW_RPC = \"VIEW_PORT_MENU_ROW_RPC\";\nexport const VIEW_PORT_MENU_RESP = \"VIEW_PORT_MENU_RESP\";\nexport const VIEW_PORT_MENU_REJ = \"VIEW_PORT_MENU_REJ\";\nexport const HB = \"HB\";\nexport const HB_RESP = \"HB_RESP\";\nexport const LOGIN = \"LOGIN\";\nexport const OPEN_TREE_NODE = \"OPEN_TREE_NODE\";\nexport const OPEN_TREE_SUCCESS = \"OPEN_TREE_SUCCESS\";\nexport const OPEN_TREE_REJECT = \"OPEN_TREE_REJECT\";\nexport const REMOVE_VP = \"REMOVE_VP\";\nexport const REMOVE_VP_REJECT = \"REMOVE_VP_REJECT\";\nexport const RPC_CALL = \"RPC_CALL\";\nexport const RPC_RESP = \"RPC_RESP\";\nexport const MENU_RPC_RESP = \"MENU_RPC_RESP\";\nexport const SET_SELECTION = \"SET_SELECTION\";\nexport const SET_SELECTION_SUCCESS = \"SET_SELECTION_SUCCESS\";\n\nexport const TABLE_ROW = \"TABLE_ROW\";\nexport const SIZE = \"SIZE\";\nexport const UPDATE = \"U\";\n", "import {\n ClientToServerTableList,\n ClientToServerTableMeta,\n LinkDescriptorWithLabel,\n ServerToClientBody,\n ServerToClientMenuSessionTableAction,\n ServerToClientViewportRpcResponse,\n TypeAheadMethod,\n VuuAggregation,\n VuuColumns,\n VuuGroupBy,\n VuuRange,\n VuuSort,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport { TableSchema, WithRequestId } from \"./message-utils\";\nimport {\n DataSourceMenusMessage,\n DataSourceVisualLinkCreatedMessage,\n DataSourceVisualLinkRemovedMessage,\n DataSourceVisualLinksMessage,\n RpcResponse,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n WithFullConfig,\n} from \"./data-source\";\nimport { GridAction, Selection } from \"@vuu-ui/vuu-table-types\";\nimport { WebSocketProtocol } from \"./websocket-connection\";\n\nexport interface OpenDialogAction {\n type: \"OPEN_DIALOG_ACTION\";\n tableSchema?: TableSchema;\n table?: VuuTable;\n}\nexport interface NoAction {\n type: \"NO_ACTION\";\n}\n\nexport declare type MenuRpcAction = OpenDialogAction | NoAction;\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connection-open-awaiting-session\"\n | \"connected\"\n | \"disconnected\"\n | \"reconnected\";\n\nexport interface ConnectionStatusMessage {\n type: \"connection-status\";\n reason?: string;\n retry?: boolean;\n status: ConnectionStatus;\n}\n\nexport const isConnectionStatusMessage = (\n msg: object | ConnectionStatusMessage\n): msg is ConnectionStatusMessage =>\n (msg as ConnectionStatusMessage).type === \"connection-status\";\n\nexport interface ConnectionQualityMetrics {\n type: \"connection-metrics\";\n messagesLength: number;\n}\n\nexport const isConnectionQualityMetrics = (\n msg: object\n): msg is ConnectionQualityMetrics =>\n (msg as ConnectionQualityMetrics).type === \"connection-metrics\";\n\nexport interface ServerProxySubscribeMessage {\n aggregations: VuuAggregation[];\n bufferSize?: number;\n columns: VuuColumns;\n filter: DataSourceFilter;\n groupBy: VuuGroupBy;\n range: VuuRange;\n sort: VuuSort;\n table: VuuTable;\n title?: string;\n viewport: string;\n visualLink?: LinkDescriptorWithLabel;\n}\n\n// export type VuuUIMessageInConnectionStatus = {\n// type: 'connection-status';\n// };\n\nexport type VuuUIMessageInConnected = {\n type: \"connected\";\n};\n\nexport type VuuUIMessageInWorkerReady = {\n type: \"ready\";\n};\n\nexport interface ViewportMessageIn {\n clientViewportId: string;\n}\n\n// TODO use generic to type result\nexport interface VuuUIMessageInRPC {\n method: string;\n result: unknown;\n requestId: string;\n type: \"RPC_RESP\";\n}\n\nexport interface VuuUIMessageInRPCEditReject {\n error: string;\n requestId?: string;\n type: \"VP_EDIT_RPC_REJECT\";\n}\n\nexport interface VuuUIMessageInRPCEditResponse {\n action: unknown;\n requestId: string;\n rpcName: string;\n type: \"VP_EDIT_RPC_RESPONSE\";\n}\n\nexport const messageHasResult = (msg: object): msg is VuuUIMessageInRPC =>\n typeof (msg as VuuUIMessageInRPC).result !== \"undefined\";\n\nexport const isTableSchema = (\n message: VuuUIMessageIn\n): message is VuuUIMessageInTableMeta => message.type === \"TABLE_META_RESP\";\n\nexport interface VuuUIMessageInTableList {\n requestId: string;\n type: \"TABLE_LIST_RESP\";\n tables: VuuTable[];\n}\nexport interface VuuUIMessageInTableMeta {\n requestId: string;\n tableSchema: TableSchema;\n type: \"TABLE_META_RESP\";\n}\nexport interface MenuRpcResponse {\n action: MenuRpcAction;\n error?: string;\n requestId: string;\n rpcName?: string;\n tableAlreadyOpen?: boolean;\n type: \"VIEW_PORT_MENU_RESP\";\n}\nexport interface ViewportRpcResponse {\n action: ServerToClientViewportRpcResponse[\"action\"];\n requestId: string;\n rpcName?: string;\n type: \"VIEW_PORT_RPC_RESPONSE\";\n}\nexport interface MenuRpcReject extends ViewportMessageIn {\n error?: string;\n requestId: string;\n rpcName?: string;\n type: \"VIEW_PORT_MENU_REJ\";\n}\n\nexport interface VuuUIMessageInMenuRej {\n error: string;\n requestId: string;\n rpcName: string;\n type: \"VIEW_PORT_MENU_REJ\";\n}\n\nexport type VuuUIMessageIn =\n | VuuUIMessageInConnected\n | VuuUIMessageInWorkerReady\n | VuuUIMessageInRPC\n | ViewportRpcResponse\n | MenuRpcResponse\n | MenuRpcReject\n | VuuUIMessageInTableList\n | VuuUIMessageInTableMeta\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse;\n\nexport const isErrorResponse = (\n response?: RpcResponse\n): response is VuuUIMessageInRPCEditReject =>\n response !== undefined && \"error\" in response;\n\nexport const hasAction = (\n response?: RpcResponse\n): response is MenuRpcResponse | VuuUIMessageInRPCEditResponse =>\n response != undefined && \"action\" in response;\n\nexport interface VuuUIMessageOutConnect {\n protocol: WebSocketProtocol;\n type: \"connect\";\n token: string;\n url: string;\n username?: string;\n retryLimitDisconnect?: number;\n retryLimitStartup?: number;\n}\n\nexport interface VuuUIMessageOutSubscribe extends ServerProxySubscribeMessage {\n type: \"subscribe\";\n}\n\nexport interface VuuUIMessageOutUnsubscribe {\n type: \"unsubscribe\";\n viewport: string;\n}\nexport interface VuuUIMessageOutSuspend {\n type: \"suspend\";\n viewport: string;\n}\nexport interface VuuUIMessageOutResume {\n type: \"resume\";\n viewport: string;\n}\n\nexport interface ViewportMessageOut {\n viewport: string;\n}\n\nexport interface RequestMessage {\n requestId: string;\n}\n\nexport interface VuuUIMessageOutColumns extends ViewportMessageOut {\n type: \"setColumns\";\n columns: string[];\n}\nexport interface VuuUIMessageOutViewRange extends ViewportMessageOut {\n type: \"setViewRange\";\n range: {\n from: number;\n to: number;\n };\n}\nexport interface VuuUIMessageOutAggregate extends ViewportMessageOut {\n aggregations: VuuAggregation[];\n type: \"aggregate\";\n}\nexport interface VuuUIMessageOutCloseTreeNode extends ViewportMessageOut {\n key: string;\n type: \"closeTreeNode\";\n}\nexport interface VuuUIMessageOutCreateLink extends ViewportMessageOut {\n childColumnName: string;\n parentColumnName: string;\n parentClientVpId: string;\n type: \"createLink\";\n}\nexport interface VuuUIMessageOutRemoveLink extends ViewportMessageOut {\n type: \"removeLink\";\n}\nexport interface VuuUIMessageOutSetTitle extends ViewportMessageOut {\n title: string;\n type: \"setTitle\";\n}\n\nexport interface VuuUIMessageOutDisable extends ViewportMessageOut {\n type: \"disable\";\n}\nexport interface VuuUIMessageOutEnable extends ViewportMessageOut {\n type: \"enable\";\n}\nexport interface VuuUIMessageOutOpenTreeNode extends ViewportMessageOut {\n key: string;\n type: \"openTreeNode\";\n}\nexport interface VuuUIMessageOutResume extends ViewportMessageOut {\n type: \"resume\";\n}\n\nexport interface VuuUIMessageOutSelect extends ViewportMessageOut {\n selected: Selection;\n type: \"select\";\n}\nexport interface VuuUIMessageOutSelectAll extends ViewportMessageOut {\n type: \"selectAll\";\n}\nexport interface VuuUIMessageOutSelectNone extends ViewportMessageOut {\n type: \"selectNone\";\n}\n\nexport interface VuuUIMessageOutSort extends ViewportMessageOut {\n sort: VuuSort;\n type: \"sort\";\n}\nexport interface VuuUIMessageOutSuspend extends ViewportMessageOut {\n type: \"suspend\";\n}\n\nexport interface VuuUIMessageOutFilter extends ViewportMessageOut {\n filter: DataSourceFilter;\n type: \"filter\";\n}\nexport interface VuuUIMessageOutGroupby extends ViewportMessageOut {\n groupBy: VuuGroupBy;\n type: \"groupBy\";\n}\n\nexport interface VuuUIMessageOutConfig extends ViewportMessageOut {\n config: WithFullConfig;\n type: \"config\";\n}\n\nexport type VuuUIMessageOutViewport =\n | VuuUIMessageOutAggregate\n | VuuUIMessageOutCloseTreeNode\n | VuuUIMessageOutColumns\n | VuuUIMessageOutConfig\n | VuuUIMessageOutCreateLink\n | VuuUIMessageOutFilter\n | VuuUIMessageOutDisable\n | VuuUIMessageOutEnable\n | VuuUIMessageOutGroupby\n | VuuUIMessageOutOpenTreeNode\n | VuuUIMessageOutRemoveLink\n | VuuUIMessageOutResume\n | VuuUIMessageOutSelect\n | VuuUIMessageOutSelectAll\n | VuuUIMessageOutSelectNone\n | VuuUIMessageOutSetTitle\n | VuuUIMessageOutSuspend\n | VuuUIMessageOutSort\n | VuuUIMessageOutViewRange;\n\nexport const isViewporttMessage = (\n msg: object\n): msg is VuuUIMessageOutViewport => \"viewport\" in msg;\n\nexport interface TypeAheadRpcRequest {\n method: TypeAheadMethod;\n params: [VuuTable, ...string[]];\n type: \"RPC_CALL\";\n}\n\nexport type VuuUIMessageOut =\n | VuuUIMessageOutConnect\n | VuuUIMessageOutSubscribe\n | VuuUIMessageOutUnsubscribe\n | VuuUIMessageOutViewport\n | WithRequestId<ClientToServerTableList>\n | WithRequestId<ClientToServerTableMeta>;\n\nexport const isSessionTableActionMessage = (\n messageBody: ServerToClientBody\n): messageBody is ServerToClientMenuSessionTableAction =>\n messageBody.type === \"VIEW_PORT_MENU_RESP\" &&\n messageBody.action !== null &&\n isSessionTable(messageBody.action.table);\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport const isVisualLinksAction = (\n action: GridAction\n): action is DataSourceVisualLinksMessage => action.type === \"vuu-links\";\n\nexport const isVisualLinkCreatedAction = (\n action: GridAction\n): action is DataSourceVisualLinkCreatedMessage =>\n action.type === \"vuu-link-created\";\n\nexport const isVisualLinkRemovedAction = (\n action: GridAction\n): action is DataSourceVisualLinkRemovedMessage =>\n action.type === \"vuu-link-removed\";\n\nexport const isViewportMenusAction = (\n action: GridAction\n): action is DataSourceMenusMessage => action.type === \"vuu-menu\";\n\nexport const isVuuFeatureAction = (\n action: GridAction\n): action is VuuFeatureMessage =>\n isViewportMenusAction(action) || isVisualLinksAction(action);\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n", "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/date/formatter.ts\nvar baseTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\"\n};\nvar formatConfigByTimePatterns = {\n \"hh:mm:ss\": {\n locale: \"en-GB\",\n options: { ...baseTimeFormatOptions, hour12: false }\n },\n \"hh:mm:ss a\": {\n locale: \"en-GB\",\n options: { ...baseTimeFormatOptions, hour12: true }\n }\n};\nvar baseDateFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n};\nvar formatConfigByDatePatterns = {\n \"dd.mm.yyyy\": {\n locale: \"en-GB\",\n options: { ...baseDateFormatOptions },\n postProcessor: (s) => s.replaceAll(\"/\", \".\")\n },\n \"dd/mm/yyyy\": { locale: \"en-GB\", options: { ...baseDateFormatOptions } },\n \"dd MMM yyyy\": {\n locale: \"en-GB\",\n options: { ...baseDateFormatOptions, month: \"short\" }\n },\n \"dd MMMM yyyy\": {\n locale: \"en-GB\",\n options: { ...baseDateFormatOptions, month: \"long\" }\n },\n \"mm/dd/yyyy\": { locale: \"en-US\", options: { ...baseDateFormatOptions } },\n \"MMM dd, yyyy\": {\n locale: \"en-US\",\n options: { ...baseDateFormatOptions, month: \"short\" }\n },\n \"MMMM dd, yyyy\": {\n locale: \"en-US\",\n options: { ...baseDateFormatOptions, month: \"long\" }\n }\n};\nvar formatConfigByDateTimePatterns = { ...formatConfigByDatePatterns, ...formatConfigByTimePatterns };\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 hasListener(event, listener) {\n const listeners = __privateGet(this, _events).get(event);\n if (Array.isArray(listeners)) {\n return listeners.includes(listener);\n } else {\n return listeners === listener;\n }\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/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 rangeIncludes = (range, index) => index >= range[0] && index <= range[1];\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 getSelectionStatus = (selected, itemIndex) => {\n for (const item of selected) {\n if (typeof item === \"number\") {\n if (item === itemIndex) {\n return SINGLE_SELECTED_ROW;\n }\n } else if (rangeIncludes(item, itemIndex)) {\n if (itemIndex === item[0]) {\n return FIRST_SELECTED_ROW_OF_BLOCK;\n } else if (itemIndex === item[1]) {\n return LAST_SELECTED_ROW_OF_BLOCK;\n } else {\n return RowSelected.True;\n }\n }\n }\n return RowSelected.False;\n};\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// ../../node_modules/html-to-image/es/util.js\nvar uuid = (() => {\n let counter = 0;\n const random = () => (\n // eslint-disable-next-line no-bitwise\n \\`0000\\${(Math.random() * 36 ** 4 << 0).toString(36)}\\`.slice(-4)\n );\n return () => {\n counter += 1;\n return \\`u\\${random()}\\${counter}\\`;\n };\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 connectionAttemptStatus = {};\nvar setWebsocket = Symbol(\"setWebsocket\");\nvar connectionCallback = Symbol(\"connectionCallback\");\nasync function connect(connectionString, protocol, callback, retryLimitDisconnect = 10, retryLimitStartup = 5) {\n connectionAttemptStatus[connectionString] = {\n status: \"connecting\",\n connect: {\n allowed: retryLimitStartup,\n remaining: retryLimitStartup\n },\n reconnect: {\n allowed: retryLimitDisconnect,\n remaining: retryLimitDisconnect\n }\n };\n return makeConnection(connectionString, protocol, callback);\n}\nasync function reconnect(connection) {\n throw Error(\"connection broken\");\n}\nasync function makeConnection(url, protocol, callback, connection) {\n const {\n status: currentStatus,\n connect: connectStatus,\n reconnect: reconnectStatus\n } = connectionAttemptStatus[url];\n const trackedStatus = currentStatus === \"connecting\" ? connectStatus : reconnectStatus;\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\\u26A1 %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 trackedStatus.remaining = trackedStatus.allowed;\n return websocketConnection;\n } catch (err) {\n const retry = --trackedStatus.remaining > 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, 2e3);\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 }, 2e3);\n ws.onerror = () => {\n error(\\`\\u26A1 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(\\`\\u26A1 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 isVuuRpcRequest = (message) => message[\"type\"] === \"VIEW_PORT_RPC_CALL\";\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 CLOSE_TREE_NODE = \"CLOSE_TREE_NODE\";\nvar CLOSE_TREE_SUCCESS = \"CLOSE_TREE_SUCCESS\";\nvar CREATE_VP = \"CREATE_VP\";\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 OPEN_TREE_NODE = \"OPEN_TREE_NODE\";\nvar OPEN_TREE_SUCCESS = \"OPEN_TREE_SUCCESS\";\nvar REMOVE_VP = \"REMOVE_VP\";\nvar SET_SELECTION_SUCCESS = \"SET_SELECTION_SUCCESS\";\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\");\nfunction dataIsUnchanged(newRow, existingRow) {\n if (!existingRow) {\n return false;\n }\n if (existingRow.data.length !== newRow.data.length) {\n return false;\n }\n if (existingRow.sel !== newRow.sel) {\n return false;\n }\n for (let i = 0; i < existingRow.data.length; i++) {\n if (existingRow.data[i] !== newRow.data[i]) {\n return false;\n }\n }\n return true;\n}\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 internalIndex = index - __privateGet(this, _range).from;\n if (dataIsUnchanged(row, this.internalData[internalIndex])) {\n return false;\n }\n const isWithinClientRange = this.isWithinClientRange(index);\n if (isWithinClientRange || this.isWithinRange(index)) {\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, _b;\n if (from !== __privateGet(this, _range).from || to !== __privateGet(this, _range).to) {\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);\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 } else {\n (_b = log.debug) == null ? void 0 : _b.call(log, \\`setRange \\${from} - \\${to} IGNORED because not changed\\`);\n }\n }\n //TODO temp\n get data() {\n return this.internalData;\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 /** batchMode is irrelevant for Vuu Table, it was introduced to try and improve rendering performance of AgGrid */\n this.batchMode = true;\n this.hasUpdates = false;\n this.pendingUpdates = [];\n this.pendingOperations = /* @__PURE__ */ new Map();\n this.pendingRangeRequests = [];\n this.rowCountChanged = false;\n this.selectedRows = [];\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 info2 == null ? void 0 : info2(\"throttling updates setTimeout to 2000\");\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.dataWindow = new ArrayBackedMovingWindow(\n this.clientRange,\n range,\n this.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;\n return (_a = this.dataWindow.rowCount) != null ? _a : 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 }, tableSchema) {\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.setRange(range.from, range.to);\n return {\n aggregations,\n type: \"subscribed\",\n clientViewportId: this.clientViewportId,\n columns,\n filter,\n groupBy,\n range,\n sort,\n 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(\n \\`no matching operation found to complete for requestId \\${requestId}\\`\n );\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, this.selectedRows);\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 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.size, 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, this.selectedRows));\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.selectedRows = 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) {\n const { keys, selectedRows } = 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, selectedRows));\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, selectedRows));\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, selectedRows) => {\n return [\n rowIndex,\n keys.keyFor(rowIndex),\n true,\n false,\n 0,\n 0,\n rowKey,\n isSelected ? getSelectionStatus(selectedRows, rowIndex) : 0\n ].concat(data);\n};\nvar toClientRowTree = ({ rowIndex, rowKey, sel: isSelected, data }, keys, selectedRows) => {\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 ? getSelectionStatus(selectedRows, rowIndex) : 0\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.pendingRequests = /* @__PURE__ */ new Map();\n this.queuedRequests = [];\n this.cachedTableMetaRequests = /* @__PURE__ */ new Map();\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 const pendingTableSchema = this.getTableMeta(message.table);\n const viewport = new Viewport(message, this.postMessageToClient);\n this.viewports.set(message.viewport, viewport);\n const pendingSubscription = this.awaitResponseToMessage(\n viewport.subscribe(),\n message.viewport\n );\n const awaitPendingReponses = Promise.all([\n pendingSubscription,\n pendingTableSchema\n ]);\n awaitPendingReponses.then(([subscribeResponse, tableSchema]) => {\n const { viewPortId: serverViewportId } = subscribeResponse;\n const { status: previousViewportStatus } = viewport;\n if (message.viewport !== serverViewportId) {\n this.viewports.delete(message.viewport);\n this.viewports.set(serverViewportId, viewport);\n }\n this.mapClientToServerViewport.set(message.viewport, serverViewportId);\n const clientResponse = viewport.handleSubscribed(\n subscribeResponse,\n tableSchema\n );\n if (clientResponse) {\n this.postMessageToClient(clientResponse);\n if (debugEnabled4) {\n debug4(\n \\`post DataSourceSubscribedMessage to client: \\${JSON.stringify(\n clientResponse\n )}\\`\n );\n }\n }\n if (viewport.disabled) {\n this.disableViewport(viewport);\n }\n if (this.queuedRequests.length > 0) {\n this.processQueuedRequests();\n }\n if (previousViewportStatus === \"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(this.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 } else {\n error3(\\`spurious subscribe call \\${message.viewport}\\`);\n }\n }\n processQueuedRequests() {\n const messageTypesProcessed = {};\n while (this.queuedRequests.length) {\n const queuedRequest = this.queuedRequests.pop();\n if (queuedRequest) {\n const { clientViewportId, message, requestId } = queuedRequest;\n if (message.type === \"CHANGE_VP_RANGE\") {\n if (messageTypesProcessed.CHANGE_VP_RANGE) {\n continue;\n }\n messageTypesProcessed.CHANGE_VP_RANGE = true;\n const serverViewportId = this.mapClientToServerViewport.get(clientViewportId);\n if (serverViewportId) {\n this.sendMessageToServer(\n {\n ...message,\n viewPortId: serverViewportId\n },\n requestId\n );\n }\n }\n }\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 info3 == null ? void 0 : info3(\\`setViewRange \\${message.range.from} - \\${message.range.to}\\`);\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 const sentToServer = this.sendIfReady(\n serverRequest,\n requestId,\n viewport.status === \"subscribed\"\n );\n if (!sentToServer) {\n this.queuedRequests.push({\n clientViewportId: message.viewport,\n message: serverRequest,\n requestId\n });\n }\n }\n if (rows) {\n info3 == null ? void 0 : info3(\\`setViewRange \\${rows.length} rows returned from cache\\`);\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 [size, rows] = viewport.resume();\n debug4 == null ? void 0 : debug4(\\`resumeViewport size \\${size}, \\${rows.length} rows sent to client\\`);\n this.postMessageToClient({\n clientViewportId: viewport.clientViewportId,\n mode: \"batch\",\n rows,\n size,\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 viewportRpcCall(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 namedParams: {}\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 var _a;\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 (isVuuRpcRequest(message)) {\n return this.viewportRpcCall(message);\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 (_a = this.tableList) != null ? _a : this.tableList = this.awaitResponseToMessage(\n { type },\n requestId\n );\n this.tableList.then((response) => {\n this.postMessageToClient({\n type: \"TABLE_LIST_RESP\",\n tables: response.tables,\n requestId\n });\n });\n return;\n }\n case \"GET_TABLE_META\": {\n this.getTableMeta(message.table, requestId).then((tableSchema) => {\n if (tableSchema) {\n this.postMessageToClient({\n type: \"TABLE_META_RESP\",\n tableSchema,\n requestId\n });\n }\n });\n return;\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 getTableMeta(table, requestId = nextRequestId()) {\n if (isSessionTable(table)) {\n return Promise.resolve(void 0);\n }\n const key = \\`\\${table.module}:\\${table.table}\\`;\n let tableMetaRequest = this.cachedTableMetaRequests.get(key);\n if (!tableMetaRequest) {\n tableMetaRequest = this.awaitResponseToMessage(\n { type: \"GET_TABLE_META\", table },\n requestId\n );\n this.cachedTableMetaRequests.set(key, tableMetaRequest);\n }\n return tableMetaRequest == null ? void 0 : tableMetaRequest.then((response) => this.cacheTableMeta(response));\n }\n awaitResponseToMessage(message, requestId = nextRequestId()) {\n return new Promise((resolve, reject) => {\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 }\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 \"REMOVE_VP_SUCCESS\":\n {\n const viewport = 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 [size, rows] = viewport.resume();\n this.postMessageToClient({\n clientViewportId: viewport.clientViewportId,\n mode: \"batch\",\n rows,\n size,\n type: \"viewport-update\"\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 \"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_REJ\": {\n console.log(\\`send menu error back to client\\`);\n const { error: error4, rpcName, vpId } = body;\n const viewport = this.viewports.get(vpId);\n if (viewport) {\n this.postMessageToClient({\n clientViewportId: viewport.clientViewportId,\n error: error4,\n rpcName,\n type: \"VIEW_PORT_MENU_REJ\",\n requestId\n });\n }\n break;\n }\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 \"VIEW_PORT_RPC_REPONSE\":\n {\n const { method, action } = body;\n this.postMessageToClient({\n type: \"VIEW_PORT_RPC_RESPONSE\",\n rpcName: method,\n action,\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 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 (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, retryLimitDisconnect, retryLimitStartup) {\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 retryLimitDisconnect,\n retryLimitStartup\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 message.retryLimitDisconnect,\n message.retryLimitStartup\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`;", "// FIXME profile adding a per-Tree TreeNode cache, validating it by\n// parent pointer\n/// The default maximum length of a `TreeBuffer` node.\nconst DefaultBufferLength = 1024;\nlet nextPropID = 0;\nclass Range {\n constructor(from, to) {\n this.from = from;\n this.to = to;\n }\n}\n/// Each [node type](#common.NodeType) or [individual tree](#common.Tree)\n/// can have metadata associated with it in props. Instances of this\n/// class represent prop names.\nclass NodeProp {\n /// Create a new node prop type.\n constructor(config = {}) {\n this.id = nextPropID++;\n this.perNode = !!config.perNode;\n this.deserialize = config.deserialize || (() => {\n throw new Error(\"This node type doesn't define a deserialize function\");\n });\n }\n /// This is meant to be used with\n /// [`NodeSet.extend`](#common.NodeSet.extend) or\n /// [`LRParser.configure`](#lr.ParserConfig.props) to compute\n /// prop values for each node type in the set. Takes a [match\n /// object](#common.NodeType^match) or function that returns undefined\n /// if the node type doesn't get this prop, and the prop's value if\n /// it does.\n add(match) {\n if (this.perNode)\n throw new RangeError(\"Can't add per-node props to node types\");\n if (typeof match != \"function\")\n match = NodeType.match(match);\n return (type) => {\n let result = match(type);\n return result === undefined ? null : [this, result];\n };\n }\n}\n/// Prop that is used to describe matching delimiters. For opening\n/// delimiters, this holds an array of node names (written as a\n/// space-separated string when declaring this prop in a grammar)\n/// for the node types of closing delimiters that match it.\nNodeProp.closedBy = new NodeProp({ deserialize: str => str.split(\" \") });\n/// The inverse of [`closedBy`](#common.NodeProp^closedBy). This is\n/// attached to closing delimiters, holding an array of node names\n/// of types of matching opening delimiters.\nNodeProp.openedBy = new NodeProp({ deserialize: str => str.split(\" \") });\n/// Used to assign node types to groups (for example, all node\n/// types that represent an expression could be tagged with an\n/// `\"Expression\"` group).\nNodeProp.group = new NodeProp({ deserialize: str => str.split(\" \") });\n/// The hash of the [context](#lr.ContextTracker.constructor)\n/// that the node was parsed in, if any. Used to limit reuse of\n/// contextual nodes.\nNodeProp.contextHash = new NodeProp({ perNode: true });\n/// The distance beyond the end of the node that the tokenizer\n/// looked ahead for any of the tokens inside the node. (The LR\n/// parser only stores this when it is larger than 25, for\n/// efficiency reasons.)\nNodeProp.lookAhead = new NodeProp({ perNode: true });\n/// This per-node prop is used to replace a given node, or part of a\n/// node, with another tree. This is useful to include trees from\n/// different languages in mixed-language parsers.\nNodeProp.mounted = new NodeProp({ perNode: true });\n/// A mounted tree, which can be [stored](#common.NodeProp^mounted) on\n/// a tree node to indicate that parts of its content are\n/// represented by another tree.\nclass MountedTree {\n constructor(\n /// The inner tree.\n tree, \n /// If this is null, this tree replaces the entire node (it will\n /// be included in the regular iteration instead of its host\n /// node). If not, only the given ranges are considered to be\n /// covered by this tree. This is used for trees that are mixed in\n /// a way that isn't strictly hierarchical. Such mounted trees are\n /// only entered by [`resolveInner`](#common.Tree.resolveInner)\n /// and [`enter`](#common.SyntaxNode.enter).\n overlay, \n /// The parser used to create this subtree.\n parser) {\n this.tree = tree;\n this.overlay = overlay;\n this.parser = parser;\n }\n}\nconst noProps = Object.create(null);\n/// Each node in a syntax tree has a node type associated with it.\nclass NodeType {\n /// @internal\n constructor(\n /// The name of the node type. Not necessarily unique, but if the\n /// grammar was written properly, different node types with the\n /// same name within a node set should play the same semantic\n /// role.\n name, \n /// @internal\n props, \n /// The id of this node in its set. Corresponds to the term ids\n /// used in the parser.\n id, \n /// @internal\n flags = 0) {\n this.name = name;\n this.props = props;\n this.id = id;\n this.flags = flags;\n }\n /// Define a node type.\n static define(spec) {\n let props = spec.props && spec.props.length ? Object.create(null) : noProps;\n let flags = (spec.top ? 1 /* NodeFlag.Top */ : 0) | (spec.skipped ? 2 /* NodeFlag.Skipped */ : 0) |\n (spec.error ? 4 /* NodeFlag.Error */ : 0) | (spec.name == null ? 8 /* NodeFlag.Anonymous */ : 0);\n let type = new NodeType(spec.name || \"\", props, spec.id, flags);\n if (spec.props)\n for (let src of spec.props) {\n if (!Array.isArray(src))\n src = src(type);\n if (src) {\n if (src[0].perNode)\n throw new RangeError(\"Can't store a per-node prop on a node type\");\n props[src[0].id] = src[1];\n }\n }\n return type;\n }\n /// Retrieves a node prop for this type. Will return `undefined` if\n /// the prop isn't present on this node.\n prop(prop) { return this.props[prop.id]; }\n /// True when this is the top node of a grammar.\n get isTop() { return (this.flags & 1 /* NodeFlag.Top */) > 0; }\n /// True when this node is produced by a skip rule.\n get isSkipped() { return (this.flags & 2 /* NodeFlag.Skipped */) > 0; }\n /// Indicates whether this is an error node.\n get isError() { return (this.flags & 4 /* NodeFlag.Error */) > 0; }\n /// When true, this node type doesn't correspond to a user-declared\n /// named node, for example because it is used to cache repetition.\n get isAnonymous() { return (this.flags & 8 /* NodeFlag.Anonymous */) > 0; }\n /// Returns true when this node's name or one of its\n /// [groups](#common.NodeProp^group) matches the given string.\n is(name) {\n if (typeof name == 'string') {\n if (this.name == name)\n return true;\n let group = this.prop(NodeProp.group);\n return group ? group.indexOf(name) > -1 : false;\n }\n return this.id == name;\n }\n /// Create a function from node types to arbitrary values by\n /// specifying an object whose property names are node or\n /// [group](#common.NodeProp^group) names. Often useful with\n /// [`NodeProp.add`](#common.NodeProp.add). You can put multiple\n /// names, separated by spaces, in a single property name to map\n /// multiple node names to a single value.\n static match(map) {\n let direct = Object.create(null);\n for (let prop in map)\n for (let name of prop.split(\" \"))\n direct[name] = map[prop];\n return (node) => {\n for (let groups = node.prop(NodeProp.group), i = -1; i < (groups ? groups.length : 0); i++) {\n let found = direct[i < 0 ? node.name : groups[i]];\n if (found)\n return found;\n }\n };\n }\n}\n/// An empty dummy node type to use when no actual type is available.\nNodeType.none = new NodeType(\"\", Object.create(null), 0, 8 /* NodeFlag.Anonymous */);\n/// A node set holds a collection of node types. It is used to\n/// compactly represent trees by storing their type ids, rather than a\n/// full pointer to the type object, in a numeric array. Each parser\n/// [has](#lr.LRParser.nodeSet) a node set, and [tree\n/// buffers](#common.TreeBuffer) can only store collections of nodes\n/// from the same set. A set can have a maximum of 2**16 (65536) node\n/// types in it, so that the ids fit into 16-bit typed array slots.\nclass NodeSet {\n /// Create a set with the given types. The `id` property of each\n /// type should correspond to its position within the array.\n constructor(\n /// The node types in this set, by id.\n types) {\n this.types = types;\n for (let i = 0; i < types.length; i++)\n if (types[i].id != i)\n throw new RangeError(\"Node type ids should correspond to array positions when creating a node set\");\n }\n /// Create a copy of this set with some node properties added. The\n /// arguments to this method can be created with\n /// [`NodeProp.add`](#common.NodeProp.add).\n extend(...props) {\n let newTypes = [];\n for (let type of this.types) {\n let newProps = null;\n for (let source of props) {\n let add = source(type);\n if (add) {\n if (!newProps)\n newProps = Object.assign({}, type.props);\n newProps[add[0].id] = add[1];\n }\n }\n newTypes.push(newProps ? new NodeType(type.name, newProps, type.id, type.flags) : type);\n }\n return new NodeSet(newTypes);\n }\n}\nconst CachedNode = new WeakMap(), CachedInnerNode = new WeakMap();\n/// Options that control iteration. Can be combined with the `|`\n/// operator to enable multiple ones.\nvar IterMode;\n(function (IterMode) {\n /// When enabled, iteration will only visit [`Tree`](#common.Tree)\n /// objects, not nodes packed into\n /// [`TreeBuffer`](#common.TreeBuffer)s.\n IterMode[IterMode[\"ExcludeBuffers\"] = 1] = \"ExcludeBuffers\";\n /// Enable this to make iteration include anonymous nodes (such as\n /// the nodes that wrap repeated grammar constructs into a balanced\n /// tree).\n IterMode[IterMode[\"IncludeAnonymous\"] = 2] = \"IncludeAnonymous\";\n /// By default, regular [mounted](#common.NodeProp^mounted) nodes\n /// replace their base node in iteration. Enable this to ignore them\n /// instead.\n IterMode[IterMode[\"IgnoreMounts\"] = 4] = \"IgnoreMounts\";\n /// This option only applies in\n /// [`enter`](#common.SyntaxNode.enter)-style methods. It tells the\n /// library to not enter mounted overlays if one covers the given\n /// position.\n IterMode[IterMode[\"IgnoreOverlays\"] = 8] = \"IgnoreOverlays\";\n})(IterMode || (IterMode = {}));\n/// A piece of syntax tree. There are two ways to approach these\n/// trees: the way they are actually stored in memory, and the\n/// convenient way.\n///\n/// Syntax trees are stored as a tree of `Tree` and `TreeBuffer`\n/// objects. By packing detail information into `TreeBuffer` leaf\n/// nodes, the representation is made a lot more memory-efficient.\n///\n/// However, when you want to actually work with tree nodes, this\n/// representation is very awkward, so most client code will want to\n/// use the [`TreeCursor`](#common.TreeCursor) or\n/// [`SyntaxNode`](#common.SyntaxNode) interface instead, which provides\n/// a view on some part of this data structure, and can be used to\n/// move around to adjacent nodes.\nclass Tree {\n /// Construct a new tree. See also [`Tree.build`](#common.Tree^build).\n constructor(\n /// The type of the top node.\n type, \n /// This node's child nodes.\n children, \n /// The positions (offsets relative to the start of this tree) of\n /// the children.\n positions, \n /// The total length of this tree\n length, \n /// Per-node [node props](#common.NodeProp) to associate with this node.\n props) {\n this.type = type;\n this.children = children;\n this.positions = positions;\n this.length = length;\n /// @internal\n this.props = null;\n if (props && props.length) {\n this.props = Object.create(null);\n for (let [prop, value] of props)\n this.props[typeof prop == \"number\" ? prop : prop.id] = value;\n }\n }\n /// @internal\n toString() {\n let mounted = this.prop(NodeProp.mounted);\n if (mounted && !mounted.overlay)\n return mounted.tree.toString();\n let children = \"\";\n for (let ch of this.children) {\n let str = ch.toString();\n if (str) {\n if (children)\n children += \",\";\n children += str;\n }\n }\n return !this.type.name ? children :\n (/\\W/.test(this.type.name) && !this.type.isError ? JSON.stringify(this.type.name) : this.type.name) +\n (children.length ? \"(\" + children + \")\" : \"\");\n }\n /// Get a [tree cursor](#common.TreeCursor) positioned at the top of\n /// the tree. Mode can be used to [control](#common.IterMode) which\n /// nodes the cursor visits.\n cursor(mode = 0) {\n return new TreeCursor(this.topNode, mode);\n }\n /// Get a [tree cursor](#common.TreeCursor) pointing into this tree\n /// at the given position and side (see\n /// [`moveTo`](#common.TreeCursor.moveTo).\n cursorAt(pos, side = 0, mode = 0) {\n let scope = CachedNode.get(this) || this.topNode;\n let cursor = new TreeCursor(scope);\n cursor.moveTo(pos, side);\n CachedNode.set(this, cursor._tree);\n return cursor;\n }\n /// Get a [syntax node](#common.SyntaxNode) object for the top of the\n /// tree.\n get topNode() {\n return new TreeNode(this, 0, 0, null);\n }\n /// Get the [syntax node](#common.SyntaxNode) at the given position.\n /// If `side` is -1, this will move into nodes that end at the\n /// position. If 1, it'll move into nodes that start at the\n /// position. With 0, it'll only enter nodes that cover the position\n /// from both sides.\n ///\n /// Note that this will not enter\n /// [overlays](#common.MountedTree.overlay), and you often want\n /// [`resolveInner`](#common.Tree.resolveInner) instead.\n resolve(pos, side = 0) {\n let node = resolveNode(CachedNode.get(this) || this.topNode, pos, side, false);\n CachedNode.set(this, node);\n return node;\n }\n /// Like [`resolve`](#common.Tree.resolve), but will enter\n /// [overlaid](#common.MountedTree.overlay) nodes, producing a syntax node\n /// pointing into the innermost overlaid tree at the given position\n /// (with parent links going through all parent structure, including\n /// the host trees).\n resolveInner(pos, side = 0) {\n let node = resolveNode(CachedInnerNode.get(this) || this.topNode, pos, side, true);\n CachedInnerNode.set(this, node);\n return node;\n }\n /// Iterate over the tree and its children, calling `enter` for any\n /// node that touches the `from`/`to` region (if given) before\n /// running over such a node's children, and `leave` (if given) when\n /// leaving the node. When `enter` returns `false`, that node will\n /// not have its children iterated over (or `leave` called).\n iterate(spec) {\n let { enter, leave, from = 0, to = this.length } = spec;\n let mode = spec.mode || 0, anon = (mode & IterMode.IncludeAnonymous) > 0;\n for (let c = this.cursor(mode | IterMode.IncludeAnonymous);;) {\n let entered = false;\n if (c.from <= to && c.to >= from && (!anon && c.type.isAnonymous || enter(c) !== false)) {\n if (c.firstChild())\n continue;\n entered = true;\n }\n for (;;) {\n if (entered && leave && (anon || !c.type.isAnonymous))\n leave(c);\n if (c.nextSibling())\n break;\n if (!c.parent())\n return;\n entered = true;\n }\n }\n }\n /// Get the value of the given [node prop](#common.NodeProp) for this\n /// node. Works with both per-node and per-type props.\n prop(prop) {\n return !prop.perNode ? this.type.prop(prop) : this.props ? this.props[prop.id] : undefined;\n }\n /// Returns the node's [per-node props](#common.NodeProp.perNode) in a\n /// format that can be passed to the [`Tree`](#common.Tree)\n /// constructor.\n get propValues() {\n let result = [];\n if (this.props)\n for (let id in this.props)\n result.push([+id, this.props[id]]);\n return result;\n }\n /// Balance the direct children of this tree, producing a copy of\n /// which may have children grouped into subtrees with type\n /// [`NodeType.none`](#common.NodeType^none).\n balance(config = {}) {\n return this.children.length <= 8 /* Balance.BranchFactor */ ? this :\n balanceRange(NodeType.none, this.children, this.positions, 0, this.children.length, 0, this.length, (children, positions, length) => new Tree(this.type, children, positions, length, this.propValues), config.makeTree || ((children, positions, length) => new Tree(NodeType.none, children, positions, length)));\n }\n /// Build a tree from a postfix-ordered buffer of node information,\n /// or a cursor over such a buffer.\n static build(data) { return buildTree(data); }\n}\n/// The empty tree\nTree.empty = new Tree(NodeType.none, [], [], 0);\nclass FlatBufferCursor {\n constructor(buffer, index) {\n this.buffer = buffer;\n this.index = index;\n }\n get id() { return this.buffer[this.index - 4]; }\n get start() { return this.buffer[this.index - 3]; }\n get end() { return this.buffer[this.index - 2]; }\n get size() { return this.buffer[this.index - 1]; }\n get pos() { return this.index; }\n next() { this.index -= 4; }\n fork() { return new FlatBufferCursor(this.buffer, this.index); }\n}\n/// Tree buffers contain (type, start, end, endIndex) quads for each\n/// node. In such a buffer, nodes are stored in prefix order (parents\n/// before children, with the endIndex of the parent indicating which\n/// children belong to it).\nclass TreeBuffer {\n /// Create a tree buffer.\n constructor(\n /// The buffer's content.\n buffer, \n /// The total length of the group of nodes in the buffer.\n length, \n /// The node set used in this buffer.\n set) {\n this.buffer = buffer;\n this.length = length;\n this.set = set;\n }\n /// @internal\n get type() { return NodeType.none; }\n /// @internal\n toString() {\n let result = [];\n for (let index = 0; index < this.buffer.length;) {\n result.push(this.childString(index));\n index = this.buffer[index + 3];\n }\n return result.join(\",\");\n }\n /// @internal\n childString(index) {\n let id = this.buffer[index], endIndex = this.buffer[index + 3];\n let type = this.set.types[id], result = type.name;\n if (/\\W/.test(result) && !type.isError)\n result = JSON.stringify(result);\n index += 4;\n if (endIndex == index)\n return result;\n let children = [];\n while (index < endIndex) {\n children.push(this.childString(index));\n index = this.buffer[index + 3];\n }\n return result + \"(\" + children.join(\",\") + \")\";\n }\n /// @internal\n findChild(startIndex, endIndex, dir, pos, side) {\n let { buffer } = this, pick = -1;\n for (let i = startIndex; i != endIndex; i = buffer[i + 3]) {\n if (checkSide(side, pos, buffer[i + 1], buffer[i + 2])) {\n pick = i;\n if (dir > 0)\n break;\n }\n }\n return pick;\n }\n /// @internal\n slice(startI, endI, from) {\n let b = this.buffer;\n let copy = new Uint16Array(endI - startI), len = 0;\n for (let i = startI, j = 0; i < endI;) {\n copy[j++] = b[i++];\n copy[j++] = b[i++] - from;\n let to = copy[j++] = b[i++] - from;\n copy[j++] = b[i++] - startI;\n len = Math.max(len, to);\n }\n return new TreeBuffer(copy, len, this.set);\n }\n}\nfunction checkSide(side, pos, from, to) {\n switch (side) {\n case -2 /* Side.Before */: return from < pos;\n case -1 /* Side.AtOrBefore */: return to >= pos && from < pos;\n case 0 /* Side.Around */: return from < pos && to > pos;\n case 1 /* Side.AtOrAfter */: return from <= pos && to > pos;\n case 2 /* Side.After */: return to > pos;\n case 4 /* Side.DontCare */: return true;\n }\n}\nfunction enterUnfinishedNodesBefore(node, pos) {\n let scan = node.childBefore(pos);\n while (scan) {\n let last = scan.lastChild;\n if (!last || last.to != scan.to)\n break;\n if (last.type.isError && last.from == last.to) {\n node = scan;\n scan = last.prevSibling;\n }\n else {\n scan = last;\n }\n }\n return node;\n}\nfunction resolveNode(node, pos, side, overlays) {\n var _a;\n // Move up to a node that actually holds the position, if possible\n while (node.from == node.to ||\n (side < 1 ? node.from >= pos : node.from > pos) ||\n (side > -1 ? node.to <= pos : node.to < pos)) {\n let parent = !overlays && node instanceof TreeNode && node.index < 0 ? null : node.parent;\n if (!parent)\n return node;\n node = parent;\n }\n let mode = overlays ? 0 : IterMode.IgnoreOverlays;\n // Must go up out of overlays when those do not overlap with pos\n if (overlays)\n for (let scan = node, parent = scan.parent; parent; scan = parent, parent = scan.parent) {\n if (scan instanceof TreeNode && scan.index < 0 && ((_a = parent.enter(pos, side, mode)) === null || _a === void 0 ? void 0 : _a.from) != scan.from)\n node = parent;\n }\n for (;;) {\n let inner = node.enter(pos, side, mode);\n if (!inner)\n return node;\n node = inner;\n }\n}\nclass TreeNode {\n constructor(_tree, from, \n // Index in parent node, set to -1 if the node is not a direct child of _parent.node (overlay)\n index, _parent) {\n this._tree = _tree;\n this.from = from;\n this.index = index;\n this._parent = _parent;\n }\n get type() { return this._tree.type; }\n get name() { return this._tree.type.name; }\n get to() { return this.from + this._tree.length; }\n nextChild(i, dir, pos, side, mode = 0) {\n for (let parent = this;;) {\n for (let { children, positions } = parent._tree, e = dir > 0 ? children.length : -1; i != e; i += dir) {\n let next = children[i], start = positions[i] + parent.from;\n if (!checkSide(side, pos, start, start + next.length))\n continue;\n if (next instanceof TreeBuffer) {\n if (mode & IterMode.ExcludeBuffers)\n continue;\n let index = next.findChild(0, next.buffer.length, dir, pos - start, side);\n if (index > -1)\n return new BufferNode(new BufferContext(parent, next, i, start), null, index);\n }\n else if ((mode & IterMode.IncludeAnonymous) || (!next.type.isAnonymous || hasChild(next))) {\n let mounted;\n if (!(mode & IterMode.IgnoreMounts) &&\n next.props && (mounted = next.prop(NodeProp.mounted)) && !mounted.overlay)\n return new TreeNode(mounted.tree, start, i, parent);\n let inner = new TreeNode(next, start, i, parent);\n return (mode & IterMode.IncludeAnonymous) || !inner.type.isAnonymous ? inner\n : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side);\n }\n }\n if ((mode & IterMode.IncludeAnonymous) || !parent.type.isAnonymous)\n return null;\n if (parent.index >= 0)\n i = parent.index + dir;\n else\n i = dir < 0 ? -1 : parent._parent._tree.children.length;\n parent = parent._parent;\n if (!parent)\n return null;\n }\n }\n get firstChild() { return this.nextChild(0, 1, 0, 4 /* Side.DontCare */); }\n get lastChild() { return this.nextChild(this._tree.children.length - 1, -1, 0, 4 /* Side.DontCare */); }\n childAfter(pos) { return this.nextChild(0, 1, pos, 2 /* Side.After */); }\n childBefore(pos) { return this.nextChild(this._tree.children.length - 1, -1, pos, -2 /* Side.Before */); }\n enter(pos, side, mode = 0) {\n let mounted;\n if (!(mode & IterMode.IgnoreOverlays) && (mounted = this._tree.prop(NodeProp.mounted)) && mounted.overlay) {\n let rPos = pos - this.from;\n for (let { from, to } of mounted.overlay) {\n if ((side > 0 ? from <= rPos : from < rPos) &&\n (side < 0 ? to >= rPos : to > rPos))\n return new TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this);\n }\n }\n return this.nextChild(0, 1, pos, side, mode);\n }\n nextSignificantParent() {\n let val = this;\n while (val.type.isAnonymous && val._parent)\n val = val._parent;\n return val;\n }\n get parent() {\n return this._parent ? this._parent.nextSignificantParent() : null;\n }\n get nextSibling() {\n return this._parent && this.index >= 0 ? this._parent.nextChild(this.index + 1, 1, 0, 4 /* Side.DontCare */) : null;\n }\n get prevSibling() {\n return this._parent && this.index >= 0 ? this._parent.nextChild(this.index - 1, -1, 0, 4 /* Side.DontCare */) : null;\n }\n cursor(mode = 0) { return new TreeCursor(this, mode); }\n get tree() { return this._tree; }\n toTree() { return this._tree; }\n resolve(pos, side = 0) {\n return resolveNode(this, pos, side, false);\n }\n resolveInner(pos, side = 0) {\n return resolveNode(this, pos, side, true);\n }\n enterUnfinishedNodesBefore(pos) { return enterUnfinishedNodesBefore(this, pos); }\n getChild(type, before = null, after = null) {\n let r = getChildren(this, type, before, after);\n return r.length ? r[0] : null;\n }\n getChildren(type, before = null, after = null) {\n return getChildren(this, type, before, after);\n }\n /// @internal\n toString() { return this._tree.toString(); }\n get node() { return this; }\n matchContext(context) { return matchNodeContext(this, context); }\n}\nfunction getChildren(node, type, before, after) {\n let cur = node.cursor(), result = [];\n if (!cur.firstChild())\n return result;\n if (before != null)\n while (!cur.type.is(before))\n if (!cur.nextSibling())\n return result;\n for (;;) {\n if (after != null && cur.type.is(after))\n return result;\n if (cur.type.is(type))\n result.push(cur.node);\n if (!cur.nextSibling())\n return after == null ? result : [];\n }\n}\nfunction matchNodeContext(node, context, i = context.length - 1) {\n for (let p = node.parent; i >= 0; p = p.parent) {\n if (!p)\n return false;\n if (!p.type.isAnonymous) {\n if (context[i] && context[i] != p.name)\n return false;\n i--;\n }\n }\n return true;\n}\nclass BufferContext {\n constructor(parent, buffer, index, start) {\n this.parent = parent;\n this.buffer = buffer;\n this.index = index;\n this.start = start;\n }\n}\nclass BufferNode {\n get name() { return this.type.name; }\n get from() { return this.context.start + this.context.buffer.buffer[this.index + 1]; }\n get to() { return this.context.start + this.context.buffer.buffer[this.index + 2]; }\n constructor(context, _parent, index) {\n this.context = context;\n this._parent = _parent;\n this.index = index;\n this.type = context.buffer.set.types[context.buffer.buffer[index]];\n }\n child(dir, pos, side) {\n let { buffer } = this.context;\n let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.context.start, side);\n return index < 0 ? null : new BufferNode(this.context, this, index);\n }\n get firstChild() { return this.child(1, 0, 4 /* Side.DontCare */); }\n get lastChild() { return this.child(-1, 0, 4 /* Side.DontCare */); }\n childAfter(pos) { return this.child(1, pos, 2 /* Side.After */); }\n childBefore(pos) { return this.child(-1, pos, -2 /* Side.Before */); }\n enter(pos, side, mode = 0) {\n if (mode & IterMode.ExcludeBuffers)\n return null;\n let { buffer } = this.context;\n let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], side > 0 ? 1 : -1, pos - this.context.start, side);\n return index < 0 ? null : new BufferNode(this.context, this, index);\n }\n get parent() {\n return this._parent || this.context.parent.nextSignificantParent();\n }\n externalSibling(dir) {\n return this._parent ? null : this.context.parent.nextChild(this.context.index + dir, dir, 0, 4 /* Side.DontCare */);\n }\n get nextSibling() {\n let { buffer } = this.context;\n let after = buffer.buffer[this.index + 3];\n if (after < (this._parent ? buffer.buffer[this._parent.index + 3] : buffer.buffer.length))\n return new BufferNode(this.context, this._parent, after);\n return this.externalSibling(1);\n }\n get prevSibling() {\n let { buffer } = this.context;\n let parentStart = this._parent ? this._parent.index + 4 : 0;\n if (this.index == parentStart)\n return this.externalSibling(-1);\n return new BufferNode(this.context, this._parent, buffer.findChild(parentStart, this.index, -1, 0, 4 /* Side.DontCare */));\n }\n cursor(mode = 0) { return new TreeCursor(this, mode); }\n get tree() { return null; }\n toTree() {\n let children = [], positions = [];\n let { buffer } = this.context;\n let startI = this.index + 4, endI = buffer.buffer[this.index + 3];\n if (endI > startI) {\n let from = buffer.buffer[this.index + 1];\n children.push(buffer.slice(startI, endI, from));\n positions.push(0);\n }\n return new Tree(this.type, children, positions, this.to - this.from);\n }\n resolve(pos, side = 0) {\n return resolveNode(this, pos, side, false);\n }\n resolveInner(pos, side = 0) {\n return resolveNode(this, pos, side, true);\n }\n enterUnfinishedNodesBefore(pos) { return enterUnfinishedNodesBefore(this, pos); }\n /// @internal\n toString() { return this.context.buffer.childString(this.index); }\n getChild(type, before = null, after = null) {\n let r = getChildren(this, type, before, after);\n return r.length ? r[0] : null;\n }\n getChildren(type, before = null, after = null) {\n return getChildren(this, type, before, after);\n }\n get node() { return this; }\n matchContext(context) { return matchNodeContext(this, context); }\n}\n/// A tree cursor object focuses on a given node in a syntax tree, and\n/// allows you to move to adjacent nodes.\nclass TreeCursor {\n /// Shorthand for `.type.name`.\n get name() { return this.type.name; }\n /// @internal\n constructor(node, \n /// @internal\n mode = 0) {\n this.mode = mode;\n /// @internal\n this.buffer = null;\n this.stack = [];\n /// @internal\n this.index = 0;\n this.bufferNode = null;\n if (node instanceof TreeNode) {\n this.yieldNode(node);\n }\n else {\n this._tree = node.context.parent;\n this.buffer = node.context;\n for (let n = node._parent; n; n = n._parent)\n this.stack.unshift(n.index);\n this.bufferNode = node;\n this.yieldBuf(node.index);\n }\n }\n yieldNode(node) {\n if (!node)\n return false;\n this._tree = node;\n this.type = node.type;\n this.from = node.from;\n this.to = node.to;\n return true;\n }\n yieldBuf(index, type) {\n this.index = index;\n let { start, buffer } = this.buffer;\n this.type = type || buffer.set.types[buffer.buffer[index]];\n this.from = start + buffer.buffer[index + 1];\n this.to = start + buffer.buffer[index + 2];\n return true;\n }\n yield(node) {\n if (!node)\n return false;\n if (node instanceof TreeNode) {\n this.buffer = null;\n return this.yieldNode(node);\n }\n this.buffer = node.context;\n return this.yieldBuf(node.index, node.type);\n }\n /// @internal\n toString() {\n return this.buffer ? this.buffer.buffer.childString(this.index) : this._tree.toString();\n }\n /// @internal\n enterChild(dir, pos, side) {\n if (!this.buffer)\n return this.yield(this._tree.nextChild(dir < 0 ? this._tree._tree.children.length - 1 : 0, dir, pos, side, this.mode));\n let { buffer } = this.buffer;\n let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.buffer.start, side);\n if (index < 0)\n return false;\n this.stack.push(this.index);\n return this.yieldBuf(index);\n }\n /// Move the cursor to this node's first child. When this returns\n /// false, the node has no child, and the cursor has not been moved.\n firstChild() { return this.enterChild(1, 0, 4 /* Side.DontCare */); }\n /// Move the cursor to this node's last child.\n lastChild() { return this.enterChild(-1, 0, 4 /* Side.DontCare */); }\n /// Move the cursor to the first child that ends after `pos`.\n childAfter(pos) { return this.enterChild(1, pos, 2 /* Side.After */); }\n /// Move to the last child that starts before `pos`.\n childBefore(pos) { return this.enterChild(-1, pos, -2 /* Side.Before */); }\n /// Move the cursor to the child around `pos`. If side is -1 the\n /// child may end at that position, when 1 it may start there. This\n /// will also enter [overlaid](#common.MountedTree.overlay)\n /// [mounted](#common.NodeProp^mounted) trees unless `overlays` is\n /// set to false.\n enter(pos, side, mode = this.mode) {\n if (!this.buffer)\n return this.yield(this._tree.enter(pos, side, mode));\n return mode & IterMode.ExcludeBuffers ? false : this.enterChild(1, pos, side);\n }\n /// Move to the node's parent node, if this isn't the top node.\n parent() {\n if (!this.buffer)\n return this.yieldNode((this.mode & IterMode.IncludeAnonymous) ? this._tree._parent : this._tree.parent);\n if (this.stack.length)\n return this.yieldBuf(this.stack.pop());\n let parent = (this.mode & IterMode.IncludeAnonymous) ? this.buffer.parent : this.buffer.parent.nextSignificantParent();\n this.buffer = null;\n return this.yieldNode(parent);\n }\n /// @internal\n sibling(dir) {\n if (!this.buffer)\n return !this._tree._parent ? false\n : this.yield(this._tree.index < 0 ? null\n : this._tree._parent.nextChild(this._tree.index + dir, dir, 0, 4 /* Side.DontCare */, this.mode));\n let { buffer } = this.buffer, d = this.stack.length - 1;\n if (dir < 0) {\n let parentStart = d < 0 ? 0 : this.stack[d] + 4;\n if (this.index != parentStart)\n return this.yieldBuf(buffer.findChild(parentStart, this.index, -1, 0, 4 /* Side.DontCare */));\n }\n else {\n let after = buffer.buffer[this.index + 3];\n if (after < (d < 0 ? buffer.buffer.length : buffer.buffer[this.stack[d] + 3]))\n return this.yieldBuf(after);\n }\n return d < 0 ? this.yield(this.buffer.parent.nextChild(this.buffer.index + dir, dir, 0, 4 /* Side.DontCare */, this.mode)) : false;\n }\n /// Move to this node's next sibling, if any.\n nextSibling() { return this.sibling(1); }\n /// Move to this node's previous sibling, if any.\n prevSibling() { return this.sibling(-1); }\n atLastNode(dir) {\n let index, parent, { buffer } = this;\n if (buffer) {\n if (dir > 0) {\n if (this.index < buffer.buffer.buffer.length)\n return false;\n }\n else {\n for (let i = 0; i < this.index; i++)\n if (buffer.buffer.buffer[i + 3] < this.index)\n return false;\n }\n ({ index, parent } = buffer);\n }\n else {\n ({ index, _parent: parent } = this._tree);\n }\n for (; parent; { index, _parent: parent } = parent) {\n if (index > -1)\n for (let i = index + dir, e = dir < 0 ? -1 : parent._tree.children.length; i != e; i += dir) {\n let child = parent._tree.children[i];\n if ((this.mode & IterMode.IncludeAnonymous) ||\n child instanceof TreeBuffer ||\n !child.type.isAnonymous ||\n hasChild(child))\n return false;\n }\n }\n return true;\n }\n move(dir, enter) {\n if (enter && this.enterChild(dir, 0, 4 /* Side.DontCare */))\n return true;\n for (;;) {\n if (this.sibling(dir))\n return true;\n if (this.atLastNode(dir) || !this.parent())\n return false;\n }\n }\n /// Move to the next node in a\n /// [pre-order](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order,_NLR)\n /// traversal, going from a node to its first child or, if the\n /// current node is empty or `enter` is false, its next sibling or\n /// the next sibling of the first parent node that has one.\n next(enter = true) { return this.move(1, enter); }\n /// Move to the next node in a last-to-first pre-order traveral. A\n /// node is followed by its last child or, if it has none, its\n /// previous sibling or the previous sibling of the first parent\n /// node that has one.\n prev(enter = true) { return this.move(-1, enter); }\n /// Move the cursor to the innermost node that covers `pos`. If\n /// `side` is -1, it will enter nodes that end at `pos`. If it is 1,\n /// it will enter nodes that start at `pos`.\n moveTo(pos, side = 0) {\n // Move up to a node that actually holds the position, if possible\n while (this.from == this.to ||\n (side < 1 ? this.from >= pos : this.from > pos) ||\n (side > -1 ? this.to <= pos : this.to < pos))\n if (!this.parent())\n break;\n // Then scan down into child nodes as far as possible\n while (this.enterChild(1, pos, side)) { }\n return this;\n }\n /// Get a [syntax node](#common.SyntaxNode) at the cursor's current\n /// position.\n get node() {\n if (!this.buffer)\n return this._tree;\n let cache = this.bufferNode, result = null, depth = 0;\n if (cache && cache.context == this.buffer) {\n scan: for (let index = this.index, d = this.stack.length; d >= 0;) {\n for (let c = cache; c; c = c._parent)\n if (c.index == index) {\n if (index == this.index)\n return c;\n result = c;\n depth = d + 1;\n break scan;\n }\n index = this.stack[--d];\n }\n }\n for (let i = depth; i < this.stack.length; i++)\n result = new BufferNode(this.buffer, result, this.stack[i]);\n return this.bufferNode = new BufferNode(this.buffer, result, this.index);\n }\n /// Get the [tree](#common.Tree) that represents the current node, if\n /// any. Will return null when the node is in a [tree\n /// buffer](#common.TreeBuffer).\n get tree() {\n return this.buffer ? null : this._tree._tree;\n }\n /// Iterate over the current node and all its descendants, calling\n /// `enter` when entering a node and `leave`, if given, when leaving\n /// one. When `enter` returns `false`, any children of that node are\n /// skipped, and `leave` isn't called for it.\n iterate(enter, leave) {\n for (let depth = 0;;) {\n let mustLeave = false;\n if (this.type.isAnonymous || enter(this) !== false) {\n if (this.firstChild()) {\n depth++;\n continue;\n }\n if (!this.type.isAnonymous)\n mustLeave = true;\n }\n for (;;) {\n if (mustLeave && leave)\n leave(this);\n mustLeave = this.type.isAnonymous;\n if (this.nextSibling())\n break;\n if (!depth)\n return;\n this.parent();\n depth--;\n mustLeave = true;\n }\n }\n }\n /// Test whether the current node matches a given context\u2014a sequence\n /// of direct parent node names. Empty strings in the context array\n /// are treated as wildcards.\n matchContext(context) {\n if (!this.buffer)\n return matchNodeContext(this.node, context);\n let { buffer } = this.buffer, { types } = buffer.set;\n for (let i = context.length - 1, d = this.stack.length - 1; i >= 0; d--) {\n if (d < 0)\n return matchNodeContext(this.node, context, i);\n let type = types[buffer.buffer[this.stack[d]]];\n if (!type.isAnonymous) {\n if (context[i] && context[i] != type.name)\n return false;\n i--;\n }\n }\n return true;\n }\n}\nfunction hasChild(tree) {\n return tree.children.some(ch => ch instanceof TreeBuffer || !ch.type.isAnonymous || hasChild(ch));\n}\nfunction buildTree(data) {\n var _a;\n let { buffer, nodeSet, maxBufferLength = DefaultBufferLength, reused = [], minRepeatType = nodeSet.types.length } = data;\n let cursor = Array.isArray(buffer) ? new FlatBufferCursor(buffer, buffer.length) : buffer;\n let types = nodeSet.types;\n let contextHash = 0, lookAhead = 0;\n function takeNode(parentStart, minPos, children, positions, inRepeat) {\n let { id, start, end, size } = cursor;\n let lookAheadAtStart = lookAhead;\n while (size < 0) {\n cursor.next();\n if (size == -1 /* SpecialRecord.Reuse */) {\n let node = reused[id];\n children.push(node);\n positions.push(start - parentStart);\n return;\n }\n else if (size == -3 /* SpecialRecord.ContextChange */) { // Context change\n contextHash = id;\n return;\n }\n else if (size == -4 /* SpecialRecord.LookAhead */) {\n lookAhead = id;\n return;\n }\n else {\n throw new RangeError(`Unrecognized record size: ${size}`);\n }\n }\n let type = types[id], node, buffer;\n let startPos = start - parentStart;\n if (end - start <= maxBufferLength && (buffer = findBufferSize(cursor.pos - minPos, inRepeat))) {\n // Small enough for a buffer, and no reused nodes inside\n let data = new Uint16Array(buffer.size - buffer.skip);\n let endPos = cursor.pos - buffer.size, index = data.length;\n while (cursor.pos > endPos)\n index = copyToBuffer(buffer.start, data, index);\n node = new TreeBuffer(data, end - buffer.start, nodeSet);\n startPos = buffer.start - parentStart;\n }\n else { // Make it a node\n let endPos = cursor.pos - size;\n cursor.next();\n let localChildren = [], localPositions = [];\n let localInRepeat = id >= minRepeatType ? id : -1;\n let lastGroup = 0, lastEnd = end;\n while (cursor.pos > endPos) {\n if (localInRepeat >= 0 && cursor.id == localInRepeat && cursor.size >= 0) {\n if (cursor.end <= lastEnd - maxBufferLength) {\n makeRepeatLeaf(localChildren, localPositions, start, lastGroup, cursor.end, lastEnd, localInRepeat, lookAheadAtStart);\n lastGroup = localChildren.length;\n lastEnd = cursor.end;\n }\n cursor.next();\n }\n else {\n takeNode(start, endPos, localChildren, localPositions, localInRepeat);\n }\n }\n if (localInRepeat >= 0 && lastGroup > 0 && lastGroup < localChildren.length)\n makeRepeatLeaf(localChildren, localPositions, start, lastGroup, start, lastEnd, localInRepeat, lookAheadAtStart);\n localChildren.reverse();\n localPositions.reverse();\n if (localInRepeat > -1 && lastGroup > 0) {\n let make = makeBalanced(type);\n node = balanceRange(type, localChildren, localPositions, 0, localChildren.length, 0, end - start, make, make);\n }\n else {\n node = makeTree(type, localChildren, localPositions, end - start, lookAheadAtStart - end);\n }\n }\n children.push(node);\n positions.push(startPos);\n }\n function makeBalanced(type) {\n return (children, positions, length) => {\n let lookAhead = 0, lastI = children.length - 1, last, lookAheadProp;\n if (lastI >= 0 && (last = children[lastI]) instanceof Tree) {\n if (!lastI && last.type == type && last.length == length)\n return last;\n if (lookAheadProp = last.prop(NodeProp.lookAhead))\n lookAhead = positions[lastI] + last.length + lookAheadProp;\n }\n return makeTree(type, children, positions, length, lookAhead);\n };\n }\n function makeRepeatLeaf(children, positions, base, i, from, to, type, lookAhead) {\n let localChildren = [], localPositions = [];\n while (children.length > i) {\n localChildren.push(children.pop());\n localPositions.push(positions.pop() + base - from);\n }\n children.push(makeTree(nodeSet.types[type], localChildren, localPositions, to - from, lookAhead - to));\n positions.push(from - base);\n }\n function makeTree(type, children, positions, length, lookAhead = 0, props) {\n if (contextHash) {\n let pair = [NodeProp.contextHash, contextHash];\n props = props ? [pair].concat(props) : [pair];\n }\n if (lookAhead > 25) {\n let pair = [NodeProp.lookAhead, lookAhead];\n props = props ? [pair].concat(props) : [pair];\n }\n return new Tree(type, children, positions, length, props);\n }\n function findBufferSize(maxSize, inRepeat) {\n // Scan through the buffer to find previous siblings that fit\n // together in a TreeBuffer, and don't contain any reused nodes\n // (which can't be stored in a buffer).\n // If `inRepeat` is > -1, ignore node boundaries of that type for\n // nesting, but make sure the end falls either at the start\n // (`maxSize`) or before such a node.\n let fork = cursor.fork();\n let size = 0, start = 0, skip = 0, minStart = fork.end - maxBufferLength;\n let result = { size: 0, start: 0, skip: 0 };\n scan: for (let minPos = fork.pos - maxSize; fork.pos > minPos;) {\n let nodeSize = fork.size;\n // Pretend nested repeat nodes of the same type don't exist\n if (fork.id == inRepeat && nodeSize >= 0) {\n // Except that we store the current state as a valid return\n // value.\n result.size = size;\n result.start = start;\n result.skip = skip;\n skip += 4;\n size += 4;\n fork.next();\n continue;\n }\n let startPos = fork.pos - nodeSize;\n if (nodeSize < 0 || startPos < minPos || fork.start < minStart)\n break;\n let localSkipped = fork.id >= minRepeatType ? 4 : 0;\n let nodeStart = fork.start;\n fork.next();\n while (fork.pos > startPos) {\n if (fork.size < 0) {\n if (fork.size == -3 /* SpecialRecord.ContextChange */)\n localSkipped += 4;\n else\n break scan;\n }\n else if (fork.id >= minRepeatType) {\n localSkipped += 4;\n }\n fork.next();\n }\n start = nodeStart;\n size += nodeSize;\n skip += localSkipped;\n }\n if (inRepeat < 0 || size == maxSize) {\n result.size = size;\n result.start = start;\n result.skip = skip;\n }\n return result.size > 4 ? result : undefined;\n }\n function copyToBuffer(bufferStart, buffer, index) {\n let { id, start, end, size } = cursor;\n cursor.next();\n if (size >= 0 && id < minRepeatType) {\n let startIndex = index;\n if (size > 4) {\n let endPos = cursor.pos - (size - 4);\n while (cursor.pos > endPos)\n index = copyToBuffer(bufferStart, buffer, index);\n }\n buffer[--index] = startIndex;\n buffer[--index] = end - bufferStart;\n buffer[--index] = start - bufferStart;\n buffer[--index] = id;\n }\n else if (size == -3 /* SpecialRecord.ContextChange */) {\n contextHash = id;\n }\n else if (size == -4 /* SpecialRecord.LookAhead */) {\n lookAhead = id;\n }\n return index;\n }\n let children = [], positions = [];\n while (cursor.pos > 0)\n takeNode(data.start || 0, data.bufferStart || 0, children, positions, -1);\n let length = (_a = data.length) !== null && _a !== void 0 ? _a : (children.length ? positions[0] + children[0].length : 0);\n return new Tree(types[data.topID], children.reverse(), positions.reverse(), length);\n}\nconst nodeSizeCache = new WeakMap;\nfunction nodeSize(balanceType, node) {\n if (!balanceType.isAnonymous || node instanceof TreeBuffer || node.type != balanceType)\n return 1;\n let size = nodeSizeCache.get(node);\n if (size == null) {\n size = 1;\n for (let child of node.children) {\n if (child.type != balanceType || !(child instanceof Tree)) {\n size = 1;\n break;\n }\n size += nodeSize(balanceType, child);\n }\n nodeSizeCache.set(node, size);\n }\n return size;\n}\nfunction balanceRange(\n// The type the balanced tree's inner nodes.\nbalanceType, \n// The direct children and their positions\nchildren, positions, \n// The index range in children/positions to use\nfrom, to, \n// The start position of the nodes, relative to their parent.\nstart, \n// Length of the outer node\nlength, \n// Function to build the top node of the balanced tree\nmkTop, \n// Function to build internal nodes for the balanced tree\nmkTree) {\n let total = 0;\n for (let i = from; i < to; i++)\n total += nodeSize(balanceType, children[i]);\n let maxChild = Math.ceil((total * 1.5) / 8 /* Balance.BranchFactor */);\n let localChildren = [], localPositions = [];\n function divide(children, positions, from, to, offset) {\n for (let i = from; i < to;) {\n let groupFrom = i, groupStart = positions[i], groupSize = nodeSize(balanceType, children[i]);\n i++;\n for (; i < to; i++) {\n let nextSize = nodeSize(balanceType, children[i]);\n if (groupSize + nextSize >= maxChild)\n break;\n groupSize += nextSize;\n }\n if (i == groupFrom + 1) {\n if (groupSize > maxChild) {\n let only = children[groupFrom]; // Only trees can have a size > 1\n divide(only.children, only.positions, 0, only.children.length, positions[groupFrom] + offset);\n continue;\n }\n localChildren.push(children[groupFrom]);\n }\n else {\n let length = positions[i - 1] + children[i - 1].length - groupStart;\n localChildren.push(balanceRange(balanceType, children, positions, groupFrom, i, groupStart, length, null, mkTree));\n }\n localPositions.push(groupStart + offset - start);\n }\n }\n divide(children, positions, from, to, 0);\n return (mkTop || mkTree)(localChildren, localPositions, length);\n}\n/// Provides a way to associate values with pieces of trees. As long\n/// as that part of the tree is reused, the associated values can be\n/// retrieved from an updated tree.\nclass NodeWeakMap {\n constructor() {\n this.map = new WeakMap();\n }\n setBuffer(buffer, index, value) {\n let inner = this.map.get(buffer);\n if (!inner)\n this.map.set(buffer, inner = new Map);\n inner.set(index, value);\n }\n getBuffer(buffer, index) {\n let inner = this.map.get(buffer);\n return inner && inner.get(index);\n }\n /// Set the value for this syntax node.\n set(node, value) {\n if (node instanceof BufferNode)\n this.setBuffer(node.context.buffer, node.index, value);\n else if (node instanceof TreeNode)\n this.map.set(node.tree, value);\n }\n /// Retrieve value for this syntax node, if it exists in the map.\n get(node) {\n return node instanceof BufferNode ? this.getBuffer(node.context.buffer, node.index)\n : node instanceof TreeNode ? this.map.get(node.tree) : undefined;\n }\n /// Set the value for the node that a cursor currently points to.\n cursorSet(cursor, value) {\n if (cursor.buffer)\n this.setBuffer(cursor.buffer.buffer, cursor.index, value);\n else\n this.map.set(cursor.tree, value);\n }\n /// Retrieve the value for the node that a cursor currently points\n /// to.\n cursorGet(cursor) {\n return cursor.buffer ? this.getBuffer(cursor.buffer.buffer, cursor.index) : this.map.get(cursor.tree);\n }\n}\n\n/// Tree fragments are used during [incremental\n/// parsing](#common.Parser.startParse) to track parts of old trees\n/// that can be reused in a new parse. An array of fragments is used\n/// to track regions of an old tree whose nodes might be reused in new\n/// parses. Use the static\n/// [`applyChanges`](#common.TreeFragment^applyChanges) method to\n/// update fragments for document changes.\nclass TreeFragment {\n /// Construct a tree fragment. You'll usually want to use\n /// [`addTree`](#common.TreeFragment^addTree) and\n /// [`applyChanges`](#common.TreeFragment^applyChanges) instead of\n /// calling this directly.\n constructor(\n /// The start of the unchanged range pointed to by this fragment.\n /// This refers to an offset in the _updated_ document (as opposed\n /// to the original tree).\n from, \n /// The end of the unchanged range.\n to, \n /// The tree that this fragment is based on.\n tree, \n /// The offset between the fragment's tree and the document that\n /// this fragment can be used against. Add this when going from\n /// document to tree positions, subtract it to go from tree to\n /// document positions.\n offset, openStart = false, openEnd = false) {\n this.from = from;\n this.to = to;\n this.tree = tree;\n this.offset = offset;\n this.open = (openStart ? 1 /* Open.Start */ : 0) | (openEnd ? 2 /* Open.End */ : 0);\n }\n /// Whether the start of the fragment represents the start of a\n /// parse, or the end of a change. (In the second case, it may not\n /// be safe to reuse some nodes at the start, depending on the\n /// parsing algorithm.)\n get openStart() { return (this.open & 1 /* Open.Start */) > 0; }\n /// Whether the end of the fragment represents the end of a\n /// full-document parse, or the start of a change.\n get openEnd() { return (this.open & 2 /* Open.End */) > 0; }\n /// Create a set of fragments from a freshly parsed tree, or update\n /// an existing set of fragments by replacing the ones that overlap\n /// with a tree with content from the new tree. When `partial` is\n /// true, the parse is treated as incomplete, and the resulting\n /// fragment has [`openEnd`](#common.TreeFragment.openEnd) set to\n /// true.\n static addTree(tree, fragments = [], partial = false) {\n let result = [new TreeFragment(0, tree.length, tree, 0, false, partial)];\n for (let f of fragments)\n if (f.to > tree.length)\n result.push(f);\n return result;\n }\n /// Apply a set of edits to an array of fragments, removing or\n /// splitting fragments as necessary to remove edited ranges, and\n /// adjusting offsets for fragments that moved.\n static applyChanges(fragments, changes, minGap = 128) {\n if (!changes.length)\n return fragments;\n let result = [];\n let fI = 1, nextF = fragments.length ? fragments[0] : null;\n for (let cI = 0, pos = 0, off = 0;; cI++) {\n let nextC = cI < changes.length ? changes[cI] : null;\n let nextPos = nextC ? nextC.fromA : 1e9;\n if (nextPos - pos >= minGap)\n while (nextF && nextF.from < nextPos) {\n let cut = nextF;\n if (pos >= cut.from || nextPos <= cut.to || off) {\n let fFrom = Math.max(cut.from, pos) - off, fTo = Math.min(cut.to, nextPos) - off;\n cut = fFrom >= fTo ? null : new TreeFragment(fFrom, fTo, cut.tree, cut.offset + off, cI > 0, !!nextC);\n }\n if (cut)\n result.push(cut);\n if (nextF.to > nextPos)\n break;\n nextF = fI < fragments.length ? fragments[fI++] : null;\n }\n if (!nextC)\n break;\n pos = nextC.toA;\n off = nextC.toA - nextC.toB;\n }\n return result;\n }\n}\n/// A superclass that parsers should extend.\nclass Parser {\n /// Start a parse, returning a [partial parse](#common.PartialParse)\n /// object. [`fragments`](#common.TreeFragment) can be passed in to\n /// make the parse incremental.\n ///\n /// By default, the entire input is parsed. You can pass `ranges`,\n /// which should be a sorted array of non-empty, non-overlapping\n /// ranges, to parse only those ranges. The tree returned in that\n /// case will start at `ranges[0].from`.\n startParse(input, fragments, ranges) {\n if (typeof input == \"string\")\n input = new StringInput(input);\n ranges = !ranges ? [new Range(0, input.length)] : ranges.length ? ranges.map(r => new Range(r.from, r.to)) : [new Range(0, 0)];\n return this.createParse(input, fragments || [], ranges);\n }\n /// Run a full parse, returning the resulting tree.\n parse(input, fragments, ranges) {\n let parse = this.startParse(input, fragments, ranges);\n for (;;) {\n let done = parse.advance();\n if (done)\n return done;\n }\n }\n}\nclass StringInput {\n constructor(string) {\n this.string = string;\n }\n get length() { return this.string.length; }\n chunk(from) { return this.string.slice(from); }\n get lineChunks() { return false; }\n read(from, to) { return this.string.slice(from, to); }\n}\n\n/// Create a parse wrapper that, after the inner parse completes,\n/// scans its tree for mixed language regions with the `nest`\n/// function, runs the resulting [inner parses](#common.NestedParse),\n/// and then [mounts](#common.NodeProp^mounted) their results onto the\n/// tree.\nfunction parseMixed(nest) {\n return (parse, input, fragments, ranges) => new MixedParse(parse, nest, input, fragments, ranges);\n}\nclass InnerParse {\n constructor(parser, parse, overlay, target, ranges) {\n this.parser = parser;\n this.parse = parse;\n this.overlay = overlay;\n this.target = target;\n this.ranges = ranges;\n if (!ranges.length || ranges.some(r => r.from >= r.to))\n throw new RangeError(\"Invalid inner parse ranges given: \" + JSON.stringify(ranges));\n }\n}\nclass ActiveOverlay {\n constructor(parser, predicate, mounts, index, start, target, prev) {\n this.parser = parser;\n this.predicate = predicate;\n this.mounts = mounts;\n this.index = index;\n this.start = start;\n this.target = target;\n this.prev = prev;\n this.depth = 0;\n this.ranges = [];\n }\n}\nconst stoppedInner = new NodeProp({ perNode: true });\nclass MixedParse {\n constructor(base, nest, input, fragments, ranges) {\n this.nest = nest;\n this.input = input;\n this.fragments = fragments;\n this.ranges = ranges;\n this.inner = [];\n this.innerDone = 0;\n this.baseTree = null;\n this.stoppedAt = null;\n this.baseParse = base;\n }\n advance() {\n if (this.baseParse) {\n let done = this.baseParse.advance();\n if (!done)\n return null;\n this.baseParse = null;\n this.baseTree = done;\n this.startInner();\n if (this.stoppedAt != null)\n for (let inner of this.inner)\n inner.parse.stopAt(this.stoppedAt);\n }\n if (this.innerDone == this.inner.length) {\n let result = this.baseTree;\n if (this.stoppedAt != null)\n result = new Tree(result.type, result.children, result.positions, result.length, result.propValues.concat([[stoppedInner, this.stoppedAt]]));\n return result;\n }\n let inner = this.inner[this.innerDone], done = inner.parse.advance();\n if (done) {\n this.innerDone++;\n // This is a somewhat dodgy but super helpful hack where we\n // patch up nodes created by the inner parse (and thus\n // presumably not aliased anywhere else) to hold the information\n // about the inner parse.\n let props = Object.assign(Object.create(null), inner.target.props);\n props[NodeProp.mounted.id] = new MountedTree(done, inner.overlay, inner.parser);\n inner.target.props = props;\n }\n return null;\n }\n get parsedPos() {\n if (this.baseParse)\n return 0;\n let pos = this.input.length;\n for (let i = this.innerDone; i < this.inner.length; i++) {\n if (this.inner[i].ranges[0].from < pos)\n pos = Math.min(pos, this.inner[i].parse.parsedPos);\n }\n return pos;\n }\n stopAt(pos) {\n this.stoppedAt = pos;\n if (this.baseParse)\n this.baseParse.stopAt(pos);\n else\n for (let i = this.innerDone; i < this.inner.length; i++)\n this.inner[i].parse.stopAt(pos);\n }\n startInner() {\n let fragmentCursor = new FragmentCursor(this.fragments);\n let overlay = null;\n let covered = null;\n let cursor = new TreeCursor(new TreeNode(this.baseTree, this.ranges[0].from, 0, null), IterMode.IncludeAnonymous | IterMode.IgnoreMounts);\n scan: for (let nest, isCovered; this.stoppedAt == null || cursor.from < this.stoppedAt;) {\n let enter = true, range;\n if (fragmentCursor.hasNode(cursor)) {\n if (overlay) {\n let match = overlay.mounts.find(m => m.frag.from <= cursor.from && m.frag.to >= cursor.to && m.mount.overlay);\n if (match)\n for (let r of match.mount.overlay) {\n let from = r.from + match.pos, to = r.to + match.pos;\n if (from >= cursor.from && to <= cursor.to && !overlay.ranges.some(r => r.from < to && r.to > from))\n overlay.ranges.push({ from, to });\n }\n }\n enter = false;\n }\n else if (covered && (isCovered = checkCover(covered.ranges, cursor.from, cursor.to))) {\n enter = isCovered != 2 /* Cover.Full */;\n }\n else if (!cursor.type.isAnonymous && cursor.from < cursor.to && (nest = this.nest(cursor, this.input))) {\n if (!cursor.tree)\n materialize(cursor);\n let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);\n if (typeof nest.overlay == \"function\") {\n overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, cursor.tree, overlay);\n }\n else {\n let ranges = punchRanges(this.ranges, nest.overlay || [new Range(cursor.from, cursor.to)]);\n if (ranges.length)\n this.inner.push(new InnerParse(nest.parser, nest.parser.startParse(this.input, enterFragments(oldMounts, ranges), ranges), nest.overlay ? nest.overlay.map(r => new Range(r.from - cursor.from, r.to - cursor.from)) : null, cursor.tree, ranges));\n if (!nest.overlay)\n enter = false;\n else if (ranges.length)\n covered = { ranges, depth: 0, prev: covered };\n }\n }\n else if (overlay && (range = overlay.predicate(cursor))) {\n if (range === true)\n range = new Range(cursor.from, cursor.to);\n if (range.from < range.to)\n overlay.ranges.push(range);\n }\n if (enter && cursor.firstChild()) {\n if (overlay)\n overlay.depth++;\n if (covered)\n covered.depth++;\n }\n else {\n for (;;) {\n if (cursor.nextSibling())\n break;\n if (!cursor.parent())\n break scan;\n if (overlay && !--overlay.depth) {\n let ranges = punchRanges(this.ranges, overlay.ranges);\n if (ranges.length)\n this.inner.splice(overlay.index, 0, new InnerParse(overlay.parser, overlay.parser.startParse(this.input, enterFragments(overlay.mounts, ranges), ranges), overlay.ranges.map(r => new Range(r.from - overlay.start, r.to - overlay.start)), overlay.target, ranges));\n overlay = overlay.prev;\n }\n if (covered && !--covered.depth)\n covered = covered.prev;\n }\n }\n }\n }\n}\nfunction checkCover(covered, from, to) {\n for (let range of covered) {\n if (range.from >= to)\n break;\n if (range.to > from)\n return range.from <= from && range.to >= to ? 2 /* Cover.Full */ : 1 /* Cover.Partial */;\n }\n return 0 /* Cover.None */;\n}\n// Take a piece of buffer and convert it into a stand-alone\n// TreeBuffer.\nfunction sliceBuf(buf, startI, endI, nodes, positions, off) {\n if (startI < endI) {\n let from = buf.buffer[startI + 1];\n nodes.push(buf.slice(startI, endI, from));\n positions.push(from - off);\n }\n}\n// This function takes a node that's in a buffer, and converts it, and\n// its parent buffer nodes, into a Tree. This is again acting on the\n// assumption that the trees and buffers have been constructed by the\n// parse that was ran via the mix parser, and thus aren't shared with\n// any other code, making violations of the immutability safe.\nfunction materialize(cursor) {\n let { node } = cursor, depth = 0;\n // Scan up to the nearest tree\n do {\n cursor.parent();\n depth++;\n } while (!cursor.tree);\n // Find the index of the buffer in that tree\n let i = 0, base = cursor.tree, off = 0;\n for (;; i++) {\n off = base.positions[i] + cursor.from;\n if (off <= node.from && off + base.children[i].length >= node.to)\n break;\n }\n let buf = base.children[i], b = buf.buffer;\n // Split a level in the buffer, putting the nodes before and after\n // the child that contains `node` into new buffers.\n function split(startI, endI, type, innerOffset, length) {\n let i = startI;\n while (b[i + 2] + off <= node.from)\n i = b[i + 3];\n let children = [], positions = [];\n sliceBuf(buf, startI, i, children, positions, innerOffset);\n let from = b[i + 1], to = b[i + 2];\n let isTarget = from + off == node.from && to + off == node.to && b[i] == node.type.id;\n children.push(isTarget ? node.toTree() : split(i + 4, b[i + 3], buf.set.types[b[i]], from, to - from));\n positions.push(from - innerOffset);\n sliceBuf(buf, b[i + 3], endI, children, positions, innerOffset);\n return new Tree(type, children, positions, length);\n }\n base.children[i] = split(0, b.length, NodeType.none, 0, buf.length);\n // Move the cursor back to the target node\n for (let d = 0; d <= depth; d++)\n cursor.childAfter(node.from);\n}\nclass StructureCursor {\n constructor(root, offset) {\n this.offset = offset;\n this.done = false;\n this.cursor = root.cursor(IterMode.IncludeAnonymous | IterMode.IgnoreMounts);\n }\n // Move to the first node (in pre-order) that starts at or after `pos`.\n moveTo(pos) {\n let { cursor } = this, p = pos - this.offset;\n while (!this.done && cursor.from < p) {\n if (cursor.to >= pos && cursor.enter(p, 1, IterMode.IgnoreOverlays | IterMode.ExcludeBuffers)) ;\n else if (!cursor.next(false))\n this.done = true;\n }\n }\n hasNode(cursor) {\n this.moveTo(cursor.from);\n if (!this.done && this.cursor.from + this.offset == cursor.from && this.cursor.tree) {\n for (let tree = this.cursor.tree;;) {\n if (tree == cursor.tree)\n return true;\n if (tree.children.length && tree.positions[0] == 0 && tree.children[0] instanceof Tree)\n tree = tree.children[0];\n else\n break;\n }\n }\n return false;\n }\n}\nclass FragmentCursor {\n constructor(fragments) {\n var _a;\n this.fragments = fragments;\n this.curTo = 0;\n this.fragI = 0;\n if (fragments.length) {\n let first = this.curFrag = fragments[0];\n this.curTo = (_a = first.tree.prop(stoppedInner)) !== null && _a !== void 0 ? _a : first.to;\n this.inner = new StructureCursor(first.tree, -first.offset);\n }\n else {\n this.curFrag = this.inner = null;\n }\n }\n hasNode(node) {\n while (this.curFrag && node.from >= this.curTo)\n this.nextFrag();\n return this.curFrag && this.curFrag.from <= node.from && this.curTo >= node.to && this.inner.hasNode(node);\n }\n nextFrag() {\n var _a;\n this.fragI++;\n if (this.fragI == this.fragments.length) {\n this.curFrag = this.inner = null;\n }\n else {\n let frag = this.curFrag = this.fragments[this.fragI];\n this.curTo = (_a = frag.tree.prop(stoppedInner)) !== null && _a !== void 0 ? _a : frag.to;\n this.inner = new StructureCursor(frag.tree, -frag.offset);\n }\n }\n findMounts(pos, parser) {\n var _a;\n let result = [];\n if (this.inner) {\n this.inner.cursor.moveTo(pos, 1);\n for (let pos = this.inner.cursor.node; pos; pos = pos.parent) {\n let mount = (_a = pos.tree) === null || _a === void 0 ? void 0 : _a.prop(NodeProp.mounted);\n if (mount && mount.parser == parser) {\n for (let i = this.fragI; i < this.fragments.length; i++) {\n let frag = this.fragments[i];\n if (frag.from >= pos.to)\n break;\n if (frag.tree == this.curFrag.tree)\n result.push({\n frag,\n pos: pos.from - frag.offset,\n mount\n });\n }\n }\n }\n }\n return result;\n }\n}\nfunction punchRanges(outer, ranges) {\n let copy = null, current = ranges;\n for (let i = 1, j = 0; i < outer.length; i++) {\n let gapFrom = outer[i - 1].to, gapTo = outer[i].from;\n for (; j < current.length; j++) {\n let r = current[j];\n if (r.from >= gapTo)\n break;\n if (r.to <= gapFrom)\n continue;\n if (!copy)\n current = copy = ranges.slice();\n if (r.from < gapFrom) {\n copy[j] = new Range(r.from, gapFrom);\n if (r.to > gapTo)\n copy.splice(j + 1, 0, new Range(gapTo, r.to));\n }\n else if (r.to > gapTo) {\n copy[j--] = new Range(gapTo, r.to);\n }\n else {\n copy.splice(j--, 1);\n }\n }\n }\n return current;\n}\nfunction findCoverChanges(a, b, from, to) {\n let iA = 0, iB = 0, inA = false, inB = false, pos = -1e9;\n let result = [];\n for (;;) {\n let nextA = iA == a.length ? 1e9 : inA ? a[iA].to : a[iA].from;\n let nextB = iB == b.length ? 1e9 : inB ? b[iB].to : b[iB].from;\n if (inA != inB) {\n let start = Math.max(pos, from), end = Math.min(nextA, nextB, to);\n if (start < end)\n result.push(new Range(start, end));\n }\n pos = Math.min(nextA, nextB);\n if (pos == 1e9)\n break;\n if (nextA == pos) {\n if (!inA)\n inA = true;\n else {\n inA = false;\n iA++;\n }\n }\n if (nextB == pos) {\n if (!inB)\n inB = true;\n else {\n inB = false;\n iB++;\n }\n }\n }\n return result;\n}\n// Given a number of fragments for the outer tree, and a set of ranges\n// to parse, find fragments for inner trees mounted around those\n// ranges, if any.\nfunction enterFragments(mounts, ranges) {\n let result = [];\n for (let { pos, mount, frag } of mounts) {\n let startPos = pos + (mount.overlay ? mount.overlay[0].from : 0), endPos = startPos + mount.tree.length;\n let from = Math.max(frag.from, startPos), to = Math.min(frag.to, endPos);\n if (mount.overlay) {\n let overlay = mount.overlay.map(r => new Range(r.from + pos, r.to + pos));\n let changes = findCoverChanges(ranges, overlay, from, to);\n for (let i = 0, pos = from;; i++) {\n let last = i == changes.length, end = last ? to : changes[i].from;\n if (end > pos)\n result.push(new TreeFragment(pos, end, mount.tree, -startPos, frag.from >= pos || frag.openStart, frag.to <= end || frag.openEnd));\n if (last)\n break;\n pos = changes[i].to;\n }\n }\n else {\n result.push(new TreeFragment(from, to, mount.tree, -startPos, frag.from >= startPos || frag.openStart, frag.to <= endPos || frag.openEnd));\n }\n }\n return result;\n}\n\nexport { DefaultBufferLength, IterMode, MountedTree, NodeProp, NodeSet, NodeType, NodeWeakMap, Parser, Tree, TreeBuffer, TreeCursor, TreeFragment, parseMixed };\n", "import { Parser, NodeProp, NodeSet, NodeType, DefaultBufferLength, Tree, IterMode } from '@lezer/common';\n\n/// A parse stack. These are used internally by the parser to track\n/// parsing progress. They also provide some properties and methods\n/// that external code such as a tokenizer can use to get information\n/// about the parse state.\nclass Stack {\n /// @internal\n constructor(\n /// The parse that this stack is part of @internal\n p, \n /// Holds state, input pos, buffer index triplets for all but the\n /// top state @internal\n stack, \n /// The current parse state @internal\n state, \n // The position at which the next reduce should take place. This\n // can be less than `this.pos` when skipped expressions have been\n // added to the stack (which should be moved outside of the next\n // reduction)\n /// @internal\n reducePos, \n /// The input position up to which this stack has parsed.\n pos, \n /// The dynamic score of the stack, including dynamic precedence\n /// and error-recovery penalties\n /// @internal\n score, \n // The output buffer. Holds (type, start, end, size) quads\n // representing nodes created by the parser, where `size` is\n // amount of buffer array entries covered by this node.\n /// @internal\n buffer, \n // The base offset of the buffer. When stacks are split, the split\n // instance shared the buffer history with its parent up to\n // `bufferBase`, which is the absolute offset (including the\n // offset of previous splits) into the buffer at which this stack\n // starts writing.\n /// @internal\n bufferBase, \n /// @internal\n curContext, \n /// @internal\n lookAhead = 0, \n // A parent stack from which this was split off, if any. This is\n // set up so that it always points to a stack that has some\n // additional buffer content, never to a stack with an equal\n // `bufferBase`.\n /// @internal\n parent) {\n this.p = p;\n this.stack = stack;\n this.state = state;\n this.reducePos = reducePos;\n this.pos = pos;\n this.score = score;\n this.buffer = buffer;\n this.bufferBase = bufferBase;\n this.curContext = curContext;\n this.lookAhead = lookAhead;\n this.parent = parent;\n }\n /// @internal\n toString() {\n return `[${this.stack.filter((_, i) => i % 3 == 0).concat(this.state)}]@${this.pos}${this.score ? \"!\" + this.score : \"\"}`;\n }\n // Start an empty stack\n /// @internal\n static start(p, state, pos = 0) {\n let cx = p.parser.context;\n return new Stack(p, [], state, pos, pos, 0, [], 0, cx ? new StackContext(cx, cx.start) : null, 0, null);\n }\n /// The stack's current [context](#lr.ContextTracker) value, if\n /// any. Its type will depend on the context tracker's type\n /// parameter, or it will be `null` if there is no context\n /// tracker.\n get context() { return this.curContext ? this.curContext.context : null; }\n // Push a state onto the stack, tracking its start position as well\n // as the buffer base at that point.\n /// @internal\n pushState(state, start) {\n this.stack.push(this.state, start, this.bufferBase + this.buffer.length);\n this.state = state;\n }\n // Apply a reduce action\n /// @internal\n reduce(action) {\n var _a;\n let depth = action >> 19 /* Action.ReduceDepthShift */, type = action & 65535 /* Action.ValueMask */;\n let { parser } = this.p;\n let dPrec = parser.dynamicPrecedence(type);\n if (dPrec)\n this.score += dPrec;\n if (depth == 0) {\n this.pushState(parser.getGoto(this.state, type, true), this.reducePos);\n // Zero-depth reductions are a special case\u2014they add stuff to\n // the stack without popping anything off.\n if (type < parser.minRepeatTerm)\n this.storeNode(type, this.reducePos, this.reducePos, 4, true);\n this.reduceContext(type, this.reducePos);\n return;\n }\n // Find the base index into `this.stack`, content after which will\n // be dropped. Note that with `StayFlag` reductions we need to\n // consume two extra frames (the dummy parent node for the skipped\n // expression and the state that we'll be staying in, which should\n // be moved to `this.state`).\n let base = this.stack.length - ((depth - 1) * 3) - (action & 262144 /* Action.StayFlag */ ? 6 : 0);\n let start = base ? this.stack[base - 2] : this.p.ranges[0].from, size = this.reducePos - start;\n // This is a kludge to try and detect overly deep left-associative\n // trees, which will not increase the parse stack depth and thus\n // won't be caught by the regular stack-depth limit check.\n if (size >= 2000 /* Recover.MinBigReduction */ && !((_a = this.p.parser.nodeSet.types[type]) === null || _a === void 0 ? void 0 : _a.isAnonymous)) {\n if (start == this.p.lastBigReductionStart) {\n this.p.bigReductionCount++;\n this.p.lastBigReductionSize = size;\n }\n else if (this.p.lastBigReductionSize < size) {\n this.p.bigReductionCount = 1;\n this.p.lastBigReductionStart = start;\n this.p.lastBigReductionSize = size;\n }\n }\n let bufferBase = base ? this.stack[base - 1] : 0, count = this.bufferBase + this.buffer.length - bufferBase;\n // Store normal terms or `R -> R R` repeat reductions\n if (type < parser.minRepeatTerm || (action & 131072 /* Action.RepeatFlag */)) {\n let pos = parser.stateFlag(this.state, 1 /* StateFlag.Skipped */) ? this.pos : this.reducePos;\n this.storeNode(type, start, pos, count + 4, true);\n }\n if (action & 262144 /* Action.StayFlag */) {\n this.state = this.stack[base];\n }\n else {\n let baseStateID = this.stack[base - 3];\n this.state = parser.getGoto(baseStateID, type, true);\n }\n while (this.stack.length > base)\n this.stack.pop();\n this.reduceContext(type, start);\n }\n // Shift a value into the buffer\n /// @internal\n storeNode(term, start, end, size = 4, isReduce = false) {\n if (term == 0 /* Term.Err */ &&\n (!this.stack.length || this.stack[this.stack.length - 1] < this.buffer.length + this.bufferBase)) {\n // Try to omit/merge adjacent error nodes\n let cur = this, top = this.buffer.length;\n if (top == 0 && cur.parent) {\n top = cur.bufferBase - cur.parent.bufferBase;\n cur = cur.parent;\n }\n if (top > 0 && cur.buffer[top - 4] == 0 /* Term.Err */ && cur.buffer[top - 1] > -1) {\n if (start == end)\n return;\n if (cur.buffer[top - 2] >= start) {\n cur.buffer[top - 2] = end;\n return;\n }\n }\n }\n if (!isReduce || this.pos == end) { // Simple case, just append\n this.buffer.push(term, start, end, size);\n }\n else { // There may be skipped nodes that have to be moved forward\n let index = this.buffer.length;\n if (index > 0 && this.buffer[index - 4] != 0 /* Term.Err */)\n while (index > 0 && this.buffer[index - 2] > end) {\n // Move this record forward\n this.buffer[index] = this.buffer[index - 4];\n this.buffer[index + 1] = this.buffer[index - 3];\n this.buffer[index + 2] = this.buffer[index - 2];\n this.buffer[index + 3] = this.buffer[index - 1];\n index -= 4;\n if (size > 4)\n size -= 4;\n }\n this.buffer[index] = term;\n this.buffer[index + 1] = start;\n this.buffer[index + 2] = end;\n this.buffer[index + 3] = size;\n }\n }\n // Apply a shift action\n /// @internal\n shift(action, next, nextEnd) {\n let start = this.pos;\n if (action & 131072 /* Action.GotoFlag */) {\n this.pushState(action & 65535 /* Action.ValueMask */, this.pos);\n }\n else if ((action & 262144 /* Action.StayFlag */) == 0) { // Regular shift\n let nextState = action, { parser } = this.p;\n if (nextEnd > this.pos || next <= parser.maxNode) {\n this.pos = nextEnd;\n if (!parser.stateFlag(nextState, 1 /* StateFlag.Skipped */))\n this.reducePos = nextEnd;\n }\n this.pushState(nextState, start);\n this.shiftContext(next, start);\n if (next <= parser.maxNode)\n this.buffer.push(next, start, nextEnd, 4);\n }\n else { // Shift-and-stay, which means this is a skipped token\n this.pos = nextEnd;\n this.shiftContext(next, start);\n if (next <= this.p.parser.maxNode)\n this.buffer.push(next, start, nextEnd, 4);\n }\n }\n // Apply an action\n /// @internal\n apply(action, next, nextEnd) {\n if (action & 65536 /* Action.ReduceFlag */)\n this.reduce(action);\n else\n this.shift(action, next, nextEnd);\n }\n // Add a prebuilt (reused) node into the buffer.\n /// @internal\n useNode(value, next) {\n let index = this.p.reused.length - 1;\n if (index < 0 || this.p.reused[index] != value) {\n this.p.reused.push(value);\n index++;\n }\n let start = this.pos;\n this.reducePos = this.pos = start + value.length;\n this.pushState(next, start);\n this.buffer.push(index, start, this.reducePos, -1 /* size == -1 means this is a reused value */);\n if (this.curContext)\n this.updateContext(this.curContext.tracker.reuse(this.curContext.context, value, this, this.p.stream.reset(this.pos - value.length)));\n }\n // Split the stack. Due to the buffer sharing and the fact\n // that `this.stack` tends to stay quite shallow, this isn't very\n // expensive.\n /// @internal\n split() {\n let parent = this;\n let off = parent.buffer.length;\n // Because the top of the buffer (after this.pos) may be mutated\n // to reorder reductions and skipped tokens, and shared buffers\n // should be immutable, this copies any outstanding skipped tokens\n // to the new buffer, and puts the base pointer before them.\n while (off > 0 && parent.buffer[off - 2] > parent.reducePos)\n off -= 4;\n let buffer = parent.buffer.slice(off), base = parent.bufferBase + off;\n // Make sure parent points to an actual parent with content, if there is such a parent.\n while (parent && base == parent.bufferBase)\n parent = parent.parent;\n return new Stack(this.p, this.stack.slice(), this.state, this.reducePos, this.pos, this.score, buffer, base, this.curContext, this.lookAhead, parent);\n }\n // Try to recover from an error by 'deleting' (ignoring) one token.\n /// @internal\n recoverByDelete(next, nextEnd) {\n let isNode = next <= this.p.parser.maxNode;\n if (isNode)\n this.storeNode(next, this.pos, nextEnd, 4);\n this.storeNode(0 /* Term.Err */, this.pos, nextEnd, isNode ? 8 : 4);\n this.pos = this.reducePos = nextEnd;\n this.score -= 190 /* Recover.Delete */;\n }\n /// Check if the given term would be able to be shifted (optionally\n /// after some reductions) on this stack. This can be useful for\n /// external tokenizers that want to make sure they only provide a\n /// given token when it applies.\n canShift(term) {\n for (let sim = new SimulatedStack(this);;) {\n let action = this.p.parser.stateSlot(sim.state, 4 /* ParseState.DefaultReduce */) || this.p.parser.hasAction(sim.state, term);\n if (action == 0)\n return false;\n if ((action & 65536 /* Action.ReduceFlag */) == 0)\n return true;\n sim.reduce(action);\n }\n }\n // Apply up to Recover.MaxNext recovery actions that conceptually\n // inserts some missing token or rule.\n /// @internal\n recoverByInsert(next) {\n if (this.stack.length >= 300 /* Recover.MaxInsertStackDepth */)\n return [];\n let nextStates = this.p.parser.nextStates(this.state);\n if (nextStates.length > 4 /* Recover.MaxNext */ << 1 || this.stack.length >= 120 /* Recover.DampenInsertStackDepth */) {\n let best = [];\n for (let i = 0, s; i < nextStates.length; i += 2) {\n if ((s = nextStates[i + 1]) != this.state && this.p.parser.hasAction(s, next))\n best.push(nextStates[i], s);\n }\n if (this.stack.length < 120 /* Recover.DampenInsertStackDepth */)\n for (let i = 0; best.length < 4 /* Recover.MaxNext */ << 1 && i < nextStates.length; i += 2) {\n let s = nextStates[i + 1];\n if (!best.some((v, i) => (i & 1) && v == s))\n best.push(nextStates[i], s);\n }\n nextStates = best;\n }\n let result = [];\n for (let i = 0; i < nextStates.length && result.length < 4 /* Recover.MaxNext */; i += 2) {\n let s = nextStates[i + 1];\n if (s == this.state)\n continue;\n let stack = this.split();\n stack.pushState(s, this.pos);\n stack.storeNode(0 /* Term.Err */, stack.pos, stack.pos, 4, true);\n stack.shiftContext(nextStates[i], this.pos);\n stack.score -= 200 /* Recover.Insert */;\n result.push(stack);\n }\n return result;\n }\n // Force a reduce, if possible. Return false if that can't\n // be done.\n /// @internal\n forceReduce() {\n let { parser } = this.p;\n let reduce = parser.stateSlot(this.state, 5 /* ParseState.ForcedReduce */);\n if ((reduce & 65536 /* Action.ReduceFlag */) == 0)\n return false;\n if (!parser.validAction(this.state, reduce)) {\n let depth = reduce >> 19 /* Action.ReduceDepthShift */, term = reduce & 65535 /* Action.ValueMask */;\n let target = this.stack.length - depth * 3;\n if (target < 0 || parser.getGoto(this.stack[target], term, false) < 0) {\n let backup = this.findForcedReduction();\n if (backup == null)\n return false;\n reduce = backup;\n }\n this.storeNode(0 /* Term.Err */, this.pos, this.pos, 4, true);\n this.score -= 100 /* Recover.Reduce */;\n }\n this.reducePos = this.pos;\n this.reduce(reduce);\n return true;\n }\n /// Try to scan through the automaton to find some kind of reduction\n /// that can be applied. Used when the regular ForcedReduce field\n /// isn't a valid action. @internal\n findForcedReduction() {\n let { parser } = this.p, seen = [];\n let explore = (state, depth) => {\n if (seen.includes(state))\n return;\n seen.push(state);\n return parser.allActions(state, (action) => {\n if (action & (262144 /* Action.StayFlag */ | 131072 /* Action.GotoFlag */)) ;\n else if (action & 65536 /* Action.ReduceFlag */) {\n let rDepth = (action >> 19 /* Action.ReduceDepthShift */) - depth;\n if (rDepth > 1) {\n let term = action & 65535 /* Action.ValueMask */, target = this.stack.length - rDepth * 3;\n if (target >= 0 && parser.getGoto(this.stack[target], term, false) >= 0)\n return (rDepth << 19 /* Action.ReduceDepthShift */) | 65536 /* Action.ReduceFlag */ | term;\n }\n }\n else {\n let found = explore(action, depth + 1);\n if (found != null)\n return found;\n }\n });\n };\n return explore(this.state, 0);\n }\n /// @internal\n forceAll() {\n while (!this.p.parser.stateFlag(this.state, 2 /* StateFlag.Accepting */)) {\n if (!this.forceReduce()) {\n this.storeNode(0 /* Term.Err */, this.pos, this.pos, 4, true);\n break;\n }\n }\n return this;\n }\n /// Check whether this state has no further actions (assumed to be a direct descendant of the\n /// top state, since any other states must be able to continue\n /// somehow). @internal\n get deadEnd() {\n if (this.stack.length != 3)\n return false;\n let { parser } = this.p;\n return parser.data[parser.stateSlot(this.state, 1 /* ParseState.Actions */)] == 65535 /* Seq.End */ &&\n !parser.stateSlot(this.state, 4 /* ParseState.DefaultReduce */);\n }\n /// Restart the stack (put it back in its start state). Only safe\n /// when this.stack.length == 3 (state is directly below the top\n /// state). @internal\n restart() {\n this.state = this.stack[0];\n this.stack.length = 0;\n }\n /// @internal\n sameState(other) {\n if (this.state != other.state || this.stack.length != other.stack.length)\n return false;\n for (let i = 0; i < this.stack.length; i += 3)\n if (this.stack[i] != other.stack[i])\n return false;\n return true;\n }\n /// Get the parser used by this stack.\n get parser() { return this.p.parser; }\n /// Test whether a given dialect (by numeric ID, as exported from\n /// the terms file) is enabled.\n dialectEnabled(dialectID) { return this.p.parser.dialect.flags[dialectID]; }\n shiftContext(term, start) {\n if (this.curContext)\n this.updateContext(this.curContext.tracker.shift(this.curContext.context, term, this, this.p.stream.reset(start)));\n }\n reduceContext(term, start) {\n if (this.curContext)\n this.updateContext(this.curContext.tracker.reduce(this.curContext.context, term, this, this.p.stream.reset(start)));\n }\n /// @internal\n emitContext() {\n let last = this.buffer.length - 1;\n if (last < 0 || this.buffer[last] != -3)\n this.buffer.push(this.curContext.hash, this.pos, this.pos, -3);\n }\n /// @internal\n emitLookAhead() {\n let last = this.buffer.length - 1;\n if (last < 0 || this.buffer[last] != -4)\n this.buffer.push(this.lookAhead, this.pos, this.pos, -4);\n }\n updateContext(context) {\n if (context != this.curContext.context) {\n let newCx = new StackContext(this.curContext.tracker, context);\n if (newCx.hash != this.curContext.hash)\n this.emitContext();\n this.curContext = newCx;\n }\n }\n /// @internal\n setLookAhead(lookAhead) {\n if (lookAhead > this.lookAhead) {\n this.emitLookAhead();\n this.lookAhead = lookAhead;\n }\n }\n /// @internal\n close() {\n if (this.curContext && this.curContext.tracker.strict)\n this.emitContext();\n if (this.lookAhead > 0)\n this.emitLookAhead();\n }\n}\nclass StackContext {\n constructor(tracker, context) {\n this.tracker = tracker;\n this.context = context;\n this.hash = tracker.strict ? tracker.hash(context) : 0;\n }\n}\nvar Recover;\n(function (Recover) {\n Recover[Recover[\"Insert\"] = 200] = \"Insert\";\n Recover[Recover[\"Delete\"] = 190] = \"Delete\";\n Recover[Recover[\"Reduce\"] = 100] = \"Reduce\";\n Recover[Recover[\"MaxNext\"] = 4] = \"MaxNext\";\n Recover[Recover[\"MaxInsertStackDepth\"] = 300] = \"MaxInsertStackDepth\";\n Recover[Recover[\"DampenInsertStackDepth\"] = 120] = \"DampenInsertStackDepth\";\n Recover[Recover[\"MinBigReduction\"] = 2000] = \"MinBigReduction\";\n})(Recover || (Recover = {}));\n// Used to cheaply run some reductions to scan ahead without mutating\n// an entire stack\nclass SimulatedStack {\n constructor(start) {\n this.start = start;\n this.state = start.state;\n this.stack = start.stack;\n this.base = this.stack.length;\n }\n reduce(action) {\n let term = action & 65535 /* Action.ValueMask */, depth = action >> 19 /* Action.ReduceDepthShift */;\n if (depth == 0) {\n if (this.stack == this.start.stack)\n this.stack = this.stack.slice();\n this.stack.push(this.state, 0, 0);\n this.base += 3;\n }\n else {\n this.base -= (depth - 1) * 3;\n }\n let goto = this.start.p.parser.getGoto(this.stack[this.base - 3], term, true);\n this.state = goto;\n }\n}\n// This is given to `Tree.build` to build a buffer, and encapsulates\n// the parent-stack-walking necessary to read the nodes.\nclass StackBufferCursor {\n constructor(stack, pos, index) {\n this.stack = stack;\n this.pos = pos;\n this.index = index;\n this.buffer = stack.buffer;\n if (this.index == 0)\n this.maybeNext();\n }\n static create(stack, pos = stack.bufferBase + stack.buffer.length) {\n return new StackBufferCursor(stack, pos, pos - stack.bufferBase);\n }\n maybeNext() {\n let next = this.stack.parent;\n if (next != null) {\n this.index = this.stack.bufferBase - next.bufferBase;\n this.stack = next;\n this.buffer = next.buffer;\n }\n }\n get id() { return this.buffer[this.index - 4]; }\n get start() { return this.buffer[this.index - 3]; }\n get end() { return this.buffer[this.index - 2]; }\n get size() { return this.buffer[this.index - 1]; }\n next() {\n this.index -= 4;\n this.pos -= 4;\n if (this.index == 0)\n this.maybeNext();\n }\n fork() {\n return new StackBufferCursor(this.stack, this.pos, this.index);\n }\n}\n\n// See lezer-generator/src/encode.ts for comments about the encoding\n// used here\nfunction decodeArray(input, Type = Uint16Array) {\n if (typeof input != \"string\")\n return input;\n let array = null;\n for (let pos = 0, out = 0; pos < input.length;) {\n let value = 0;\n for (;;) {\n let next = input.charCodeAt(pos++), stop = false;\n if (next == 126 /* Encode.BigValCode */) {\n value = 65535 /* Encode.BigVal */;\n break;\n }\n if (next >= 92 /* Encode.Gap2 */)\n next--;\n if (next >= 34 /* Encode.Gap1 */)\n next--;\n let digit = next - 32 /* Encode.Start */;\n if (digit >= 46 /* Encode.Base */) {\n digit -= 46 /* Encode.Base */;\n stop = true;\n }\n value += digit;\n if (stop)\n break;\n value *= 46 /* Encode.Base */;\n }\n if (array)\n array[out++] = value;\n else\n array = new Type(value);\n }\n return array;\n}\n\nclass CachedToken {\n constructor() {\n this.start = -1;\n this.value = -1;\n this.end = -1;\n this.extended = -1;\n this.lookAhead = 0;\n this.mask = 0;\n this.context = 0;\n }\n}\nconst nullToken = new CachedToken;\n/// [Tokenizers](#lr.ExternalTokenizer) interact with the input\n/// through this interface. It presents the input as a stream of\n/// characters, tracking lookahead and hiding the complexity of\n/// [ranges](#common.Parser.parse^ranges) from tokenizer code.\nclass InputStream {\n /// @internal\n constructor(\n /// @internal\n input, \n /// @internal\n ranges) {\n this.input = input;\n this.ranges = ranges;\n /// @internal\n this.chunk = \"\";\n /// @internal\n this.chunkOff = 0;\n /// Backup chunk\n this.chunk2 = \"\";\n this.chunk2Pos = 0;\n /// The character code of the next code unit in the input, or -1\n /// when the stream is at the end of the input.\n this.next = -1;\n /// @internal\n this.token = nullToken;\n this.rangeIndex = 0;\n this.pos = this.chunkPos = ranges[0].from;\n this.range = ranges[0];\n this.end = ranges[ranges.length - 1].to;\n this.readNext();\n }\n /// @internal\n resolveOffset(offset, assoc) {\n let range = this.range, index = this.rangeIndex;\n let pos = this.pos + offset;\n while (pos < range.from) {\n if (!index)\n return null;\n let next = this.ranges[--index];\n pos -= range.from - next.to;\n range = next;\n }\n while (assoc < 0 ? pos > range.to : pos >= range.to) {\n if (index == this.ranges.length - 1)\n return null;\n let next = this.ranges[++index];\n pos += next.from - range.to;\n range = next;\n }\n return pos;\n }\n /// @internal\n clipPos(pos) {\n if (pos >= this.range.from && pos < this.range.to)\n return pos;\n for (let range of this.ranges)\n if (range.to > pos)\n return Math.max(pos, range.from);\n return this.end;\n }\n /// Look at a code unit near the stream position. `.peek(0)` equals\n /// `.next`, `.peek(-1)` gives you the previous character, and so\n /// on.\n ///\n /// Note that looking around during tokenizing creates dependencies\n /// on potentially far-away content, which may reduce the\n /// effectiveness incremental parsing\u2014when looking forward\u2014or even\n /// cause invalid reparses when looking backward more than 25 code\n /// units, since the library does not track lookbehind.\n peek(offset) {\n let idx = this.chunkOff + offset, pos, result;\n if (idx >= 0 && idx < this.chunk.length) {\n pos = this.pos + offset;\n result = this.chunk.charCodeAt(idx);\n }\n else {\n let resolved = this.resolveOffset(offset, 1);\n if (resolved == null)\n return -1;\n pos = resolved;\n if (pos >= this.chunk2Pos && pos < this.chunk2Pos + this.chunk2.length) {\n result = this.chunk2.charCodeAt(pos - this.chunk2Pos);\n }\n else {\n let i = this.rangeIndex, range = this.range;\n while (range.to <= pos)\n range = this.ranges[++i];\n this.chunk2 = this.input.chunk(this.chunk2Pos = pos);\n if (pos + this.chunk2.length > range.to)\n this.chunk2 = this.chunk2.slice(0, range.to - pos);\n result = this.chunk2.charCodeAt(0);\n }\n }\n if (pos >= this.token.lookAhead)\n this.token.lookAhead = pos + 1;\n return result;\n }\n /// Accept a token. By default, the end of the token is set to the\n /// current stream position, but you can pass an offset (relative to\n /// the stream position) to change that.\n acceptToken(token, endOffset = 0) {\n let end = endOffset ? this.resolveOffset(endOffset, -1) : this.pos;\n if (end == null || end < this.token.start)\n throw new RangeError(\"Token end out of bounds\");\n this.token.value = token;\n this.token.end = end;\n }\n getChunk() {\n if (this.pos >= this.chunk2Pos && this.pos < this.chunk2Pos + this.chunk2.length) {\n let { chunk, chunkPos } = this;\n this.chunk = this.chunk2;\n this.chunkPos = this.chunk2Pos;\n this.chunk2 = chunk;\n this.chunk2Pos = chunkPos;\n this.chunkOff = this.pos - this.chunkPos;\n }\n else {\n this.chunk2 = this.chunk;\n this.chunk2Pos = this.chunkPos;\n let nextChunk = this.input.chunk(this.pos);\n let end = this.pos + nextChunk.length;\n this.chunk = end > this.range.to ? nextChunk.slice(0, this.range.to - this.pos) : nextChunk;\n this.chunkPos = this.pos;\n this.chunkOff = 0;\n }\n }\n readNext() {\n if (this.chunkOff >= this.chunk.length) {\n this.getChunk();\n if (this.chunkOff == this.chunk.length)\n return this.next = -1;\n }\n return this.next = this.chunk.charCodeAt(this.chunkOff);\n }\n /// Move the stream forward N (defaults to 1) code units. Returns\n /// the new value of [`next`](#lr.InputStream.next).\n advance(n = 1) {\n this.chunkOff += n;\n while (this.pos + n >= this.range.to) {\n if (this.rangeIndex == this.ranges.length - 1)\n return this.setDone();\n n -= this.range.to - this.pos;\n this.range = this.ranges[++this.rangeIndex];\n this.pos = this.range.from;\n }\n this.pos += n;\n if (this.pos >= this.token.lookAhead)\n this.token.lookAhead = this.pos + 1;\n return this.readNext();\n }\n setDone() {\n this.pos = this.chunkPos = this.end;\n this.range = this.ranges[this.rangeIndex = this.ranges.length - 1];\n this.chunk = \"\";\n return this.next = -1;\n }\n /// @internal\n reset(pos, token) {\n if (token) {\n this.token = token;\n token.start = pos;\n token.lookAhead = pos + 1;\n token.value = token.extended = -1;\n }\n else {\n this.token = nullToken;\n }\n if (this.pos != pos) {\n this.pos = pos;\n if (pos == this.end) {\n this.setDone();\n return this;\n }\n while (pos < this.range.from)\n this.range = this.ranges[--this.rangeIndex];\n while (pos >= this.range.to)\n this.range = this.ranges[++this.rangeIndex];\n if (pos >= this.chunkPos && pos < this.chunkPos + this.chunk.length) {\n this.chunkOff = pos - this.chunkPos;\n }\n else {\n this.chunk = \"\";\n this.chunkOff = 0;\n }\n this.readNext();\n }\n return this;\n }\n /// @internal\n read(from, to) {\n if (from >= this.chunkPos && to <= this.chunkPos + this.chunk.length)\n return this.chunk.slice(from - this.chunkPos, to - this.chunkPos);\n if (from >= this.chunk2Pos && to <= this.chunk2Pos + this.chunk2.length)\n return this.chunk2.slice(from - this.chunk2Pos, to - this.chunk2Pos);\n if (from >= this.range.from && to <= this.range.to)\n return this.input.read(from, to);\n let result = \"\";\n for (let r of this.ranges) {\n if (r.from >= to)\n break;\n if (r.to > from)\n result += this.input.read(Math.max(r.from, from), Math.min(r.to, to));\n }\n return result;\n }\n}\n/// @internal\nclass TokenGroup {\n constructor(data, id) {\n this.data = data;\n this.id = id;\n }\n token(input, stack) {\n let { parser } = stack.p;\n readToken(this.data, input, stack, this.id, parser.data, parser.tokenPrecTable);\n }\n}\nTokenGroup.prototype.contextual = TokenGroup.prototype.fallback = TokenGroup.prototype.extend = false;\n/// @hide\nclass LocalTokenGroup {\n constructor(data, precTable, elseToken) {\n this.precTable = precTable;\n this.elseToken = elseToken;\n this.data = typeof data == \"string\" ? decodeArray(data) : data;\n }\n token(input, stack) {\n let start = input.pos, skipped = 0;\n for (;;) {\n let atEof = input.next < 0, nextPos = input.resolveOffset(1, 1);\n readToken(this.data, input, stack, 0, this.data, this.precTable);\n if (input.token.value > -1)\n break;\n if (this.elseToken == null)\n return;\n if (!atEof)\n skipped++;\n if (nextPos == null)\n break;\n input.reset(nextPos, input.token);\n }\n if (skipped) {\n input.reset(start, input.token);\n input.acceptToken(this.elseToken, skipped);\n }\n }\n}\nLocalTokenGroup.prototype.contextual = TokenGroup.prototype.fallback = TokenGroup.prototype.extend = false;\n/// `@external tokens` declarations in the grammar should resolve to\n/// an instance of this class.\nclass ExternalTokenizer {\n /// Create a tokenizer. The first argument is the function that,\n /// given an input stream, scans for the types of tokens it\n /// recognizes at the stream's position, and calls\n /// [`acceptToken`](#lr.InputStream.acceptToken) when it finds\n /// one.\n constructor(\n /// @internal\n token, options = {}) {\n this.token = token;\n this.contextual = !!options.contextual;\n this.fallback = !!options.fallback;\n this.extend = !!options.extend;\n }\n}\n// Tokenizer data is stored a big uint16 array containing, for each\n// state:\n//\n// - A group bitmask, indicating what token groups are reachable from\n// this state, so that paths that can only lead to tokens not in\n// any of the current groups can be cut off early.\n//\n// - The position of the end of the state's sequence of accepting\n// tokens\n//\n// - The number of outgoing edges for the state\n//\n// - The accepting tokens, as (token id, group mask) pairs\n//\n// - The outgoing edges, as (start character, end character, state\n// index) triples, with end character being exclusive\n//\n// This function interprets that data, running through a stream as\n// long as new states with the a matching group mask can be reached,\n// and updating `input.token` when it matches a token.\nfunction readToken(data, input, stack, group, precTable, precOffset) {\n let state = 0, groupMask = 1 << group, { dialect } = stack.p.parser;\n scan: for (;;) {\n if ((groupMask & data[state]) == 0)\n break;\n let accEnd = data[state + 1];\n // Check whether this state can lead to a token in the current group\n // Accept tokens in this state, possibly overwriting\n // lower-precedence / shorter tokens\n for (let i = state + 3; i < accEnd; i += 2)\n if ((data[i + 1] & groupMask) > 0) {\n let term = data[i];\n if (dialect.allows(term) &&\n (input.token.value == -1 || input.token.value == term ||\n overrides(term, input.token.value, precTable, precOffset))) {\n input.acceptToken(term);\n break;\n }\n }\n let next = input.next, low = 0, high = data[state + 2];\n // Special case for EOF\n if (input.next < 0 && high > low && data[accEnd + high * 3 - 3] == 65535 /* Seq.End */ && data[accEnd + high * 3 - 3] == 65535 /* Seq.End */) {\n state = data[accEnd + high * 3 - 1];\n continue scan;\n }\n // Do a binary search on the state's edges\n for (; low < high;) {\n let mid = (low + high) >> 1;\n let index = accEnd + mid + (mid << 1);\n let from = data[index], to = data[index + 1] || 0x10000;\n if (next < from)\n high = mid;\n else if (next >= to)\n low = mid + 1;\n else {\n state = data[index + 2];\n input.advance();\n continue scan;\n }\n }\n break;\n }\n}\nfunction findOffset(data, start, term) {\n for (let i = start, next; (next = data[i]) != 65535 /* Seq.End */; i++)\n if (next == term)\n return i - start;\n return -1;\n}\nfunction overrides(token, prev, tableData, tableOffset) {\n let iPrev = findOffset(tableData, tableOffset, prev);\n return iPrev < 0 || findOffset(tableData, tableOffset, token) < iPrev;\n}\n\n// Environment variable used to control console output\nconst verbose = typeof process != \"undefined\" && process.env && /\\bparse\\b/.test(process.env.LOG);\nlet stackIDs = null;\nvar Safety;\n(function (Safety) {\n Safety[Safety[\"Margin\"] = 25] = \"Margin\";\n})(Safety || (Safety = {}));\nfunction cutAt(tree, pos, side) {\n let cursor = tree.cursor(IterMode.IncludeAnonymous);\n cursor.moveTo(pos);\n for (;;) {\n if (!(side < 0 ? cursor.childBefore(pos) : cursor.childAfter(pos)))\n for (;;) {\n if ((side < 0 ? cursor.to < pos : cursor.from > pos) && !cursor.type.isError)\n return side < 0 ? Math.max(0, Math.min(cursor.to - 1, pos - 25 /* Safety.Margin */))\n : Math.min(tree.length, Math.max(cursor.from + 1, pos + 25 /* Safety.Margin */));\n if (side < 0 ? cursor.prevSibling() : cursor.nextSibling())\n break;\n if (!cursor.parent())\n return side < 0 ? 0 : tree.length;\n }\n }\n}\nclass FragmentCursor {\n constructor(fragments, nodeSet) {\n this.fragments = fragments;\n this.nodeSet = nodeSet;\n this.i = 0;\n this.fragment = null;\n this.safeFrom = -1;\n this.safeTo = -1;\n this.trees = [];\n this.start = [];\n this.index = [];\n this.nextFragment();\n }\n nextFragment() {\n let fr = this.fragment = this.i == this.fragments.length ? null : this.fragments[this.i++];\n if (fr) {\n this.safeFrom = fr.openStart ? cutAt(fr.tree, fr.from + fr.offset, 1) - fr.offset : fr.from;\n this.safeTo = fr.openEnd ? cutAt(fr.tree, fr.to + fr.offset, -1) - fr.offset : fr.to;\n while (this.trees.length) {\n this.trees.pop();\n this.start.pop();\n this.index.pop();\n }\n this.trees.push(fr.tree);\n this.start.push(-fr.offset);\n this.index.push(0);\n this.nextStart = this.safeFrom;\n }\n else {\n this.nextStart = 1e9;\n }\n }\n // `pos` must be >= any previously given `pos` for this cursor\n nodeAt(pos) {\n if (pos < this.nextStart)\n return null;\n while (this.fragment && this.safeTo <= pos)\n this.nextFragment();\n if (!this.fragment)\n return null;\n for (;;) {\n let last = this.trees.length - 1;\n if (last < 0) { // End of tree\n this.nextFragment();\n return null;\n }\n let top = this.trees[last], index = this.index[last];\n if (index == top.children.length) {\n this.trees.pop();\n this.start.pop();\n this.index.pop();\n continue;\n }\n let next = top.children[index];\n let start = this.start[last] + top.positions[index];\n if (start > pos) {\n this.nextStart = start;\n return null;\n }\n if (next instanceof Tree) {\n if (start == pos) {\n if (start < this.safeFrom)\n return null;\n let end = start + next.length;\n if (end <= this.safeTo) {\n let lookAhead = next.prop(NodeProp.lookAhead);\n if (!lookAhead || end + lookAhead < this.fragment.to)\n return next;\n }\n }\n this.index[last]++;\n if (start + next.length >= Math.max(this.safeFrom, pos)) { // Enter this node\n this.trees.push(next);\n this.start.push(start);\n this.index.push(0);\n }\n }\n else {\n this.index[last]++;\n this.nextStart = start + next.length;\n }\n }\n }\n}\nclass TokenCache {\n constructor(parser, stream) {\n this.stream = stream;\n this.tokens = [];\n this.mainToken = null;\n this.actions = [];\n this.tokens = parser.tokenizers.map(_ => new CachedToken);\n }\n getActions(stack) {\n let actionIndex = 0;\n let main = null;\n let { parser } = stack.p, { tokenizers } = parser;\n let mask = parser.stateSlot(stack.state, 3 /* ParseState.TokenizerMask */);\n let context = stack.curContext ? stack.curContext.hash : 0;\n let lookAhead = 0;\n for (let i = 0; i < tokenizers.length; i++) {\n if (((1 << i) & mask) == 0)\n continue;\n let tokenizer = tokenizers[i], token = this.tokens[i];\n if (main && !tokenizer.fallback)\n continue;\n if (tokenizer.contextual || token.start != stack.pos || token.mask != mask || token.context != context) {\n this.updateCachedToken(token, tokenizer, stack);\n token.mask = mask;\n token.context = context;\n }\n if (token.lookAhead > token.end + 25 /* Safety.Margin */)\n lookAhead = Math.max(token.lookAhead, lookAhead);\n if (token.value != 0 /* Term.Err */) {\n let startIndex = actionIndex;\n if (token.extended > -1)\n actionIndex = this.addActions(stack, token.extended, token.end, actionIndex);\n actionIndex = this.addActions(stack, token.value, token.end, actionIndex);\n if (!tokenizer.extend) {\n main = token;\n if (actionIndex > startIndex)\n break;\n }\n }\n }\n while (this.actions.length > actionIndex)\n this.actions.pop();\n if (lookAhead)\n stack.setLookAhead(lookAhead);\n if (!main && stack.pos == this.stream.end) {\n main = new CachedToken;\n main.value = stack.p.parser.eofTerm;\n main.start = main.end = stack.pos;\n actionIndex = this.addActions(stack, main.value, main.end, actionIndex);\n }\n this.mainToken = main;\n return this.actions;\n }\n getMainToken(stack) {\n if (this.mainToken)\n return this.mainToken;\n let main = new CachedToken, { pos, p } = stack;\n main.start = pos;\n main.end = Math.min(pos + 1, p.stream.end);\n main.value = pos == p.stream.end ? p.parser.eofTerm : 0 /* Term.Err */;\n return main;\n }\n updateCachedToken(token, tokenizer, stack) {\n let start = this.stream.clipPos(stack.pos);\n tokenizer.token(this.stream.reset(start, token), stack);\n if (token.value > -1) {\n let { parser } = stack.p;\n for (let i = 0; i < parser.specialized.length; i++)\n if (parser.specialized[i] == token.value) {\n let result = parser.specializers[i](this.stream.read(token.start, token.end), stack);\n if (result >= 0 && stack.p.parser.dialect.allows(result >> 1)) {\n if ((result & 1) == 0 /* Specialize.Specialize */)\n token.value = result >> 1;\n else\n token.extended = result >> 1;\n break;\n }\n }\n }\n else {\n token.value = 0 /* Term.Err */;\n token.end = this.stream.clipPos(start + 1);\n }\n }\n putAction(action, token, end, index) {\n // Don't add duplicate actions\n for (let i = 0; i < index; i += 3)\n if (this.actions[i] == action)\n return index;\n this.actions[index++] = action;\n this.actions[index++] = token;\n this.actions[index++] = end;\n return index;\n }\n addActions(stack, token, end, index) {\n let { state } = stack, { parser } = stack.p, { data } = parser;\n for (let set = 0; set < 2; set++) {\n for (let i = parser.stateSlot(state, set ? 2 /* ParseState.Skip */ : 1 /* ParseState.Actions */);; i += 3) {\n if (data[i] == 65535 /* Seq.End */) {\n if (data[i + 1] == 1 /* Seq.Next */) {\n i = pair(data, i + 2);\n }\n else {\n if (index == 0 && data[i + 1] == 2 /* Seq.Other */)\n index = this.putAction(pair(data, i + 2), token, end, index);\n break;\n }\n }\n if (data[i] == token)\n index = this.putAction(pair(data, i + 1), token, end, index);\n }\n }\n return index;\n }\n}\nvar Rec;\n(function (Rec) {\n Rec[Rec[\"Distance\"] = 5] = \"Distance\";\n Rec[Rec[\"MaxRemainingPerStep\"] = 3] = \"MaxRemainingPerStep\";\n // When two stacks have been running independently long enough to\n // add this many elements to their buffers, prune one.\n Rec[Rec[\"MinBufferLengthPrune\"] = 500] = \"MinBufferLengthPrune\";\n Rec[Rec[\"ForceReduceLimit\"] = 10] = \"ForceReduceLimit\";\n // Once a stack reaches this depth (in .stack.length) force-reduce\n // it back to CutTo to avoid creating trees that overflow the stack\n // on recursive traversal.\n Rec[Rec[\"CutDepth\"] = 15000] = \"CutDepth\";\n Rec[Rec[\"CutTo\"] = 9000] = \"CutTo\";\n Rec[Rec[\"MaxLeftAssociativeReductionCount\"] = 300] = \"MaxLeftAssociativeReductionCount\";\n // The maximum number of non-recovering stacks to explore (to avoid\n // getting bogged down with exponentially multiplying stacks in\n // ambiguous content)\n Rec[Rec[\"MaxStackCount\"] = 12] = \"MaxStackCount\";\n})(Rec || (Rec = {}));\nclass Parse {\n constructor(parser, input, fragments, ranges) {\n this.parser = parser;\n this.input = input;\n this.ranges = ranges;\n this.recovering = 0;\n this.nextStackID = 0x2654; // \u2654, \u2655, \u2656, \u2657, \u2658, \u2659, \u2660, \u2661, \u2662, \u2663, \u2664, \u2665, \u2666, \u2667\n this.minStackPos = 0;\n this.reused = [];\n this.stoppedAt = null;\n this.lastBigReductionStart = -1;\n this.lastBigReductionSize = 0;\n this.bigReductionCount = 0;\n this.stream = new InputStream(input, ranges);\n this.tokens = new TokenCache(parser, this.stream);\n this.topTerm = parser.top[1];\n let { from } = ranges[0];\n this.stacks = [Stack.start(this, parser.top[0], from)];\n this.fragments = fragments.length && this.stream.end - from > parser.bufferLength * 4\n ? new FragmentCursor(fragments, parser.nodeSet) : null;\n }\n get parsedPos() {\n return this.minStackPos;\n }\n // Move the parser forward. This will process all parse stacks at\n // `this.pos` and try to advance them to a further position. If no\n // stack for such a position is found, it'll start error-recovery.\n //\n // When the parse is finished, this will return a syntax tree. When\n // not, it returns `null`.\n advance() {\n let stacks = this.stacks, pos = this.minStackPos;\n // This will hold stacks beyond `pos`.\n let newStacks = this.stacks = [];\n let stopped, stoppedTokens;\n // If a large amount of reductions happened with the same start\n // position, force the stack out of that production in order to\n // avoid creating a tree too deep to recurse through.\n // (This is an ugly kludge, because unfortunately there is no\n // straightforward, cheap way to check for this happening, due to\n // the history of reductions only being available in an\n // expensive-to-access format in the stack buffers.)\n if (this.bigReductionCount > 300 /* Rec.MaxLeftAssociativeReductionCount */ && stacks.length == 1) {\n let [s] = stacks;\n while (s.forceReduce() && s.stack.length && s.stack[s.stack.length - 2] >= this.lastBigReductionStart) { }\n this.bigReductionCount = this.lastBigReductionSize = 0;\n }\n // Keep advancing any stacks at `pos` until they either move\n // forward or can't be advanced. Gather stacks that can't be\n // advanced further in `stopped`.\n for (let i = 0; i < stacks.length; i++) {\n let stack = stacks[i];\n for (;;) {\n this.tokens.mainToken = null;\n if (stack.pos > pos) {\n newStacks.push(stack);\n }\n else if (this.advanceStack(stack, newStacks, stacks)) {\n continue;\n }\n else {\n if (!stopped) {\n stopped = [];\n stoppedTokens = [];\n }\n stopped.push(stack);\n let tok = this.tokens.getMainToken(stack);\n stoppedTokens.push(tok.value, tok.end);\n }\n break;\n }\n }\n if (!newStacks.length) {\n let finished = stopped && findFinished(stopped);\n if (finished)\n return this.stackToTree(finished);\n if (this.parser.strict) {\n if (verbose && stopped)\n console.log(\"Stuck with token \" + (this.tokens.mainToken ? this.parser.getName(this.tokens.mainToken.value) : \"none\"));\n throw new SyntaxError(\"No parse at \" + pos);\n }\n if (!this.recovering)\n this.recovering = 5 /* Rec.Distance */;\n }\n if (this.recovering && stopped) {\n let finished = this.stoppedAt != null && stopped[0].pos > this.stoppedAt ? stopped[0]\n : this.runRecovery(stopped, stoppedTokens, newStacks);\n if (finished)\n return this.stackToTree(finished.forceAll());\n }\n if (this.recovering) {\n let maxRemaining = this.recovering == 1 ? 1 : this.recovering * 3 /* Rec.MaxRemainingPerStep */;\n if (newStacks.length > maxRemaining) {\n newStacks.sort((a, b) => b.score - a.score);\n while (newStacks.length > maxRemaining)\n newStacks.pop();\n }\n if (newStacks.some(s => s.reducePos > pos))\n this.recovering--;\n }\n else if (newStacks.length > 1) {\n // Prune stacks that are in the same state, or that have been\n // running without splitting for a while, to avoid getting stuck\n // with multiple successful stacks running endlessly on.\n outer: for (let i = 0; i < newStacks.length - 1; i++) {\n let stack = newStacks[i];\n for (let j = i + 1; j < newStacks.length; j++) {\n let other = newStacks[j];\n if (stack.sameState(other) ||\n stack.buffer.length > 500 /* Rec.MinBufferLengthPrune */ && other.buffer.length > 500 /* Rec.MinBufferLengthPrune */) {\n if (((stack.score - other.score) || (stack.buffer.length - other.buffer.length)) > 0) {\n newStacks.splice(j--, 1);\n }\n else {\n newStacks.splice(i--, 1);\n continue outer;\n }\n }\n }\n }\n if (newStacks.length > 12 /* Rec.MaxStackCount */)\n newStacks.splice(12 /* Rec.MaxStackCount */, newStacks.length - 12 /* Rec.MaxStackCount */);\n }\n this.minStackPos = newStacks[0].pos;\n for (let i = 1; i < newStacks.length; i++)\n if (newStacks[i].pos < this.minStackPos)\n this.minStackPos = newStacks[i].pos;\n return null;\n }\n stopAt(pos) {\n if (this.stoppedAt != null && this.stoppedAt < pos)\n throw new RangeError(\"Can't move stoppedAt forward\");\n this.stoppedAt = pos;\n }\n // Returns an updated version of the given stack, or null if the\n // stack can't advance normally. When `split` and `stacks` are\n // given, stacks split off by ambiguous operations will be pushed to\n // `split`, or added to `stacks` if they move `pos` forward.\n advanceStack(stack, stacks, split) {\n let start = stack.pos, { parser } = this;\n let base = verbose ? this.stackID(stack) + \" -> \" : \"\";\n if (this.stoppedAt != null && start > this.stoppedAt)\n return stack.forceReduce() ? stack : null;\n if (this.fragments) {\n let strictCx = stack.curContext && stack.curContext.tracker.strict, cxHash = strictCx ? stack.curContext.hash : 0;\n for (let cached = this.fragments.nodeAt(start); cached;) {\n let match = this.parser.nodeSet.types[cached.type.id] == cached.type ? parser.getGoto(stack.state, cached.type.id) : -1;\n if (match > -1 && cached.length && (!strictCx || (cached.prop(NodeProp.contextHash) || 0) == cxHash)) {\n stack.useNode(cached, match);\n if (verbose)\n console.log(base + this.stackID(stack) + ` (via reuse of ${parser.getName(cached.type.id)})`);\n return true;\n }\n if (!(cached instanceof Tree) || cached.children.length == 0 || cached.positions[0] > 0)\n break;\n let inner = cached.children[0];\n if (inner instanceof Tree && cached.positions[0] == 0)\n cached = inner;\n else\n break;\n }\n }\n let defaultReduce = parser.stateSlot(stack.state, 4 /* ParseState.DefaultReduce */);\n if (defaultReduce > 0) {\n stack.reduce(defaultReduce);\n if (verbose)\n console.log(base + this.stackID(stack) + ` (via always-reduce ${parser.getName(defaultReduce & 65535 /* Action.ValueMask */)})`);\n return true;\n }\n if (stack.stack.length >= 15000 /* Rec.CutDepth */) {\n while (stack.stack.length > 9000 /* Rec.CutTo */ && stack.forceReduce()) { }\n }\n let actions = this.tokens.getActions(stack);\n for (let i = 0; i < actions.length;) {\n let action = actions[i++], term = actions[i++], end = actions[i++];\n let last = i == actions.length || !split;\n let localStack = last ? stack : stack.split();\n localStack.apply(action, term, end);\n if (verbose)\n console.log(base + this.stackID(localStack) + ` (via ${(action & 65536 /* Action.ReduceFlag */) == 0 ? \"shift\"\n : `reduce of ${parser.getName(action & 65535 /* Action.ValueMask */)}`} for ${parser.getName(term)} @ ${start}${localStack == stack ? \"\" : \", split\"})`);\n if (last)\n return true;\n else if (localStack.pos > start)\n stacks.push(localStack);\n else\n split.push(localStack);\n }\n return false;\n }\n // Advance a given stack forward as far as it will go. Returns the\n // (possibly updated) stack if it got stuck, or null if it moved\n // forward and was given to `pushStackDedup`.\n advanceFully(stack, newStacks) {\n let pos = stack.pos;\n for (;;) {\n if (!this.advanceStack(stack, null, null))\n return false;\n if (stack.pos > pos) {\n pushStackDedup(stack, newStacks);\n return true;\n }\n }\n }\n runRecovery(stacks, tokens, newStacks) {\n let finished = null, restarted = false;\n for (let i = 0; i < stacks.length; i++) {\n let stack = stacks[i], token = tokens[i << 1], tokenEnd = tokens[(i << 1) + 1];\n let base = verbose ? this.stackID(stack) + \" -> \" : \"\";\n if (stack.deadEnd) {\n if (restarted)\n continue;\n restarted = true;\n stack.restart();\n if (verbose)\n console.log(base + this.stackID(stack) + \" (restarted)\");\n let done = this.advanceFully(stack, newStacks);\n if (done)\n continue;\n }\n let force = stack.split(), forceBase = base;\n for (let j = 0; force.forceReduce() && j < 10 /* Rec.ForceReduceLimit */; j++) {\n if (verbose)\n console.log(forceBase + this.stackID(force) + \" (via force-reduce)\");\n let done = this.advanceFully(force, newStacks);\n if (done)\n break;\n if (verbose)\n forceBase = this.stackID(force) + \" -> \";\n }\n for (let insert of stack.recoverByInsert(token)) {\n if (verbose)\n console.log(base + this.stackID(insert) + \" (via recover-insert)\");\n this.advanceFully(insert, newStacks);\n }\n if (this.stream.end > stack.pos) {\n if (tokenEnd == stack.pos) {\n tokenEnd++;\n token = 0 /* Term.Err */;\n }\n stack.recoverByDelete(token, tokenEnd);\n if (verbose)\n console.log(base + this.stackID(stack) + ` (via recover-delete ${this.parser.getName(token)})`);\n pushStackDedup(stack, newStacks);\n }\n else if (!finished || finished.score < stack.score) {\n finished = stack;\n }\n }\n return finished;\n }\n // Convert the stack's buffer to a syntax tree.\n stackToTree(stack) {\n stack.close();\n return Tree.build({ buffer: StackBufferCursor.create(stack),\n nodeSet: this.parser.nodeSet,\n topID: this.topTerm,\n maxBufferLength: this.parser.bufferLength,\n reused: this.reused,\n start: this.ranges[0].from,\n length: stack.pos - this.ranges[0].from,\n minRepeatType: this.parser.minRepeatTerm });\n }\n stackID(stack) {\n let id = (stackIDs || (stackIDs = new WeakMap)).get(stack);\n if (!id)\n stackIDs.set(stack, id = String.fromCodePoint(this.nextStackID++));\n return id + stack;\n }\n}\nfunction pushStackDedup(stack, newStacks) {\n for (let i = 0; i < newStacks.length; i++) {\n let other = newStacks[i];\n if (other.pos == stack.pos && other.sameState(stack)) {\n if (newStacks[i].score < stack.score)\n newStacks[i] = stack;\n return;\n }\n }\n newStacks.push(stack);\n}\nclass Dialect {\n constructor(source, flags, disabled) {\n this.source = source;\n this.flags = flags;\n this.disabled = disabled;\n }\n allows(term) { return !this.disabled || this.disabled[term] == 0; }\n}\nconst id = x => x;\n/// Context trackers are used to track stateful context (such as\n/// indentation in the Python grammar, or parent elements in the XML\n/// grammar) needed by external tokenizers. You declare them in a\n/// grammar file as `@context exportName from \"module\"`.\n///\n/// Context values should be immutable, and can be updated (replaced)\n/// on shift or reduce actions.\n///\n/// The export used in a `@context` declaration should be of this\n/// type.\nclass ContextTracker {\n /// Define a context tracker.\n constructor(spec) {\n this.start = spec.start;\n this.shift = spec.shift || id;\n this.reduce = spec.reduce || id;\n this.reuse = spec.reuse || id;\n this.hash = spec.hash || (() => 0);\n this.strict = spec.strict !== false;\n }\n}\n/// Holds the parse tables for a given grammar, as generated by\n/// `lezer-generator`, and provides [methods](#common.Parser) to parse\n/// content with.\nclass LRParser extends Parser {\n /// @internal\n constructor(spec) {\n super();\n /// @internal\n this.wrappers = [];\n if (spec.version != 14 /* File.Version */)\n throw new RangeError(`Parser version (${spec.version}) doesn't match runtime version (${14 /* File.Version */})`);\n let nodeNames = spec.nodeNames.split(\" \");\n this.minRepeatTerm = nodeNames.length;\n for (let i = 0; i < spec.repeatNodeCount; i++)\n nodeNames.push(\"\");\n let topTerms = Object.keys(spec.topRules).map(r => spec.topRules[r][1]);\n let nodeProps = [];\n for (let i = 0; i < nodeNames.length; i++)\n nodeProps.push([]);\n function setProp(nodeID, prop, value) {\n nodeProps[nodeID].push([prop, prop.deserialize(String(value))]);\n }\n if (spec.nodeProps)\n for (let propSpec of spec.nodeProps) {\n let prop = propSpec[0];\n if (typeof prop == \"string\")\n prop = NodeProp[prop];\n for (let i = 1; i < propSpec.length;) {\n let next = propSpec[i++];\n if (next >= 0) {\n setProp(next, prop, propSpec[i++]);\n }\n else {\n let value = propSpec[i + -next];\n for (let j = -next; j > 0; j--)\n setProp(propSpec[i++], prop, value);\n i++;\n }\n }\n }\n this.nodeSet = new NodeSet(nodeNames.map((name, i) => NodeType.define({\n name: i >= this.minRepeatTerm ? undefined : name,\n id: i,\n props: nodeProps[i],\n top: topTerms.indexOf(i) > -1,\n error: i == 0,\n skipped: spec.skippedNodes && spec.skippedNodes.indexOf(i) > -1\n })));\n if (spec.propSources)\n this.nodeSet = this.nodeSet.extend(...spec.propSources);\n this.strict = false;\n this.bufferLength = DefaultBufferLength;\n let tokenArray = decodeArray(spec.tokenData);\n this.context = spec.context;\n this.specializerSpecs = spec.specialized || [];\n this.specialized = new Uint16Array(this.specializerSpecs.length);\n for (let i = 0; i < this.specializerSpecs.length; i++)\n this.specialized[i] = this.specializerSpecs[i].term;\n this.specializers = this.specializerSpecs.map(getSpecializer);\n this.states = decodeArray(spec.states, Uint32Array);\n this.data = decodeArray(spec.stateData);\n this.goto = decodeArray(spec.goto);\n this.maxTerm = spec.maxTerm;\n this.tokenizers = spec.tokenizers.map(value => typeof value == \"number\" ? new TokenGroup(tokenArray, value) : value);\n this.topRules = spec.topRules;\n this.dialects = spec.dialects || {};\n this.dynamicPrecedences = spec.dynamicPrecedences || null;\n this.tokenPrecTable = spec.tokenPrec;\n this.termNames = spec.termNames || null;\n this.maxNode = this.nodeSet.types.length - 1;\n this.dialect = this.parseDialect();\n this.top = this.topRules[Object.keys(this.topRules)[0]];\n }\n createParse(input, fragments, ranges) {\n let parse = new Parse(this, input, fragments, ranges);\n for (let w of this.wrappers)\n parse = w(parse, input, fragments, ranges);\n return parse;\n }\n /// Get a goto table entry @internal\n getGoto(state, term, loose = false) {\n let table = this.goto;\n if (term >= table[0])\n return -1;\n for (let pos = table[term + 1];;) {\n let groupTag = table[pos++], last = groupTag & 1;\n let target = table[pos++];\n if (last && loose)\n return target;\n for (let end = pos + (groupTag >> 1); pos < end; pos++)\n if (table[pos] == state)\n return target;\n if (last)\n return -1;\n }\n }\n /// Check if this state has an action for a given terminal @internal\n hasAction(state, terminal) {\n let data = this.data;\n for (let set = 0; set < 2; set++) {\n for (let i = this.stateSlot(state, set ? 2 /* ParseState.Skip */ : 1 /* ParseState.Actions */), next;; i += 3) {\n if ((next = data[i]) == 65535 /* Seq.End */) {\n if (data[i + 1] == 1 /* Seq.Next */)\n next = data[i = pair(data, i + 2)];\n else if (data[i + 1] == 2 /* Seq.Other */)\n return pair(data, i + 2);\n else\n break;\n }\n if (next == terminal || next == 0 /* Term.Err */)\n return pair(data, i + 1);\n }\n }\n return 0;\n }\n /// @internal\n stateSlot(state, slot) {\n return this.states[(state * 6 /* ParseState.Size */) + slot];\n }\n /// @internal\n stateFlag(state, flag) {\n return (this.stateSlot(state, 0 /* ParseState.Flags */) & flag) > 0;\n }\n /// @internal\n validAction(state, action) {\n return !!this.allActions(state, a => a == action ? true : null);\n }\n /// @internal\n allActions(state, action) {\n let deflt = this.stateSlot(state, 4 /* ParseState.DefaultReduce */);\n let result = deflt ? action(deflt) : undefined;\n for (let i = this.stateSlot(state, 1 /* ParseState.Actions */); result == null; i += 3) {\n if (this.data[i] == 65535 /* Seq.End */) {\n if (this.data[i + 1] == 1 /* Seq.Next */)\n i = pair(this.data, i + 2);\n else\n break;\n }\n result = action(pair(this.data, i + 1));\n }\n return result;\n }\n /// Get the states that can follow this one through shift actions or\n /// goto jumps. @internal\n nextStates(state) {\n let result = [];\n for (let i = this.stateSlot(state, 1 /* ParseState.Actions */);; i += 3) {\n if (this.data[i] == 65535 /* Seq.End */) {\n if (this.data[i + 1] == 1 /* Seq.Next */)\n i = pair(this.data, i + 2);\n else\n break;\n }\n if ((this.data[i + 2] & (65536 /* Action.ReduceFlag */ >> 16)) == 0) {\n let value = this.data[i + 1];\n if (!result.some((v, i) => (i & 1) && v == value))\n result.push(this.data[i], value);\n }\n }\n return result;\n }\n /// Configure the parser. Returns a new parser instance that has the\n /// given settings modified. Settings not provided in `config` are\n /// kept from the original parser.\n configure(config) {\n // Hideous reflection-based kludge to make it easy to create a\n // slightly modified copy of a parser.\n let copy = Object.assign(Object.create(LRParser.prototype), this);\n if (config.props)\n copy.nodeSet = this.nodeSet.extend(...config.props);\n if (config.top) {\n let info = this.topRules[config.top];\n if (!info)\n throw new RangeError(`Invalid top rule name ${config.top}`);\n copy.top = info;\n }\n if (config.tokenizers)\n copy.tokenizers = this.tokenizers.map(t => {\n let found = config.tokenizers.find(r => r.from == t);\n return found ? found.to : t;\n });\n if (config.specializers) {\n copy.specializers = this.specializers.slice();\n copy.specializerSpecs = this.specializerSpecs.map((s, i) => {\n let found = config.specializers.find(r => r.from == s.external);\n if (!found)\n return s;\n let spec = Object.assign(Object.assign({}, s), { external: found.to });\n copy.specializers[i] = getSpecializer(spec);\n return spec;\n });\n }\n if (config.contextTracker)\n copy.context = config.contextTracker;\n if (config.dialect)\n copy.dialect = this.parseDialect(config.dialect);\n if (config.strict != null)\n copy.strict = config.strict;\n if (config.wrap)\n copy.wrappers = copy.wrappers.concat(config.wrap);\n if (config.bufferLength != null)\n copy.bufferLength = config.bufferLength;\n return copy;\n }\n /// Tells you whether any [parse wrappers](#lr.ParserConfig.wrap)\n /// are registered for this parser.\n hasWrappers() {\n return this.wrappers.length > 0;\n }\n /// Returns the name associated with a given term. This will only\n /// work for all terms when the parser was generated with the\n /// `--names` option. By default, only the names of tagged terms are\n /// stored.\n getName(term) {\n return this.termNames ? this.termNames[term] : String(term <= this.maxNode && this.nodeSet.types[term].name || term);\n }\n /// The eof term id is always allocated directly after the node\n /// types. @internal\n get eofTerm() { return this.maxNode + 1; }\n /// The type of top node produced by the parser.\n get topNode() { return this.nodeSet.types[this.top[1]]; }\n /// @internal\n dynamicPrecedence(term) {\n let prec = this.dynamicPrecedences;\n return prec == null ? 0 : prec[term] || 0;\n }\n /// @internal\n parseDialect(dialect) {\n let values = Object.keys(this.dialects), flags = values.map(() => false);\n if (dialect)\n for (let part of dialect.split(\" \")) {\n let id = values.indexOf(part);\n if (id >= 0)\n flags[id] = true;\n }\n let disabled = null;\n for (let i = 0; i < values.length; i++)\n if (!flags[i]) {\n for (let j = this.dialects[values[i]], id; (id = this.data[j++]) != 65535 /* Seq.End */;)\n (disabled || (disabled = new Uint8Array(this.maxTerm + 1)))[id] = 1;\n }\n return new Dialect(dialect, flags, disabled);\n }\n /// Used by the output of the parser generator. Not available to\n /// user code. @hide\n static deserialize(spec) {\n return new LRParser(spec);\n }\n}\nfunction pair(data, off) { return data[off] | (data[off + 1] << 16); }\nfunction findFinished(stacks) {\n let best = null;\n for (let stack of stacks) {\n let stopped = stack.p.stoppedAt;\n if ((stack.pos == stack.p.stream.end || stopped != null && stack.pos > stopped) &&\n stack.p.parser.stateFlag(stack.state, 2 /* StateFlag.Accepting */) &&\n (!best || best.score < stack.score))\n best = stack;\n }\n return best;\n}\nfunction getSpecializer(spec) {\n if (spec.external) {\n let mask = spec.extend ? 1 /* Specialize.Extend */ : 0 /* Specialize.Specialize */;\n return (value, stack) => (spec.external(value, stack) << 1) | mask;\n }\n return spec.get;\n}\n\nexport { ContextTracker, ExternalTokenizer, InputStream, LRParser, LocalTokenGroup, Stack };\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport { LRParser } from \"@lezer/lr\";\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"%QOVQPOOOOQO'#C_'#C_O_QQO'#C^OOQO'#DO'#DOOvQQO'#C|OOQO'#DR'#DROVQPO'#CuOOQO'#C}'#C}QOQPOOOOQO'#C`'#C`O!UQQO,58xO!dQPO,59VOVQPO,59]OVQPO,59_O!iQPO,59hO!nQQO,59aOOQO'#DQ'#DQOOQO1G.d1G.dO!UQQO1G.qO!yQQO1G.wOOQO1G.y1G.yOOQO'#Cw'#CwOOQO1G/S1G/SOOQO1G.{1G.{O#[QPO'#CnO#dQPO7+$]O!UQQO'#CxO#iQPO,59YOOQO<<Gw<<GwOOQO,59d,59dOOQO-E6v-E6v\",\n stateData: \"#q~OoOS~OsPOvUO~OTXOUXOVXOWXOXXOYXO`ZO~Of[Oh]Oj^OmpX~OZ`O[`O]`O^`O~OabO~OseO~Of[Oh]OwgO~Oh]Ofeijeimeiwei~OcjOdbX~OdlO~OcjOdba~O\",\n goto: \"#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj\",\n nodeNames: \"\u26A0 Filter ColumnValueExpression Column Operator Eq NotEq Gt Lt Starts Ends Number String True False ColumnSetExpression In LBrack Values Comma RBrack AndExpression And OrExpression Or ParenthesizedExpression As FilterName\",\n maxTerm: 39,\n skippedNodes: [0],\n repeatNodeCount: 1,\n tokenData: \"6p~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$j|}$o!O!P$t!Q![%S!^!_%_!_!`%d!`!a%i!c!}%n!}#O&V#P#Q&[#R#S%n#T#U&a#U#X%n#X#Y(w#Y#Z+]#Z#]%n#]#^.]#^#c%n#c#d/e#d#g%n#g#h0m#h#i4[#i#o%n~#USo~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOU~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_O[~~$bP;=`<%l#m~$jOv~~$oOw~~$tOc~~$wP!Q![$z~%PPZ~!Q![$z~%XQZ~!O!P$t!Q![%S~%dOW~~%iOT~~%nOV~P%sUsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n~&[Oa~~&aOd~R&fYsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c'U#c#g%n#g#h(^#h#o%nR'ZWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X's#X#o%nR'zUfQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(eUjQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c)f#c#o%nR)kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X*T#X#o%nR*YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h*r#h#o%nR*yUYQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR+bVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U+w#U#o%nR+|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#`%n#`#a,f#a#o%nR,kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h-T#h#o%nR-YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y-r#Y#o%nR-yU^QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR.bWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c.z#c#o%nR/RU`QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR/jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g0S#g#o%nR0ZUhQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR0rWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i1[#i#o%nR1aVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U1v#U#o%nR1{WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g2e#g#o%nR2jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i3S#i#o%nR3XWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h3q#h#o%nR3xUXQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR4aWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g4y#g#o%nR5OWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#i%n#i#j5h#j#o%nR5mWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y6V#Y#o%nR6^U]QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n\",\n tokenizers: [0, 1],\n topRules: {\"Filter\":[0,1]},\n tokenPrec: 0\n})\n", "import { Tree } from \"@lezer/common\";\nimport {\n Filter,\n FilterCombinatorOp,\n MultipleValueFilterClauseOp,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n isMultiClauseFilter,\n isMultiValueFilter,\n isSingleValueFilter,\n} from \"@vuu-ui/vuu-utils\";\n\nclass FilterExpression {\n public name: string | undefined;\n #filter: Partial<Filter> | undefined = undefined;\n\n setFilterCombinatorOp(op: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter) && filter.op === op) {\n return;\n } else {\n this.#filter = {\n op: op as FilterCombinatorOp,\n filters: [this.#filter as Filter],\n };\n }\n }\n\n add(filter: Partial<Filter>) {\n if (this.#filter === undefined) {\n this.#filter = filter;\n } else if (isMultiClauseFilter(this.#filter)) {\n this.#filter.filters.push(filter as Filter);\n } else {\n throw Error(`Invalid filter passed to FilterExpression`);\n }\n }\n\n setColumn(column: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setColumn(column, target);\n }\n } else if (filter) {\n filter.column = column;\n }\n }\n setOp(value: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setOp(value, target);\n }\n } else if (filter) {\n filter.op = value as\n | SingleValueFilterClauseOp\n | MultipleValueFilterClauseOp;\n }\n }\n setValue(value: string | number | boolean, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setValue(value, target);\n }\n } else if (isMultiValueFilter(filter)) {\n filter.values ??= [];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filter.values.push(value);\n } else if (isSingleValueFilter(filter)) {\n filter.value = value;\n }\n }\n\n toJSON(filter = this.#filter) {\n if (this.name) {\n return {\n ...filter,\n name: this.name,\n };\n } else {\n return filter;\n }\n }\n}\n\nexport const walkTree = (tree: Tree, source: string) => {\n const filterExpression = new FilterExpression();\n const cursor = tree.cursor();\n do {\n const { name, from, to } = cursor;\n switch (name) {\n case \"ColumnValueExpression\":\n filterExpression.add({});\n break;\n case \"ColumnSetExpression\":\n filterExpression.add({ op: \"in\" });\n break;\n\n case \"Or\":\n case \"And\":\n filterExpression.setFilterCombinatorOp(source.substring(from, to));\n break;\n\n case \"Column\":\n filterExpression.setColumn(source.substring(from, to));\n break;\n\n case \"Operator\":\n filterExpression.setOp(source.substring(from, to));\n break;\n\n case \"String\":\n filterExpression.setValue(source.substring(from + 1, to - 1));\n break;\n\n case \"Number\":\n filterExpression.setValue(parseFloat(source.substring(from, to)));\n break;\n\n case \"True\":\n filterExpression.setValue(true);\n break;\n\n case \"False\":\n filterExpression.setValue(false);\n break;\n\n case \"FilterName\":\n filterExpression.name = source.substring(from, to);\n break;\n\n default:\n }\n } while (cursor.next());\n\n return filterExpression.toJSON();\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { parser } from \"./generated/filter-parser\";\nimport { walkTree } from \"./FilterTreeWalker\";\n\nconst strictParser = parser.configure({ strict: true });\n\nexport const parseFilter = (filterQuery: string): Filter => {\n const parseTree = strictParser.parse(filterQuery);\n const filter = walkTree(parseTree, filterQuery) as Filter;\n return filter;\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n Filter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./FilterParser\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst filterReject = () => false;\n\nexport const getFilterPredicate = (\n columnMap: ColumnMap,\n filterQuery: string\n): FilterPredicate => {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMap, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`\n );\n return filterReject;\n }\n};\n\nexport function filterPredicate(\n columnMap: ColumnMap,\n filter: Filter\n): FilterPredicate {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMap, filter);\n case \"=\":\n return testEQ(columnMap, filter);\n case \">\":\n return testGT(columnMap, filter);\n case \">=\":\n return testGE(columnMap, filter);\n case \"<\":\n return testLT(columnMap, filter);\n case \"<=\":\n return testLE(columnMap, filter);\n case \"starts\":\n return testSW(columnMap, filter);\n case \"and\":\n return testAND(columnMap, filter as AndFilter);\n case \"or\":\n return testOR(columnMap, filter as OrFilter);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n}\n\nexport type FilterPredicate = (row: DataSourceRow) => boolean;\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (columnMap: ColumnMap, filter: AndFilter): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(columnMap: ColumnMap, filter: OrFilter): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n", "import { DataSourceFilter, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { ColumnDescriptor, Selection } from \"@vuu-ui/vuu-table-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n getAddedItems,\n getMissingItems,\n KeySet,\n logger,\n metadataKeys,\n NULL_RANGE,\n rangeNewItems,\n resetRange,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n configChanged,\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceStatus,\n groupByChanged,\n hasFilter,\n hasGroupBy,\n hasSort,\n SubscribeCallback,\n SubscribeProps,\n vanillaConfig,\n withConfigDefaults,\n WithFullConfig,\n} from \"../data-source\";\nimport { TableSchema } from \"../message-utils\";\nimport {\n MenuRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"../vuuUIMessageTypes\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { collapseGroup, expandGroup, GroupMap, groupRows } from \"./group-utils\";\nimport { sortRows } from \"./sort-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\nconst { debug } = logger(\"ArrayDataSource\");\n\nconst toDataSourceRow =\n (key: number) =>\n (data: VuuRowDataItemType[], index: number): DataSourceRow => {\n return [index, index, true, false, 1, 0, String(data[key]), 0, ...data];\n };\n\nconst buildTableSchema = (\n columns: ColumnDescriptor[],\n keyColumn?: string\n): TableSchema => {\n const schema: TableSchema = {\n columns: columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n key: keyColumn ?? columns[0].name,\n table: { module: \"\", table: \"Array\" },\n };\n\n return schema;\n};\n\nexport class ArrayDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private clientCallback: SubscribeCallback | undefined;\n private columnDescriptors: ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n #config: WithFullConfig = vanillaConfig;\n #data: DataSourceRow[];\n #links: LinkDescriptorWithLabel[] | undefined;\n #range: VuuRange = NULL_RANGE;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows: Selection = [];\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n private keys = new KeySet(this.#range);\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filter,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\"\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#size = data.length;\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key));\n\n this.config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? uuid(),\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filter,\n }: SubscribeProps,\n callback: SubscribeCallback\n ) {\n this.clientCallback = callback;\n this.viewport = viewport;\n this.#status = \"subscribed\";\n this.lastRangeServed = { from: 0, to: 0 };\n\n let config = this.#config;\n\n const hasConfigProps = aggregations || columns || filter || groupBy || sort;\n if (hasConfigProps) {\n if (range) {\n this.#range = range;\n }\n config = {\n ...config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n };\n }\n\n this.clientCallback?.({\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n });\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.#data.length,\n });\n if (range) {\n // set range and trigger dispatch of initial rows\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n }\n\n unsubscribe() {\n console.log(\"unsubscribe noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"resume noop\");\n return this;\n }\n\n disable() {\n console.log(\"disable noop\");\n return this;\n }\n\n enable() {\n console.log(\"enable noop\");\n return this;\n }\n\n select(selected: Selection) {\n this.#selectedRowsCount = selected.length;\n debug?.(`select ${JSON.stringify(selected)}`);\n this.selectedRows = selected;\n this.setRange(resetRange(this.#range), true);\n }\n\n openTreeNode(key: string) {\n this.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this.#config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[]\n );\n this.setRange(resetRange(this.#range), true);\n }\n\n closeTreeNode(key: string) {\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(resetRange(this.#range), true);\n }\n }\n\n get links() {\n return this.#links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get config() {\n return this.#config;\n }\n\n set config(config: DataSourceConfig) {\n if (this.applyConfig(config)) {\n if (config) {\n const originalConfig = this.#config;\n const newConfig: DataSourceConfig =\n config?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n\n this.#config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n\n if (hasFilter(config)) {\n const { filter, filterStruct = parseFilter(filter) } = config.filter;\n if (filterStruct) {\n const fn = filterPredicate(this.#columnMap, filterStruct);\n processedData = this.#data.filter(fn);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n groupByChanged(originalConfig, config)\n ) {\n if (this.#config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n console.log(\"adjust the openTReeNodes groupBy changed \", {\n originalGroupBy: originalConfig.groupBy,\n newGroupBy: newConfig.groupBy,\n });\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this.#config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[]\n );\n }\n }\n\n this.processedData = processedData?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n this.setRange(resetRange(this.#range), true);\n\n this.emit(\"config\", this.#config);\n }\n }\n\n applyConfig(config: DataSourceConfig) {\n if (configChanged(this.#config, config)) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n this.#config = withConfigDefaults(newConfig);\n return true;\n }\n }\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n // return this.#size;\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: VuuRange) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n this.setRange(range);\n }\n }\n\n protected delete(row: VuuRowDataItemType[]) {\n console.log(`delete row ${row.join(\",\")}`);\n }\n\n protected insert = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const dataSourceRow = toDataSourceRow(this.key)(row, this.size);\n (this.#data as DataSourceRow[]).push(dataSourceRow);\n const { from, to } = this.#range;\n const [rowIdx] = dataSourceRow;\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient();\n }\n };\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const colIndex = this.#columnMap[columnName];\n const dataColIndex = this.dataMap?.[columnName];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1 && dataColIndex !== undefined) {\n const dataSourceRow = this.#data[dataIndex];\n dataSourceRow[colIndex] = row[dataColIndex];\n const { from, to } = this.#range;\n const [rowIdx] = dataSourceRow;\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n private setRange(range: VuuRange, forceFullRefresh = false) {\n this.#range = range;\n this.keys.reset(range);\n this.sendRowsToClient(forceFullRefresh);\n }\n\n sendRowsToClient(forceFullRefresh = false, row?: DataSourceRow) {\n if (row) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n rows: [\n toClientRow(row, this.keys, this.selectedRows, this.dataIndices),\n ],\n type: \"viewport-update\",\n });\n } else {\n const rowRange =\n this.rangeChangeRowset === \"delta\" && !forceFullRefresh\n ? rangeNewItems(this.lastRangeServed, this.#range)\n : this.#range;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.keys, this.selectedRows, this.dataIndices)\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: Math.min(\n this.#range.to,\n this.#range.from + rowsWithinViewport.length\n ),\n };\n }\n }\n\n get columns() {\n return this.#config.columns;\n }\n\n set columns(columns: string[]) {\n const addedColumns = getAddedItems(this.config.columns, columns);\n if (addedColumns.length > 0) {\n const columnsWithoutDescriptors = getMissingItems(\n this.columnDescriptors,\n addedColumns,\n (col) => col.name\n );\n console.log(`columnsWithoutDescriptors`, {\n columnsWithoutDescriptors,\n });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n\n this.config = {\n ...this.#config,\n columns,\n };\n }\n\n get aggregations() {\n return this.#config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.#config = {\n ...this.#config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this.#config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap\n );\n this.setRange(resetRange(this.#range), true);\n\n this.emit(\"config\", this.#config);\n }\n\n get sort() {\n return this.#config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this.#config,\n sort,\n };\n }\n\n get filter() {\n return this.#config.filter;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this.#config,\n filter,\n };\n }\n\n get groupBy() {\n return this.#config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n this.config = {\n ...this.#config,\n groupBy,\n };\n }\n\n get title() {\n return this.#title;\n }\n\n set title(title: string | undefined) {\n this.#title = title;\n }\n\n get _clientCallback() {\n return this.clientCallback;\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n private findRow(rowKey: number) {\n const row = this.#data[rowKey];\n if (row) {\n return row;\n } else {\n throw `no row found for key ${rowKey}`;\n }\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n console.log(`ArrayDataSource applyEdit ${row[0]} ${columnName} ${value}`);\n return Promise.resolve(true);\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n return new Promise((resolve) => {\n const { type } = rpcRequest;\n switch (type) {\n case \"VP_EDIT_CELL_RPC\":\n {\n // TODO\n // const { rowKey, field, value } = rpcRequest;\n // try {\n // this.update(rowKey, field, value);\n // resolve(undefined);\n // } catch (error) {\n // resolve({ error: String(error), type: \"VP_EDIT_RPC_REJECT\" });\n // }\n }\n\n break;\n default:\n resolve(undefined);\n }\n });\n }\n}\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuAggregation, VuuGroupBy } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { GroupMap, KeyList } from \"./group-utils\";\n\nexport const count = (arr: any[]) => arr.length;\n\nexport const aggregateData = (\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n groupMap: GroupMap\n) => {\n const aggColumn = getAggColumn(columnMap, aggregations);\n const aggType = aggregations[aggregations.length - 1].aggType;\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n\n switch (aggType) {\n case 1:\n return aggregateSum(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n case 2:\n return aggregateAverage(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n case 3:\n return aggregateCount(\n groupMap,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n case 4:\n return aggregateHigh(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n case 5:\n return aggregateLow(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n case 6:\n return aggregateDistinct(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n }\n};\n\nfunction aggregateCount(\n groupMap: GroupMap,\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[]\n): { [key: string]: number } {\n const counts: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n function countRecursive(map: GroupMap | KeyList) {\n if (Array.isArray(map)) {\n return map.length;\n } else {\n let count = 0;\n for (const key in map) {\n count += 1 + countRecursive(map[key]);\n }\n return count;\n }\n }\n\n for (const key in groupMap) {\n const count = countRecursive(groupMap[key]);\n counts[key] = count;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in counts) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = counts[key];\n }\n }\n }\n\n console.log(\"!!!! targetData\", targetData);\n console.log(\"!!!! counts\", counts);\n return counts;\n}\n\nfunction getAggColumn(columnMap: ColumnMap, aggregations: VuuAggregation[]) {\n console.log(\"!!!! aggregation length\", aggregations.length);\n const columnName = aggregations[aggregations.length - 1].column;\n const columnNumber = columnMap[columnName];\n return columnNumber;\n}\n\nfunction aggregateSum(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[]\n): { [key: string]: number } {\n const sums: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n function sumRecursive(\n map: GroupMap | KeyList,\n leafData: readonly DataSourceRow[],\n aggColumn: number\n ) {\n if (Array.isArray(map)) {\n let sum = 0;\n for (const key of map) {\n sum += Number(leafData[key][aggColumn]);\n }\n return sum;\n } else {\n let sum = 0;\n for (const key in map) {\n sum += sumRecursive(map[key], leafData, aggColumn);\n }\n return sum;\n }\n }\n\n for (const key in groupMap) {\n console.log(key);\n const sum = Number(sumRecursive(groupMap[key], leafData, aggColumn));\n sums[key] = sum;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in sums) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = sums[key];\n }\n }\n }\n\n console.log(\"!!!! targetData\", targetData);\n console.log(\"!!!! sums\", sums);\n return sums;\n}\n\nfunction aggregateAverage(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[]\n): { [key: string]: number } {\n const averages: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n const count = aggregateCount(\n groupMap,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n const sum = aggregateSum(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices\n );\n\n for (const key in count) {\n let average = 0;\n average = sum[key] / count[key];\n averages[key] = average;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in averages) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = averages[key];\n }\n }\n }\n\n console.log(\"!!!! targetData\", targetData);\n console.log(\"!!!! averages\", averages);\n return averages;\n}\n\nfunction getLeafColumnData(\n map: GroupMap | KeyList,\n leafData: readonly DataSourceRow[],\n aggColumn: number\n): number[] {\n const data: number[] = [];\n\n if (Array.isArray(map)) {\n for (const key of map) {\n data.push(leafData[key][aggColumn] as number);\n }\n } else {\n for (const key in map) {\n data.push(...getLeafColumnData(map[key], leafData, aggColumn));\n }\n }\n\n return data;\n}\n\nfunction aggregateDistinct(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[]\n): { [key: string]: number } {\n const distincts: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn\n );\n const distinct: any = [...new Set(leafColumnData)];\n\n distincts[key] = distinct;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in distincts) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = distincts[key];\n }\n }\n }\n\n return distincts;\n}\n\nfunction aggregateHigh(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[]\n): { [key: string]: number } {\n const highs: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn\n );\n const maxNumber = Math.max(...leafColumnData);\n\n highs[key] = maxNumber;\n }\n for (let index = 0; index < targetData.length; index++) {\n for (const key in highs) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = highs[key];\n }\n }\n }\n\n return highs;\n}\n\nfunction aggregateLow(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[]\n): { [key: string]: number } {\n const mins: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn\n );\n const minNumber = Math.min(...leafColumnData);\n mins[key] = minNumber;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in mins) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = mins[key];\n }\n }\n }\n\n return mins;\n}\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuGroupBy } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nexport type KeyList = number[];\nexport type GroupMap = { [key: string]: GroupMap | KeyList };\n\nconst { DEPTH, IS_EXPANDED, KEY } = metadataKeys;\n\nexport const collapseGroup = (\n key: string,\n groupedRows: readonly DataSourceRow[]\n): DataSourceRow[] => {\n const rows: DataSourceRow[] = [];\n\n for (\n let i = 0, idx = 0, collapsed = false, len = groupedRows.length;\n i < len;\n i++\n ) {\n const row = groupedRows[i];\n const { [DEPTH]: depth, [KEY]: rowKey } = row;\n if (rowKey === key) {\n const collapsedRow = row.slice() as DataSourceRow;\n collapsedRow[IS_EXPANDED] = false;\n rows.push(collapsedRow);\n idx += 1;\n collapsed = true;\n while (i < len - 1 && groupedRows[i + 1][DEPTH] > depth) {\n i += 1;\n }\n } else if (collapsed) {\n const newRow = row.slice() as DataSourceRow;\n newRow[0] = idx;\n newRow[1] = idx;\n rows.push(newRow);\n idx += 1;\n } else {\n rows.push(row);\n idx += 1;\n }\n }\n\n return rows;\n};\n\nexport const expandGroup = (\n keys: string[],\n sourceRows: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n groupMap: GroupMap,\n processedData: readonly DataSourceRow[]\n): DataSourceRow[] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n return dataRowsFromGroups2(\n groupMap,\n groupIndices,\n keys,\n sourceRows,\n undefined,\n undefined,\n undefined,\n processedData\n );\n};\n\nconst dataRowsFromGroups2 = (\n groupMap: GroupMap,\n groupIndices: number[],\n openKeys: string[],\n sourceRows: readonly DataSourceRow[] = [],\n root = \"$root\",\n depth = 1,\n rows: DataSourceRow[] = [],\n processedData: readonly DataSourceRow[]\n) => {\n console.log(`dataRowsFromGroups2 1)`);\n const keys = Object.keys(groupMap).sort();\n for (const key of keys) {\n const idx = rows.length;\n const groupKey = `${root}|${key}`;\n const row: DataSourceRow = [idx, idx, false, false, depth, 0, groupKey, 0];\n // TODO whats this\n row[groupIndices[depth - 1]] = key;\n rows.push(row);\n\n if (openKeys.includes(groupKey)) {\n row[IS_EXPANDED] = true;\n if (Array.isArray(groupMap[key])) {\n pushChildren(\n rows,\n groupMap[key] as KeyList,\n sourceRows,\n groupKey,\n depth + 1\n );\n } else {\n dataRowsFromGroups2(\n groupMap[key] as GroupMap,\n groupIndices,\n openKeys,\n sourceRows,\n groupKey,\n depth + 1,\n rows,\n processedData\n );\n }\n }\n }\n console.log(`dataRowsFromGroups2 2)`);\n\n for (const key in rows) {\n for (const index in rows) {\n if (rows[key][2] === false && processedData[index] != undefined) {\n if (\n rows[key][groupIndices[0]] === processedData[index][groupIndices[0]]\n ) {\n rows[key] = rows[key].splice(0, 8).concat(\n processedData[index].slice(\n 8, // groupIndices[0] + 1,\n processedData[index].length\n )\n ) as DataSourceRow;\n break;\n }\n }\n }\n }\n console.log(`dataRowsFromGroups2 3)`);\n\n return rows;\n};\n\nconst pushChildren = (\n rows: DataSourceRow[],\n tree: KeyList,\n sourceRows: readonly DataSourceRow[],\n parentKey: string,\n depth: number\n) => {\n for (const rowIdx of tree) {\n const idx = rows.length;\n const sourceRow = sourceRows[rowIdx].slice() as DataSourceRow;\n sourceRow[0] = idx;\n sourceRow[1] = idx;\n sourceRow[DEPTH] = depth;\n sourceRow[KEY] = `${parentKey}|${sourceRow[KEY]}`;\n rows.push(sourceRow);\n }\n};\n\nexport const groupRows = (\n rows: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap\n): [DataSourceRow[], GroupMap] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n const groupTree = groupLeafRows(rows, groupIndices);\n const groupedDataRows = dataRowsFromGroups(groupTree, groupIndices);\n // 2) collapse int groups\n\n return [groupedDataRows, groupTree];\n};\n\nconst dataRowsFromGroups = (groupTree: GroupMap, groupIndices: number[]) => {\n const depth = 0;\n const rows: DataSourceRow[] = [];\n let idx = 0;\n const keys = Object.keys(groupTree).sort();\n for (const key of keys) {\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n 1,\n 0,\n `$root|${key}`,\n 0,\n ];\n row[groupIndices[depth]] = key;\n rows.push(row);\n idx += 1;\n }\n return rows;\n};\n\nfunction groupLeafRows(leafRows: readonly DataSourceRow[], groupby: number[]) {\n const groups: GroupMap = {};\n const levels = groupby.length;\n const lastLevel = levels - 1;\n for (let i = 0, len = leafRows.length; i < len; i++) {\n const leafRow = leafRows[i];\n let target: GroupMap | KeyList = groups;\n let targetNode;\n let key;\n for (let level = 0; level < levels; level++) {\n const colIdx = groupby[level];\n key = leafRow[colIdx].toString();\n targetNode = (target as GroupMap)[key];\n if (targetNode && level === lastLevel) {\n // we're at leaf level, targetNode can only be a KeyList\n (targetNode as KeyList).push(i);\n } else if (targetNode) {\n target = targetNode;\n } else if (!targetNode && level < lastLevel) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n target = target[key] = {};\n } else if (!targetNode) {\n (target as GroupMap)[key] = [i];\n }\n }\n }\n console.log(\"!! groups\", groups);\n return groups;\n}\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuSort, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\n\ntype SortDef = [number, VuuSortType];\ntype SortPredicate = (\n r1: DataSourceRow,\n r2: DataSourceRow,\n sortDefDef: SortDef\n) => SortCompareResult;\ntype SortCompareResult = 0 | 1 | -1;\ntype RowSortComparatorFactory = (\n sortDefs: SortDef[],\n test?: SortPredicate\n) => RowSortComparator;\ntype RowSortComparator = (\n item1: DataSourceRow,\n item2: DataSourceRow\n) => SortCompareResult;\n\nconst defaultSortPredicate: SortPredicate = (r1, r2, [i, direction]) => {\n const val1 = direction === \"D\" ? r2[i] : r1[i];\n const val2 = direction === \"D\" ? r1[i] : r2[i];\n if (val1 === val2) {\n return 0;\n } else if (val2 === null || val1 > val2) {\n return 1;\n } else {\n return -1;\n }\n};\n\nconst sortComparator = (sortDefs: SortDef[]): RowSortComparator => {\n if (sortDefs.length === 1) {\n return singleColComparator(sortDefs);\n } else if (sortDefs.length === 2) {\n return twoColComparator(sortDefs);\n } else {\n return multiColComparator(sortDefs);\n }\n};\n\nconst singleColComparator: RowSortComparatorFactory =\n ([[i, direction]]) =>\n (r1, r2) => {\n const v1 = direction === \"D\" ? r2[i] : r1[i];\n const v2 = direction === \"D\" ? r1[i] : r2[i];\n return v1 > v2 ? 1 : v2 > v1 ? -1 : 0;\n };\n\nconst twoColComparator: RowSortComparatorFactory =\n ([[idx1, direction1], [idx2, direction2]]) =>\n (r1, r2) => {\n const v1 = direction1 === \"D\" ? r2[idx1] : r1[idx1];\n const v2 = direction1 === \"D\" ? r1[idx1] : r2[idx1];\n const v3 = direction2 === \"D\" ? r2[idx2] : r1[idx2];\n const v4 = direction2 === \"D\" ? r1[idx2] : r2[idx2];\n return v1 > v2 ? 1 : v2 > v1 ? -1 : v3 > v4 ? 1 : v4 > v3 ? -1 : 0;\n };\n\nconst multiColComparator: RowSortComparatorFactory =\n (sortDefs, test = defaultSortPredicate) =>\n (r1, r2) => {\n for (const sortDef of sortDefs) {\n const result = test(r1, r2, sortDef);\n if (result !== 0) {\n return result;\n }\n }\n return 0;\n };\n\nexport const sortRows = (\n rows: readonly DataSourceRow[],\n { sortDefs }: VuuSort,\n columnMap: ColumnMap\n) => {\n const indexedSortDefs = sortDefs.map<SortDef>(({ column, sortType }) => [\n columnMap[column],\n sortType,\n ]);\n const comparator = sortComparator(indexedSortDefs);\n return rows.slice().sort(comparator);\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { Selection } from \"@vuu-ui/vuu-table-types\";\nimport {\n ColumnMap,\n getSelectionStatus,\n KeySet,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { RENDER_IDX, SELECTED } = metadataKeys;\n\nexport const toClientRow = (\n row: DataSourceRow,\n keys: KeySet,\n selection: Selection,\n dataIndices?: number[]\n) => {\n const [rowIndex] = row;\n let clientRow;\n if (dataIndices) {\n // If client has specified a different ordering of columns from the way they are\n // ordered inn the underlying data, this is where we effect the ordering.\n const { count } = metadataKeys;\n clientRow = row\n .slice(0, count)\n .concat(dataIndices.map((idx) => row[idx])) as DataSourceRow;\n } else {\n clientRow = row.slice() as DataSourceRow;\n }\n clientRow[RENDER_IDX] = keys.keyFor(rowIndex);\n clientRow[SELECTED] = getSelectionStatus(selection, rowIndex);\n return clientRow;\n};\n\nconst divergentMaps = (columnMap: ColumnMap, dataMap?: ColumnMap) => {\n if (dataMap) {\n const { count: mapOffset } = metadataKeys;\n for (const [columnName, index] of Object.entries(columnMap)) {\n const dataIdx = dataMap[columnName];\n if (dataIdx === undefined) {\n throw Error(\n `ArrayDataSource column ${columnName} is not in underlying data set`\n );\n } else if (dataIdx !== index - mapOffset) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getDataIndices = (columnMap: ColumnMap, dataMap: ColumnMap) => {\n const { count: mapOffset } = metadataKeys;\n const result: number[] = [];\n Object.entries(columnMap).forEach(([columnName]) => {\n result.push(dataMap[columnName] + mapOffset);\n });\n return result;\n};\n\nexport const buildDataToClientMap = (\n columnMap: ColumnMap,\n dataMap?: ColumnMap\n): number[] | undefined => {\n if (dataMap && divergentMaps(columnMap, dataMap)) {\n return getDataIndices(columnMap, dataMap);\n }\n return undefined;\n};\n", "import { ColumnDescriptor, Selection } from \"@vuu-ui/vuu-table-types\";\nimport {\n LinkDescriptorWithLabel,\n VuuGroupBy,\n VuuAggregation,\n VuuRange,\n VuuSort,\n ClientToServerMenuRPC,\n ClientToServerEditRpc,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { DataSourceFilter, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n EventEmitter,\n isSelected,\n JsonData,\n jsonToDataSourceRows,\n KeySet,\n metadataKeys,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport type {\n DataSource,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceStatus,\n SubscribeCallback,\n SubscribeProps,\n WithFullConfig,\n} from \"./data-source\";\nimport { vanillaConfig } from \"./data-source\";\nimport {\n MenuRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"./vuuUIMessageTypes\";\n\nconst NULL_SCHEMA = { columns: [], key: \"\", table: { module: \"\", table: \"\" } };\n\nexport interface JsonDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: JsonData;\n}\n\nconst { DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class JsonDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: SubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n\n #aggregations: VuuAggregation[] = [];\n #config: WithFullConfig = vanillaConfig;\n #data: DataSourceRow[];\n #filter: DataSourceFilter = { filter: \"\" };\n #groupBy: VuuGroupBy = [];\n #range: VuuRange = { from: 0, to: 0 };\n #selectedRowsCount = 0;\n #size = 0;\n #sort: VuuSort = { sortDefs: [] };\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n public rowCount: number | undefined;\n public viewport: string;\n\n private keys = new KeySet(this.#range);\n\n constructor({\n aggregations,\n data,\n filter,\n groupBy,\n sort,\n title,\n viewport,\n }: JsonDataSourceConstructorProps) {\n super();\n\n if (!data) {\n throw Error(\"JsonDataSource constructor called without data\");\n }\n\n [this.columnDescriptors, this.#data] = jsonToDataSourceRows(data);\n\n this.visibleRows = this.#data\n .filter((row) => row[DEPTH] === 0)\n .map((row, index) =>\n ([index, index] as Partial<DataSourceRow>).concat(row.slice(2))\n ) as DataSourceRow[];\n this.viewport = viewport || uuid();\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (this.columnDescriptors) {\n this.#config = {\n ...this.#config,\n columns: this.columnDescriptors.map((c) => c.name),\n };\n }\n if (filter) {\n this.#filter = filter;\n }\n if (groupBy) {\n this.#groupBy = groupBy;\n }\n if (sort) {\n this.#sort = sort;\n }\n this.#title = title;\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? uuid(),\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filter,\n }: SubscribeProps,\n callback: SubscribeCallback\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this.#config = {\n ...this.#config,\n columns,\n };\n }\n if (filter) {\n this.#filter = filter;\n }\n if (groupBy) {\n this.#groupBy = groupBy;\n }\n if (range) {\n this.#range = range;\n }\n if (sort) {\n this.#sort = sort;\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.#config.columns,\n filter: this.#filter,\n groupBy: this.#groupBy,\n range: this.#range,\n sort: this.#sort,\n tableSchema: NULL_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: JsonData) {\n console.log(`set JsonDataSource data`);\n [this.columnDescriptors, this.#data] = jsonToDataSourceRows(data);\n this.visibleRows = this.#data\n .filter((row) => row[DEPTH] === 0)\n .map((row, index) =>\n ([index, index] as Partial<DataSourceRow>).concat(row.slice(2))\n ) as DataSourceRow[];\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n select(selected: Selection) {\n const updatedRows: DataSourceRow[] = [];\n for (const row of this.#data) {\n const { [IDX]: rowIndex, [SELECTED]: sel } = row;\n const wasSelected = sel === 1;\n const nowSelected = isSelected(selected, rowIndex);\n if (nowSelected !== wasSelected) {\n const selectedRow = row.slice() as DataSourceRow;\n selectedRow[SELECTED] = nowSelected ? 1 : 0;\n this.#data[rowIndex] = selectedRow;\n updatedRows.push(selectedRow);\n }\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n openTreeNode(key: string) {\n this.expandedRows.add(key);\n this.visibleRows = getVisibleRows(this.#data, this.expandedRows);\n const { from, to } = this.#range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(key: string, cascade = false) {\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n this.visibleRows = getVisibleRows(this.#data, this.expandedRows);\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get config() {\n return this.#config;\n }\n\n applyConfig() {\n return true as const;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: VuuRange) {\n this.#range = range;\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this.#range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n get columns() {\n return this.#config.columns;\n }\n\n set columns(columns: string[]) {\n // TODO use setter\n this.#config = {\n ...this.#config,\n columns,\n };\n }\n\n get aggregations() {\n return this.#aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.#aggregations = aggregations;\n }\n\n get sort() {\n return this.#sort;\n }\n\n set sort(sort: VuuSort) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#sort = sort;\n }\n\n get filter() {\n return this.#filter;\n }\n\n set filter(filter: DataSourceFilter) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#filter = filter;\n }\n\n get groupBy() {\n return this.#groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n this.#groupBy = groupBy;\n }\n\n get title() {\n return this.#title;\n }\n\n set title(title: string | undefined) {\n this.#title = title;\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n console.log(\n `ArrayDataSource applyEdit ${row.join(\",\")} ${columnName} ${value}`\n );\n return Promise.resolve(true);\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n}\n\ntype Index = {\n value: number;\n};\n\nfunction getVisibleRows(rows: DataSourceRow[], expandedKeys: Set<string>) {\n const visibleRows: DataSourceRow[] = [];\n const index: Index = { value: 0 };\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n const { [DEPTH]: depth, [KEY]: key, [IS_LEAF]: isLeaf } = row;\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n if (!isLeaf && !isExpanded) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n return visibleRows;\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: Index,\n isExpanded: boolean\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index.value;\n dolly[1] = index.value;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n index.value += 1;\n return dolly;\n};\n", "import { DataSourceFilter, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { Selection } from \"@vuu-ui/vuu-table-types\";\nimport {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuDataRowDto,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuSort,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n debounce,\n EventEmitter,\n itemsOrOrderChanged,\n logger,\n metadataKeys,\n throttle,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { getServerAPI, ServerAPI } from \"./connection-manager\";\nimport {\n configChanged,\n DataSource,\n DataSourceCallbackMessage,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceStatus,\n isDataSourceConfigMessage,\n OptimizeStrategy,\n RpcResponse,\n SubscribeCallback,\n SubscribeProps,\n vanillaConfig,\n withConfigDefaults,\n WithFullConfig,\n} from \"./data-source\";\n\nimport {\n isViewportMenusAction,\n isVisualLinksAction,\n MenuRpcResponse,\n} from \"./vuuUIMessageTypes\";\nimport { TableSchema } from \"./message-utils\";\n\ntype RangeRequest = (range: VuuRange) => void;\n\nconst { info } = logger(\"RemoteDataSource\");\n\nconst { KEY } = metadataKeys;\n\n/*-----------------------------------------------------------------\n A RemoteDataSource manages a single subscription via the ServerProxy\n ----------------------------------------------------------------*/\nexport class RemoteDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private bufferSize: number;\n private server: ServerAPI | null = null;\n private clientCallback: SubscribeCallback | undefined;\n private configChangePending: DataSourceConfig | undefined;\n private rangeRequest: RangeRequest;\n\n #config: WithFullConfig = vanillaConfig;\n #groupBy: VuuGroupBy = [];\n #links: LinkDescriptorWithLabel[] | undefined;\n #menu: VuuMenu | undefined;\n #optimize: OptimizeStrategy = \"throttle\";\n #range: VuuRange = { from: 0, to: 0 };\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n\n #title: string | undefined;\n\n public table: VuuTable;\n public tableSchema: TableSchema | undefined;\n public viewport: string | undefined;\n\n constructor({\n bufferSize = 100,\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n table,\n title,\n viewport,\n visualLink,\n }: DataSourceConstructorProps) {\n super();\n\n if (!table)\n throw Error(\"RemoteDataSource constructor called without table\");\n\n this.bufferSize = bufferSize;\n this.table = table;\n this.viewport = viewport;\n\n this.#config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n visualLink: visualLink || this.#config.visualLink,\n };\n\n this.#title = title;\n this.rangeRequest = this.throttleRangeRequest;\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filter,\n }: SubscribeProps,\n callback: SubscribeCallback\n ) {\n if (this.#status === \"disabled\" || this.#status === \"disabling\") {\n this.enable(callback);\n return;\n }\n this.clientCallback = callback;\n if (aggregations || columns || filter || groupBy || sort) {\n this.#config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this.#range = range;\n }\n\n if (\n this.#status !== \"initialising\" &&\n this.#status !== \"unsubscribed\"\n // We can subscribe to a disabled dataSource. No request will be\n // sent to server to create a new VP, just to enable the existing one.\n // The current subscribing client becomes the subscription owner\n ) {\n return;\n }\n\n this.#status = \"subscribing\";\n this.viewport = viewport;\n\n this.server = await getServerAPI();\n\n const { bufferSize } = this;\n\n this.server?.subscribe(\n {\n ...this.#config,\n bufferSize,\n viewport,\n table: this.table,\n range: this.#range,\n title: this.#title,\n },\n this.handleMessageFromServer\n );\n }\n\n handleMessageFromServer = (message: DataSourceCallbackMessage) => {\n if (message.type === \"subscribed\") {\n this.#status = \"subscribed\";\n if (message.tableSchema) {\n this.tableSchema = message.tableSchema;\n }\n this.clientCallback?.(message);\n } else if (message.type === \"disabled\") {\n this.#status = \"disabled\";\n } else if (message.type === \"enabled\") {\n this.#status = \"enabled\";\n } else if (isDataSourceConfigMessage(message)) {\n // This is an ACK for a CHANGE_VP message. Nothing to do here. We need\n // to wait for data to be returned before we can consider the change\n // to be in effect.\n return;\n } else if (message.type === \"debounce-begin\") {\n this.optimize = \"debounce\";\n } else {\n if (\n message.type === \"viewport-update\" &&\n message.size !== undefined &&\n message.size !== this.#size\n ) {\n this.#size = message.size;\n this.emit(\"resize\", message.size);\n }\n // This is used to remove any progress indication from the UI. We wait for actual data rather than\n // just the CHANGE_VP_SUCCESS ack as there is often a delay between receiving the ack and the data.\n // It may be a SIZE only message, eg in the case of removing a groupBy column from a multi-column\n // groupby, where no tree nodes are expanded.\n if (this.configChangePending) {\n this.setConfigPending();\n }\n\n if (isViewportMenusAction(message)) {\n this.#menu = message.menu;\n } else if (isVisualLinksAction(message)) {\n this.#links = message.links as LinkDescriptorWithLabel[];\n } else {\n this.clientCallback?.(message);\n }\n\n if (this.optimize === \"debounce\") {\n this.revertDebounce();\n }\n }\n };\n\n unsubscribe() {\n console.log(`unsubscribe #${this.viewport}`);\n info?.(`unsubscribe #${this.viewport}`);\n if (this.viewport) {\n this.server?.unsubscribe(this.viewport);\n }\n this.server?.destroy(this.viewport);\n this.server = null;\n this.removeAllListeners();\n this.#status = \"unsubscribed\";\n this.viewport = undefined;\n this.range = { from: 0, to: 0 };\n }\n\n suspend() {\n console.log(`suspend #${this.viewport}, current status ${this.#status}`);\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"suspended\";\n this.server?.send({\n type: \"suspend\",\n viewport: this.viewport,\n });\n }\n return this;\n }\n\n resume() {\n console.log(`resume #${this.viewport}, current status ${this.#status}`);\n\n const isDisabled = this.#status.startsWith(\"disabl\");\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n if (isDisabled) {\n this.enable();\n } else if (isSuspended) {\n this.server?.send({\n type: \"resume\",\n viewport: this.viewport,\n });\n this.#status = \"subscribed\";\n }\n }\n return this;\n }\n\n disable() {\n info?.(`disable #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"disabling\";\n this.server?.send({\n viewport: this.viewport,\n type: \"disable\",\n });\n }\n return this;\n }\n\n enable(callback?: SubscribeCallback) {\n info?.(`enable #${this.viewport}, current status ${this.#status}`);\n if (\n this.viewport &&\n (this.#status === \"disabled\" || this.#status === \"disabling\")\n ) {\n this.#status = \"enabling\";\n if (callback) {\n this.clientCallback = callback;\n }\n this.server?.send({\n viewport: this.viewport,\n type: \"enable\",\n });\n }\n return this;\n }\n\n select(selected: Selection) {\n //TODO this isn't always going to be correct - need to count\n // selection block items\n this.#selectedRowsCount = selected.length;\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"select\",\n selected,\n });\n }\n }\n\n openTreeNode(key: string) {\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"openTreeNode\",\n key,\n });\n }\n }\n\n closeTreeNode(key: string) {\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"closeTreeNode\",\n key,\n });\n }\n }\n\n get links() {\n return this.#links;\n }\n\n get menu() {\n return this.#menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get optimize() {\n return this.#optimize;\n }\n\n set optimize(optimize: OptimizeStrategy) {\n if (optimize !== this.#optimize) {\n this.#optimize = optimize;\n switch (optimize) {\n case \"none\":\n this.rangeRequest = this.rawRangeRequest;\n break;\n case \"debounce\":\n this.rangeRequest = this.debounceRangeRequest;\n break;\n case \"throttle\":\n this.rangeRequest = this.throttleRangeRequest;\n break;\n }\n this.emit(\"optimize\", optimize);\n }\n }\n\n private revertDebounce = debounce(() => {\n this.optimize = \"throttle\";\n }, 100);\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: VuuRange) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n this.#range = range;\n this.rangeRequest(range);\n }\n }\n\n private rawRangeRequest: RangeRequest = (range) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n };\n\n private debounceRangeRequest: RangeRequest = debounce((range: VuuRange) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n }, 50);\n\n private throttleRangeRequest: RangeRequest = throttle((range: VuuRange) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n }, 80);\n\n get config() {\n return this.#config;\n }\n\n set config(config: DataSourceConfig) {\n if (this.applyConfig(config)) {\n if (this.#config && this.viewport && this.server) {\n if (config) {\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: this.#config,\n });\n }\n }\n this.emit(\"config\", this.#config);\n }\n }\n\n applyConfig(config: DataSourceConfig) {\n if (configChanged(this.#config, config)) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n this.#config = withConfigDefaults(newConfig);\n return true;\n }\n }\n }\n\n //TODO replace all these individual server calls with calls to setConfig\n get columns() {\n return this.#config.columns;\n }\n\n set columns(columns: string[]) {\n this.#config = {\n ...this.#config,\n columns,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"setColumns\",\n columns,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get aggregations() {\n return this.#config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.#config = {\n ...this.#config,\n aggregations,\n };\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"aggregate\",\n aggregations,\n });\n }\n this.emit(\"config\", this.#config);\n }\n\n get sort() {\n return this.#config.sort;\n }\n\n set sort(sort: VuuSort) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#config = {\n ...this.#config,\n sort,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"sort\",\n sort,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get filter() {\n return this.#config.filter;\n }\n\n set filter(filter: DataSourceFilter) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#config = {\n ...this.#config,\n filter,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"filter\",\n filter,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get groupBy() {\n return this.#config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n if (itemsOrOrderChanged(this.groupBy, groupBy)) {\n const wasGrouped = this.#groupBy.length > 0;\n this.#config = {\n ...this.#config,\n groupBy,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"groupBy\",\n groupBy: this.#config.groupBy,\n } as const;\n\n if (this.server) {\n this.server.send(message);\n }\n }\n if (!wasGrouped && groupBy.length > 0 && this.viewport) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n type: \"viewport-update\",\n size: 0,\n rows: [],\n });\n }\n this.emit(\"config\", this.#config);\n this.setConfigPending({ groupBy });\n }\n }\n\n get title() {\n return this.#title;\n }\n\n set title(title: string | undefined) {\n this.#title = title;\n if (this.viewport && title) {\n this.server?.send({\n type: \"setTitle\",\n title,\n viewport: this.viewport,\n });\n }\n }\n\n get visualLink() {\n return this.#config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this.#config = {\n ...this.#config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"createLink\",\n parentClientVpId,\n parentColumnName: toColumn,\n childColumnName: fromColumn,\n });\n }\n } else {\n if (this.viewport) {\n this.server?.send({\n type: \"removeLink\",\n viewport: this.viewport,\n });\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n private setConfigPending(config?: DataSourceConfig) {\n const pendingConfig = this.configChangePending;\n this.configChangePending = config;\n\n if (config !== undefined) {\n this.emit(\"config\", config, false);\n } else {\n this.emit(\"config\", pendingConfig, true);\n }\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ) {\n if (this.viewport) {\n return this.server?.rpcCall<T>({\n vpId: this.viewport,\n ...rpcRequest,\n } as ClientToServerViewportRpcCall);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ) {\n if (this.viewport) {\n return this.server?.rpcCall<MenuRpcResponse>({\n vpId: this.viewport,\n ...rpcRequest,\n } as ClientToServerMenuRPC);\n }\n }\n\n applyEdit(row: DataSourceRow, columnName: string, value: VuuRowDataItemType) {\n return this.menuRpcCall({\n rowKey: row[KEY],\n field: columnName,\n value: value,\n type: \"VP_EDIT_CELL_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n\n insertRow(key: string, data: VuuDataRowDto) {\n return this.menuRpcCall({\n rowKey: key,\n data,\n type: \"VP_EDIT_ADD_ROW_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n deleteRow(rowKey: string) {\n return this.menuRpcCall({\n rowKey,\n type: \"VP_EDIT_DELETE_ROW_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n}\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport {\n DraggableLayout,\n LayoutProvider,\n LayoutProviderProps,\n loadingApplicationJson,\n useLayoutContextMenuItems,\n} from \"@vuu-ui/vuu-layout\";\nimport { LayoutChangeHandler } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { logger } from \"@vuu-ui/vuu-utils\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { AppHeader } from \"./app-header\";\nimport { useLayoutManager } from \"./layout-management\";\nimport { SidePanelProps, useShellLayout } from \"./shell-layouts\";\nimport { SaveLocation } from \"./shellTypes\";\nimport { ThemeMode, ThemeProvider, useThemeAttributes } from \"./theme-provider\";\nimport { ShellContextProvider } from \".\";\n\nimport { ContextMenuProvider, useDialog } from \"@vuu-ui/vuu-popups\";\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst { error } = logger(\"Shell\");\n\nconst defaultLeftSidePanel: ShellProps[\"LeftSidePanelProps\"] = {};\n\nexport type LayoutTemplateName = \"full-height\" | \"inlay\";\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n LayoutProps?: Pick<\n LayoutProviderProps,\n \"createNewChild\" | \"pathToDropTarget\"\n >;\n LeftSidePanelProps?: SidePanelProps;\n children?: ReactNode;\n leftSidePanelLayout?: \"full-height\" | \"inlay\";\n loginUrl?: string;\n // paletteConfig: any;\n saveLocation?: SaveLocation;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n LayoutProps,\n LeftSidePanelProps = defaultLeftSidePanel,\n children,\n className: classNameProp,\n leftSidePanelLayout,\n loginUrl,\n saveLocation = \"remote\",\n saveUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const { dialog, setDialogState } = useDialog();\n const layoutId = useRef(\"latest\");\n const { applicationJson, saveApplicationLayout, loadLayoutById } =\n useLayoutManager();\n const { buildMenuOptions, handleMenuAction } =\n useLayoutContextMenuItems(setDialogState);\n\n const handleLayoutChange = useCallback<LayoutChangeHandler>(\n (layout, layoutChangeReason) => {\n try {\n saveApplicationLayout(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveApplicationLayout]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n // TODO this is out of date\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n }\n }, [serverUrl, user.token, user.username]);\n\n const [themeClass, densityClass, dataMode] = useThemeAttributes();\n const className = cx(\"vuuShell\", classNameProp, themeClass, densityClass);\n\n const isLoading = applicationJson === loadingApplicationJson;\n\n const shellLayout = useShellLayout({\n LeftSidePanelProps,\n leftSidePanelLayout,\n appHeader: (\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n ),\n });\n\n return isLoading ? null : (\n <ThemeProvider>\n <ContextMenuProvider\n menuActionHandler={handleMenuAction}\n menuBuilder={buildMenuOptions}\n >\n <LayoutProvider\n {...LayoutProps}\n layout={applicationJson.layout}\n onLayoutChange={handleLayoutChange}\n >\n <DraggableLayout\n className={className}\n data-mode={dataMode}\n ref={rootRef}\n {...htmlAttributes}\n >\n {shellLayout}\n </DraggableLayout>\n </LayoutProvider>\n {children || dialog}\n </ContextMenuProvider>\n </ThemeProvider>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { useCallback, useMemo } from \"react\";\nimport {\n layoutFromJson,\n LayoutJSON,\n View,\n useLayoutProviderDispatch,\n} from \"@vuu-ui/vuu-layout\";\n\nimport \"./ContextPanel.css\";\n\nconst classBase = \"vuuContextPanel\";\n\nexport interface ContextPanelProps {\n [key: string]: unknown;\n className?: string;\n content?: LayoutJSON;\n expanded?: boolean;\n overlay?: boolean;\n}\n\nexport const ContextPanel = ({\n className: classNameProp,\n expanded = false,\n content: contentProp,\n overlay = false,\n title,\n}: ContextPanelProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\n // const [contentJson, setContentJson] = useState(contentProp);\n const handleClose = useCallback(() => {\n dispatchLayoutAction({\n path: \"#context-panel\",\n propName: \"expanded\",\n propValue: false,\n type: \"set-prop\",\n });\n }, [dispatchLayoutAction]);\n // TODO look up content using context\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-expanded`]: expanded,\n [`${classBase}-inline`]: overlay !== true,\n [`${classBase}-overlay`]: overlay,\n });\n\n const content = useMemo(\n () =>\n contentProp && expanded ? layoutFromJson(contentProp, \"context-0\") : null,\n [contentProp, expanded]\n );\n\n return (\n <div\n className={cx(classBase, className, {\n [`${classBase}-expanded`]: expanded,\n })}\n >\n <View className={`${classBase}-inner`} header={false} id=\"context-panel\">\n <div className={`${classBase}-header`}>\n <h2 className={`${classBase}-title`}>{title}</h2>\n <Button\n className={`${classBase}-close`}\n data-icon=\"close\"\n onClick={handleClose}\n variant=\"secondary\"\n />\n </div>\n <div className={`${classBase}-content`}>{content}</div>\n </View>\n </div>\n );\n};\n", "import { CSSProperties, HTMLAttributes, useMemo } from \"react\";\nimport cx from \"classnames\";\n\nimport \"./SidePanel.css\";\n// import { useLayoutManager } from \"../../layout-management\";\n\nconst classBase = \"vuuShellSidePanel\";\n\nexport interface SidePanelProps extends HTMLAttributes<HTMLDivElement> {\n open?: boolean;\n path?: string;\n sizeOpen?: number;\n sizeClosed?: number;\n}\n\nexport const SidePanel = ({\n children,\n open = true,\n sizeClosed = 90,\n sizeOpen = 200,\n style: styleProp,\n ...htmlAttributes\n}: SidePanelProps) => {\n // const { applicationJson, saveApplicationSettings } = useLayoutManager();\n // console.log(`settings`, {\n // expanded: applicationJson?.settings?.leftNav?.expanded,\n // active: applicationJson?.settings?.leftNav?.activeTabIndex,\n // });\n\n const style = useMemo(\n () =>\n ({\n ...styleProp,\n \"--shell-left-nav-size\": open ? `${sizeOpen}px` : `${sizeClosed}px`,\n } as CSSProperties),\n [open, sizeClosed, sizeOpen, styleProp]\n );\n return (\n <div {...htmlAttributes} className={cx(classBase)} style={style}>\n {children}\n </div>\n );\n};\n", "import { DraggableLayout, Flexbox } from \"@vuu-ui/vuu-layout\";\nimport { ReactElement } from \"react\";\nimport { ContextPanel } from \"./context-panel\";\nimport { SidePanel } from \"./side-panel\";\nimport { ShellLayoutProps } from \"./useShellLayout\";\n\nexport const useFullHeightLeftPanel = ({\n appHeader,\n LeftSidePanelProps,\n}: ShellLayoutProps): ReactElement => {\n return (\n <Flexbox\n className=\"App\"\n style={{\n flexDirection: \"row\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n <SidePanel {...LeftSidePanelProps} id=\"vuu-side-panel\" />\n <Flexbox\n className=\"vuuShell-content\"\n style={{ flex: 1, flexDirection: \"column\" }}\n >\n {appHeader}\n <DraggableLayout dropTarget key=\"main-content\" style={{ flex: 1 }} />\n </Flexbox>\n <ContextPanel id=\"context-panel\" overlay></ContextPanel>\n </Flexbox>\n );\n};\n", "import {\n DockLayout,\n DraggableLayout,\n Drawer,\n Flexbox,\n View,\n} from \"@vuu-ui/vuu-layout\";\n\nimport { MouseEvent, ReactElement, useCallback, useRef, useState } from \"react\";\nimport { ShellLayoutProps } from \"./useShellLayout\";\n\nexport const useInlayLeftPanel = ({\n appHeader,\n LeftSidePanelProps,\n}: ShellLayoutProps): ReactElement => {\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(true);\n\n const handleDrawerClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n },\n [open]\n );\n\n const getDrawers = useCallback(\n (leftSidePanel) => {\n const drawers: ReactElement[] = [];\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n\n return drawers;\n },\n [handleDrawerClick, open]\n );\n\n return (\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n {appHeader}\n <DockLayout style={{ flex: 1 }}>\n {getDrawers(LeftSidePanelProps?.children).concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </DockLayout>\n </Flexbox>\n );\n};\n", "import { ColumnDescriptor, ListOption } from \"@vuu-ui/vuu-table-types\";\nimport { RpcResponseHandler } from \"@vuu-ui/vuu-data-react\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nexport type LookupTableProvider = (table: VuuTable) => ListOption[];\n\nexport type DefaultColumnConfiguration = <T extends string = string>(\n tableName: T,\n columnName: string\n) => Partial<ColumnDescriptor> | undefined;\nexport interface ShellContextProps {\n getDefaultColumnConfig?: DefaultColumnConfiguration;\n getLookupValues?: LookupTableProvider;\n handleRpcResponse?: RpcResponseHandler;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value?: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import cx from \"classnames\";\nimport { ToggleButton, ToggleButtonGroup, useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, SyntheticEvent, useCallback } from \"react\";\nimport { ThemeMode } from \"../theme-provider\";\n\nimport \"./ThemeSwitch.css\";\n\nconst classBase = \"vuuThemeSwitch\";\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const handleChangeSecondary = useCallback(\n (evt: SyntheticEvent<HTMLButtonElement>) => {\n const { value } = evt.target as HTMLButtonElement;\n setMode(value as ThemeMode);\n onChange(value as ThemeMode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n value={mode}\n >\n <ToggleButton aria-label=\"alert\" data-icon=\"light\" value=\"dark\" />\n <ToggleButton aria-label=\"home\" data-icon=\"dark\" value=\"light\" />\n </ToggleButtonGroup>\n );\n};\n", "import {\n LayoutMetadataDto,\n SaveLayoutPanel,\n useLayoutManager,\n} from \"@vuu-ui/vuu-shell\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useCallback, useMemo } from \"react\";\nimport { MenuActionClosePopup, SetDialog } from \"@vuu-ui/vuu-popups\";\n\nexport const useLayoutContextMenuItems = (setDialogState: SetDialog) => {\n const { saveLayout } = useLayoutManager();\n\n const handleCloseDialog = useCallback(() => {\n setDialogState(undefined);\n }, [setDialogState]);\n\n const handleSave = useCallback(\n (layoutMetadata: LayoutMetadataDto) => {\n saveLayout(layoutMetadata);\n setDialogState(undefined);\n },\n [saveLayout, setDialogState]\n );\n\n const [buildMenuOptions, handleMenuAction] = useMemo<\n [MenuBuilder, MenuActionHandler]\n >(() => {\n return [\n (location, options) => {\n const locations = location.split(\" \");\n const menuDescriptors: ContextMenuItemDescriptor[] = [];\n if (locations.includes(\"main-tab\")) {\n menuDescriptors.push(\n {\n label: \"Save Layout\",\n action: \"save-layout\",\n options,\n },\n {\n label: \"Layout Settings\",\n action: \"layout-settings\",\n options,\n }\n );\n }\n return menuDescriptors;\n },\n (action: MenuActionClosePopup) => {\n console.log(\"menu action\", {\n action,\n });\n if (action.menuId === \"save-layout\") {\n setDialogState({\n content: (\n <SaveLayoutPanel\n onCancel={handleCloseDialog}\n onSave={handleSave}\n componentId={action.options?.controlledComponentId}\n defaultTitle={\n action.options?.controlledComponentTitle as string\n }\n />\n ),\n title: \"Save Layout\",\n hideCloseButton: true,\n });\n return true;\n }\n return false;\n },\n ];\n }, [handleCloseDialog, handleSave, setDialogState]);\n\n return {\n buildMenuOptions,\n handleMenuAction,\n };\n};\n", "import { CSSProperties, forwardRef, ForwardedRef, HTMLAttributes } from \"react\";\nimport { MeasuredSize, useMeasuredContainer } from \"./useMeasuredContainer\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\n\nimport \"./MeasuredContainer.css\";\n\nexport interface MeasuredContainerProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * A numeric value for height will result in a fixed height. To adapt to container\n * use either a percentage height or 'auto'. Always use 'auto' when rendering\n * within a column based flex container, together with a flex value (use the\n * --vuuMeasuredContainer-flex CSS custom property))\n */\n height?: number | string;\n onResize?: (size: MeasuredSize) => void;\n width?: number | string;\n}\n\nconst baseClass = \"vuuMeasuredContainer\";\n\nexport const MeasuredContainer = forwardRef(function MeasuredContainer(\n {\n children,\n className,\n height,\n onResize,\n style,\n width,\n ...htmlAttributes\n }: MeasuredContainerProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { containerRef, ...containerMeasurements } = useMeasuredContainer({\n height,\n onResize,\n width,\n });\n\n const { cssSize, innerSize } = containerMeasurements;\n const unmeasured = innerSize === undefined;\n\n const getStyle = () => {\n return unmeasured\n ? ({\n \"--measured-css-height\": `${cssSize.height}`,\n \"--measured-css-width\": `${cssSize.width}`,\n } as CSSProperties)\n : ({\n ...style,\n \"--measured-css-height\": `${cssSize.height}`,\n \"--measured-css-width\": `${cssSize.width}`,\n \"--measured-px-height\": `${innerSize?.height}px`,\n \"--measured-px-width\": `${innerSize?.width}px`,\n } as CSSProperties);\n };\n\n const forkedRef = useForkRef(containerRef, forwardedRef);\n\n return unmeasured ? (\n <div\n {...htmlAttributes}\n className={cx(baseClass, `${baseClass}-ummeasured`)}\n style={getStyle()}\n ref={containerRef}\n />\n ) : (\n <div\n {...htmlAttributes}\n className={cx(baseClass, className)}\n ref={forkedRef}\n style={getStyle()}\n >\n {children}\n </div>\n );\n});\n", "import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport {\n CSSProperties,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { MeasuredContainerProps } from \"./MeasuredContainer\";\nimport { useResizeObserver, ResizeHandler } from \"./useResizeObserver\";\n\nconst ClientWidthHeight = [\"clientHeight\", \"clientWidth\"];\nconst WidthOnly = [\"clientWidth\"];\nconst HeightOnly = [\"clientHeight\"];\nconst NO_MEASUREMENT = [] as const;\n\nexport interface ClientSize {\n clientHeight: number;\n clientWidth: number;\n}\n\nexport interface MeasuredProps\n extends Pick<MeasuredContainerProps, \"height\" | \"onResize\" | \"width\"> {\n defaultHeight?: number;\n defaultWidth?: number;\n}\n\nexport type CssSize = Pick<CSSProperties, \"height\" | \"width\">;\n\nexport interface MeasuredSize {\n height: number;\n width: number;\n}\n\ninterface MeasuredState {\n css: CssSize;\n outer: CssSize;\n inner?: MeasuredSize;\n}\n\nconst isNumber = (val: unknown): val is number => Number.isFinite(val);\n\nconst FULL_SIZE: CssSize = { height: \"100%\", width: \"auto\" };\n\nexport interface MeasuredContainerHookResult {\n containerRef: RefObject<HTMLDivElement>;\n cssSize: CssSize;\n outerSize: CssSize;\n innerSize?: MeasuredSize;\n}\n\n// If (outer) height and width are known at initialisation (i.e. they\n// were passed as props), use as initial values for inner size. If there\n// is no border on Table, these values will not change. If there is a border,\n// inner values will be updated once measured.\nconst getInitialCssSize = (\n height?: number | string,\n width?: number | string\n): CssSize => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height: `${height}px`,\n width: `${width}px`,\n };\n } else if (typeof height === \"string\" || typeof width === \"string\") {\n return {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n };\n } else {\n return FULL_SIZE;\n }\n};\n\nconst getInitialInnerSize = (\n height: unknown,\n width: unknown\n): MeasuredSize | undefined => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height,\n width,\n };\n }\n};\n\nexport const useMeasuredContainer = ({\n defaultHeight = 0,\n defaultWidth = 0,\n height,\n onResize: onResizeProp,\n width,\n}: MeasuredProps): MeasuredContainerHookResult => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<MeasuredState>({\n css: getInitialCssSize(height, width),\n inner: getInitialInnerSize(height, width),\n outer: {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n },\n });\n const fixedHeight = typeof height === \"number\";\n const fixedWidth = typeof width === \"number\";\n\n const dimensions =\n fixedHeight && fixedWidth\n ? NO_MEASUREMENT\n : fixedHeight\n ? WidthOnly\n : fixedWidth\n ? HeightOnly\n : ClientWidthHeight;\n\n useMemo(() => {\n setSize((currentSize) => {\n const { inner, outer } = currentSize;\n if (isValidNumber(height) && isValidNumber(width) && inner && outer) {\n const { height: innerHeight, width: innerWidth } = inner;\n const { height: outerHeight, width: outerWidth } = outer;\n\n if (outerHeight !== height || outerWidth !== width) {\n const heightDiff = isValidNumber(outerHeight)\n ? outerHeight - innerHeight\n : 0;\n const widthDiff = isValidNumber(outerWidth)\n ? outerWidth - innerWidth\n : 0;\n return {\n ...currentSize,\n outer: { height, width },\n inner: { height: height - heightDiff, width: width - widthDiff },\n };\n }\n }\n return currentSize;\n });\n }, [height, width]);\n\n const onResize: ResizeHandler = useCallback(\n ({ clientWidth, clientHeight }: Partial<ClientSize>) => {\n const { css, inner, outer } = size;\n let newState: MeasuredState = size;\n\n if (\n fixedHeight &&\n isNumber(clientWidth) &&\n Math.floor(clientWidth) !== inner?.width\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height,\n },\n };\n } else if (\n fixedWidth &&\n isNumber(clientHeight) &&\n Math.floor(clientHeight) !== inner?.height\n ) {\n newState = {\n css,\n outer,\n inner: {\n height: Math.floor(clientHeight) || defaultHeight,\n width,\n },\n };\n } else if (\n isNumber(clientHeight) &&\n isNumber(clientWidth) &&\n (clientWidth !== inner?.width || clientHeight !== inner?.height)\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height: Math.floor(clientHeight) || defaultHeight,\n },\n };\n }\n\n if (newState !== size) {\n setSize(newState);\n }\n },\n [defaultHeight, defaultWidth, fixedHeight, fixedWidth, height, size, width]\n );\n\n useEffect(() => {\n if (size.inner) {\n onResizeProp?.(size.inner);\n }\n }, [onResizeProp, size.inner]);\n\n useResizeObserver(containerRef, dimensions, onResize, true);\n\n return {\n containerRef,\n cssSize: size.css,\n outerSize: size.outer,\n innerSize: size.inner,\n };\n};\n", "import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n clientHeight?: number;\n clientWidth?: number;\n contentHeight?: number;\n contentWidth?: number;\n scrollHeight?: number;\n scrollWidth?: number;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new Map<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n size: {\n height: number;\n width: number;\n contentHeight: number;\n contentWidth: number;\n },\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return size.height;\n case \"clientHeight\":\n return Math.floor(element.clientHeight);\n case \"clientWidth\":\n return Math.floor(element.clientWidth);\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(Math.floor(element.scrollHeight));\n case \"scrollWidth\":\n return Math.ceil(Math.floor(element.scrollWidth));\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\n// TODO should we make this create-on-demand\nconst resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const [{ blockSize: height, inlineSize: width }] = borderBoxSize;\n const [{ blockSize: contentHeight, inlineSize: contentWidth }] =\n contentBoxSize;\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n { height, width, contentHeight, contentWidth },\n dimension as measuredDimension\n );\n\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n // TODO only return measured sizes\n onResize && onResize(measurements);\n }\n }\n }\n});\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: readonly string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n) {\n const dimensionsRef = useRef(dimensions);\n\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const { width, height } = target.getBoundingClientRect();\n const { clientWidth: contentWidth, clientHeight: contentHeight } = target;\n const flooredHeight = Math.floor(height);\n const flooredWidth = Math.floor(width);\n\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n {\n width: flooredWidth,\n height: flooredHeight,\n contentHeight,\n contentWidth,\n },\n dim as measuredDimension\n );\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useEffect(() => {\n const target = ref.current as HTMLElement;\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n // await document.fonts.ready;\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n } else {\n console.log(\n `%cuseResizeObserver an target expected to be under observation wa snot found. This warrants investigation`,\n \"font-weight:bold; color:red;\"\n );\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n console.log(\n `useResizeObserver attemping to observe same element twice`,\n {\n target,\n }\n );\n // throw Error(\n // \"useResizeObserver attemping to observe same element twice\"\n // );\n }\n // TODO set a pending entry on map\n registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, ref]);\n\n useEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n}\n", "import { PopupMenu, PopupMenuProps } from \"@vuu-ui/vuu-popups\";\nimport { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { useId } from \"@vuu-ui/vuu-layout\";\n\nimport cx from \"classnames\";\nimport React, {\n CSSProperties,\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n} from \"react\";\nimport { asReactElements } from \"../utils\";\nimport { OverflowItem } from \"./overflow-utils\";\nimport { useOverflowContainer } from \"./useOverflowContainer\";\n\nimport \"./OverflowContainer.css\";\n\nconst classBase = \"vuuOverflowContainer\";\n\nexport interface OverflowContainerProps extends HTMLAttributes<HTMLDivElement> {\n PopupMenuProps?: Partial<PopupMenuProps>;\n allowDragDrop?: boolean;\n debugId?: string;\n height: number;\n onMoveItem?: (fromIndex: number, toIndex: number) => void;\n onSwitchWrappedItemIntoView?: (overflowItem: OverflowItem) => void;\n orientation?: orientationType;\n overflowIcon?: string;\n overflowPosition?: \"start\" | \"end\" | number;\n}\n\nconst WrapContainer = React.memo(\n ({\n PopupMenuProps,\n allowDragDrop,\n children,\n className: classNameProp,\n height: heightProp,\n id,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation = \"horizontal\",\n overflowIcon,\n overflowPosition = \"end\",\n }: OverflowContainerProps) => {\n const childElements = asReactElements(children);\n const {\n draggable,\n draggedItemIndex,\n menuActionHandler,\n menuBuilder,\n onItemMouseDown,\n rootRef,\n } = useOverflowContainer({\n allowDragDrop,\n itemCount: childElements.length,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation,\n });\n\n const height = orientation === \"vertical\" ? \"100%\" : `${heightProp}px`;\n // TODO measure the height, if not provided\n const style = {\n \"--overflow-container-height\": `${height}`,\n } as CSSProperties;\n\n const className = cx(`${classBase}-wrapContainer`, classNameProp, {\n [`${classBase}-horizontal`]: orientation === \"horizontal\",\n [`${classBase}-vertical`]: orientation === \"vertical\",\n });\n\n const content = childElements.map((childEl, i) => {\n const {\n \"data-align\": align,\n \"data-overflow-priority\": overflowPriority = \"0\",\n id: itemId = `${id}-${i}`,\n label = `Item ${i + 1}`,\n } = childEl.props;\n return (\n <div\n className={cx(`${classBase}-item`, {\n \"vuuDraggable-dragAway\": draggedItemIndex === i,\n })}\n data-index={i}\n data-align={align}\n data-label={label}\n data-overflow-priority={overflowPriority}\n id={`${itemId}-wrapper`}\n key={i}\n onMouseDown={onItemMouseDown}\n >\n {childEl}\n </div>\n );\n });\n\n const overflowIndicator = (\n <div\n className={`${classBase}-OverflowIndicator`}\n data-index=\"overflow\"\n key=\"overflow\"\n >\n <PopupMenu\n {...PopupMenuProps}\n icon={overflowIcon}\n menuBuilder={menuBuilder}\n menuActionHandler={menuActionHandler}\n tabIndex={-1}\n />\n </div>\n );\n\n content.push(overflowIndicator);\n\n return (\n <div className={className} ref={rootRef} style={style}>\n {content}\n {draggable}\n </div>\n );\n }\n);\n\nWrapContainer.displayName = \"OverflowContainer.InnerContainer\";\n\nexport const OverflowContainer = forwardRef(function OverflowContainer(\n {\n PopupMenuProps,\n allowDragDrop = false,\n children,\n className,\n height = 44,\n id: idProp,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation,\n overflowIcon,\n overflowPosition,\n ...htmlAttributes\n }: OverflowContainerProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const id = useId(idProp);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(cx(className, classBase))}\n id={id}\n ref={forwardedRef}\n >\n <WrapContainer\n PopupMenuProps={PopupMenuProps}\n allowDragDrop={allowDragDrop}\n height={height}\n id={id}\n orientation={orientation}\n overflowIcon={overflowIcon}\n overflowPosition={overflowPosition}\n onMoveItem={onMoveItem}\n onSwitchWrappedItemIntoView={onSwitchWrappedItemIntoView}\n >\n {children}\n </WrapContainer>\n </div>\n );\n});\n", "import { MenuActionHandler, MenuBuilder } from \"@vuu-ui/vuu-data-types\";\nimport { useDragDropNext as useDragDrop } from \"@vuu-ui/vuu-ui-controls\";\nimport { isValidNumber, MEASURES } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useLayoutEffectSkipFirst } from \"../utils\";\nimport {\n applyOverflowClassToWrappedItems,\n removeOverflowIndicatorIfNoLongerNeeded,\n correctForWrappedHighPriorityItems,\n getNonWrappedAndWrappedItems,\n NO_WRAPPED_ITEMS,\n highPriorityItemsHaveWrappedButShouldNotHave,\n switchWrappedItemIntoView,\n OverflowItem,\n overflowIndicatorHasWrappedButShouldNotHave,\n correctForWrappedOverflowIndicator,\n} from \"./overflow-utils\";\nimport { OverflowContainerProps } from \"./OverflowContainer\";\n\nexport interface OverflowContainerHookProps\n extends Pick<\n OverflowContainerProps,\n \"allowDragDrop\" | \"onMoveItem\" | \"orientation\"\n > {\n itemCount: number;\n onSwitchWrappedItemIntoView?: (overflowItem: OverflowItem) => void;\n}\n\nexport const useOverflowContainer = ({\n allowDragDrop = false,\n itemCount,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation = \"horizontal\",\n}: OverflowContainerHookProps) => {\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const wrappedItemsRef = useRef<OverflowItem[]>(NO_WRAPPED_ITEMS);\n // Drag drop needs a ref to container\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const setOverflowTabIndex = useCallback((tabIndex: \"0\" | \"-1\") => {\n if (containerRef.current) {\n containerRef.current\n .querySelector(\".vuuOverflowContainer-OverflowIndicator button\")\n ?.setAttribute(\"tabindex\", tabIndex);\n }\n }, []);\n\n const handleResize = useCallback(async () => {\n if (container) {\n let [nonWrapped, wrapped] = getNonWrappedAndWrappedItems(\n container,\n orientation\n );\n applyOverflowClassToWrappedItems(\n container,\n wrapped,\n \"vuuOverflowContainer-wrapContainer\"\n );\n if (overflowIndicatorHasWrappedButShouldNotHave(wrapped)) {\n wrapped = await correctForWrappedOverflowIndicator(container, wrapped);\n }\n while (\n highPriorityItemsHaveWrappedButShouldNotHave(nonWrapped, wrapped)\n ) {\n [nonWrapped, wrapped] = await correctForWrappedHighPriorityItems(\n container,\n nonWrapped,\n wrapped\n );\n }\n if (wrapped.length === 1) {\n if (removeOverflowIndicatorIfNoLongerNeeded(container)) {\n wrapped = NO_WRAPPED_ITEMS;\n }\n }\n\n if (wrappedItemsRef.current.length === 0 && wrapped.length > 0) {\n setOverflowTabIndex(\"0\");\n } else if (wrappedItemsRef.current.length > 0 && wrapped.length === 0) {\n setOverflowTabIndex(\"-1\");\n }\n\n wrappedItemsRef.current = wrapped;\n }\n }, [container, orientation, setOverflowTabIndex]);\n\n const hasOverflowItem = (\n opt: unknown\n ): opt is {\n overflowItem: OverflowItem;\n } => typeof opt === \"object\" && opt !== null && \"overflowItem\" in opt;\n\n const [menuBuilder, menuActionHandler] = useMemo((): [\n MenuBuilder,\n MenuActionHandler\n ] => {\n return [\n () => {\n const { current: menuItems } = wrappedItemsRef;\n return menuItems.map((item: OverflowItem) => {\n return {\n label: item.label,\n action: `activate-item-${item.index}`,\n options: { overflowItem: item },\n };\n });\n },\n // The menu items are our overflowed items, selecting one by default\n // brings it back onto the toolbar - TODO is this right ?\n ({ options }) => {\n if (container && hasOverflowItem(options)) {\n // TODO do we always want to switch it into view - leave that to caller\n const [, wrappedItems] = switchWrappedItemIntoView(\n container,\n options.overflowItem\n );\n wrappedItemsRef.current = wrappedItems;\n onSwitchWrappedItemIntoView?.(options.overflowItem);\n }\n return true;\n },\n ];\n }, [container, onSwitchWrappedItemIntoView]);\n\n const resizeObserver = useMemo(() => {\n const { sizeProp } = MEASURES[orientation];\n let currentSize = 0;\n return new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { [sizeProp]: actualSize } = entry.contentRect;\n // This is important. Sometimes tiny sub-pixel differeces\n // can be reported, which break the layout assumptions\n const size = Math.round(actualSize as number);\n if (isValidNumber(size) && currentSize !== size) {\n currentSize = size;\n handleResize();\n }\n }\n });\n }, [handleResize, orientation]);\n\n useLayoutEffectSkipFirst(() => {\n handleResize();\n }, [handleResize, itemCount]);\n\n useMemo(() => {\n if (container) {\n resizeObserver.observe(container);\n }\n }, [container, resizeObserver]);\n\n const callbackRef = useCallback((el: HTMLDivElement | null) => {\n setContainer((containerRef.current = el));\n }, []);\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n onMoveItem?.(fromIndex, toIndex);\n },\n [onMoveItem]\n );\n\n const { onMouseDown: dragDropHookHandleMouseDown, ...dragDropHook } =\n useDragDrop({\n allowDragDrop,\n containerRef,\n // this is for useDragDropNext\n draggableClassName: `vuuOverflowContainer`,\n // extendedDropZone: overflowedItems.length > 0,\n onDrop: handleDrop,\n orientation: \"horizontal\",\n itemQuery: \".vuuOverflowContainer-item\",\n });\n\n return {\n menuActionHandler,\n menuBuilder,\n onItemMouseDown: dragDropHookHandleMouseDown,\n rootRef: callbackRef,\n ...dragDropHook,\n };\n};\n", "import { getElementByDataIndex, orientationType } from \"@vuu-ui/vuu-utils\";\n\nconst NON_WRAPPED_ITEM = \".vuuOverflowContainer-item:not(.wrapped)\";\n\nexport type OverflowItem = {\n index: string;\n label: string;\n overflowPriority: string;\n};\n\nexport const isOverflowElement = (element: HTMLElement | null) =>\n element !== null &&\n element.dataset.index === \"overflow\" &&\n element.parentElement !== null &&\n element.parentElement.classList.contains(\n \"vuuOverflowContainer-wrapContainer-overflowed\"\n );\n\nexport const sortByScreenOrder = (elements: HTMLElement[]): HTMLElement[] =>\n elements.sort((e1, e2) => {\n const {\n dataset: { index: idx1 = \"?\" },\n } = e1;\n const {\n dataset: { index: idx2 = \"?\" },\n } = e2;\n const isOverflowed1 = e1.classList.contains(\"wrapped\");\n const isOverflowed2 = e2.classList.contains(\"wrapped\");\n const isOverflowedIndicator1 = idx1 === \"overflow\";\n const isOverflowedIndicator2 = idx2 === \"overflow\";\n if (isOverflowed1 && !isOverflowed2) {\n return 1;\n } else if (!isOverflowed1 && isOverflowed2) {\n return -1;\n }\n if (isOverflowedIndicator1) {\n return 1;\n } else if (isOverflowedIndicator2) {\n return -1;\n }\n return parseInt(idx1) > parseInt(idx2) ? 1 : -1;\n });\n\nexport const NO_WRAPPED_ITEMS: OverflowItem[] = [];\n\n/**\n Identify wrapped items by comparing position of each item. Any item\n not to the right of preceeding item has wrapped. Note: on-screen \n position of items does not necessarily match document position, due\n to use of css order. This is taken into account by sorting. \n TODO support Vertical orientation\n */\nexport const getNonWrappedAndWrappedItems = (\n container: HTMLElement,\n orientation: orientationType = \"horizontal\"\n): [OverflowItem[], OverflowItem[]] => {\n const nonWrappedItems: OverflowItem[] = [];\n const wrappedItems: OverflowItem[] = [];\n let currentPosition = -1;\n let overflowed = false;\n const sortedChildren = sortByScreenOrder(\n Array.from(container.children) as HTMLElement[]\n );\n const positionAttribute = orientation === \"vertical\" ? \"top\" : \"left\";\n for (const child of sortedChildren) {\n const element = child as HTMLElement;\n const {\n dataset: { index = \"?\", label = \"?\", overflowPriority = \"0\" },\n } = element;\n const { [positionAttribute]: position } = element.getBoundingClientRect();\n if (position <= currentPosition) {\n if (index === \"overflow\") {\n wrappedItems.push(nonWrappedItems.pop() as OverflowItem);\n } else {\n wrappedItems.push({ index, label, overflowPriority });\n }\n overflowed = true;\n } else if (overflowed) {\n wrappedItems.push({ index, label, overflowPriority });\n } else {\n nonWrappedItems.push({ index, label, overflowPriority });\n }\n currentPosition = position;\n }\n return [nonWrappedItems, wrappedItems];\n};\n\nexport const applyOverflowClassToWrappedItems = (\n container: HTMLElement,\n overflowedItems: OverflowItem[],\n classBase?: string\n) => {\n let ignoreOverflow = false;\n const className = classBase ? `${classBase}-overflowed` : \"overflow\";\n if (overflowedItems.find(({ index }) => index === \"overflow\")) {\n if (overflowedItems.length === 1) {\n ignoreOverflow = true;\n }\n }\n for (const element of container.children) {\n const {\n dataset: { index = \"?\" },\n } = element as HTMLElement;\n if (overflowedItems.length === 0 || ignoreOverflow) {\n container.classList.remove(className);\n } else {\n container.classList.add(className);\n }\n if (\n index !== \"overflow\" &&\n overflowedItems.find((item) => item.index === index)\n ) {\n element.classList.add(\"wrapped\");\n } else {\n element.classList.remove(\"wrapped\");\n }\n }\n};\n\nconst maxPriority = (priority: number, { overflowPriority }: OverflowItem) =>\n Math.max(priority, parseInt(overflowPriority));\n\nconst minPriority = (priority: number, { overflowPriority }: OverflowItem) =>\n Math.min(priority, parseInt(overflowPriority));\n\nexport const overflowIndicatorHasWrappedButShouldNotHave = (\n wrappedItems: OverflowItem[]\n) => wrappedItems.length > 1 && wrappedItems.at(-1)?.index === \"overflow\";\n\nconst getHighestPriorityItem = (overflowItems: OverflowItem[]) => {\n let [highestPriorityItem] = overflowItems;\n for (let i = 1; i < overflowItems.length; i++) {\n const item = overflowItems[i];\n if (\n parseInt(item.overflowPriority) >\n parseInt(highestPriorityItem.overflowPriority)\n ) {\n highestPriorityItem = item;\n }\n }\n return highestPriorityItem;\n};\n\nexport const highPriorityItemsHaveWrappedButShouldNotHave = (\n nonWrappedItems: OverflowItem[],\n wrappedItems: OverflowItem[]\n) => {\n const minNonwrappedPriority = nonWrappedItems.reduce<number>(\n minPriority,\n Number.MAX_SAFE_INTEGER\n );\n const maxwrappedPriority = wrappedItems.reduce<number>(maxPriority, 0);\n if (maxwrappedPriority > minNonwrappedPriority) {\n return true;\n } else {\n return wrappedItems.length > 1 && wrappedItems.at(-1)?.index === \"overflow\";\n }\n};\n\n/** \n An edge case that may occur when reducing width from unwrapped to\n wrapped, or on first render.\n We overflow one or more items. Then, when the overflowIndicator assumes\n full width, it may itself overflow.\n*/\nexport const correctForWrappedOverflowIndicator = (\n container: HTMLElement,\n overflowedItems: OverflowItem[]\n): Promise<OverflowItem[]> =>\n new Promise((resolve) => {\n requestAnimationFrame(() => {\n const [, o2] = getNonWrappedAndWrappedItems(container);\n const newlyOverflowed = getNewItems(overflowedItems, o2);\n newlyOverflowed.forEach((item) => markElementAsWrapped(container, item));\n resolve(o2);\n });\n });\n\n/** \n An edge case that may occur when reducing width from unwrapped to\n wrapped, or on first render.\n We overflow one or more items. Then, when the overflowIndicator assumes\n full width, it may itself overflow.\n*/\nexport const correctForWrappedHighPriorityItems = (\n container: HTMLElement,\n nonWrapped: OverflowItem[],\n wrapped: OverflowItem[]\n): Promise<[OverflowItem[], OverflowItem[]]> =>\n new Promise((resolve) => {\n requestAnimationFrame(() => {\n const [, o2] = getNonWrappedAndWrappedItems(container);\n const highPriorityWrappedItem = getHighestPriorityItem(o2);\n if (highPriorityWrappedItem) {\n const [nonWrappedItems, wrappedItems] = switchWrappedItemIntoView(\n container,\n highPriorityWrappedItem\n );\n resolve([nonWrappedItems, wrappedItems]);\n } else {\n resolve([nonWrapped, wrapped]);\n }\n });\n });\n\nexport const markElementAsWrapped = (\n container: HTMLElement,\n item: OverflowItem\n) => {\n const el = getElementByDataIndex(container, item.index);\n if (el) {\n el.classList.add(\"wrapped\");\n } else {\n throw Error(\n `markElementAsWrapped element item with index ${item.index} not found`\n );\n }\n};\n\nexport const getElementsMarkedAsWrapped = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(\".wrapped\")) as HTMLElement[];\n\nconst getNewItems = (items1: OverflowItem[], items2: OverflowItem[]) => {\n const newItems: OverflowItem[] = [];\n for (const item of items2) {\n if (!items1.find(({ index }) => index === item.index)) {\n newItems.push(item);\n }\n }\n return newItems;\n};\n\nexport const unmarkItemsWhichAreNoLongerWrapped = (\n container: HTMLElement,\n wrappedItems: OverflowItem[]\n) => {\n const elementssMarkedAsWrapped = getElementsMarkedAsWrapped(container);\n elementssMarkedAsWrapped.forEach((el) => {\n const {\n dataset: { index = \"?\" },\n } = el;\n if (!wrappedItems.find((i) => i.index === index)) {\n el.classList.remove(\"wrapped\");\n }\n });\n};\n\nconst getOverflowIndicator = (container: HTMLElement) =>\n container.querySelector('[data-index=\"overflow\"]') as HTMLElement;\nconst getOverflowedItem = (container: HTMLElement) =>\n container.querySelector(\".wrapped\") as HTMLElement;\nconst getElementWidth = (el: HTMLElement) =>\n parseInt(getComputedStyle(el).getPropertyValue(\"width\"));\n\nconst getAvailableSpace = (\n container: HTMLElement,\n overflowIndicator: HTMLElement\n) => {\n const { right: containerRight } = container.getBoundingClientRect();\n const paddingRight = parseInt(\n getComputedStyle(container).getPropertyValue(\"padding-right\")\n );\n const { right: indicatorRight } = overflowIndicator.getBoundingClientRect();\n return containerRight - paddingRight - indicatorRight;\n};\n\n/**\n An edge case. If container has grown but we still have one\n wrapped item - could the wrapped item return to the fold if the overflow\n indicaor were removed ?\n */\nexport const removeOverflowIndicatorIfNoLongerNeeded = (\n container: HTMLElement\n): boolean => {\n const overflowIndicator = getOverflowIndicator(container);\n const availableSpace = getAvailableSpace(container, overflowIndicator);\n const indicatorWidth = getElementWidth(overflowIndicator);\n const overflowedItem = getOverflowedItem(container);\n const overflowWidth = getElementWidth(overflowedItem);\n\n if (overflowWidth <= availableSpace + indicatorWidth) {\n container.classList.remove(\"overflowed\");\n overflowedItem.classList.remove(\"wrapped\");\n return true;\n }\n return false;\n};\n\nconst byPriorityDescending = (h1: Element, h2: Element) => {\n const {\n dataset: { index: i1 = \"0\", overflowPriority: p1 = \"0\" },\n } = h1 as HTMLElement;\n const {\n dataset: { index: i2 = \"0\", overflowPriority: p2 = \"0\" },\n } = h2 as HTMLElement;\n\n if (p1 > p2) {\n return -1;\n } else if (p1 < p2) {\n return 1;\n } else {\n return parseInt(i1) - parseInt(i2);\n }\n};\n\nconst getNonwrappedItemsByPriority = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(NON_WRAPPED_ITEM)).sort(\n byPriorityDescending\n ) as HTMLElement[];\n\n/**\n * This is used both when an overflow menu is used to select an overflowed item\n * and when a high priority item has overflowed, whilst lower priority items\n * remain in view.\n */\nexport const switchWrappedItemIntoView = (\n container: HTMLElement,\n overflowItem: OverflowItem\n): [OverflowItem[], OverflowItem[]] => {\n const unwrappedItems = getNonwrappedItemsByPriority(container);\n const targetElement = getElementByDataIndex(\n container,\n overflowItem.index,\n true\n );\n let pos = -1;\n let unwrappedItem = unwrappedItems.at(pos) as HTMLElement;\n const itemWidth = getElementWidth(unwrappedItem);\n const targetWidth = getElementWidth(targetElement);\n const overflowIndicator = getOverflowIndicator(container);\n let availableSpace =\n getAvailableSpace(container, overflowIndicator) + itemWidth;\n if (availableSpace >= targetWidth) {\n switchWrapOnElements(targetElement, unwrappedItem);\n } else {\n // we need to wrap multiple items to make space for the switched item\n const { left: lastLeft } = unwrappedItem.getBoundingClientRect();\n const baseAvailableSpace = availableSpace;\n const wrapTargets = [unwrappedItem];\n while (availableSpace < targetWidth) {\n pos -= 1;\n unwrappedItem = unwrappedItems.at(pos) as HTMLElement;\n wrapTargets.push(unwrappedItem);\n const { left: nextLeft } = unwrappedItem.getBoundingClientRect();\n const extraSpace = lastLeft - nextLeft;\n availableSpace = baseAvailableSpace + extraSpace;\n }\n\n targetElement?.classList.remove(\"wrapped\");\n wrapTargets.forEach((item) => {\n item.classList.add(\"wrapped\");\n });\n }\n const [nonWrappedItems, wrappedItems] =\n getNonWrappedAndWrappedItems(container);\n unmarkItemsWhichAreNoLongerWrapped(container, wrappedItems);\n return [nonWrappedItems, wrappedItems];\n};\n\nconst switchWrapOnElements = (\n wrappedElement?: HTMLElement | null,\n nonWrappedElement?: HTMLElement\n) => {\n if (!wrappedElement || !nonWrappedElement) {\n throw Error(\"switchWrapOnElements, element undefined\");\n }\n wrappedElement.classList.remove(\"wrapped\");\n nonWrappedElement.classList.add(\"wrapped\");\n};\n", "import { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n List,\n ListItem,\n ListItemProps,\n ListProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"classnames\";\nimport {\n cloneElement,\n HTMLAttributes,\n memo,\n MouseEvent,\n ReactElement,\n} from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { View, ViewProps } from \"../layout-view\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\n\nimport \"./Palette.css\";\n\nconst clonePaletteItem = (paletteItem: HTMLElement) => {\n const dolly = paletteItem.cloneNode(true) as HTMLElement;\n dolly.id = \"\";\n delete dolly.dataset.idx;\n return dolly;\n};\n\nexport interface PaletteItemProps extends ListItemProps {\n children: ReactElement;\n closeable?: boolean;\n header?: boolean;\n idx?: number;\n resize?: \"defer\";\n resizeable?: boolean;\n}\n\nexport const PaletteItem = memo(\n ({\n className,\n children: component,\n idx,\n resizeable,\n header,\n closeable,\n ...props\n }: PaletteItemProps) => {\n return (\n <ListItem\n className={cx(\"vuuPaletteItem\", className)}\n data-draggable\n data-icon=\"draggable\"\n {...props}\n />\n );\n }\n);\n\nPaletteItem.displayName = \"PaletteItem\";\n\nexport interface PaletteProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onDragStart\" | \"onDrop\" | \"onSelect\"\n > {\n ListProps?: Partial<ListProps>;\n ViewProps?: Partial<ViewProps>;\n children: ReactElement[];\n itemHeight?: number;\n orientation: \"horizontal\" | \"vertical\";\n selection?: string;\n}\n\nexport const Palette = ({\n ListProps,\n ViewProps,\n children,\n className,\n itemHeight = 41,\n orientation = \"horizontal\",\n ...props\n}: PaletteProps) => {\n const dispatch = useLayoutProviderDispatch();\n const classBase = \"vuuPalette\";\n\n function handleMouseDown(evt: MouseEvent) {\n const target = evt.target as HTMLElement;\n const listItemElement = target.closest(\".vuuPaletteItem\") as HTMLElement;\n const idx = parseInt(listItemElement.dataset?.index ?? \"-1\");\n const {\n props: { caption, children: payload, template, ...props },\n } = children[idx];\n const { ViewProps: componentViewProps } = payload.props;\n const { height, left, top, width } =\n listItemElement.getBoundingClientRect();\n const id = uuid();\n const identifiers = { id, key: id };\n const component = template ? (\n payload\n ) : (\n <View\n {...ViewProps}\n {...identifiers}\n {...props}\n {...componentViewProps}\n title={props.label}\n >\n {payload}\n </View>\n );\n\n dispatch({\n dragRect: {\n left,\n top,\n right: left + width,\n bottom: top + 150,\n width,\n height,\n },\n dragElement: clonePaletteItem(listItemElement),\n evt: evt.nativeEvent,\n instructions: {\n DoNotRemove: true,\n DoNotTransform: true,\n DriftHomeIfNoDropTarget: true,\n RemoveDraggableOnDragEnd: true,\n dragThreshold: 10,\n },\n path: \"*\",\n payload: component,\n type: \"drag-start\",\n });\n }\n\n return (\n <List\n {...ListProps}\n {...props}\n className={cx(classBase, className, `${classBase}-${orientation}`)}\n itemHeight={itemHeight}\n selected={null}\n >\n {children.map((child, idx) =>\n child.type === PaletteItem\n ? cloneElement(child, {\n key: idx,\n onMouseDown: handleMouseDown,\n })\n : child\n )}\n </List>\n );\n};\n\nregisterComponent(\"Palette\", Palette, \"view\");\n", "import { Tab, Tabstrip, TabstripProps } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"classnames\";\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n ReactNode,\n useCallback,\n useRef,\n} from \"react\";\nimport { getDefaultTabLabel } from \"../layout-reducer\";\nimport { useId } from \"../utils\";\nimport { StackProps } from \"./stackTypes\";\n\nimport \"./Stack.css\";\n\nconst classBase = \"vuuTabs\";\n\nconst getDefaultTabIcon = () => undefined;\n\nconst getChildElements = <T extends ReactElement = ReactElement>(\n children: ReactNode\n): T[] => {\n const elements: T[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n elements.push(child as T);\n } else {\n console.warn(`Stack has unexpected child element type`);\n }\n });\n return elements;\n};\n\nconst DefaultTabstripProps: Partial<TabstripProps> = {\n allowAddTab: false,\n allowCloseTab: false,\n allowRenameTab: false,\n};\n\nexport const Stack = forwardRef(function Stack(\n {\n TabstripProps = DefaultTabstripProps,\n active = 0,\n children,\n className: classNameProp,\n getTabIcon = getDefaultTabIcon,\n getTabLabel = getDefaultTabLabel,\n id: idProp,\n keyBoardActivation = \"manual\",\n // onMouseDown,\n onAddTab,\n onMoveTab,\n onTabClose,\n onTabEdit,\n onTabSelectionChanged,\n showTabs = \"top\",\n style,\n }: StackProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const id = useId(idProp);\n const tabLabels = useRef<string[]>([]);\n const {\n allowCloseTab,\n allowRenameTab,\n className: tabstripClassName,\n } = TabstripProps;\n\n const handleExitEditMode = useCallback(\n (\n _oldText: string,\n newText: string,\n _allowDeactivation: boolean,\n tabIndex: number\n ) => {\n onTabEdit?.(tabIndex, newText);\n },\n [onTabEdit]\n );\n\n const activeChild = () => {\n //TODO need to inject an id if child does not have one, so we can\n // establish the aria-controls relationship. In a Vuu layout, there\n // will always be an id.\n if (React.isValidElement(children)) {\n return children;\n }\n if (Array.isArray(children)) {\n return children[active] ?? null;\n }\n return null;\n };\n\n const renderTabs = () =>\n getChildElements(children).map((child, idx) => {\n const {\n closeable = allowCloseTab,\n id: childId = `${id}-${idx}`,\n \"data-tab-location\": tabLocation,\n } = child.props;\n const label = getTabLabel(child, idx, tabLabels.current);\n tabLabels.current.push(label);\n return (\n <Tab\n ariaControls={childId}\n data-icon={getTabIcon(child, idx)}\n key={childId}\n id={`${childId}-tab`}\n index={idx}\n label={label}\n location={tabLocation}\n closeable={closeable}\n editable={allowRenameTab}\n />\n );\n });\n\n const child = activeChild();\n const isHorizontal = showTabs === \"left\" || showTabs === \"right\";\n const tabstripOrientation = isHorizontal ? \"vertical\" : \"horizontal\";\n\n return (\n <div\n className={cx(classBase, classNameProp, {\n [`${classBase}-horizontal`]: isHorizontal,\n })}\n style={style}\n id={id}\n ref={ref}\n >\n {showTabs ? (\n <Tabstrip\n {...TabstripProps}\n activeTabIndex={\n TabstripProps?.activeTabIndex ?? (child === null ? -1 : active)\n }\n allowDragDrop={TabstripProps.allowDragDrop !== false}\n animateSelectionThumb\n className={cx(\"vuuTabHeader\", tabstripClassName)}\n keyBoardActivation={keyBoardActivation}\n onActiveChange={onTabSelectionChanged}\n onAddTab={onAddTab}\n onCloseTab={onTabClose}\n onExitEditMode={handleExitEditMode}\n onMoveTab={onMoveTab}\n orientation={tabstripOrientation}\n // onMouseDown={handleMouseDown}\n >\n {renderTabs()}\n </Tabstrip>\n ) : null}\n <div\n aria-labelledby={`${id}-${active}`}\n className={`${classBase}-tabPanel`}\n role=\"tabpanel\"\n >\n {child}\n </div>\n </div>\n );\n});\nStack.displayName = \"Stack\";\n", "import { useIdMemo as useId } from \"@salt-ds/core\";\nimport React, { useCallback, useRef } from \"react\";\nimport {\n useLayoutCreateNewChild,\n useLayoutProviderDispatch,\n} from \"../layout-provider\";\nimport { useViewActionDispatcher } from \"../layout-view\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { Stack } from \"./Stack\";\nimport { StackProps, TabLabelFactory } from \"./stackTypes\";\nimport { getDefaultTabLabel } from \"../layout-reducer\";\n\nimport \"./Stack.css\";\nimport { Placeholder } from \"../placeholder\";\n\nconst defaultCreateNewChild = () => (\n <Placeholder\n resizeable\n style={{ flexGrow: 1, flexShrink: 0, flexBasis: 0 }}\n />\n);\n\nexport const StackLayout = (props: StackProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const dispatch = useLayoutProviderDispatch();\n const { loadState } = usePersistentState();\n\n const {\n createNewChild: createNewChildProp,\n id: idProp,\n onTabSelectionChanged,\n path,\n ...restProps\n } = props;\n\n const { children } = props;\n\n const id = useId(idProp);\n\n const [dispatchViewAction] = useViewActionDispatcher(id, ref, path);\n const createNewChildFromContext = useLayoutCreateNewChild();\n const createNewChild =\n createNewChildProp ?? createNewChildFromContext ?? defaultCreateNewChild;\n\n const handleTabSelection = (nextIdx: number) => {\n if (path) {\n dispatch({ type: \"switch-tab\", id, path, nextIdx });\n onTabSelectionChanged?.(nextIdx);\n }\n };\n\n const handleTabClose = useCallback(\n (tabIndex: number) => {\n if (Array.isArray(children)) {\n const {\n props: { \"data-path\": dataPath, path = dataPath },\n } = children[tabIndex];\n dispatch({ type: \"remove\", path });\n }\n },\n [children, dispatch]\n );\n\n const handleTabAdd = useCallback(() => {\n if (path) {\n const tabIndex = React.Children.count(children);\n const component = createNewChild(tabIndex);\n dispatch({\n type: \"add\",\n path,\n component,\n });\n }\n }, [children, createNewChild, dispatch, path]);\n\n const handleMoveTab = useCallback(\n (fromIndex: number, toIndex: number) => {\n if (path) {\n dispatch({\n fromIndex,\n toIndex,\n path,\n type: \"move-child\",\n });\n }\n },\n [dispatch, path]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMouseDown = async (e: any, index: number) => {\n let readyToDrag: undefined | ((value: unknown) => void);\n\n const preDragActivity = async () =>\n new Promise((resolve) => {\n console.log(\"preDragActivity: Ok, gonna release the drag\");\n readyToDrag = resolve;\n });\n\n const dragging = await dispatchViewAction(\n { type: \"mousedown\", index, preDragActivity },\n e\n );\n\n if (dragging) {\n readyToDrag?.(undefined);\n }\n };\n\n const handleTabEdit = (tabIndex: number, text: string) => {\n dispatch({ type: \"set-title\", path: `${path}.${tabIndex}`, title: text });\n };\n\n const getTabLabel: TabLabelFactory = (component, idx, existingLabels) => {\n const { id, title } = component.props;\n return (\n loadState(id, \"view-title\") ||\n title ||\n // This will normally never be called as title is always assigned in layout model\n getDefaultTabLabel(component, idx, existingLabels)\n );\n };\n\n return (\n <Stack\n {...restProps}\n id={id}\n getTabLabel={getTabLabel}\n onMouseDown={handleMouseDown}\n onMoveTab={handleMoveTab}\n onAddTab={handleTabAdd}\n onTabClose={handleTabClose}\n onTabEdit={handleTabEdit}\n onTabSelectionChanged={handleTabSelection}\n ref={ref}\n />\n );\n};\nStackLayout.displayName = \"Stack\";\n\nregisterComponent(\"Stack\", StackLayout, \"container\");\n", "import cx from \"classnames\";\nimport React, { useMemo, useRef } from \"react\";\nimport {\n OverflowContainer,\n OverflowContainerProps,\n} from \"../overflow-container\";\nimport { asReactElements, useId } from \"../utils\";\nimport { useToolbar } from \"./useToolbar\";\nimport {\n forwardCallbackProps,\n SelectionStrategy,\n SpecialKeyMultipleSelection,\n} from \"@vuu-ui/vuu-ui-controls\";\n\nimport \"./Toolbar.css\";\n\nconst classBase = \"vuuToolbar\";\n\nexport type ActiveItemChangeHandler = (itemIndex: number[]) => void;\n\nexport type NavigationOutOfBoundsHandler = (direction: \"start\" | \"end\") => void;\nexport interface ToolbarProps extends OverflowContainerProps {\n activeItemIndex?: number[];\n alignItems?: \"start\" | \"center\" | \"end\";\n defaultActiveItemIndex?: number[];\n onActiveChange?: ActiveItemChangeHandler;\n /**\n * Indicates that user has used Arrow key navigation to move beyond the\n * last or before the first item. A higher level component may want to\n * use this to implement a seamless navigation across components.\n */\n onNavigateOutOfBounds?: NavigationOutOfBoundsHandler;\n selectionStrategy?: SelectionStrategy | SpecialKeyMultipleSelection;\n showSeparators?: boolean;\n}\n\nexport const Toolbar = ({\n activeItemIndex: activeItemIndexProp,\n alignItems = \"start\",\n defaultActiveItemIndex,\n children,\n className,\n id: idProp,\n onActiveChange,\n onNavigateOutOfBounds,\n orientation = \"horizontal\",\n selectionStrategy = \"none\",\n showSeparators = false,\n ...props\n}: ToolbarProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n activeItemIndex,\n focusableIdx,\n focusVisible,\n itemProps,\n ...toolbarHook\n } = useToolbar({\n activeItemIndex: activeItemIndexProp,\n defaultActiveItemIndex,\n containerRef: rootRef,\n onActiveChange,\n onNavigateOutOfBounds,\n orientation,\n selectionStrategy,\n });\n\n const id = useId(idProp);\n\n const items = useMemo(\n () =>\n asReactElements(children).map((child, index) => {\n const {\n id: itemId = `${id}-tab-${index}`,\n className: itemClassName,\n ...ownProps\n } = child.props;\n const selected = activeItemIndex.includes(index);\n return React.cloneElement(child, {\n ...forwardCallbackProps(ownProps, itemProps),\n className: cx(\"vuuToolbarItem\", itemClassName),\n \"data-overflow-priority\": selected ? \"1\" : undefined,\n id: itemId,\n key: index,\n \"aria-selected\": selected,\n tabIndex: focusableIdx === index ? 0 : -1,\n });\n }),\n [activeItemIndex, children, focusableIdx, id, itemProps]\n );\n\n return (\n <OverflowContainer\n {...props}\n {...toolbarHook.containerProps}\n className={cx(className, classBase, `${classBase}-${orientation}`, {\n [`${classBase}-alignCenter`]: alignItems === \"center\",\n [`${classBase}-alignEnd`]: alignItems === \"end\",\n [`${classBase}-withSeparators`]: showSeparators,\n })}\n {...props}\n ref={rootRef}\n >\n {items}\n </OverflowContainer>\n );\n};\n", "import type { OverflowItem, ToolbarProps } from \"@vuu-ui/vuu-layout\";\nimport { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { useSelection } from \"./useSelection\";\n\nexport interface ToolbarHookProps\n extends Pick<\n ToolbarProps,\n | \"activeItemIndex\"\n | \"defaultActiveItemIndex\"\n | \"onActiveChange\"\n | \"onNavigateOutOfBounds\"\n >,\n Required<Pick<ToolbarProps, \"orientation\" | \"selectionStrategy\">> {\n containerRef: RefObject<HTMLElement>;\n itemQuery?: string;\n}\n\nexport const useToolbar = ({\n activeItemIndex: activeItemIndexProp,\n defaultActiveItemIndex,\n containerRef,\n itemQuery = \"vuuToolbarItem\",\n onActiveChange,\n onNavigateOutOfBounds,\n orientation,\n selectionStrategy,\n}: ToolbarHookProps) => {\n const lastSelection = useRef(activeItemIndexProp);\n\n const {\n focusItem: keyboardHookFocusItem,\n highlightedIdx,\n onClick: keyboardHookHandleClick,\n onKeyDown: keyboardHookHandleKeyDown,\n setHighlightedIdx: keyboardHookSetHighlightedIndex,\n ...keyboardHook\n } = useKeyboardNavigation({\n containerRef,\n onNavigateOutOfBounds,\n orientation,\n });\n\n const {\n activateItem: selectionHookActivateItem,\n itemHandlers: { onClick, onKeyDown },\n selected: selectionHookSelected,\n } = useSelection({\n containerRef,\n defaultSelected: defaultActiveItemIndex,\n highlightedIdx,\n itemQuery,\n onSelectionChange: onActiveChange,\n selected: activeItemIndexProp,\n selectionStrategy,\n });\n // We need this on reEntry for navigation hook to handle focus and for dragDropHook\n // to re-apply selection after drag drop. For some reason the value is stale if we\n // directly use selectionHookSelected within the drag, even though all dependencies\n //appear to be correctly declared.\n lastSelection.current = selectionHookSelected;\n\n const handleClick = useCallback(\n (evt: ReactMouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const toolbarItem = target.closest(\"[data-index]\") as HTMLElement;\n if (toolbarItem) {\n const index = parseInt(toolbarItem.dataset.index ?? \"-1\");\n if (index !== -1 && isValidNumber(index)) {\n keyboardHookHandleClick(evt, index);\n onClick?.(evt, index);\n }\n }\n },\n [keyboardHookHandleClick, onClick]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n keyboardHookHandleKeyDown(evt);\n if (!evt.defaultPrevented) {\n onKeyDown?.(evt);\n }\n },\n [keyboardHookHandleKeyDown, onKeyDown]\n );\n\n const onSwitchWrappedItemIntoView = useCallback(\n (item: OverflowItem) => {\n const index = parseInt(item.index);\n if (!isNaN(index)) {\n //TODO need to be able to reset the overflow-priority without selecting the item\n selectionHookActivateItem(index);\n keyboardHookFocusItem(index);\n }\n },\n [keyboardHookFocusItem, selectionHookActivateItem]\n );\n\n const itemProps = {\n onClick: handleClick,\n onFocus: keyboardHook.onFocus,\n onKeyDown: handleKeyDown,\n };\n\n return {\n activeItemIndex: selectionHookSelected,\n focusableIdx: keyboardHook.focusableIdx,\n focusVisible: keyboardHook.focusVisible,\n containerProps: {\n PopupMenuProps: {\n onKeyDown: handleKeyDown,\n onMenuClose: keyboardHook.onOverflowMenuClose,\n },\n ...keyboardHook.containerProps,\n onSwitchWrappedItemIntoView,\n },\n itemProps,\n };\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport {\n dispatchMouseEvent,\n getClosest,\n getElementDataIndex,\n getFocusableElement,\n orientationType,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n FocusEventHandler,\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n ArrowRight,\n Home,\n End,\n} from \"@vuu-ui/vuu-utils\";\nimport { getIndexOfEditedItem } from \"./toolbar-dom-utils\";\nimport { NavigationOutOfBoundsHandler } from \"./Toolbar\";\nimport { PopupCloseCallback } from \"@vuu-ui/vuu-popups\";\n\ntype directionType = \"bwd\" | \"fwd\" | \"start\" | \"end\";\ntype directionMap = { [key: string]: directionType };\nconst navigation = {\n horizontal: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowLeft]: \"bwd\",\n [ArrowRight]: \"fwd\",\n } as directionMap,\n vertical: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowUp]: \"bwd\",\n [ArrowDown]: \"fwd\",\n } as directionMap,\n};\n\nconst isOverflowIndicator = (el: HTMLElement | null) =>\n el !== null && el.dataset.index === \"overflow\";\n\nconst itemIsNotFocusable = (\n container: HTMLElement | null,\n direction: \"bwd\" | \"fwd\",\n indexCount: number,\n nextIdx: number,\n hasOverflowedItem: boolean\n) => {\n if (container) {\n const withinRangeBwd = direction === \"bwd\" && nextIdx > 0;\n const withinRangeFwd = direction === \"fwd\" && nextIdx < indexCount;\n const withinRange = withinRangeBwd || withinRangeFwd;\n const nextElement = getElementByPosition(container, nextIdx, true);\n const isOverflowedItem =\n hasOverflowedItem && !isNonWrappedElement(nextElement);\n const isHiddenOverflowIndicator =\n !hasOverflowedItem && isOverflowIndicator(nextElement);\n hasOverflowedItem && !isNonWrappedElement(nextElement);\n return withinRange && (isOverflowedItem || isHiddenOverflowIndicator);\n } else {\n return false;\n }\n};\n\nconst isNavigationKey = (\n key: string,\n orientation: orientationType = \"horizontal\"\n) => navigation[orientation][key] !== undefined;\n\nconst isMenuActivationKey = (key: string) => key === ArrowDown;\n\nfunction nextItemIdx(count: number, direction: directionType, idx: number) {\n if (direction === \"start\") {\n return 0;\n } else if (direction === \"end\") {\n return count - 1;\n } else if (direction === \"bwd\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n\nconst isNonWrappedElement = (element: HTMLElement | null) =>\n element !== null && !element.classList.contains(\"wrapped\");\n\nconst getToolbarItems = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(\"[data-index]\")) as HTMLElement[];\n\nconst getIndexOfOverflowItem = (container: HTMLElement | null) => {\n if (container === null) {\n return -1;\n } else {\n const targets = getToolbarItems(container);\n const indexValues = targets.map((el) => el.dataset.index);\n return indexValues.indexOf(\"overflow\");\n }\n};\n\n// Get an OverflowItem based on data-index\nconst getElementByPosition = (\n container: HTMLElement | null,\n index: number,\n includeOverflowInd = false\n) => {\n if (container !== null) {\n const targets = getToolbarItems(container);\n const target = targets[index];\n if (!includeOverflowInd && isOverflowIndicator(target)) {\n return null;\n } else {\n return target;\n }\n }\n return null;\n};\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface ToolbarNavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n onNavigateOutOfBounds?: NavigationOutOfBoundsHandler;\n orientation: orientationType;\n}\n\ninterface ToolbarNavigationHookResult {\n containerProps: ContainerNavigationProps;\n focusableIdx: number;\n highlightedIdx: number;\n focusItem: (\n itemIndex: number,\n immediateFocus?: boolean,\n withKeyboard?: boolean,\n delay?: number\n ) => void;\n focusVisible: number;\n focusIsWithinComponent: boolean;\n onClick: (evt: ReactMouseEvent, tabIndex: number) => void;\n onFocus: (evt: FocusEvent<HTMLElement>) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onOverflowMenuClose?: PopupCloseCallback;\n setHighlightedIdx: (highlightedIndex: number) => void;\n}\n\nexport const useKeyboardNavigation = ({\n containerRef,\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n onNavigateOutOfBounds,\n orientation,\n}: ToolbarNavigationHookProps): ToolbarNavigationHookResult => {\n const mouseClickPending = useRef(false);\n /** tracks the highlighted index */\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\n const [highlightedIdx, _setHighlightedIdx] = useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIdx = useCallback(\n (value: number) => {\n _setHighlightedIdx((focusedRef.current = value));\n },\n [_setHighlightedIdx]\n );\n\n const keyboardNavigation = useRef(false);\n\n const focusItem = useCallback(\n (\n itemIndex: number,\n immediateFocus = false,\n withKeyboard?: boolean,\n delay = 70\n ) => {\n // The timeout is important in two scenarios:\n // 1) where tab has overflowed and is being selected from overflow menu.\n // We must not focus it until the overflow mechanism + render has restored\n // it to the main display.\n // 2) when we are focussing a new tab\n // We MUST NOT delay focus when using keyboard nav, else when focus moves from\n // close button (focus ring styled by :focus-visible) to Tab label (focus ring\n // styled by css class) focus style will briefly linger on both.\n console.log(`focus item ${itemIndex}`);\n setHighlightedIdx(itemIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const element = getElementByPosition(\n containerRef.current,\n itemIndex,\n true\n );\n if (element) {\n const focussableElement = getFocusableElement(element);\n focussableElement?.focus();\n }\n };\n if (immediateFocus) {\n setFocus();\n } else {\n setTimeout(setFocus, delay);\n }\n },\n [containerRef, setHighlightedIdx]\n );\n\n const onFocus = (e: FocusEvent<HTMLElement>) => {\n // If focus is received by keyboard navigation, item with tabindex 0 will receive\n // focus. If the item receiving focus has tabindex -1, then focus has been set\n // programatically. We must respect this and not reset focus to selected tab.\n if (focusedRef.current === -1) {\n // Focus is entering tabstrip. Assume keyboard - if it'a actually mouse-driven,\n // the click event will have set correct value.\n if (e.target.tabIndex === 0) {\n // we are tabbing into the focusable item, by default the first\n // align highlighted index\n const index = getElementDataIndex(getClosest(e.target, \"index\"));\n setHighlightedIdx(index);\n } else if (e.target.tabIndex === -1) {\n // Do nothing, assume focus is being passed back to button by closing dialog. Might need\n // to revisit this and add code here if we may get focus set programatically in other ways.\n } else {\n const index = getIndexOfEditedItem(containerRef.current);\n if (index !== -1) {\n requestAnimationFrame(() => {\n setHighlightedIdx(index);\n });\n }\n }\n }\n };\n\n const getIndexCount = useCallback(\n () => containerRef.current?.querySelectorAll(`[data-index]`).length ?? 0,\n [containerRef]\n );\n\n const nextFocusableItemIdx = useCallback(\n (direction: directionType = \"fwd\", idx?: number) => {\n const indexCount = getIndexCount();\n const index = typeof idx === \"number\" ? idx : indexCount;\n\n let nextIdx = nextItemIdx(indexCount, direction, index);\n const nextDirection =\n direction === \"start\" ? \"fwd\" : direction === \"end\" ? \"bwd\" : direction;\n\n const hasOverflowedItem =\n containerRef.current?.querySelector(\n \".vuuOverflowContainer-wrapContainer-overflowed\"\n ) != null;\n\n while (\n itemIsNotFocusable(\n containerRef.current,\n nextDirection,\n indexCount,\n nextIdx,\n hasOverflowedItem\n )\n ) {\n const newIdx = nextItemIdx(indexCount, nextDirection, nextIdx);\n if (newIdx === nextIdx) {\n // theres no further index and nextIndex is not focusable\n // so there are no further focusable items\n return index;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [containerRef, getIndexCount]\n );\n\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n console.log(`highlightedIdx = ${highlightedIdx}, nextIdx = ${nextIdx} `);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n focusItem(nextIdx, immediateFocus);\n } else {\n onNavigateOutOfBounds?.(direction === \"bwd\" ? \"start\" : \"end\");\n }\n },\n [\n orientation,\n nextFocusableItemIdx,\n highlightedIdx,\n focusItem,\n onNavigateOutOfBounds,\n ]\n );\n\n const highlightedItemHasMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n if (el) {\n return el.querySelector(\".vuuPopupMenu\") != null;\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const highlightedItemInEditState = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n if (el) {\n return el.querySelector(\".vuuEditableLabel-input\") != null;\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const activateItemMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n const menuEl = el?.querySelector(\".vuuPopupMenu\") as HTMLElement;\n if (menuEl) {\n dispatchMouseEvent(menuEl, \"click\");\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (getIndexCount() > 0 && isNavigationKey(e.key, orientation)) {\n e.preventDefault();\n if (keyboardNavigation.current) {\n navigateChildItems(e);\n } else {\n keyboardNavigation.current = true;\n navigateChildItems(e);\n }\n } else if (\n isMenuActivationKey(e.key) &&\n highlightedItemHasMenu() &&\n !highlightedItemInEditState()\n ) {\n activateItemMenu();\n }\n },\n [\n activateItemMenu,\n getIndexCount,\n highlightedItemHasMenu,\n highlightedItemInEditState,\n navigateChildItems,\n orientation,\n ]\n );\n\n // TODO, in common hooks, we use mouse movement to track current highlighted\n // index, rather than rely on component item reporting it\n const handleItemClick = (_: ReactMouseEvent, itemIndex: number) => {\n setHighlightedIdx(itemIndex);\n };\n\n const handleFocus = useCallback(() => {\n if (!hasFocus) {\n setHasFocus(true);\n if (!mouseClickPending.current) {\n keyboardNavigation.current = true;\n } else {\n mouseClickPending.current = false;\n }\n }\n }, [hasFocus]);\n\n const handleContainerMouseDown = useCallback(() => {\n if (!hasFocus) {\n mouseClickPending.current = true;\n }\n keyboardNavigation.current = false;\n }, [hasFocus]);\n\n const handleOverflowMenuClose = useCallback<PopupCloseCallback>(\n (closeReason) => {\n if (closeReason?.type === \"escape\") {\n const index = getIndexOfOverflowItem(containerRef.current);\n if (index !== -1) {\n focusItem(index);\n }\n }\n },\n [containerRef, focusItem]\n );\n\n const containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".vuuToolbar\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n setHighlightedIdx(-1);\n setHasFocus(false);\n }\n },\n onMouseDownCapture: handleContainerMouseDown,\n onFocus: handleFocus,\n onMouseLeave: () => {\n keyboardNavigation.current = true;\n setHighlightedIdx(-1);\n mouseClickPending.current = false;\n },\n };\n\n return {\n containerProps,\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n focusIsWithinComponent: hasFocus,\n highlightedIdx,\n focusableIdx: 0,\n focusItem,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n onOverflowMenuClose: handleOverflowMenuClose,\n setHighlightedIdx,\n };\n};\n", "import { getElementDataIndex } from \"@vuu-ui/vuu-utils\";\n\nexport const getIndexOfItem = (\n container: HTMLElement | null,\n query: string\n) => {\n if (container) {\n const targetTab = container.querySelector(\n `[data-index]:has(${query})`\n ) as HTMLElement;\n return getElementDataIndex(targetTab);\n }\n return -1;\n};\n\nexport const getIndexOfSelectedTab = (container: HTMLElement | null) =>\n getIndexOfItem(container, '[aria-selected=\"true\"]');\n\nexport const getIndexOfEditedItem = (container: HTMLElement | null) =>\n getIndexOfItem(container, \".vuuEditableLabel-editing\");\n", "import { isSelectableElement, getClosestIndexItem } from \"@vuu-ui/vuu-utils\";\nimport {\n allowMultipleSelection,\n deselectionIsAllowed,\n selectionIsDisallowed,\n SelectionStrategy,\n SpecialKeyMultipleSelection,\n useControlled,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { KeyboardEvent, MouseEvent, RefObject, useCallback } from \"react\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport interface SelectionHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultSelected?: number[];\n highlightedIdx: number;\n itemQuery: string;\n onSelectionChange?: (selectedIndices: number[]) => void;\n selected?: number[];\n selectionStrategy: SelectionStrategy | SpecialKeyMultipleSelection;\n}\n\nexport interface ItemHandlers {\n onClick?: (e: MouseEvent, itemIndex: number) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n}\n\nconst NO_SELECTION_HANDLERS: ItemHandlers = {};\n\nexport interface SelectionHookResult {\n activateItem: (tabIndex: number) => void;\n itemHandlers: ItemHandlers;\n isControlled: boolean;\n selected: number[];\n}\n\n// TODO use SelectionProps\nexport const useSelection = ({\n containerRef,\n defaultSelected,\n highlightedIdx,\n itemQuery,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n}: SelectionHookProps): SelectionHookResult => {\n const [selected, setSelected, isControlled] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"useSelection\",\n state: \"selected\",\n });\n\n // const isSelectableElement = useMemo(\n // () =>\n // (el: HTMLElement): boolean =>\n // el && el.matches(`[class*=\"${itemQuery} \"]`),\n // [itemQuery]\n // );\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => defaultSelectionKeys.includes(evt.key),\n []\n );\n\n const selectItem = useCallback(\n (itemIndex: number, specialKey = false) => {\n const newSelected = allowMultipleSelection(selectionStrategy, specialKey)\n ? selected.concat(itemIndex)\n : [itemIndex];\n\n setSelected(newSelected);\n onSelectionChange?.(newSelected);\n },\n [onSelectionChange, selected, selectionStrategy, setSelected]\n );\n\n const deselectItem = useCallback(\n (itemIndex: number, specialKey = false) => {\n const newSelected =\n selectionStrategy === \"deselectable\" ||\n (selectionStrategy === \"multiple-special-key\" && !specialKey)\n ? []\n : selected.filter((index) => index !== itemIndex);\n setSelected(newSelected);\n onSelectionChange?.(newSelected);\n },\n [onSelectionChange, selected, selectionStrategy, setSelected]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isSelectionEvent(e) && isSelectableElement(e.target as HTMLElement)) {\n if (!selected.includes(highlightedIdx)) {\n e.stopPropagation();\n e.preventDefault();\n selectItem(highlightedIdx, e.shiftKey);\n } else if (deselectionIsAllowed(selectionStrategy)) {\n e.stopPropagation();\n e.preventDefault();\n deselectItem(highlightedIdx, e.shiftKey);\n }\n }\n },\n [\n isSelectionEvent,\n selected,\n highlightedIdx,\n selectionStrategy,\n selectItem,\n deselectItem,\n ]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, itemIndex: number) => {\n const element = getClosestIndexItem(e.target as HTMLElement);\n if (isSelectableElement(element)) {\n if (!selected.includes(itemIndex)) {\n selectItem(itemIndex, e.shiftKey);\n } else if (deselectionIsAllowed(selectionStrategy)) {\n deselectItem(itemIndex, e.shiftKey);\n }\n }\n },\n [deselectItem, selectItem, selected, selectionStrategy]\n );\n\n const itemHandlers = selectionIsDisallowed(selectionStrategy)\n ? NO_SELECTION_HANDLERS\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n };\n\n return {\n activateItem: selectItem,\n itemHandlers,\n isControlled,\n selected,\n };\n};\n", "import React, { useState } from \"react\";\n\nimport { LayoutConfigurator, LayoutTreeViewer } from \"..\";\nimport { followPathToComponent } from \"../..\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const ConfigWrapper = ({ children }: any) => {\n const designMode = false;\n const [layout, setLayout] = useState(children);\n const [selectedComponent, setSelectedComponent] = useState(children);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleSelection = (selectedPath: any) => {\n const targetComponent = followPathToComponent(layout, selectedPath);\n setSelectedComponent(targetComponent);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleChange = (property: any, value: any) => {\n console.log(`change ${property} -> ${value}`);\n\n const newComponent = React.cloneElement(selectedComponent, {\n style: {\n ...selectedComponent.props.style,\n [property]: value,\n },\n });\n setSelectedComponent(newComponent);\n setLayout(React.cloneElement(layout, {}, newComponent));\n };\n\n return (\n <div data-design-mode={`${designMode}`}>\n {layout}\n <br />\n <div style={{ display: \"flex\" }}>\n <LayoutConfigurator\n height={300}\n managedStyle={selectedComponent.props.style}\n width={300}\n onChange={handleChange}\n style={undefined}\n />\n <LayoutTreeViewer\n layout={layout}\n onSelect={handleSelection}\n style={{ width: 300, height: 300, backgroundColor: \"#ccc\" }}\n />\n </div>\n {/* <StateButton\n defaultChecked={false}\n onChange={(e, value) => setDesignMode(value)}>Design Mode</StateButton> */}\n </div>\n );\n};\n", "import \"./layout-configurator.css\";\nimport { FormField, Input } from \"@salt-ds/core\";\n\nconst NO_STYLE = {};\n\nconst DIMENSIONS = {\n margin: {\n top: \"marginTop\",\n right: \"marginRight\",\n bottom: \"marginBottom\",\n left: \"marginLeft\",\n },\n border: {\n top: \"borderTopWidth\",\n right: \"borderRightWidth\",\n bottom: \"borderBottomWidth\",\n left: \"borderLeftWidth\",\n },\n padding: {\n top: \"paddingTop\",\n right: \"paddingRight\",\n bottom: \"paddingBottom\",\n left: \"paddingLeft\",\n },\n};\n\nconst LayoutBox = ({ feature, children, style, onChange }) => {\n return (\n <div className={`LayoutBox layout-${feature} layout-outer`}>\n <div className={`layout-top`}>\n <span className=\"layout-title\">{feature}</span>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.top}\n onChange={(evt, value) => onChange(feature, \"top\", value)}\n />\n </FormField>\n </div>\n <div className={`layout-inner`}>\n <div className={`layout-left`}>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.left}\n onChange={(evt, value) => onChange(feature, \"left\", value)}\n />\n </FormField>\n </div>\n {children}\n <div className={`layout-right`}>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.right}\n onChange={(evt, value) => onChange(feature, \"right\", value)}\n />\n </FormField>\n </div>\n </div>\n <div className={`layout-bottom`}>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.bottom}\n onChange={(evt, value) => onChange(feature, \"bottom\", value)}\n />\n </FormField>\n </div>\n </div>\n );\n};\n\nexport const MARGIN_STYLES = {\n margin: true,\n marginTop: true,\n marginRight: true,\n marginBottom: true,\n marginLeft: true,\n};\n\nexport const PADDING_STYLES = {\n padding: true,\n paddingTop: true,\n paddingRight: true,\n paddingBottom: true,\n paddingLeft: true,\n};\n\nexport const BORDER_STYLES = {\n border: true,\n borderColor: true,\n borderWidth: true,\n borderTopWidth: true,\n borderRightWidth: true,\n borderBottomWidth: true,\n borderLeftWidth: true,\n};\n\nconst CSS_DIGIT = \"(\\\\d+)(?:px)?\";\nconst CSS_MEASURE = `^(?:${CSS_DIGIT}(?:\\\\s${CSS_DIGIT}(?:\\\\s${CSS_DIGIT}(?:\\\\s${CSS_DIGIT})?)?)?)$`;\nconst CSS_REX = new RegExp(CSS_MEASURE);\nconst BORDER_REX = /^(?:(\\d+)(?:px)\\ssolid\\s([a-zA-Z,0-9().]+))$/;\n\nexport const LayoutConfigurator = ({\n height,\n managedStyle,\n onChange,\n style,\n width,\n}) => {\n const state = normalizeStyle(managedStyle);\n\n const handleChange = (feature, dimension, strValue) => {\n const value = parseInt(strValue || \"0\", 10);\n const property = DIMENSIONS[feature][dimension];\n onChange(property, value);\n };\n\n const {\n marginTop: mt = 0,\n marginRight: mr = 0,\n marginBottom: mb = 0,\n marginLeft: ml = 0,\n } = state;\n const {\n borderTopWidth: bt = 0,\n borderRightWidth: br = 0,\n borderBottomWidth: bb = 0,\n borderLeftWidth: bl = 0,\n } = state;\n const {\n paddingTop: pt = 0,\n paddingRight: pr = 0,\n paddingBottom: pb = 0,\n paddingLeft: pl = 0,\n } = state;\n return (\n <div className=\"LayoutConfigurator\" style={{ width, height, ...style }}>\n <LayoutBox\n feature=\"margin\"\n style={{ top: mt, right: mr, bottom: mb, left: ml }}\n onChange={handleChange}\n >\n <LayoutBox\n feature=\"border\"\n style={{ top: bt, right: br, bottom: bb, left: bl }}\n onChange={handleChange}\n >\n <LayoutBox\n feature=\"padding\"\n style={{ top: pt, right: pr, bottom: pb, left: pl }}\n onChange={handleChange}\n >\n <div className=\"layout-content\" />\n </LayoutBox>\n </LayoutBox>\n </LayoutBox>\n </div>\n );\n};\n\n// TODO merge the following two functions\nexport function XXXnormalizeStyles(\n layoutStyle = NO_STYLE,\n visualStyle = NO_STYLE\n) {\n const {\n margin,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n padding,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n ...style\n } = layoutStyle;\n\n if (typeof margin === \"number\") {\n style.marginTop =\n style.marginRight =\n style.marginBottom =\n style.marginLeft =\n margin;\n } else if (typeof margin === \"string\") {\n const match = CSS_REX.exec(margin);\n if (match === null) {\n console.error(`Invalid css value for margin '${margin}'`);\n } else {\n const [, pos1, pos2, pos3, pos4] = match;\n const pos123 = pos1 && pos2 && pos3;\n if (pos123 && pos4) {\n style.marginTop = parseInt(pos1, 10);\n style.marginRight = parseInt(pos2, 10);\n style.marginBottom = parseInt(pos3, 10);\n style.marginLeft = parseInt(pos4, 10);\n } else if (pos123) {\n style.marginTop = parseInt(pos1, 10);\n style.marginRight = style.marginLeft = parseInt(pos2, 10);\n style.marginBottom = parseInt(pos3, 10);\n } else if (pos1 && pos2) {\n style.marginTop = style.marginBottom = parseInt(pos1, 10);\n style.marginRight = style.marginLeft = parseInt(pos2, 10);\n } else {\n style.marginTop =\n style.marginRight =\n style.marginBottom =\n style.marginLeft =\n parseInt(pos1, 10);\n }\n }\n }\n if (typeof marginTop === \"number\") style.marginTop = marginTop;\n if (typeof marginRight === \"number\") style.marginRight = marginRight;\n if (typeof marginBottom === \"number\") style.marginBottom = marginBottom;\n if (typeof marginLeft === \"number\") style.marginLeft = marginLeft;\n\n if (typeof padding === \"number\") {\n style.paddingTop =\n style.paddingRight =\n style.paddingBottom =\n style.paddingLeft =\n padding;\n } else if (typeof padding === \"string\") {\n const match = CSS_REX.exec(padding);\n if (match === null) {\n console.error(`Invalid css value for padding '${padding}'`);\n } else {\n const [, pos1, pos2, pos3, pos4] = match;\n const pos123 = pos1 && pos2 && pos3;\n if (pos123 && pos4) {\n style.paddingTop = parseInt(pos1, 10);\n style.paddingRight = parseInt(pos2, 10);\n style.paddingBottom = parseInt(pos3, 10);\n style.paddingLeft = parseInt(pos4, 10);\n } else if (pos123) {\n style.paddingTop = parseInt(pos1, 10);\n style.paddingRight = style.paddingLeft = parseInt(pos2, 10);\n style.paddingBottom = parseInt(pos3, 10);\n } else if (pos1 && pos2) {\n style.paddingTop = style.paddingBottom = parseInt(pos1, 10);\n style.paddingRight = style.paddingLeft = parseInt(pos2, 10);\n } else {\n style.paddingTop =\n style.paddingRight =\n style.paddingBottom =\n style.paddinggLeft =\n parseInt(pos1, 10);\n }\n }\n }\n if (typeof paddingTop === \"number\") style.paddingTop = paddingTop;\n if (typeof paddingRight === \"number\") style.paddingRight = paddingRight;\n if (typeof paddingBottom === \"number\") style.paddingBottom = paddingBottom;\n if (typeof paddingLeft === \"number\") style.paddingLeft = paddingLeft;\n\n return normalizeStyle(style, visualStyle);\n}\n\nfunction normalizeStyle(managedStyle = NO_STYLE) {\n const style = { ...managedStyle };\n\n // if (BORDER_LIST.some(bs => style[bs])) {\n let match;\n\n let {\n border,\n borderWidth,\n borderTopWidth,\n borderRightWidth,\n borderBottomWidth,\n borderLeftWidth,\n borderColor,\n margin,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n padding,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n ...rest\n } = style;\n\n let marginStyles = {};\n let paddingStyles = {};\n\n if (typeof margin === \"number\") {\n style.marginTop =\n style.marginRight =\n style.marginBottom =\n style.marginLeft =\n margin;\n marginStyles = {\n marginTop: margin,\n marginRight: margin,\n marginBottom: margin,\n marginLeft: margin,\n };\n }\n\n if (typeof padding === \"number\") {\n style.paddingTop =\n style.paddingRight =\n style.paddingBottom =\n style.paddingLeft =\n padding;\n paddingStyles = {\n paddingTop: padding,\n paddingRight: padding,\n paddingBottom: padding,\n paddingLeft: padding,\n };\n }\n\n if (\n border ||\n borderWidth ||\n borderTopWidth ||\n borderRightWidth ||\n borderBottomWidth ||\n borderLeftWidth\n ) {\n if (typeof border === \"string\" && (match = BORDER_REX.exec(border))) {\n // what if both border and borderWidth are specified ?\n [, borderWidth, borderColor] = match;\n borderWidth = parseInt(borderWidth, 10);\n }\n\n if (borderWidth) {\n borderTopWidth =\n borderTopWidth === undefined ? borderWidth : borderTopWidth;\n borderRightWidth =\n borderRightWidth === undefined ? borderWidth : borderRightWidth;\n borderBottomWidth =\n borderBottomWidth === undefined ? borderWidth : borderBottomWidth;\n borderLeftWidth =\n borderLeftWidth === undefined ? borderWidth : borderLeftWidth;\n }\n\n borderColor = borderColor || \"black\";\n const boxShadow = `\n ${borderColor} ${borderLeftWidth || 0}px ${\n borderTopWidth || 0\n }px 0 0 inset,\n ${borderColor} ${-borderRightWidth || 0}px ${\n -borderBottomWidth || 0\n }px 0 0 inset`;\n\n return {\n ...rest,\n ...marginStyles,\n ...paddingStyles,\n borderTopWidth,\n borderRightWidth,\n borderBottomWidth,\n borderLeftWidth,\n borderColor,\n borderStyle: \"solid\",\n boxShadow,\n };\n } else {\n return style;\n }\n // } else {\n // return style;\n // }\n}\n", "import React from \"react\";\nimport cx from \"classnames\";\nimport { typeOf } from \"../../utils\";\n\nimport \"./layout-tree-viewer.css\";\nimport { Tree } from \"@vuu-ui/vuu-ui-controls\";\n\nconst classBaseTree = \"hwLayoutTreeViewer\";\n\nconst toTreeJson = (component, path = \"0\") => {\n return {\n label: typeOf(component),\n path,\n childNodes: React.Children.map(component.props.children, (child, i) =>\n toTreeJson(child, path ? `${path}.${i}` : `${i}`)\n ),\n };\n};\n\nexport const LayoutTreeViewer = ({ layout, onSelect, style }) => {\n const treeJson = [toTreeJson(layout)];\n\n const handleSelection = (evt, [{ path }]) => {\n onSelect(path);\n };\n\n return (\n <div className={cx(classBaseTree)} style={style}>\n <Tree\n source={treeJson}\n groupSelection=\"single\"\n onSelectionChange={handleSelection}\n />\n </div>\n );\n};\n"],
|
|
5
|
-
"mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../../packages/vuu-layout/src/index.ts", "../../../packages/vuu-layout/src/dock-layout/DockLayout.tsx", "../../../packages/vuu-layout/src/registry/ComponentRegistry.ts", "../../../packages/vuu-layout/src/dock-layout/Drawer.tsx", "../../../packages/vuu-layout/src/Component.tsx", "../../../packages/vuu-layout/src/utils/pathUtils.ts", "../../../packages/vuu-layout/src/utils/propUtils.ts", "../../../packages/vuu-layout/src/utils/typeOf.ts", "../../../packages/vuu-layout/src/utils/refUtils.ts", "../../../packages/vuu-layout/src/utils/react-utils.ts", "../../../packages/vuu-layout/src/utils/styleUtils.ts", "../../../packages/vuu-layout/src/drag-drop/BoxModel.ts", "../../../packages/vuu-layout/src/drag-drop/DragState.ts", "../../../packages/vuu-layout/src/drag-drop/DropTarget.ts", "../../../packages/vuu-layout/src/drag-drop/DropTargetRenderer.tsx", "../../../packages/vuu-layout/src/drag-drop/DropMenu.tsx", "../../../packages/vuu-layout/src/drag-drop/Draggable.ts", "../../../packages/vuu-layout/src/DraggableLayout.tsx", "../../../packages/vuu-layout/src/flexbox/Flexbox.tsx", "../../../packages/vuu-layout/src/flexbox/useSplitterResizing.ts", "../../../packages/vuu-layout/src/placeholder/Placeholder.tsx", "../../../packages/vuu-layout/src/placeholder/LayoutStartPanel.tsx", "../../../packages/vuu-layout/src/layout-view/useViewActionDispatcher.ts", "../../../packages/vuu-layout/src/layout-provider/LayoutProvider.tsx", "../../../packages/vuu-layout/src/layout-reducer/flexUtils.ts", "../../../packages/vuu-layout/src/layout-reducer/layout-reducer.ts", "../../../packages/vuu-layout/src/layout-reducer/insert-layout-element.ts", "../../../packages/vuu-layout/src/layout-reducer/layoutUtils.ts", "../../../packages/vuu-layout/src/use-persistent-state.ts", "../../../packages/vuu-layout/src/layout-reducer/move-layout-element.ts", "../../../packages/vuu-layout/src/layout-reducer/replace-layout-element.ts", "../../../packages/vuu-layout/src/layout-action.ts", "../../../packages/vuu-layout/src/layout-reducer/layoutTypes.ts", "../../../packages/vuu-layout/src/layout-reducer/remove-layout-element.ts", "../../../packages/vuu-layout/src/layout-reducer/resize-flex-children.ts", "../../../packages/vuu-layout/src/layout-reducer/wrap-layout-element.ts", "../../../packages/vuu-layout/src/layout-provider/LayoutProviderContext.ts", "../../../packages/vuu-layout/src/layout-provider/useLayoutDragDrop.ts", "../../../packages/vuu-layout/src/layout-view/View.tsx", "../../../packages/vuu-layout/src/layout-header/Header.tsx", "../../../packages/vuu-layout/src/layout-view/useView.tsx", "../../../packages/vuu-layout/src/responsive/use-breakpoints.ts", "../../../packages/vuu-layout/src/responsive/useResizeObserver.ts", "../../../packages/vuu-layout/src/responsive/breakpoints.ts", "../../../packages/vuu-layout/src/responsive/utils.ts", "../../../packages/vuu-layout/src/layout-view/useViewResize.ts", "../../../packages/vuu-layout/src/layout-view/ViewContext.ts", "../../../packages/vuu-layout/src/flexbox/Splitter.tsx", "../../../packages/vuu-layout/src/flexbox/flexbox-utils.ts", "../../../packages/vuu-layout/src/flexbox/FlexboxLayout.tsx", "../../../packages/vuu-layout/src/flexbox/FluidGrid.tsx", "../../../packages/vuu-layout/src/flexbox/useResponsiveSizing.ts", "../../../packages/vuu-layout/src/flexbox/FluidGridLayout.tsx", "../../../packages/vuu-layout/src/measured-container/MeasuredContainer.tsx", "../../../packages/vuu-layout/src/measured-container/useMeasuredContainer.ts", "../../../packages/vuu-layout/src/measured-container/useResizeObserver.ts", "../../../packages/vuu-layout/src/overflow-container/OverflowContainer.tsx", "../../../packages/vuu-layout/src/overflow-container/useOverflowContainer.ts", "../../../packages/vuu-layout/src/overflow-container/overflow-utils.ts", "../../../packages/vuu-layout/src/palette/Palette.tsx", "../../../packages/vuu-layout/src/stack/Stack.tsx", "../../../packages/vuu-layout/src/stack/StackLayout.tsx", "../../../packages/vuu-layout/src/toolbar/Toolbar.tsx", "../../../packages/vuu-layout/src/toolbar/useToolbar.ts", "../../../packages/vuu-layout/src/toolbar/useKeyboardNavigation.ts", "../../../packages/vuu-layout/src/toolbar/toolbar-dom-utils.ts", "../../../packages/vuu-layout/src/toolbar/useSelection.ts", "../../../packages/vuu-layout/src/tools/config-wrapper/ConfigWrapper.tsx", "../../../packages/vuu-layout/src/tools/devtools-box/layout-configurator.jsx", "../../../packages/vuu-layout/src/tools/devtools-tree/layout-tree-viewer.jsx"],
|
|
4
|
+
"sourcesContent": ["export * from \"./dock-layout\";\nexport { default as Component } from \"./Component\";\nexport * from \"./drag-drop\";\nexport * from \"./DraggableLayout\";\nexport * from \"./flexbox\";\nexport { Action } from \"./layout-action\";\nexport * from \"./layout-header\";\nexport * from \"./layout-provider\";\nexport * from \"./layout-reducer\";\nexport * from \"./layout-view\";\nexport * from \"./measured-container\";\nexport * from \"./overflow-container\";\nexport * from \"./palette\";\nexport * from \"./placeholder\";\nexport * from \"./registry\";\nexport * from \"./responsive\";\nexport * from \"./stack\";\nexport * from \"./toolbar\";\nexport * from \"./tools\";\nexport * from \"./use-persistent-state\";\nexport * from \"./utils\";\n", "import { partition } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, ReactElement } from \"react\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport Drawer from \"./Drawer\";\n\nimport \"./DockLayout.css\";\n\nconst isDrawer = (component: ReactElement) => component.type === Drawer;\nconst isVertical = ({ props: { position = \"left\" } }: ReactElement) =>\n position.match(/top|bottom/);\n\nexport interface DockLayoutProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactElement[];\n}\n\nconst DockLayout = (props: DockLayoutProps) => {\n const { children, className: classNameProp, id, style } = props;\n const classBase = \"vuuDockLayout\";\n const [drawers, content] = partition(children, isDrawer);\n const [verticalDrawers, horizontalDrawers] = partition(drawers, isVertical);\n const orientation =\n verticalDrawers.length === 0\n ? \"horizontal\"\n : horizontalDrawers.length === 0\n ? \"vertical\"\n : \"both\";\n\n const className = cx(classBase, classNameProp, `${classBase}-${orientation}`);\n\n return (\n <div className={className} id={id} style={style}>\n {drawers}\n <div className={`${classBase}-content`}>{content}</div>\n </div>\n );\n};\nDockLayout.displayName = \"DockLayout\";\n\nexport default DockLayout;\n\nregisterComponent(\"DockLayout\", DockLayout, \"container\");\n", "import { FunctionComponent } from \"react\";\n\nconst _containers: { [key: string]: boolean } = {};\nconst _views: { [key: string]: boolean } = {};\n\nexport type layoutComponentType = \"component\" | \"container\" | \"view\";\n\nexport interface ComponentWithId {\n id: string;\n [key: string]: unknown;\n}\n\nexport const ComponentRegistry: {\n [key: string]: FunctionComponent<ComponentWithId>;\n} = {};\n\nexport function isContainer(componentType: string) {\n return _containers[componentType] === true;\n}\n\nexport function isView(componentType: string) {\n return _views[componentType] === true;\n}\n\nexport const isLayoutComponent = (type: string) =>\n isContainer(type) || isView(type);\n\n// export const isRegistered = (className: string) =>\n// !!ComponentRegistry[className];\n\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FunctionComponent<any>,\n type: layoutComponentType = \"component\"\n) {\n ComponentRegistry[componentName] = component;\n\n if (type === \"container\") {\n _containers[componentName] = true;\n } else if (type === \"view\") {\n _views[componentName] = true;\n }\n}\n", "import { Button, useControlled } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { CSSProperties, HTMLAttributes, useCallback } from \"react\";\n\nimport \"./Drawer.css\";\n\nconst classBase = \"vuuDrawer\";\n\nconst sizeAttribute = (value: string | number) => {\n return typeof value === \"string\" ? value : value + \"px\";\n};\n\nconst getStyle = (\n styleProp?: CSSProperties,\n sizeOpen?: number,\n sizeClosed?: number\n) => {\n const hasSizeOpen = sizeOpen !== undefined;\n const hasSizeClosed = sizeClosed !== undefined;\n\n if (!styleProp && !hasSizeClosed && !hasSizeOpen) {\n return undefined;\n }\n\n if (!hasSizeClosed && !hasSizeOpen) {\n return styleProp;\n }\n\n return {\n ...styleProp,\n \"--drawer-size\": hasSizeOpen ? sizeAttribute(sizeOpen) : undefined,\n \"--drawer-peek-size\": hasSizeClosed ? sizeAttribute(sizeClosed) : undefined,\n };\n};\n\nexport interface DrawerProps extends HTMLAttributes<HTMLDivElement> {\n clickToOpen?: boolean;\n defaultOpen?: boolean;\n inline?: boolean;\n open?: boolean;\n peekaboo?: boolean;\n position?: \"left\" | \"right\" | \"top\" | \"bottom\";\n sizeOpen?: number;\n sizeClosed?: number;\n toggleButton?: \"start\" | \"end\";\n}\nconst Drawer = ({\n children,\n className: classNameProp,\n clickToOpen,\n defaultOpen,\n sizeOpen,\n sizeClosed,\n style: styleProp,\n open: openProp,\n position = \"left\",\n inline,\n onClick,\n peekaboo = false,\n toggleButton,\n ...props\n}: DrawerProps) => {\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: defaultOpen ?? false,\n name: \"Drawer\",\n state: \"open\",\n });\n\n console.log(`Drawer sizeOpen ${sizeOpen} sizeClosed ${sizeClosed}`);\n\n const className = cx(classBase, classNameProp, `${classBase}-${position}`, {\n [`${classBase}-open`]: open,\n [`${classBase}-inline`]: inline,\n [`${classBase}-over`]: !inline,\n [`${classBase}-peekaboo`]: peekaboo,\n });\n\n const toggleDrawer = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const style = getStyle(styleProp, sizeOpen, sizeClosed);\n\n const handleClick = clickToOpen ? toggleDrawer : onClick;\n\n const renderToggleButton = () => (\n <div className={cx(\"vuuToggleButton-container\")}>\n {open ? (\n <Button\n aria-label=\"close\"\n onClick={toggleDrawer}\n data-icon=\"close\"\n variant=\"secondary\"\n />\n ) : (\n <Button\n aria-label=\"open\"\n onClick={toggleDrawer}\n data-icon=\"close\"\n variant=\"secondary\"\n />\n )}\n </div>\n );\n\n return (\n <div {...props} className={className} onClick={handleClick} style={style}>\n {toggleButton == \"start\" ? renderToggleButton() : null}\n <div className={`${classBase}-liner`}>\n <div className={`${classBase}-content`}>{children}</div>\n </div>\n {toggleButton == \"end\" ? renderToggleButton() : null}\n </div>\n );\n};\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n", "import React, { forwardRef, HTMLAttributes } from 'react';\nimport { registerComponent } from './registry/ComponentRegistry';\n\nimport './Component.css';\n\nexport interface ComponentProps extends HTMLAttributes<HTMLDivElement> {\n resizeable?: boolean;\n}\n\nconst Component = forwardRef(function Component(\n { resizeable, ...props }: ComponentProps,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n return <div {...props} className=\"Component\" ref={ref} />;\n}) as React.FunctionComponent<ComponentProps>;\nComponent.displayName = 'Component';\n\nexport default Component;\n\nregisterComponent('Component', Component);\n", "import React, { isValidElement, ReactElement } from \"react\";\nimport { LayoutJSON, LayoutModel, WithActive } from \"../layout-reducer\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport { getProp, getProps } from \"./propUtils\";\nimport { typeOf } from \"./typeOf\";\n\nconst removeFinalPathSegment = (path: string) => {\n const pos = path.lastIndexOf(\".\");\n if (pos === -1) {\n return path;\n } else {\n return path.slice(0, pos);\n }\n};\n\nconst getChildren = (c: ReactElement) =>\n React.isValidElement(c.props.children)\n ? [c.props.children]\n : c.props.children;\n\n/**\n * This is a very specific function at the moment. It resolves a path of the form\n * '#{componentid}.ACTIVE_CHILD'\n * It allows a templated path to be resolved to a concrete path at runtime.\n * The above pattern is used to identify a layout drop target. Further patterns\n * will be added if needed.\n */\nexport const resolvePath = (source: ReactElement, path = \"\"): string => {\n const [step1, ...steps] = path.split(\".\");\n if (step1?.startsWith(\"#\")) {\n const node = findTargetById(source, step1.slice(1), true);\n if (node && steps.length) {\n return resolvePath(node, steps.join(\".\"));\n }\n } else if (step1 === \"ACTIVE_CHILD\") {\n const { active } = getProps(source);\n const children = getChildren(source);\n const { path } = getProps(children[active]);\n return path;\n }\n\n return \"\";\n};\n\n/**\n * Similar to resolvePath but operates on a JSON\n * layout structure and returns the matching JSON node.\n */\nexport const resolveJSONPath = (\n source: LayoutJSON,\n path = \"\"\n): LayoutJSON | undefined => {\n const [step1, ...steps] = path.split(\".\");\n if (step1?.startsWith(\"#\")) {\n const node = findTargetJSONById(source, step1.slice(1), true);\n if (node && steps.length) {\n return resolveJSONPath(node, steps.join(\".\"));\n }\n } else if (step1 === \"ACTIVE_CHILD\") {\n const { children, props } = source;\n const { active } = props as WithActive;\n if (typeof active === \"number\" && children?.[active]) {\n return children[active];\n }\n }\n return;\n};\n\nexport function followPathToParent(\n source: ReactElement,\n path: string\n): ReactElement | null {\n const { \"data-path\": dataPath, path: sourcePath = dataPath } =\n getProps(source);\n\n if (path === \"0\") return null;\n if (path === sourcePath) return null;\n\n return followPath(source, removeFinalPathSegment(path), true);\n}\n\nexport function findTarget(\n source: LayoutModel,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n test: (props: any) => boolean\n): LayoutModel | undefined {\n const { children, ...props } = getProps(source);\n if (test(props)) {\n return source;\n }\n if (React.Children.count(children) > 0) {\n const array = React.isValidElement(children) ? [children] : children;\n for (const child of array) {\n const target = findTarget(child, test);\n if (target) {\n return target;\n }\n }\n }\n}\n\nexport function containerOf(\n source: LayoutModel,\n target: LayoutModel\n): LayoutModel | null {\n if (target === source) {\n return null;\n }\n const { path: sourcePath, children } = getProps(source);\n const { idx, finalStep } = nextStep(sourcePath, getProp(target, \"path\"));\n if (finalStep) {\n return source;\n }\n if (children === undefined || children[idx] === undefined) {\n return null;\n }\n return containerOf(children[idx], target);\n}\n\nexport const getChild = (\n children: ReactElement[],\n idx: number\n): ReactElement | undefined => {\n if (React.isValidElement(children) && idx == 0) {\n return children;\n }\n if (Array.isArray(children)) {\n return children[idx];\n }\n};\n\nexport function followPathToComponent(component: ReactElement, path: string) {\n const paths = path.split(\".\");\n let children = [component];\n\n for (let i = 0; i < paths.length; i++) {\n const idx = parseInt(paths[i]);\n const child = children[idx];\n if (i === paths.length - 1) {\n return child;\n }\n children = getChildren(child);\n }\n}\n\nconst findTargetById = (\n source: ReactElement,\n id: string,\n throwIfNotFound = true\n): ReactElement | undefined => {\n const { children, id: idProp } = source.props;\n if (idProp === id) {\n return source;\n }\n\n if (React.Children.count(children) > 0) {\n const childArray = isValidElement(children) ? [children] : children;\n for (const child of childArray) {\n if (isValidElement(child)) {\n const target = findTargetById(child, id, false);\n if (target) {\n return target;\n }\n }\n }\n }\n\n if (throwIfNotFound === true) {\n throw Error(`pathUtils.findTargetById id #${id} not found in source`);\n }\n};\n\nconst findTargetJSONById = (\n source: LayoutJSON,\n id: string,\n throwIfNotFound = true\n): LayoutJSON | undefined => {\n const { children, id: idProp } = source;\n if (idProp === id) {\n return source;\n }\n\n if (Array.isArray(children) && children.length > 0) {\n for (const child of children) {\n if (child !== null && typeof child === \"object\") {\n const target = findTargetJSONById(child, id, false);\n if (target) {\n return target;\n }\n }\n }\n }\n\n if (throwIfNotFound === true) {\n throw Error(`pathUtils.findTargetJSONById id #${id} not found in source`);\n }\n};\n\nexport function followPath(\n source: LayoutModel,\n path: string\n): LayoutModel | undefined;\nexport function followPath(\n source: ReactElement,\n path: string,\n throwIfNotFound: true\n): ReactElement;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function followPath(source: any, path: any, throwIfNotFound = false) {\n if (path.startsWith(\"#\")) {\n return findTargetById(source, path.slice(1), throwIfNotFound);\n }\n\n const { \"data-path\": dataPath, path: sourcePath = dataPath } =\n getProps(source);\n if (path.indexOf(sourcePath) !== 0) {\n throw Error(\n `pathUtils.followPath path ${path} is not within source path ${sourcePath}`\n );\n }\n const route = path.slice(sourcePath.length + 1);\n if (route === \"\") {\n return source;\n }\n\n let target = source;\n const paths = route.split(\".\");\n\n for (let i = 0; i < paths.length; i++) {\n if (React.Children.count(target.props.children) === 0) {\n const message = `element at 0.${paths\n .slice(0, i)\n .join(\".\")} has no children, so cannot fulfill rest of path ${paths\n .slice(i)\n .join(\".\")}`;\n\n if (throwIfNotFound) {\n throw Error(message);\n } else {\n console.warn(message);\n return;\n }\n }\n\n target = getChild(target.props.children, parseInt(paths[i]));\n\n if (target === undefined) {\n const message = `model at 0.${paths\n .slice(0, i)\n .join(\".\")} has no children that fulfill next step of path ${paths\n .slice(i)\n .join(\".\")}`;\n\n if (throwIfNotFound) {\n throw Error(message);\n } else {\n console.warn(message);\n }\n }\n }\n return target;\n}\n\nexport function nextLeaf(root: ReactElement, path: string) {\n const parent = followPathToParent(root, path);\n let pathIndices = path.split(\".\").map((idx) => parseInt(idx, 10));\n if (parent) {\n const lastIdx = pathIndices.pop();\n const { children } = parent.props;\n if (children.length - 1 > lastIdx!) {\n return firstLeaf(children[lastIdx! + 1]);\n } else {\n const parentIdx = pathIndices.pop();\n const nextParent = followPathToParent(root, getProp(parent, \"path\"));\n if (nextParent && typeof parentIdx === \"number\") {\n pathIndices = nextParent.props.path\n .split(\".\")\n .map((idx: string) => parseInt(idx, 10));\n if (nextParent.props.children.length - 1 > parentIdx) {\n const nextStep = nextParent.props.children[parentIdx + 1];\n if (isContainer(typeOf(nextStep) as string)) {\n return firstLeaf(nextStep);\n } else {\n return nextStep;\n }\n }\n }\n }\n }\n\n return firstLeaf(root);\n}\n\nexport function previousLeaf(root: ReactElement, path: string) {\n const pathIndices = path.split(\".\").map((idx) => parseInt(idx, 10));\n let lastIdx = pathIndices.pop();\n let parent = followPathToParent(root, path);\n if (parent != null && typeof lastIdx === \"number\") {\n const { children } = parent.props;\n if (lastIdx > 0) {\n return lastLeaf(children[lastIdx - 1]);\n } else {\n while (pathIndices.length > 1) {\n lastIdx = pathIndices.pop() as number;\n parent = followPathToParent(\n root,\n getProp(parent, \"path\")\n ) as ReactElement;\n if (lastIdx > 0) {\n const nextStep = parent.props.children[lastIdx - 1];\n if (isContainer(typeOf(nextStep) as string)) {\n return lastLeaf(nextStep);\n }\n return nextStep;\n }\n }\n }\n }\n return lastLeaf(root);\n}\n\nfunction firstLeaf(layoutRoot: ReactElement): ReactElement {\n if (isContainer(typeOf(layoutRoot) as string)) {\n const { children } = layoutRoot.props || layoutRoot;\n return firstLeaf(children[0]);\n }\n return layoutRoot;\n}\n\nfunction lastLeaf(root: ReactElement): ReactElement {\n if (isContainer(typeOf(root) as string)) {\n const { children } = root.props || root;\n return lastLeaf(children[children.length - 1]);\n }\n return root;\n}\n\ntype NextStepResult = {\n idx: number;\n finalStep: boolean;\n};\n\nexport function nextStep(\n pathSoFar: string,\n targetPath: string,\n followPathToEnd = false\n): NextStepResult {\n if (pathSoFar === targetPath) {\n return { idx: -1, finalStep: true };\n }\n\n const pathVisited = `${pathSoFar}.`;\n if (!targetPath.startsWith(pathVisited)) {\n throw Error(\"pathUtils nextStep has strayed from the path\");\n }\n\n const endOfTheLine = followPathToEnd ? 0 : 1;\n const paths = targetPath\n .replace(pathVisited, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10));\n return { idx: paths[0], finalStep: paths.length === endOfTheLine };\n}\n\nexport function resetPath(\n model: ReactElement,\n path: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalProps?: any\n): ReactElement {\n if (getProp(model, \"path\") === path) {\n return model;\n }\n const children: ReactElement[] = [];\n React.Children.forEach(model.props.children, (child, i) => {\n if (!getProp(child, \"path\")) {\n children.push(child);\n } else {\n children.push(resetPath(child, `${path}.${i}`));\n }\n });\n const pathPropName = model.props[\"data-path\"] ? \"data-path\" : \"path\";\n return React.cloneElement(\n model,\n { [pathPropName]: path, ...additionalProps },\n children\n );\n}\n", "import { ReactElement } from \"react\";\nimport { LayoutModel } from \"../layout-reducer\";\n\nconst NO_PROPS = {};\nexport const getProp = (\n component: LayoutModel | undefined,\n propName: string\n) => {\n const props = getProps(component);\n return props[propName] ?? props[`data-${propName}`];\n};\n\nexport const getProps = (component?: LayoutModel) =>\n component?.props || component || NO_PROPS;\n\nexport const getChildProp = (container: LayoutModel) => {\n const props = getProps(container);\n if (props.children) {\n const {\n children: [target, ...rest],\n } = props;\n if (rest.length > 0) {\n console.warn(\n `getChild expected a single child, found ${rest.length + 1}`\n );\n }\n return target as ReactElement;\n }\n};\n", "import { ReactElement } from 'react';\nimport { LayoutModel, WithType } from '../layout-reducer';\n\nexport function typeOf(element?: LayoutModel | WithType): string | undefined {\n if (element) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const type = element.type as any;\n if (typeof type === 'function' || typeof type === 'object') {\n const elementName = type.displayName || type.name || type.type?.name;\n if (typeof elementName === 'string') {\n return elementName;\n }\n }\n if (typeof element.type === 'string') {\n return element.type;\n }\n if (element.constructor) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (element.constructor as any).displayName as string;\n }\n throw Error(`typeOf unable to determine type of element`);\n }\n}\n\nexport const isTypeOf = (element: ReactElement, type: string) => typeOf(element) === type;\n", "import { MutableRefObject } from \"react\";\n\nexport function setRef<T>(\n ref:\n | MutableRefObject<T | null>\n | ((instance: T | null) => void)\n | null\n | undefined,\n value: T | null\n): void {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n", "import { Children, isValidElement, ReactElement, ReactNode } from \"react\";\n\nconst EMPTY_ARRAY: ReactElement[] = [];\n\nexport const asReactElements = (children: ReactNode): ReactElement[] => {\n const isArray = Array.isArray(children);\n const count = isArray ? children.length : Children.count(children);\n if (isArray && children.every(isValidElement)) {\n return children;\n } else if (count === 1 && !isArray && isValidElement(children)) {\n return [children];\n } else if (count > 1) {\n return children as ReactElement[];\n } else {\n return EMPTY_ARRAY;\n }\n};\n", "import { CSSProperties } from 'react';\nexport type CSSFlexProperties = Pick<CSSProperties, 'flexBasis' | 'flexGrow' | 'flexShrink'>;\n\nexport const expandFlex = (flex: number | CSSFlexProperties): CSSFlexProperties => {\n if (typeof flex !== 'number') {\n throw Error(`\"no support yet for flex value ${flex}`);\n }\n return {\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1\n };\n};\n", "import { ReactElement } from \"react\";\nimport { boxContainsPoint } from \"@vuu-ui/vuu-utils\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport { getProps, typeOf } from \"../utils\";\nimport { DragDropRect, DropPos, RelativePosition } from \"./dragDropTypes\";\n\nexport const positionValues = {\n north: 1,\n east: 2,\n south: 4,\n west: 8,\n header: 16,\n centre: 32,\n absolute: 64,\n};\n\nexport const RelativeDropPosition = {\n AFTER: \"after\" as RelativePosition,\n BEFORE: \"before\" as RelativePosition,\n};\n\nexport const Position = Object.freeze({\n North: _position(\"north\"),\n East: _position(\"east\"),\n South: _position(\"south\"),\n West: _position(\"west\"),\n Header: _position(\"header\"),\n Centre: _position(\"centre\"),\n Absolute: _position(\"absolute\"),\n});\n\nfunction _position(str: keyof typeof positionValues) {\n return Object.freeze({\n offset:\n str === \"north\" || str === \"west\"\n ? 0\n : str === \"south\" || str === \"east\"\n ? 1\n : NaN,\n valueOf: function () {\n return positionValues[str];\n },\n toString: function () {\n return str;\n },\n North: str === \"north\",\n South: str === \"south\",\n East: str === \"east\",\n West: str === \"west\",\n Header: str === \"header\",\n Centre: str === \"centre\",\n NorthOrSouth: str === \"north\" || str === \"south\",\n EastOrWest: str === \"east\" || str === \"west\",\n NorthOrWest: str === \"north\" || str === \"west\",\n SouthOrEast: str === \"east\" || str === \"south\",\n Absolute: str === \"absolute\",\n });\n}\n\nconst NORTH = Position.North,\n SOUTH = Position.South,\n EAST = Position.East,\n WEST = Position.West,\n HEADER = Position.Header,\n CENTRE = Position.Centre;\n\nexport interface Measurements {\n [key: string]: DragDropRect;\n}\n\nexport class BoxModel {\n //TODO we should accept initial let,top offsets here\n // if dropTargets are supplied, we will only allow drop operations directly on these targets\n // TODO we will need to make this more flexible e.g allowing drop anywhere within these target\n static measure(\n model: ReactElement,\n dropTargetPaths: string[] = []\n ): Measurements {\n const measurements: Measurements = {};\n measureRootComponent(model, measurements, dropTargetPaths);\n return measurements;\n }\n\n static allBoxesContainingPoint(\n layout: LayoutModel,\n measurements: Measurements,\n x: number,\n y: number,\n validDropTargets?: string[]\n ) {\n return allBoxesContainingPoint(\n layout,\n measurements,\n x,\n y,\n validDropTargets\n ).reverse();\n }\n}\n\nexport function pointPositionWithinRect(\n x: number,\n y: number,\n rect: DragDropRect,\n borderZone = 30\n) {\n const width = rect.right - rect.left;\n const height = rect.bottom - rect.top;\n const posX = x - rect.left;\n const posY = y - rect.top;\n let closeToTheEdge = 0;\n\n if (posX < borderZone) closeToTheEdge += 8;\n if (posX > width - borderZone) closeToTheEdge += 2;\n if (posY < borderZone) closeToTheEdge += 1;\n if (posY > height - borderZone) closeToTheEdge += 4;\n\n return { pctX: posX / width, pctY: posY / height, closeToTheEdge };\n}\n\nexport function getPosition(\n x: number,\n y: number,\n rect: DragDropRect,\n targetOrientation?: \"row\" | \"column\"\n): DropPos {\n const { BEFORE, AFTER } = RelativeDropPosition;\n const { pctX, pctY, closeToTheEdge } = pointPositionWithinRect(x, y, rect);\n let position;\n let tab;\n\n if (targetOrientation === \"row\") {\n position = pctX < 0.5 ? WEST : EAST;\n } else if (rect.header && boxContainsPoint(rect.header, x, y)) {\n position = HEADER;\n\n if (rect.Stack) {\n const tabCount = rect.Stack.length;\n if (tabCount === 0) {\n tab = {\n index: -1,\n left: rect.left,\n positionRelativeToTab: AFTER,\n width: 0,\n };\n } else {\n //TODO account for gaps between tabs\n const targetTab = rect.Stack.find(\n ({ left, right }) => x >= left && x <= right\n );\n if (targetTab) {\n const tabWidth = targetTab.right - targetTab.left;\n tab = {\n index: rect.Stack.indexOf(targetTab),\n left: targetTab.left,\n positionRelativeToTab:\n (x - targetTab.left) / tabWidth < 0.5 ? BEFORE : AFTER,\n width: tabWidth,\n };\n } else {\n const lastTab = rect.Stack[tabCount - 1];\n tab = {\n left: lastTab.right,\n width: 0,\n index: tabCount,\n positionRelativeToTab: AFTER,\n };\n }\n }\n } else if (rect.header.titleWidth) {\n const tabWidth = rect.header.titleWidth;\n tab = {\n index: -1,\n left: rect.left,\n positionRelativeToTab:\n (x - rect.left) / tabWidth < 0.5 ? BEFORE : AFTER,\n width: tabWidth,\n };\n } else {\n tab = {\n left: rect.left,\n width: 0,\n positionRelativeToTab: BEFORE,\n index: -1,\n };\n }\n } else {\n position = getPositionWithinBox(x, y, rect, pctX, pctY);\n }\n return { position: position!, x, y, closeToTheEdge, tab };\n}\n\nfunction getPositionWithinBox(\n x: number,\n y: number,\n rect: DragDropRect,\n pctX: number,\n pctY: number\n) {\n const centerBox = getCenteredBox(rect, 0.2);\n if (boxContainsPoint(centerBox, x, y)) {\n return CENTRE;\n } else {\n const quadrant = `${pctY < 0.5 ? \"north\" : \"south\"}${\n pctX < 0.5 ? \"west\" : \"east\"\n }`;\n\n switch (quadrant) {\n case \"northwest\":\n return pctX > pctY ? NORTH : WEST;\n case \"northeast\":\n return 1 - pctX > pctY ? NORTH : EAST;\n case \"southeast\":\n return pctX > pctY ? EAST : SOUTH;\n case \"southwest\":\n return 1 - pctX > pctY ? WEST : SOUTH;\n default:\n }\n }\n}\n\nfunction getCenteredBox(\n { right, left, top, bottom }: DragDropRect,\n pctSize: number\n) {\n const pctOffset = (1 - pctSize) / 2;\n const w = (right - left) * pctOffset;\n const h = (bottom - top) * pctOffset;\n return { left: left + w, top: top + h, right: right - w, bottom: bottom - h };\n}\n\nfunction measureRootComponent(\n rootComponent: ReactElement,\n measurements: Measurements,\n dropTargets: string[]\n) {\n const {\n id,\n \"data-path\": dataPath,\n path = dataPath,\n } = getProps(rootComponent);\n const type = typeOf(rootComponent) as string;\n\n if (id && path) {\n const [rect, el] = measureComponentDomElement(rootComponent);\n measureComponent(rootComponent, rect, el, measurements);\n if (isContainer(type)) {\n collectChildMeasurements(rootComponent, measurements, dropTargets);\n }\n }\n}\n\nfunction measureComponent(\n component: LayoutModel,\n rect: DragDropRect,\n el: HTMLElement,\n measurements: Measurements\n) {\n const {\n \"data-path\": dataPath,\n path = dataPath,\n header,\n } = getProps(component);\n\n measurements[path] = rect;\n\n const type = typeOf(component);\n if (header || type === \"Stack\") {\n const query = type === \"Stack\" ? \".vuuTabstrip\" : \".vuuHeader\";\n const headerEl = el.querySelector(query);\n if (headerEl) {\n const { top, left, right, bottom } = headerEl.getBoundingClientRect();\n measurements[path].header = {\n top: Math.round(top),\n left: Math.round(left),\n right: Math.round(right),\n bottom: Math.round(bottom),\n };\n if (type === \"Stack\") {\n measurements[path].Stack = Array.from(\n headerEl.querySelectorAll(\".vuuTab\")\n )\n .map((tab) => tab.getBoundingClientRect())\n .map(({ left, right }) => ({ left, right }));\n } else {\n const titleEl = headerEl.querySelector('[class^=\"vuuHeader-title\"]');\n const { header } = measurements[path];\n if (titleEl && header) {\n header.titleWidth = titleEl.clientWidth;\n }\n }\n }\n }\n\n return measurements[path];\n}\n\nfunction collectChildMeasurements(\n component: LayoutModel,\n measurements: Measurements,\n dropTargets: string[],\n preX = 0,\n posX = 0,\n preY = 0,\n posY = 0\n) {\n const {\n children,\n \"data-path\": dataPath,\n path = dataPath,\n style,\n active = 0,\n } = getProps(component);\n\n const type = typeOf(component);\n const isFlexbox = type === \"Flexbox\";\n const isStack = type === \"Stack\";\n const isTower = isFlexbox && style.flexDirection === \"column\";\n const isTerrace = isFlexbox && style.flexDirection === \"row\";\n\n const childrenToMeasure = isStack\n ? children.filter((_child: ReactElement, idx: number) => idx === active)\n : children.filter(omitDragging);\n\n type measuredTuple = [DragDropRect, HTMLElement, ReactElement];\n // Collect all the measurements in first pass ...\n const childMeasurements: measuredTuple[] = childrenToMeasure.map(\n (child: ReactElement) => {\n const [rect, el] = measureComponentDomElement(child);\n\n return [\n {\n ...rect,\n top: rect.top - preY,\n right: rect.right + posX,\n bottom: rect.bottom + posY,\n left: rect.left - preX,\n },\n el,\n child,\n ];\n }\n );\n\n // ...so that, in the second pass, we can identify gaps ...\n const expandedMeasurements = childMeasurements.map(\n ([rect, el, child], i, all) => {\n // generate a 'local' splitter adjustment for children adjacent to splitters\n let localPreX;\n let localPosX;\n let localPreY;\n let localPosY;\n let gapPre;\n let gapPos;\n const n = all.length - 1;\n if (isTerrace) {\n gapPre = i === 0 ? 0 : rect.left - all[i - 1][0].right;\n gapPos = i === n ? 0 : all[i + 1][0].left - rect.right;\n // we don't need to divide the leading gap, as half the gap will\n // already have been assigned to the preceeding child in the\n // previous loop iteration.\n localPreX = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;\n localPosX = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;\n rect.left -= localPreX;\n rect.right += localPosX;\n localPreY = preY;\n localPosY = posY;\n } else if (isTower) {\n gapPre = i === 0 ? 0 : rect.top - all[i - 1][0].bottom;\n gapPos = i === n ? 0 : all[i + 1][0].top - rect.bottom;\n // we don't need to divide the leading gap, as half the gap will\n // already have been assigned to the preceeding child in the\n // previous loop iteration.\n localPreY = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;\n localPosY = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;\n rect.top -= localPreY;\n rect.bottom += localPosY;\n localPreX = preX;\n localPosX = posX;\n }\n\n const componentMeasurements = measureComponent(\n child,\n rect,\n el,\n measurements\n );\n\n const childType = typeOf(child) as string;\n if (isContainer(childType)) {\n collectChildMeasurements(\n child,\n measurements,\n dropTargets,\n localPreX,\n localPosX,\n localPreY,\n localPosY\n );\n }\n return componentMeasurements;\n }\n );\n if (childMeasurements.length) {\n measurements[path].children = expandedMeasurements;\n }\n}\n\nfunction omitDragging(component: ReactElement) {\n const { id } = getProps(component);\n const el = document.getElementById(id);\n if (el) {\n return el.dataset.dragging !== \"true\";\n } else {\n console.warn(`BoxModel: no element found with id #${id}`);\n return false;\n }\n}\n\nfunction measureComponentDomElement(\n component: LayoutModel\n): [DragDropRect, HTMLElement, LayoutModel] {\n const { id } = getProps(component) as { id: string };\n if (id === undefined) {\n throw Error(\"`BoxModel.measureComponentElement, component has no id\");\n }\n const el = document.getElementById(id);\n if (!el) {\n throw Error(\n \"BoxModel.measureComponentElement, no DOM element found for component\"\n );\n }\n // Note: height and width are not required for dropTarget identification, but\n // are used in sizing calculations on drop\n const { top, left, right, bottom, height, width } =\n el.getBoundingClientRect();\n let scrolling = undefined;\n const type = typeOf(component) as string;\n if (isContainer(type)) {\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > height) {\n scrolling = { id, scrollHeight, scrollTop: el.scrollTop };\n }\n }\n return [\n {\n top: Math.round(top),\n left: Math.round(left),\n right: Math.round(right),\n bottom: Math.round(bottom),\n height: Math.round(height),\n width: Math.round(width),\n scrolling,\n },\n el,\n component,\n ];\n}\n\nfunction allBoxesContainingPoint(\n component: LayoutModel,\n measurements: Measurements,\n x: number,\n y: number,\n dropTargets?: string[],\n boxes: LayoutModel[] = []\n): LayoutModel[] {\n const {\n children,\n \"data-path\": dataPath,\n path = dataPath,\n } = getProps(component);\n\n const type = typeOf(component) as string;\n const rect = measurements[path];\n if (!boxContainsPoint(rect, x, y)) return boxes;\n\n if (dropTargets && dropTargets.length) {\n if (dropTargets.includes(path)) {\n boxes.push(component);\n } else if (\n dropTargets.some((dropTargetPath) => dropTargetPath.startsWith(path))\n ) {\n // keep going\n } else {\n return boxes;\n }\n } else {\n boxes.push(component);\n }\n\n if (!isContainer(type)) {\n return boxes;\n }\n\n if (rect.header && boxContainsPoint(rect.header, x, y)) {\n return boxes;\n }\n\n if (rect.scrolling) {\n scrollIntoViewIfNeccesary(rect, x, y);\n }\n\n for (let i = 0; i < children.length; i++) {\n if (type === \"Stack\" && component.props.active !== i) {\n continue;\n }\n const nestedBoxes = allBoxesContainingPoint(\n children[i],\n measurements,\n x,\n y,\n dropTargets\n );\n if (nestedBoxes.length) {\n return boxes.concat(nestedBoxes);\n }\n }\n return boxes;\n}\n\nfunction scrollIntoViewIfNeccesary(\n { top, bottom, scrolling }: DragDropRect,\n x: number,\n y: number\n) {\n if (scrolling) {\n const { id, scrollTop, scrollHeight } = scrolling;\n const height = bottom - top;\n if (scrollTop === 0 && bottom - y < 50) {\n const scrollMax = scrollHeight - height;\n const el = document.getElementById(id) as HTMLElement;\n el.scrollTo({ left: 0, top: scrollMax, behavior: \"smooth\" });\n scrolling.scrollTop = scrollMax;\n } else if (scrollTop > 0 && y - top < 50) {\n const el = document.getElementById(id) as HTMLElement;\n el.scrollTo({ left: 0, top: 0, behavior: \"smooth\" });\n scrolling.scrollTop = 0;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n", "import { pointPositionWithinRect } from './BoxModel';\nimport { DragDropRect } from './dragDropTypes';\n\nconst SCALE_FACTOR = 0.4;\n\nexport type IntrinsicSizes = {\n height?: number;\n width?: number;\n};\n\ninterface ZoneRange {\n hi: number;\n lo: number;\n}\ntype DragConstraint = {\n zone: {\n x: ZoneRange;\n y: ZoneRange;\n };\n pos: {\n x: ZoneRange;\n y: ZoneRange;\n };\n mouse: {\n x: ZoneRange;\n y: ZoneRange;\n };\n};\n\ninterface ExtendedZoneRange {\n lo: boolean;\n hi: boolean;\n mousePct: number;\n mousePos: number;\n pos: number;\n}\n\nexport class DragState {\n public constraint!: DragConstraint;\n public x!: ExtendedZoneRange;\n public y!: ExtendedZoneRange;\n public intrinsicSize: IntrinsicSizes | undefined;\n\n constructor(\n zone: DragDropRect,\n mouseX: number,\n mouseY: number,\n measurements: DragDropRect,\n intrinsicSize?: IntrinsicSizes\n ) {\n this.init(zone, mouseX, mouseY, measurements, intrinsicSize);\n }\n\n init(\n zone: DragDropRect,\n mouseX: number,\n mouseY: number,\n rect: DragDropRect,\n intrinsicSize?: IntrinsicSizes\n ) {\n const { left: x, top: y } = rect;\n\n const { pctX, pctY } = pointPositionWithinRect(mouseX, mouseY, rect);\n\n // We are applying a scale factor of 0.4 to the draggee. This is purely a visual\n // effect - the actual box size remains the original size. The 'leading' values\n // represent the difference between the visual scaled down box and the actual box.\n\n const scaleFactor = SCALE_FACTOR;\n\n const leadX = pctX * rect.width;\n const trailX = rect.width - leadX;\n const leadY = pctY * rect.height;\n const trailY = rect.height - leadY;\n\n // When we assign position to rect using css. positioning units are applied to the\n // unscaled shape, so we have to adjust values to take scaling into account.\n const scaledWidth = rect.width * scaleFactor,\n scaledHeight = rect.height * scaleFactor;\n\n const scaleDiff = 1 - scaleFactor;\n const leadXScaleDiff = leadX * scaleDiff;\n const leadYScaleDiff = leadY * scaleDiff;\n const trailXScaleDiff = trailX * scaleDiff;\n const trailYScaleDiff = trailY * scaleDiff;\n\n this.intrinsicSize = intrinsicSize;\n\n this.constraint = {\n zone: {\n x: {\n lo: zone.left,\n hi: zone.right\n },\n y: {\n lo: zone.top,\n hi: zone.bottom\n }\n },\n\n pos: {\n x: {\n lo: /* left */ zone.left - leadXScaleDiff,\n hi: /* right */ zone.right - rect.width + trailXScaleDiff\n },\n y: {\n lo: /* top */ zone.top - leadYScaleDiff,\n hi: /* bottom */ zone.bottom - rect.height + trailYScaleDiff\n }\n },\n mouse: {\n x: {\n lo: /* left */ zone.left + scaledWidth * pctX,\n hi: /* right */ zone.right - scaledWidth * (1 - pctX)\n },\n y: {\n lo: /* top */ zone.top + scaledHeight * pctY,\n hi: /* bottom */ zone.bottom - scaledHeight * (1 - pctY)\n }\n }\n };\n\n this.x = {\n pos: x,\n lo: false,\n hi: false,\n mousePos: mouseX,\n mousePct: pctX\n };\n this.y = {\n pos: y,\n lo: false,\n hi: false,\n mousePos: mouseY,\n mousePct: pctY\n };\n }\n\n outOfBounds() {\n return this.x.lo || this.x.hi || this.y.lo || this.y.hi;\n }\n\n inBounds() {\n return !this.outOfBounds();\n }\n\n dropX() {\n return this.dropXY('x');\n }\n\n dropY() {\n return this.dropXY('y');\n }\n\n hasIntrinsicSize(): number | undefined {\n return this?.intrinsicSize?.height && this?.intrinsicSize?.width;\n }\n\n /*\n * diff = mouse movement, signed int\n * xy = 'x' or 'y'\n */\n //todo, diff can be calculated in here\n update(xy: 'x' | 'y', mousePos: number) {\n const state = this[xy],\n mouseConstraint = this.constraint.mouse[xy],\n posConstraint = this.constraint.pos[xy],\n previousPos = state.pos;\n\n const diff = mousePos - state.mousePos;\n\n //xy==='x' && console.log(`update: state.lo=${state.lo}, mPos=${mousePos}, mC.lo=${mouseConstraint.lo}, prevPos=${previousPos}, diff=${diff} ` );\n\n if (diff < 0) {\n if (state.lo) {\n /* do nothing */\n } else if (mousePos < mouseConstraint.lo) {\n state.lo = true;\n state.pos = posConstraint.lo;\n } else if (state.hi) {\n if (mousePos < mouseConstraint.hi) {\n state.hi = false;\n state.pos += diff;\n }\n } else {\n state.pos += diff;\n }\n } else if (diff > 0) {\n if (state.hi) {\n /* do nothing */\n } else if (mousePos > mouseConstraint.hi) {\n state.hi = true;\n state.pos = posConstraint.hi;\n } else if (state.lo) {\n if (mousePos > mouseConstraint.lo) {\n state.lo = false;\n state.pos += diff;\n }\n } else {\n state.pos += diff;\n }\n }\n\n state.mousePos = mousePos;\n\n return previousPos !== state.pos;\n }\n\n private dropXY(this: DragState, dir: 'x' | 'y') {\n const pos = this[dir],\n rect = this.constraint.zone[dir];\n // why not do the rounding +/- 1 on the rect initially - this is all it is usef for\n return pos.lo\n ? Math.max(rect.lo, pos.mousePos)\n : pos.hi\n ? Math.min(pos.mousePos, Math.round(rect.hi) - 1)\n : pos.mousePos;\n }\n}\n", "import { rect, rectTuple } from \"@vuu-ui/vuu-utils\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { getProps, typeOf } from \"../utils\";\nimport {\n BoxModel,\n getPosition,\n Measurements,\n Position,\n positionValues,\n RelativeDropPosition,\n} from \"./BoxModel\";\nimport { DragDropRect, DropPos, DropPosTab } from \"./dragDropTypes\";\nimport { DragState } from \"./DragState\";\n\nexport const isTabstrip = (dropTarget: DropTarget) =>\n dropTarget.pos.tab &&\n typeOf(dropTarget.component) === \"Stack\" &&\n dropTarget.pos.position.Header;\n\nconst { north, south, east, west } = positionValues;\nconst eastwest = east + west;\nconst northsouth = north + south;\n\nexport interface DropTargetProps {\n component: LayoutModel;\n pos: DropPos;\n clientRect: DragDropRect;\n nextDropTarget: DropTarget | null;\n}\n\nexport type GuideLine = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number\n];\nexport interface TargetDropOutline {\n l: number;\n r: number;\n t: number;\n b: number;\n tabLeft?: number;\n tabWidth?: number;\n tabHeight?: number;\n guideLines?: GuideLine;\n}\n\nexport class DropTarget {\n private active: boolean;\n\n public box: unknown;\n public clientRect: DragDropRect;\n public component: LayoutModel;\n public dropRect: rectTuple | undefined;\n public nextDropTarget: DropTarget | null;\n public pos: DropPos;\n\n constructor({\n component,\n pos,\n clientRect /*, closeToTheEdge*/,\n nextDropTarget,\n }: DropTargetProps) {\n this.component = component;\n this.pos = pos;\n this.clientRect = clientRect;\n this.nextDropTarget = nextDropTarget;\n this.active = false;\n this.dropRect = undefined;\n }\n\n targetTabPos(tab: DropPosTab) {\n const { left: tabLeft, width: tabWidth, positionRelativeToTab } = tab;\n return positionRelativeToTab === RelativeDropPosition.BEFORE\n ? tabLeft\n : tabLeft + tabWidth;\n }\n\n /**\n * Determine what will be rendered by the dropTargetRenderer\n *\n * @param {*} lineWidth\n * @param {*} dragState\n * @returns {l, t, r, b, tabLeft, tabWidth, tabHeight}\n */\n getTargetDropOutline(\n lineWidth: number,\n dragState?: DragState\n ): TargetDropOutline {\n if (this.pos.tab) {\n return this.getDropTabOutline(lineWidth, this.pos.tab);\n } else if (dragState && dragState.hasIntrinsicSize()) {\n return this.getIntrinsicDropRect(dragState);\n } else {\n const [l, t, r, b] = this.getDropRectOutline(\n lineWidth,\n dragState\n ) as rectTuple;\n return { l, t, r, b };\n }\n }\n\n getDropTabOutline(lineWidth: number, tab: DropPosTab): TargetDropOutline {\n const {\n clientRect: { top, left, right, bottom, header },\n } = this;\n\n const inset = 0;\n const gap = Math.round(lineWidth / 2) + inset;\n\n const t = Math.round(top);\n const l = Math.round(left + gap);\n const r = Math.round(right - gap);\n const b = Math.round(bottom - gap);\n const tabLeft = this.targetTabPos(tab);\n const tabWidth = 60; // should really measure text\n const tabHeight = (header?.bottom ?? 0) - (header?.top ?? 0);\n return { l, t, r, b, tabLeft, tabWidth, tabHeight };\n }\n\n getIntrinsicDropRect(dragState: DragState): TargetDropOutline {\n const { pos, clientRect: rect } = this;\n\n const { x, y } = dragState;\n\n let height = dragState.intrinsicSize?.height ?? 0;\n let width = dragState.intrinsicSize?.height ?? 0;\n\n if (height && height > rect.height) {\n console.log(`DropTarget: we're going to blow the gaff`);\n height = rect.height;\n } else if (width && width > rect.width) {\n console.log(`DropTarget: we're going to blow the gaff`);\n width = rect.width;\n }\n\n const left = Math.min(\n rect.right - width,\n Math.max(rect.left, Math.round(pos.x - x.mousePct * width))\n );\n const top = Math.min(\n rect.bottom - height,\n Math.max(rect.top, Math.round(pos.y - y.mousePct * height))\n );\n const [l, t, r, b] = (this.dropRect = [\n left,\n top,\n left + width,\n top + height,\n ]);\n\n const guideLines: GuideLine = pos.position.EastOrWest\n ? [l, rect.top, l, rect.bottom, r, rect.top, r, rect.bottom]\n : [rect.left, t, rect.right, t, rect.left, b, rect.right, b];\n\n return { l, r, t, b, guideLines };\n }\n\n /**\n * @returns [left, top, right, bottom]\n */\n getDropRectOutline(lineWidth: number, dragState?: DragState) {\n const { pos, clientRect: rect } = this;\n const { width: suggestedWidth, height: suggestedHeight, position } = pos;\n\n const { width: intrinsicWidth, height: intrinsicHeight } =\n dragState?.intrinsicSize ?? {};\n const sizeHeight = intrinsicHeight ?? suggestedHeight ?? 0;\n const sizeWidth = intrinsicWidth ?? suggestedWidth ?? 0;\n\n this.dropRect = undefined;\n\n const { top: t, left: l, right: r, bottom: b } = rect;\n\n const inset = 0;\n const gap = Math.round(lineWidth / 2) + inset;\n\n switch (position) {\n case Position.North:\n case Position.Header: {\n const halfHeight = Math.round((b - t) / 2);\n const height = sizeHeight\n ? Math.min(halfHeight, Math.round(sizeHeight))\n : halfHeight;\n return sizeWidth && l + sizeWidth < r\n ? [l + gap, t + gap, l + sizeWidth - gap, t + gap + height] // need flex direction indicator\n : [l + gap, t + gap, r - gap, t + gap + height];\n }\n case Position.West: {\n const halfWidth = Math.round((r - l) / 2);\n const width = sizeWidth\n ? Math.min(halfWidth, Math.round(sizeWidth))\n : halfWidth;\n return sizeHeight && t + sizeHeight < b\n ? [l + gap, t + gap, l - gap + width, t + sizeHeight + gap] // need flex direction indicator\n : [l + gap, t + gap, l - gap + width, b - gap];\n }\n case Position.East: {\n const halfWidth = Math.round((r - l) / 2);\n const width = sizeWidth\n ? Math.min(halfWidth, Math.round(sizeWidth))\n : halfWidth;\n return sizeHeight && t + sizeHeight < b\n ? [r - gap - width, t + gap, r - gap, t + sizeHeight + gap] // need flex direction indicator\n : [r - gap - width, t + gap, r - gap, b - gap];\n }\n case Position.South: {\n const halfHeight = Math.round((b - t) / 2);\n const height = sizeHeight\n ? Math.min(halfHeight, Math.round(sizeHeight))\n : halfHeight;\n\n return sizeWidth && l + sizeWidth < r\n ? [l + gap, b - gap - height, l + sizeWidth - gap, b - gap] // need flex direction indicator\n : [l + gap, b - gap - height, r - gap, b - gap];\n }\n case Position.Centre: {\n return [l + gap, t + gap, r - gap, b - gap];\n }\n default:\n console.warn(`DropTarget does not recognize position ${position}`);\n return null;\n }\n }\n\n activate() {\n this.active = true;\n return this;\n }\n\n toArray(this: DropTarget) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let dropTarget: DropTarget | null = this;\n const dropTargets = [dropTarget];\n // eslint-disable-next-line no-cond-assign\n while ((dropTarget = dropTarget.nextDropTarget)) {\n dropTargets.push(dropTarget);\n }\n return dropTargets;\n }\n\n static getActiveDropTarget(dropTarget: DropTarget | null): DropTarget | null {\n return dropTarget === null\n ? null\n : dropTarget?.active\n ? dropTarget\n : DropTarget.getActiveDropTarget(dropTarget.nextDropTarget);\n }\n}\n\n// Initial entry to this method is always via the app (may be it should be *on* the app)\nexport function identifyDropTarget(\n x: number,\n y: number,\n rootLayout: LayoutModel,\n measurements: Measurements,\n intrinsicSize?: number,\n validDropTargets?: string[]\n) {\n let dropTarget = null;\n\n const allBoxesContainingPoint = BoxModel.allBoxesContainingPoint(\n rootLayout,\n measurements,\n x,\n y,\n validDropTargets\n );\n\n if (allBoxesContainingPoint.length) {\n const [component, ...containers] = allBoxesContainingPoint;\n const {\n \"data-path\": dataPath,\n path = dataPath,\n \"data-row-placeholder\": isRowPlaceholder,\n } = getProps(component);\n const clientRect = measurements[path];\n const placeholderOrientation =\n intrinsicSize && isRowPlaceholder ? \"row\" : undefined;\n const pos = getPosition(x, y, clientRect, placeholderOrientation);\n const box = measurements[path];\n\n const nextDropTarget = ([nextTarget, ...targets]: LayoutModel[]):\n | DropTarget\n | undefined => {\n if (pos.position?.Header || pos.closeToTheEdge) {\n const targetPosition = getTargetPosition(\n nextTarget,\n pos,\n box,\n measurements,\n x,\n y\n );\n if (targetPosition) {\n const [containerPos, clientRect] = targetPosition;\n\n return new DropTarget({\n component: nextTarget,\n pos: containerPos,\n clientRect,\n nextDropTarget: nextDropTarget(targets) ?? null,\n });\n } else if (targets.length) {\n return nextDropTarget(targets);\n }\n }\n };\n dropTarget = new DropTarget({\n component,\n pos,\n clientRect,\n nextDropTarget: nextDropTarget(containers) ?? null,\n }).activate();\n }\n\n return dropTarget;\n}\n\nfunction getTargetPosition(\n container: LayoutModel,\n { closeToTheEdge, position }: DropPos,\n box: rect,\n measurements: Measurements,\n x: number,\n y: number\n): [DropPos, DragDropRect] | undefined {\n if (!container || container.type === \"DraggableLayout\") {\n return;\n }\n\n const containingBox = measurements[container.props.path];\n const closeToTop = closeToTheEdge & positionValues.north;\n const closeToRight = closeToTheEdge & positionValues.east;\n const closeToBottom = closeToTheEdge & positionValues.south;\n const closeToLeft = closeToTheEdge & positionValues.west;\n\n const atTop =\n (closeToTop || position.Header) &&\n Math.round(box.top) === Math.round(containingBox.top);\n const atRight =\n closeToRight && Math.round(box.right) === Math.round(containingBox.right);\n const atBottom =\n closeToBottom &&\n Math.round(box.bottom) === Math.round(containingBox.bottom);\n const atLeft =\n closeToLeft && Math.round(box.left) === Math.round(containingBox.left);\n\n if (atTop || atRight || atBottom || atLeft) {\n const { \"data-path\": dataPath, path = dataPath } = container.props;\n const clientRect = measurements[path];\n const containerPos = getPosition(x, y, clientRect);\n\n // if its a VBox and we're close to left or right ...\n if (\n (isVBox(container) || isTabbedContainer(container)) &&\n closeToTheEdge & eastwest\n ) {\n containerPos.width = 120;\n return [containerPos, clientRect];\n }\n // if it's a HBox and we're close to top or bottom ...\n else if (\n (isHBox(container) || isTabbedContainer(container)) &&\n (position.Header || closeToTheEdge & northsouth)\n ) {\n containerPos.height = 120;\n return [containerPos, clientRect];\n }\n }\n}\n\nfunction isTabbedContainer(component: LayoutModel) {\n return typeOf(component) === \"Stack\";\n}\n\nfunction isVBox(component: LayoutModel) {\n return (\n typeOf(component) === \"Flexbox\" &&\n component.props.style.flexDirection === \"column\"\n );\n}\n\nfunction isHBox(component: LayoutModel) {\n return (\n typeOf(component) === \"Flexbox\" &&\n component.props.style.flexDirection === \"row\"\n );\n}\n", "import { PopupService } from \"@vuu-ui/vuu-popups\";\nimport { RelativeDropPosition } from \"./BoxModel\";\nimport { DragDropRect } from \"./dragDropTypes\";\nimport { DragState } from \"./DragState\";\nimport { computeMenuPosition, DropMenu } from \"./DropMenu\";\nimport { DropTarget, GuideLine } from \"./DropTarget\";\n\nimport \"./DropTargetRenderer.css\";\n\ntype Point = [number, number];\ntype TabMode = \"full-view\" | \"tab-only\";\n\nlet _multiDropOptions = false;\nlet _hoverDropTarget: DropTarget | null = null;\nlet _shiftedTab: HTMLElement | null = null;\n\nconst onHoverDropTarget = (dropTarget: DropTarget | null) =>\n (_hoverDropTarget = dropTarget);\n\nconst start = ([x, y]: Point) => `M${x},${y}`;\nconst point = ([x, y]: Point) => `L${x},${y}`;\nconst pathFromPoints = ([p1, ...points]: Point[]) =>\n `${start(p1)} ${points.map(point)}Z`;\n\nconst pathFromGuideLines = (guideLines?: GuideLine) => {\n if (guideLines) {\n const [x1, y1, x2, y2, x3, y3, x4, y4] = guideLines;\n return `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`;\n } else {\n return \"\";\n }\n};\n\nfunction insertSVGRoot() {\n if (document.getElementById(\"hw-drag-canvas\") === null) {\n const root = document.getElementById(\"root\");\n const container = document.createElement(\"div\");\n container.id = \"hw-drag-canvas\";\n container.innerHTML = `\n <svg width=\"100%\" height=\"100%\">\n <path id=\"hw-drop-guides\" />\n <path\n id=\"vuu-drop-outline\"\n d=\"M300,132 L380,132 L380,100 L460,100 L460,132, L550,132 L550,350 L300,350z\">\n <animate\n attributeName=\"d\"\n id=\"hw-drop-outline-animate\"\n begin=\"indefinite\"\n dur=\"300ms\"\n fill=\"freeze\"\n to=\"M255,33 L255,33,L255,1,L315,1,L315,1,L794,1,L794,164,L255,164Z\"\n />\n </path>\n </svg>\n `;\n document.body.insertBefore(container, root);\n }\n}\nexport default class DropTargetCanvas {\n private currentPath: string | null = null;\n private tabMode: TabMode | null = null;\n\n constructor() {\n insertSVGRoot();\n }\n\n prepare(dragRect: DragDropRect, tabMode: TabMode = \"full-view\") {\n // don't do this on body\n document.body.classList.add(\"drawing\");\n this.currentPath = null;\n this.tabMode = tabMode;\n\n const points = this.getPoints(0, 0, 0, 0);\n // const points = this.getPoints(left, top, width, height);\n const d = pathFromPoints(points);\n\n const dropOutlinePath = document.getElementById(\"vuu-drop-outline\");\n dropOutlinePath?.setAttribute(\"d\", d);\n this.currentPath = d;\n }\n\n clear() {\n // don't do this on body\n _hoverDropTarget = null;\n clearShiftedTab();\n document.body.classList.remove(\"drawing\");\n PopupService.hidePopup();\n }\n\n get hoverDropTarget() {\n return _hoverDropTarget;\n }\n\n getPoints(\n x: number,\n y: number,\n width: number,\n height: number,\n tabLeft = 0,\n tabWidth = 0,\n tabHeight = 0\n ): Point[] {\n const tabOnly = this.tabMode === \"tab-only\";\n if (tabWidth === 0) {\n return [\n [x, y + tabHeight],\n [x, y + tabHeight],\n [x, y],\n [x + tabWidth, y],\n [x + tabWidth, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n ];\n } else if (tabOnly) {\n const left = tabLeft;\n return [\n [left, y],\n [left, y],\n [left + tabWidth, y],\n [left + tabWidth, y],\n [left + tabWidth, y + tabHeight],\n [left + tabWidth, y + tabHeight],\n [left, y + tabHeight],\n [left, y + tabHeight],\n ];\n } else if (tabLeft === 0) {\n return [\n [x, y + tabHeight],\n [x, y + tabHeight],\n [x, y],\n [x + tabWidth, y],\n [x + tabWidth, y + tabHeight],\n [x + width, y + tabHeight],\n [x + width, y + height],\n [x, y + height],\n ];\n } else {\n return [\n [x, y + tabHeight],\n [x + tabLeft, y + tabHeight],\n [x + tabLeft, y],\n [x + tabLeft, y],\n [x + tabLeft, y + tabHeight],\n [x + width, y + tabHeight],\n [x + width, y + height],\n [x, y + height],\n ];\n }\n }\n\n draw(dropTarget: DropTarget, dragState: DragState) {\n const sameDropTarget = false;\n const wasMultiDrop = _multiDropOptions;\n\n if (_hoverDropTarget !== null) {\n this.drawTarget(_hoverDropTarget);\n } else {\n if (sameDropTarget === false) {\n _multiDropOptions = dropTarget.nextDropTarget != null;\n if (dropTarget.pos.tab) {\n moveExistingTabs(dropTarget);\n } else if (_shiftedTab) {\n clearShiftedTab();\n }\n this.drawTarget(dropTarget, dragState);\n }\n\n if (_multiDropOptions) {\n const [left, top, orientation] = computeMenuPosition(dropTarget);\n if (!wasMultiDrop || !sameDropTarget) {\n const component = (\n <DropMenu\n dropTarget={dropTarget}\n onHover={onHoverDropTarget}\n orientation={orientation}\n />\n );\n PopupService.showPopup({\n left,\n top,\n component,\n });\n }\n } else {\n PopupService.hidePopup();\n }\n }\n }\n\n drawTarget(dropTarget: DropTarget, dragState?: DragState) {\n const lineWidth = 6;\n\n const targetDropOutline = dropTarget.getTargetDropOutline(\n lineWidth,\n dragState\n );\n\n if (targetDropOutline) {\n const { l, t, r, b, tabLeft, tabWidth, tabHeight, guideLines } =\n targetDropOutline;\n const w = r - l;\n const h = b - t;\n\n if (this.currentPath) {\n const path = document.getElementById(\"vuu-drop-outline\");\n path?.setAttribute(\"d\", this.currentPath);\n }\n\n const points = this.getPoints(l, t, w, h, tabLeft, tabWidth, tabHeight);\n const path = pathFromPoints(points);\n const animation = document.getElementById(\n \"hw-drop-outline-animate\"\n ) as unknown as SVGAnimateElement;\n animation?.setAttribute(\"to\", path);\n animation?.beginElement();\n this.currentPath = path;\n\n const dropGuidePath = document.getElementById(\"hw-drop-guides\");\n dropGuidePath?.setAttribute(\"d\", pathFromGuideLines(guideLines));\n }\n }\n}\n\nconst cssShiftRight = \"transition:margin-left .4s ease-out;margin-left: 63px\";\nconst cssShiftBack = \"transition:margin-left .4s ease-out;margin-left: 0px\";\n\nfunction moveExistingTabs(dropTarget: DropTarget) {\n const { AFTER, BEFORE } = RelativeDropPosition;\n const {\n clientRect: { Stack },\n pos: {\n // tab: { index: tabIndex, positionRelativeToTab }\n tab,\n },\n } = dropTarget;\n\n const { id } = dropTarget.component.props;\n let tabEl = null;\n // console.log(`tabPos = ${tabPos} (width=${tabWidth}) x=${x}`)\n if (Stack && tab && tab.positionRelativeToTab !== AFTER) {\n const tabOffset = tab.positionRelativeToTab === BEFORE ? 1 : 2;\n const selector = `:scope .hwTabstrip > .hwTabstrip-inner > .hwTab:nth-child(${\n tab.index + tabOffset\n })`;\n tabEl = document.getElementById(id)?.querySelector(selector) as HTMLElement;\n if (tabEl) {\n if (_shiftedTab === null || _shiftedTab !== tabEl) {\n tabEl.style.cssText = cssShiftRight;\n if (_shiftedTab) {\n _shiftedTab.style.cssText = cssShiftBack;\n }\n _shiftedTab = tabEl;\n }\n } else {\n clearShiftedTab();\n }\n } else if (tab?.positionRelativeToTab === BEFORE) {\n if (_shiftedTab === null) {\n const selector = \".vuuHeader-title\";\n tabEl = document\n .getElementById(id)\n ?.querySelector(selector) as HTMLElement;\n tabEl.style.cssText = cssShiftRight;\n _shiftedTab = tabEl;\n }\n } else {\n clearShiftedTab();\n }\n}\n\nfunction clearShiftedTab() {\n if (_shiftedTab) {\n _shiftedTab.style.cssText = cssShiftBack;\n _shiftedTab = null;\n }\n}\n", "import cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { DropTarget } from \"./DropTarget\";\n\nimport \"./DropMenu.css\";\n\nexport function computeMenuPosition(\n dropTarget: DropTarget,\n offsetTop = 0,\n offsetLeft = 0\n): [number, number, \"left\" | \"bottom\" | \"right\" | \"top\"] {\n const { pos, clientRect: box } = dropTarget;\n const menuOffset = 20;\n\n return pos.position.West\n ? [box.left - offsetLeft + menuOffset, pos.y - offsetTop, \"left\"]\n : pos.position.South\n ? [pos.x - offsetLeft, box.bottom - offsetTop - menuOffset, \"bottom\"]\n : pos.position.East\n ? [box.right - offsetLeft - menuOffset, pos.y - offsetTop, \"right\"]\n : /* North | Header*/ [\n pos.x - offsetLeft,\n box.top - offsetTop + menuOffset,\n \"top\",\n ];\n}\n\nconst classBase = \"vuuDropMenu\";\n\nexport interface DropMenuProps extends HTMLAttributes<HTMLDivElement> {\n dropTarget: DropTarget;\n onHover: (target: DropTarget | null) => void;\n orientation?: \"left\" | \"top\" | \"right\" | \"bottom\";\n}\n\nexport const DropMenu = ({\n className,\n dropTarget,\n onHover,\n orientation,\n}: DropMenuProps) => {\n const dropTargets = dropTarget.toArray();\n // TODO we have all the information here to draw a mini target map\n // but maybe thats overkill ...\n\n return (\n <div\n className={cx(classBase, className, `${classBase}-${orientation}`)}\n onMouseLeave={() => onHover(null)}\n >\n {dropTargets.map((target, i) => (\n <div\n key={i}\n className={`${classBase}-item`}\n data-icon={i === 0 ? \"column-2A\" : \"column-2B\"}\n onMouseEnter={() => onHover(target)}\n />\n ))}\n </div>\n );\n};\n", "import { rect } from \"@vuu-ui/vuu-utils\";\nimport { ReactElement } from \"react\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { findTarget, followPath, getProps } from \"../utils\";\nimport { BoxModel, Measurements } from \"./BoxModel\";\nimport { DragDropRect } from \"./dragDropTypes\";\nimport { DragState, IntrinsicSizes } from \"./DragState\";\nimport { DropTarget, identifyDropTarget } from \"./DropTarget\";\nimport DropTargetRenderer from \"./DropTargetRenderer\";\n\nexport type DragStartCallback = (e: MouseEvent, x: number, y: number) => void;\nexport type DragMoveCallback = (\n x: number | undefined,\n y: number | undefined\n) => void;\nexport type DragEndCallback = (droppedTarget?: Partial<DropTarget>) => void;\nexport type DragInstructions = {\n DoNotRemove?: boolean;\n DoNotTransform?: boolean;\n dragThreshold?: number;\n DriftHomeIfNoDropTarget?: boolean;\n RemoveDraggableOnDragEnd?: boolean;\n};\n\nlet _dragStartCallback: DragStartCallback | null;\nlet _dragMoveCallback: DragMoveCallback | null;\nlet _dragEndCallback: DragEndCallback | null;\n\nlet _dragStartX: number;\nlet _dragStartY: number;\nlet _dragContainer: ReactElement | undefined;\nlet _dragState: DragState;\nlet _dropTarget: DropTarget | null = null;\nlet _validDropTargetPaths: string[] | undefined;\nlet _dragInstructions: DragInstructions;\nlet _measurements: Measurements;\nlet _simpleDrag: boolean;\nlet _dragThreshold: number;\nlet _mouseDownTimer: number | null = null;\n\nconst DEFAULT_DRAG_THRESHOLD = 3;\nconst _dropTargetRenderer = new DropTargetRenderer();\nconst SCALE_FACTOR = 0.4;\n\nfunction getDragContainer(\n rootContainer: ReactElement,\n dragContainerPath: string\n) {\n if (dragContainerPath) {\n return followPath(rootContainer, dragContainerPath) as ReactElement;\n } else {\n return findTarget(\n rootContainer,\n // TODO dropTarget is not good\n (props) => props.dropTarget\n ) as ReactElement;\n }\n}\n\nexport const Draggable = {\n handleMousedown(\n e: MouseEvent,\n dragStartCallback: DragStartCallback,\n dragInstructions: DragInstructions = {}\n ) {\n _dragStartCallback = dragStartCallback;\n _dragInstructions = dragInstructions;\n\n _dragStartX = e.clientX;\n _dragStartY = e.clientY;\n\n _dragThreshold =\n dragInstructions.dragThreshold === undefined\n ? DEFAULT_DRAG_THRESHOLD\n : dragInstructions.dragThreshold;\n\n if (_dragThreshold === 0) {\n // maybe this should be -1\n _dragStartCallback(e, 0, 0);\n } else {\n window.addEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.addEventListener(\"mouseup\", preDragMouseupHandler, false);\n\n _mouseDownTimer = window.setTimeout(() => {\n window.removeEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", preDragMouseupHandler, false);\n _dragStartCallback?.(e, 0, 0);\n }, 500);\n }\n\n e.preventDefault();\n },\n\n // called from handleDragStart (_dragCallback)\n initDrag(\n rootContainer: ReactElement,\n dragContainerPath: string,\n { top, left, right, bottom }: rect,\n dragPos: { x: number; y: number },\n dragHandler: {\n drag: DragMoveCallback;\n drop: DragEndCallback;\n },\n intrinsicSize?: IntrinsicSizes,\n dropTargets?: string[]\n ) {\n ({ drag: _dragMoveCallback, drop: _dragEndCallback } = dragHandler);\n return initDrag(\n rootContainer,\n dragContainerPath,\n { top, left, right, bottom } as DragDropRect,\n dragPos,\n intrinsicSize,\n dropTargets\n );\n },\n};\n\nfunction preDragMousemoveHandler(e: MouseEvent) {\n const x = true;\n const y = true;\n\n const x_diff = x ? e.clientX - _dragStartX : 0;\n const y_diff = y ? e.clientY - _dragStartY : 0;\n const mouseMoveDistance = Math.max(Math.abs(x_diff), Math.abs(y_diff));\n\n // when we do finally move the draggee, we are going to 'jump' by the amount of the drag threshold, should we\n // attempt to animate this ?\n if (mouseMoveDistance > _dragThreshold) {\n window.removeEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", preDragMouseupHandler, false);\n _dragStartCallback?.(e, x_diff, y_diff);\n _dragStartCallback = null;\n }\n}\n\nfunction preDragMouseupHandler() {\n if (_mouseDownTimer) {\n window.clearTimeout(_mouseDownTimer);\n _mouseDownTimer = null;\n }\n window.removeEventListener(\"mousemove\", preDragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", preDragMouseupHandler, false);\n}\n\nfunction initDrag(\n rootContainer: ReactElement,\n dragContainerPath: string,\n dragRect: DragDropRect,\n dragPos: { x: number; y: number },\n intrinsicSize?: IntrinsicSizes,\n dropTargets?: string[]\n) {\n _dragContainer = getDragContainer(rootContainer, dragContainerPath);\n\n const { \"data-path\": dataPath, path = dataPath } = getProps(_dragContainer);\n\n if (dropTargets) {\n const dropPaths = dropTargets\n .map((id) => findTarget(rootContainer, (props) => props.id === id))\n .map((target) => (target as LayoutModel).props.path);\n _validDropTargetPaths = dropPaths;\n }\n\n // const start = window.performance.now();\n // translate the layout $position to drag-oriented co-ordinates, ignoring splitters\n\n _measurements = BoxModel.measure(_dragContainer, dropTargets);\n // console.log({ _measurements });\n // onsole.log({ measurements: _measurements });\n // const end = window.performance.now();\n // console.log(`[Draggable] measurements took ${end - start}ms`, _measurements);\n\n const dragZone = _measurements[path];\n\n _dragState = new DragState(\n dragZone,\n dragPos.x,\n dragPos.y,\n dragRect,\n intrinsicSize\n );\n\n const pctX = Math.round(_dragState.x.mousePct * 100);\n const pctY = Math.round(_dragState.y.mousePct * 100);\n\n window.addEventListener(\"mousemove\", dragMousemoveHandler, false);\n window.addEventListener(\"mouseup\", dragMouseupHandler, false);\n window.addEventListener(\"keydown\", dragKeydownHandler, false);\n\n _simpleDrag = false;\n\n _dropTargetRenderer.prepare(dragRect, \"tab-only\");\n\n return _dragInstructions.DoNotTransform\n ? \"transform:none\"\n : // scale factor should be applied in caller, not here\n `transform:scale(${SCALE_FACTOR},${SCALE_FACTOR});transform-origin:${pctX}% ${pctY}%;`;\n}\n\nfunction dragMousemoveHandler(evt: MouseEvent) {\n const x = evt.clientX;\n const y = evt.clientY;\n const dragState = _dragState;\n const currentDropTarget = _dropTarget;\n let dropTarget;\n let newX, newY;\n\n if (dragState.update(\"x\", x)) {\n newX = dragState.x.pos;\n }\n\n if (dragState.update(\"y\", y)) {\n newY = dragState.y.pos;\n }\n\n if (newX === undefined && newY === undefined) {\n //onsole.log('both x and y are unchanged');\n } else {\n _dragMoveCallback?.(newX, newY);\n }\n\n if (_simpleDrag || _dragContainer === undefined) {\n return;\n }\n\n if (dragState.inBounds()) {\n dropTarget = identifyDropTarget(\n x,\n y,\n _dragContainer,\n _measurements,\n dragState.hasIntrinsicSize(),\n _validDropTargetPaths\n );\n } else {\n dropTarget = identifyDropTarget(\n dragState.dropX(),\n dragState.dropY(),\n _dragContainer,\n _measurements\n );\n }\n\n // did we have an existing droptarget which is no longer such ...\n if (currentDropTarget) {\n if (dropTarget == null || dropTarget.box !== currentDropTarget.box) {\n _dropTarget = null;\n }\n }\n\n if (dropTarget) {\n _dropTargetRenderer.draw(dropTarget, dragState);\n _dropTarget = dropTarget;\n }\n}\n\nfunction dragKeydownHandler(evt: KeyboardEvent) {\n if (evt.key === \"Escape\") {\n _dropTarget = null;\n onDragEnd();\n }\n}\n\nfunction dragMouseupHandler() {\n onDragEnd();\n}\n\nfunction onDragEnd() {\n if (_dropTarget) {\n const dropTarget =\n _dropTargetRenderer.hoverDropTarget ||\n DropTarget.getActiveDropTarget(_dropTarget);\n\n _dragEndCallback?.(dropTarget as DropTarget);\n\n _dropTarget = null;\n } else {\n _dragEndCallback?.();\n }\n\n _dragMoveCallback = null;\n _dragEndCallback = null;\n\n _dragContainer = undefined;\n _dropTargetRenderer.clear();\n _validDropTargetPaths = undefined;\n window.removeEventListener(\"mousemove\", dragMousemoveHandler, false);\n window.removeEventListener(\"mouseup\", dragMouseupHandler, false);\n window.removeEventListener(\"keydown\", dragKeydownHandler, false);\n}\n", "import classnames from \"clsx\";\nimport { ForwardedRef, forwardRef, HTMLAttributes } from \"react\";\nimport { registerComponent } from \"./registry/ComponentRegistry\";\n\nimport \"./DraggableLayout.css\";\n\nexport interface DraggableLayoutProps extends HTMLAttributes<HTMLDivElement> {\n dropTarget?: boolean;\n resizeable?: boolean;\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const DraggableLayout = forwardRef(function DraggableLayout(\n {\n children,\n className: classNameProp,\n dropTarget,\n resizeable: _, // ignore, its just a marker used by the layout system\n ...htmlAttributes\n }: DraggableLayoutProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const className = classnames(\"DraggableLayout\", classNameProp);\n return (\n <div className={className} ref={forwardedRef} {...htmlAttributes}>\n {children}\n </div>\n );\n});\n\nconst componentName = \"DraggableLayout\";\n\nDraggableLayout.displayName = componentName;\n\nregisterComponent(componentName, DraggableLayout, \"container\");\n", "import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { CSSProperties, ForwardedRef, forwardRef } from \"react\";\nimport { FlexboxProps } from \"./flexboxTypes\";\nimport { useSplitterResizing } from \"./useSplitterResizing\";\n\nimport \"./Flexbox.css\";\n\nconst classBase = \"hwFlexbox\";\n\nconst Flexbox = forwardRef(function Flexbox(\n props: FlexboxProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const {\n breakPoints,\n children,\n // cols: colsProp,\n column,\n className: classNameProp,\n flexFill,\n gap,\n fullPage,\n id,\n onSplitterMoved,\n resizeable,\n row,\n spacing,\n splitterSize,\n style,\n ...rest\n } = props;\n\n const { content, rootRef } = useSplitterResizing({\n children,\n // cols: colsProp,\n onSplitterMoved,\n style,\n });\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-column`]: column,\n [`${classBase}-row`]: row,\n \"flex-fill\": flexFill,\n \"full-page\": fullPage,\n });\n\n return (\n <div\n {...rest}\n className={className}\n // data-cols={cols}\n data-resizeable={resizeable || undefined}\n id={id}\n ref={useForkRef(rootRef, ref)}\n style={\n {\n ...style,\n gap,\n \"--spacing\": spacing,\n } as CSSProperties\n }\n >\n {content}\n </div>\n );\n});\nFlexbox.displayName = \"Flexbox\";\n\nexport default Flexbox;\n", "import { getUniqueId } from \"@vuu-ui/vuu-utils\";\nimport React, {\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Placeholder } from \"../placeholder\";\nimport { Splitter } from \"./Splitter\";\n\nimport {\n findSplitterAndPlaceholderPositions,\n gatherChildMeta,\n identifyResizeParties,\n PLACEHOLDER,\n SPLITTER,\n} from \"./flexbox-utils\";\nimport {\n ContentMeta,\n FlexSize,\n SplitterFactory,\n SplitterHookProps,\n SplitterHookResult,\n} from \"./flexboxTypes\";\n\nconst originalContentOnly = (meta: ContentMeta) =>\n !meta.splitter && !meta.placeholder;\n\nexport const useSplitterResizing = ({\n children: childrenProp,\n onSplitterMoved,\n style,\n}: SplitterHookProps): SplitterHookResult => {\n const rootRef = useRef<HTMLDivElement>(null);\n const metaRef = useRef<ContentMeta[]>();\n const contentRef = useRef<ReactElement[]>();\n const assignedKeys = useRef([]);\n const [, forceUpdate] = useState({});\n\n const setContent = (content: ReactElement[]) => {\n contentRef.current = content;\n forceUpdate({});\n };\n\n const isColumn = style?.flexDirection === \"column\";\n const dimension = isColumn ? \"height\" : \"width\";\n const children = useMemo(\n () =>\n Array.isArray(childrenProp)\n ? childrenProp\n : React.isValidElement(childrenProp)\n ? [childrenProp]\n : [],\n [childrenProp]\n );\n\n const handleDragStart = useCallback(\n (index) => {\n const { current: contentMeta } = metaRef;\n if (contentMeta) {\n const [participants, bystanders] = identifyResizeParties(\n contentMeta,\n index\n );\n if (participants) {\n participants.forEach((index) => {\n const el = rootRef.current?.childNodes[index] as HTMLElement;\n if (el) {\n const { size, minSize } = measureElement(el, dimension);\n contentMeta[index].currentSize = size;\n contentMeta[index].minSize = minSize;\n }\n });\n if (bystanders) {\n bystanders.forEach((index) => {\n const el = rootRef.current?.childNodes[index] as HTMLElement;\n if (el) {\n const { [dimension]: size } = el.getBoundingClientRect();\n contentMeta[index].flexBasis = size;\n }\n });\n }\n }\n }\n },\n [dimension]\n );\n\n const handleDrag = useCallback(\n (idx, distance) => {\n if (contentRef.current && metaRef.current) {\n setContent(\n resizeContent(\n contentRef.current,\n metaRef.current,\n distance,\n dimension\n )\n );\n }\n },\n [dimension]\n );\n\n const handleDragEnd = useCallback(() => {\n const contentMeta = metaRef.current;\n if (contentMeta) {\n onSplitterMoved?.(contentMeta.filter(originalContentOnly));\n }\n contentMeta?.forEach((meta) => {\n meta.currentSize = undefined;\n meta.flexBasis = undefined;\n meta.flexOpen = false;\n });\n }, [onSplitterMoved]);\n\n const createSplitter: SplitterFactory = useCallback(\n (i) => {\n return React.createElement(Splitter, {\n column: isColumn,\n index: i,\n key: `splitter-${i}`,\n onDrag: handleDrag,\n onDragEnd: handleDragEnd,\n onDragStart: handleDragStart,\n });\n },\n [handleDrag, handleDragEnd, handleDragStart, isColumn]\n );\n\n useMemo(() => {\n const [content, meta] = buildContent(\n children,\n dimension,\n createSplitter,\n assignedKeys.current\n );\n metaRef.current = meta;\n contentRef.current = content;\n }, [children, createSplitter, dimension]);\n\n return {\n content: contentRef.current || [],\n rootRef,\n };\n};\n\nfunction buildContent(\n children: ReactElement[],\n dimension: \"width\" | \"height\",\n createSplitter: SplitterFactory,\n keys: any[]\n): [any[], ContentMeta[]] {\n const childMeta = gatherChildMeta(children, dimension);\n const splitterAndPlaceholderPositions =\n findSplitterAndPlaceholderPositions(childMeta);\n const content = [];\n const meta: ContentMeta[] = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (i === 0 && splitterAndPlaceholderPositions[i] & PLACEHOLDER) {\n content.push(createPlaceholder(i));\n meta.push({ placeholder: true, shim: true });\n }\n if (child.key == null) {\n const key = keys[i] || (keys[i] = getUniqueId());\n content.push(React.cloneElement(child, { key }));\n } else {\n content.push(child);\n }\n meta.push(childMeta[i]);\n\n if (i > 0 && splitterAndPlaceholderPositions[i] & PLACEHOLDER) {\n content.push(createPlaceholder(i));\n meta.push({ placeholder: true });\n } else if (splitterAndPlaceholderPositions[i] & SPLITTER) {\n content.push(createSplitter(content.length));\n meta.push({ splitter: true });\n }\n }\n return [content, meta];\n}\n\nfunction resizeContent(\n content: ReactElement[],\n contentMeta: ContentMeta[],\n distance: number,\n dimension: \"width\" | \"height\"\n) {\n const metaUpdated = updateMeta(contentMeta, distance);\n if (!metaUpdated) {\n return content;\n }\n\n return content.map((child, idx) => {\n const meta = contentMeta[idx];\n const { currentSize, flexOpen, flexBasis } = meta;\n const hasCurrentSize = currentSize !== undefined;\n if (hasCurrentSize || flexOpen) {\n const { flexBasis: actualFlexBasis } = child.props.style || {};\n const size = hasCurrentSize ? meta.currentSize : flexBasis;\n if (size !== actualFlexBasis) {\n return React.cloneElement(child, {\n style: {\n ...child.props.style,\n flexBasis: size,\n [dimension]: \"auto\",\n },\n });\n } else {\n return child;\n }\n } else {\n return child;\n }\n });\n}\n\n//TODO detect cursor move beyond drag limit and suspend further resize until cursoe re-engages with splitter\nfunction updateMeta(contentMeta: ContentMeta[], distance: number) {\n const resizeTargets: number[] = [];\n\n contentMeta.forEach((meta, idx) => {\n if (meta.currentSize !== undefined) {\n resizeTargets.push(idx);\n }\n });\n\n // we want the target being reduced first, this may limit the distance we can apply\n const target1 = distance < 0 ? resizeTargets[0] : resizeTargets[1];\n\n const { currentSize = 0, minSize = 0 } = contentMeta[target1];\n if (currentSize === minSize) {\n // size is already 0, we cannot go further\n return false;\n } else if (Math.abs(distance) > currentSize - minSize) {\n // reduce to 0\n const multiplier = distance < 0 ? -1 : 1;\n distance = Math.max(0, currentSize - minSize) * multiplier;\n }\n\n const leadingItem = contentMeta[resizeTargets[0]] as ContentMeta;\n const { currentSize: leadingSize = 0 } = leadingItem;\n leadingItem.currentSize = leadingSize + distance;\n\n const trailingItem = contentMeta[resizeTargets[1]] as ContentMeta;\n const { currentSize: trailingSize = 0 } = trailingItem;\n trailingItem.currentSize = trailingSize - distance;\n\n return true;\n}\n\nfunction createPlaceholder(index: number) {\n return React.createElement(Placeholder, {\n shim: index === 0,\n key: `placeholder-${index}`,\n } as any);\n}\n\nfunction measureElement(\n el: HTMLElement,\n dimension: \"width\" | \"height\"\n): FlexSize {\n const { [dimension]: size } = el.getBoundingClientRect();\n const style = getComputedStyle(el);\n const minSizeVal = style.getPropertyValue(`min-${dimension}`);\n const minSize = minSizeVal.endsWith(\"px\") ? parseInt(minSizeVal, 10) : 0;\n return { size, minSize };\n}\n", "import cx from \"clsx\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { LayoutStartPanel } from \"./LayoutStartPanel\";\nimport { View, ViewProps } from \"../layout-view\";\n\nimport \"./Placeholder.css\";\n\nconst classBase = \"vuuPlaceholder\";\n\nexport interface PlaceholderProps extends ViewProps {\n closeable?: boolean;\n flexFill?: boolean;\n resizeable?: boolean;\n showStartMenu?: boolean;\n /**\n * shim is only when we're dealing with intrinsically sized children, which is never\n * in an actual application. Intrinsic sizing is still experimental.\n */\n shim?: boolean;\n}\n\nconst PlaceholderCore = ({ showStartMenu = true }: PlaceholderProps) => {\n return <>{showStartMenu ? <LayoutStartPanel /> : null}</>;\n};\n\nexport const Placeholder = ({\n className: classNameProp,\n showStartMenu,\n ...viewProps\n}: PlaceholderProps) => {\n const className = cx(classBase, classNameProp);\n\n return (\n <View {...viewProps} className={className} data-placeholder resizeable>\n <PlaceholderCore showStartMenu={showStartMenu} />\n </View>\n );\n};\n\nPlaceholder.displayName = \"Placeholder\";\nregisterComponent(\"Placeholder\", Placeholder);\n", "import { Button } from \"@salt-ds/core\";\nimport { HTMLAttributes, useMemo, useState } from \"react\";\nimport { QueryReponse, useViewContext } from \"../layout-view\";\n\nimport \"./LayoutStartPanel.css\";\n\nconst classBase = \"vuuLayoutStartPanel\";\n\nexport interface LayoutStartPanelProps extends HTMLAttributes<HTMLDivElement> {\n label?: string;\n}\n\nexport const LayoutStartPanel = (htmlAttributes: LayoutStartPanelProps) => {\n const { dispatch, path } = useViewContext();\n const [displayState, setDisplayState] = useState<\n \"initial\" | \"nested\" | undefined\n >();\n\n useMemo(() => {\n dispatch?.({\n type: \"query\",\n path,\n query: \"PARENT_CONTAINER\",\n }).then((response) => {\n if ((response as QueryReponse)?.parentContainerId === \"main-tabs\") {\n setDisplayState(\"initial\");\n } else {\n setDisplayState(\"nested\");\n }\n });\n }, [dispatch, path]);\n\n if (displayState === undefined) {\n return null;\n }\n\n const showInitialState = displayState === \"initial\";\n\n return (\n <div {...htmlAttributes} className={classBase}>\n {showInitialState ? (\n <>\n <header className={`${classBase}-title`}>\n Start by adding a table\n </header>\n <div className={`${classBase}-text`}>\n To add a table, drag any of the Vuu Tables to this area or click the\n button below\n </div>\n </>\n ) : null}\n <Button\n className={`${classBase}-addButton`}\n data-icon=\"add\"\n variant=\"cta\"\n />\n </div>\n );\n};\n", "import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport {\n ReactElement,\n RefObject,\n SyntheticEvent,\n useCallback,\n useState,\n} from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { DragStartAction } from \"../layout-reducer\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { QueryReponse, ViewDispatch } from \"./ViewContext\";\nimport { ViewAction } from \"./viewTypes\";\n\nexport type ContributionLocation = \"post-title\" | \"pre-title\";\n\nexport type Contribution = {\n index?: number;\n location?: ContributionLocation;\n content: ReactElement;\n};\n\nexport const useViewActionDispatcher = (\n id: string,\n root: RefObject<HTMLDivElement>,\n viewPath?: string,\n dropTargets?: string[]\n): [ViewDispatch, Contribution[] | undefined] => {\n const { loadSessionState, purgeSessionState, purgeState, saveSessionState } =\n usePersistentState();\n\n const [contributions, setContributions] = useState<Contribution[]>(\n loadSessionState(id, \"contributions\") ?? []\n );\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const updateContributions = useCallback(\n (location: ContributionLocation, content: ReactElement) => {\n const updatedContributions = contributions.concat([\n { location, content },\n ]);\n saveSessionState(id, \"contributions\", updatedContributions);\n setContributions(updatedContributions);\n },\n [contributions, id, saveSessionState]\n );\n\n const clearContributions = useCallback(() => {\n purgeSessionState(id, \"contributions\");\n setContributions([]);\n }, [id, purgeSessionState]);\n\n const handleRemove = useCallback(() => {\n const ds = loadSessionState(id, \"data-source\") as DataSource;\n if (ds) {\n ds.unsubscribe();\n }\n purgeSessionState(id);\n purgeState(id);\n dispatchLayoutAction({ type: \"remove\", path: viewPath });\n }, [\n dispatchLayoutAction,\n id,\n loadSessionState,\n purgeSessionState,\n purgeState,\n viewPath,\n ]);\n\n const handleMouseDown = useCallback(\n async (evt, index, preDragActivity): Promise<boolean> => {\n evt.stopPropagation();\n const dragRect = root.current?.getBoundingClientRect();\n return new Promise((resolve, reject) => {\n dispatchLayoutAction({\n type: \"drag-start\",\n evt,\n path: index === undefined ? viewPath : `${viewPath}.${index}`,\n dragRect,\n preDragActivity,\n dropTargets,\n resolveDragStart: resolve,\n rejectDragStart: reject,\n } as DragStartAction);\n });\n },\n [root, dispatchLayoutAction, viewPath, dropTargets]\n );\n\n const dispatchAction = useCallback(\n async <A extends ViewAction = ViewAction>(\n action: A,\n evt?: SyntheticEvent\n ): Promise<boolean | QueryReponse | void> => {\n const { type } = action;\n switch (type) {\n case \"maximize\":\n case \"minimize\":\n case \"restore\":\n return dispatchLayoutAction({ type, path: action.path ?? viewPath });\n case \"remove\":\n return handleRemove();\n case \"mousedown\":\n return handleMouseDown(evt, action.index, action.preDragActivity);\n case \"add-toolbar-contribution\":\n return updateContributions(action.location, action.content);\n case \"remove-toolbar-contribution\":\n return clearContributions();\n case \"query\":\n return dispatchLayoutAction({\n type,\n path: action.path,\n query: action.query,\n });\n return;\n default: {\n return undefined;\n }\n }\n },\n [\n dispatchLayoutAction,\n viewPath,\n handleRemove,\n handleMouseDown,\n updateContributions,\n clearContributions,\n ]\n );\n\n return [dispatchAction, contributions];\n};\n", "import {\n MutableRefObject,\n ReactElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n LayoutActionType,\n LayoutChangeHandler,\n LayoutChangeReason,\n layoutFromJson,\n LayoutJSON,\n layoutQuery,\n layoutReducer,\n LayoutReducerAction,\n layoutToJSON,\n processLayoutElement,\n SaveAction,\n} from \"../layout-reducer\";\nimport { findTarget, getChildProp, getProp, getProps, typeOf } from \"../utils\";\nimport {\n LayoutProviderContext,\n LayoutProviderDispatch,\n} from \"./LayoutProviderContext\";\nimport { useLayoutDragDrop } from \"./useLayoutDragDrop\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst withDropTarget = (props: any) => props.dropTarget;\nconst shouldSave = (action: LayoutReducerAction) =>\n [\n \"drag-drop\",\n \"remove\",\n \"set-title\",\n \"splitter-resize\",\n \"switch-tab\",\n ].includes(action.type);\n\nconst getLayoutChangeReason = (\n action: LayoutReducerAction | SaveAction\n): LayoutChangeReason => {\n switch (action.type) {\n case \"switch-tab\":\n // TODO how can we make this more robust, shouldn't rely on 'main-tabs'\n if (action.id === \"main-tabs\") {\n return \"switch-active-layout\";\n } else {\n return \"switch-active-tab\";\n }\n case \"save\":\n return \"save-feature-props\";\n case \"drag-drop\":\n return \"drag-drop-operation\";\n case \"remove\":\n return \"remove-component\";\n case \"splitter-resize\":\n return \"resize-component\";\n case \"set-title\":\n return \"edit-feature-title\";\n default:\n throw Error(\"unknown layout action\");\n }\n};\n\nexport interface LayoutProviderProps {\n children: ReactElement;\n createNewChild?: (index?: number) => ReactElement;\n pathToDropTarget?: string;\n layout?: LayoutJSON;\n onLayoutChange?: LayoutChangeHandler;\n}\n\nexport const LayoutProviderVersion = () => {\n const version = useLayoutProviderVersion();\n return <div>{`Context: ${version} `}</div>;\n};\n\nexport const LayoutProvider = (props: LayoutProviderProps): ReactElement => {\n const { children, createNewChild, pathToDropTarget, layout, onLayoutChange } =\n props;\n const state = useRef<ReactElement | undefined>(undefined);\n const childrenRef = useRef<ReactElement>(children);\n\n const [, forceRefresh] = useState<unknown>(null);\n\n const serializeState = useCallback(\n (source, layoutChangeReason: LayoutChangeReason) => {\n if (onLayoutChange) {\n const targetContainer =\n findTarget(source, withDropTarget) || state.current;\n const isDraggableLayout = typeOf(targetContainer) === \"DraggableLayout\";\n const target = isDraggableLayout\n ? getProps(targetContainer).children[0]\n : targetContainer;\n const serializedModel = layoutToJSON(target);\n onLayoutChange(serializedModel, layoutChangeReason);\n }\n },\n [onLayoutChange]\n );\n\n const dispatchLayoutAction = useCallback(\n (action: LayoutReducerAction, suppressSave = false) => {\n const nextState = layoutReducer(state.current as ReactElement, action);\n if (nextState !== state.current) {\n state.current = nextState;\n forceRefresh({});\n if (!suppressSave && shouldSave(action)) {\n serializeState(nextState, getLayoutChangeReason(action));\n }\n }\n },\n [forceRefresh, serializeState]\n );\n\n const layoutActionDispatcher = useCallback<LayoutProviderDispatch>(\n (action) => {\n switch (action.type) {\n case \"drag-start\": {\n prepareToDragLayout(action);\n break;\n }\n case \"save\": {\n serializeState(state.current, getLayoutChangeReason(action));\n break;\n }\n case \"query\":\n if (action.query === \"PARENT_CONTAINER\") {\n return layoutQuery(action.query, action.path, state.current);\n }\n break;\n\n default: {\n dispatchLayoutAction(action);\n break;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatchLayoutAction, serializeState]\n );\n\n const prepareToDragLayout = useLayoutDragDrop(\n state as MutableRefObject<ReactElement>,\n layoutActionDispatcher,\n pathToDropTarget\n );\n\n useEffect(() => {\n if (layout) {\n const targetContainer = findTarget(\n state.current as never,\n withDropTarget\n ) as ReactElement;\n if (targetContainer) {\n const target = getChildProp(targetContainer);\n const newLayout = layoutFromJson(\n layout,\n `${targetContainer.props.path}.0`\n );\n const action = target\n ? {\n type: LayoutActionType.REPLACE,\n target,\n replacement: newLayout,\n }\n : {\n type: LayoutActionType.ADD,\n path: targetContainer.props.path,\n component: newLayout,\n };\n dispatchLayoutAction(action, true);\n } else if (layout.id === getProp(state.current, \"id\")) {\n const newLayout = layoutFromJson(layout, \"0\");\n const action = {\n type: LayoutActionType.REPLACE,\n target: state.current,\n replacement: newLayout,\n };\n dispatchLayoutAction(action, true);\n }\n }\n }, [dispatchLayoutAction, layout]);\n\n if (state.current === undefined) {\n state.current = processLayoutElement(children);\n } else if (children !== childrenRef.current) {\n state.current = processLayoutElement(children, state.current);\n childrenRef.current = children;\n }\n\n return (\n <LayoutProviderContext.Provider\n value={{\n createNewChild,\n dispatchLayoutProvider: layoutActionDispatcher,\n version: 0,\n }}\n >\n {state.current}\n </LayoutProviderContext.Provider>\n );\n};\n\nexport const useLayoutProviderDispatch = () => {\n const { dispatchLayoutProvider } = useContext(LayoutProviderContext);\n return dispatchLayoutProvider;\n};\n\nexport const useLayoutCreateNewChild = () => {\n const { createNewChild } = useContext(LayoutProviderContext);\n return createNewChild;\n};\n\nexport const useLayoutProviderVersion = () => {\n const { version } = useContext(LayoutProviderContext);\n return version;\n};\n", "import { dimension, rect, rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { getProps, resetPath } from \"../utils\";\nconst placeHolderProps = { \"data-placeholder\": true, \"data-resizeable\": true };\n\nconst NO_STYLE = {};\nconst auto = \"auto\";\nconst defaultFlexStyle = {\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n height: auto,\n width: auto,\n};\n\nconst CROSS_DIMENSION = {\n height: \"width\",\n width: \"height\",\n};\n\nexport type flexDirection = \"row\" | \"column\";\n\ntype contraDimension = dimension;\ntype flexDimensionTuple = [dimension, contraDimension, flexDirection];\nexport type position = {\n height?: number;\n width?: number;\n};\n\nexport const getFlexDimensions = (flexDirection: flexDirection = \"row\") => {\n if (flexDirection === \"row\") {\n return [\"width\", \"height\", \"column\"] as flexDimensionTuple;\n } else {\n return [\"height\", \"width\", \"row\"] as flexDimensionTuple;\n }\n};\n\nconst isPercentageSize = (value: string | number) =>\n typeof value === \"string\" && value.endsWith(\"%\");\n\nexport const getIntrinsicSize = (\n component: ReactElement\n): { height?: number; width?: number } | undefined => {\n const { style: { width = auto, height = auto } = NO_STYLE } = component.props;\n\n const numHeight = typeof height === \"number\";\n const numWidth = typeof width === \"number\";\n\n if (numHeight && numWidth) {\n return { height, width };\n } else if (numHeight) {\n return { height };\n } else if (numWidth) {\n return { width };\n } else {\n return undefined;\n }\n};\n\nexport function getFlexStyle(\n component: ReactElement,\n dimension: dimension,\n pos?: DropPos\n) {\n const crossDimension = CROSS_DIMENSION[dimension];\n const {\n style: {\n [crossDimension]: intrinsicCrossSize = auto,\n ...intrinsicStyles\n } = NO_STYLE,\n } = component.props;\n\n if (pos && pos[dimension]) {\n return {\n ...intrinsicStyles,\n ...defaultFlexStyle,\n flexBasis: pos[dimension],\n flexGrow: 0,\n flexShrink: 0,\n };\n } else {\n return {\n ...intrinsicStyles,\n ...defaultFlexStyle,\n [crossDimension]: intrinsicCrossSize,\n };\n }\n}\n\nexport function hasUnboundedFlexStyle(component: ReactElement) {\n const { style: { flex, flexGrow, flexShrink, flexBasis } = NO_STYLE } =\n component.props;\n if (typeof flex === \"number\") {\n return true;\n }\n if (flexBasis === 0 && flexGrow === 1 && flexShrink === 1) {\n return true;\n }\n if (typeof flexBasis === \"number\") {\n return false;\n }\n return true;\n}\n\nexport function getFlexOrIntrinsicStyle(\n component: ReactElement,\n dimension: dimension,\n pos: position\n) {\n const crossDimension = CROSS_DIMENSION[dimension];\n const {\n style: {\n [dimension]: intrinsicSize = auto,\n [crossDimension]: intrinsicCrossSize = auto,\n ...intrinsicStyles\n } = NO_STYLE,\n } = component.props;\n\n if (intrinsicSize !== auto) {\n if (isPercentageSize(intrinsicSize)) {\n return {\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n [dimension]: undefined,\n [crossDimension]: intrinsicCrossSize,\n };\n }\n return {\n flexBasis: intrinsicSize,\n flexGrow: 0,\n flexShrink: 0,\n [dimension]: intrinsicSize,\n [crossDimension]: intrinsicCrossSize,\n };\n }\n if (pos && pos[dimension]) {\n return {\n ...intrinsicStyles,\n ...defaultFlexStyle,\n flexBasis: pos[dimension],\n flexGrow: 0,\n flexShrink: 0,\n };\n }\n return {\n ...intrinsicStyles,\n [crossDimension]: intrinsicCrossSize,\n };\n}\n\nexport function wrapIntrinsicSizeComponentWithFlexbox(\n component: ReactElement,\n flexDirection: flexDirection,\n path: string,\n clientRect?: rect,\n dropRect?: rectTuple\n) {\n const wrappedChildren = [];\n let pathIndex = 0;\n let endPlaceholder;\n\n if (clientRect && dropRect) {\n let startPlaceholder;\n const [dropLeft, dropTop, dropRight, dropBottom] = dropRect;\n [startPlaceholder, endPlaceholder] =\n flexDirection === \"column\"\n ? [dropTop - clientRect.top, clientRect.bottom - dropBottom]\n : [dropLeft - clientRect.left, clientRect.right - dropRight];\n\n if (startPlaceholder) {\n wrappedChildren.push(\n createPlaceHolder(`${path}.${pathIndex++}`, startPlaceholder, {\n flexGrow: 0,\n flexShrink: 0,\n })\n );\n }\n } else {\n endPlaceholder = true;\n }\n\n const { version = 0, style } = getProps(component);\n\n wrappedChildren.push(\n resetPath(component, `${path}.${pathIndex++}`, {\n version: version + 1,\n style: {\n ...style,\n flexBasis: \"auto\",\n flexGrow: 0,\n flexShrink: 0,\n },\n })\n );\n\n if (endPlaceholder) {\n wrappedChildren.push(\n createPlaceHolder(`${path}.${pathIndex++}`, 0, undefined, {\n [`data-${flexDirection}-placeholder`]: true,\n })\n );\n }\n\n return createFlexbox(\n flexDirection,\n { resizeable: false, style: { flexBasis: \"auto\" } },\n wrappedChildren,\n path\n );\n}\n\nconst getFlexValue = (\n flexBasis: number,\n flexFill: boolean\n): number | undefined => {\n if (flexFill) {\n return undefined;\n }\n return flexBasis === 0 ? 1 : 0;\n};\n\nexport function createFlexbox(\n flexDirection: flexDirection,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: any,\n children: ReactNode,\n path: string\n) {\n const id = uuid();\n const { flexFill, style, resizeable = true } = props;\n const { flexBasis = flexFill ? undefined : \"auto\" } = style;\n const flex = getFlexValue(flexBasis, flexFill);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return React.createElement<any>(\n ComponentRegistry.Flexbox,\n {\n id,\n key: id,\n path,\n flexFill,\n style: {\n ...style,\n flexDirection,\n flexBasis,\n flexGrow: flex,\n flexShrink: flex,\n },\n resizeable,\n },\n children\n );\n}\n\nconst baseStyle = { flexGrow: 1, flexShrink: 1 };\n\nexport function createPlaceHolder(\n path: string,\n size: number,\n style?: CSSProperties,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props?: any\n) {\n const id = uuid();\n return React.createElement(\"div\", {\n ...placeHolderProps,\n ...props,\n \"data-path\": path,\n id,\n key: id,\n style: { ...baseStyle, ...style, flexBasis: size },\n });\n}\n", "import React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport {\n findTarget,\n followPath,\n followPathToParent,\n getProp,\n getProps,\n typeOf,\n} from \"../utils\";\nimport { getIntrinsicSize } from \"./flexUtils\";\nimport {\n getInsertTabBeforeAfter,\n insertBesideChild,\n insertIntoContainer,\n} from \"./insert-layout-element\";\nimport { moveChild } from \"./move-layout-element\";\nimport {\n AddAction,\n DragDropAction,\n LayoutActionType,\n LayoutReducerAction,\n MaximizeAction,\n SetPropAction,\n SetPropsAction,\n SwitchTabAction,\n} from \"./layoutTypes\";\nimport { LayoutProps } from \"./layoutUtils\";\nimport { removeChild } from \"./remove-layout-element\";\nimport {\n replaceChild,\n swapChild,\n _replaceChild,\n} from \"./replace-layout-element\";\nimport { resizeFlexChild, resizeFlexChildren } from \"./resize-flex-children\";\nimport { wrap } from \"./wrap-layout-element\";\n\nexport const layoutReducer = (\n state: ReactElement,\n action: LayoutReducerAction\n): ReactElement => {\n switch (action.type) {\n case LayoutActionType.ADD:\n return addChild(state, action);\n case LayoutActionType.DRAG_DROP:\n return dragDrop(state, action);\n case LayoutActionType.MAXIMIZE:\n return setChildProps(state, action);\n case LayoutActionType.REMOVE:\n return removeChild(state, action);\n case LayoutActionType.REPLACE:\n return replaceChild(state, action);\n case LayoutActionType.SET_PROP:\n return setProp(state, action);\n case LayoutActionType.SET_PROPS:\n return setProps(state, action);\n case LayoutActionType.SET_TITLE:\n return setProp(state, {\n type: \"set-prop\",\n path: action.path,\n propName: \"title\",\n propValue: action.title,\n });\n case LayoutActionType.SPLITTER_RESIZE:\n return resizeFlexChildren(state, action);\n case LayoutActionType.LAYOUT_RESIZE:\n return resizeFlexChild(state, action);\n case LayoutActionType.SWITCH_TAB:\n return switchTab(state, action);\n case LayoutActionType.MOVE_CHILD:\n return moveChild(state, action);\n default:\n return state;\n }\n};\n\nconst switchTab = (state: ReactElement, { path, nextIdx }: SwitchTabAction) => {\n const target = followPath(state, path, true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const replacement = React.cloneElement<any>(target, {\n active: nextIdx,\n });\n return swapChild(state, target, replacement);\n};\n\nconst setProp = (\n state: ReactElement,\n { path, propName, propValue }: SetPropAction\n) => {\n const target = followPath(state, path, true);\n const replacement = React.cloneElement(target, {\n [propName]: propValue,\n });\n return swapChild(state, target, replacement);\n};\n\nconst setProps = (state: ReactElement, { path, props }: SetPropsAction) => {\n const target = followPath(state, path, true);\n const replacement = React.cloneElement(target, props);\n return swapChild(state, target, replacement);\n};\n\nconst setChildProps = (state: ReactElement, { path, type }: MaximizeAction) => {\n if (path) {\n const target = followPath(state, path, true);\n return swapChild(state, target, target, type);\n } else {\n return state;\n }\n};\n\nconst dragDrop = (\n layoutRoot: ReactElement,\n action: DragDropAction\n): ReactElement => {\n const {\n draggedReactElement: newComponent,\n dragInstructions,\n dropTarget,\n } = action;\n const existingComponent = dropTarget.component as ReactElement;\n const { pos } = dropTarget;\n const destinationTabstrip =\n pos?.position?.Header && typeOf(existingComponent) === \"Stack\";\n const { id, version } = getProps(newComponent);\n const intrinsicSize = getIntrinsicSize(newComponent);\n let newLayoutRoot: ReactElement;\n if (destinationTabstrip) {\n const [targetTab, insertionPosition] = getInsertTabBeforeAfter(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n existingComponent!,\n pos\n );\n if (targetTab === undefined) {\n newLayoutRoot = insertIntoContainer(\n layoutRoot,\n existingComponent,\n newComponent\n );\n } else {\n newLayoutRoot = insertBesideChild(\n layoutRoot,\n targetTab,\n newComponent,\n insertionPosition\n );\n }\n } else if (!intrinsicSize && pos?.position?.Centre) {\n newLayoutRoot = _replaceChild(\n layoutRoot,\n existingComponent as ReactElement,\n newComponent\n );\n } else {\n newLayoutRoot = dropLayoutIntoContainer(\n layoutRoot,\n dropTarget as DropTarget,\n newComponent\n );\n }\n\n if (dragInstructions.DoNotRemove) {\n return newLayoutRoot;\n }\n\n const finalTarget = findTarget(\n newLayoutRoot,\n (props: LayoutProps) => props.id === id && props.version === version\n ) as ReactElement;\n const finalPath = getProp(finalTarget, \"path\");\n return removeChild(newLayoutRoot, { path: finalPath, type: \"remove\" });\n};\n\nconst addChild = (\n layoutRoot: ReactElement,\n { path: containerPath, component }: AddAction\n) => {\n return insertIntoContainer(\n layoutRoot,\n followPath(layoutRoot, containerPath) as ReactElement,\n component\n );\n};\n\nconst dropLayoutIntoContainer = (\n layoutRoot: ReactElement,\n dropTarget: DropTarget,\n newComponent: ReactElement\n): ReactElement => {\n const { component, pos, clientRect, dropRect } = dropTarget;\n const existingComponent = component as ReactElement;\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n\n if (existingComponentPath === \"0.0\") {\n return wrap(\n layoutRoot,\n existingComponent as ReactElement,\n newComponent,\n pos\n );\n }\n\n const targetContainer = followPathToParent(\n layoutRoot,\n existingComponentPath\n ) as ReactElement;\n\n if (withTheGrain(pos, targetContainer)) {\n const insertionPosition = pos.position.SouthOrEast ? \"after\" : \"before\";\n return insertBesideChild(\n layoutRoot,\n existingComponent,\n newComponent,\n insertionPosition,\n pos,\n clientRect,\n dropRect\n );\n }\n\n if (!withTheGrain(pos, targetContainer)) {\n return wrap(\n layoutRoot,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n );\n }\n\n if (isContainer(typeOf(targetContainer) as string)) {\n return wrap(layoutRoot, existingComponent, newComponent, pos);\n }\n\n throw Error(`no support right now for position = ${pos.position}`);\n};\n\nconst withTheGrain = (pos: DropPos, container: ReactElement) => {\n if (pos.position.Centre) {\n return isTerrace(container) || isTower(container);\n }\n\n return pos.position.NorthOrSouth\n ? isTower(container)\n : pos.position.EastOrWest\n ? isTerrace(container)\n : false;\n};\n\nconst isTower = (container: ReactElement) => {\n return (\n typeOf(container) === \"Flexbox\" &&\n container.props.style.flexDirection === \"column\"\n );\n};\n\nconst isTerrace = (container: ReactElement) => {\n return (\n typeOf(container) === \"Flexbox\" &&\n container.props.style.flexDirection !== \"column\"\n );\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { getProp, getProps, nextStep, resetPath, typeOf } from \"../utils\";\nimport {\n createPlaceHolder,\n flexDirection,\n getFlexDimensions,\n getFlexOrIntrinsicStyle,\n getIntrinsicSize,\n wrapIntrinsicSizeComponentWithFlexbox,\n} from \"./flexUtils\";\nimport { LayoutModel } from \"./layoutTypes\";\nimport {\n getDefaultTabLabel,\n getManagedDimension,\n LayoutProps,\n} from \"./layoutUtils\";\n\ntype insertionPosition = \"before\" | \"after\";\n\nexport function getInsertTabBeforeAfter(stack: LayoutModel, pos: DropPos) {\n const tabs = stack.props.children;\n const tabCount = tabs.length;\n const { index = -1, positionRelativeToTab = \"after\" } = pos.tab || {};\n return index === -1 || index >= tabCount\n ? [tabs[tabCount - 1], \"after\"]\n : [tabs[index] ?? null, positionRelativeToTab];\n}\n\nexport function insertIntoContainer(\n container: ReactElement,\n targetContainer: ReactElement,\n newComponent: ReactElement\n): ReactElement {\n const {\n active: containerActive,\n children: containerChildren = [],\n path: containerPath,\n } = getProps(container) as LayoutProps;\n\n const existingComponentPath = getProp(targetContainer, \"path\");\n const { idx, finalStep } = nextStep(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n containerPath!,\n existingComponentPath,\n true\n );\n const [insertedIdx, children] = finalStep\n ? insertIntoChildren(container, containerChildren, newComponent)\n : [\n containerActive,\n containerChildren?.map((child, index) =>\n index === idx\n ? (insertIntoContainer(\n child,\n targetContainer,\n newComponent\n ) as ReactElement)\n : child\n ),\n ];\n const active =\n typeOf(container) === \"Stack\"\n ? Array.isArray(insertedIdx)\n ? (insertedIdx[0] as number)\n : insertedIdx\n : containerActive;\n\n return React.cloneElement(container, { active }, children);\n}\n\nconst getDefaultTitle = (\n containerType: string | undefined,\n component: ReactElement,\n index: number,\n existingLabels: string[]\n) =>\n containerType === \"Stack\"\n ? getDefaultTabLabel(component, index, existingLabels)\n : undefined;\n\nconst getChildrenTitles = (children: ReactElement[]) =>\n children.map((child) => child.props.title);\n\nfunction insertIntoChildren(\n container: ReactElement,\n containerChildren: ReactElement[],\n newComponent: ReactElement\n): [number, ReactElement[]] {\n const containerPath = getProp(container, \"path\");\n const count = containerChildren?.length;\n const {\n id = uuid(),\n title = getDefaultTitle(\n typeOf(container),\n newComponent,\n count ?? 0,\n getChildrenTitles(containerChildren)\n ),\n } = getProps(newComponent);\n\n if (count) {\n return [\n count,\n containerChildren.concat(\n resetPath(newComponent, `${containerPath}.${count}`, {\n id,\n key: id,\n title,\n })\n ),\n ];\n } else {\n return [0, [resetPath(newComponent, `${containerPath}.0`, { id, title })]];\n }\n}\n\nexport function insertBesideChild(\n container: ReactElement,\n existingComponent: any,\n newComponent: any,\n insertionPosition: insertionPosition,\n pos?: DropPos,\n clientRect?: any,\n dropRect?: any\n): ReactElement {\n const {\n active: containerActive,\n children: containerChildren,\n path: containerPath,\n } = getProps(container);\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n const { idx, finalStep } = nextStep(containerPath, existingComponentPath);\n const [insertedIdx, children] = finalStep\n ? updateChildren(\n container,\n containerChildren,\n idx,\n newComponent,\n insertionPosition,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n pos!,\n clientRect,\n dropRect\n )\n : [\n containerActive,\n containerChildren.map((child: ReactElement, index: number) =>\n index === idx\n ? insertBesideChild(\n child,\n existingComponent,\n newComponent,\n insertionPosition,\n pos,\n clientRect,\n dropRect\n )\n : child\n ),\n ];\n\n const active = typeOf(container) === \"Stack\" ? insertedIdx : containerActive;\n return React.cloneElement(container, { active }, children);\n}\n\nfunction updateChildren(\n container: LayoutModel,\n containerChildren: ReactElement[],\n idx: number,\n newComponent: ReactElement,\n insertionPosition: insertionPosition,\n pos: DropPos,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: DropTarget[\"dropRect\"]\n) {\n const intrinsicSize = getIntrinsicSize(newComponent);\n if (intrinsicSize?.width && intrinsicSize?.height) {\n return insertIntrinsicSizedComponent(\n container,\n containerChildren,\n idx,\n newComponent,\n insertionPosition,\n clientRect,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n dropRect!\n );\n } else {\n return insertFlexComponent(\n container,\n containerChildren,\n idx,\n newComponent,\n insertionPosition,\n pos?.width || pos?.height,\n clientRect\n );\n }\n}\n\nconst getLeadingPlaceholderSize = (\n flexDirection: flexDirection,\n insertionPosition: insertionPosition,\n { top, right, bottom, left }: DropTarget[\"clientRect\"],\n [rectLeft, rectTop, rectRight, rectBottom]: rectTuple\n) => {\n if (flexDirection === \"column\" && insertionPosition === \"before\") {\n return rectTop - top;\n } else if (flexDirection === \"column\") {\n return bottom - rectBottom;\n } else if (flexDirection === \"row\" && insertionPosition === \"before\") {\n return rectLeft - left;\n } else if (flexDirection === \"row\") {\n return right - rectRight;\n }\n};\n\nfunction insertIntrinsicSizedComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n idx: number,\n newComponent: ReactElement,\n insertionPosition: insertionPosition,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: rectTuple\n) {\n const {\n style: { flexDirection },\n } = getProps(container);\n const [dimension, crossDimension, contraDirection] =\n getFlexDimensions(flexDirection);\n const { [crossDimension]: intrinsicCrossSize, [dimension]: intrinsicSize } =\n getIntrinsicSize(newComponent) as { height: number; width: number };\n const path = getProp(containerChildren[idx], \"path\");\n\n const placeholderSize = getLeadingPlaceholderSize(\n flexDirection,\n insertionPosition,\n clientRect,\n dropRect\n );\n\n const [itemToInsert, size] =\n intrinsicCrossSize < clientRect[crossDimension]\n ? [\n wrapIntrinsicSizeComponentWithFlexbox(\n newComponent,\n contraDirection,\n path,\n clientRect,\n dropRect\n ),\n intrinsicSize,\n ]\n : [newComponent, undefined];\n\n const placeholder = placeholderSize\n ? createPlaceHolder(path, placeholderSize, { flexGrow: 0, flexShrink: 0 })\n : undefined;\n\n if (intrinsicCrossSize > clientRect[crossDimension]) {\n containerChildren = containerChildren.map((child) => {\n if (getProp(child, \"placeholder\")) {\n return child;\n } else {\n const { [crossDimension]: intrinsicCrossChildSize } = getIntrinsicSize(\n child\n ) as {\n height: number;\n width: number;\n };\n if (\n intrinsicCrossChildSize &&\n intrinsicCrossChildSize < intrinsicCrossSize\n ) {\n return wrapIntrinsicSizeComponentWithFlexbox(\n child,\n contraDirection,\n getProp(child, \"path\")\n );\n } else {\n return child;\n }\n }\n });\n }\n\n return insertFlexComponent(\n container,\n containerChildren,\n idx,\n itemToInsert,\n insertionPosition,\n size,\n clientRect,\n placeholder\n );\n}\n\nfunction insertFlexComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n idx: number,\n newComponent: ReactElement,\n insertionPosition: \"before\" | \"after\",\n size: number | undefined,\n targetRect: DropTarget[\"clientRect\"],\n placeholder?: ReactElement\n) {\n const containerPath = getProp(container, \"path\");\n let insertedIdx = 0;\n const children =\n !containerChildren || containerChildren.length === 0\n ? [newComponent]\n : containerChildren\n .reduce<ReactElement[]>((arr, child, i) => {\n if (idx === i) {\n const [existingComponent, insertedComponent] =\n getStyledComponents(container, child, newComponent, targetRect);\n if (insertionPosition === \"before\") {\n if (placeholder) {\n arr.push(placeholder, insertedComponent, existingComponent);\n } else {\n arr.push(insertedComponent, existingComponent);\n }\n } else {\n if (placeholder) {\n arr.push(existingComponent, insertedComponent, placeholder);\n } else {\n arr.push(existingComponent, insertedComponent);\n }\n }\n insertedIdx = arr.indexOf(insertedComponent);\n } else {\n arr.push(child);\n }\n return arr;\n }, [])\n .map((child, i) =>\n i < insertedIdx ? child : resetPath(child, `${containerPath}.${i}`)\n );\n\n return [insertedIdx, children];\n}\n\nfunction getStyledComponents(\n container: LayoutModel,\n existingComponent: ReactElement,\n newComponent: ReactElement,\n targetRect: DropTarget[\"clientRect\"]\n): [ReactElement, ReactElement] {\n const id = uuid();\n let { version = 0 } = getProps(newComponent);\n version += 1;\n if (typeOf(container) === \"Flexbox\") {\n const [dim] = getManagedDimension(container.props.style);\n const splitterSize = 6;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const size = { [dim]: (targetRect[dim] - splitterSize) / 2 };\n const existingComponentStyle = getFlexOrIntrinsicStyle(\n existingComponent,\n dim,\n size\n );\n const newComponentStyle = getFlexOrIntrinsicStyle(newComponent, dim, size);\n\n return [\n React.cloneElement(existingComponent, {\n style: existingComponentStyle,\n }),\n React.cloneElement(newComponent, {\n id,\n version,\n style: newComponentStyle,\n }),\n ];\n } else {\n const {\n style: { left: _1, top: _2, flex: _3, ...style } = {\n left: undefined,\n top: undefined,\n flex: undefined,\n },\n } = getProps(newComponent);\n return [\n existingComponent,\n React.cloneElement(newComponent, {\n id,\n version,\n style: { ...style, flex: \"1 1 0px\" },\n }),\n ];\n }\n}\n", "import { dimension, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { cloneElement, CSSProperties, ReactElement } from \"react\";\nimport {\n ComponentWithId,\n ComponentRegistry,\n isContainer,\n isLayoutComponent,\n} from \"../registry/ComponentRegistry\";\nimport { TabLabelFactory } from \"../stack\";\nimport {\n getPersistentState,\n hasPersistentState,\n setPersistentState,\n} from \"../use-persistent-state\";\nimport { expandFlex, followPathToParent, getProps, typeOf } from \"../utils\";\nimport { LayoutJSON, LayoutModel, layoutType } from \"./layoutTypes\";\n\nexport const getManagedDimension = (\n style: CSSProperties\n): [dimension, dimension] =>\n style.flexDirection === \"column\" ? [\"height\", \"width\"] : [\"width\", \"height\"];\n\nconst theKidHasNoStyle: CSSProperties = {};\n\nexport const applyLayoutProps = (component: ReactElement, path = \"0\") => {\n const [layoutProps, children] = getChildLayoutProps(\n typeOf(component) as string,\n component.props,\n path\n );\n return React.cloneElement(component, layoutProps, children);\n};\n\nexport interface LayoutProps extends ComponentWithId {\n active?: number;\n \"data-path\"?: string;\n children?: ReactElement[];\n column?: any;\n dropTarget?: any;\n key: string;\n layout?: any;\n path?: string;\n resizeable?: boolean;\n style: CSSProperties;\n type?: string;\n version?: number;\n}\n\n/**\n * parse the declarative JSX and clone adding layout attributes\n */\nexport const processLayoutElement = (\n layoutElement: ReactElement,\n previousLayout?: ReactElement\n): ReactElement => {\n const type = typeOf(layoutElement) as string;\n const [layoutProps, children] = getChildLayoutProps(\n type,\n layoutElement.props,\n \"0\",\n undefined,\n previousLayout\n );\n return cloneElement(layoutElement, layoutProps, children);\n};\n\nexport const applyLayout = (\n type: layoutType,\n props: LayoutProps,\n previousLayout?: LayoutModel\n): LayoutModel => {\n const [layoutProps, children] = getChildLayoutProps(\n type,\n props,\n \"0\",\n undefined,\n previousLayout\n );\n return {\n ...props,\n ...layoutProps,\n type,\n children,\n };\n};\n\nfunction getLayoutProps(\n type: string,\n props: LayoutProps,\n path = \"0\",\n parentType: string | null = null,\n previousLayout?: LayoutModel\n): LayoutProps {\n const {\n active: prevActive = 0,\n \"data-path\": dataPath,\n path: prevPath = dataPath,\n id: prevId,\n style: prevStyle,\n } = getProps(previousLayout);\n\n const prevMatch = typeOf(previousLayout) === type && path === prevPath;\n const id = prevMatch ? prevId : props.id ?? uuid();\n const active = type === \"Stack\" ? props.active ?? prevActive : undefined;\n\n const key = id;\n const style = prevMatch ? prevStyle : getStyle(type, props, parentType);\n return isLayoutComponent(type)\n ? { id, key, path, style, type, active }\n : { id, key, style, \"data-path\": path };\n}\n\nfunction getChildLayoutProps(\n type: string,\n props: LayoutProps,\n path: string,\n parentType: string | null = null,\n previousLayout?: LayoutModel\n): [LayoutProps, ReactElement[]] {\n const layoutProps = getLayoutProps(\n type,\n props,\n path,\n parentType,\n previousLayout\n );\n\n if (props.layout && !previousLayout) {\n return [layoutProps, [layoutFromJson(props.layout, `${path}.0`)]];\n }\n\n const previousChildren =\n (previousLayout as any)?.children ?? previousLayout?.props?.children;\n const hasDynamicChildren = props.dropTarget && previousChildren;\n const children = hasDynamicChildren\n ? previousChildren\n : getLayoutChildren(type, props.children, path, previousChildren);\n return [layoutProps, children];\n}\n\nfunction getLayoutChildren(\n type: string,\n children?: ReactElement[],\n path = \"0\",\n previousChildren?: ReactElement[]\n) {\n const kids = Array.isArray(children)\n ? children\n : React.isValidElement(children)\n ? [children]\n : [];\n return isContainer(type)\n ? kids.map((child, i) => {\n const childType = typeOf(child) as string;\n const previousType = typeOf(previousChildren?.[i]);\n\n if (!previousType || childType === previousType) {\n const [layoutProps, children] = getChildLayoutProps(\n childType,\n child.props,\n `${path}.${i}`,\n type,\n previousChildren?.[i]\n );\n return React.cloneElement(child, layoutProps, children);\n }\n\n return previousChildren?.[i];\n })\n : children;\n}\n\nconst getStyle = (\n type: string,\n props: LayoutProps,\n parentType?: string | null\n) => {\n let { style = theKidHasNoStyle } = props;\n if (type === \"Flexbox\") {\n style = {\n flexDirection: props.column ? \"column\" : \"row\",\n ...style,\n display: \"flex\",\n };\n }\n\n if (style.flex) {\n const { flex, ...otherStyles } = style;\n style = {\n ...otherStyles,\n ...expandFlex(typeof flex === \"number\" ? flex : 0),\n };\n } else if (parentType === \"Stack\") {\n style = {\n ...style,\n ...expandFlex(1),\n };\n } else if (\n parentType === \"Flexbox\" &&\n (style.width || style.height) &&\n style.flexBasis === undefined\n ) {\n style = {\n ...style,\n flexBasis: \"auto\",\n flexGrow: 0,\n flexShrink: 0,\n };\n }\n\n return style;\n};\n\nexport function layoutFromJson(\n { id = uuid(), type, children, props, state }: LayoutJSON,\n path: string\n): ReactElement {\n const componentType = type.match(/^[a-z]/) ? type : ComponentRegistry[type];\n\n if (componentType === undefined) {\n throw Error(\n `layoutUtils unable to create component from JSON, unknown type ${type}`\n );\n }\n\n if (state) {\n setPersistentState(id, state);\n }\n\n return React.createElement(\n componentType,\n {\n id,\n ...props,\n key: id,\n path,\n },\n children\n ? children.map((child, i) => layoutFromJson(child, `${path}.${i}`))\n : undefined\n );\n}\n\nexport function layoutToJSON(component: ReactElement) {\n return componentToJson(component);\n}\n\nexport function componentToJson(component: ReactElement): LayoutJSON {\n const type = typeOf(component) as string;\n const { id, children, type: _omit, ...props } = getProps(component);\n\n const state = hasPersistentState(id) ? getPersistentState(id) : undefined;\n\n return {\n id,\n type,\n props: serializeProps(props as LayoutProps),\n state,\n children: React.Children.map(children, componentToJson),\n };\n}\n\nexport function serializeProps(props?: LayoutProps) {\n if (props) {\n const { path, ...otherProps } = props;\n const result: { [key: string]: any } = {};\n for (const [key, value] of Object.entries(otherProps)) {\n result[key] = serializeValue(value);\n }\n return result;\n }\n}\n\nfunction serializeValue(value: unknown): any {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n } else if (Array.isArray(value)) {\n return value.map(serializeValue);\n } else if (typeof value === \"object\" && value !== null) {\n const result: { [key: string]: any } = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = serializeValue(v);\n }\n return result;\n }\n}\n\n// This is experimental and the only query we support to start off with is\n// PARENT_CONTAINER\nexport type LayoutQuery = \"PARENT_CONTAINER\";\n\nexport const layoutQuery = (\n query: LayoutQuery,\n path?: string,\n layoutRoot?: ReactElement\n) => {\n if (path && layoutRoot) {\n const parentElement = followPathToParent(layoutRoot, path);\n if (parentElement) {\n const { id: parentContainerId } = getProps(parentElement);\n const parentContainerType = typeOf(parentElement);\n return {\n parentContainerId,\n parentContainerType,\n };\n }\n return {\n parentContainerType: \"Stack\",\n parentContainerId: \"blah\",\n };\n }\n};\n\nexport const getDefaultTabLabel: TabLabelFactory = (\n component,\n tabIndex,\n existingLabels = []\n): string => {\n let label = component.props?.title ?? component.props?.[\"data-tab-title\"];\n if (label) {\n return label;\n } else {\n let count = tabIndex;\n do {\n label = `Tab ${++count}`;\n } while (existingLabels.includes(label));\n return label;\n }\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback } from \"react\";\n\n/**\n * Persistent state is stored at module level (i.e singleton-style)\n * It is kept at this level, rather than passed to the target component(s)\n * so that it endures across the unmount/mount lifecycle journey of any\n * individual component. e.g when switching between tabs, components are\n * unmounted and mounted. They re-request their persistent state on re-mount.\n * Persistent state is populated as the serialized layout schema is processed\n * (see layoutFromJSON).\n */\nconst persistentState = new Map<string, any>();\nconst sessionState = new Map<string, any>();\n\nexport const getPersistentState = (id: string) => persistentState.get(id);\nexport const hasPersistentState = (id: string) => persistentState.has(id);\nexport const setPersistentState = (id: string, value: any) =>\n persistentState.set(id, value);\n\nexport const usePersistentState = () => {\n const loadSessionState = useCallback((id, key) => {\n const state = sessionState.get(id);\n if (state) {\n if (key !== undefined && state[key] !== undefined) {\n return state[key];\n }\n if (key !== undefined) {\n return undefined;\n }\n return state;\n }\n }, []);\n\n const saveSessionState = useCallback((id, key, data) => {\n if (key === undefined) {\n sessionState.set(id, data);\n } else if (sessionState.has(id)) {\n const state = sessionState.get(id);\n sessionState.set(id, {\n ...state,\n [key]: data,\n });\n } else {\n sessionState.set(id, { [key]: data });\n }\n }, []);\n\n const purgeSessionState = useCallback((id: string, key?: string) => {\n if (sessionState.has(id)) {\n if (key === undefined) {\n sessionState.delete(id);\n } else {\n const state = sessionState.get(id);\n if (state[key]) {\n const { [key]: _doomedState, ...rest } = sessionState.get(id);\n if (Object.keys(rest).length > 0) {\n sessionState.set(id, rest);\n } else {\n sessionState.delete(id);\n }\n }\n }\n }\n }, []);\n\n const loadState = useCallback((id: string, key?: string) => {\n const state = persistentState.get(id);\n if (state) {\n if (key !== undefined) {\n return state[key];\n }\n return state;\n }\n }, []);\n\n const saveState = useCallback(\n (id: string, key: string | undefined, data: unknown) => {\n if (key === undefined) {\n persistentState.set(id, data);\n } else if (persistentState.has(id)) {\n const state = persistentState.get(id);\n persistentState.set(id, {\n ...state,\n [key]: data,\n });\n } else {\n persistentState.set(id, { [key]: data });\n }\n },\n []\n );\n\n const purgeState = useCallback((id: string, key?: string) => {\n if (persistentState.has(id)) {\n if (key === undefined) {\n persistentState.delete(id);\n } else {\n const state = persistentState.get(id);\n if (state[key]) {\n const { [key]: _doomedState, ...rest } = persistentState.get(id);\n if (Object.keys(rest).length > 0) {\n persistentState.set(id, rest);\n } else {\n persistentState.delete(id);\n }\n }\n }\n }\n }, []);\n\n return {\n loadSessionState,\n loadState,\n saveSessionState,\n saveState,\n purgeState,\n purgeSessionState,\n };\n};\n", "import { cloneElement, ReactElement } from \"react\";\nimport { followPath, getProps } from \"../utils\";\nimport { MoveChildAction } from \"./layoutTypes\";\nimport { swapChild } from \"./replace-layout-element\";\n\nexport function moveChild(\n layoutRoot: ReactElement,\n { fromIndex, path, toIndex }: MoveChildAction\n) {\n const target = followPath(layoutRoot, path, true);\n const { children } = getProps(target);\n const replacementChildren = moveChildWithinChildren(\n children,\n fromIndex,\n toIndex\n );\n const replacement = cloneElement(target, undefined, replacementChildren);\n return swapChild(layoutRoot, target, replacement);\n}\n\nfunction moveChildWithinChildren(\n children: ReactElement[],\n fromIndex: number,\n toIndex: number\n) {\n const newChildren = children.slice();\n const [child] = newChildren.splice(fromIndex, 1);\n if (toIndex === -1) {\n return newChildren.concat(child);\n } else {\n newChildren.splice(toIndex, 0, child);\n return newChildren;\n }\n}\n", "import React, { ReactElement } from 'react';\nimport { Action } from '../layout-action';\nimport { getProp, getProps, nextStep } from '../utils';\nimport { ReplaceAction } from './layoutTypes';\nimport { applyLayoutProps, LayoutProps } from './layoutUtils';\n\nexport function replaceChild(model: ReactElement, { target, replacement }: ReplaceAction) {\n return _replaceChild(model, target, replacement);\n}\n\nexport function _replaceChild(\n model: ReactElement,\n child: ReactElement,\n replacement: ReactElement<LayoutProps>\n) {\n const path = getProp(child, 'path');\n const resizeable = getProp(child, 'resizeable');\n const { style } = getProps(child);\n const newChild =\n applyLayoutProps(\n React.cloneElement(replacement, {\n resizeable,\n style: {\n ...style,\n ...replacement.props.style\n }\n }),\n path\n );\n\n return swapChild(model, child, newChild);\n}\n\nexport function swapChild(\n model: ReactElement,\n child: ReactElement,\n replacement: ReactElement,\n op?: 'maximize' | 'minimize' | 'restore'\n): ReactElement {\n if (model === child) {\n return replacement;\n }\n \n const { idx, finalStep } = nextStep(getProp(model, 'path'), getProp(child, 'path'));\n const children = model.props.children.slice();\n \n if (finalStep) {\n if (!op) {\n children[idx] = replacement;\n } else if (op === Action.MINIMIZE) {\n children[idx] = minimize(model, children[idx]);\n } else if (op === Action.RESTORE) {\n children[idx] = restore(children[idx]);\n }\n } else {\n children[idx] = swapChild(children[idx], child, replacement, op);\n }\n return React.cloneElement(model, undefined, children);\n}\n\nfunction minimize(parent: ReactElement, child: ReactElement) {\n const { style: parentStyle } = getProps(parent);\n const { style: childStyle } = getProps(child);\n\n const { width, height, flexBasis, flexShrink, flexGrow, ...rest } = childStyle;\n\n const restoreStyle = {\n width,\n height,\n flexBasis,\n flexShrink,\n flexGrow\n };\n\n const style = {\n ...rest,\n flexBasis: 0,\n flexGrow: 0,\n flexShrink: 0\n };\n const collapsed =\n parentStyle.flexDirection === 'row'\n ? 'vertical'\n : parentStyle.flexDirection === 'column'\n ? 'horizontal'\n : false;\n\n if (collapsed) {\n return React.cloneElement(child, {\n collapsed,\n restoreStyle,\n style\n });\n }\n return child;\n}\n\nfunction restore(child: ReactElement) {\n const { style: childStyle, restoreStyle } = getProps(child);\n\n const { flexBasis, flexShrink, flexGrow, ...rest } = childStyle;\n\n const style = {\n ...rest,\n ...restoreStyle\n };\n\n return React.cloneElement(child, {\n collapsed: false,\n style,\n restoreStyle: undefined\n });\n}\n", "export const Action = {\n ADD: \"add\",\n BLUR: \"blur\",\n BLUR_SPLITTER: \"blur-splitter\",\n DRAG_START: \"drag-start\",\n DRAG_STARTED: \"drag-started\",\n DRAG_DROP: \"drag-drop\",\n FOCUS: \"focus\",\n FOCUS_SPLITTER: \"focus-splitter\",\n INITIALIZE: \"initialize\",\n LAYOUT_RESIZE: \"layout-resize\",\n MAXIMIZE: \"maximize\",\n MINIMIZE: \"minimize\",\n REMOVE: \"remove\",\n REPLACE: \"replace\",\n RESTORE: \"restore\",\n SAVE: \"save\",\n SET_TITLE: \"set-title\",\n SPLITTER_RESIZE: \"splitter-resize\",\n SWITCH_TAB: \"switch-tab\",\n TEAR_OUT: \"tear-out\",\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NamedFilter } from \"@vuu-ui/vuu-filter-types\";\nimport { CSSProperties, ReactElement } from \"react\";\nimport { DragDropRect, DragInstructions } from \"../drag-drop\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { ContributionLocation } from \"../layout-view\";\n\nexport interface WithProps {\n props?: { [key: string]: any };\n}\n\nexport interface WithType {\n props?: any;\n title?: string;\n type: string;\n}\n\nexport interface LayoutRoot extends WithProps {\n active?: number;\n children?: ReactElement[];\n type: string;\n}\n\nexport type ValueOf<T> = T[keyof T];\nexport interface ApplicationSettings {\n leftNav?: {\n activeTabIndex: number;\n expanded: boolean;\n };\n /**\n * filters are keyed by MODULE:tablename\n */\n filters?: { [key: string]: NamedFilter[] };\n}\nexport type ApplicationSetting = ValueOf<ApplicationSettings>;\n\nexport interface ApplicationJSON {\n layout: LayoutJSON;\n settings?: ApplicationSettings;\n}\n\nexport interface LayoutJSON extends WithType {\n active?: number;\n children?: LayoutJSON[];\n id?: string;\n props?: { [key: string]: any };\n state?: any;\n type: string;\n style?: CSSProperties;\n}\n\nexport interface WithActive {\n active?: number;\n}\n\nexport type LayoutModel = LayoutRoot | ReactElement | WithType;\n\nexport type layoutType = \"Flexbox\" | \"View\" | \"DraggableLayout\" | \"Stack\";\n\n// TODO duplicated in layout-action\nexport const LayoutActionType = {\n ADD: \"add\",\n DRAG_START: \"drag-start\",\n DRAG_DROP: \"drag-drop\",\n LAYOUT_RESIZE: \"layout-resize\",\n MAXIMIZE: \"maximize\",\n MINIMIZE: \"minimize\",\n MOVE_CHILD: \"move-child\",\n QUERY: \"query\",\n REMOVE: \"remove\",\n REPLACE: \"replace\",\n RESTORE: \"restore\",\n SAVE: \"save\",\n SET_PROP: \"set-prop\",\n SET_PROPS: \"set-props\",\n SET_TITLE: \"set-title\",\n SPLITTER_RESIZE: \"splitter-resize\",\n SWITCH_TAB: \"switch-tab\",\n TEAROUT: \"tearout\",\n} as const;\n\nexport type AddAction = {\n component: any;\n path: string;\n type: typeof LayoutActionType.ADD;\n};\n\nexport type DragDropAction = {\n draggedReactElement: ReactElement;\n dragInstructions: any;\n dropTarget: Partial<DropTarget>;\n type: typeof LayoutActionType.DRAG_DROP;\n};\n\nexport type MaximizeAction = {\n path?: string;\n type: typeof LayoutActionType.MAXIMIZE;\n};\n\nexport type MinimizeAction = {\n path?: string;\n type: typeof LayoutActionType.MINIMIZE;\n};\n\nexport type MoveChildAction = {\n fromIndex: number;\n toIndex: number;\n path: string;\n type: typeof LayoutActionType.MOVE_CHILD;\n};\n\nexport type QueryAction = {\n path?: string;\n query: string;\n type: typeof LayoutActionType.QUERY;\n};\n\nexport type RemoveAction = {\n path?: string;\n type: typeof LayoutActionType.REMOVE;\n};\n\nexport type ReplaceAction = {\n replacement: any;\n target: any;\n type: typeof LayoutActionType.REPLACE;\n};\n\nexport type RestoreAction = {\n path?: string;\n type: typeof LayoutActionType.RESTORE;\n};\n\nexport type SetPropAction = {\n path: string;\n propName: string;\n propValue: string | number | boolean;\n type: typeof LayoutActionType.SET_PROP;\n};\n\nexport type SetPropsAction = {\n path: string;\n props: { [key: string]: unknown };\n type: typeof LayoutActionType.SET_PROPS;\n};\n\nexport type SetTitleAction = {\n path: string;\n title: string;\n type: typeof LayoutActionType.SET_TITLE;\n};\n\nexport type SplitterResizeAction = {\n path: string;\n sizes: { currentSize: number; flexBasis: number }[];\n type: typeof LayoutActionType.SPLITTER_RESIZE;\n};\n\nexport type LayoutResizeAction = {\n path: string;\n size: number;\n type: typeof LayoutActionType.LAYOUT_RESIZE;\n};\n\nexport type SwitchTabAction = {\n id?: string;\n nextIdx: number;\n path: string;\n type: typeof LayoutActionType.SWITCH_TAB;\n};\n\nexport type TearoutAction = {\n path?: string;\n type: typeof LayoutActionType.TEAROUT;\n};\n\nexport type LayoutReducerAction =\n | AddAction\n | DragDropAction\n | LayoutResizeAction\n | MaximizeAction\n | MinimizeAction\n | MoveChildAction\n | RemoveAction\n | ReplaceAction\n | RestoreAction\n | SetPropAction\n | SetPropsAction\n | SetTitleAction\n | SplitterResizeAction\n | SwitchTabAction;\n\nexport type SaveAction = {\n type: typeof LayoutActionType.SAVE;\n};\n\nexport type AddToolbarContributionViewAction = {\n content: ReactElement;\n location: ContributionLocation;\n type: \"add-toolbar-contribution\";\n};\n\nexport type RemoveToolbarContributionViewAction = {\n location: ContributionLocation;\n type: \"remove-toolbar-contribution\";\n};\n\nexport type MousedownViewAction = {\n preDragActivity?: any;\n index?: number;\n type: \"mousedown\";\n};\n\nexport type DragStartAction = {\n payload?: ReactElement;\n dragContainerPath?: string;\n dragElement?: HTMLElement;\n dragRect: DragDropRect;\n dropTargets?: string[];\n evt: MouseEvent;\n instructions?: DragInstructions;\n path: string;\n type: typeof LayoutActionType.DRAG_START;\n};\n\nexport type LayoutLevelChange =\n | \"switch-active-tab\"\n | \"edit-feature-title\"\n | \"save-feature-props\"\n | \"resize-component\"\n | \"remove-component\"\n | \"drag-drop-operation\";\n\nexport type ApplicationLevelChange =\n | \"switch-active-layout\"\n | \"open-layout\"\n | \"close-layout\"\n | \"rename-layout\"\n | \"resize-application-chrome\";\n\nexport type LayoutChangeReason = LayoutLevelChange | ApplicationLevelChange;\n\nexport type LayoutChangeHandler = (\n layout: LayoutJSON,\n layoutChangeReason: LayoutChangeReason\n) => void;\n\nexport const isApplicationLevelChange = (\n layoutChangeReason: LayoutChangeReason\n): layoutChangeReason is ApplicationLevelChange =>\n [\n \"switch-active-layout\",\n \"open-layout\",\n \"close-layout\",\n \"rename-layout\",\n ].includes(layoutChangeReason);\n\nexport const isLayoutLevelChange = (\n layoutChangeReason: LayoutChangeReason\n): layoutChangeReason is LayoutLevelChange =>\n [\n \"switch-active-tab\",\n \"edit-feature-title\",\n \"save-feature-props\",\n \"remove-component\",\n \"resize-component\",\n \"drag-drop-operation\",\n ].includes(layoutChangeReason);\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport React, { ReactElement } from \"react\";\nimport { createPlaceHolder } from \"./flexUtils\";\nimport { layoutFromJson } from \"./layoutUtils\";\nimport { swapChild } from \"./replace-layout-element\";\n\nimport {\n followPath,\n followPathToParent,\n getProp,\n getProps,\n nextStep,\n resetPath,\n typeOf,\n} from \"../utils\";\nimport { RemoveAction } from \"./layoutTypes\";\n\nexport function removeChild(layoutRoot: ReactElement, { path }: RemoveAction) {\n const target = followPath(layoutRoot, path!) as ReactElement;\n let targetParent = followPathToParent(layoutRoot, path!);\n if (targetParent === null) {\n return layoutRoot;\n }\n const { children } = getProps(targetParent);\n if (\n // this is very specific to explicitly sized components\n children.length > 1 &&\n typeOf(targetParent) !== \"Stack\" &&\n allOtherChildrenArePlaceholders(children, path)\n ) {\n const {\n style: { flexBasis, display, flexDirection, ...style },\n } = getProps(targetParent);\n let containerPath = getProp(targetParent, \"path\");\n let newLayout = swapChild(\n layoutRoot,\n targetParent,\n createPlaceHolder(containerPath, flexBasis, style)\n );\n while ((targetParent = followPathToParent(newLayout, containerPath))) {\n if (getProp(targetParent, \"path\") === \"0\") {\n break;\n }\n const { children } = getProps(targetParent);\n if (allOtherChildrenArePlaceholders(children)) {\n containerPath = getProp(targetParent, \"path\");\n const {\n style: { flexBasis, display, flexDirection, ...style },\n } = getProps(targetParent);\n newLayout = swapChild(\n layoutRoot,\n targetParent,\n createPlaceHolder(containerPath, flexBasis, style)\n );\n } else if (hasAdjacentPlaceholders(children)) {\n newLayout = collapsePlaceholders(\n layoutRoot,\n targetParent as ReactElement\n );\n } else {\n break;\n }\n }\n return newLayout;\n }\n return _removeChild(layoutRoot, target);\n}\n\nfunction _removeChild(\n container: ReactElement,\n child: ReactElement\n): ReactElement {\n const props = getProps(container);\n const { children: componentChildren, path, preserve } = props;\n let { active, id: containerId } = props;\n const { idx, finalStep } = nextStep(path, getProp(child, \"path\"));\n const type = typeOf(container) as string;\n let children = componentChildren.slice() as ReactElement[];\n\n if (finalStep) {\n children.splice(idx, 1);\n\n if (active !== undefined && active >= idx) {\n active = Math.max(0, active - 1);\n }\n\n if (children.length === 0 && preserve && type === \"Stack\") {\n const {\n path,\n style: { flexBasis },\n } = getProps(child);\n const placeHolder =\n containerId === \"main-tabs\"\n ? layoutFromJson(\n {\n props: {\n style: { flexGrow: 1, flexShrink: 1, flexBasis },\n title: \"Tab 1\",\n },\n type: \"Placeholder\",\n },\n path\n )\n : createPlaceHolder(path, flexBasis);\n children.push(placeHolder);\n } else if (\n children.length === 1 &&\n !preserve &&\n path !== \"0\" &&\n type.match(/Flexbox|Stack/)\n ) {\n return unwrap(container, children[0]);\n }\n\n if (!children.some(isFlexible) && children.some(canBeMadeFlexible)) {\n children = makeFlexible(children);\n }\n } else {\n children[idx] = _removeChild(children[idx], child) as ReactElement;\n }\n\n children = children.map((child, i) => resetPath(child, `${path}.${i}`));\n return React.cloneElement(container, { active }, children);\n}\n\nfunction unwrap(container: ReactElement, child: ReactElement) {\n const type = typeOf(container);\n const {\n path,\n style: { flexBasis, flexGrow, flexShrink, width, height },\n } = getProps(container);\n\n let unwrappedChild = resetPath(child, path);\n if (path === \"0\") {\n unwrappedChild = React.cloneElement(unwrappedChild, {\n style: {\n ...child.props.style,\n width,\n height,\n },\n });\n } else if (type === \"Flexbox\") {\n const dim =\n container.props.style.flexDirection === \"column\" ? \"height\" : \"width\";\n const {\n style: { [dim]: size, ...style },\n } = unwrappedChild.props;\n unwrappedChild = React.cloneElement(unwrappedChild, {\n flexFill: undefined,\n style: {\n ...style,\n flexGrow,\n flexShrink,\n flexBasis,\n width,\n height,\n },\n });\n }\n return unwrappedChild;\n}\n\nconst isFlexible = (element: ReactElement) => {\n return element.props.style.flexGrow > 0;\n};\n\nconst canBeMadeFlexible = (element: ReactElement) => {\n const { width, height, flexGrow } = element.props.style;\n return (\n flexGrow === 0 && typeof width !== \"number\" && typeof height !== \"number\"\n );\n};\n\nconst makeFlexible = (children: ReactElement[]) => {\n return children.map((child) =>\n canBeMadeFlexible(child)\n ? React.cloneElement(child, {\n style: {\n ...child.props.style,\n flexGrow: 1,\n },\n })\n : child\n );\n};\n\nconst hasAdjacentPlaceholders = (children: ReactElement[]) => {\n if (children && children.length > 0) {\n let wasPlaceholder = getProp(children[0], \"placeholder\");\n let isPlaceholder = false;\n for (let i = 1; i < children.length; i++) {\n isPlaceholder = getProp(children[i], \"placeholder\");\n if (wasPlaceholder && isPlaceholder) {\n return true;\n }\n wasPlaceholder = isPlaceholder;\n }\n }\n};\n\nconst collapsePlaceholders = (\n container: ReactElement,\n target: ReactElement\n) => {\n const { children: componentChildren, path } = getProps(container);\n const { idx, finalStep } = nextStep(path, getProp(target, \"path\"));\n let children = componentChildren.slice() as ReactElement[];\n if (finalStep) {\n children[idx] = _collapsePlaceHolders(target);\n } else {\n children[idx] = collapsePlaceholders(children[idx], target) as ReactElement;\n }\n\n children = children.map((child, i) => resetPath(child, `${path}.${i}`));\n return React.cloneElement(container, undefined, children);\n};\n\nconst _collapsePlaceHolders = (container: ReactElement) => {\n const { children } = getProps(container);\n const newChildren = [];\n const placeholders: ReactElement[] = [];\n\n for (let i = 0; i < children.length; i++) {\n if (getProp(children[i], \"placeholder\")) {\n placeholders.push(children[i]);\n } else {\n if (placeholders.length === 1) {\n newChildren.push(placeholders.pop());\n } else if (placeholders.length > 0) {\n newChildren.push(mergePlaceholders(placeholders));\n placeholders.length = 0;\n }\n newChildren.push(children[i]);\n }\n }\n\n if (placeholders.length === 1) {\n newChildren.push(placeholders.pop());\n } else if (placeholders.length > 0) {\n newChildren.push(mergePlaceholders(placeholders));\n }\n\n const containerPath = getProp(container, \"path\");\n return React.cloneElement(\n container,\n undefined,\n newChildren.map((child, i) => resetPath(child, `${containerPath}.${i}`))\n );\n};\n\nconst mergePlaceholders = ([placeholder, ...placeholders]: ReactElement[]) => {\n const targetStyle = getProp(placeholder, \"style\");\n let { flexBasis, flexGrow, flexShrink } = targetStyle;\n for (const {\n props: { style },\n } of placeholders) {\n flexBasis += style.flexBasis;\n flexGrow = Math.max(flexGrow, style.flexGrow);\n flexShrink = Math.max(flexShrink, style.flexShrink);\n }\n return React.cloneElement(placeholder, {\n style: { ...targetStyle, flexBasis, flexGrow, flexShrink },\n });\n};\n\nconst allOtherChildrenArePlaceholders = (\n children: ReactElement[],\n path?: string\n) =>\n children.every(\n (child) =>\n getProp(child, \"placeholder\") || (path && getProp(child, \"path\") === path)\n );\n", "import { dimension } from \"@vuu-ui/vuu-utils\";\nimport React, { CSSProperties, ReactElement } from \"react\";\nimport { followPath, getProps } from \"../utils\";\nimport { LayoutResizeAction, SplitterResizeAction } from \"./layoutTypes\";\nimport { swapChild } from \"./replace-layout-element\";\n\nexport function resizeFlexChild(\n layoutRoot: ReactElement,\n { path, size }: LayoutResizeAction\n) {\n const target = followPath(layoutRoot, path, true);\n\n const { style } = getProps(target);\n\n const newStyle = {\n ...style,\n width: size,\n };\n\n // const dimension = style.flexDirection === \"column\" ? \"height\" : \"width\";\n // const replacementChildren = applySizesToChildren(children, sizes, dimension);\n\n const replacement = React.cloneElement(target, { style: newStyle });\n\n return swapChild(layoutRoot, target, replacement);\n}\n\nexport function resizeFlexChildren(\n layoutRoot: ReactElement,\n { path, sizes }: SplitterResizeAction\n) {\n const target = followPath(layoutRoot, path, true);\n const { children, style } = getProps(target);\n\n const dimension = style.flexDirection === \"column\" ? \"height\" : \"width\";\n const replacementChildren = applySizesToChildren(children, sizes, dimension);\n\n const replacement = React.cloneElement(\n target,\n undefined,\n replacementChildren\n );\n\n return swapChild(layoutRoot, target, replacement);\n}\n\nfunction applySizesToChildren(\n children: ReactElement[],\n sizes: { currentSize: number; flexBasis: number }[],\n dimension: dimension\n) {\n return children.map((child, i) => {\n const {\n style: { [dimension]: size, flexBasis: actualFlexBasis },\n } = getProps(child);\n const meta = sizes[i];\n const { currentSize, flexBasis } = meta;\n const hasCurrentSize = currentSize !== undefined;\n const newSize = hasCurrentSize ? meta.currentSize : flexBasis;\n\n if (\n newSize === undefined ||\n size === newSize ||\n actualFlexBasis === newSize\n ) {\n return child;\n }\n return React.cloneElement(child, {\n style: applySizeToChild(child.props.style, dimension, newSize),\n });\n });\n}\n\nfunction applySizeToChild(\n style: CSSProperties,\n dimension: dimension,\n newSize: number\n) {\n const hasSize = typeof style[dimension] === \"number\";\n const { flexShrink = 1, flexGrow = 1 } = style;\n return {\n ...style,\n [dimension]: hasSize ? newSize : \"auto\",\n flexBasis: hasSize ? \"auto\" : newSize,\n flexShrink,\n flexGrow,\n };\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { getProp, getProps, nextStep, resetPath, typeOf } from \"../utils\";\nimport {\n createFlexbox,\n createPlaceHolder,\n flexDirection,\n getFlexStyle,\n getIntrinsicSize,\n wrapIntrinsicSizeComponentWithFlexbox,\n} from \"./flexUtils\";\nimport { LayoutModel } from \"./layoutTypes\";\nimport { applyLayoutProps, LayoutProps } from \"./layoutUtils\";\n\nexport interface LayoutSpec {\n type: \"Stack\" | \"Flexbox\";\n flexDirection: \"column\" | \"row\";\n showTabs?: boolean;\n}\n\nconst isHtmlElement = (component: LayoutModel) => {\n const [firstLetter] = typeOf(component) as string;\n return firstLetter === firstLetter.toLowerCase();\n};\n\nexport function wrap(\n container: ReactElement,\n existingComponent: ReactElement,\n newComponent: any,\n pos: DropPos,\n clientRect?: DropTarget[\"clientRect\"],\n dropRect?: DropTarget[\"dropRect\"]\n): ReactElement {\n const { children: containerChildren, path: containerPath } =\n getProps(container);\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n const { idx, finalStep } = nextStep(containerPath, existingComponentPath);\n const children = finalStep\n ? updateChildren(\n container,\n containerChildren,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n )\n : containerChildren.map((child: ReactElement, index: number) =>\n index === idx\n ? wrap(\n child,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n )\n : child\n );\n\n return React.cloneElement(container, undefined, children);\n}\n\nfunction updateChildren(\n container: LayoutModel,\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos,\n clientRect?: DropTarget[\"clientRect\"],\n dropRect?: rectTuple\n) {\n const intrinsicSize = getIntrinsicSize(newComponent);\n\n if (intrinsicSize?.width && intrinsicSize?.height) {\n if (clientRect === undefined || dropRect === undefined) {\n throw Error(\n \"wrap-layout-element, updateChildren clientRect and dropRect must both be available\"\n );\n }\n return wrapIntrinsicSizedComponent(\n containerChildren,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n );\n }\n return wrapFlexComponent(\n container,\n containerChildren,\n existingComponent,\n newComponent,\n pos\n );\n}\n\nfunction wrapFlexComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos\n) {\n const { version = 0 } = getProps(newComponent);\n const { path: existingComponentPath, title } = getProps(existingComponent);\n const {\n type,\n flexDirection,\n showTabs: showTabsProp,\n } = getLayoutSpecForWrapper(pos);\n const [style, existingComponentStyle, newComponentStyle] =\n getWrappedFlexStyles(\n type,\n existingComponent,\n newComponent,\n flexDirection,\n pos\n );\n const targetFirst = isTargetFirst(pos);\n const active = targetFirst ? 1 : 0;\n\n const newComponentProps = {\n resizeable: true,\n style: newComponentStyle,\n version: version + 1,\n };\n const resizeProp = isHtmlElement(existingComponent)\n ? \"data-resizeable\"\n : \"resizeable\";\n\n const existingComponentProps = {\n [resizeProp]: true,\n style: existingComponentStyle,\n };\n\n const showTabs = type === \"Stack\" ? { showTabs: showTabsProp } : undefined;\n const splitterSize =\n type === \"Flexbox\"\n ? {\n splitterSize:\n (typeOf(container) === \"Flexbox\" && container.props.splitterSize) ??\n undefined,\n }\n : undefined;\n\n const id = uuid();\n const wrapper = React.createElement(\n ComponentRegistry[type],\n {\n active,\n id,\n key: id,\n path: getProp(existingComponent, \"path\"),\n flexFill: getProp(existingComponent, \"flexFill\"),\n ...splitterSize,\n ...showTabs,\n style,\n title,\n resizeable: getProp(existingComponent, \"resizeable\"),\n } as LayoutProps,\n targetFirst\n ? [\n resetPath(\n existingComponent,\n `${existingComponentPath}.0`,\n existingComponentProps\n ),\n applyLayoutProps(\n React.cloneElement(newComponent, newComponentProps),\n `${existingComponentPath}.1`\n ),\n ]\n : [\n applyLayoutProps(\n React.cloneElement(newComponent, newComponentProps),\n `${existingComponentPath}.0`\n ),\n resetPath(\n existingComponent,\n `${existingComponentPath}.1`,\n existingComponentProps\n ),\n ]\n );\n return containerChildren.map((child: ReactElement) =>\n child === existingComponent ? wrapper : child\n );\n}\n\nfunction wrapIntrinsicSizedComponent(\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: rectTuple\n) {\n const { flexDirection } = getLayoutSpecForWrapper(pos);\n const contraDirection = flexDirection === \"column\" ? \"row\" : \"column\";\n const targetFirst = isTargetFirst(pos);\n\n const [dropLeft, dropTop, dropRight, dropBottom] = dropRect;\n const [startPlaceholder, endPlaceholder] =\n flexDirection === \"column\"\n ? [dropTop - clientRect.top, clientRect.bottom - dropBottom]\n : [dropLeft - clientRect.left, clientRect.right - dropRight];\n const pathRoot = getProp(existingComponent, \"path\");\n let pathIndex = 0;\n\n const resizeProp = isHtmlElement(existingComponent)\n ? \"data-resizeable\"\n : \"resizeable\";\n\n const wrappedChildren = [];\n if (startPlaceholder) {\n wrappedChildren.push(\n targetFirst\n ? resetPath(existingComponent, `${pathRoot}.${pathIndex++}`, {\n [resizeProp]: true,\n style: { flexBasis: startPlaceholder, flexGrow: 1, flexShrink: 1 },\n })\n : createPlaceHolder(`${pathRoot}.${pathIndex++}`, startPlaceholder, {\n flexGrow: 0,\n flexShrink: 0,\n })\n );\n }\n wrappedChildren.push(\n wrapIntrinsicSizeComponentWithFlexbox(\n newComponent,\n contraDirection,\n `${pathRoot}.${pathIndex++}`,\n clientRect,\n dropRect\n )\n );\n if (endPlaceholder) {\n wrappedChildren.push(\n targetFirst\n ? createPlaceHolder(`${pathRoot}.${pathIndex++}`, 0)\n : resetPath(existingComponent, `${pathRoot}.${pathIndex++}`, {\n [resizeProp]: true,\n style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },\n })\n );\n }\n\n const wrapper = createFlexbox(\n flexDirection,\n existingComponent.props,\n wrappedChildren,\n pathRoot\n );\n return containerChildren.map((child) =>\n child === existingComponent ? wrapper : child\n );\n}\n\nfunction getWrappedFlexStyles(\n type: string,\n existingComponent: ReactElement,\n newComponent: ReactElement,\n flexDirection: flexDirection,\n pos: DropPos\n) {\n const style = {\n ...existingComponent.props.style,\n flexDirection,\n };\n\n const dimension =\n type === \"Flexbox\" && flexDirection === \"column\" ? \"height\" : \"width\";\n const newComponentStyle = getFlexStyle(newComponent, dimension, pos);\n const existingComponentStyle = getFlexStyle(existingComponent, dimension);\n\n return [style, existingComponentStyle, newComponentStyle];\n}\n\nconst isTargetFirst = (pos: DropPos) =>\n pos.position.SouthOrEast\n ? true\n : pos?.tab?.positionRelativeToTab === \"before\"\n ? false\n : pos.position.Header\n ? true\n : false;\n\nfunction getLayoutSpecForWrapper(pos: DropPos): LayoutSpec {\n if (pos.position.Header) {\n return {\n type: \"Stack\",\n flexDirection: \"column\",\n showTabs: true,\n };\n } else {\n return {\n type: \"Flexbox\",\n flexDirection: pos.position.EastOrWest ? \"row\" : \"column\",\n };\n }\n}\n", "import { createContext, Dispatch, ReactElement } from \"react\";\nimport {\n DragStartAction,\n LayoutReducerAction,\n QueryAction,\n SaveAction,\n} from \"../layout-reducer\";\n\nconst unconfiguredLayoutProviderDispatch: LayoutProviderDispatch = (action) =>\n console.log(\n `dispatch ${action.type}, have you forgotten to provide a LayoutProvider ?`\n );\n\nexport type LayoutProviderDispatch = Dispatch<\n LayoutReducerAction | SaveAction | DragStartAction | QueryAction\n>;\n\nexport interface LayoutProviderContextProps {\n createNewChild?: (index?: number) => ReactElement;\n dispatchLayoutProvider: LayoutProviderDispatch;\n version: number;\n}\n\nexport const LayoutProviderContext = createContext<LayoutProviderContextProps>({\n dispatchLayoutProvider: unconfiguredLayoutProviderDispatch,\n version: -1,\n});\n", "import { MutableRefObject, ReactElement, useCallback, useRef } from \"react\";\nimport {\n DragDropRect,\n DragEndCallback,\n Draggable,\n DragInstructions,\n} from \"../drag-drop\";\nimport { DragStartAction } from \"../layout-reducer\";\nimport { getIntrinsicSize } from \"../layout-reducer/flexUtils\";\nimport { followPath, resolvePath } from \"../utils\";\nimport { LayoutProviderDispatch } from \"./LayoutProviderContext\";\n\nconst NO_INSTRUCTIONS = {} as DragInstructions;\nconst NO_OFFSETS: [number, number] = [0, 0];\n\ninterface CurrentDragAction extends Omit<DragStartAction, \"evt\" | \"type\"> {\n dragContainerPath: string;\n}\n\ninterface DragOperation {\n payload: ReactElement;\n originalCSS: string;\n dragRect: unknown;\n dragInstructions: DragInstructions;\n dragOffsets: [number, number];\n targetPosition: { left: number; top: number };\n}\n\nconst getDragElement = (\n rect: DragDropRect,\n id: string,\n dragElement?: HTMLElement\n): [HTMLElement, string, number, number] => {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"vuuSimpleDraggableWrapper\";\n wrapper.classList.add(\n \"vuuSimpleDraggableWrapper\",\n \"salt-theme\",\n \"salt-density-medium\"\n );\n wrapper.dataset.dragging = \"true\";\n\n const div = dragElement ?? document.createElement(\"div\");\n div.id = id;\n\n wrapper.appendChild(div);\n document.body.appendChild(wrapper);\n const cssText = `top:${rect.top}px;left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;`;\n return [wrapper, cssText, rect.left, rect.top];\n};\n\nconst determineDragOffsets = (\n draggedElement: HTMLElement\n): [number, number] => {\n const { offsetParent } = draggedElement;\n if (offsetParent === null) {\n return NO_OFFSETS;\n } else {\n const { left: offsetLeft, top: offsetTop } =\n offsetParent.getBoundingClientRect();\n return [offsetLeft, offsetTop];\n }\n};\n\nexport const useLayoutDragDrop = (\n rootLayoutRef: MutableRefObject<ReactElement>,\n dispatch: LayoutProviderDispatch,\n pathToDropTarget?: string\n) => {\n const dragActionRef = useRef<CurrentDragAction>();\n const dragOperationRef = useRef<DragOperation>();\n const draggableHTMLElementRef = useRef<HTMLElement>();\n\n const handleDrag = useCallback((x, y) => {\n if (dragOperationRef.current && draggableHTMLElementRef.current) {\n const {\n dragOffsets: [offsetX, offsetY],\n targetPosition,\n } = dragOperationRef.current;\n const left = typeof x === \"number\" ? x - offsetX : targetPosition.left;\n const top = typeof y === \"number\" ? y - offsetY : targetPosition.top;\n if (left !== targetPosition.left || top !== targetPosition.top) {\n dragOperationRef.current.targetPosition.left = left;\n dragOperationRef.current.targetPosition.top = top;\n draggableHTMLElementRef.current.style.top = top + \"px\";\n draggableHTMLElementRef.current.style.left = left + \"px\";\n }\n }\n }, []);\n\n const handleDrop: DragEndCallback = useCallback(\n (dropTarget) => {\n if (dragOperationRef.current) {\n const {\n dragInstructions,\n payload: draggedReactElement,\n originalCSS,\n } = dragOperationRef.current;\n\n if (dropTarget) {\n dispatch({\n type: \"drag-drop\",\n draggedReactElement,\n dragInstructions,\n dropTarget,\n });\n }\n\n if (draggableHTMLElementRef.current) {\n if (!dropTarget && dragInstructions.DriftHomeIfNoDropTarget) {\n console.log(\"drift back to start\");\n document.body.removeChild(draggableHTMLElementRef.current);\n } else if (dragInstructions.RemoveDraggableOnDragEnd) {\n document.body.removeChild(draggableHTMLElementRef.current);\n } else {\n draggableHTMLElementRef.current.style.cssText = originalCSS;\n delete draggableHTMLElementRef.current.dataset.dragging;\n }\n }\n\n dragActionRef.current = undefined;\n dragOperationRef.current = undefined;\n draggableHTMLElementRef.current = undefined;\n }\n },\n [dispatch]\n );\n\n const handleDragStart = useCallback(\n (evt: MouseEvent) => {\n if (dragActionRef.current) {\n const {\n payload: component,\n dragContainerPath,\n dragElement,\n dragRect,\n instructions = NO_INSTRUCTIONS,\n path,\n } = dragActionRef.current;\n const { current: rootLayout } = rootLayoutRef;\n const dragPos = { x: evt.clientX, y: evt.clientY };\n const dragPayload = component ?? followPath(rootLayout, path, true);\n const { id: dragPayloadId } = dragPayload.props;\n const intrinsicSize = getIntrinsicSize(dragPayload);\n let originalCSS = \"\",\n dragCSS = \"\",\n dragTransform = \"\";\n\n let dragStartLeft = -1;\n let dragStartTop = -1;\n let dragOffsets: [number, number] = NO_OFFSETS;\n\n let element = document.getElementById(dragPayloadId);\n\n if (element === null) {\n [element, dragCSS, dragStartLeft, dragStartTop] = getDragElement(\n dragRect,\n dragPayloadId,\n dragElement\n );\n } else {\n dragOffsets = determineDragOffsets(element);\n const [offsetLeft, offsetTop] = dragOffsets;\n const { width, height, left, top } = element.getBoundingClientRect();\n dragStartLeft = left - offsetLeft;\n dragStartTop = top - offsetTop;\n dragCSS = `width:${width}px;height:${height}px;left:${dragStartLeft}px;top:${dragStartTop}px;z-index: 100;background-color:#ccc;opacity: 0.6;`;\n element.dataset.dragging = \"true\";\n originalCSS = element.style.cssText;\n }\n\n dragTransform = Draggable.initDrag(\n rootLayoutRef.current,\n dragContainerPath,\n dragRect,\n dragPos,\n {\n drag: handleDrag,\n drop: handleDrop,\n },\n intrinsicSize\n // dropTargets\n );\n\n element.style.cssText = dragCSS + dragTransform;\n draggableHTMLElementRef.current = element;\n\n dragOperationRef.current = {\n payload: dragPayload,\n originalCSS,\n dragRect,\n dragOffsets,\n dragInstructions: instructions,\n targetPosition: { left: dragStartLeft, top: dragStartTop },\n };\n }\n },\n [handleDrag, handleDrop, rootLayoutRef]\n );\n\n const prepareToDrag = useCallback(\n (action: DragStartAction) => {\n const { evt, ...options } = action;\n dragActionRef.current = {\n ...options,\n dragContainerPath: resolvePath(rootLayoutRef.current, pathToDropTarget),\n };\n Draggable.handleMousedown(evt, handleDragStart, options.instructions);\n },\n [handleDragStart, pathToDropTarget, rootLayoutRef]\n );\n\n return prepareToDrag;\n};\n", "import { useId } from \"@vuu-ui/vuu-utils\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Header as VuuHeader } from \"../layout-header/Header\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { useView } from \"./useView\";\nimport { useViewResize } from \"./useViewResize\";\nimport { ViewContext, ViewContextAPI } from \"./ViewContext\";\nimport { ViewProps } from \"./viewTypes\";\n\nimport \"./View.css\";\n\nconst classBase = \"vuuView\";\n\ntype Props = { [key: string]: unknown };\n\nconst getProps = (state?: Props, props?: Props) => {\n if (state && props) {\n return {\n ...state,\n ...props,\n };\n } else return state || props;\n};\n\n/**\n * View is the leaf-level entity managed by the Vuu layout system. It may represent a component\n * or a group of components. It also offers an API (via useViewContext) for persistence.\n */\nconst View = forwardRef(function View(\n props: ViewProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n Header = VuuHeader,\n children,\n className,\n collapsed,\n closeable,\n \"data-path\": dataPath,\n \"data-resizeable\": dataResizeable,\n dropTargets,\n expanded,\n flexFill,\n id: idProp,\n header,\n orientation = \"horizontal\",\n path = dataPath,\n resize = \"responsive\",\n resizeable = dataResizeable,\n tearOut,\n style = {},\n title: titleProp,\n ...restProps\n } = props;\n\n const id = useId(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const [componentProps, _setComponentProps] = useState<Props>();\n const {\n contributions,\n dispatchViewAction,\n load,\n loadSession,\n onConfigChange,\n onEditTitle,\n purge,\n restoredState,\n save,\n saveSession,\n title,\n } = useView({\n id,\n rootRef,\n path,\n dropTargets,\n title: titleProp,\n });\n\n useViewResize({ mainRef, resize, rootRef });\n\n const setComponentProps = useCallback((props?: Props) => {\n _setComponentProps(props);\n }, []);\n\n const getContent = () => {\n if (React.isValidElement(children) && (restoredState || componentProps)) {\n return React.cloneElement(\n children,\n getProps(restoredState, componentProps)\n );\n }\n return children;\n };\n\n const viewContextValue: ViewContextAPI = useMemo(\n () => ({\n dispatch: dispatchViewAction,\n id,\n path,\n title,\n load,\n loadSession,\n onConfigChange,\n purge,\n save,\n saveSession,\n setComponentProps,\n }),\n [\n dispatchViewAction,\n id,\n load,\n loadSession,\n onConfigChange,\n path,\n purge,\n save,\n saveSession,\n setComponentProps,\n title,\n ]\n );\n\n const headerProps = typeof header === \"object\" ? header : {};\n\n return (\n <div\n {...restProps}\n className={cx(classBase, className, {\n [`${classBase}-collapsed`]: collapsed,\n [`${classBase}-expanded`]: expanded,\n [`${classBase}-resize-defer`]: resize === \"defer\",\n })}\n data-resizeable={resizeable}\n id={id}\n ref={useForkRef(forwardedRef, rootRef)}\n style={style}\n tabIndex={-1}\n >\n <ViewContext.Provider value={viewContextValue}>\n {header ? (\n <Header\n {...headerProps}\n collapsed={collapsed}\n contributions={contributions}\n expanded={expanded}\n closeable={closeable}\n onEditTitle={onEditTitle}\n orientation={orientation}\n tearOut={tearOut}\n title={title}\n />\n ) : null}\n <div className={`${classBase}-main`} ref={mainRef}>\n {getContent()}\n </div>\n </ViewContext.Provider>\n </div>\n );\n});\nView.displayName = \"View\";\n\ninterface ViewComponentType {\n (\n props: ViewProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n }\n ): ReactElement<ViewProps>;\n displayName?: string;\n}\n\nconst MemoView = React.memo(View) as ViewComponentType;\n\nMemoView.displayName = \"View\";\n\nregisterComponent(\"View\", MemoView, \"view\");\n\nexport { MemoView as View };\n", "import { EditableLabel } from \"@vuu-ui/vuu-ui-controls\";\nimport { Button } from \"@salt-ds/core\";\nimport { default as classnames, default as cx } from \"clsx\";\nimport {\n cloneElement,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n useRef,\n useState,\n} from \"react\";\nimport { Contribution, useViewDispatch } from \"../layout-view\";\n\nimport \"./Header.css\";\n\nexport interface HeaderProps extends HTMLAttributes<HTMLDivElement> {\n collapsed?: boolean;\n contributions?: Contribution[];\n expanded?: boolean;\n closeable?: boolean;\n onEditTitle: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n tearOut?: boolean;\n}\n\nconst classBase = \"vuuHeader\";\n\nexport const Header = ({\n className: classNameProp,\n contributions,\n collapsed,\n closeable,\n onEditTitle,\n orientation: orientationProp = \"horizontal\",\n style,\n title = \"Untitled\",\n}: HeaderProps) => {\n const labelFieldRef = useRef<HTMLDivElement>(null);\n const [value, setValue] = useState<string>(title);\n const [editing, setEditing] = useState<boolean>(false);\n\n const viewDispatch = useViewDispatch();\n const handleClose = (evt: MouseEvent) =>\n viewDispatch?.({ type: \"remove\" }, evt);\n\n const handleTitleMouseDown = () => {\n labelFieldRef.current?.focus();\n };\n\n const handleButtonMouseDown = (evt: MouseEvent) => {\n // do not allow drag to be initiated\n evt.stopPropagation();\n };\n\n const orientation = collapsed || orientationProp;\n\n const className = classnames(\n classBase,\n classNameProp,\n `${classBase}-${orientation}`\n );\n\n const handleEnterEditMode = () => {\n setEditing(true);\n };\n\n const handleTitleKeyDown = (evt: KeyboardEvent<HTMLDivElement>) => {\n if (evt.key === \"Enter\") {\n setEditing(true);\n }\n };\n\n const handleExitEditMode = (\n originalValue = \"\",\n finalValue = \"\",\n allowDeactivation = true,\n editCancelled = false\n ) => {\n setEditing(false);\n if (editCancelled) {\n setValue(originalValue);\n } else if (finalValue !== originalValue) {\n setValue(finalValue);\n onEditTitle?.(finalValue);\n }\n if (allowDeactivation === false) {\n labelFieldRef.current?.focus();\n }\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n viewDispatch?.({ type: \"mousedown\" }, e);\n };\n\n const toolbarItems: ReactElement[] = [];\n const postTitleContributedItems: ReactElement[] = [];\n const actionButtons: ReactElement[] = [];\n\n contributions?.forEach((contribution, i) => {\n switch (contribution.location) {\n case \"pre-title\":\n toolbarItems.push(cloneElement(contribution.content, { key: i }));\n break;\n default:\n postTitleContributedItems.push(\n cloneElement(contribution.content, { key: i })\n );\n }\n });\n\n title &&\n toolbarItems.push(\n <EditableLabel\n className={`${classBase}-title`}\n editing={editing}\n key=\"title\"\n value={value}\n onChange={setValue}\n onMouseDownCapture={handleTitleMouseDown}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n onKeyDown={handleTitleKeyDown}\n ref={labelFieldRef}\n tabIndex={0}\n />\n );\n\n closeable &&\n actionButtons.push(\n <Button\n data-icon=\"close\"\n key=\"close\"\n onClick={handleClose}\n onMouseDown={handleButtonMouseDown}\n variant=\"secondary\"\n />\n );\n\n postTitleContributedItems.length > 0 &&\n toolbarItems.push(\n <div className=\"vuuTooltrayProxy\" data-align=\"end\" key=\"contributions\">\n {postTitleContributedItems}\n </div>\n );\n\n actionButtons.length > 0 &&\n toolbarItems.push(\n <div className=\"vuuTooltrayProxy\" data-align=\"end\" key=\"actions\">\n {actionButtons}\n </div>\n );\n\n return (\n <div\n className={cx(\"vuuToolbarProxy\", className)}\n style={style}\n onMouseDown={handleMouseDown}\n >\n {toolbarItems}\n {/* \n {collapsed === false ? (\n <ActionButton\n aria-label=\"Minimize View\"\n actionId=\"minimize\"\n iconName=\"minimize\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {collapsed ? (\n <ActionButton\n aria-label=\"Restore View\"\n actionId=\"restore\"\n iconName=\"double-chevron-right\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {expanded === false ? (\n <ActionButton\n aria-label=\"Maximize View\"\n actionId=\"maximize\"\n iconName=\"maximize\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {expanded ? (\n <ActionButton\n aria-label=\"Restore View\"\n actionId=\"restore\"\n iconName=\"restore\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {tearOut ? (\n <ActionButton\n aria-label=\"Tear out View\"\n actionId=\"tearout\"\n iconName=\"tear-out\"\n onClick={handleAction}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null}\n {closeable ? (\n <Button\n aria-label=\"close\"\n data-icon\n onClick={handleClose}\n onMouseDown={handleButtonMouseDown}\n />\n ) : null} */}\n </div>\n );\n};\n", "import { RefObject, useCallback, useMemo } from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { useViewActionDispatcher } from \"./useViewActionDispatcher\";\n\nexport interface ViewHookProps {\n id: string;\n rootRef: RefObject<HTMLDivElement>;\n path?: string;\n dropTargets?: string[];\n title?: string;\n}\n\nexport const useView = ({\n id,\n rootRef,\n path,\n dropTargets,\n title: titleProp,\n}: ViewHookProps) => {\n const layoutDispatch = useLayoutProviderDispatch();\n\n const {\n loadState,\n loadSessionState,\n purgeState,\n saveState,\n saveSessionState,\n } = usePersistentState();\n\n const [dispatchViewAction, contributions] = useViewActionDispatcher(\n id,\n rootRef,\n path,\n dropTargets\n );\n\n const title = useMemo(\n () => loadState(\"view-title\") ?? titleProp,\n [loadState, titleProp]\n );\n\n const onEditTitle = useCallback(\n (title: string) => {\n if (path) {\n layoutDispatch({ type: \"set-title\", path, title });\n }\n },\n [layoutDispatch, path]\n );\n\n const restoredState = useMemo(() => loadState(id), [id, loadState]);\n\n const load = useCallback(\n (key?: string) => loadState(id, key),\n [id, loadState]\n );\n\n const purge = useCallback(\n (key) => {\n purgeState(id, key);\n layoutDispatch({ type: \"save\" });\n },\n [id, layoutDispatch, purgeState]\n );\n\n const save = useCallback(\n (state, key) => {\n saveState(id, key, state);\n layoutDispatch({ type: \"save\" });\n },\n [id, layoutDispatch, saveState]\n );\n const loadSession = useCallback(\n (key?: string) => loadSessionState(id, key),\n [id, loadSessionState]\n );\n const saveSession = useCallback(\n (state, key) => saveSessionState(id, key, state),\n [id, saveSessionState]\n );\n\n const onConfigChange = useCallback(\n ({ type: key, ...config }) => {\n const { [key]: data } = config;\n save(data, key);\n },\n [save]\n );\n\n return {\n contributions,\n dispatchViewAction,\n load,\n loadSession,\n onConfigChange,\n onEditTitle,\n purge,\n restoredState,\n save,\n saveSession,\n title,\n };\n};\n", "import { RefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useResizeObserver } from \"./useResizeObserver\";\nimport {\n BreakPointRamp,\n breakpointRamp,\n getBreakPoints as getDocumentBreakpoints,\n} from \"./breakpoints\";\nimport { BreakPoint, BreakPointsProp } from \"../flexbox/flexboxTypes\";\n\nconst EMPTY_ARRAY: BreakPoint[] = [];\n\nexport interface BreakpointsHookProps {\n breakPoints?: BreakPointsProp;\n smallerThan?: string;\n}\n\n// TODO how do we cater for smallerThan/greaterThan breakpoints\nexport const useBreakpoints = (\n { breakPoints: breakPointsProp, smallerThan }: BreakpointsHookProps,\n ref: RefObject<HTMLElement>\n) => {\n const [breakpointMatch, setBreakpointmatch] = useState(\n smallerThan ? false : \"lg\"\n );\n const bodyRef = useRef(document.body);\n const breakPointsRef = useRef<BreakPointRamp[]>(\n breakPointsProp ? breakpointRamp(breakPointsProp) : getDocumentBreakpoints()\n );\n\n // TODO how do we identify the default\n const sizeRef = useRef(\"lg\");\n\n const stopFromMinWidth = useCallback(\n (w) => {\n if (breakPointsRef.current) {\n for (const [name, size] of breakPointsRef.current) {\n if (w >= size) {\n return name;\n }\n }\n }\n },\n [breakPointsRef]\n );\n\n const matchSizeAgainstBreakpoints = useCallback(\n (width) => {\n if (smallerThan) {\n const breakPointRamp = breakPointsRef.current.find(\n ([name]: BreakPointRamp) => name === smallerThan\n );\n if (breakPointRamp) {\n const [, , maxValue] = breakPointRamp;\n return width < maxValue;\n }\n } else {\n return stopFromMinWidth(width);\n }\n // is this right ?\n return width;\n },\n [smallerThan, stopFromMinWidth]\n );\n\n // TODO need to make the dimension a config\n useResizeObserver(\n ref || bodyRef,\n breakPointsRef.current ? [\"width\"] : EMPTY_ARRAY,\n ({ width: measuredWidth }: { width?: number }) => {\n const result = matchSizeAgainstBreakpoints(measuredWidth);\n if (result !== sizeRef.current) {\n sizeRef.current = result;\n setBreakpointmatch(result);\n }\n },\n true\n );\n\n useEffect(() => {\n const target = ref || bodyRef;\n if (target.current) {\n const prevSize = sizeRef.current;\n if (breakPointsRef.current) {\n // We're measuring here when the resizeObserver has also measured\n // There isn't a convenient way to get the Resizeobserver to\n // notify initial size - that's not really its job, unless we\n // set a flag ?\n const { clientWidth } = target.current;\n const result = matchSizeAgainstBreakpoints(clientWidth);\n sizeRef.current = result;\n // If initial size of ref does not match the default, notify client after render\n if (result !== prevSize) {\n setBreakpointmatch(result);\n }\n }\n }\n }, [setBreakpointmatch, matchSizeAgainstBreakpoints, ref]);\n\n // No, just ass the class directly to the ref, no need to render\n return breakpointMatch;\n};\n", "/* eslint-disable no-restricted-syntax */\nimport { useCallback, useLayoutEffect, useRef, RefObject } from \"react\";\nexport const WidthHeight = [\"height\", \"width\"];\nexport const HeightOnly = [\"height\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n scrollHeight?: T;\n scrollWidth?: T;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new WeakMap<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n contentRect: DOMRectReadOnly,\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return contentRect.height;\n case \"scrollHeight\":\n return element.scrollHeight;\n case \"scrollWidth\":\n return element.scrollWidth;\n case \"width\":\n return contentRect.width;\n default:\n return 0;\n }\n};\n\nexport const resizeObserver = new ResizeObserver(\n (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, contentRect } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n contentRect,\n dimension as measuredDimension\n );\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n onResize && onResize(measurements);\n }\n }\n }\n }\n);\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\n// Note asking for scrollHeight alone will not trigger onResize, this is only triggered by height,\n// with scrollHeight returned as an auxilliary value\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n): void {\n const dimensionsRef = useRef(dimensions);\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const rect = target.getBoundingClientRect();\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(target, rect, dim as measuredDimension);\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useLayoutEffect(() => {\n const target = ref.current as HTMLElement;\n let cleanedUp = false;\n\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n cleanedUp = false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { fonts } = document as any;\n if (fonts) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n await fonts.ready;\n }\n if (!cleanedUp) {\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n }\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n throw Error(\n \"useResizeObserver attemping to observe same element twice\"\n );\n }\n void registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n cleanedUp = true;\n }\n };\n }, [ref, measure, reportInitialSize, onResize]);\n\n useLayoutEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n\n // TODO might be a good idea to ref and return the current measurememnts. That way, derived hooks\n // e.g useBreakpoints don't have to measure and client cn make onResize callback simpler\n}\n", "// should we have some global; defaults ?\n\nimport { BreakPointsProp } from \"../flexbox/flexboxTypes\";\n\nexport type BreakPointRamp = [string, number, number];\n\nfunction breakpointReader(\n themeName: string,\n defaultBreakpoints?: BreakPointsProp\n) {\n //TODO ownerDocument\n const themeRoot = document.body.querySelector(`.${themeName}`);\n const handler = {\n get: function (style: CSSStyleDeclaration, stopName: string) {\n const val = style.getPropertyValue(\n // lets assume we have the following naming convention\n `--${themeName}-breakpoint-${stopName}`\n );\n return val ? parseInt(val) : undefined;\n },\n };\n\n return themeRoot\n ? new Proxy(getComputedStyle(themeRoot), handler)\n : defaultBreakpoints ?? {};\n}\n\nconst byDescendingStopSize = (\n [, s1]: [string, number],\n [, s2]: [string, number]\n) => s2 - s1;\n\n// These are assumed to be min-width (aka mobile-first) stops, we could take a\n// paramneter to support max-width as well ?\n// return [stopName, minWidth, maxWidth]\nexport const breakpointRamp = (\n breakpoints: BreakPointsProp\n): BreakPointRamp[] =>\n Object.entries(breakpoints)\n .sort(byDescendingStopSize)\n .map(([name, value], i, all) => [\n name,\n value,\n i < all.length - 1 ? all[i + 1][1] : 9999,\n ]);\n\nlet documentBreakpoints: BreakPointRamp[] | null = null;\n\nconst loadBreakpoints = (themeName = \"salt\") => {\n // TODO would be nice to read these breakpoint labels from a css variable to\n // avoid hard-coding them here ?\n const { xs, sm, md, lg, xl } = breakpointReader(themeName) as BreakPointsProp;\n return breakpointRamp({ xs, sm, md, lg, xl });\n};\n\n//TODO support multiple themes loaded\nexport const getBreakPoints = (themeName?: string) => {\n if (documentBreakpoints === null) {\n documentBreakpoints = loadBreakpoints(themeName);\n }\n return documentBreakpoints;\n};\n", "const COLLAPSIBLE = 'data-collapsible';\n\nconst RESPONSIVE_ATTRIBUTE: { [key: string]: boolean } = {\n [COLLAPSIBLE]: true,\n 'data-pad-start': true,\n 'data-pad-end': true\n};\n\nexport const isResponsiveAttribute = (propName: string): boolean =>\n RESPONSIVE_ATTRIBUTE[propName] ?? false;\n\nconst isCollapsible = (propName: string) => propName === COLLAPSIBLE;\n\nconst COLLAPSIBLE_VALUE: { [key: string]: string } = {\n dynamic: 'dynamic',\n instant: 'instant',\n true: 'instant'\n};\n\nconst collapsibleValue = (value: string) => COLLAPSIBLE_VALUE[value] ?? 'none';\n\ntype Props = { [key: string]: any };\nexport const extractResponsiveProps = (props: Props) => {\n return Object.keys(props).reduce<[Props, Props]>(\n (result, propName) => {\n const [toolbarProps, rest] = result;\n if (isResponsiveAttribute(propName)) {\n const value = isCollapsible(propName) ? collapsibleValue(props[propName]) : props[propName];\n\n toolbarProps[propName] = value;\n rest[propName] = undefined;\n }\n return result;\n },\n [{}, {}]\n );\n};\n", "import { useResizeObserver, WidthHeight } from \"../responsive\";\nimport { RefObject, useCallback, useRef } from \"react\";\n\nconst NO_MEASUREMENT: string[] = [];\n\ntype size = {\n height?: number;\n width?: number;\n};\n\nexport interface ViewResizeHookProps {\n mainRef: RefObject<HTMLDivElement>;\n resize?: \"defer\" | \"responsive\";\n rootRef: RefObject<HTMLDivElement>;\n}\n\nexport const useViewResize = ({\n mainRef,\n resize = \"responsive\",\n rootRef,\n}: ViewResizeHookProps) => {\n const deferResize = resize === \"defer\";\n\n const mainSize = useRef<size>({});\n const resizeHandle = useRef<number>();\n\n const setMainSize = useCallback(() => {\n if (mainRef.current) {\n mainRef.current.style.height = mainSize.current.height + \"px\";\n mainRef.current.style.width = mainSize.current.width + \"px\";\n }\n resizeHandle.current = undefined;\n }, [mainRef]);\n\n const onResize = useCallback(\n ({ height, width }) => {\n mainSize.current.height = height;\n mainSize.current.width = width;\n if (resizeHandle.current !== null) {\n clearTimeout(resizeHandle.current);\n }\n resizeHandle.current = window.setTimeout(setMainSize, 40);\n },\n [setMainSize]\n );\n\n useResizeObserver(\n rootRef,\n deferResize ? WidthHeight : NO_MEASUREMENT,\n onResize,\n deferResize\n );\n};\n", "import React, { SyntheticEvent, useContext } from \"react\";\nimport { ViewAction } from \"./viewTypes\";\n\nexport type QueryReponse = { [key: string]: unknown };\n\nexport type ViewDispatch = <Action extends ViewAction = ViewAction>(\n action: Action,\n evt?: SyntheticEvent\n) => Promise<boolean | QueryReponse | void>;\n\n/**\n * This API is available to any Feature hosted within Vuu (as all Features are wrapped\n * with View component). It offers metadata about the View as well as access to the\n * Vuu persistencew API;\n */\nexport interface ViewContextAPI {\n /**\n * dispatcher for View actions. These are a subset of LayoutActions, specifically for\n * View manipulation\n */\n dispatch?: ViewDispatch | null;\n id?: string;\n load?: (key?: string) => unknown;\n loadSession?: (key?: string) => unknown;\n onConfigChange?: (config: unknown) => void;\n path?: string;\n purge?: (key: string) => void;\n save?: (state: unknown, key: string) => void;\n saveSession?: (state: unknown, key: string) => void;\n setComponentProps: (props: { [key: string]: unknown }) => void;\n title?: string;\n}\n\nconst NO_CONTEXT = { dispatch: null } as ViewContextAPI;\nexport const ViewContext = React.createContext<ViewContextAPI>(NO_CONTEXT);\n\nexport const useViewDispatch = () => {\n const context = useContext(ViewContext);\n return context?.dispatch ?? null;\n};\n\nexport const useViewContext = () => useContext(ViewContext);\n", "import cx from \"clsx\";\nimport React, {\n HTMLAttributes,\n KeyboardEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport \"./Splitter.css\";\n\nconst classBase = \"vuuSplitter\";\n\nexport type SplitterDragStartHandler = (index: number) => void;\nexport type SplitterDragHandler = (index: number, distance: number) => void;\nexport type SplitterDragEndHandler = () => void;\n\nexport interface SplitterProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onDrag\" | \"onDragStart\"> {\n //TODO change to alignment (vertical | horizontal)\n column: boolean;\n index: number;\n onDragStart: SplitterDragStartHandler;\n onDrag: SplitterDragHandler;\n onDragEnd: SplitterDragEndHandler;\n}\n\nexport const Splitter = React.memo(function Splitter({\n column,\n index,\n onDrag,\n onDragEnd,\n onDragStart,\n style,\n}: SplitterProps) {\n const ignoreClick = useRef<boolean>();\n const rootRef = useRef<HTMLDivElement>(null);\n const lastPos = useRef<number>(0);\n\n const [active, setActive] = useState(false);\n\n const handleKeyDownDrag = useCallback(\n ({ key, shiftKey }) => {\n const distance = shiftKey ? 10 : 1;\n if (column && key === \"ArrowDown\") {\n onDrag(index, distance);\n } else if (column && key === \"ArrowUp\") {\n onDrag(index, -distance);\n } else if (!column && key === \"ArrowLeft\") {\n onDrag(index, -distance);\n } else if (!column && key === \"ArrowRight\") {\n onDrag(index, distance);\n }\n },\n [column, index, onDrag]\n );\n\n const handleKeyDownInitDrag = useCallback(\n (evt) => {\n const { key } = evt;\n const horizontalMove = key === \"ArrowLeft\" || key === \"ArrowRight\";\n const verticalMove = key === \"ArrowUp\" || key === \"ArrowDown\";\n if ((column && verticalMove) || (!column && horizontalMove)) {\n onDragStart(index);\n handleKeyDownDrag(evt);\n keyDownHandlerRef.current = handleKeyDownDrag;\n }\n },\n [column, handleKeyDownDrag, index, onDragStart]\n );\n\n const keyDownHandlerRef = useRef(handleKeyDownInitDrag);\n const handleKeyDown = (evt: KeyboardEvent) => keyDownHandlerRef.current(evt);\n\n const handleMouseMove = useCallback(\n (e) => {\n ignoreClick.current = true;\n const pos = e[column ? \"clientY\" : \"clientX\"];\n const diff = pos - lastPos.current;\n if (pos && pos !== lastPos.current) {\n onDrag(index, diff);\n }\n lastPos.current = pos;\n },\n [column, index, onDrag]\n );\n\n const handleMouseUp = useCallback(() => {\n window.removeEventListener(\"mousemove\", handleMouseMove, false);\n window.removeEventListener(\"mouseup\", handleMouseUp, false);\n onDragEnd();\n setActive(false);\n rootRef.current?.focus();\n }, [handleMouseMove, onDragEnd, setActive]);\n\n const handleMouseDown = useCallback(\n (e) => {\n lastPos.current = column ? e.clientY : e.clientX;\n onDragStart(index);\n window.addEventListener(\"mousemove\", handleMouseMove, false);\n window.addEventListener(\"mouseup\", handleMouseUp, false);\n e.preventDefault();\n setActive(true);\n },\n [column, handleMouseMove, handleMouseUp, index, onDragStart, setActive]\n );\n\n const handleClick = () => {\n if (ignoreClick.current) {\n ignoreClick.current = false;\n } else {\n rootRef.current?.focus();\n }\n };\n\n const handleBlur = () => {\n keyDownHandlerRef.current = handleKeyDownInitDrag;\n };\n\n const className = cx(classBase, {\n [`${classBase}-active`]: active,\n [`${classBase}-column`]: column,\n });\n return (\n <div\n className={className}\n data-splitter\n ref={rootRef}\n role=\"separator\"\n style={style}\n onBlur={handleBlur}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n tabIndex={0}\n >\n <div className={`${classBase}-grab-zone`} />\n </div>\n );\n});\n", "import { ReactElement } from \"react\";\nimport {\n getIntrinsicSize,\n hasUnboundedFlexStyle,\n} from \"../layout-reducer/flexUtils\";\nimport { getProp } from \"../utils\";\nimport type { BreakPoint, ContentMeta } from \"./flexboxTypes\";\n\nconst NO_INTRINSIC_SIZE: {\n height?: number;\n width?: number;\n} = {};\n\nexport const SPLITTER = 1;\nexport const PLACEHOLDER = 2;\n\nconst isIntrinsicallySized = (item: ContentMeta) =>\n typeof item.intrinsicSize === \"number\";\n\nconst getBreakPointValues = (\n breakPoints: BreakPoint[],\n component: ReactElement\n) => {\n const values: { [key: string]: number | undefined } = {};\n breakPoints.forEach((breakPoint) => {\n values[breakPoint] = getProp(component, breakPoint);\n });\n return values;\n};\n\nexport const gatherChildMeta = (\n children: ReactElement[],\n dimension: \"width\" | \"height\",\n breakPoints?: BreakPoint[]\n) => {\n return children.map((child, index) => {\n const resizeable = getProp(child, \"resizeable\");\n const { [dimension]: intrinsicSize } =\n getIntrinsicSize(child) ?? NO_INTRINSIC_SIZE;\n const flexOpen = hasUnboundedFlexStyle(child);\n if (breakPoints) {\n return {\n index,\n flexOpen,\n intrinsicSize,\n resizeable,\n ...getBreakPointValues(breakPoints, child),\n };\n } else {\n return { index, flexOpen, intrinsicSize, resizeable };\n }\n });\n};\n\n// Splitters are inserted AFTER the associated index, so\n// never a splitter in last position.\n// Placeholder goes before (first) OR after(last) index\nexport const findSplitterAndPlaceholderPositions = (\n childMeta: ContentMeta[]\n) => {\n const count = childMeta.length;\n const allIntrinsic = childMeta.every(isIntrinsicallySized);\n const splitterPositions = Array(count).fill(0);\n if (allIntrinsic && count > 0) {\n splitterPositions[0] = PLACEHOLDER;\n splitterPositions[count - 1] = PLACEHOLDER;\n }\n if (count < 2) {\n return splitterPositions;\n } else {\n // 1) From the left, check each item.\n // Once we hit a resizable item, set this index and all subsequent indices,\n // except for last, to SPLITTER\n for (let i = 0, resizeablesLeft = 0; i < count - 1; i++) {\n if (childMeta[i].resizeable && !resizeablesLeft) {\n resizeablesLeft = SPLITTER;\n }\n splitterPositions[i] += resizeablesLeft;\n }\n // 2) Now check from the right. Undo splitter insertion until we reach a point\n // where there is a resizeable to our right.\n for (let i = count - 1; i > 0; i--) {\n if (splitterPositions[i] & SPLITTER) {\n splitterPositions[i] -= SPLITTER;\n }\n if (childMeta[i].resizeable) {\n break;\n }\n }\n return splitterPositions;\n }\n};\n\nexport const identifyResizeParties = (\n contentMeta: ContentMeta[],\n idx: number\n) => {\n const idx1 = getLeadingResizeablePos(contentMeta, idx);\n const idx2 = getTrailingResizeablePos(contentMeta, idx);\n const participants = idx1 !== -1 && idx2 !== -1 ? [idx1, idx2] : undefined;\n const bystanders = identifyResizeBystanders(contentMeta, participants);\n return [participants, bystanders];\n};\n\nfunction identifyResizeBystanders(\n contentMeta: ContentMeta[],\n participants?: number[]\n) {\n if (participants) {\n const bystanders = [];\n for (let i = 0; i < contentMeta.length; i++) {\n if (contentMeta[i].flexOpen && !participants.includes(i)) {\n bystanders.push(i);\n }\n }\n return bystanders;\n }\n}\n\nfunction getLeadingResizeablePos(contentMeta: ContentMeta[], idx: number) {\n let pos = idx,\n resizeable = false;\n while (pos >= 1 && !resizeable) {\n pos = pos - 1;\n resizeable = isResizeable(contentMeta, pos);\n }\n return pos;\n}\n\nfunction getTrailingResizeablePos(contentMeta: ContentMeta[], idx: number) {\n let pos = idx,\n resizeable = false;\n const count = contentMeta.length;\n while (pos < count - 1 && !resizeable) {\n pos = pos + 1;\n resizeable = isResizeable(contentMeta, pos);\n }\n return pos === count ? -1 : pos;\n}\n\nfunction isResizeable(contentMeta: ContentMeta[], idx: number): boolean {\n const { placeholder, splitter, resizeable, intrinsicSize } = contentMeta[idx];\n return Boolean(!splitter && !intrinsicSize && (placeholder || resizeable));\n}\n", "import { useCallback } from \"react\";\nimport { Action } from \"../layout-action\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { SplitterResizeAction } from \"../layout-reducer\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport Flexbox from \"./Flexbox\";\nimport { FlexboxLayoutProps } from \"./flexboxTypes\";\n\nexport const FlexboxLayout = function FlexboxLayout(props: FlexboxLayoutProps) {\n const { path } = props;\n const dispatch = useLayoutProviderDispatch();\n\n const handleSplitterMoved = useCallback(\n (sizes) => {\n dispatch({\n type: Action.SPLITTER_RESIZE,\n path,\n sizes,\n } as SplitterResizeAction);\n },\n [dispatch, path]\n );\n\n return <Flexbox {...props} onSplitterMoved={handleSplitterMoved} />;\n};\nFlexboxLayout.displayName = \"Flexbox\";\n\nregisterComponent(\"Flexbox\", FlexboxLayout, \"container\");\n", "import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { ForwardedRef, forwardRef, useMemo } from \"react\";\nimport { useBreakpoints } from \"../responsive\";\nimport { asReactElements } from \"../utils\";\nimport { FlexboxProps } from \"./flexboxTypes\";\nimport \"./FluidGrid.css\";\nimport { useResponsiveSizing } from \"./useResponsiveSizing\";\n\nconst classBase = \"hwFluidGrid\";\n\nexport interface FluidGridProps extends FlexboxProps {\n showGrid?: boolean;\n}\n\nexport const FluidGrid = forwardRef(function FluidGrid(\n props: FluidGridProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const {\n breakPoints,\n children: childrenProp,\n column,\n cols: colsProp = 12,\n className: classNameProp,\n flexFill,\n gap = 3,\n fullPage,\n id,\n onSplitterMoved,\n resizeable,\n row,\n showGrid,\n spacing,\n splitterSize,\n style: styleProp,\n ...rest\n } = props;\n\n //TODO does thie useMemo serve any actual purpose or will childrenProp\n // always be new anyway ?\n const children = useMemo(() => {\n return asReactElements(childrenProp);\n }, [childrenProp]);\n\n const { cols, content, rootRef } = useResponsiveSizing({\n children,\n cols: colsProp,\n style: styleProp,\n });\n\n const breakpoint = useBreakpoints(\n {\n breakPoints,\n },\n rootRef\n );\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-column`]: column,\n [`${classBase}-row`]: row,\n [`${classBase}-show-grid`]: showGrid,\n \"flex-fill\": flexFill,\n \"full-page\": fullPage,\n });\n\n const style = {\n ...styleProp,\n \"--spacing\": spacing,\n \"--grid-col-count\": cols,\n \"--grid-gap\": gap,\n };\n\n return (\n <div\n {...rest}\n className={className}\n data-breakpoint={breakpoint}\n data-cols={cols}\n data-resizeable={resizeable || undefined}\n id={id}\n ref={useForkRef(rootRef, ref)}\n style={style}\n >\n {content}\n </div>\n );\n});\nFluidGrid.displayName = \"FluidGrid\";\n", "import { getUniqueId } from \"@vuu-ui/vuu-utils\";\nimport {\n cloneElement,\n CSSProperties,\n isValidElement,\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport { gatherChildMeta } from \"./flexbox-utils\";\nimport { BreakPoint } from \"./flexboxTypes\";\n\nconst breakPoints: BreakPoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"];\n\nconst DEFAULT_COLS = 12;\n\nexport const useResponsiveSizing = ({\n children: childrenProp,\n cols: colsProp,\n style,\n}: {\n children: ReactElement[];\n cols?: number;\n style?: CSSProperties;\n}) => {\n const rootRef = useRef(null);\n const metaRef = useRef(null);\n const contentRef = useRef<ReactElement[]>();\n const cols = colsProp ?? DEFAULT_COLS;\n\n const isColumn = style?.flexDirection === \"column\";\n const dimension = isColumn ? \"height\" : \"width\";\n\n const children = useMemo(\n () =>\n Array.isArray(childrenProp)\n ? childrenProp\n : isValidElement(childrenProp)\n ? [childrenProp]\n : [],\n [childrenProp]\n );\n\n const buildContent = useCallback(\n (children, dimension): [ReactElement[], any] => {\n const childMeta = gatherChildMeta(children, dimension, breakPoints);\n const content = [];\n const meta = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const {\n style: { flex, ...rest },\n } = child.props;\n content.push(\n cloneElement(child, {\n key: getUniqueId(),\n style: {\n ...rest,\n \"--parent-col-count\": cols,\n },\n })\n );\n meta.push(childMeta[i]);\n }\n return [content, meta];\n },\n [cols]\n );\n\n useMemo(() => {\n const [content, meta] = buildContent(children, dimension);\n metaRef.current = meta;\n contentRef.current = content;\n }, [buildContent, children, dimension]);\n\n return {\n cols,\n content: contentRef.current,\n rootRef,\n };\n};\n", "import { registerComponent } from '../registry/ComponentRegistry';\nimport { FluidGrid, FluidGridProps } from './FluidGrid';\n\nexport const FluidGridLayout = function FluidGridLayout(props: FluidGridProps) {\n return <FluidGrid {...props} />;\n};\nFluidGridLayout.displayName = 'FluidGrid';\n\nregisterComponent('FluidGrid', FluidGridLayout, 'container');\n", "import { CSSProperties, forwardRef, ForwardedRef, HTMLAttributes } from \"react\";\nimport { MeasuredSize, useMeasuredContainer } from \"./useMeasuredContainer\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\n\nimport \"./MeasuredContainer.css\";\n\nexport interface MeasuredContainerProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * A numeric value for height will result in a fixed height. To adapt to container\n * use either a percentage height or 'auto'. Always use 'auto' when rendering\n * within a column based flex container, together with a flex value (use the\n * --vuuMeasuredContainer-flex CSS custom property))\n */\n height?: number | string;\n onResize?: (size: MeasuredSize) => void;\n width?: number | string;\n}\n\nconst baseClass = \"vuuMeasuredContainer\";\n\nexport const MeasuredContainer = forwardRef(function MeasuredContainer(\n {\n children,\n className,\n height,\n onResize,\n style,\n width,\n ...htmlAttributes\n }: MeasuredContainerProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { containerRef, ...containerMeasurements } = useMeasuredContainer({\n height,\n onResize,\n width,\n });\n\n const { cssSize, innerSize } = containerMeasurements;\n const unmeasured = innerSize === undefined;\n\n const getStyle = () => {\n return unmeasured\n ? ({\n \"--measured-css-height\": `${cssSize.height}`,\n \"--measured-css-width\": `${cssSize.width}`,\n } as CSSProperties)\n : ({\n ...style,\n \"--measured-css-height\": `${cssSize.height}`,\n \"--measured-css-width\": `${cssSize.width}`,\n \"--measured-px-height\": `${innerSize?.height}px`,\n \"--measured-px-width\": `${innerSize?.width}px`,\n } as CSSProperties);\n };\n\n const forkedRef = useForkRef(containerRef, forwardedRef);\n\n return unmeasured ? (\n <div\n {...htmlAttributes}\n className={cx(baseClass, `${baseClass}-ummeasured`)}\n style={getStyle()}\n ref={containerRef}\n />\n ) : (\n <div\n {...htmlAttributes}\n className={cx(baseClass, className)}\n ref={forkedRef}\n style={getStyle()}\n >\n {children}\n </div>\n );\n});\n", "import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport {\n CSSProperties,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { MeasuredContainerProps } from \"./MeasuredContainer\";\nimport { useResizeObserver, ResizeHandler } from \"./useResizeObserver\";\n\nconst ClientWidthHeight = [\"clientHeight\", \"clientWidth\"];\nconst WidthOnly = [\"clientWidth\"];\nconst HeightOnly = [\"clientHeight\"];\nconst NO_MEASUREMENT = [] as const;\n\nexport interface ClientSize {\n clientHeight: number;\n clientWidth: number;\n}\n\nexport interface MeasuredProps\n extends Pick<MeasuredContainerProps, \"height\" | \"onResize\" | \"width\"> {\n defaultHeight?: number;\n defaultWidth?: number;\n}\n\nexport type CssSize = Pick<CSSProperties, \"height\" | \"width\">;\n\nexport interface MeasuredSize {\n height: number;\n width: number;\n}\n\ninterface MeasuredState {\n css: CssSize;\n outer: CssSize;\n inner?: MeasuredSize;\n}\n\nconst isNumber = (val: unknown): val is number => Number.isFinite(val);\n\nconst FULL_SIZE: CssSize = { height: \"100%\", width: \"auto\" };\n\nexport interface MeasuredContainerHookResult {\n containerRef: RefObject<HTMLDivElement>;\n cssSize: CssSize;\n outerSize: CssSize;\n innerSize?: MeasuredSize;\n}\n\n// If (outer) height and width are known at initialisation (i.e. they\n// were passed as props), use as initial values for inner size. If there\n// is no border on Table, these values will not change. If there is a border,\n// inner values will be updated once measured.\nconst getInitialCssSize = (\n height?: number | string,\n width?: number | string\n): CssSize => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height: `${height}px`,\n width: `${width}px`,\n };\n } else if (typeof height === \"string\" || typeof width === \"string\") {\n return {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n };\n } else {\n return FULL_SIZE;\n }\n};\n\nconst getInitialInnerSize = (\n height: unknown,\n width: unknown\n): MeasuredSize | undefined => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height,\n width,\n };\n }\n};\n\nexport const useMeasuredContainer = ({\n defaultHeight = 0,\n defaultWidth = 0,\n height,\n onResize: onResizeProp,\n width,\n}: MeasuredProps): MeasuredContainerHookResult => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<MeasuredState>({\n css: getInitialCssSize(height, width),\n inner: getInitialInnerSize(height, width),\n outer: {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n },\n });\n const fixedHeight = typeof height === \"number\";\n const fixedWidth = typeof width === \"number\";\n\n const dimensions =\n fixedHeight && fixedWidth\n ? NO_MEASUREMENT\n : fixedHeight\n ? WidthOnly\n : fixedWidth\n ? HeightOnly\n : ClientWidthHeight;\n\n useMemo(() => {\n setSize((currentSize) => {\n const { inner, outer } = currentSize;\n if (isValidNumber(height) && isValidNumber(width) && inner && outer) {\n const { height: innerHeight, width: innerWidth } = inner;\n const { height: outerHeight, width: outerWidth } = outer;\n\n if (outerHeight !== height || outerWidth !== width) {\n const heightDiff = isValidNumber(outerHeight)\n ? outerHeight - innerHeight\n : 0;\n const widthDiff = isValidNumber(outerWidth)\n ? outerWidth - innerWidth\n : 0;\n return {\n ...currentSize,\n outer: { height, width },\n inner: { height: height - heightDiff, width: width - widthDiff },\n };\n }\n }\n return currentSize;\n });\n }, [height, width]);\n\n const onResize: ResizeHandler = useCallback(\n ({ clientWidth, clientHeight }: Partial<ClientSize>) => {\n const { css, inner, outer } = size;\n let newState: MeasuredState = size;\n\n if (\n fixedHeight &&\n isNumber(clientWidth) &&\n Math.floor(clientWidth) !== inner?.width\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height,\n },\n };\n } else if (\n fixedWidth &&\n isNumber(clientHeight) &&\n Math.floor(clientHeight) !== inner?.height\n ) {\n newState = {\n css,\n outer,\n inner: {\n height: Math.floor(clientHeight) || defaultHeight,\n width,\n },\n };\n } else if (\n isNumber(clientHeight) &&\n isNumber(clientWidth) &&\n (clientWidth !== inner?.width || clientHeight !== inner?.height)\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height: Math.floor(clientHeight) || defaultHeight,\n },\n };\n }\n\n if (newState !== size) {\n setSize(newState);\n }\n },\n [defaultHeight, defaultWidth, fixedHeight, fixedWidth, height, size, width]\n );\n\n useEffect(() => {\n if (size.inner) {\n onResizeProp?.(size.inner);\n }\n }, [onResizeProp, size.inner]);\n\n useResizeObserver(containerRef, dimensions, onResize, true);\n\n return {\n containerRef,\n cssSize: size.css,\n outerSize: size.outer,\n innerSize: size.inner,\n };\n};\n", "import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n clientHeight?: number;\n clientWidth?: number;\n contentHeight?: number;\n contentWidth?: number;\n scrollHeight?: number;\n scrollWidth?: number;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new Map<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n size: {\n height: number;\n width: number;\n contentHeight: number;\n contentWidth: number;\n },\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return size.height;\n case \"clientHeight\":\n return Math.floor(element.clientHeight);\n case \"clientWidth\":\n return Math.floor(element.clientWidth);\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(Math.floor(element.scrollHeight));\n case \"scrollWidth\":\n return Math.ceil(Math.floor(element.scrollWidth));\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\n// TODO should we make this create-on-demand\nconst resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const [{ blockSize: height, inlineSize: width }] = borderBoxSize;\n const [{ blockSize: contentHeight, inlineSize: contentWidth }] =\n contentBoxSize;\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n { height, width, contentHeight, contentWidth },\n dimension as measuredDimension\n );\n\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n // TODO only return measured sizes\n onResize && onResize(measurements);\n }\n }\n }\n});\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: readonly string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n) {\n const dimensionsRef = useRef(dimensions);\n\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const { width, height } = target.getBoundingClientRect();\n const { clientWidth: contentWidth, clientHeight: contentHeight } = target;\n const flooredHeight = Math.floor(height);\n const flooredWidth = Math.floor(width);\n\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n {\n width: flooredWidth,\n height: flooredHeight,\n contentHeight,\n contentWidth,\n },\n dim as measuredDimension\n );\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useEffect(() => {\n const target = ref.current as HTMLElement;\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n // await document.fonts.ready;\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n } else {\n console.log(\n `%cuseResizeObserver an target expected to be under observation wa snot found. This warrants investigation`,\n \"font-weight:bold; color:red;\"\n );\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n console.log(\n `useResizeObserver attemping to observe same element twice`,\n {\n target,\n }\n );\n // throw Error(\n // \"useResizeObserver attemping to observe same element twice\"\n // );\n }\n // TODO set a pending entry on map\n registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, ref]);\n\n useEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n}\n", "import { PopupMenu, PopupMenuProps } from \"@vuu-ui/vuu-popups\";\nimport { orientationType, useId } from \"@vuu-ui/vuu-utils\";\n\nimport cx from \"clsx\";\nimport React, {\n CSSProperties,\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n} from \"react\";\nimport { asReactElements } from \"../utils\";\nimport { OverflowItem } from \"./overflow-utils\";\nimport { useOverflowContainer } from \"./useOverflowContainer\";\n\nimport \"./OverflowContainer.css\";\n\nconst classBase = \"vuuOverflowContainer\";\n\nexport interface OverflowContainerProps extends HTMLAttributes<HTMLDivElement> {\n PopupMenuProps?: Partial<PopupMenuProps>;\n allowDragDrop?: boolean;\n debugId?: string;\n height: number;\n onMoveItem?: (fromIndex: number, toIndex: number) => void;\n onSwitchWrappedItemIntoView?: (overflowItem: OverflowItem) => void;\n orientation?: orientationType;\n overflowIcon?: string;\n overflowPosition?: \"start\" | \"end\" | number;\n}\n\nconst WrapContainer = React.memo(\n ({\n PopupMenuProps,\n allowDragDrop,\n children,\n className: classNameProp,\n height: heightProp,\n id,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation = \"horizontal\",\n overflowIcon,\n overflowPosition = \"end\",\n }: OverflowContainerProps) => {\n const childElements = asReactElements(children);\n const {\n draggable,\n draggedItemIndex,\n menuActionHandler,\n menuBuilder,\n onItemMouseDown,\n rootRef,\n } = useOverflowContainer({\n allowDragDrop,\n itemCount: childElements.length,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation,\n });\n\n const height = orientation === \"vertical\" ? \"100%\" : `${heightProp}px`;\n // TODO measure the height, if not provided\n const style = {\n \"--overflow-container-height\": `${height}`,\n } as CSSProperties;\n\n const className = cx(`${classBase}-wrapContainer`, classNameProp, {\n [`${classBase}-horizontal`]: orientation === \"horizontal\",\n [`${classBase}-vertical`]: orientation === \"vertical\",\n });\n\n const content = childElements.map((childEl, i) => {\n const {\n \"data-align\": align,\n \"data-overflow-priority\": overflowPriority = \"0\",\n id: itemId = `${id}-${i}`,\n label = `Item ${i + 1}`,\n } = childEl.props;\n return (\n <div\n className={cx(`${classBase}-item`, {\n \"vuuDraggable-dragAway\": draggedItemIndex === i,\n })}\n data-index={i}\n data-align={align}\n data-label={label}\n data-overflow-priority={overflowPriority}\n id={`${itemId}-wrapper`}\n key={i}\n onMouseDown={onItemMouseDown}\n >\n {childEl}\n </div>\n );\n });\n\n const overflowIndicator = (\n <div\n className={`${classBase}-OverflowIndicator`}\n data-index=\"overflow\"\n key=\"overflow\"\n >\n <PopupMenu\n {...PopupMenuProps}\n icon={overflowIcon}\n menuBuilder={menuBuilder}\n menuActionHandler={menuActionHandler}\n tabIndex={-1}\n />\n </div>\n );\n\n content.push(overflowIndicator);\n\n return (\n <div className={className} ref={rootRef} style={style}>\n {content}\n {draggable}\n </div>\n );\n }\n);\n\nWrapContainer.displayName = \"OverflowContainer.InnerContainer\";\n\nexport const OverflowContainer = forwardRef(function OverflowContainer(\n {\n PopupMenuProps,\n allowDragDrop = false,\n children,\n className,\n height = 44,\n id: idProp,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation,\n overflowIcon,\n overflowPosition,\n ...htmlAttributes\n }: OverflowContainerProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const id = useId(idProp);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(cx(className, classBase))}\n id={id}\n ref={forwardedRef}\n >\n <WrapContainer\n PopupMenuProps={PopupMenuProps}\n allowDragDrop={allowDragDrop}\n height={height}\n id={id}\n orientation={orientation}\n overflowIcon={overflowIcon}\n overflowPosition={overflowPosition}\n onMoveItem={onMoveItem}\n onSwitchWrappedItemIntoView={onSwitchWrappedItemIntoView}\n >\n {children}\n </WrapContainer>\n </div>\n );\n});\n", "import { MenuActionHandler, MenuBuilder } from \"@vuu-ui/vuu-data-types\";\nimport { useDragDropNext as useDragDrop } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n isValidNumber,\n MEASURES,\n useLayoutEffectSkipFirst,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n applyOverflowClassToWrappedItems,\n removeOverflowIndicatorIfNoLongerNeeded,\n correctForWrappedHighPriorityItems,\n getNonWrappedAndWrappedItems,\n NO_WRAPPED_ITEMS,\n highPriorityItemsHaveWrappedButShouldNotHave,\n switchWrappedItemIntoView,\n OverflowItem,\n overflowIndicatorHasWrappedButShouldNotHave,\n correctForWrappedOverflowIndicator,\n} from \"./overflow-utils\";\nimport { OverflowContainerProps } from \"./OverflowContainer\";\n\nexport interface OverflowContainerHookProps\n extends Pick<\n OverflowContainerProps,\n \"allowDragDrop\" | \"onMoveItem\" | \"orientation\"\n > {\n itemCount: number;\n onSwitchWrappedItemIntoView?: (overflowItem: OverflowItem) => void;\n}\n\nexport const useOverflowContainer = ({\n allowDragDrop = false,\n itemCount,\n onMoveItem,\n onSwitchWrappedItemIntoView,\n orientation = \"horizontal\",\n}: OverflowContainerHookProps) => {\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const wrappedItemsRef = useRef<OverflowItem[]>(NO_WRAPPED_ITEMS);\n // Drag drop needs a ref to container\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const setOverflowTabIndex = useCallback((tabIndex: \"0\" | \"-1\") => {\n if (containerRef.current) {\n containerRef.current\n .querySelector(\".vuuOverflowContainer-OverflowIndicator button\")\n ?.setAttribute(\"tabindex\", tabIndex);\n }\n }, []);\n\n const handleResize = useCallback(async () => {\n if (container) {\n let [nonWrapped, wrapped] = getNonWrappedAndWrappedItems(\n container,\n orientation\n );\n applyOverflowClassToWrappedItems(\n container,\n wrapped,\n \"vuuOverflowContainer-wrapContainer\"\n );\n if (overflowIndicatorHasWrappedButShouldNotHave(wrapped)) {\n wrapped = await correctForWrappedOverflowIndicator(container, wrapped);\n }\n while (\n highPriorityItemsHaveWrappedButShouldNotHave(nonWrapped, wrapped)\n ) {\n [nonWrapped, wrapped] = await correctForWrappedHighPriorityItems(\n container,\n nonWrapped,\n wrapped\n );\n }\n if (wrapped.length === 1) {\n if (removeOverflowIndicatorIfNoLongerNeeded(container)) {\n wrapped = NO_WRAPPED_ITEMS;\n }\n }\n\n if (wrappedItemsRef.current.length === 0 && wrapped.length > 0) {\n setOverflowTabIndex(\"0\");\n } else if (wrappedItemsRef.current.length > 0 && wrapped.length === 0) {\n setOverflowTabIndex(\"-1\");\n }\n\n wrappedItemsRef.current = wrapped;\n }\n }, [container, orientation, setOverflowTabIndex]);\n\n const hasOverflowItem = (\n opt: unknown\n ): opt is {\n overflowItem: OverflowItem;\n } => typeof opt === \"object\" && opt !== null && \"overflowItem\" in opt;\n\n const [menuBuilder, menuActionHandler] = useMemo((): [\n MenuBuilder,\n MenuActionHandler\n ] => {\n return [\n () => {\n const { current: menuItems } = wrappedItemsRef;\n return menuItems.map((item: OverflowItem) => {\n return {\n label: item.label,\n action: `activate-item-${item.index}`,\n options: { overflowItem: item },\n };\n });\n },\n // The menu items are our overflowed items, selecting one by default\n // brings it back onto the toolbar - TODO is this right ?\n ({ options }) => {\n if (container && hasOverflowItem(options)) {\n // TODO do we always want to switch it into view - leave that to caller\n const [, wrappedItems] = switchWrappedItemIntoView(\n container,\n options.overflowItem\n );\n wrappedItemsRef.current = wrappedItems;\n onSwitchWrappedItemIntoView?.(options.overflowItem);\n }\n return true;\n },\n ];\n }, [container, onSwitchWrappedItemIntoView]);\n\n const resizeObserver = useMemo(() => {\n const { sizeProp } = MEASURES[orientation];\n let currentSize = 0;\n return new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { [sizeProp]: actualSize } = entry.contentRect;\n // This is important. Sometimes tiny sub-pixel differeces\n // can be reported, which break the layout assumptions\n const size = Math.round(actualSize as number);\n if (isValidNumber(size) && currentSize !== size) {\n currentSize = size;\n handleResize();\n }\n }\n });\n }, [handleResize, orientation]);\n\n useLayoutEffectSkipFirst(() => {\n handleResize();\n }, [handleResize, itemCount]);\n\n useMemo(() => {\n if (container) {\n resizeObserver.observe(container);\n }\n }, [container, resizeObserver]);\n\n const callbackRef = useCallback((el: HTMLDivElement | null) => {\n setContainer((containerRef.current = el));\n }, []);\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n onMoveItem?.(fromIndex, toIndex);\n },\n [onMoveItem]\n );\n\n const { onMouseDown: dragDropHookHandleMouseDown, ...dragDropHook } =\n useDragDrop({\n allowDragDrop,\n containerRef,\n // this is for useDragDropNext\n draggableClassName: `vuuOverflowContainer`,\n // extendedDropZone: overflowedItems.length > 0,\n onDrop: handleDrop,\n orientation: \"horizontal\",\n itemQuery: \".vuuOverflowContainer-item\",\n });\n\n return {\n menuActionHandler,\n menuBuilder,\n onItemMouseDown: dragDropHookHandleMouseDown,\n rootRef: callbackRef,\n ...dragDropHook,\n };\n};\n", "import { getElementByDataIndex, orientationType } from \"@vuu-ui/vuu-utils\";\n\nconst NON_WRAPPED_ITEM = \".vuuOverflowContainer-item:not(.wrapped)\";\n\nexport type OverflowItem = {\n index: string;\n label: string;\n overflowPriority: string;\n};\n\nexport const isOverflowElement = (element: HTMLElement | null) =>\n element !== null &&\n element.dataset.index === \"overflow\" &&\n element.parentElement !== null &&\n element.parentElement.classList.contains(\n \"vuuOverflowContainer-wrapContainer-overflowed\"\n );\n\nexport const sortByScreenOrder = (elements: HTMLElement[]): HTMLElement[] =>\n elements.sort((e1, e2) => {\n const {\n dataset: { index: idx1 = \"?\" },\n } = e1;\n const {\n dataset: { index: idx2 = \"?\" },\n } = e2;\n const isOverflowed1 = e1.classList.contains(\"wrapped\");\n const isOverflowed2 = e2.classList.contains(\"wrapped\");\n const isOverflowedIndicator1 = idx1 === \"overflow\";\n const isOverflowedIndicator2 = idx2 === \"overflow\";\n if (isOverflowed1 && !isOverflowed2) {\n return 1;\n } else if (!isOverflowed1 && isOverflowed2) {\n return -1;\n }\n if (isOverflowedIndicator1) {\n return 1;\n } else if (isOverflowedIndicator2) {\n return -1;\n }\n return parseInt(idx1) > parseInt(idx2) ? 1 : -1;\n });\n\nexport const NO_WRAPPED_ITEMS: OverflowItem[] = [];\n\n/**\n Identify wrapped items by comparing position of each item. Any item\n not to the right of preceeding item has wrapped. Note: on-screen \n position of items does not necessarily match document position, due\n to use of css order. This is taken into account by sorting. \n TODO support Vertical orientation\n */\nexport const getNonWrappedAndWrappedItems = (\n container: HTMLElement,\n orientation: orientationType = \"horizontal\"\n): [OverflowItem[], OverflowItem[]] => {\n const nonWrappedItems: OverflowItem[] = [];\n const wrappedItems: OverflowItem[] = [];\n let currentPosition = -1;\n let overflowed = false;\n const sortedChildren = sortByScreenOrder(\n Array.from(container.children) as HTMLElement[]\n );\n const positionAttribute = orientation === \"vertical\" ? \"top\" : \"left\";\n for (const child of sortedChildren) {\n const element = child as HTMLElement;\n const {\n dataset: { index = \"?\", label = \"?\", overflowPriority = \"0\" },\n } = element;\n const { [positionAttribute]: position } = element.getBoundingClientRect();\n if (position <= currentPosition) {\n if (index === \"overflow\") {\n wrappedItems.push(nonWrappedItems.pop() as OverflowItem);\n } else {\n wrappedItems.push({ index, label, overflowPriority });\n }\n overflowed = true;\n } else if (overflowed) {\n wrappedItems.push({ index, label, overflowPriority });\n } else {\n nonWrappedItems.push({ index, label, overflowPriority });\n }\n currentPosition = position;\n }\n return [nonWrappedItems, wrappedItems];\n};\n\nexport const applyOverflowClassToWrappedItems = (\n container: HTMLElement,\n overflowedItems: OverflowItem[],\n classBase?: string\n) => {\n let ignoreOverflow = false;\n const className = classBase ? `${classBase}-overflowed` : \"overflow\";\n if (overflowedItems.find(({ index }) => index === \"overflow\")) {\n if (overflowedItems.length === 1) {\n ignoreOverflow = true;\n }\n }\n for (const element of container.children) {\n const {\n dataset: { index = \"?\" },\n } = element as HTMLElement;\n if (overflowedItems.length === 0 || ignoreOverflow) {\n container.classList.remove(className);\n } else {\n container.classList.add(className);\n }\n if (\n index !== \"overflow\" &&\n overflowedItems.find((item) => item.index === index)\n ) {\n element.classList.add(\"wrapped\");\n } else {\n element.classList.remove(\"wrapped\");\n }\n }\n};\n\nconst maxPriority = (priority: number, { overflowPriority }: OverflowItem) =>\n Math.max(priority, parseInt(overflowPriority));\n\nconst minPriority = (priority: number, { overflowPriority }: OverflowItem) =>\n Math.min(priority, parseInt(overflowPriority));\n\nexport const overflowIndicatorHasWrappedButShouldNotHave = (\n wrappedItems: OverflowItem[]\n) => wrappedItems.length > 1 && wrappedItems.at(-1)?.index === \"overflow\";\n\nconst getHighestPriorityItem = (overflowItems: OverflowItem[]) => {\n let [highestPriorityItem] = overflowItems;\n for (let i = 1; i < overflowItems.length; i++) {\n const item = overflowItems[i];\n if (\n parseInt(item.overflowPriority) >\n parseInt(highestPriorityItem.overflowPriority)\n ) {\n highestPriorityItem = item;\n }\n }\n return highestPriorityItem;\n};\n\nexport const highPriorityItemsHaveWrappedButShouldNotHave = (\n nonWrappedItems: OverflowItem[],\n wrappedItems: OverflowItem[]\n) => {\n const minNonwrappedPriority = nonWrappedItems.reduce<number>(\n minPriority,\n Number.MAX_SAFE_INTEGER\n );\n const maxwrappedPriority = wrappedItems.reduce<number>(maxPriority, 0);\n if (maxwrappedPriority > minNonwrappedPriority) {\n return true;\n } else {\n return wrappedItems.length > 1 && wrappedItems.at(-1)?.index === \"overflow\";\n }\n};\n\n/** \n An edge case that may occur when reducing width from unwrapped to\n wrapped, or on first render.\n We overflow one or more items. Then, when the overflowIndicator assumes\n full width, it may itself overflow.\n*/\nexport const correctForWrappedOverflowIndicator = (\n container: HTMLElement,\n overflowedItems: OverflowItem[]\n): Promise<OverflowItem[]> =>\n new Promise((resolve) => {\n requestAnimationFrame(() => {\n const [, o2] = getNonWrappedAndWrappedItems(container);\n const newlyOverflowed = getNewItems(overflowedItems, o2);\n newlyOverflowed.forEach((item) => markElementAsWrapped(container, item));\n resolve(o2);\n });\n });\n\n/** \n An edge case that may occur when reducing width from unwrapped to\n wrapped, or on first render.\n We overflow one or more items. Then, when the overflowIndicator assumes\n full width, it may itself overflow.\n*/\nexport const correctForWrappedHighPriorityItems = (\n container: HTMLElement,\n nonWrapped: OverflowItem[],\n wrapped: OverflowItem[]\n): Promise<[OverflowItem[], OverflowItem[]]> =>\n new Promise((resolve) => {\n requestAnimationFrame(() => {\n const [, o2] = getNonWrappedAndWrappedItems(container);\n const highPriorityWrappedItem = getHighestPriorityItem(o2);\n if (highPriorityWrappedItem) {\n const [nonWrappedItems, wrappedItems] = switchWrappedItemIntoView(\n container,\n highPriorityWrappedItem\n );\n resolve([nonWrappedItems, wrappedItems]);\n } else {\n resolve([nonWrapped, wrapped]);\n }\n });\n });\n\nexport const markElementAsWrapped = (\n container: HTMLElement,\n item: OverflowItem\n) => {\n const el = getElementByDataIndex(container, item.index);\n if (el) {\n el.classList.add(\"wrapped\");\n } else {\n throw Error(\n `markElementAsWrapped element item with index ${item.index} not found`\n );\n }\n};\n\nexport const getElementsMarkedAsWrapped = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(\".wrapped\")) as HTMLElement[];\n\nconst getNewItems = (items1: OverflowItem[], items2: OverflowItem[]) => {\n const newItems: OverflowItem[] = [];\n for (const item of items2) {\n if (!items1.find(({ index }) => index === item.index)) {\n newItems.push(item);\n }\n }\n return newItems;\n};\n\nexport const unmarkItemsWhichAreNoLongerWrapped = (\n container: HTMLElement,\n wrappedItems: OverflowItem[]\n) => {\n const elementssMarkedAsWrapped = getElementsMarkedAsWrapped(container);\n elementssMarkedAsWrapped.forEach((el) => {\n const {\n dataset: { index = \"?\" },\n } = el;\n if (!wrappedItems.find((i) => i.index === index)) {\n el.classList.remove(\"wrapped\");\n }\n });\n};\n\nconst getOverflowIndicator = (container: HTMLElement) =>\n container.querySelector('[data-index=\"overflow\"]') as HTMLElement;\nconst getOverflowedItem = (container: HTMLElement) =>\n container.querySelector(\".wrapped\") as HTMLElement;\nconst getElementWidth = (el: HTMLElement) =>\n parseInt(getComputedStyle(el).getPropertyValue(\"width\"));\n\nconst getAvailableSpace = (\n container: HTMLElement,\n overflowIndicator: HTMLElement\n) => {\n const { right: containerRight } = container.getBoundingClientRect();\n const paddingRight = parseInt(\n getComputedStyle(container).getPropertyValue(\"padding-right\")\n );\n const { right: indicatorRight } = overflowIndicator.getBoundingClientRect();\n return containerRight - paddingRight - indicatorRight;\n};\n\n/**\n An edge case. If container has grown but we still have one\n wrapped item - could the wrapped item return to the fold if the overflow\n indicaor were removed ?\n */\nexport const removeOverflowIndicatorIfNoLongerNeeded = (\n container: HTMLElement\n): boolean => {\n const overflowIndicator = getOverflowIndicator(container);\n const availableSpace = getAvailableSpace(container, overflowIndicator);\n const indicatorWidth = getElementWidth(overflowIndicator);\n const overflowedItem = getOverflowedItem(container);\n const overflowWidth = getElementWidth(overflowedItem);\n\n if (overflowWidth <= availableSpace + indicatorWidth) {\n container.classList.remove(\"overflowed\");\n overflowedItem.classList.remove(\"wrapped\");\n return true;\n }\n return false;\n};\n\nconst byPriorityDescending = (h1: Element, h2: Element) => {\n const {\n dataset: { index: i1 = \"0\", overflowPriority: p1 = \"0\" },\n } = h1 as HTMLElement;\n const {\n dataset: { index: i2 = \"0\", overflowPriority: p2 = \"0\" },\n } = h2 as HTMLElement;\n\n if (p1 > p2) {\n return -1;\n } else if (p1 < p2) {\n return 1;\n } else {\n return parseInt(i1) - parseInt(i2);\n }\n};\n\nconst getNonwrappedItemsByPriority = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(NON_WRAPPED_ITEM)).sort(\n byPriorityDescending\n ) as HTMLElement[];\n\n/**\n * This is used both when an overflow menu is used to select an overflowed item\n * and when a high priority item has overflowed, whilst lower priority items\n * remain in view.\n */\nexport const switchWrappedItemIntoView = (\n container: HTMLElement,\n overflowItem: OverflowItem\n): [OverflowItem[], OverflowItem[]] => {\n const unwrappedItems = getNonwrappedItemsByPriority(container);\n const targetElement = getElementByDataIndex(\n container,\n overflowItem.index,\n true\n );\n let pos = -1;\n let unwrappedItem = unwrappedItems.at(pos) as HTMLElement;\n const itemWidth = getElementWidth(unwrappedItem);\n const targetWidth = getElementWidth(targetElement);\n const overflowIndicator = getOverflowIndicator(container);\n let availableSpace =\n getAvailableSpace(container, overflowIndicator) + itemWidth;\n if (availableSpace >= targetWidth) {\n switchWrapOnElements(targetElement, unwrappedItem);\n } else {\n // we need to wrap multiple items to make space for the switched item\n const { left: lastLeft } = unwrappedItem.getBoundingClientRect();\n const baseAvailableSpace = availableSpace;\n const wrapTargets = [unwrappedItem];\n while (availableSpace < targetWidth) {\n pos -= 1;\n unwrappedItem = unwrappedItems.at(pos) as HTMLElement;\n wrapTargets.push(unwrappedItem);\n const { left: nextLeft } = unwrappedItem.getBoundingClientRect();\n const extraSpace = lastLeft - nextLeft;\n availableSpace = baseAvailableSpace + extraSpace;\n }\n\n targetElement?.classList.remove(\"wrapped\");\n wrapTargets.forEach((item) => {\n item.classList.add(\"wrapped\");\n });\n }\n const [nonWrappedItems, wrappedItems] =\n getNonWrappedAndWrappedItems(container);\n unmarkItemsWhichAreNoLongerWrapped(container, wrappedItems);\n return [nonWrappedItems, wrappedItems];\n};\n\nconst switchWrapOnElements = (\n wrappedElement?: HTMLElement | null,\n nonWrappedElement?: HTMLElement\n) => {\n if (!wrappedElement || !nonWrappedElement) {\n throw Error(\"switchWrapOnElements, element undefined\");\n }\n wrappedElement.classList.remove(\"wrapped\");\n nonWrappedElement.classList.add(\"wrapped\");\n};\n", "import { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n List,\n ListItem,\n ListItemProps,\n ListProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"clsx\";\nimport {\n cloneElement,\n HTMLAttributes,\n memo,\n MouseEvent,\n ReactElement,\n} from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { View, ViewProps } from \"../layout-view\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\n\nimport \"./Palette.css\";\n\nconst clonePaletteItem = (paletteItem: HTMLElement) => {\n const dolly = paletteItem.cloneNode(true) as HTMLElement;\n dolly.id = \"\";\n delete dolly.dataset.idx;\n return dolly;\n};\n\nexport interface PaletteItemProps extends ListItemProps {\n children: ReactElement;\n closeable?: boolean;\n header?: boolean;\n idx?: number;\n resize?: \"defer\";\n resizeable?: boolean;\n}\n\nexport const PaletteItem = memo(\n ({\n className,\n children: component,\n idx,\n resizeable,\n header,\n closeable,\n ...props\n }: PaletteItemProps) => {\n return (\n <ListItem\n className={cx(\"vuuPaletteItem\", className)}\n data-draggable\n data-icon=\"draggable\"\n {...props}\n />\n );\n }\n);\n\nPaletteItem.displayName = \"PaletteItem\";\n\nexport interface PaletteProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onDragStart\" | \"onDrop\" | \"onSelect\"\n > {\n ListProps?: Partial<ListProps>;\n ViewProps?: Partial<ViewProps>;\n children: ReactElement[];\n itemHeight?: number;\n orientation: \"horizontal\" | \"vertical\";\n selection?: string;\n}\n\nexport const Palette = ({\n ListProps,\n ViewProps,\n children,\n className,\n itemHeight = 41,\n orientation = \"horizontal\",\n ...props\n}: PaletteProps) => {\n const dispatch = useLayoutProviderDispatch();\n const classBase = \"vuuPalette\";\n\n function handleMouseDown(evt: MouseEvent) {\n const target = evt.target as HTMLElement;\n const listItemElement = target.closest(\".vuuPaletteItem\") as HTMLElement;\n const idx = parseInt(listItemElement.dataset?.index ?? \"-1\");\n const {\n props: { caption, children: payload, template, ...props },\n } = children[idx];\n const { ViewProps: componentViewProps } = payload.props;\n const { height, left, top, width } =\n listItemElement.getBoundingClientRect();\n const id = uuid();\n const identifiers = { id, key: id };\n const component = template ? (\n payload\n ) : (\n <View\n {...ViewProps}\n {...identifiers}\n {...props}\n {...componentViewProps}\n title={props.label}\n >\n {payload}\n </View>\n );\n\n dispatch({\n dragRect: {\n left,\n top,\n right: left + width,\n bottom: top + 150,\n width,\n height,\n },\n dragElement: clonePaletteItem(listItemElement),\n evt: evt.nativeEvent,\n instructions: {\n DoNotRemove: true,\n DoNotTransform: true,\n DriftHomeIfNoDropTarget: true,\n RemoveDraggableOnDragEnd: true,\n dragThreshold: 10,\n },\n path: \"*\",\n payload: component,\n type: \"drag-start\",\n });\n }\n\n return (\n <List\n {...ListProps}\n {...props}\n className={cx(classBase, className, `${classBase}-${orientation}`)}\n itemHeight={itemHeight}\n selected={null}\n >\n {children.map((child, idx) =>\n child.type === PaletteItem\n ? cloneElement(child, {\n key: idx,\n onMouseDown: handleMouseDown,\n })\n : child\n )}\n </List>\n );\n};\n\nregisterComponent(\"Palette\", Palette, \"view\");\n", "import { Tab, Tabstrip, TabstripProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n ReactNode,\n useCallback,\n useRef,\n} from \"react\";\nimport { getDefaultTabLabel } from \"../layout-reducer\";\nimport { StackProps } from \"./stackTypes\";\n\nimport \"./Stack.css\";\n\nconst classBase = \"vuuTabs\";\n\nconst getDefaultTabIcon = () => undefined;\n\nconst getChildElements = <T extends ReactElement = ReactElement>(\n children: ReactNode\n): T[] => {\n const elements: T[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n elements.push(child as T);\n } else {\n console.warn(`Stack has unexpected child element type`);\n }\n });\n return elements;\n};\n\nconst DefaultTabstripProps: Partial<TabstripProps> = {\n allowAddTab: false,\n allowCloseTab: false,\n allowRenameTab: false,\n};\n\nexport const Stack = forwardRef(function Stack(\n {\n TabstripProps = DefaultTabstripProps,\n active = 0,\n children,\n className: classNameProp,\n getTabIcon = getDefaultTabIcon,\n getTabLabel = getDefaultTabLabel,\n id: idProp,\n keyBoardActivation = \"manual\",\n // onMouseDown,\n onAddTab,\n onMoveTab,\n onTabClose,\n onTabEdit,\n onTabSelectionChanged,\n showTabs = \"top\",\n style,\n }: StackProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const id = useId(idProp);\n const tabLabels = useRef<string[]>([]);\n const {\n allowCloseTab,\n allowRenameTab,\n className: tabstripClassName,\n } = TabstripProps;\n\n const handleExitEditMode = useCallback(\n (\n _oldText: string,\n newText: string,\n _allowDeactivation: boolean,\n tabIndex: number\n ) => {\n onTabEdit?.(tabIndex, newText);\n },\n [onTabEdit]\n );\n\n const activeChild = () => {\n //TODO need to inject an id if child does not have one, so we can\n // establish the aria-controls relationship. In a Vuu layout, there\n // will always be an id.\n if (React.isValidElement(children)) {\n return children;\n }\n if (Array.isArray(children)) {\n return children[active] ?? null;\n }\n return null;\n };\n\n const renderTabs = () =>\n getChildElements(children).map((child, idx) => {\n const {\n closeable = allowCloseTab,\n id: childId = `${id}-${idx}`,\n \"data-tab-location\": tabLocation,\n } = child.props;\n const label = getTabLabel(child, idx, tabLabels.current);\n tabLabels.current.push(label);\n return (\n <Tab\n ariaControls={childId}\n data-icon={getTabIcon(child, idx)}\n key={childId}\n id={`${childId}-tab`}\n index={idx}\n label={label}\n location={tabLocation}\n closeable={closeable}\n editable={allowRenameTab}\n />\n );\n });\n\n const child = activeChild();\n const isHorizontal = showTabs === \"left\" || showTabs === \"right\";\n const tabstripOrientation = isHorizontal ? \"vertical\" : \"horizontal\";\n\n return (\n <div\n className={cx(classBase, classNameProp, {\n [`${classBase}-horizontal`]: isHorizontal,\n })}\n style={style}\n id={id}\n ref={ref}\n >\n {showTabs ? (\n <Tabstrip\n {...TabstripProps}\n activeTabIndex={\n TabstripProps?.activeTabIndex ?? (child === null ? -1 : active)\n }\n allowDragDrop={TabstripProps.allowDragDrop !== false}\n animateSelectionThumb\n className={cx(\"vuuTabHeader\", tabstripClassName)}\n aria-label=\"data tabs\"\n keyBoardActivation={keyBoardActivation}\n onActiveChange={onTabSelectionChanged}\n onAddTab={onAddTab}\n onCloseTab={onTabClose}\n onExitEditMode={handleExitEditMode}\n onMoveTab={onMoveTab}\n orientation={tabstripOrientation}\n // onMouseDown={handleMouseDown}\n >\n {renderTabs()}\n </Tabstrip>\n ) : null}\n <div\n aria-labelledby={`${id}-${active}`}\n className={`${classBase}-tabPanel`}\n role=\"tabpanel\"\n >\n {child}\n </div>\n </div>\n );\n});\nStack.displayName = \"Stack\";\n", "import { useId } from \"@vuu-ui/vuu-utils\";\nimport React, { useCallback, useRef } from \"react\";\nimport {\n useLayoutCreateNewChild,\n useLayoutProviderDispatch,\n} from \"../layout-provider\";\nimport { useViewActionDispatcher } from \"../layout-view\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { Stack } from \"./Stack\";\nimport { StackProps, TabLabelFactory } from \"./stackTypes\";\nimport { getDefaultTabLabel } from \"../layout-reducer\";\nimport { Placeholder } from \"../placeholder\";\n\nimport \"./Stack.css\";\n\nconst defaultCreateNewChild = () => (\n <Placeholder\n resizeable\n style={{ flexGrow: 1, flexShrink: 0, flexBasis: 0 }}\n />\n);\n\nexport const StackLayout = (props: StackProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const dispatch = useLayoutProviderDispatch();\n const { loadState } = usePersistentState();\n\n const {\n createNewChild: createNewChildProp,\n id: idProp,\n onTabSelectionChanged,\n path,\n ...restProps\n } = props;\n\n const { children } = props;\n\n const id = useId(idProp);\n\n const [dispatchViewAction] = useViewActionDispatcher(id, ref, path);\n const createNewChildFromContext = useLayoutCreateNewChild();\n const createNewChild =\n createNewChildProp ?? createNewChildFromContext ?? defaultCreateNewChild;\n\n const handleTabSelection = (nextIdx: number) => {\n if (path) {\n dispatch({ type: \"switch-tab\", id, path, nextIdx });\n onTabSelectionChanged?.(nextIdx);\n }\n };\n\n const handleTabClose = useCallback(\n (tabIndex: number) => {\n if (Array.isArray(children)) {\n const {\n props: { \"data-path\": dataPath, path = dataPath },\n } = children[tabIndex];\n dispatch({ type: \"remove\", path });\n }\n },\n [children, dispatch]\n );\n\n const handleTabAdd = useCallback(() => {\n if (path) {\n const tabIndex = React.Children.count(children);\n const component = createNewChild(tabIndex);\n dispatch({\n type: \"add\",\n path,\n component,\n });\n }\n }, [children, createNewChild, dispatch, path]);\n\n const handleMoveTab = useCallback(\n (fromIndex: number, toIndex: number) => {\n if (path) {\n dispatch({\n fromIndex,\n toIndex,\n path,\n type: \"move-child\",\n });\n }\n },\n [dispatch, path]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMouseDown = async (e: any, index: number) => {\n let readyToDrag: undefined | ((value: unknown) => void);\n\n const preDragActivity = async () =>\n new Promise((resolve) => {\n console.log(\"preDragActivity: Ok, gonna release the drag\");\n readyToDrag = resolve;\n });\n\n const dragging = await dispatchViewAction(\n { type: \"mousedown\", index, preDragActivity },\n e\n );\n\n if (dragging) {\n readyToDrag?.(undefined);\n }\n };\n\n const handleTabEdit = (tabIndex: number, text: string) => {\n dispatch({ type: \"set-title\", path: `${path}.${tabIndex}`, title: text });\n };\n\n const getTabLabel: TabLabelFactory = (component, idx, existingLabels) => {\n const { id, title } = component.props;\n return (\n loadState(id, \"view-title\") ||\n title ||\n // This will normally never be called as title is always assigned in layout model\n getDefaultTabLabel(component, idx, existingLabels)\n );\n };\n\n return (\n <Stack\n {...restProps}\n id={id}\n getTabLabel={getTabLabel}\n onMouseDown={handleMouseDown}\n onMoveTab={handleMoveTab}\n onAddTab={handleTabAdd}\n onTabClose={handleTabClose}\n onTabEdit={handleTabEdit}\n onTabSelectionChanged={handleTabSelection}\n ref={ref}\n />\n );\n};\nStackLayout.displayName = \"Stack\";\n\nregisterComponent(\"Stack\", StackLayout, \"container\");\n", "import {\n forwardCallbackProps,\n SelectionStrategy,\n SpecialKeyMultipleSelection,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport React, { useMemo, useRef } from \"react\";\nimport {\n OverflowContainer,\n OverflowContainerProps,\n} from \"../overflow-container\";\nimport { asReactElements } from \"../utils\";\nimport { useToolbar } from \"./useToolbar\";\n\nimport \"./Toolbar.css\";\n\nconst classBase = \"vuuToolbar\";\n\nexport type ActiveItemChangeHandler = (itemIndex: number[]) => void;\n\nexport type NavigationOutOfBoundsHandler = (direction: \"start\" | \"end\") => void;\nexport interface ToolbarProps extends OverflowContainerProps {\n activeItemIndex?: number[];\n alignItems?: \"start\" | \"center\" | \"end\";\n defaultActiveItemIndex?: number[];\n onActiveChange?: ActiveItemChangeHandler;\n /**\n * Indicates that user has used Arrow key navigation to move beyond the\n * last or before the first item. A higher level component may want to\n * use this to implement a seamless navigation across components.\n */\n onNavigateOutOfBounds?: NavigationOutOfBoundsHandler;\n selectionStrategy?: SelectionStrategy | SpecialKeyMultipleSelection;\n showSeparators?: boolean;\n}\n\nexport const Toolbar = ({\n activeItemIndex: activeItemIndexProp,\n alignItems = \"start\",\n defaultActiveItemIndex,\n children,\n className,\n id: idProp,\n onActiveChange,\n onNavigateOutOfBounds,\n orientation = \"horizontal\",\n selectionStrategy = \"none\",\n showSeparators = false,\n ...props\n}: ToolbarProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n activeItemIndex,\n focusableIdx,\n focusVisible,\n itemProps,\n ...toolbarHook\n } = useToolbar({\n activeItemIndex: activeItemIndexProp,\n defaultActiveItemIndex,\n containerRef: rootRef,\n onActiveChange,\n onNavigateOutOfBounds,\n orientation,\n selectionStrategy,\n });\n\n const id = useId(idProp);\n\n const items = useMemo(\n () =>\n asReactElements(children).map((child, index) => {\n const {\n id: itemId = `${id}-tab-${index}`,\n className: itemClassName,\n ...ownProps\n } = child.props;\n const selected = activeItemIndex.includes(index);\n return React.cloneElement(child, {\n ...forwardCallbackProps(ownProps, itemProps),\n className: cx(\"vuuToolbarItem\", itemClassName),\n \"data-overflow-priority\": selected ? \"1\" : undefined,\n id: itemId,\n key: index,\n \"aria-selected\": selected,\n tabIndex: focusableIdx === index ? 0 : -1,\n });\n }),\n [activeItemIndex, children, focusableIdx, id, itemProps]\n );\n\n return (\n <OverflowContainer\n {...props}\n {...toolbarHook.containerProps}\n className={cx(className, classBase, `${classBase}-${orientation}`, {\n [`${classBase}-alignCenter`]: alignItems === \"center\",\n [`${classBase}-alignEnd`]: alignItems === \"end\",\n [`${classBase}-withSeparators`]: showSeparators,\n })}\n {...props}\n ref={rootRef}\n >\n {items}\n </OverflowContainer>\n );\n};\n", "import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport { OverflowItem } from \"../overflow-container\";\nimport { ToolbarProps } from \"./Toolbar\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { useSelection } from \"./useSelection\";\n\nexport interface ToolbarHookProps\n extends Pick<\n ToolbarProps,\n | \"activeItemIndex\"\n | \"defaultActiveItemIndex\"\n | \"onActiveChange\"\n | \"onNavigateOutOfBounds\"\n >,\n Required<Pick<ToolbarProps, \"orientation\" | \"selectionStrategy\">> {\n containerRef: RefObject<HTMLElement>;\n itemQuery?: string;\n}\n\nexport const useToolbar = ({\n activeItemIndex: activeItemIndexProp,\n defaultActiveItemIndex,\n containerRef,\n itemQuery = \"vuuToolbarItem\",\n onActiveChange,\n onNavigateOutOfBounds,\n orientation,\n selectionStrategy,\n}: ToolbarHookProps) => {\n const lastSelection = useRef(activeItemIndexProp);\n\n const {\n focusItem: keyboardHookFocusItem,\n highlightedIdx,\n onClick: keyboardHookHandleClick,\n onKeyDown: keyboardHookHandleKeyDown,\n setHighlightedIdx: keyboardHookSetHighlightedIndex,\n ...keyboardHook\n } = useKeyboardNavigation({\n containerRef,\n onNavigateOutOfBounds,\n orientation,\n });\n\n const {\n activateItem: selectionHookActivateItem,\n itemHandlers: { onClick, onKeyDown },\n selected: selectionHookSelected,\n } = useSelection({\n containerRef,\n defaultSelected: defaultActiveItemIndex,\n highlightedIdx,\n itemQuery,\n onSelectionChange: onActiveChange,\n selected: activeItemIndexProp,\n selectionStrategy,\n });\n // We need this on reEntry for navigation hook to handle focus and for dragDropHook\n // to re-apply selection after drag drop. For some reason the value is stale if we\n // directly use selectionHookSelected within the drag, even though all dependencies\n //appear to be correctly declared.\n lastSelection.current = selectionHookSelected;\n\n const handleClick = useCallback(\n (evt: ReactMouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const toolbarItem = target.closest(\"[data-index]\") as HTMLElement;\n if (toolbarItem) {\n const index = parseInt(toolbarItem.dataset.index ?? \"-1\");\n if (index !== -1 && isValidNumber(index)) {\n keyboardHookHandleClick(evt, index);\n onClick?.(evt, index);\n }\n }\n },\n [keyboardHookHandleClick, onClick]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n keyboardHookHandleKeyDown(evt);\n if (!evt.defaultPrevented) {\n onKeyDown?.(evt);\n }\n },\n [keyboardHookHandleKeyDown, onKeyDown]\n );\n\n const onSwitchWrappedItemIntoView = useCallback(\n (item: OverflowItem) => {\n const index = parseInt(item.index);\n if (!isNaN(index)) {\n //TODO need to be able to reset the overflow-priority without selecting the item\n selectionHookActivateItem(index);\n keyboardHookFocusItem(index);\n }\n },\n [keyboardHookFocusItem, selectionHookActivateItem]\n );\n\n const itemProps = {\n onClick: handleClick,\n onFocus: keyboardHook.onFocus,\n onKeyDown: handleKeyDown,\n };\n\n return {\n activeItemIndex: selectionHookSelected,\n focusableIdx: keyboardHook.focusableIdx,\n focusVisible: keyboardHook.focusVisible,\n containerProps: {\n PopupMenuProps: {\n onKeyDown: handleKeyDown,\n onMenuClose: keyboardHook.onOverflowMenuClose,\n },\n ...keyboardHook.containerProps,\n onSwitchWrappedItemIntoView,\n },\n itemProps,\n };\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport {\n dispatchMouseEvent,\n getClosest,\n getElementDataIndex,\n getFocusableElement,\n orientationType,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n FocusEventHandler,\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n ArrowRight,\n Home,\n End,\n} from \"@vuu-ui/vuu-utils\";\nimport { getIndexOfEditedItem } from \"./toolbar-dom-utils\";\nimport { NavigationOutOfBoundsHandler } from \"./Toolbar\";\nimport { PopupCloseCallback } from \"@vuu-ui/vuu-popups\";\n\ntype directionType = \"bwd\" | \"fwd\" | \"start\" | \"end\";\ntype directionMap = { [key: string]: directionType };\nconst navigation = {\n horizontal: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowLeft]: \"bwd\",\n [ArrowRight]: \"fwd\",\n } as directionMap,\n vertical: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowUp]: \"bwd\",\n [ArrowDown]: \"fwd\",\n } as directionMap,\n};\n\nconst isOverflowIndicator = (el: HTMLElement | null) =>\n el !== null && el.dataset.index === \"overflow\";\n\nconst itemIsNotFocusable = (\n container: HTMLElement | null,\n direction: \"bwd\" | \"fwd\",\n indexCount: number,\n nextIdx: number,\n hasOverflowedItem: boolean\n) => {\n if (container) {\n const withinRangeBwd = direction === \"bwd\" && nextIdx > 0;\n const withinRangeFwd = direction === \"fwd\" && nextIdx < indexCount;\n const withinRange = withinRangeBwd || withinRangeFwd;\n const nextElement = getElementByPosition(container, nextIdx, true);\n const isOverflowedItem =\n hasOverflowedItem && !isNonWrappedElement(nextElement);\n const isHiddenOverflowIndicator =\n !hasOverflowedItem && isOverflowIndicator(nextElement);\n hasOverflowedItem && !isNonWrappedElement(nextElement);\n return withinRange && (isOverflowedItem || isHiddenOverflowIndicator);\n } else {\n return false;\n }\n};\n\nconst isNavigationKey = (\n key: string,\n orientation: orientationType = \"horizontal\"\n) => navigation[orientation][key] !== undefined;\n\nconst isMenuActivationKey = (key: string) => key === ArrowDown;\n\nfunction nextItemIdx(count: number, direction: directionType, idx: number) {\n if (direction === \"start\") {\n return 0;\n } else if (direction === \"end\") {\n return count - 1;\n } else if (direction === \"bwd\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n\nconst isNonWrappedElement = (element: HTMLElement | null) =>\n element !== null && !element.classList.contains(\"wrapped\");\n\nconst getToolbarItems = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(\"[data-index]\")) as HTMLElement[];\n\nconst getIndexOfOverflowItem = (container: HTMLElement | null) => {\n if (container === null) {\n return -1;\n } else {\n const targets = getToolbarItems(container);\n const indexValues = targets.map((el) => el.dataset.index);\n return indexValues.indexOf(\"overflow\");\n }\n};\n\n// Get an OverflowItem based on data-index\nconst getElementByPosition = (\n container: HTMLElement | null,\n index: number,\n includeOverflowInd = false\n) => {\n if (container !== null) {\n const targets = getToolbarItems(container);\n const target = targets[index];\n if (!includeOverflowInd && isOverflowIndicator(target)) {\n return null;\n } else {\n return target;\n }\n }\n return null;\n};\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface ToolbarNavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n onNavigateOutOfBounds?: NavigationOutOfBoundsHandler;\n orientation: orientationType;\n}\n\ninterface ToolbarNavigationHookResult {\n containerProps: ContainerNavigationProps;\n focusableIdx: number;\n highlightedIdx: number;\n focusItem: (\n itemIndex: number,\n immediateFocus?: boolean,\n withKeyboard?: boolean,\n delay?: number\n ) => void;\n focusVisible: number;\n focusIsWithinComponent: boolean;\n onClick: (evt: ReactMouseEvent, tabIndex: number) => void;\n onFocus: (evt: FocusEvent<HTMLElement>) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onOverflowMenuClose?: PopupCloseCallback;\n setHighlightedIdx: (highlightedIndex: number) => void;\n}\n\nexport const useKeyboardNavigation = ({\n containerRef,\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n onNavigateOutOfBounds,\n orientation,\n}: ToolbarNavigationHookProps): ToolbarNavigationHookResult => {\n const mouseClickPending = useRef(false);\n /** tracks the highlighted index */\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\n const [highlightedIdx, _setHighlightedIdx] = useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIdx = useCallback(\n (value: number) => {\n _setHighlightedIdx((focusedRef.current = value));\n },\n [_setHighlightedIdx]\n );\n\n const keyboardNavigation = useRef(false);\n\n const focusItem = useCallback(\n (\n itemIndex: number,\n immediateFocus = false,\n withKeyboard?: boolean,\n delay = 70\n ) => {\n // The timeout is important in two scenarios:\n // 1) where tab has overflowed and is being selected from overflow menu.\n // We must not focus it until the overflow mechanism + render has restored\n // it to the main display.\n // 2) when we are focussing a new tab\n // We MUST NOT delay focus when using keyboard nav, else when focus moves from\n // close button (focus ring styled by :focus-visible) to Tab label (focus ring\n // styled by css class) focus style will briefly linger on both.\n console.log(`focus item ${itemIndex}`);\n setHighlightedIdx(itemIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const element = getElementByPosition(\n containerRef.current,\n itemIndex,\n true\n );\n if (element) {\n const focussableElement = getFocusableElement(element);\n focussableElement?.focus();\n }\n };\n if (immediateFocus) {\n setFocus();\n } else {\n setTimeout(setFocus, delay);\n }\n },\n [containerRef, setHighlightedIdx]\n );\n\n const onFocus = (e: FocusEvent<HTMLElement>) => {\n // If focus is received by keyboard navigation, item with tabindex 0 will receive\n // focus. If the item receiving focus has tabindex -1, then focus has been set\n // programatically. We must respect this and not reset focus to selected tab.\n if (focusedRef.current === -1) {\n // Focus is entering tabstrip. Assume keyboard - if it'a actually mouse-driven,\n // the click event will have set correct value.\n if (e.target.tabIndex === 0) {\n // we are tabbing into the focusable item, by default the first\n // align highlighted index\n const index = getElementDataIndex(getClosest(e.target, \"index\"));\n setHighlightedIdx(index);\n } else if (e.target.tabIndex === -1) {\n // Do nothing, assume focus is being passed back to button by closing dialog. Might need\n // to revisit this and add code here if we may get focus set programatically in other ways.\n } else {\n const index = getIndexOfEditedItem(containerRef.current);\n if (index !== -1) {\n requestAnimationFrame(() => {\n setHighlightedIdx(index);\n });\n }\n }\n }\n };\n\n const getIndexCount = useCallback(\n () => containerRef.current?.querySelectorAll(`[data-index]`).length ?? 0,\n [containerRef]\n );\n\n const nextFocusableItemIdx = useCallback(\n (direction: directionType = \"fwd\", idx?: number) => {\n const indexCount = getIndexCount();\n const index = typeof idx === \"number\" ? idx : indexCount;\n\n let nextIdx = nextItemIdx(indexCount, direction, index);\n const nextDirection =\n direction === \"start\" ? \"fwd\" : direction === \"end\" ? \"bwd\" : direction;\n\n const hasOverflowedItem =\n containerRef.current?.querySelector(\n \".vuuOverflowContainer-wrapContainer-overflowed\"\n ) != null;\n\n while (\n itemIsNotFocusable(\n containerRef.current,\n nextDirection,\n indexCount,\n nextIdx,\n hasOverflowedItem\n )\n ) {\n const newIdx = nextItemIdx(indexCount, nextDirection, nextIdx);\n if (newIdx === nextIdx) {\n // theres no further index and nextIndex is not focusable\n // so there are no further focusable items\n return index;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [containerRef, getIndexCount]\n );\n\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n console.log(`highlightedIdx = ${highlightedIdx}, nextIdx = ${nextIdx} `);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n focusItem(nextIdx, immediateFocus);\n } else {\n onNavigateOutOfBounds?.(direction === \"bwd\" ? \"start\" : \"end\");\n }\n },\n [\n orientation,\n nextFocusableItemIdx,\n highlightedIdx,\n focusItem,\n onNavigateOutOfBounds,\n ]\n );\n\n const highlightedItemHasMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n if (el) {\n return el.querySelector(\".vuuPopupMenu\") != null;\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const highlightedItemInEditState = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n if (el) {\n return el.querySelector(\".vuuEditableLabel-input\") != null;\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const activateItemMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n const menuEl = el?.querySelector(\".vuuPopupMenu\") as HTMLElement;\n if (menuEl) {\n dispatchMouseEvent(menuEl, \"click\");\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (getIndexCount() > 0 && isNavigationKey(e.key, orientation)) {\n e.preventDefault();\n if (keyboardNavigation.current) {\n navigateChildItems(e);\n } else {\n keyboardNavigation.current = true;\n navigateChildItems(e);\n }\n } else if (\n isMenuActivationKey(e.key) &&\n highlightedItemHasMenu() &&\n !highlightedItemInEditState()\n ) {\n activateItemMenu();\n }\n },\n [\n activateItemMenu,\n getIndexCount,\n highlightedItemHasMenu,\n highlightedItemInEditState,\n navigateChildItems,\n orientation,\n ]\n );\n\n // TODO, in common hooks, we use mouse movement to track current highlighted\n // index, rather than rely on component item reporting it\n const handleItemClick = (_: ReactMouseEvent, itemIndex: number) => {\n setHighlightedIdx(itemIndex);\n };\n\n const handleFocus = useCallback(() => {\n if (!hasFocus) {\n setHasFocus(true);\n if (!mouseClickPending.current) {\n keyboardNavigation.current = true;\n } else {\n mouseClickPending.current = false;\n }\n }\n }, [hasFocus]);\n\n const handleContainerMouseDown = useCallback(() => {\n if (!hasFocus) {\n mouseClickPending.current = true;\n }\n keyboardNavigation.current = false;\n }, [hasFocus]);\n\n const handleOverflowMenuClose = useCallback<PopupCloseCallback>(\n (closeReason) => {\n if (closeReason?.type === \"escape\") {\n const index = getIndexOfOverflowItem(containerRef.current);\n if (index !== -1) {\n focusItem(index);\n }\n }\n },\n [containerRef, focusItem]\n );\n\n const containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".vuuToolbar\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n setHighlightedIdx(-1);\n setHasFocus(false);\n }\n },\n onMouseDownCapture: handleContainerMouseDown,\n onFocus: handleFocus,\n onMouseLeave: () => {\n keyboardNavigation.current = true;\n setHighlightedIdx(-1);\n mouseClickPending.current = false;\n },\n };\n\n return {\n containerProps,\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n focusIsWithinComponent: hasFocus,\n highlightedIdx,\n focusableIdx: 0,\n focusItem,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n onOverflowMenuClose: handleOverflowMenuClose,\n setHighlightedIdx,\n };\n};\n", "import { getElementDataIndex } from \"@vuu-ui/vuu-utils\";\n\nexport const getIndexOfItem = (\n container: HTMLElement | null,\n query: string\n) => {\n if (container) {\n const targetTab = container.querySelector(\n `[data-index]:has(${query})`\n ) as HTMLElement;\n return getElementDataIndex(targetTab);\n }\n return -1;\n};\n\nexport const getIndexOfSelectedTab = (container: HTMLElement | null) =>\n getIndexOfItem(container, '[aria-selected=\"true\"]');\n\nexport const getIndexOfEditedItem = (container: HTMLElement | null) =>\n getIndexOfItem(container, \".vuuEditableLabel-editing\");\n", "import { isSelectableElement, getClosestIndexItem } from \"@vuu-ui/vuu-utils\";\nimport {\n allowMultipleSelection,\n deselectionIsAllowed,\n selectionIsDisallowed,\n SelectionStrategy,\n SpecialKeyMultipleSelection,\n useControlled,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { KeyboardEvent, MouseEvent, RefObject, useCallback } from \"react\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport interface SelectionHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultSelected?: number[];\n highlightedIdx: number;\n itemQuery: string;\n onSelectionChange?: (selectedIndices: number[]) => void;\n selected?: number[];\n selectionStrategy: SelectionStrategy | SpecialKeyMultipleSelection;\n}\n\nexport interface ItemHandlers {\n onClick?: (e: MouseEvent, itemIndex: number) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n}\n\nconst NO_SELECTION_HANDLERS: ItemHandlers = {};\n\nexport interface SelectionHookResult {\n activateItem: (tabIndex: number) => void;\n itemHandlers: ItemHandlers;\n isControlled: boolean;\n selected: number[];\n}\n\n// TODO use SelectionProps\nexport const useSelection = ({\n containerRef,\n defaultSelected,\n highlightedIdx,\n itemQuery,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n}: SelectionHookProps): SelectionHookResult => {\n const [selected, setSelected, isControlled] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"useSelection\",\n state: \"selected\",\n });\n\n // const isSelectableElement = useMemo(\n // () =>\n // (el: HTMLElement): boolean =>\n // el && el.matches(`[class*=\"${itemQuery} \"]`),\n // [itemQuery]\n // );\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => defaultSelectionKeys.includes(evt.key),\n []\n );\n\n const selectItem = useCallback(\n (itemIndex: number, specialKey = false) => {\n const newSelected = allowMultipleSelection(selectionStrategy, specialKey)\n ? selected.concat(itemIndex)\n : [itemIndex];\n\n setSelected(newSelected);\n onSelectionChange?.(newSelected);\n },\n [onSelectionChange, selected, selectionStrategy, setSelected]\n );\n\n const deselectItem = useCallback(\n (itemIndex: number, specialKey = false) => {\n const newSelected =\n selectionStrategy === \"deselectable\" ||\n (selectionStrategy === \"multiple-special-key\" && !specialKey)\n ? []\n : selected.filter((index) => index !== itemIndex);\n setSelected(newSelected);\n onSelectionChange?.(newSelected);\n },\n [onSelectionChange, selected, selectionStrategy, setSelected]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isSelectionEvent(e) && isSelectableElement(e.target as HTMLElement)) {\n if (!selected.includes(highlightedIdx)) {\n e.stopPropagation();\n e.preventDefault();\n selectItem(highlightedIdx, e.shiftKey);\n } else if (deselectionIsAllowed(selectionStrategy)) {\n e.stopPropagation();\n e.preventDefault();\n deselectItem(highlightedIdx, e.shiftKey);\n }\n }\n },\n [\n isSelectionEvent,\n selected,\n highlightedIdx,\n selectionStrategy,\n selectItem,\n deselectItem,\n ]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, itemIndex: number) => {\n const element = getClosestIndexItem(e.target as HTMLElement);\n if (isSelectableElement(element)) {\n if (!selected.includes(itemIndex)) {\n selectItem(itemIndex, e.shiftKey);\n } else if (deselectionIsAllowed(selectionStrategy)) {\n deselectItem(itemIndex, e.shiftKey);\n }\n }\n },\n [deselectItem, selectItem, selected, selectionStrategy]\n );\n\n const itemHandlers = selectionIsDisallowed(selectionStrategy)\n ? NO_SELECTION_HANDLERS\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n };\n\n return {\n activateItem: selectItem,\n itemHandlers,\n isControlled,\n selected,\n };\n};\n", "import React, { useState } from \"react\";\n\nimport { LayoutConfigurator, LayoutTreeViewer } from \"..\";\nimport { followPathToComponent } from \"../..\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const ConfigWrapper = ({ children }: any) => {\n const designMode = false;\n const [layout, setLayout] = useState(children);\n const [selectedComponent, setSelectedComponent] = useState(children);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleSelection = (selectedPath: any) => {\n const targetComponent = followPathToComponent(layout, selectedPath);\n setSelectedComponent(targetComponent);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleChange = (property: any, value: any) => {\n console.log(`change ${property} -> ${value}`);\n\n const newComponent = React.cloneElement(selectedComponent, {\n style: {\n ...selectedComponent.props.style,\n [property]: value,\n },\n });\n setSelectedComponent(newComponent);\n setLayout(React.cloneElement(layout, {}, newComponent));\n };\n\n return (\n <div data-design-mode={`${designMode}`}>\n {layout}\n <br />\n <div style={{ display: \"flex\" }}>\n <LayoutConfigurator\n height={300}\n managedStyle={selectedComponent.props.style}\n width={300}\n onChange={handleChange}\n style={undefined}\n />\n <LayoutTreeViewer\n layout={layout}\n onSelect={handleSelection}\n style={{ width: 300, height: 300, backgroundColor: \"#ccc\" }}\n />\n </div>\n {/* <StateButton\n defaultChecked={false}\n onChange={(e, value) => setDesignMode(value)}>Design Mode</StateButton> */}\n </div>\n );\n};\n", "import \"./layout-configurator.css\";\nimport { FormField, Input } from \"@salt-ds/core\";\n\nconst NO_STYLE = {};\n\nconst DIMENSIONS = {\n margin: {\n top: \"marginTop\",\n right: \"marginRight\",\n bottom: \"marginBottom\",\n left: \"marginLeft\",\n },\n border: {\n top: \"borderTopWidth\",\n right: \"borderRightWidth\",\n bottom: \"borderBottomWidth\",\n left: \"borderLeftWidth\",\n },\n padding: {\n top: \"paddingTop\",\n right: \"paddingRight\",\n bottom: \"paddingBottom\",\n left: \"paddingLeft\",\n },\n};\n\nconst LayoutBox = ({ feature, children, style, onChange }) => {\n return (\n <div className={`LayoutBox layout-${feature} layout-outer`}>\n <div className={`layout-top`}>\n <span className=\"layout-title\">{feature}</span>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.top}\n onChange={(evt, value) => onChange(feature, \"top\", value)}\n />\n </FormField>\n </div>\n <div className={`layout-inner`}>\n <div className={`layout-left`}>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.left}\n onChange={(evt, value) => onChange(feature, \"left\", value)}\n />\n </FormField>\n </div>\n {children}\n <div className={`layout-right`}>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.right}\n onChange={(evt, value) => onChange(feature, \"right\", value)}\n />\n </FormField>\n </div>\n </div>\n <div className={`layout-bottom`}>\n <FormField className=\"layout-input\" style={{ width: 30 }}>\n <Input\n value={style.bottom}\n onChange={(evt, value) => onChange(feature, \"bottom\", value)}\n />\n </FormField>\n </div>\n </div>\n );\n};\n\nexport const MARGIN_STYLES = {\n margin: true,\n marginTop: true,\n marginRight: true,\n marginBottom: true,\n marginLeft: true,\n};\n\nexport const PADDING_STYLES = {\n padding: true,\n paddingTop: true,\n paddingRight: true,\n paddingBottom: true,\n paddingLeft: true,\n};\n\nexport const BORDER_STYLES = {\n border: true,\n borderColor: true,\n borderWidth: true,\n borderTopWidth: true,\n borderRightWidth: true,\n borderBottomWidth: true,\n borderLeftWidth: true,\n};\n\nconst CSS_DIGIT = \"(\\\\d+)(?:px)?\";\nconst CSS_MEASURE = `^(?:${CSS_DIGIT}(?:\\\\s${CSS_DIGIT}(?:\\\\s${CSS_DIGIT}(?:\\\\s${CSS_DIGIT})?)?)?)$`;\nconst CSS_REX = new RegExp(CSS_MEASURE);\nconst BORDER_REX = /^(?:(\\d+)(?:px)\\ssolid\\s([a-zA-Z,0-9().]+))$/;\n\nexport const LayoutConfigurator = ({\n height,\n managedStyle,\n onChange,\n style,\n width,\n}) => {\n const state = normalizeStyle(managedStyle);\n\n const handleChange = (feature, dimension, strValue) => {\n const value = parseInt(strValue || \"0\", 10);\n const property = DIMENSIONS[feature][dimension];\n onChange(property, value);\n };\n\n const {\n marginTop: mt = 0,\n marginRight: mr = 0,\n marginBottom: mb = 0,\n marginLeft: ml = 0,\n } = state;\n const {\n borderTopWidth: bt = 0,\n borderRightWidth: br = 0,\n borderBottomWidth: bb = 0,\n borderLeftWidth: bl = 0,\n } = state;\n const {\n paddingTop: pt = 0,\n paddingRight: pr = 0,\n paddingBottom: pb = 0,\n paddingLeft: pl = 0,\n } = state;\n return (\n <div className=\"LayoutConfigurator\" style={{ width, height, ...style }}>\n <LayoutBox\n feature=\"margin\"\n style={{ top: mt, right: mr, bottom: mb, left: ml }}\n onChange={handleChange}\n >\n <LayoutBox\n feature=\"border\"\n style={{ top: bt, right: br, bottom: bb, left: bl }}\n onChange={handleChange}\n >\n <LayoutBox\n feature=\"padding\"\n style={{ top: pt, right: pr, bottom: pb, left: pl }}\n onChange={handleChange}\n >\n <div className=\"layout-content\" />\n </LayoutBox>\n </LayoutBox>\n </LayoutBox>\n </div>\n );\n};\n\n// TODO merge the following two functions\nexport function XXXnormalizeStyles(\n layoutStyle = NO_STYLE,\n visualStyle = NO_STYLE\n) {\n const {\n margin,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n padding,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n ...style\n } = layoutStyle;\n\n if (typeof margin === \"number\") {\n style.marginTop =\n style.marginRight =\n style.marginBottom =\n style.marginLeft =\n margin;\n } else if (typeof margin === \"string\") {\n const match = CSS_REX.exec(margin);\n if (match === null) {\n console.error(`Invalid css value for margin '${margin}'`);\n } else {\n const [, pos1, pos2, pos3, pos4] = match;\n const pos123 = pos1 && pos2 && pos3;\n if (pos123 && pos4) {\n style.marginTop = parseInt(pos1, 10);\n style.marginRight = parseInt(pos2, 10);\n style.marginBottom = parseInt(pos3, 10);\n style.marginLeft = parseInt(pos4, 10);\n } else if (pos123) {\n style.marginTop = parseInt(pos1, 10);\n style.marginRight = style.marginLeft = parseInt(pos2, 10);\n style.marginBottom = parseInt(pos3, 10);\n } else if (pos1 && pos2) {\n style.marginTop = style.marginBottom = parseInt(pos1, 10);\n style.marginRight = style.marginLeft = parseInt(pos2, 10);\n } else {\n style.marginTop =\n style.marginRight =\n style.marginBottom =\n style.marginLeft =\n parseInt(pos1, 10);\n }\n }\n }\n if (typeof marginTop === \"number\") style.marginTop = marginTop;\n if (typeof marginRight === \"number\") style.marginRight = marginRight;\n if (typeof marginBottom === \"number\") style.marginBottom = marginBottom;\n if (typeof marginLeft === \"number\") style.marginLeft = marginLeft;\n\n if (typeof padding === \"number\") {\n style.paddingTop =\n style.paddingRight =\n style.paddingBottom =\n style.paddingLeft =\n padding;\n } else if (typeof padding === \"string\") {\n const match = CSS_REX.exec(padding);\n if (match === null) {\n console.error(`Invalid css value for padding '${padding}'`);\n } else {\n const [, pos1, pos2, pos3, pos4] = match;\n const pos123 = pos1 && pos2 && pos3;\n if (pos123 && pos4) {\n style.paddingTop = parseInt(pos1, 10);\n style.paddingRight = parseInt(pos2, 10);\n style.paddingBottom = parseInt(pos3, 10);\n style.paddingLeft = parseInt(pos4, 10);\n } else if (pos123) {\n style.paddingTop = parseInt(pos1, 10);\n style.paddingRight = style.paddingLeft = parseInt(pos2, 10);\n style.paddingBottom = parseInt(pos3, 10);\n } else if (pos1 && pos2) {\n style.paddingTop = style.paddingBottom = parseInt(pos1, 10);\n style.paddingRight = style.paddingLeft = parseInt(pos2, 10);\n } else {\n style.paddingTop =\n style.paddingRight =\n style.paddingBottom =\n style.paddinggLeft =\n parseInt(pos1, 10);\n }\n }\n }\n if (typeof paddingTop === \"number\") style.paddingTop = paddingTop;\n if (typeof paddingRight === \"number\") style.paddingRight = paddingRight;\n if (typeof paddingBottom === \"number\") style.paddingBottom = paddingBottom;\n if (typeof paddingLeft === \"number\") style.paddingLeft = paddingLeft;\n\n return normalizeStyle(style, visualStyle);\n}\n\nfunction normalizeStyle(managedStyle = NO_STYLE) {\n const style = { ...managedStyle };\n\n // if (BORDER_LIST.some(bs => style[bs])) {\n let match;\n\n let {\n border,\n borderWidth,\n borderTopWidth,\n borderRightWidth,\n borderBottomWidth,\n borderLeftWidth,\n borderColor,\n margin,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n padding,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n ...rest\n } = style;\n\n let marginStyles = {};\n let paddingStyles = {};\n\n if (typeof margin === \"number\") {\n style.marginTop =\n style.marginRight =\n style.marginBottom =\n style.marginLeft =\n margin;\n marginStyles = {\n marginTop: margin,\n marginRight: margin,\n marginBottom: margin,\n marginLeft: margin,\n };\n }\n\n if (typeof padding === \"number\") {\n style.paddingTop =\n style.paddingRight =\n style.paddingBottom =\n style.paddingLeft =\n padding;\n paddingStyles = {\n paddingTop: padding,\n paddingRight: padding,\n paddingBottom: padding,\n paddingLeft: padding,\n };\n }\n\n if (\n border ||\n borderWidth ||\n borderTopWidth ||\n borderRightWidth ||\n borderBottomWidth ||\n borderLeftWidth\n ) {\n if (typeof border === \"string\" && (match = BORDER_REX.exec(border))) {\n // what if both border and borderWidth are specified ?\n [, borderWidth, borderColor] = match;\n borderWidth = parseInt(borderWidth, 10);\n }\n\n if (borderWidth) {\n borderTopWidth =\n borderTopWidth === undefined ? borderWidth : borderTopWidth;\n borderRightWidth =\n borderRightWidth === undefined ? borderWidth : borderRightWidth;\n borderBottomWidth =\n borderBottomWidth === undefined ? borderWidth : borderBottomWidth;\n borderLeftWidth =\n borderLeftWidth === undefined ? borderWidth : borderLeftWidth;\n }\n\n borderColor = borderColor || \"black\";\n const boxShadow = `\n ${borderColor} ${borderLeftWidth || 0}px ${\n borderTopWidth || 0\n }px 0 0 inset,\n ${borderColor} ${-borderRightWidth || 0}px ${\n -borderBottomWidth || 0\n }px 0 0 inset`;\n\n return {\n ...rest,\n ...marginStyles,\n ...paddingStyles,\n borderTopWidth,\n borderRightWidth,\n borderBottomWidth,\n borderLeftWidth,\n borderColor,\n borderStyle: \"solid\",\n boxShadow,\n };\n } else {\n return style;\n }\n // } else {\n // return style;\n // }\n}\n", "import React from \"react\";\nimport cx from \"clsx\";\nimport { typeOf } from \"../../utils\";\n\nimport \"./layout-tree-viewer.css\";\nimport { Tree } from \"@vuu-ui/vuu-ui-controls\";\n\nconst classBaseTree = \"hwLayoutTreeViewer\";\n\nconst toTreeJson = (component, path = \"0\") => {\n return {\n label: typeOf(component),\n path,\n childNodes: React.Children.map(component.props.children, (child, i) =>\n toTreeJson(child, path ? `${path}.${i}` : `${i}`)\n ),\n };\n};\n\nexport const LayoutTreeViewer = ({ layout, onSelect, style }) => {\n const treeJson = [toTreeJson(layout)];\n\n const handleSelection = (evt, [{ path }]) => {\n onSelect(path);\n };\n\n return (\n <div className={cx(classBaseTree)} style={style}>\n <Tree\n source={treeJson}\n groupSelection=\"single\"\n onSelectionChange={handleSelection}\n />\n </div>\n );\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAA0B;AAC1B,IAAAA,eAAe;;;ACCf,IAAM,cAA0C,CAAC;AACjD,IAAM,SAAqC,CAAC;AASrC,IAAM,oBAET,CAAC;AAEE,SAAS,YAAY,eAAuB;AACjD,SAAO,YAAY,aAAa,MAAM;AACxC;AAEO,SAAS,OAAO,eAAuB;AAC5C,SAAO,OAAO,aAAa,MAAM;AACnC;AAEO,IAAM,oBAAoB,CAAC,SAChC,YAAY,IAAI,KAAK,OAAO,IAAI;AAK3B,SAAS,kBACdC,gBAEA,WACA,OAA4B,aAC5B;AACA,oBAAkBA,cAAa,IAAI;AAEnC,MAAI,SAAS,aAAa;AACxB,gBAAYA,cAAa,IAAI;AAAA,EAC/B,WAAW,SAAS,QAAQ;AAC1B,WAAOA,cAAa,IAAI;AAAA,EAC1B;AACF;;;AC3CA,kBAAsC;AACtC,kBAAe;AACf,mBAA2D;AAuFnD;AAnFR,IAAM,YAAY;AAElB,IAAM,gBAAgB,CAAC,UAA2B;AAChD,SAAO,OAAO,UAAU,WAAW,QAAQ,QAAQ;AACrD;AAEA,IAAM,WAAW,CACf,WACA,UACA,eACG;AACH,QAAM,cAAc,aAAa;AACjC,QAAM,gBAAgB,eAAe;AAErC,MAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,aAAa;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,iBAAiB,CAAC,aAAa;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB,cAAc,cAAc,QAAQ,IAAI;AAAA,IACzD,sBAAsB,gBAAgB,cAAc,UAAU,IAAI;AAAA,EACpE;AACF;AAaA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,MAAmB;AACjB,QAAM,CAAC,MAAM,OAAO,QAAI,2BAAc;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS,oCAAe;AAAA,IACxB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AAED,UAAQ,IAAI,mBAAmB,QAAQ,eAAe,UAAU,EAAE;AAElE,QAAM,gBAAY,YAAAC,SAAG,WAAW,eAAe,GAAG,SAAS,IAAI,QAAQ,IAAI;AAAA,IACzE,CAAC,GAAG,SAAS,OAAO,GAAG;AAAA,IACvB,CAAC,GAAG,SAAS,SAAS,GAAG;AAAA,IACzB,CAAC,GAAG,SAAS,OAAO,GAAG,CAAC;AAAA,IACxB,CAAC,GAAG,SAAS,WAAW,GAAG;AAAA,EAC7B,CAAC;AAED,QAAM,mBAAe,0BAAY,MAAM;AACrC,YAAQ,CAAC,IAAI;AAAA,EACf,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,QAAQ,SAAS,WAAW,UAAU,UAAU;AAEtD,QAAM,cAAc,cAAc,eAAe;AAEjD,QAAM,qBAAqB,MACzB,4CAAC,SAAI,eAAW,YAAAA,SAAG,2BAA2B,GAC3C,iBACC;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAU;AAAA,MACV,SAAQ;AAAA;AAAA,EACV,IAEA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAU;AAAA,MACV,SAAQ;AAAA;AAAA,EACV,GAEJ;AAGF,SACE,6CAAC,SAAK,GAAG,OAAO,WAAsB,SAAS,aAAa,OACzD;AAAA,oBAAgB,UAAU,mBAAmB,IAAI;AAAA,IAClD,4CAAC,SAAI,WAAW,GAAG,SAAS,UAC1B,sDAAC,SAAI,WAAW,GAAG,SAAS,YAAa,UAAS,GACpD;AAAA,IACC,gBAAgB,QAAQ,mBAAmB,IAAI;AAAA,KAClD;AAEJ;AACA,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;AFvFX,IAAAC,sBAAA;AAvBJ,IAAM,WAAW,CAAC,cAA4B,UAAU,SAAS;AACjE,IAAM,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,OAAO,EAAE,MACjD,SAAS,MAAM,YAAY;AAM7B,IAAM,aAAa,CAAC,UAA2B;AAC7C,QAAM,EAAE,UAAU,WAAW,eAAe,IAAI,MAAM,IAAI;AAC1D,QAAMC,cAAY;AAClB,QAAM,CAAC,SAAS,OAAO,QAAI,4BAAU,UAAU,QAAQ;AACvD,QAAM,CAAC,iBAAiB,iBAAiB,QAAI,4BAAU,SAAS,UAAU;AAC1E,QAAM,cACJ,gBAAgB,WAAW,IACvB,eACA,kBAAkB,WAAW,IAC7B,aACA;AAEN,QAAM,gBAAY,aAAAC,SAAGD,aAAW,eAAe,GAAGA,WAAS,IAAI,WAAW,EAAE;AAE5E,SACE,8CAAC,SAAI,WAAsB,IAAQ,OAChC;AAAA;AAAA,IACD,6CAAC,SAAI,WAAW,GAAGA,WAAS,YAAa,mBAAQ;AAAA,KACnD;AAEJ;AACA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;AAEf,kBAAkB,cAAc,YAAY,WAAW;;;AGzCvD,IAAAE,gBAAkD;AAazC,IAAAC,sBAAA;AAJT,IAAM,gBAAY,0BAAW,SAASC,WACpC,EAAE,YAAY,GAAG,MAAM,GACvB,KACA;AACA,SAAO,6CAAC,SAAK,GAAG,OAAO,WAAU,aAAY,KAAU;AACzD,CAAC;AACD,UAAU,cAAc;AAExB,IAAO,oBAAQ;AAEf,kBAAkB,aAAa,SAAS;;;ACnBxC,IAAAC,gBAAoD;;;ACGpD,IAAM,WAAW,CAAC;AACX,IAAM,UAAU,CACrB,WACA,aACG;AAPL;AAQE,QAAM,QAAQ,SAAS,SAAS;AAChC,UAAO,WAAM,QAAQ,MAAd,YAAmB,MAAM,QAAQ,QAAQ,EAAE;AACpD;AAEO,IAAM,WAAW,CAAC,eACvB,uCAAW,UAAS,aAAa;AAE5B,IAAM,eAAe,CAAC,cAA2B;AACtD,QAAM,QAAQ,SAAS,SAAS;AAChC,MAAI,MAAM,UAAU;AAClB,UAAM;AAAA,MACJ,UAAU,CAAC,QAAQ,GAAG,IAAI;AAAA,IAC5B,IAAI;AACJ,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ;AAAA,QACN,2CAA2C,KAAK,SAAS,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACzBO,SAAS,OAAO,SAAsD;AAH7E;AAIE,MAAI,SAAS;AAEX,UAAM,OAAO,QAAQ;AACrB,QAAI,OAAO,SAAS,cAAc,OAAO,SAAS,UAAU;AAC1D,YAAM,cAAc,KAAK,eAAe,KAAK,UAAQ,UAAK,SAAL,mBAAW;AAChE,UAAI,OAAO,gBAAgB,UAAU;AACnC,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,OAAO,QAAQ,SAAS,UAAU;AACpC,aAAO,QAAQ;AAAA,IACjB;AACA,QAAI,QAAQ,aAAa;AAEvB,aAAQ,QAAQ,YAAoB;AAAA,IACtC;AACA,UAAM,MAAM,4CAA4C;AAAA,EAC1D;AACF;AAEO,IAAM,WAAW,CAAC,SAAuB,SAAiB,OAAO,OAAO,MAAM;;;AFlBrF,IAAM,yBAAyB,CAAC,SAAiB;AAC/C,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT,OAAO;AACL,WAAO,KAAK,MAAM,GAAG,GAAG;AAAA,EAC1B;AACF;AAEA,IAAM,cAAc,CAAC,MACnB,cAAAC,QAAM,eAAe,EAAE,MAAM,QAAQ,IACjC,CAAC,EAAE,MAAM,QAAQ,IACjB,EAAE,MAAM;AASP,IAAM,cAAc,CAAC,QAAsB,OAAO,OAAe;AACtE,QAAM,CAAC,OAAO,GAAG,KAAK,IAAI,KAAK,MAAM,GAAG;AACxC,MAAI,+BAAO,WAAW,MAAM;AAC1B,UAAM,OAAO,eAAe,QAAQ,MAAM,MAAM,CAAC,GAAG,IAAI;AACxD,QAAI,QAAQ,MAAM,QAAQ;AACxB,aAAO,YAAY,MAAM,MAAM,KAAK,GAAG,CAAC;AAAA,IAC1C;AAAA,EACF,WAAW,UAAU,gBAAgB;AACnC,UAAM,EAAE,OAAO,IAAI,SAAS,MAAM;AAClC,UAAM,WAAW,YAAY,MAAM;AACnC,UAAM,EAAE,MAAAC,MAAK,IAAI,SAAS,SAAS,MAAM,CAAC;AAC1C,WAAOA;AAAA,EACT;AAEA,SAAO;AACT;AAMO,IAAM,kBAAkB,CAC7B,QACA,OAAO,OACoB;AAC3B,QAAM,CAAC,OAAO,GAAG,KAAK,IAAI,KAAK,MAAM,GAAG;AACxC,MAAI,+BAAO,WAAW,MAAM;AAC1B,UAAM,OAAO,mBAAmB,QAAQ,MAAM,MAAM,CAAC,GAAG,IAAI;AAC5D,QAAI,QAAQ,MAAM,QAAQ;AACxB,aAAO,gBAAgB,MAAM,MAAM,KAAK,GAAG,CAAC;AAAA,IAC9C;AAAA,EACF,WAAW,UAAU,gBAAgB;AACnC,UAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,OAAO,WAAW,aAAY,qCAAW,UAAS;AACpD,aAAO,SAAS,MAAM;AAAA,IACxB;AAAA,EACF;AACA;AACF;AAEO,SAAS,mBACd,QACA,MACqB;AACrB,QAAM,EAAE,aAAa,UAAU,MAAM,aAAa,SAAS,IACzD,SAAS,MAAM;AAEjB,MAAI,SAAS;AAAK,WAAO;AACzB,MAAI,SAAS;AAAY,WAAO;AAEhC,SAAO,WAAW,QAAQ,uBAAuB,IAAI,GAAG,IAAI;AAC9D;AAEO,SAAS,WACd,QAEA,MACyB;AACzB,QAAM,EAAE,UAAU,GAAG,MAAM,IAAI,SAAS,MAAM;AAC9C,MAAI,KAAK,KAAK,GAAG;AACf,WAAO;AAAA,EACT;AACA,MAAI,cAAAD,QAAM,SAAS,MAAM,QAAQ,IAAI,GAAG;AACtC,UAAM,QAAQ,cAAAA,QAAM,eAAe,QAAQ,IAAI,CAAC,QAAQ,IAAI;AAC5D,eAAW,SAAS,OAAO;AACzB,YAAM,SAAS,WAAW,OAAO,IAAI;AACrC,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,YACd,QACA,QACoB;AACpB,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AACA,QAAM,EAAE,MAAM,YAAY,SAAS,IAAI,SAAS,MAAM;AACtD,QAAM,EAAE,KAAK,UAAU,IAAI,SAAS,YAAY,QAAQ,QAAQ,MAAM,CAAC;AACvE,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,MAAI,aAAa,UAAa,SAAS,GAAG,MAAM,QAAW;AACzD,WAAO;AAAA,EACT;AACA,SAAO,YAAY,SAAS,GAAG,GAAG,MAAM;AAC1C;AAEO,IAAM,WAAW,CACtB,UACA,QAC6B;AAC7B,MAAI,cAAAA,QAAM,eAAe,QAAQ,KAAK,OAAO,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,WAAO,SAAS,GAAG;AAAA,EACrB;AACF;AAEO,SAAS,sBAAsB,WAAyB,MAAc;AAC3E,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,WAAW,CAAC,SAAS;AAEzB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,MAAM,SAAS,MAAM,CAAC,CAAC;AAC7B,UAAM,QAAQ,SAAS,GAAG;AAC1B,QAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,eAAW,YAAY,KAAK;AAAA,EAC9B;AACF;AAEA,IAAM,iBAAiB,CACrB,QACA,IACA,kBAAkB,SACW;AAC7B,QAAM,EAAE,UAAU,IAAI,OAAO,IAAI,OAAO;AACxC,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,cAAAA,QAAM,SAAS,MAAM,QAAQ,IAAI,GAAG;AACtC,UAAM,iBAAa,8BAAe,QAAQ,IAAI,CAAC,QAAQ,IAAI;AAC3D,eAAW,SAAS,YAAY;AAC9B,cAAI,8BAAe,KAAK,GAAG;AACzB,cAAM,SAAS,eAAe,OAAO,IAAI,KAAK;AAC9C,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,MAAM;AAC5B,UAAM,MAAM,gCAAgC,EAAE,sBAAsB;AAAA,EACtE;AACF;AAEA,IAAM,qBAAqB,CACzB,QACA,IACA,kBAAkB,SACS;AAC3B,QAAM,EAAE,UAAU,IAAI,OAAO,IAAI;AACjC,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,eAAW,SAAS,UAAU;AAC5B,UAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,cAAM,SAAS,mBAAmB,OAAO,IAAI,KAAK;AAClD,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,MAAM;AAC5B,UAAM,MAAM,oCAAoC,EAAE,sBAAsB;AAAA,EAC1E;AACF;AAYO,SAAS,WAAW,QAAa,MAAW,kBAAkB,OAAO;AAC1E,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,eAAe,QAAQ,KAAK,MAAM,CAAC,GAAG,eAAe;AAAA,EAC9D;AAEA,QAAM,EAAE,aAAa,UAAU,MAAM,aAAa,SAAS,IACzD,SAAS,MAAM;AACjB,MAAI,KAAK,QAAQ,UAAU,MAAM,GAAG;AAClC,UAAM;AAAA,MACJ,6BAA6B,IAAI,8BAA8B,UAAU;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,QAAQ,KAAK,MAAM,WAAW,SAAS,CAAC;AAC9C,MAAI,UAAU,IAAI;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,QAAM,QAAQ,MAAM,MAAM,GAAG;AAE7B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,cAAAA,QAAM,SAAS,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG;AACrD,YAAM,UAAU,gBAAgB,MAC7B,MAAM,GAAG,CAAC,EACV,KAAK,GAAG,CAAC,oDAAoD,MAC7D,MAAM,CAAC,EACP,KAAK,GAAG,CAAC;AAEZ,UAAI,iBAAiB;AACnB,cAAM,MAAM,OAAO;AAAA,MACrB,OAAO;AACL,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,SAAS,OAAO,MAAM,UAAU,SAAS,MAAM,CAAC,CAAC,CAAC;AAE3D,QAAI,WAAW,QAAW;AACxB,YAAM,UAAU,cAAc,MAC3B,MAAM,GAAG,CAAC,EACV,KAAK,GAAG,CAAC,mDAAmD,MAC5D,MAAM,CAAC,EACP,KAAK,GAAG,CAAC;AAEZ,UAAI,iBAAiB;AACnB,cAAM,MAAM,OAAO;AAAA,MACrB,OAAO;AACL,gBAAQ,KAAK,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,SAAS,MAAoB,MAAc;AACzD,QAAM,SAAS,mBAAmB,MAAM,IAAI;AAC5C,MAAI,cAAc,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,SAAS,KAAK,EAAE,CAAC;AAChE,MAAI,QAAQ;AACV,UAAM,UAAU,YAAY,IAAI;AAChC,UAAM,EAAE,SAAS,IAAI,OAAO;AAC5B,QAAI,SAAS,SAAS,IAAI,SAAU;AAClC,aAAO,UAAU,SAAS,UAAW,CAAC,CAAC;AAAA,IACzC,OAAO;AACL,YAAM,YAAY,YAAY,IAAI;AAClC,YAAM,aAAa,mBAAmB,MAAM,QAAQ,QAAQ,MAAM,CAAC;AACnE,UAAI,cAAc,OAAO,cAAc,UAAU;AAC/C,sBAAc,WAAW,MAAM,KAC5B,MAAM,GAAG,EACT,IAAI,CAAC,QAAgB,SAAS,KAAK,EAAE,CAAC;AACzC,YAAI,WAAW,MAAM,SAAS,SAAS,IAAI,WAAW;AACpD,gBAAME,YAAW,WAAW,MAAM,SAAS,YAAY,CAAC;AACxD,cAAI,YAAY,OAAOA,SAAQ,CAAW,GAAG;AAC3C,mBAAO,UAAUA,SAAQ;AAAA,UAC3B,OAAO;AACL,mBAAOA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,IAAI;AACvB;AAEO,SAAS,aAAa,MAAoB,MAAc;AAC7D,QAAM,cAAc,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,SAAS,KAAK,EAAE,CAAC;AAClE,MAAI,UAAU,YAAY,IAAI;AAC9B,MAAI,SAAS,mBAAmB,MAAM,IAAI;AAC1C,MAAI,UAAU,QAAQ,OAAO,YAAY,UAAU;AACjD,UAAM,EAAE,SAAS,IAAI,OAAO;AAC5B,QAAI,UAAU,GAAG;AACf,aAAO,SAAS,SAAS,UAAU,CAAC,CAAC;AAAA,IACvC,OAAO;AACL,aAAO,YAAY,SAAS,GAAG;AAC7B,kBAAU,YAAY,IAAI;AAC1B,iBAAS;AAAA,UACP;AAAA,UACA,QAAQ,QAAQ,MAAM;AAAA,QACxB;AACA,YAAI,UAAU,GAAG;AACf,gBAAMA,YAAW,OAAO,MAAM,SAAS,UAAU,CAAC;AAClD,cAAI,YAAY,OAAOA,SAAQ,CAAW,GAAG;AAC3C,mBAAO,SAASA,SAAQ;AAAA,UAC1B;AACA,iBAAOA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS,IAAI;AACtB;AAEA,SAAS,UAAU,YAAwC;AACzD,MAAI,YAAY,OAAO,UAAU,CAAW,GAAG;AAC7C,UAAM,EAAE,SAAS,IAAI,WAAW,SAAS;AACzC,WAAO,UAAU,SAAS,CAAC,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAkC;AAClD,MAAI,YAAY,OAAO,IAAI,CAAW,GAAG;AACvC,UAAM,EAAE,SAAS,IAAI,KAAK,SAAS;AACnC,WAAO,SAAS,SAAS,SAAS,SAAS,CAAC,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAOO,SAAS,SACd,WACA,YACA,kBAAkB,OACF;AAChB,MAAI,cAAc,YAAY;AAC5B,WAAO,EAAE,KAAK,IAAI,WAAW,KAAK;AAAA,EACpC;AAEA,QAAM,cAAc,GAAG,SAAS;AAChC,MAAI,CAAC,WAAW,WAAW,WAAW,GAAG;AACvC,UAAM,MAAM,8CAA8C;AAAA,EAC5D;AAEA,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,QAAQ,WACX,QAAQ,aAAa,EAAE,EACvB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC7B,SAAO,EAAE,KAAK,MAAM,CAAC,GAAG,WAAW,MAAM,WAAW,aAAa;AACnE;AAEO,SAAS,UACd,OACA,MAEA,iBACc;AACd,MAAI,QAAQ,OAAO,MAAM,MAAM,MAAM;AACnC,WAAO;AAAA,EACT;AACA,QAAM,WAA2B,CAAC;AAClC,gBAAAF,QAAM,SAAS,QAAQ,MAAM,MAAM,UAAU,CAAC,OAAO,MAAM;AACzD,QAAI,CAAC,QAAQ,OAAO,MAAM,GAAG;AAC3B,eAAS,KAAK,KAAK;AAAA,IACrB,OAAO;AACL,eAAS,KAAK,UAAU,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACD,QAAM,eAAe,MAAM,MAAM,WAAW,IAAI,cAAc;AAC9D,SAAO,cAAAA,QAAM;AAAA,IACX;AAAA,IACA,EAAE,CAAC,YAAY,GAAG,MAAM,GAAG,gBAAgB;AAAA,IAC3C;AAAA,EACF;AACF;;;AGjYO,SAAS,OACd,KAKA,OACM;AACN,MAAI,OAAO,QAAQ,YAAY;AAC7B,QAAI,KAAK;AAAA,EACX,WAAW,KAAK;AACd,QAAI,UAAU;AAAA,EAChB;AACF;;;ACfA,IAAAG,gBAAkE;AAElE,IAAM,cAA8B,CAAC;AAE9B,IAAM,kBAAkB,CAAC,aAAwC;AACtE,QAAM,UAAU,MAAM,QAAQ,QAAQ;AACtC,QAAM,QAAQ,UAAU,SAAS,SAAS,uBAAS,MAAM,QAAQ;AACjE,MAAI,WAAW,SAAS,MAAM,4BAAc,GAAG;AAC7C,WAAO;AAAA,EACT,WAAW,UAAU,KAAK,CAAC,eAAW,8BAAe,QAAQ,GAAG;AAC9D,WAAO,CAAC,QAAQ;AAAA,EAClB,WAAW,QAAQ,GAAG;AACpB,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;;;ACbO,IAAM,aAAa,CAAC,SAAwD;AACjF,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,MAAM,kCAAkC,IAAI,EAAE;AAAA,EACtD;AACA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;;;ACXA,IAAAC,oBAAiC;AAM1B,IAAM,iBAAiB;AAAA,EAC5B,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AACZ;AAEO,IAAM,uBAAuB;AAAA,EAClC,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,WAAW,OAAO,OAAO;AAAA,EACpC,OAAO,UAAU,OAAO;AAAA,EACxB,MAAM,UAAU,MAAM;AAAA,EACtB,OAAO,UAAU,OAAO;AAAA,EACxB,MAAM,UAAU,MAAM;AAAA,EACtB,QAAQ,UAAU,QAAQ;AAAA,EAC1B,QAAQ,UAAU,QAAQ;AAAA,EAC1B,UAAU,UAAU,UAAU;AAChC,CAAC;AAED,SAAS,UAAU,KAAkC;AACnD,SAAO,OAAO,OAAO;AAAA,IACnB,QACE,QAAQ,WAAW,QAAQ,SACvB,IACA,QAAQ,WAAW,QAAQ,SAC3B,IACA;AAAA,IACN,SAAS,WAAY;AACnB,aAAO,eAAe,GAAG;AAAA,IAC3B;AAAA,IACA,UAAU,WAAY;AACpB,aAAO;AAAA,IACT;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ,WAAW,QAAQ;AAAA,IACzC,YAAY,QAAQ,UAAU,QAAQ;AAAA,IACtC,aAAa,QAAQ,WAAW,QAAQ;AAAA,IACxC,aAAa,QAAQ,UAAU,QAAQ;AAAA,IACvC,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;AAEA,IAAM,QAAQ,SAAS;AAAvB,IACE,QAAQ,SAAS;AADnB,IAEE,OAAO,SAAS;AAFlB,IAGE,OAAO,SAAS;AAHlB,IAIE,SAAS,SAAS;AAJpB,IAKE,SAAS,SAAS;AAMb,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA,EAIpB,OAAO,QACL,OACA,kBAA4B,CAAC,GACf;AACd,UAAM,eAA6B,CAAC;AACpC,yBAAqB,OAAO,cAAc,eAAe;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,wBACL,QACA,cACA,GACA,GACA,kBACA;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,QAAQ;AAAA,EACZ;AACF;AAEO,SAAS,wBACd,GACA,GACAC,OACA,aAAa,IACb;AACA,QAAM,QAAQA,MAAK,QAAQA,MAAK;AAChC,QAAM,SAASA,MAAK,SAASA,MAAK;AAClC,QAAM,OAAO,IAAIA,MAAK;AACtB,QAAM,OAAO,IAAIA,MAAK;AACtB,MAAI,iBAAiB;AAErB,MAAI,OAAO;AAAY,sBAAkB;AACzC,MAAI,OAAO,QAAQ;AAAY,sBAAkB;AACjD,MAAI,OAAO;AAAY,sBAAkB;AACzC,MAAI,OAAO,SAAS;AAAY,sBAAkB;AAElD,SAAO,EAAE,MAAM,OAAO,OAAO,MAAM,OAAO,QAAQ,eAAe;AACnE;AAEO,SAAS,YACd,GACA,GACAA,OACA,mBACS;AACT,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,EAAE,MAAM,MAAM,eAAe,IAAI,wBAAwB,GAAG,GAAGA,KAAI;AACzE,MAAI;AACJ,MAAI;AAEJ,MAAI,sBAAsB,OAAO;AAC/B,eAAW,OAAO,MAAM,OAAO;AAAA,EACjC,WAAWA,MAAK,cAAU,oCAAiBA,MAAK,QAAQ,GAAG,CAAC,GAAG;AAC7D,eAAW;AAEX,QAAIA,MAAK,OAAO;AACd,YAAM,WAAWA,MAAK,MAAM;AAC5B,UAAI,aAAa,GAAG;AAClB,cAAM;AAAA,UACJ,OAAO;AAAA,UACP,MAAMA,MAAK;AAAA,UACX,uBAAuB;AAAA,UACvB,OAAO;AAAA,QACT;AAAA,MACF,OAAO;AAEL,cAAM,YAAYA,MAAK,MAAM;AAAA,UAC3B,CAAC,EAAE,MAAM,MAAM,MAAM,KAAK,QAAQ,KAAK;AAAA,QACzC;AACA,YAAI,WAAW;AACb,gBAAM,WAAW,UAAU,QAAQ,UAAU;AAC7C,gBAAM;AAAA,YACJ,OAAOA,MAAK,MAAM,QAAQ,SAAS;AAAA,YACnC,MAAM,UAAU;AAAA,YAChB,wBACG,IAAI,UAAU,QAAQ,WAAW,MAAM,SAAS;AAAA,YACnD,OAAO;AAAA,UACT;AAAA,QACF,OAAO;AACL,gBAAM,UAAUA,MAAK,MAAM,WAAW,CAAC;AACvC,gBAAM;AAAA,YACJ,MAAM,QAAQ;AAAA,YACd,OAAO;AAAA,YACP,OAAO;AAAA,YACP,uBAAuB;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAWA,MAAK,OAAO,YAAY;AACjC,YAAM,WAAWA,MAAK,OAAO;AAC7B,YAAM;AAAA,QACJ,OAAO;AAAA,QACP,MAAMA,MAAK;AAAA,QACX,wBACG,IAAIA,MAAK,QAAQ,WAAW,MAAM,SAAS;AAAA,QAC9C,OAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,YAAM;AAAA,QACJ,MAAMA,MAAK;AAAA,QACX,OAAO;AAAA,QACP,uBAAuB;AAAA,QACvB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,OAAO;AACL,eAAW,qBAAqB,GAAG,GAAGA,OAAM,MAAM,IAAI;AAAA,EACxD;AACA,SAAO,EAAE,UAAqB,GAAG,GAAG,gBAAgB,IAAI;AAC1D;AAEA,SAAS,qBACP,GACA,GACAA,OACA,MACA,MACA;AACA,QAAM,YAAY,eAAeA,OAAM,GAAG;AAC1C,UAAI,oCAAiB,WAAW,GAAG,CAAC,GAAG;AACrC,WAAO;AAAA,EACT,OAAO;AACL,UAAM,WAAW,GAAG,OAAO,MAAM,UAAU,OAAO,GAChD,OAAO,MAAM,SAAS,MACxB;AAEA,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,OAAO,OAAO,QAAQ;AAAA,MAC/B,KAAK;AACH,eAAO,IAAI,OAAO,OAAO,QAAQ;AAAA,MACnC,KAAK;AACH,eAAO,OAAO,OAAO,OAAO;AAAA,MAC9B,KAAK;AACH,eAAO,IAAI,OAAO,OAAO,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eACP,EAAE,OAAO,MAAM,KAAK,OAAO,GAC3B,SACA;AACA,QAAM,aAAa,IAAI,WAAW;AAClC,QAAM,KAAK,QAAQ,QAAQ;AAC3B,QAAM,KAAK,SAAS,OAAO;AAC3B,SAAO,EAAE,MAAM,OAAO,GAAG,KAAK,MAAM,GAAG,OAAO,QAAQ,GAAG,QAAQ,SAAS,EAAE;AAC9E;AAEA,SAAS,qBACP,eACA,cACA,aACA;AACA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,OAAO;AAAA,EACT,IAAI,SAAS,aAAa;AAC1B,QAAM,OAAO,OAAO,aAAa;AAEjC,MAAI,MAAM,MAAM;AACd,UAAM,CAACA,OAAM,EAAE,IAAI,2BAA2B,aAAa;AAC3D,qBAAiB,eAAeA,OAAM,IAAI,YAAY;AACtD,QAAI,YAAY,IAAI,GAAG;AACrB,+BAAyB,eAAe,cAAc,WAAW;AAAA,IACnE;AAAA,EACF;AACF;AAEA,SAAS,iBACP,WACAA,OACA,IACA,cACA;AACA,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,OAAO;AAAA,IACP;AAAA,EACF,IAAI,SAAS,SAAS;AAEtB,eAAa,IAAI,IAAIA;AAErB,QAAM,OAAO,OAAO,SAAS;AAC7B,MAAI,UAAU,SAAS,SAAS;AAC9B,UAAM,QAAQ,SAAS,UAAU,iBAAiB;AAClD,UAAM,WAAW,GAAG,cAAc,KAAK;AACvC,QAAI,UAAU;AACZ,YAAM,EAAE,KAAK,MAAM,OAAO,OAAO,IAAI,SAAS,sBAAsB;AACpE,mBAAa,IAAI,EAAE,SAAS;AAAA,QAC1B,KAAK,KAAK,MAAM,GAAG;AAAA,QACnB,MAAM,KAAK,MAAM,IAAI;AAAA,QACrB,OAAO,KAAK,MAAM,KAAK;AAAA,QACvB,QAAQ,KAAK,MAAM,MAAM;AAAA,MAC3B;AACA,UAAI,SAAS,SAAS;AACpB,qBAAa,IAAI,EAAE,QAAQ,MAAM;AAAA,UAC/B,SAAS,iBAAiB,SAAS;AAAA,QACrC,EACG,IAAI,CAAC,QAAQ,IAAI,sBAAsB,CAAC,EACxC,IAAI,CAAC,EAAE,MAAAC,OAAM,OAAAC,OAAM,OAAO,EAAE,MAAAD,OAAM,OAAAC,OAAM,EAAE;AAAA,MAC/C,OAAO;AACL,cAAM,UAAU,SAAS,cAAc,4BAA4B;AACnE,cAAM,EAAE,QAAAC,QAAO,IAAI,aAAa,IAAI;AACpC,YAAI,WAAWA,SAAQ;AACrB,UAAAA,QAAO,aAAa,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAa,IAAI;AAC1B;AAEA,SAAS,yBACP,WACA,cACA,aACA,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP;AACA,QAAM;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX,IAAI,SAAS,SAAS;AAEtB,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM,YAAY,SAAS;AAC3B,QAAM,UAAU,SAAS;AACzB,QAAMC,WAAU,aAAa,MAAM,kBAAkB;AACrD,QAAMC,aAAY,aAAa,MAAM,kBAAkB;AAEvD,QAAM,oBAAoB,UACtB,SAAS,OAAO,CAAC,QAAsB,QAAgB,QAAQ,MAAM,IACrE,SAAS,OAAO,YAAY;AAIhC,QAAM,oBAAqC,kBAAkB;AAAA,IAC3D,CAAC,UAAwB;AACvB,YAAM,CAACL,OAAM,EAAE,IAAI,2BAA2B,KAAK;AAEnD,aAAO;AAAA,QACL;AAAA,UACE,GAAGA;AAAA,UACH,KAAKA,MAAK,MAAM;AAAA,UAChB,OAAOA,MAAK,QAAQ;AAAA,UACpB,QAAQA,MAAK,SAAS;AAAA,UACtB,MAAMA,MAAK,OAAO;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,uBAAuB,kBAAkB;AAAA,IAC7C,CAAC,CAACA,OAAM,IAAI,KAAK,GAAG,GAAG,QAAQ;AAE7B,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,YAAM,IAAI,IAAI,SAAS;AACvB,UAAIK,YAAW;AACb,iBAAS,MAAM,IAAI,IAAIL,MAAK,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE;AACjD,iBAAS,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,OAAOA,MAAK;AAIjD,oBAAY,MAAM,IAAI,IAAI,WAAW,IAAI,IAAI;AAC7C,oBAAY,MAAM,IAAI,IAAI,WAAW,IAAI,IAAI,SAAS,SAAS;AAC/D,QAAAA,MAAK,QAAQ;AACb,QAAAA,MAAK,SAAS;AACd,oBAAY;AACZ,oBAAY;AAAA,MACd,WAAWI,UAAS;AAClB,iBAAS,MAAM,IAAI,IAAIJ,MAAK,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE;AAChD,iBAAS,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,MAAMA,MAAK;AAIhD,oBAAY,MAAM,IAAI,IAAI,WAAW,IAAI,IAAI;AAC7C,oBAAY,MAAM,IAAI,IAAI,WAAW,IAAI,IAAI,SAAS,SAAS;AAC/D,QAAAA,MAAK,OAAO;AACZ,QAAAA,MAAK,UAAU;AACf,oBAAY;AACZ,oBAAY;AAAA,MACd;AAEA,YAAM,wBAAwB;AAAA,QAC5B;AAAA,QACAA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,YAAY,OAAO,KAAK;AAC9B,UAAI,YAAY,SAAS,GAAG;AAC1B;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,kBAAkB,QAAQ;AAC5B,iBAAa,IAAI,EAAE,WAAW;AAAA,EAChC;AACF;AAEA,SAAS,aAAa,WAAyB;AAC7C,QAAM,EAAE,GAAG,IAAI,SAAS,SAAS;AACjC,QAAM,KAAK,SAAS,eAAe,EAAE;AACrC,MAAI,IAAI;AACN,WAAO,GAAG,QAAQ,aAAa;AAAA,EACjC,OAAO;AACL,YAAQ,KAAK,uCAAuC,EAAE,EAAE;AACxD,WAAO;AAAA,EACT;AACF;AAEA,SAAS,2BACP,WAC0C;AAC1C,QAAM,EAAE,GAAG,IAAI,SAAS,SAAS;AACjC,MAAI,OAAO,QAAW;AACpB,UAAM,MAAM,wDAAwD;AAAA,EACtE;AACA,QAAM,KAAK,SAAS,eAAe,EAAE;AACrC,MAAI,CAAC,IAAI;AACP,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAGA,QAAM,EAAE,KAAK,MAAM,OAAO,QAAQ,QAAQ,MAAM,IAC9C,GAAG,sBAAsB;AAC3B,MAAI,YAAY;AAChB,QAAM,OAAO,OAAO,SAAS;AAC7B,MAAI,YAAY,IAAI,GAAG;AACrB,UAAM,eAAe,GAAG;AACxB,QAAI,eAAe,QAAQ;AACzB,kBAAY,EAAE,IAAI,cAAc,WAAW,GAAG,UAAU;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,MACE,KAAK,KAAK,MAAM,GAAG;AAAA,MACnB,MAAM,KAAK,MAAM,IAAI;AAAA,MACrB,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB,QAAQ,KAAK,MAAM,MAAM;AAAA,MACzB,QAAQ,KAAK,MAAM,MAAM;AAAA,MACzB,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBACP,WACA,cACA,GACA,GACA,aACA,QAAuB,CAAC,GACT;AACf,QAAM;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,OAAO;AAAA,EACT,IAAI,SAAS,SAAS;AAEtB,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAMA,QAAO,aAAa,IAAI;AAC9B,MAAI,KAAC,oCAAiBA,OAAM,GAAG,CAAC;AAAG,WAAO;AAE1C,MAAI,eAAe,YAAY,QAAQ;AACrC,QAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,YAAM,KAAK,SAAS;AAAA,IACtB,WACE,YAAY,KAAK,CAAC,mBAAmB,eAAe,WAAW,IAAI,CAAC,GACpE;AAAA,IAEF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,MAAI,CAAC,YAAY,IAAI,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAIA,MAAK,cAAU,oCAAiBA,MAAK,QAAQ,GAAG,CAAC,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,MAAIA,MAAK,WAAW;AAClB,8BAA0BA,OAAM,GAAG,CAAC;AAAA,EACtC;AAEA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,SAAS,WAAW,UAAU,MAAM,WAAW,GAAG;AACpD;AAAA,IACF;AACA,UAAM,cAAc;AAAA,MAClB,SAAS,CAAC;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,YAAY,QAAQ;AACtB,aAAO,MAAM,OAAO,WAAW;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,0BACP,EAAE,KAAK,QAAQ,UAAU,GACzB,GACA,GACA;AACA,MAAI,WAAW;AACb,UAAM,EAAE,IAAI,WAAW,aAAa,IAAI;AACxC,UAAM,SAAS,SAAS;AACxB,QAAI,cAAc,KAAK,SAAS,IAAI,IAAI;AACtC,YAAM,YAAY,eAAe;AACjC,YAAM,KAAK,SAAS,eAAe,EAAE;AACrC,SAAG,SAAS,EAAE,MAAM,GAAG,KAAK,WAAW,UAAU,SAAS,CAAC;AAC3D,gBAAU,YAAY;AAAA,IACxB,WAAW,YAAY,KAAK,IAAI,MAAM,IAAI;AACxC,YAAM,KAAK,SAAS,eAAe,EAAE;AACrC,SAAG,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,SAAS,CAAC;AACnD,gBAAU,YAAY;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,WAAO;AAAA,EACT;AACF;;;AC9hBA,IAAM,eAAe;AAkCd,IAAM,YAAN,MAAgB;AAAA,EAMrB,YACE,MACA,QACA,QACA,cACA,eACA;AACA,SAAK,KAAK,MAAM,QAAQ,QAAQ,cAAc,aAAa;AAAA,EAC7D;AAAA,EAEA,KACE,MACA,QACA,QACAM,OACA,eACA;AACA,UAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAIA;AAE5B,UAAM,EAAE,MAAM,KAAK,IAAI,wBAAwB,QAAQ,QAAQA,KAAI;AAMnE,UAAM,cAAc;AAEpB,UAAM,QAAQ,OAAOA,MAAK;AAC1B,UAAM,SAASA,MAAK,QAAQ;AAC5B,UAAM,QAAQ,OAAOA,MAAK;AAC1B,UAAM,SAASA,MAAK,SAAS;AAI7B,UAAM,cAAcA,MAAK,QAAQ,aAC/B,eAAeA,MAAK,SAAS;AAE/B,UAAM,YAAY,IAAI;AACtB,UAAM,iBAAiB,QAAQ;AAC/B,UAAM,iBAAiB,QAAQ;AAC/B,UAAM,kBAAkB,SAAS;AACjC,UAAM,kBAAkB,SAAS;AAEjC,SAAK,gBAAgB;AAErB,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,QACJ,GAAG;AAAA,UACD,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,QACX;AAAA,QACA,GAAG;AAAA,UACD,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,QACX;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,QACH,GAAG;AAAA,UACD;AAAA;AAAA,YAAe,KAAK,OAAO;AAAA;AAAA,UAC3B;AAAA;AAAA,YAAgB,KAAK,QAAQA,MAAK,QAAQ;AAAA;AAAA,QAC5C;AAAA,QACA,GAAG;AAAA,UACD;AAAA;AAAA,YAAc,KAAK,MAAM;AAAA;AAAA,UACzB;AAAA;AAAA,YAAiB,KAAK,SAASA,MAAK,SAAS;AAAA;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,UACD;AAAA;AAAA,YAAe,KAAK,OAAO,cAAc;AAAA;AAAA,UACzC;AAAA;AAAA,YAAgB,KAAK,QAAQ,eAAe,IAAI;AAAA;AAAA,QAClD;AAAA,QACA,GAAG;AAAA,UACD;AAAA;AAAA,YAAc,KAAK,MAAM,eAAe;AAAA;AAAA,UACxC;AAAA;AAAA,YAAiB,KAAK,SAAS,gBAAgB,IAAI;AAAA;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AACA,SAAK,IAAI;AAAA,MACP,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE;AAAA,EACvD;AAAA,EAEA,WAAW;AACT,WAAO,CAAC,KAAK,YAAY;AAAA,EAC3B;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAAA,EAEA,mBAAuC;AA1JzC;AA2JI,aAAO,kCAAM,kBAAN,mBAAqB,aAAU,kCAAM,kBAAN,mBAAqB;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,IAAe,UAAkB;AACtC,UAAM,QAAQ,KAAK,EAAE,GACnB,kBAAkB,KAAK,WAAW,MAAM,EAAE,GAC1C,gBAAgB,KAAK,WAAW,IAAI,EAAE,GACtC,cAAc,MAAM;AAEtB,UAAM,OAAO,WAAW,MAAM;AAI9B,QAAI,OAAO,GAAG;AACZ,UAAI,MAAM,IAAI;AAAA,MAEd,WAAW,WAAW,gBAAgB,IAAI;AACxC,cAAM,KAAK;AACX,cAAM,MAAM,cAAc;AAAA,MAC5B,WAAW,MAAM,IAAI;AACnB,YAAI,WAAW,gBAAgB,IAAI;AACjC,gBAAM,KAAK;AACX,gBAAM,OAAO;AAAA,QACf;AAAA,MACF,OAAO;AACL,cAAM,OAAO;AAAA,MACf;AAAA,IACF,WAAW,OAAO,GAAG;AACnB,UAAI,MAAM,IAAI;AAAA,MAEd,WAAW,WAAW,gBAAgB,IAAI;AACxC,cAAM,KAAK;AACX,cAAM,MAAM,cAAc;AAAA,MAC5B,WAAW,MAAM,IAAI;AACnB,YAAI,WAAW,gBAAgB,IAAI;AACjC,gBAAM,KAAK;AACX,gBAAM,OAAO;AAAA,QACf;AAAA,MACF,OAAO;AACL,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,UAAM,WAAW;AAEjB,WAAO,gBAAgB,MAAM;AAAA,EAC/B;AAAA,EAEQ,OAAwB,KAAgB;AAC9C,UAAM,MAAM,KAAK,GAAG,GAClBA,QAAO,KAAK,WAAW,KAAK,GAAG;AAEjC,WAAO,IAAI,KACP,KAAK,IAAIA,MAAK,IAAI,IAAI,QAAQ,IAC9B,IAAI,KACJ,KAAK,IAAI,IAAI,UAAU,KAAK,MAAMA,MAAK,EAAE,IAAI,CAAC,IAC9C,IAAI;AAAA,EACV;AACF;;;AC5MO,IAAM,aAAa,CAAC,eACzB,WAAW,IAAI,OACf,OAAO,WAAW,SAAS,MAAM,WACjC,WAAW,IAAI,SAAS;AAE1B,IAAM,EAAE,OAAO,OAAO,MAAM,KAAK,IAAI;AACrC,IAAM,WAAW,OAAO;AACxB,IAAM,aAAa,QAAQ;AA8BpB,IAAM,aAAN,MAAM,YAAW;AAAA,EAUtB,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAoB;AAClB,SAAK,YAAY;AACjB,SAAK,MAAM;AACX,SAAK,aAAa;AAClB,SAAK,iBAAiB;AACtB,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,aAAa,KAAiB;AAC5B,UAAM,EAAE,MAAM,SAAS,OAAO,UAAU,sBAAsB,IAAI;AAClE,WAAO,0BAA0B,qBAAqB,SAClD,UACA,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,qBACE,WACA,WACmB;AACnB,QAAI,KAAK,IAAI,KAAK;AAChB,aAAO,KAAK,kBAAkB,WAAW,KAAK,IAAI,GAAG;AAAA,IACvD,WAAW,aAAa,UAAU,iBAAiB,GAAG;AACpD,aAAO,KAAK,qBAAqB,SAAS;AAAA,IAC5C,OAAO;AACL,YAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AACA,aAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,kBAAkB,WAAmB,KAAoC;AA1G3E;AA2GI,UAAM;AAAA,MACJ,YAAY,EAAE,KAAK,MAAM,OAAO,QAAQ,OAAO;AAAA,IACjD,IAAI;AAEJ,UAAM,QAAQ;AACd,UAAM,MAAM,KAAK,MAAM,YAAY,CAAC,IAAI;AAExC,UAAM,IAAI,KAAK,MAAM,GAAG;AACxB,UAAM,IAAI,KAAK,MAAM,OAAO,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,QAAQ,GAAG;AAChC,UAAM,IAAI,KAAK,MAAM,SAAS,GAAG;AACjC,UAAM,UAAU,KAAK,aAAa,GAAG;AACrC,UAAM,WAAW;AACjB,UAAM,cAAa,sCAAQ,WAAR,YAAkB,OAAM,sCAAQ,QAAR,YAAe;AAC1D,WAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,UAAU,UAAU;AAAA,EACpD;AAAA,EAEA,qBAAqB,WAAyC;AA5HhE;AA6HI,UAAM,EAAE,KAAK,YAAYC,MAAK,IAAI;AAElC,UAAM,EAAE,GAAG,EAAE,IAAI;AAEjB,QAAI,UAAS,qBAAU,kBAAV,mBAAyB,WAAzB,YAAmC;AAChD,QAAI,SAAQ,qBAAU,kBAAV,mBAAyB,WAAzB,YAAmC;AAE/C,QAAI,UAAU,SAASA,MAAK,QAAQ;AAClC,cAAQ,IAAI,0CAA0C;AACtD,eAASA,MAAK;AAAA,IAChB,WAAW,SAAS,QAAQA,MAAK,OAAO;AACtC,cAAQ,IAAI,0CAA0C;AACtD,cAAQA,MAAK;AAAA,IACf;AAEA,UAAM,OAAO,KAAK;AAAA,MAChBA,MAAK,QAAQ;AAAA,MACb,KAAK,IAAIA,MAAK,MAAM,KAAK,MAAM,IAAI,IAAI,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5D;AACA,UAAM,MAAM,KAAK;AAAA,MACfA,MAAK,SAAS;AAAA,MACd,KAAK,IAAIA,MAAK,KAAK,KAAK,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,CAAC;AAAA,IAC5D;AACA,UAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAK,KAAK,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAEA,UAAM,aAAwB,IAAI,SAAS,aACvC,CAAC,GAAGA,MAAK,KAAK,GAAGA,MAAK,QAAQ,GAAGA,MAAK,KAAK,GAAGA,MAAK,MAAM,IACzD,CAACA,MAAK,MAAM,GAAGA,MAAK,OAAO,GAAGA,MAAK,MAAM,GAAGA,MAAK,OAAO,CAAC;AAE7D,WAAO,EAAE,GAAG,GAAG,GAAG,GAAG,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,WAAmB,WAAuB;AArK/D;AAsKI,UAAM,EAAE,KAAK,YAAYA,MAAK,IAAI;AAClC,UAAM,EAAE,OAAO,gBAAgB,QAAQ,iBAAiB,SAAS,IAAI;AAErE,UAAM,EAAE,OAAO,gBAAgB,QAAQ,gBAAgB,KACrD,4CAAW,kBAAX,YAA4B,CAAC;AAC/B,UAAM,cAAa,iDAAmB,oBAAnB,YAAsC;AACzD,UAAM,aAAY,+CAAkB,mBAAlB,YAAoC;AAEtD,SAAK,WAAW;AAEhB,UAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,IAAIA;AAEjD,UAAM,QAAQ;AACd,UAAM,MAAM,KAAK,MAAM,YAAY,CAAC,IAAI;AAExC,YAAQ,UAAU;AAAA,MAChB,KAAK,SAAS;AAAA,MACd,KAAK,SAAS,QAAQ;AACpB,cAAM,aAAa,KAAK,OAAO,IAAI,KAAK,CAAC;AACzC,cAAM,SAAS,aACX,KAAK,IAAI,YAAY,KAAK,MAAM,UAAU,CAAC,IAC3C;AACJ,eAAO,aAAa,IAAI,YAAY,IAChC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,YAAY,KAAK,IAAI,MAAM,MAAM,IACxD,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,MAAM;AAAA,MAClD;AAAA,MACA,KAAK,SAAS,MAAM;AAClB,cAAM,YAAY,KAAK,OAAO,IAAI,KAAK,CAAC;AACxC,cAAM,QAAQ,YACV,KAAK,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,IACzC;AACJ,eAAO,cAAc,IAAI,aAAa,IAClC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,aAAa,GAAG,IACxD,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,GAAG;AAAA,MACjD;AAAA,MACA,KAAK,SAAS,MAAM;AAClB,cAAM,YAAY,KAAK,OAAO,IAAI,KAAK,CAAC;AACxC,cAAM,QAAQ,YACV,KAAK,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,IACzC;AACJ,eAAO,cAAc,IAAI,aAAa,IAClC,CAAC,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,KAAK,IAAI,aAAa,GAAG,IACxD,CAAC,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,MACjD;AAAA,MACA,KAAK,SAAS,OAAO;AACnB,cAAM,aAAa,KAAK,OAAO,IAAI,KAAK,CAAC;AACzC,cAAM,SAAS,aACX,KAAK,IAAI,YAAY,KAAK,MAAM,UAAU,CAAC,IAC3C;AAEJ,eAAO,aAAa,IAAI,YAAY,IAChC,CAAC,IAAI,KAAK,IAAI,MAAM,QAAQ,IAAI,YAAY,KAAK,IAAI,GAAG,IACxD,CAAC,IAAI,KAAK,IAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAG;AAAA,MAClD;AAAA,MACA,KAAK,SAAS,QAAQ;AACpB,eAAO,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,MAC5C;AAAA,MACA;AACE,gBAAQ,KAAK,0CAA0C,QAAQ,EAAE;AACjE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,WAAW;AACT,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEA,UAA0B;AAExB,QAAI,aAAgC;AACpC,UAAM,cAAc,CAAC,UAAU;AAE/B,WAAQ,aAAa,WAAW,gBAAiB;AAC/C,kBAAY,KAAK,UAAU;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,YAAkD;AAC3E,WAAO,eAAe,OAClB,QACA,yCAAY,UACZ,aACA,YAAW,oBAAoB,WAAW,cAAc;AAAA,EAC9D;AACF;AAGO,SAAS,mBACd,GACA,GACA,YACA,cACA,eACA,kBACA;AAtQF;AAuQE,MAAI,aAAa;AAEjB,QAAMC,2BAA0B,SAAS;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAIA,yBAAwB,QAAQ;AAClC,UAAM,CAAC,WAAW,GAAG,UAAU,IAAIA;AACnC,UAAM;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B,IAAI,SAAS,SAAS;AACtB,UAAM,aAAa,aAAa,IAAI;AACpC,UAAM,yBACJ,iBAAiB,mBAAmB,QAAQ;AAC9C,UAAM,MAAM,YAAY,GAAG,GAAG,YAAY,sBAAsB;AAChE,UAAM,MAAM,aAAa,IAAI;AAE7B,UAAM,iBAAiB,CAAC,CAAC,YAAe,UAAO,MAE9B;AAhSrB,UAAAC,KAAA;AAiSM,YAAIA,MAAA,IAAI,aAAJ,gBAAAA,IAAc,WAAU,IAAI,gBAAgB;AAC9C,cAAM,iBAAiB;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,gBAAgB;AAClB,gBAAM,CAAC,cAAcC,WAAU,IAAI;AAEnC,iBAAO,IAAI,WAAW;AAAA,YACpB,WAAW;AAAA,YACX,KAAK;AAAA,YACL,YAAAA;AAAA,YACA,iBAAgB,oBAAe,OAAO,MAAtB,YAA2B;AAAA,UAC7C,CAAC;AAAA,QACH,WAAW,QAAQ,QAAQ;AACzB,iBAAO,eAAe,OAAO;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA,iBAAa,IAAI,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAgB,oBAAe,UAAU,MAAzB,YAA8B;AAAA,IAChD,CAAC,EAAE,SAAS;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,WACA,EAAE,gBAAgB,SAAS,GAC3B,KACA,cACA,GACA,GACqC;AACrC,MAAI,CAAC,aAAa,UAAU,SAAS,mBAAmB;AACtD;AAAA,EACF;AAEA,QAAM,gBAAgB,aAAa,UAAU,MAAM,IAAI;AACvD,QAAM,aAAa,iBAAiB,eAAe;AACnD,QAAM,eAAe,iBAAiB,eAAe;AACrD,QAAM,gBAAgB,iBAAiB,eAAe;AACtD,QAAM,cAAc,iBAAiB,eAAe;AAEpD,QAAM,SACH,cAAc,SAAS,WACxB,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,cAAc,GAAG;AACtD,QAAM,UACJ,gBAAgB,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,MAAM,cAAc,KAAK;AAC1E,QAAM,WACJ,iBACA,KAAK,MAAM,IAAI,MAAM,MAAM,KAAK,MAAM,cAAc,MAAM;AAC5D,QAAM,SACJ,eAAe,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,MAAM,cAAc,IAAI;AAEvE,MAAI,SAAS,WAAW,YAAY,QAAQ;AAC1C,UAAM,EAAE,aAAa,UAAU,OAAO,SAAS,IAAI,UAAU;AAC7D,UAAM,aAAa,aAAa,IAAI;AACpC,UAAM,eAAe,YAAY,GAAG,GAAG,UAAU;AAGjD,SACG,OAAO,SAAS,KAAK,kBAAkB,SAAS,MACjD,iBAAiB,UACjB;AACA,mBAAa,QAAQ;AACrB,aAAO,CAAC,cAAc,UAAU;AAAA,IAClC,YAGG,OAAO,SAAS,KAAK,kBAAkB,SAAS,OAChD,SAAS,UAAU,iBAAiB,aACrC;AACA,mBAAa,SAAS;AACtB,aAAO,CAAC,cAAc,UAAU;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAwB;AACjD,SAAO,OAAO,SAAS,MAAM;AAC/B;AAEA,SAAS,OAAO,WAAwB;AACtC,SACE,OAAO,SAAS,MAAM,aACtB,UAAU,MAAM,MAAM,kBAAkB;AAE5C;AAEA,SAAS,OAAO,WAAwB;AACtC,SACE,OAAO,SAAS,MAAM,aACtB,UAAU,MAAM,MAAM,kBAAkB;AAE5C;;;ACxYA,wBAA6B;;;ACA7B,IAAAC,eAAe;AAmDP,IAAAC,sBAAA;AA7CD,SAAS,oBACd,YACA,YAAY,GACZ,aAAa,GAC0C;AACvD,QAAM,EAAE,KAAK,YAAY,IAAI,IAAI;AACjC,QAAM,aAAa;AAEnB,SAAO,IAAI,SAAS,OAChB,CAAC,IAAI,OAAO,aAAa,YAAY,IAAI,IAAI,WAAW,MAAM,IAC9D,IAAI,SAAS,QACb,CAAC,IAAI,IAAI,YAAY,IAAI,SAAS,YAAY,YAAY,QAAQ,IAClE,IAAI,SAAS,OACb,CAAC,IAAI,QAAQ,aAAa,YAAY,IAAI,IAAI,WAAW,OAAO;AAAA;AAAA,IAC5C;AAAA,MAClB,IAAI,IAAI;AAAA,MACR,IAAI,MAAM,YAAY;AAAA,MACtB;AAAA,IACF;AAAA;AACN;AAEA,IAAMC,aAAY;AAQX,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,cAAc,WAAW,QAAQ;AAIvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,aAAAC,SAAGD,YAAW,WAAW,GAAGA,UAAS,IAAI,WAAW,EAAE;AAAA,MACjE,cAAc,MAAM,QAAQ,IAAI;AAAA,MAE/B,sBAAY,IAAI,CAAC,QAAQ,MACxB;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,GAAGA,UAAS;AAAA,UACvB,aAAW,MAAM,IAAI,cAAc;AAAA,UACnC,cAAc,MAAM,QAAQ,MAAM;AAAA;AAAA,QAH7B;AAAA,MAIP,CACD;AAAA;AAAA,EACH;AAEJ;;;ADgHY,IAAAE,sBAAA;AAhKZ,IAAI,oBAAoB;AACxB,IAAI,mBAAsC;AAC1C,IAAI,cAAkC;AAEtC,IAAM,oBAAoB,CAAC,eACxB,mBAAmB;AAEtB,IAAM,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAa,IAAI,CAAC,IAAI,CAAC;AAC3C,IAAM,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAa,IAAI,CAAC,IAAI,CAAC;AAC3C,IAAM,iBAAiB,CAAC,CAAC,IAAO,SAAM,MACpC,GAAG,MAAM,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC;AAEnC,IAAM,qBAAqB,CAAC,eAA2B;AACrD,MAAI,YAAY;AACd,UAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI;AACzC,WAAO,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;AAAA,EAC5D,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB;AACvB,MAAI,SAAS,eAAe,gBAAgB,MAAM,MAAM;AACtD,UAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,KAAK;AACf,cAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBtB,aAAS,KAAK,aAAa,WAAW,IAAI;AAAA,EAC5C;AACF;AACA,IAAqB,mBAArB,MAAsC;AAAA,EAIpC,cAAc;AAHd,SAAQ,cAA6B;AACrC,SAAQ,UAA0B;AAGhC,kBAAc;AAAA,EAChB;AAAA,EAEA,QAAQ,UAAwB,UAAmB,aAAa;AAE9D,aAAS,KAAK,UAAU,IAAI,SAAS;AACrC,SAAK,cAAc;AACnB,SAAK,UAAU;AAEf,UAAM,SAAS,KAAK,UAAU,GAAG,GAAG,GAAG,CAAC;AAExC,UAAM,IAAI,eAAe,MAAM;AAE/B,UAAM,kBAAkB,SAAS,eAAe,kBAAkB;AAClE,uDAAiB,aAAa,KAAK;AACnC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAAQ;AAEN,uBAAmB;AACnB,oBAAgB;AAChB,aAAS,KAAK,UAAU,OAAO,SAAS;AACxC,mCAAa,UAAU;AAAA,EACzB;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,UACE,GACA,GACA,OACA,QACA,UAAU,GACV,WAAW,GACX,YAAY,GACH;AACT,UAAM,UAAU,KAAK,YAAY;AACjC,QAAI,aAAa,GAAG;AAClB,aAAO;AAAA,QACL,CAAC,GAAG,IAAI,SAAS;AAAA,QACjB,CAAC,GAAG,IAAI,SAAS;AAAA,QACjB,CAAC,GAAG,CAAC;AAAA,QACL,CAAC,IAAI,UAAU,CAAC;AAAA,QAChB,CAAC,IAAI,UAAU,CAAC;AAAA,QAChB,CAAC,IAAI,OAAO,CAAC;AAAA,QACb,CAAC,IAAI,OAAO,IAAI,MAAM;AAAA,QACtB,CAAC,GAAG,IAAI,MAAM;AAAA,MAChB;AAAA,IACF,WAAW,SAAS;AAClB,YAAM,OAAO;AACb,aAAO;AAAA,QACL,CAAC,MAAM,CAAC;AAAA,QACR,CAAC,MAAM,CAAC;AAAA,QACR,CAAC,OAAO,UAAU,CAAC;AAAA,QACnB,CAAC,OAAO,UAAU,CAAC;AAAA,QACnB,CAAC,OAAO,UAAU,IAAI,SAAS;AAAA,QAC/B,CAAC,OAAO,UAAU,IAAI,SAAS;AAAA,QAC/B,CAAC,MAAM,IAAI,SAAS;AAAA,QACpB,CAAC,MAAM,IAAI,SAAS;AAAA,MACtB;AAAA,IACF,WAAW,YAAY,GAAG;AACxB,aAAO;AAAA,QACL,CAAC,GAAG,IAAI,SAAS;AAAA,QACjB,CAAC,GAAG,IAAI,SAAS;AAAA,QACjB,CAAC,GAAG,CAAC;AAAA,QACL,CAAC,IAAI,UAAU,CAAC;AAAA,QAChB,CAAC,IAAI,UAAU,IAAI,SAAS;AAAA,QAC5B,CAAC,IAAI,OAAO,IAAI,SAAS;AAAA,QACzB,CAAC,IAAI,OAAO,IAAI,MAAM;AAAA,QACtB,CAAC,GAAG,IAAI,MAAM;AAAA,MAChB;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,CAAC,GAAG,IAAI,SAAS;AAAA,QACjB,CAAC,IAAI,SAAS,IAAI,SAAS;AAAA,QAC3B,CAAC,IAAI,SAAS,CAAC;AAAA,QACf,CAAC,IAAI,SAAS,CAAC;AAAA,QACf,CAAC,IAAI,SAAS,IAAI,SAAS;AAAA,QAC3B,CAAC,IAAI,OAAO,IAAI,SAAS;AAAA,QACzB,CAAC,IAAI,OAAO,IAAI,MAAM;AAAA,QACtB,CAAC,GAAG,IAAI,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,YAAwB,WAAsB;AACjD,UAAM,iBAAiB;AACvB,UAAM,eAAe;AAErB,QAAI,qBAAqB,MAAM;AAC7B,WAAK,WAAW,gBAAgB;AAAA,IAClC,OAAO;AACL,UAAI,mBAAmB,OAAO;AAC5B,4BAAoB,WAAW,kBAAkB;AACjD,YAAI,WAAW,IAAI,KAAK;AACtB,2BAAiB,UAAU;AAAA,QAC7B,WAAW,aAAa;AACtB,0BAAgB;AAAA,QAClB;AACA,aAAK,WAAW,YAAY,SAAS;AAAA,MACvC;AAEA,UAAI,mBAAmB;AACrB,cAAM,CAAC,MAAM,KAAK,WAAW,IAAI,oBAAoB,UAAU;AAC/D,YAAI,CAAC,gBAAgB,CAAC,gBAAgB;AACpC,gBAAM,YACJ;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,SAAS;AAAA,cACT;AAAA;AAAA,UACF;AAEF,yCAAa,UAAU;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,uCAAa,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,YAAwB,WAAuB;AACxD,UAAM,YAAY;AAElB,UAAM,oBAAoB,WAAW;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,mBAAmB;AACrB,YAAM,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,UAAU,WAAW,WAAW,IAC3D;AACF,YAAM,IAAI,IAAI;AACd,YAAM,IAAI,IAAI;AAEd,UAAI,KAAK,aAAa;AACpB,cAAMC,QAAO,SAAS,eAAe,kBAAkB;AACvD,QAAAA,SAAA,gBAAAA,MAAM,aAAa,KAAK,KAAK;AAAA,MAC/B;AAEA,YAAM,SAAS,KAAK,UAAU,GAAG,GAAG,GAAG,GAAG,SAAS,UAAU,SAAS;AACtE,YAAM,OAAO,eAAe,MAAM;AAClC,YAAM,YAAY,SAAS;AAAA,QACzB;AAAA,MACF;AACA,6CAAW,aAAa,MAAM;AAC9B,6CAAW;AACX,WAAK,cAAc;AAEnB,YAAM,gBAAgB,SAAS,eAAe,gBAAgB;AAC9D,qDAAe,aAAa,KAAK,mBAAmB,UAAU;AAAA,IAChE;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB;AACtB,IAAM,eAAe;AAErB,SAAS,iBAAiB,YAAwB;AAnOlD;AAoOE,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM;AAAA,IACJ,YAAY,EAAE,OAAAC,OAAM;AAAA,IACpB,KAAK;AAAA;AAAA,MAEH;AAAA,IACF;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,GAAG,IAAI,WAAW,UAAU;AACpC,MAAI,QAAQ;AAEZ,MAAIA,UAAS,OAAO,IAAI,0BAA0B,OAAO;AACvD,UAAM,YAAY,IAAI,0BAA0B,SAAS,IAAI;AAC7D,UAAM,WAAW,6DACf,IAAI,QAAQ,SACd;AACA,aAAQ,cAAS,eAAe,EAAE,MAA1B,mBAA6B,cAAc;AACnD,QAAI,OAAO;AACT,UAAI,gBAAgB,QAAQ,gBAAgB,OAAO;AACjD,cAAM,MAAM,UAAU;AACtB,YAAI,aAAa;AACf,sBAAY,MAAM,UAAU;AAAA,QAC9B;AACA,sBAAc;AAAA,MAChB;AAAA,IACF,OAAO;AACL,sBAAgB;AAAA,IAClB;AAAA,EACF,YAAW,2BAAK,2BAA0B,QAAQ;AAChD,QAAI,gBAAgB,MAAM;AACxB,YAAM,WAAW;AACjB,eAAQ,cACL,eAAe,EAAE,MADZ,mBAEJ,cAAc;AAClB,YAAM,MAAM,UAAU;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF,OAAO;AACL,oBAAgB;AAAA,EAClB;AACF;AAEA,SAAS,kBAAkB;AACzB,MAAI,aAAa;AACf,gBAAY,MAAM,UAAU;AAC5B,kBAAc;AAAA,EAChB;AACF;;;AE5PA,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI,cAAiC;AACrC,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI,kBAAiC;AAErC,IAAM,yBAAyB;AAC/B,IAAM,sBAAsB,IAAI,iBAAmB;AACnD,IAAMC,gBAAe;AAErB,SAAS,iBACP,eACA,mBACA;AACA,MAAI,mBAAmB;AACrB,WAAO,WAAW,eAAe,iBAAiB;AAAA,EACpD,OAAO;AACL,WAAO;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,UAAU,MAAM;AAAA,IACnB;AAAA,EACF;AACF;AAEO,IAAM,YAAY;AAAA,EACvB,gBACE,GACA,mBACA,mBAAqC,CAAC,GACtC;AACA,yBAAqB;AACrB,wBAAoB;AAEpB,kBAAc,EAAE;AAChB,kBAAc,EAAE;AAEhB,qBACE,iBAAiB,kBAAkB,SAC/B,yBACA,iBAAiB;AAEvB,QAAI,mBAAmB,GAAG;AAExB,yBAAmB,GAAG,GAAG,CAAC;AAAA,IAC5B,OAAO;AACL,aAAO,iBAAiB,aAAa,yBAAyB,KAAK;AACnE,aAAO,iBAAiB,WAAW,uBAAuB,KAAK;AAE/D,wBAAkB,OAAO,WAAW,MAAM;AACxC,eAAO,oBAAoB,aAAa,yBAAyB,KAAK;AACtE,eAAO,oBAAoB,WAAW,uBAAuB,KAAK;AAClE,iEAAqB,GAAG,GAAG;AAAA,MAC7B,GAAG,GAAG;AAAA,IACR;AAEA,MAAE,eAAe;AAAA,EACnB;AAAA;AAAA,EAGA,SACE,eACA,mBACA,EAAE,KAAK,MAAM,OAAO,OAAO,GAC3B,SACA,aAIA,eACA,aACA;AACA,KAAC,EAAE,MAAM,mBAAmB,MAAM,iBAAiB,IAAI;AACvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,EAAE,KAAK,MAAM,OAAO,OAAO;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,GAAe;AAC9C,QAAM,IAAI;AACV,QAAM,IAAI;AAEV,QAAM,SAAS,IAAI,EAAE,UAAU,cAAc;AAC7C,QAAM,SAAS,IAAI,EAAE,UAAU,cAAc;AAC7C,QAAM,oBAAoB,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC;AAIrE,MAAI,oBAAoB,gBAAgB;AACtC,WAAO,oBAAoB,aAAa,yBAAyB,KAAK;AACtE,WAAO,oBAAoB,WAAW,uBAAuB,KAAK;AAClE,6DAAqB,GAAG,QAAQ;AAChC,yBAAqB;AAAA,EACvB;AACF;AAEA,SAAS,wBAAwB;AAC/B,MAAI,iBAAiB;AACnB,WAAO,aAAa,eAAe;AACnC,sBAAkB;AAAA,EACpB;AACA,SAAO,oBAAoB,aAAa,yBAAyB,KAAK;AACtE,SAAO,oBAAoB,WAAW,uBAAuB,KAAK;AACpE;AAEA,SAAS,SACP,eACA,mBACA,UACA,SACA,eACA,aACA;AACA,mBAAiB,iBAAiB,eAAe,iBAAiB;AAElE,QAAM,EAAE,aAAa,UAAU,OAAO,SAAS,IAAI,SAAS,cAAc;AAE1E,MAAI,aAAa;AACf,UAAM,YAAY,YACf,IAAI,CAAC,OAAO,WAAW,eAAe,CAAC,UAAU,MAAM,OAAO,EAAE,CAAC,EACjE,IAAI,CAAC,WAAY,OAAuB,MAAM,IAAI;AACrD,4BAAwB;AAAA,EAC1B;AAKA,kBAAgB,SAAS,QAAQ,gBAAgB,WAAW;AAM5D,QAAM,WAAW,cAAc,IAAI;AAEnC,eAAa,IAAI;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,MAAM,WAAW,EAAE,WAAW,GAAG;AACnD,QAAM,OAAO,KAAK,MAAM,WAAW,EAAE,WAAW,GAAG;AAEnD,SAAO,iBAAiB,aAAa,sBAAsB,KAAK;AAChE,SAAO,iBAAiB,WAAW,oBAAoB,KAAK;AAC5D,SAAO,iBAAiB,WAAW,oBAAoB,KAAK;AAE5D,gBAAc;AAEd,sBAAoB,QAAQ,UAAU,UAAU;AAEhD,SAAO,kBAAkB,iBACrB;AAAA;AAAA,IAEA,mBAAmBA,aAAY,IAAIA,aAAY,sBAAsB,IAAI,KAAK,IAAI;AAAA;AACxF;AAEA,SAAS,qBAAqB,KAAiB;AAC7C,QAAM,IAAI,IAAI;AACd,QAAM,IAAI,IAAI;AACd,QAAM,YAAY;AAClB,QAAM,oBAAoB;AAC1B,MAAI;AACJ,MAAI,MAAM;AAEV,MAAI,UAAU,OAAO,KAAK,CAAC,GAAG;AAC5B,WAAO,UAAU,EAAE;AAAA,EACrB;AAEA,MAAI,UAAU,OAAO,KAAK,CAAC,GAAG;AAC5B,WAAO,UAAU,EAAE;AAAA,EACrB;AAEA,MAAI,SAAS,UAAa,SAAS,QAAW;AAAA,EAE9C,OAAO;AACL,2DAAoB,MAAM;AAAA,EAC5B;AAEA,MAAI,eAAe,mBAAmB,QAAW;AAC/C;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,iBAAiB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,OAAO;AACL,iBAAa;AAAA,MACX,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,mBAAmB;AACrB,QAAI,cAAc,QAAQ,WAAW,QAAQ,kBAAkB,KAAK;AAClE,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAY;AACd,wBAAoB,KAAK,YAAY,SAAS;AAC9C,kBAAc;AAAA,EAChB;AACF;AAEA,SAAS,mBAAmB,KAAoB;AAC9C,MAAI,IAAI,QAAQ,UAAU;AACxB,kBAAc;AACd,cAAU;AAAA,EACZ;AACF;AAEA,SAAS,qBAAqB;AAC5B,YAAU;AACZ;AAEA,SAAS,YAAY;AACnB,MAAI,aAAa;AACf,UAAM,aACJ,oBAAoB,mBACpB,WAAW,oBAAoB,WAAW;AAE5C,yDAAmB;AAEnB,kBAAc;AAAA,EAChB,OAAO;AACL;AAAA,EACF;AAEA,sBAAoB;AACpB,qBAAmB;AAEnB,mBAAiB;AACjB,sBAAoB,MAAM;AAC1B,0BAAwB;AACxB,SAAO,oBAAoB,aAAa,sBAAsB,KAAK;AACnE,SAAO,oBAAoB,WAAW,oBAAoB,KAAK;AAC/D,SAAO,oBAAoB,WAAW,oBAAoB,KAAK;AACjE;;;AClSA,IAAAC,eAAuB;AACvB,IAAAC,gBAAyD;AAsBrD,IAAAC,sBAAA;AAZG,IAAM,sBAAkB,0BAAW,SAASC,iBACjD;AAAA,EACE;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AAAA;AAAA,EACZ,GAAG;AACL,GACA,cACA;AACA,QAAM,gBAAY,aAAAC,SAAW,mBAAmB,aAAa;AAC7D,SACE,6CAAC,SAAI,WAAsB,KAAK,cAAe,GAAG,gBAC/C,UACH;AAEJ,CAAC;AAED,IAAM,gBAAgB;AAEtB,gBAAgB,cAAc;AAE9B,kBAAkB,eAAe,iBAAiB,WAAW;;;ACjC7D,IAAAC,eAA2B;AAC3B,IAAAC,eAAe;AACf,IAAAC,iBAAwD;;;ACFxD,IAAAC,oBAA4B;AAC5B,IAAAC,iBAMO;;;ACPP,IAAAC,eAAe;;;ACAf,IAAAC,eAAuB;AACvB,IAAAC,iBAAkD;;;ACAlD,IAAAC,iBAMO;;;ACPP,IAAAC,iBAQO;;;ACRP,IAAAC,oBAAiD;AACjD,IAAAC,gBAA8D;AAI9D,IAAM,mBAAmB,EAAE,oBAAoB,MAAM,mBAAmB,KAAK;AAE7E,IAAM,WAAW,CAAC;AAClB,IAAM,OAAO;AACb,IAAM,mBAAmB;AAAA,EACvB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,kBAAkB;AAAA,EACtB,QAAQ;AAAA,EACR,OAAO;AACT;AAWO,IAAM,oBAAoB,CAACC,iBAA+B,UAAU;AACzE,MAAIA,mBAAkB,OAAO;AAC3B,WAAO,CAAC,SAAS,UAAU,QAAQ;AAAA,EACrC,OAAO;AACL,WAAO,CAAC,UAAU,SAAS,KAAK;AAAA,EAClC;AACF;AAEA,IAAM,mBAAmB,CAAC,UACxB,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AAE1C,IAAM,mBAAmB,CAC9B,cACoD;AACpD,QAAM,EAAE,OAAO,EAAE,QAAQ,MAAM,SAAS,KAAK,IAAI,SAAS,IAAI,UAAU;AAExE,QAAM,YAAY,OAAO,WAAW;AACpC,QAAM,WAAW,OAAO,UAAU;AAElC,MAAI,aAAa,UAAU;AACzB,WAAO,EAAE,QAAQ,MAAM;AAAA,EACzB,WAAW,WAAW;AACpB,WAAO,EAAE,OAAO;AAAA,EAClB,WAAW,UAAU;AACnB,WAAO,EAAE,MAAM;AAAA,EACjB,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aACd,WACAC,YACA,KACA;AACA,QAAM,iBAAiB,gBAAgBA,UAAS;AAChD,QAAM;AAAA,IACJ,OAAO;AAAA,MACL,CAAC,cAAc,GAAG,qBAAqB;AAAA,MACvC,GAAG;AAAA,IACL,IAAI;AAAA,EACN,IAAI,UAAU;AAEd,MAAI,OAAO,IAAIA,UAAS,GAAG;AACzB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,IAAIA,UAAS;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF,OAAO;AACL,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,CAAC,cAAc,GAAG;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,WAAyB;AAC7D,QAAM,EAAE,OAAO,EAAE,MAAM,UAAU,YAAY,UAAU,IAAI,SAAS,IAClE,UAAU;AACZ,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,cAAc,KAAK,aAAa,KAAK,eAAe,GAAG;AACzD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,wBACd,WACAA,YACA,KACA;AACA,QAAM,iBAAiB,gBAAgBA,UAAS;AAChD,QAAM;AAAA,IACJ,OAAO;AAAA,MACL,CAACA,UAAS,GAAG,gBAAgB;AAAA,MAC7B,CAAC,cAAc,GAAG,qBAAqB;AAAA,MACvC,GAAG;AAAA,IACL,IAAI;AAAA,EACN,IAAI,UAAU;AAEd,MAAI,kBAAkB,MAAM;AAC1B,QAAI,iBAAiB,aAAa,GAAG;AACnC,aAAO;AAAA,QACL,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,CAACA,UAAS,GAAG;AAAA,QACb,CAAC,cAAc,GAAG;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,CAACA,UAAS,GAAG;AAAA,MACb,CAAC,cAAc,GAAG;AAAA,IACpB;AAAA,EACF;AACA,MAAI,OAAO,IAAIA,UAAS,GAAG;AACzB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,IAAIA,UAAS;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,cAAc,GAAG;AAAA,EACpB;AACF;AAEO,SAAS,sCACd,WACAD,gBACA,MACA,YACA,UACA;AACA,QAAM,kBAAkB,CAAC;AACzB,MAAI,YAAY;AAChB,MAAI;AAEJ,MAAI,cAAc,UAAU;AAC1B,QAAI;AACJ,UAAM,CAAC,UAAU,SAAS,WAAW,UAAU,IAAI;AACnD,KAAC,kBAAkB,cAAc,IAC/BA,mBAAkB,WACd,CAAC,UAAU,WAAW,KAAK,WAAW,SAAS,UAAU,IACzD,CAAC,WAAW,WAAW,MAAM,WAAW,QAAQ,SAAS;AAE/D,QAAI,kBAAkB;AACpB,sBAAgB;AAAA,QACd,kBAAkB,GAAG,IAAI,IAAI,WAAW,IAAI,kBAAkB;AAAA,UAC5D,UAAU;AAAA,UACV,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,OAAO;AACL,qBAAiB;AAAA,EACnB;AAEA,QAAM,EAAE,UAAU,GAAG,MAAM,IAAI,SAAS,SAAS;AAEjD,kBAAgB;AAAA,IACd,UAAU,WAAW,GAAG,IAAI,IAAI,WAAW,IAAI;AAAA,MAC7C,SAAS,UAAU;AAAA,MACnB,OAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB;AAClB,oBAAgB;AAAA,MACd,kBAAkB,GAAG,IAAI,IAAI,WAAW,IAAI,GAAG,QAAW;AAAA,QACxD,CAAC,QAAQA,cAAa,cAAc,GAAG;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACLA;AAAA,IACA,EAAE,YAAY,OAAO,OAAO,EAAE,WAAW,OAAO,EAAE;AAAA,IAClD;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,eAAe,CACnB,WACA,aACuB;AACvB,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,SAAO,cAAc,IAAI,IAAI;AAC/B;AAEO,SAAS,cACdA,gBAEA,OACA,UACA,MACA;AACA,QAAM,SAAK,wBAAK;AAChB,QAAM,EAAE,UAAU,OAAO,aAAa,KAAK,IAAI;AAC/C,QAAM,EAAE,YAAY,WAAW,SAAY,OAAO,IAAI;AACtD,QAAM,OAAO,aAAa,WAAW,QAAQ;AAE7C,SAAO,cAAAE,QAAM;AAAA,IACX,kBAAkB;AAAA,IAClB;AAAA,MACE;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,eAAAF;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,YAAY,EAAE,UAAU,GAAG,YAAY,EAAE;AAExC,SAAS,kBACd,MACA,MACA,OAEA,OACA;AACA,QAAM,SAAK,wBAAK;AAChB,SAAO,cAAAE,QAAM,cAAc,OAAO;AAAA,IAChC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,aAAa;AAAA,IACb;AAAA,IACA,KAAK;AAAA,IACL,OAAO,EAAE,GAAG,WAAW,GAAG,OAAO,WAAW,KAAK;AAAA,EACnD,CAAC;AACH;;;AClRA,IAAAC,iBAAoC;;;ACCpC,IAAAC,oBAAgC;AAChC,IAAAC,gBAAoC;;;ACFpC,IAAAC,oBAAgC;AAChC,IAAAC,gBAAiE;;;ACAjE,IAAAC,gBAA4B;AAW5B,IAAM,kBAAkB,oBAAI,IAAiB;AAC7C,IAAM,eAAe,oBAAI,IAAiB;AAEnC,IAAM,qBAAqB,CAAC,OAAe,gBAAgB,IAAI,EAAE;AACjE,IAAM,qBAAqB,CAAC,OAAe,gBAAgB,IAAI,EAAE;AACjE,IAAM,qBAAqB,CAAC,IAAY,UAC7C,gBAAgB,IAAI,IAAI,KAAK;AAExB,IAAM,qBAAqB,MAAM;AACtC,QAAM,uBAAmB,2BAAY,CAAC,IAAI,QAAQ;AAChD,UAAM,QAAQ,aAAa,IAAI,EAAE;AACjC,QAAI,OAAO;AACT,UAAI,QAAQ,UAAa,MAAM,GAAG,MAAM,QAAW;AACjD,eAAO,MAAM,GAAG;AAAA,MAClB;AACA,UAAI,QAAQ,QAAW;AACrB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAmB,2BAAY,CAAC,IAAI,KAAK,SAAS;AACtD,QAAI,QAAQ,QAAW;AACrB,mBAAa,IAAI,IAAI,IAAI;AAAA,IAC3B,WAAW,aAAa,IAAI,EAAE,GAAG;AAC/B,YAAM,QAAQ,aAAa,IAAI,EAAE;AACjC,mBAAa,IAAI,IAAI;AAAA,QACnB,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB,2BAAY,CAAC,IAAY,QAAiB;AAClE,QAAI,aAAa,IAAI,EAAE,GAAG;AACxB,UAAI,QAAQ,QAAW;AACrB,qBAAa,OAAO,EAAE;AAAA,MACxB,OAAO;AACL,cAAM,QAAQ,aAAa,IAAI,EAAE;AACjC,YAAI,MAAM,GAAG,GAAG;AACd,gBAAM,EAAE,CAAC,GAAG,GAAG,cAAc,GAAG,KAAK,IAAI,aAAa,IAAI,EAAE;AAC5D,cAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,yBAAa,IAAI,IAAI,IAAI;AAAA,UAC3B,OAAO;AACL,yBAAa,OAAO,EAAE;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,2BAAY,CAAC,IAAY,QAAiB;AAC1D,UAAM,QAAQ,gBAAgB,IAAI,EAAE;AACpC,QAAI,OAAO;AACT,UAAI,QAAQ,QAAW;AACrB,eAAO,MAAM,GAAG;AAAA,MAClB;AACA,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY;AAAA,IAChB,CAAC,IAAY,KAAyB,SAAkB;AACtD,UAAI,QAAQ,QAAW;AACrB,wBAAgB,IAAI,IAAI,IAAI;AAAA,MAC9B,WAAW,gBAAgB,IAAI,EAAE,GAAG;AAClC,cAAM,QAAQ,gBAAgB,IAAI,EAAE;AACpC,wBAAgB,IAAI,IAAI;AAAA,UACtB,GAAG;AAAA,UACH,CAAC,GAAG,GAAG;AAAA,QACT,CAAC;AAAA,MACH,OAAO;AACL,wBAAgB,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,iBAAa,2BAAY,CAAC,IAAY,QAAiB;AAC3D,QAAI,gBAAgB,IAAI,EAAE,GAAG;AAC3B,UAAI,QAAQ,QAAW;AACrB,wBAAgB,OAAO,EAAE;AAAA,MAC3B,OAAO;AACL,cAAM,QAAQ,gBAAgB,IAAI,EAAE;AACpC,YAAI,MAAM,GAAG,GAAG;AACd,gBAAM,EAAE,CAAC,GAAG,GAAG,cAAc,GAAG,KAAK,IAAI,gBAAgB,IAAI,EAAE;AAC/D,cAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,4BAAgB,IAAI,IAAI,IAAI;AAAA,UAC9B,OAAO;AACL,4BAAgB,OAAO,EAAE;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADtGO,IAAM,sBAAsB,CACjC,UAEA,MAAM,kBAAkB,WAAW,CAAC,UAAU,OAAO,IAAI,CAAC,SAAS,QAAQ;AAE7E,IAAM,mBAAkC,CAAC;AAElC,IAAM,mBAAmB,CAAC,WAAyB,OAAO,QAAQ;AACvE,QAAM,CAAC,aAAa,QAAQ,IAAI;AAAA,IAC9B,OAAO,SAAS;AAAA,IAChB,UAAU;AAAA,IACV;AAAA,EACF;AACA,SAAO,cAAAC,QAAM,aAAa,WAAW,aAAa,QAAQ;AAC5D;AAoBO,IAAM,uBAAuB,CAClC,eACA,mBACiB;AACjB,QAAM,OAAO,OAAO,aAAa;AACjC,QAAM,CAAC,aAAa,QAAQ,IAAI;AAAA,IAC9B;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAO,4BAAa,eAAe,aAAa,QAAQ;AAC1D;AAEO,IAAM,cAAc,CACzB,MACA,OACA,mBACgB;AAChB,QAAM,CAAC,aAAa,QAAQ,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eACP,MACA,OACA,OAAO,KACP,aAA4B,MAC5B,gBACa;AA5Ff;AA6FE,QAAM;AAAA,IACJ,QAAQ,aAAa;AAAA,IACrB,aAAa;AAAA,IACb,MAAM,WAAW;AAAA,IACjB,IAAI;AAAA,IACJ,OAAO;AAAA,EACT,IAAI,SAAS,cAAc;AAE3B,QAAM,YAAY,OAAO,cAAc,MAAM,QAAQ,SAAS;AAC9D,QAAM,KAAK,YAAY,UAAS,WAAM,OAAN,gBAAY,wBAAK;AACjD,QAAM,SAAS,SAAS,WAAU,WAAM,WAAN,YAAgB,aAAa;AAE/D,QAAM,MAAM;AACZ,QAAM,QAAQ,YAAY,YAAYC,UAAS,MAAM,OAAO,UAAU;AACtE,SAAO,kBAAkB,IAAI,IACzB,EAAE,IAAI,KAAK,MAAM,OAAO,MAAM,OAAO,IACrC,EAAE,IAAI,KAAK,OAAO,aAAa,KAAK;AAC1C;AAEA,SAAS,oBACP,MACA,OACA,MACA,aAA4B,MAC5B,gBAC+B;AAtHjC;AAuHE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,CAAC,gBAAgB;AACnC,WAAO,CAAC,aAAa,CAAC,eAAe,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;AAAA,EAClE;AAEA,QAAM,oBACH,sDAAwB,aAAxB,aAAoC,sDAAgB,UAAhB,mBAAuB;AAC9D,QAAM,qBAAqB,MAAM,cAAc;AAC/C,QAAM,WAAW,qBACb,mBACA,kBAAkB,MAAM,MAAM,UAAU,MAAM,gBAAgB;AAClE,SAAO,CAAC,aAAa,QAAQ;AAC/B;AAEA,SAAS,kBACP,MACA,UACA,OAAO,KACP,kBACA;AACA,QAAM,OAAO,MAAM,QAAQ,QAAQ,IAC/B,WACA,cAAAD,QAAM,eAAe,QAAQ,IAC7B,CAAC,QAAQ,IACT,CAAC;AACL,SAAO,YAAY,IAAI,IACnB,KAAK,IAAI,CAAC,OAAO,MAAM;AACrB,UAAM,YAAY,OAAO,KAAK;AAC9B,UAAM,eAAe,OAAO,qDAAmB,EAAE;AAEjD,QAAI,CAAC,gBAAgB,cAAc,cAAc;AAC/C,YAAM,CAAC,aAAaE,SAAQ,IAAI;AAAA,QAC9B;AAAA,QACA,MAAM;AAAA,QACN,GAAG,IAAI,IAAI,CAAC;AAAA,QACZ;AAAA,QACA,qDAAmB;AAAA,MACrB;AACA,aAAO,cAAAF,QAAM,aAAa,OAAO,aAAaE,SAAQ;AAAA,IACxD;AAEA,WAAO,qDAAmB;AAAA,EAC5B,CAAC,IACD;AACN;AAEA,IAAMD,YAAW,CACf,MACA,OACA,eACG;AACH,MAAI,EAAE,QAAQ,iBAAiB,IAAI;AACnC,MAAI,SAAS,WAAW;AACtB,YAAQ;AAAA,MACN,eAAe,MAAM,SAAS,WAAW;AAAA,MACzC,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,EAAE,MAAM,GAAG,YAAY,IAAI;AACjC,YAAQ;AAAA,MACN,GAAG;AAAA,MACH,GAAG,WAAW,OAAO,SAAS,WAAW,OAAO,CAAC;AAAA,IACnD;AAAA,EACF,WAAW,eAAe,SAAS;AACjC,YAAQ;AAAA,MACN,GAAG;AAAA,MACH,GAAG,WAAW,CAAC;AAAA,IACjB;AAAA,EACF,WACE,eAAe,cACd,MAAM,SAAS,MAAM,WACtB,MAAM,cAAc,QACpB;AACA,YAAQ;AAAA,MACN,GAAG;AAAA,MACH,WAAW;AAAA,MACX,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eACd,EAAE,SAAK,wBAAK,GAAG,MAAM,UAAU,OAAO,MAAM,GAC5C,MACc;AACd,QAAM,gBAAgB,KAAK,MAAM,QAAQ,IAAI,OAAO,kBAAkB,IAAI;AAE1E,MAAI,kBAAkB,QAAW;AAC/B,UAAM;AAAA,MACJ,kEAAkE,IAAI;AAAA,IACxE;AAAA,EACF;AAEA,MAAI,OAAO;AACT,uBAAmB,IAAI,KAAK;AAAA,EAC9B;AAEA,SAAO,cAAAD,QAAM;AAAA,IACX;AAAA,IACA;AAAA,MACE;AAAA,MACA,GAAG;AAAA,MACH,KAAK;AAAA,MACL;AAAA,IACF;AAAA,IACA,WACI,SAAS,IAAI,CAAC,OAAO,MAAM,eAAe,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,IAChE;AAAA,EACN;AACF;AAEO,SAAS,aAAa,WAAyB;AACpD,SAAO,gBAAgB,SAAS;AAClC;AAEO,SAAS,gBAAgB,WAAqC;AACnE,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM,EAAE,IAAI,UAAU,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,SAAS;AAElE,QAAM,QAAQ,mBAAmB,EAAE,IAAI,mBAAmB,EAAE,IAAI;AAEhE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,eAAe,KAAoB;AAAA,IAC1C;AAAA,IACA,UAAU,cAAAA,QAAM,SAAS,IAAI,UAAU,eAAe;AAAA,EACxD;AACF;AAEO,SAAS,eAAe,OAAqB;AAClD,MAAI,OAAO;AACT,UAAM,EAAE,MAAM,GAAG,WAAW,IAAI;AAChC,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,aAAO,GAAG,IAAI,eAAe,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,OAAqB;AAC3C,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,WAAO,MAAM,IAAI,cAAc;AAAA,EACjC,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,aAAO,CAAC,IAAI,eAAe,CAAC;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AACF;AAMO,IAAM,cAAc,CACzB,OACA,MACA,eACG;AACH,MAAI,QAAQ,YAAY;AACtB,UAAM,gBAAgB,mBAAmB,YAAY,IAAI;AACzD,QAAI,eAAe;AACjB,YAAM,EAAE,IAAI,kBAAkB,IAAI,SAAS,aAAa;AACxD,YAAM,sBAAsB,OAAO,aAAa;AAChD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,qBAAqB;AAAA,MACrB,mBAAmB;AAAA,IACrB;AAAA,EACF;AACF;AAEO,IAAM,qBAAsC,CACjD,WACA,UACA,iBAAiB,CAAC,MACP;AAjUb;AAkUE,MAAI,SAAQ,qBAAU,UAAV,mBAAiB,UAAjB,aAA0B,eAAU,UAAV,mBAAkB;AACxD,MAAI,OAAO;AACT,WAAO;AAAA,EACT,OAAO;AACL,QAAI,QAAQ;AACZ,OAAG;AACD,cAAQ,OAAO,EAAE,KAAK;AAAA,IACxB,SAAS,eAAe,SAAS,KAAK;AACtC,WAAO;AAAA,EACT;AACF;;;ADrTO,SAAS,wBAAwB,OAAoB,KAAc;AAvB1E;AAwBE,QAAM,OAAO,MAAM,MAAM;AACzB,QAAM,WAAW,KAAK;AACtB,QAAM,EAAE,QAAQ,IAAI,wBAAwB,QAAQ,IAAI,IAAI,OAAO,CAAC;AACpE,SAAO,UAAU,MAAM,SAAS,WAC5B,CAAC,KAAK,WAAW,CAAC,GAAG,OAAO,IAC5B,EAAC,UAAK,KAAK,MAAV,YAAe,MAAM,qBAAqB;AACjD;AAEO,SAAS,oBACd,WACA,iBACA,cACc;AACd,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU,oBAAoB,CAAC;AAAA,IAC/B,MAAM;AAAA,EACR,IAAI,SAAS,SAAS;AAEtB,QAAM,wBAAwB,QAAQ,iBAAiB,MAAM;AAC7D,QAAM,EAAE,KAAK,UAAU,IAAI;AAAA;AAAA,IAEzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,CAAC,aAAa,QAAQ,IAAI,YAC5B,mBAAmB,WAAW,mBAAmB,YAAY,IAC7D;AAAA,IACE;AAAA,IACA,uDAAmB;AAAA,MAAI,CAAC,OAAO,UAC7B,UAAU,MACL;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MACF,IACA;AAAA;AAAA,EAER;AACJ,QAAM,SACJ,OAAO,SAAS,MAAM,UAClB,MAAM,QAAQ,WAAW,IACtB,YAAY,CAAC,IACd,cACF;AAEN,SAAO,cAAAG,QAAM,aAAa,WAAW,EAAE,OAAO,GAAG,QAAQ;AAC3D;AAEA,IAAM,kBAAkB,CACtB,eACA,WACA,OACA,mBAEA,kBAAkB,UACd,mBAAmB,WAAW,OAAO,cAAc,IACnD;AAEN,IAAM,oBAAoB,CAAC,aACzB,SAAS,IAAI,CAAC,UAAU,MAAM,MAAM,KAAK;AAE3C,SAAS,mBACP,WACA,mBACA,cAC0B;AAC1B,QAAM,gBAAgB,QAAQ,WAAW,MAAM;AAC/C,QAAM,QAAQ,uDAAmB;AACjC,QAAM;AAAA,IACJ,SAAK,wBAAK;AAAA,IACV,QAAQ;AAAA,MACN,OAAO,SAAS;AAAA,MAChB;AAAA,MACA,wBAAS;AAAA,MACT,kBAAkB,iBAAiB;AAAA,IACrC;AAAA,EACF,IAAI,SAAS,YAAY;AAEzB,MAAI,OAAO;AACT,WAAO;AAAA,MACL;AAAA,MACA,kBAAkB;AAAA,QAChB,UAAU,cAAc,GAAG,aAAa,IAAI,KAAK,IAAI;AAAA,UACnD;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO,CAAC,GAAG,CAAC,UAAU,cAAc,GAAG,aAAa,MAAM,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC;AAAA,EAC3E;AACF;AAEO,SAAS,kBACd,WACA,mBACA,cACA,mBACA,KACA,YACA,UACc;AACd,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EACR,IAAI,SAAS,SAAS;AAEtB,QAAM,wBAAwB,QAAQ,mBAAmB,MAAM;AAC/D,QAAM,EAAE,KAAK,UAAU,IAAI,SAAS,eAAe,qBAAqB;AACxE,QAAM,CAAC,aAAa,QAAQ,IAAI,YAC5B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAAA,IACE;AAAA,IACA,kBAAkB;AAAA,MAAI,CAAC,OAAqB,UAC1C,UAAU,MACN;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IACA;AAAA,IACN;AAAA,EACF;AAEJ,QAAM,SAAS,OAAO,SAAS,MAAM,UAAU,cAAc;AAC7D,SAAO,cAAAA,QAAM,aAAa,WAAW,EAAE,OAAO,GAAG,QAAQ;AAC3D;AAEA,SAAS,eACP,WACA,mBACA,KACA,cACA,mBACA,KACA,YACA,UACA;AACA,QAAM,gBAAgB,iBAAiB,YAAY;AACnD,OAAI,+CAAe,WAAS,+CAAe,SAAQ;AACjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,OACA,2BAAK,WAAS,2BAAK;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,4BAA4B,CAChCC,gBACA,mBACA,EAAE,KAAK,OAAO,QAAQ,KAAK,GAC3B,CAAC,UAAU,SAAS,WAAW,UAAU,MACtC;AACH,MAAIA,mBAAkB,YAAY,sBAAsB,UAAU;AAChE,WAAO,UAAU;AAAA,EACnB,WAAWA,mBAAkB,UAAU;AACrC,WAAO,SAAS;AAAA,EAClB,WAAWA,mBAAkB,SAAS,sBAAsB,UAAU;AACpE,WAAO,WAAW;AAAA,EACpB,WAAWA,mBAAkB,OAAO;AAClC,WAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,8BACP,WACA,mBACA,KACA,cACA,mBACA,YACA,UACA;AACA,QAAM;AAAA,IACJ,OAAO,EAAE,eAAAA,eAAc;AAAA,EACzB,IAAI,SAAS,SAAS;AACtB,QAAM,CAACC,YAAW,gBAAgB,eAAe,IAC/C,kBAAkBD,cAAa;AACjC,QAAM,EAAE,CAAC,cAAc,GAAG,oBAAoB,CAACC,UAAS,GAAG,cAAc,IACvE,iBAAiB,YAAY;AAC/B,QAAM,OAAO,QAAQ,kBAAkB,GAAG,GAAG,MAAM;AAEnD,QAAM,kBAAkB;AAAA,IACtBD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,CAAC,cAAc,IAAI,IACvB,qBAAqB,WAAW,cAAc,IAC1C;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF,IACA,CAAC,cAAc,MAAS;AAE9B,QAAM,cAAc,kBAChB,kBAAkB,MAAM,iBAAiB,EAAE,UAAU,GAAG,YAAY,EAAE,CAAC,IACvE;AAEJ,MAAI,qBAAqB,WAAW,cAAc,GAAG;AACnD,wBAAoB,kBAAkB,IAAI,CAAC,UAAU;AACnD,UAAI,QAAQ,OAAO,aAAa,GAAG;AACjC,eAAO;AAAA,MACT,OAAO;AACL,cAAM,EAAE,CAAC,cAAc,GAAG,wBAAwB,IAAI;AAAA,UACpD;AAAA,QACF;AAIA,YACE,2BACA,0BAA0B,oBAC1B;AACA,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA,QAAQ,OAAO,MAAM;AAAA,UACvB;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,oBACP,WACA,mBACA,KACA,cACA,mBACA,MACA,YACA,aACA;AACA,QAAM,gBAAgB,QAAQ,WAAW,MAAM;AAC/C,MAAI,cAAc;AAClB,QAAM,WACJ,CAAC,qBAAqB,kBAAkB,WAAW,IAC/C,CAAC,YAAY,IACb,kBACG,OAAuB,CAAC,KAAK,OAAO,MAAM;AACzC,QAAI,QAAQ,GAAG;AACb,YAAM,CAAC,mBAAmB,iBAAiB,IACzC,oBAAoB,WAAW,OAAO,cAAc,UAAU;AAChE,UAAI,sBAAsB,UAAU;AAClC,YAAI,aAAa;AACf,cAAI,KAAK,aAAa,mBAAmB,iBAAiB;AAAA,QAC5D,OAAO;AACL,cAAI,KAAK,mBAAmB,iBAAiB;AAAA,QAC/C;AAAA,MACF,OAAO;AACL,YAAI,aAAa;AACf,cAAI,KAAK,mBAAmB,mBAAmB,WAAW;AAAA,QAC5D,OAAO;AACL,cAAI,KAAK,mBAAmB,iBAAiB;AAAA,QAC/C;AAAA,MACF;AACA,oBAAc,IAAI,QAAQ,iBAAiB;AAAA,IAC7C,OAAO;AACL,UAAI,KAAK,KAAK;AAAA,IAChB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC,EACJ;AAAA,IAAI,CAAC,OAAO,MACX,IAAI,cAAc,QAAQ,UAAU,OAAO,GAAG,aAAa,IAAI,CAAC,EAAE;AAAA,EACpE;AAER,SAAO,CAAC,aAAa,QAAQ;AAC/B;AAEA,SAAS,oBACP,WACA,mBACA,cACA,YAC8B;AAC9B,QAAM,SAAK,wBAAK;AAChB,MAAI,EAAE,UAAU,EAAE,IAAI,SAAS,YAAY;AAC3C,aAAW;AACX,MAAI,OAAO,SAAS,MAAM,WAAW;AACnC,UAAM,CAAC,GAAG,IAAI,oBAAoB,UAAU,MAAM,KAAK;AACvD,UAAM,eAAe;AAGrB,UAAM,OAAO,EAAE,CAAC,GAAG,IAAI,WAAW,GAAG,IAAI,gBAAgB,EAAE;AAC3D,UAAM,yBAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,oBAAoB,wBAAwB,cAAc,KAAK,IAAI;AAEzE,WAAO;AAAA,MACL,cAAAD,QAAM,aAAa,mBAAmB;AAAA,QACpC,OAAO;AAAA,MACT,CAAC;AAAA,MACD,cAAAA,QAAM,aAAa,cAAc;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG,MAAM,IAAI;AAAA,QACjD,MAAM;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,MACR;AAAA,IACF,IAAI,SAAS,YAAY;AACzB,WAAO;AAAA,MACL;AAAA,MACA,cAAAA,QAAM,aAAa,cAAc;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,OAAO,EAAE,GAAG,OAAO,MAAM,UAAU;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AG/YA,IAAAG,iBAA2C;;;ACA3C,IAAAC,iBAAoC;;;ACA7B,IAAM,SAAS;AAAA,EACpB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,UAAU;AACZ;;;ADfO,SAAS,aAAa,OAAqB,EAAE,QAAQ,YAAY,GAAkB;AACxF,SAAO,cAAc,OAAO,QAAQ,WAAW;AACjD;AAEO,SAAS,cACd,OACA,OACA,aACA;AACA,QAAM,OAAO,QAAQ,OAAO,MAAM;AAClC,QAAM,aAAa,QAAQ,OAAO,YAAY;AAC9C,QAAM,EAAE,MAAM,IAAI,SAAS,KAAK;AAChC,QAAM,WACJ;AAAA,IACE,eAAAC,QAAM,aAAa,aAAa;AAAA,MAC9B;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG,YAAY,MAAM;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAEF,SAAO,UAAU,OAAO,OAAO,QAAQ;AACzC;AAEO,SAAS,UACd,OACA,OACA,aACA,IACc;AACd,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,UAAU,IAAI,SAAS,QAAQ,OAAO,MAAM,GAAG,QAAQ,OAAO,MAAM,CAAC;AAClF,QAAM,WAAW,MAAM,MAAM,SAAS,MAAM;AAE5C,MAAI,WAAW;AACb,QAAI,CAAC,IAAI;AACP,eAAS,GAAG,IAAI;AAAA,IAClB,WAAW,OAAO,OAAO,UAAU;AACjC,eAAS,GAAG,IAAI,SAAS,OAAO,SAAS,GAAG,CAAC;AAAA,IAC/C,WAAW,OAAO,OAAO,SAAS;AAChC,eAAS,GAAG,IAAI,QAAQ,SAAS,GAAG,CAAC;AAAA,IACvC;AAAA,EACF,OAAO;AACL,aAAS,GAAG,IAAI,UAAU,SAAS,GAAG,GAAG,OAAO,aAAa,EAAE;AAAA,EACjE;AACA,SAAO,eAAAA,QAAM,aAAa,OAAO,QAAW,QAAQ;AACtD;AAEA,SAAS,SAAS,QAAsB,OAAqB;AAC3D,QAAM,EAAE,OAAO,YAAY,IAAI,SAAS,MAAM;AAC9C,QAAM,EAAE,OAAO,WAAW,IAAI,SAAS,KAAK;AAE5C,QAAM,EAAE,OAAO,QAAQ,WAAW,YAAY,UAAU,GAAG,KAAK,IAAI;AAEpE,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACA,QAAM,YACJ,YAAY,kBAAkB,QAC1B,aACA,YAAY,kBAAkB,WAC9B,eACA;AAEN,MAAI,WAAW;AACb,WAAO,eAAAA,QAAM,aAAa,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,OAAqB;AACpC,QAAM,EAAE,OAAO,YAAY,aAAa,IAAI,SAAS,KAAK;AAE1D,QAAM,EAAE,WAAW,YAAY,UAAU,GAAG,KAAK,IAAI;AAErD,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO,eAAAA,QAAM,aAAa,OAAO;AAAA,IAC/B,WAAW;AAAA,IACX;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACH;;;AD3GO,SAAS,UACd,YACA,EAAE,WAAW,MAAM,QAAQ,GAC3B;AACA,QAAM,SAAS,WAAW,YAAY,MAAM,IAAI;AAChD,QAAM,EAAE,SAAS,IAAI,SAAS,MAAM;AACpC,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,kBAAc,6BAAa,QAAQ,QAAW,mBAAmB;AACvE,SAAO,UAAU,YAAY,QAAQ,WAAW;AAClD;AAEA,SAAS,wBACP,UACA,WACA,SACA;AACA,QAAM,cAAc,SAAS,MAAM;AACnC,QAAM,CAAC,KAAK,IAAI,YAAY,OAAO,WAAW,CAAC;AAC/C,MAAI,YAAY,IAAI;AAClB,WAAO,YAAY,OAAO,KAAK;AAAA,EACjC,OAAO;AACL,gBAAY,OAAO,SAAS,GAAG,KAAK;AACpC,WAAO;AAAA,EACT;AACF;;;AG2BO,IAAM,mBAAmB;AAAA,EAC9B,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,SAAS;AACX;AAwKO,IAAM,2BAA2B,CACtC,uBAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,SAAS,kBAAkB;AAExB,IAAM,sBAAsB,CACjC,uBAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,SAAS,kBAAkB;;;AC1Q/B,IAAAC,iBAAoC;AAgB7B,SAAS,YAAY,YAA0B,EAAE,KAAK,GAAiB;AAC5E,QAAM,SAAS,WAAW,YAAY,IAAK;AAC3C,MAAI,eAAe,mBAAmB,YAAY,IAAK;AACvD,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AACA,QAAM,EAAE,SAAS,IAAI,SAAS,YAAY;AAC1C;AAAA;AAAA,IAEE,SAAS,SAAS,KAClB,OAAO,YAAY,MAAM,WACzB,gCAAgC,UAAU,IAAI;AAAA,IAC9C;AACA,UAAM;AAAA,MACJ,OAAO,EAAE,WAAW,SAAS,eAAAC,gBAAe,GAAG,MAAM;AAAA,IACvD,IAAI,SAAS,YAAY;AACzB,QAAI,gBAAgB,QAAQ,cAAc,MAAM;AAChD,QAAI,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA,kBAAkB,eAAe,WAAW,KAAK;AAAA,IACnD;AACA,WAAQ,eAAe,mBAAmB,WAAW,aAAa,GAAI;AACpE,UAAI,QAAQ,cAAc,MAAM,MAAM,KAAK;AACzC;AAAA,MACF;AACA,YAAM,EAAE,UAAAC,UAAS,IAAI,SAAS,YAAY;AAC1C,UAAI,gCAAgCA,SAAQ,GAAG;AAC7C,wBAAgB,QAAQ,cAAc,MAAM;AAC5C,cAAM;AAAA,UACJ,OAAO,EAAE,WAAAC,YAAW,SAAAC,UAAS,eAAAH,gBAAe,GAAGI,OAAM;AAAA,QACvD,IAAI,SAAS,YAAY;AACzB,oBAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA,kBAAkB,eAAeF,YAAWE,MAAK;AAAA,QACnD;AAAA,MACF,WAAW,wBAAwBH,SAAQ,GAAG;AAC5C,oBAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO,aAAa,YAAY,MAAM;AACxC;AAEA,SAAS,aACP,WACA,OACc;AACd,QAAM,QAAQ,SAAS,SAAS;AAChC,QAAM,EAAE,UAAU,mBAAmB,MAAM,SAAS,IAAI;AACxD,MAAI,EAAE,QAAQ,IAAI,YAAY,IAAI;AAClC,QAAM,EAAE,KAAK,UAAU,IAAI,SAAS,MAAM,QAAQ,OAAO,MAAM,CAAC;AAChE,QAAM,OAAO,OAAO,SAAS;AAC7B,MAAI,WAAW,kBAAkB,MAAM;AAEvC,MAAI,WAAW;AACb,aAAS,OAAO,KAAK,CAAC;AAEtB,QAAI,WAAW,UAAa,UAAU,KAAK;AACzC,eAAS,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,IACjC;AAEA,QAAI,SAAS,WAAW,KAAK,YAAY,SAAS,SAAS;AACzD,YAAM;AAAA,QACJ,MAAAI;AAAA,QACA,OAAO,EAAE,UAAU;AAAA,MACrB,IAAI,SAAS,KAAK;AAClB,YAAM,cACJ,gBAAgB,cACZ;AAAA,QACE;AAAA,UACE,OAAO;AAAA,YACL,OAAO,EAAE,UAAU,GAAG,YAAY,GAAG,UAAU;AAAA,YAC/C,OAAO;AAAA,UACT;AAAA,UACA,MAAM;AAAA,QACR;AAAA,QACAA;AAAA,MACF,IACA,kBAAkBA,OAAM,SAAS;AACvC,eAAS,KAAK,WAAW;AAAA,IAC3B,WACE,SAAS,WAAW,KACpB,CAAC,YACD,SAAS,OACT,KAAK,MAAM,eAAe,GAC1B;AACA,aAAO,OAAO,WAAW,SAAS,CAAC,CAAC;AAAA,IACtC;AAEA,QAAI,CAAC,SAAS,KAAK,UAAU,KAAK,SAAS,KAAK,iBAAiB,GAAG;AAClE,iBAAW,aAAa,QAAQ;AAAA,IAClC;AAAA,EACF,OAAO;AACL,aAAS,GAAG,IAAI,aAAa,SAAS,GAAG,GAAG,KAAK;AAAA,EACnD;AAEA,aAAW,SAAS,IAAI,CAACC,QAAO,MAAM,UAAUA,QAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AACtE,SAAO,eAAAC,QAAM,aAAa,WAAW,EAAE,OAAO,GAAG,QAAQ;AAC3D;AAEA,SAAS,OAAO,WAAyB,OAAqB;AAC5D,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA,OAAO,EAAE,WAAW,UAAU,YAAY,OAAO,OAAO;AAAA,EAC1D,IAAI,SAAS,SAAS;AAEtB,MAAI,iBAAiB,UAAU,OAAO,IAAI;AAC1C,MAAI,SAAS,KAAK;AAChB,qBAAiB,eAAAA,QAAM,aAAa,gBAAgB;AAAA,MAClD,OAAO;AAAA,QACL,GAAG,MAAM,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,WAAW,SAAS,WAAW;AAC7B,UAAM,MACJ,UAAU,MAAM,MAAM,kBAAkB,WAAW,WAAW;AAChE,UAAM;AAAA,MACJ,OAAO,EAAE,CAAC,GAAG,GAAG,MAAM,GAAG,MAAM;AAAA,IACjC,IAAI,eAAe;AACnB,qBAAiB,eAAAA,QAAM,aAAa,gBAAgB;AAAA,MAClD,UAAU;AAAA,MACV,OAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,YAA0B;AAC5C,SAAO,QAAQ,MAAM,MAAM,WAAW;AACxC;AAEA,IAAM,oBAAoB,CAAC,YAA0B;AACnD,QAAM,EAAE,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAM;AAClD,SACE,aAAa,KAAK,OAAO,UAAU,YAAY,OAAO,WAAW;AAErE;AAEA,IAAM,eAAe,CAAC,aAA6B;AACjD,SAAO,SAAS;AAAA,IAAI,CAAC,UACnB,kBAAkB,KAAK,IACnB,eAAAA,QAAM,aAAa,OAAO;AAAA,MACxB,OAAO;AAAA,QACL,GAAG,MAAM,MAAM;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,IACF,CAAC,IACD;AAAA,EACN;AACF;AAEA,IAAM,0BAA0B,CAAC,aAA6B;AAC5D,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,QAAI,iBAAiB,QAAQ,SAAS,CAAC,GAAG,aAAa;AACvD,QAAI,gBAAgB;AACpB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,sBAAgB,QAAQ,SAAS,CAAC,GAAG,aAAa;AAClD,UAAI,kBAAkB,eAAe;AACnC,eAAO;AAAA,MACT;AACA,uBAAiB;AAAA,IACnB;AAAA,EACF;AACF;AAEA,IAAM,uBAAuB,CAC3B,WACA,WACG;AACH,QAAM,EAAE,UAAU,mBAAmB,KAAK,IAAI,SAAS,SAAS;AAChE,QAAM,EAAE,KAAK,UAAU,IAAI,SAAS,MAAM,QAAQ,QAAQ,MAAM,CAAC;AACjE,MAAI,WAAW,kBAAkB,MAAM;AACvC,MAAI,WAAW;AACb,aAAS,GAAG,IAAI,sBAAsB,MAAM;AAAA,EAC9C,OAAO;AACL,aAAS,GAAG,IAAI,qBAAqB,SAAS,GAAG,GAAG,MAAM;AAAA,EAC5D;AAEA,aAAW,SAAS,IAAI,CAAC,OAAO,MAAM,UAAU,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AACtE,SAAO,eAAAA,QAAM,aAAa,WAAW,QAAW,QAAQ;AAC1D;AAEA,IAAM,wBAAwB,CAAC,cAA4B;AACzD,QAAM,EAAE,SAAS,IAAI,SAAS,SAAS;AACvC,QAAM,cAAc,CAAC;AACrB,QAAM,eAA+B,CAAC;AAEtC,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,QAAQ,SAAS,CAAC,GAAG,aAAa,GAAG;AACvC,mBAAa,KAAK,SAAS,CAAC,CAAC;AAAA,IAC/B,OAAO;AACL,UAAI,aAAa,WAAW,GAAG;AAC7B,oBAAY,KAAK,aAAa,IAAI,CAAC;AAAA,MACrC,WAAW,aAAa,SAAS,GAAG;AAClC,oBAAY,KAAK,kBAAkB,YAAY,CAAC;AAChD,qBAAa,SAAS;AAAA,MACxB;AACA,kBAAY,KAAK,SAAS,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,gBAAY,KAAK,aAAa,IAAI,CAAC;AAAA,EACrC,WAAW,aAAa,SAAS,GAAG;AAClC,gBAAY,KAAK,kBAAkB,YAAY,CAAC;AAAA,EAClD;AAEA,QAAM,gBAAgB,QAAQ,WAAW,MAAM;AAC/C,SAAO,eAAAA,QAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAY,IAAI,CAAC,OAAO,MAAM,UAAU,OAAO,GAAG,aAAa,IAAI,CAAC,EAAE,CAAC;AAAA,EACzE;AACF;AAEA,IAAM,oBAAoB,CAAC,CAAC,aAAgB,eAAY,MAAsB;AAC5E,QAAM,cAAc,QAAQ,aAAa,OAAO;AAChD,MAAI,EAAE,WAAW,UAAU,WAAW,IAAI;AAC1C,aAAW;AAAA,IACT,OAAO,EAAE,MAAM;AAAA,EACjB,KAAK,cAAc;AACjB,iBAAa,MAAM;AACnB,eAAW,KAAK,IAAI,UAAU,MAAM,QAAQ;AAC5C,iBAAa,KAAK,IAAI,YAAY,MAAM,UAAU;AAAA,EACpD;AACA,SAAO,eAAAA,QAAM,aAAa,aAAa;AAAA,IACrC,OAAO,EAAE,GAAG,aAAa,WAAW,UAAU,WAAW;AAAA,EAC3D,CAAC;AACH;AAEA,IAAM,kCAAkC,CACtC,UACA,SAEA,SAAS;AAAA,EACP,CAAC,UACC,QAAQ,OAAO,aAAa,KAAM,QAAQ,QAAQ,OAAO,MAAM,MAAM;AACzE;;;AC/QF,IAAAC,iBAAmD;AAK5C,SAAS,gBACd,YACA,EAAE,MAAM,KAAK,GACb;AACA,QAAM,SAAS,WAAW,YAAY,MAAM,IAAI;AAEhD,QAAM,EAAE,MAAM,IAAI,SAAS,MAAM;AAEjC,QAAM,WAAW;AAAA,IACf,GAAG;AAAA,IACH,OAAO;AAAA,EACT;AAKA,QAAM,cAAc,eAAAC,QAAM,aAAa,QAAQ,EAAE,OAAO,SAAS,CAAC;AAElE,SAAO,UAAU,YAAY,QAAQ,WAAW;AAClD;AAEO,SAAS,mBACd,YACA,EAAE,MAAM,MAAM,GACd;AACA,QAAM,SAAS,WAAW,YAAY,MAAM,IAAI;AAChD,QAAM,EAAE,UAAU,MAAM,IAAI,SAAS,MAAM;AAE3C,QAAMC,aAAY,MAAM,kBAAkB,WAAW,WAAW;AAChE,QAAM,sBAAsB,qBAAqB,UAAU,OAAOA,UAAS;AAE3E,QAAM,cAAc,eAAAD,QAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,UAAU,YAAY,QAAQ,WAAW;AAClD;AAEA,SAAS,qBACP,UACA,OACAC,YACA;AACA,SAAO,SAAS,IAAI,CAAC,OAAO,MAAM;AAChC,UAAM;AAAA,MACJ,OAAO,EAAE,CAACA,UAAS,GAAG,MAAM,WAAW,gBAAgB;AAAA,IACzD,IAAI,SAAS,KAAK;AAClB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,EAAE,aAAa,UAAU,IAAI;AACnC,UAAM,iBAAiB,gBAAgB;AACvC,UAAM,UAAU,iBAAiB,KAAK,cAAc;AAEpD,QACE,YAAY,UACZ,SAAS,WACT,oBAAoB,SACpB;AACA,aAAO;AAAA,IACT;AACA,WAAO,eAAAD,QAAM,aAAa,OAAO;AAAA,MAC/B,OAAO,iBAAiB,MAAM,MAAM,OAAOC,YAAW,OAAO;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,iBACP,OACAA,YACA,SACA;AACA,QAAM,UAAU,OAAO,MAAMA,UAAS,MAAM;AAC5C,QAAM,EAAE,aAAa,GAAG,WAAW,EAAE,IAAI;AACzC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAACA,UAAS,GAAG,UAAU,UAAU;AAAA,IACjC,WAAW,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACF;;;ACtFA,IAAAC,oBAAgC;AAChC,IAAAC,iBAAoC;AAsBpC,IAAM,gBAAgB,CAAC,cAA2B;AAChD,QAAM,CAAC,WAAW,IAAI,OAAO,SAAS;AACtC,SAAO,gBAAgB,YAAY,YAAY;AACjD;AAEO,SAAS,KACd,WACA,mBACA,cACA,KACA,YACA,UACc;AACd,QAAM,EAAE,UAAU,mBAAmB,MAAM,cAAc,IACvD,SAAS,SAAS;AAEpB,QAAM,wBAAwB,QAAQ,mBAAmB,MAAM;AAC/D,QAAM,EAAE,KAAK,UAAU,IAAI,SAAS,eAAe,qBAAqB;AACxE,QAAM,WAAW,YACbC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA,kBAAkB;AAAA,IAAI,CAAC,OAAqB,UAC1C,UAAU,MACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA;AAAA,EACN;AAEJ,SAAO,eAAAC,QAAM,aAAa,WAAW,QAAW,QAAQ;AAC1D;AAEA,SAASD,gBACP,WACA,mBACA,mBACA,cACA,KACA,YACA,UACA;AACA,QAAM,gBAAgB,iBAAiB,YAAY;AAEnD,OAAI,+CAAe,WAAS,+CAAe,SAAQ;AACjD,QAAI,eAAe,UAAa,aAAa,QAAW;AACtD,YAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,kBACP,WACA,mBACA,mBACA,cACA,KACA;AA7GF;AA8GE,QAAM,EAAE,UAAU,EAAE,IAAI,SAAS,YAAY;AAC7C,QAAM,EAAE,MAAM,uBAAuB,MAAM,IAAI,SAAS,iBAAiB;AACzE,QAAM;AAAA,IACJ;AAAA,IACA,eAAAE;AAAA,IACA,UAAU;AAAA,EACZ,IAAI,wBAAwB,GAAG;AAC/B,QAAM,CAAC,OAAO,wBAAwB,iBAAiB,IACrD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACAA;AAAA,IACA;AAAA,EACF;AACF,QAAM,cAAc,cAAc,GAAG;AACrC,QAAM,SAAS,cAAc,IAAI;AAEjC,QAAM,oBAAoB;AAAA,IACxB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,SAAS,UAAU;AAAA,EACrB;AACA,QAAM,aAAa,cAAc,iBAAiB,IAC9C,oBACA;AAEJ,QAAM,yBAAyB;AAAA,IAC7B,CAAC,UAAU,GAAG;AAAA,IACd,OAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,UAAU,EAAE,UAAU,aAAa,IAAI;AACjE,QAAM,eACJ,SAAS,YACL;AAAA,IACE,eACG,YAAO,SAAS,MAAM,aAAa,UAAU,MAAM,iBAAnD,YACD;AAAA,EACJ,IACA;AAEN,QAAM,SAAK,wBAAK;AAChB,QAAM,UAAU,eAAAD,QAAM;AAAA,IACpB,kBAAkB,IAAI;AAAA,IACtB;AAAA,MACE;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,MAAM,QAAQ,mBAAmB,MAAM;AAAA,MACvC,UAAU,QAAQ,mBAAmB,UAAU;AAAA,MAC/C,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,YAAY,QAAQ,mBAAmB,YAAY;AAAA,IACrD;AAAA,IACA,cACI;AAAA,MACE;AAAA,QACE;AAAA,QACA,GAAG,qBAAqB;AAAA,QACxB;AAAA,MACF;AAAA,MACA;AAAA,QACE,eAAAA,QAAM,aAAa,cAAc,iBAAiB;AAAA,QAClD,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF,IACA;AAAA,MACE;AAAA,QACE,eAAAA,QAAM,aAAa,cAAc,iBAAiB;AAAA,QAClD,GAAG,qBAAqB;AAAA,MAC1B;AAAA,MACA;AAAA,QACE;AAAA,QACA,GAAG,qBAAqB;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACN;AACA,SAAO,kBAAkB;AAAA,IAAI,CAAC,UAC5B,UAAU,oBAAoB,UAAU;AAAA,EAC1C;AACF;AAEA,SAAS,4BACP,mBACA,mBACA,cACA,KACA,YACA,UACA;AACA,QAAM,EAAE,eAAAC,eAAc,IAAI,wBAAwB,GAAG;AACrD,QAAM,kBAAkBA,mBAAkB,WAAW,QAAQ;AAC7D,QAAM,cAAc,cAAc,GAAG;AAErC,QAAM,CAAC,UAAU,SAAS,WAAW,UAAU,IAAI;AACnD,QAAM,CAAC,kBAAkB,cAAc,IACrCA,mBAAkB,WACd,CAAC,UAAU,WAAW,KAAK,WAAW,SAAS,UAAU,IACzD,CAAC,WAAW,WAAW,MAAM,WAAW,QAAQ,SAAS;AAC/D,QAAM,WAAW,QAAQ,mBAAmB,MAAM;AAClD,MAAI,YAAY;AAEhB,QAAM,aAAa,cAAc,iBAAiB,IAC9C,oBACA;AAEJ,QAAM,kBAAkB,CAAC;AACzB,MAAI,kBAAkB;AACpB,oBAAgB;AAAA,MACd,cACI,UAAU,mBAAmB,GAAG,QAAQ,IAAI,WAAW,IAAI;AAAA,QACzD,CAAC,UAAU,GAAG;AAAA,QACd,OAAO,EAAE,WAAW,kBAAkB,UAAU,GAAG,YAAY,EAAE;AAAA,MACnE,CAAC,IACD,kBAAkB,GAAG,QAAQ,IAAI,WAAW,IAAI,kBAAkB;AAAA,QAChE,UAAU;AAAA,QACV,YAAY;AAAA,MACd,CAAC;AAAA,IACP;AAAA,EACF;AACA,kBAAgB;AAAA,IACd;AAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG,QAAQ,IAAI,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,gBAAgB;AAClB,oBAAgB;AAAA,MACd,cACI,kBAAkB,GAAG,QAAQ,IAAI,WAAW,IAAI,CAAC,IACjD,UAAU,mBAAmB,GAAG,QAAQ,IAAI,WAAW,IAAI;AAAA,QACzD,CAAC,UAAU,GAAG;AAAA,QACd,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,YAAY,EAAE;AAAA,MACpD,CAAC;AAAA,IACP;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACdA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,SAAO,kBAAkB;AAAA,IAAI,CAAC,UAC5B,UAAU,oBAAoB,UAAU;AAAA,EAC1C;AACF;AAEA,SAAS,qBACP,MACA,mBACA,cACAA,gBACA,KACA;AACA,QAAM,QAAQ;AAAA,IACZ,GAAG,kBAAkB,MAAM;AAAA,IAC3B,eAAAA;AAAA,EACF;AAEA,QAAMC,aACJ,SAAS,aAAaD,mBAAkB,WAAW,WAAW;AAChE,QAAM,oBAAoB,aAAa,cAAcC,YAAW,GAAG;AACnE,QAAM,yBAAyB,aAAa,mBAAmBA,UAAS;AAExE,SAAO,CAAC,OAAO,wBAAwB,iBAAiB;AAC1D;AAEA,IAAM,gBAAgB,CAAC,QAAc;AA7RrC;AA8RE,aAAI,SAAS,cACT,SACA,gCAAK,QAAL,mBAAU,2BAA0B,WACpC,QACA,IAAI,SAAS,SACb,OACA;AAAA;AAEN,SAAS,wBAAwB,KAA0B;AACzD,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,eAAe;AAAA,MACf,UAAU;AAAA,IACZ;AAAA,EACF,OAAO;AACL,WAAO;AAAA,MACL,MAAM;AAAA,MACN,eAAe,IAAI,SAAS,aAAa,QAAQ;AAAA,IACnD;AAAA,EACF;AACF;;;AV5QO,IAAM,gBAAgB,CAC3B,OACA,WACiB;AACjB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,iBAAiB;AACpB,aAAO,SAAS,OAAO,MAAM;AAAA,IAC/B,KAAK,iBAAiB;AACpB,aAAO,SAAS,OAAO,MAAM;AAAA,IAC/B,KAAK,iBAAiB;AACpB,aAAO,cAAc,OAAO,MAAM;AAAA,IACpC,KAAK,iBAAiB;AACpB,aAAO,YAAY,OAAO,MAAM;AAAA,IAClC,KAAK,iBAAiB;AACpB,aAAO,aAAa,OAAO,MAAM;AAAA,IACnC,KAAK,iBAAiB;AACpB,aAAO,QAAQ,OAAO,MAAM;AAAA,IAC9B,KAAK,iBAAiB;AACpB,aAAO,SAAS,OAAO,MAAM;AAAA,IAC/B,KAAK,iBAAiB;AACpB,aAAO,QAAQ,OAAO;AAAA,QACpB,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,QACV,WAAW,OAAO;AAAA,MACpB,CAAC;AAAA,IACH,KAAK,iBAAiB;AACpB,aAAO,mBAAmB,OAAO,MAAM;AAAA,IACzC,KAAK,iBAAiB;AACpB,aAAO,gBAAgB,OAAO,MAAM;AAAA,IACtC,KAAK,iBAAiB;AACpB,aAAO,UAAU,OAAO,MAAM;AAAA,IAChC,KAAK,iBAAiB;AACpB,aAAO,UAAU,OAAO,MAAM;AAAA,IAChC;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,YAAY,CAAC,OAAqB,EAAE,MAAM,QAAQ,MAAuB;AAC7E,QAAM,SAAS,WAAW,OAAO,MAAM,IAAI;AAE3C,QAAM,cAAc,eAAAC,QAAM,aAAkB,QAAQ;AAAA,IAClD,QAAQ;AAAA,EACV,CAAC;AACD,SAAO,UAAU,OAAO,QAAQ,WAAW;AAC7C;AAEA,IAAM,UAAU,CACd,OACA,EAAE,MAAM,UAAU,UAAU,MACzB;AACH,QAAM,SAAS,WAAW,OAAO,MAAM,IAAI;AAC3C,QAAM,cAAc,eAAAA,QAAM,aAAa,QAAQ;AAAA,IAC7C,CAAC,QAAQ,GAAG;AAAA,EACd,CAAC;AACD,SAAO,UAAU,OAAO,QAAQ,WAAW;AAC7C;AAEA,IAAM,WAAW,CAAC,OAAqB,EAAE,MAAM,MAAM,MAAsB;AACzE,QAAM,SAAS,WAAW,OAAO,MAAM,IAAI;AAC3C,QAAM,cAAc,eAAAA,QAAM,aAAa,QAAQ,KAAK;AACpD,SAAO,UAAU,OAAO,QAAQ,WAAW;AAC7C;AAEA,IAAM,gBAAgB,CAAC,OAAqB,EAAE,MAAM,KAAK,MAAsB;AAC7E,MAAI,MAAM;AACR,UAAM,SAAS,WAAW,OAAO,MAAM,IAAI;AAC3C,WAAO,UAAU,OAAO,QAAQ,QAAQ,IAAI;AAAA,EAC9C,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,IAAM,WAAW,CACf,YACA,WACiB;AApHnB;AAqHE,QAAM;AAAA,IACJ,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,oBAAoB,WAAW;AACrC,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,wBACJ,gCAAK,aAAL,mBAAe,WAAU,OAAO,iBAAiB,MAAM;AACzD,QAAM,EAAE,IAAI,QAAQ,IAAI,SAAS,YAAY;AAC7C,QAAM,gBAAgB,iBAAiB,YAAY;AACnD,MAAI;AACJ,MAAI,qBAAqB;AACvB,UAAM,CAAC,WAAW,iBAAiB,IAAI;AAAA;AAAA,MAErC;AAAA,MACA;AAAA,IACF;AACA,QAAI,cAAc,QAAW;AAC3B,sBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,sBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,CAAC,mBAAiB,gCAAK,aAAL,mBAAe,SAAQ;AAClD,oBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,oBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,aAAa;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,CAAC,UAAuB,MAAM,OAAO,MAAM,MAAM,YAAY;AAAA,EAC/D;AACA,QAAM,YAAY,QAAQ,aAAa,MAAM;AAC7C,SAAO,YAAY,eAAe,EAAE,MAAM,WAAW,MAAM,SAAS,CAAC;AACvE;AAEA,IAAM,WAAW,CACf,YACA,EAAE,MAAM,eAAe,UAAU,MAC9B;AACH,SAAO;AAAA,IACL;AAAA,IACA,WAAW,YAAY,aAAa;AAAA,IACpC;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,CAC9B,YACA,YACA,iBACiB;AACjB,QAAM,EAAE,WAAW,KAAK,YAAY,SAAS,IAAI;AACjD,QAAM,oBAAoB;AAE1B,QAAM,wBAAwB,QAAQ,mBAAmB,MAAM;AAE/D,MAAI,0BAA0B,OAAO;AACnC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,eAAe,GAAG;AACtC,UAAM,oBAAoB,IAAI,SAAS,cAAc,UAAU;AAC/D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,KAAK,eAAe,GAAG;AACvC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,OAAO,eAAe,CAAW,GAAG;AAClD,WAAO,KAAK,YAAY,mBAAmB,cAAc,GAAG;AAAA,EAC9D;AAEA,QAAM,MAAM,uCAAuC,IAAI,QAAQ,EAAE;AACnE;AAEA,IAAM,eAAe,CAAC,KAAc,cAA4B;AAC9D,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO,UAAU,SAAS,KAAK,QAAQ,SAAS;AAAA,EAClD;AAEA,SAAO,IAAI,SAAS,eAChB,QAAQ,SAAS,IACjB,IAAI,SAAS,aACb,UAAU,SAAS,IACnB;AACN;AAEA,IAAM,UAAU,CAAC,cAA4B;AAC3C,SACE,OAAO,SAAS,MAAM,aACtB,UAAU,MAAM,MAAM,kBAAkB;AAE5C;AAEA,IAAM,YAAY,CAAC,cAA4B;AAC7C,SACE,OAAO,SAAS,MAAM,aACtB,UAAU,MAAM,MAAM,kBAAkB;AAE5C;;;AWzQA,IAAAC,iBAAsD;AAQtD,IAAM,qCAA6D,CAAC,WAClE,QAAQ;AAAA,EACN,YAAY,OAAO,IAAI;AACzB;AAYK,IAAM,4BAAwB,8BAA0C;AAAA,EAC7E,wBAAwB;AAAA,EACxB,SAAS;AACX,CAAC;;;AC1BD,IAAAC,iBAAoE;AAYpE,IAAM,kBAAkB,CAAC;AACzB,IAAM,aAA+B,CAAC,GAAG,CAAC;AAe1C,IAAM,iBAAiB,CACrBC,OACA,IACA,gBAC0C;AAC1C,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,UAAQ,QAAQ,WAAW;AAE3B,QAAM,MAAM,oCAAe,SAAS,cAAc,KAAK;AACvD,MAAI,KAAK;AAET,UAAQ,YAAY,GAAG;AACvB,WAAS,KAAK,YAAY,OAAO;AACjC,QAAM,UAAU,OAAOA,MAAK,GAAG,WAAWA,MAAK,IAAI,YAAYA,MAAK,KAAK,aAAaA,MAAK,MAAM;AACjG,SAAO,CAAC,SAAS,SAASA,MAAK,MAAMA,MAAK,GAAG;AAC/C;AAEA,IAAM,uBAAuB,CAC3B,mBACqB;AACrB,QAAM,EAAE,aAAa,IAAI;AACzB,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT,OAAO;AACL,UAAM,EAAE,MAAM,YAAY,KAAK,UAAU,IACvC,aAAa,sBAAsB;AACrC,WAAO,CAAC,YAAY,SAAS;AAAA,EAC/B;AACF;AAEO,IAAM,oBAAoB,CAC/B,eACA,UACA,qBACG;AACH,QAAM,oBAAgB,uBAA0B;AAChD,QAAM,uBAAmB,uBAAsB;AAC/C,QAAM,8BAA0B,uBAAoB;AAEpD,QAAM,iBAAa,4BAAY,CAAC,GAAG,MAAM;AACvC,QAAI,iBAAiB,WAAW,wBAAwB,SAAS;AAC/D,YAAM;AAAA,QACJ,aAAa,CAAC,SAAS,OAAO;AAAA,QAC9B;AAAA,MACF,IAAI,iBAAiB;AACrB,YAAM,OAAO,OAAO,MAAM,WAAW,IAAI,UAAU,eAAe;AAClE,YAAM,MAAM,OAAO,MAAM,WAAW,IAAI,UAAU,eAAe;AACjE,UAAI,SAAS,eAAe,QAAQ,QAAQ,eAAe,KAAK;AAC9D,yBAAiB,QAAQ,eAAe,OAAO;AAC/C,yBAAiB,QAAQ,eAAe,MAAM;AAC9C,gCAAwB,QAAQ,MAAM,MAAM,MAAM;AAClD,gCAAwB,QAAQ,MAAM,OAAO,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAA8B;AAAA,IAClC,CAAC,eAAe;AACd,UAAI,iBAAiB,SAAS;AAC5B,cAAM;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QACF,IAAI,iBAAiB;AAErB,YAAI,YAAY;AACd,mBAAS;AAAA,YACP,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,wBAAwB,SAAS;AACnC,cAAI,CAAC,cAAc,iBAAiB,yBAAyB;AAC3D,oBAAQ,IAAI,qBAAqB;AACjC,qBAAS,KAAK,YAAY,wBAAwB,OAAO;AAAA,UAC3D,WAAW,iBAAiB,0BAA0B;AACpD,qBAAS,KAAK,YAAY,wBAAwB,OAAO;AAAA,UAC3D,OAAO;AACL,oCAAwB,QAAQ,MAAM,UAAU;AAChD,mBAAO,wBAAwB,QAAQ,QAAQ;AAAA,UACjD;AAAA,QACF;AAEA,sBAAc,UAAU;AACxB,yBAAiB,UAAU;AAC3B,gCAAwB,UAAU;AAAA,MACpC;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,QAAoB;AACnB,UAAI,cAAc,SAAS;AACzB,cAAM;AAAA,UACJ,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF,IAAI,cAAc;AAClB,cAAM,EAAE,SAAS,WAAW,IAAI;AAChC,cAAM,UAAU,EAAE,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ;AACjD,cAAM,cAAc,gCAAa,WAAW,YAAY,MAAM,IAAI;AAClE,cAAM,EAAE,IAAI,cAAc,IAAI,YAAY;AAC1C,cAAM,gBAAgB,iBAAiB,WAAW;AAClD,YAAI,cAAc,IAChB,UAAU,IACV,gBAAgB;AAElB,YAAI,gBAAgB;AACpB,YAAI,eAAe;AACnB,YAAI,cAAgC;AAEpC,YAAI,UAAU,SAAS,eAAe,aAAa;AAEnD,YAAI,YAAY,MAAM;AACpB,WAAC,SAAS,SAAS,eAAe,YAAY,IAAI;AAAA,YAChD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,OAAO;AACL,wBAAc,qBAAqB,OAAO;AAC1C,gBAAM,CAAC,YAAY,SAAS,IAAI;AAChC,gBAAM,EAAE,OAAO,QAAQ,MAAM,IAAI,IAAI,QAAQ,sBAAsB;AACnE,0BAAgB,OAAO;AACvB,yBAAe,MAAM;AACrB,oBAAU,SAAS,KAAK,aAAa,MAAM,WAAW,aAAa,UAAU,YAAY;AACzF,kBAAQ,QAAQ,WAAW;AAC3B,wBAAc,QAAQ,MAAM;AAAA,QAC9B;AAEA,wBAAgB,UAAU;AAAA,UACxB,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA;AAAA;AAAA,QAEF;AAEA,gBAAQ,MAAM,UAAU,UAAU;AAClC,gCAAwB,UAAU;AAElC,yBAAiB,UAAU;AAAA,UACzB,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UAClB,gBAAgB,EAAE,MAAM,eAAe,KAAK,aAAa;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,YAAY,YAAY,aAAa;AAAA,EACxC;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,WAA4B;AAC3B,YAAM,EAAE,KAAK,GAAG,QAAQ,IAAI;AAC5B,oBAAc,UAAU;AAAA,QACtB,GAAG;AAAA,QACH,mBAAmB,YAAY,cAAc,SAAS,gBAAgB;AAAA,MACxE;AACA,gBAAU,gBAAgB,KAAK,iBAAiB,QAAQ,YAAY;AAAA,IACtE;AAAA,IACA,CAAC,iBAAiB,kBAAkB,aAAa;AAAA,EACnD;AAEA,SAAO;AACT;;;AdzIS,IAAAC,sBAAA;AA9CT,IAAM,iBAAiB,CAAC,UAAe,MAAM;AAC7C,IAAM,aAAa,CAAC,WAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,SAAS,OAAO,IAAI;AAExB,IAAM,wBAAwB,CAC5B,WACuB;AACvB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAEH,UAAI,OAAO,OAAO,aAAa;AAC7B,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,MAAM,uBAAuB;AAAA,EACvC;AACF;AAUO,IAAM,wBAAwB,MAAM;AACzC,QAAM,UAAU,yBAAyB;AACzC,SAAO,6CAAC,SAAK,sBAAY,OAAO,KAAI;AACtC;AAEO,IAAM,iBAAiB,CAAC,UAA6C;AAC1E,QAAM,EAAE,UAAU,gBAAgB,kBAAkB,QAAQ,eAAe,IACzE;AACF,QAAM,YAAQ,uBAAiC,MAAS;AACxD,QAAM,kBAAc,uBAAqB,QAAQ;AAEjD,QAAM,CAAC,EAAE,YAAY,QAAI,yBAAkB,IAAI;AAE/C,QAAM,qBAAiB;AAAA,IACrB,CAAC,QAAQ,uBAA2C;AAClD,UAAI,gBAAgB;AAClB,cAAM,kBACJ,WAAW,QAAQ,cAAc,KAAK,MAAM;AAC9C,cAAM,oBAAoB,OAAO,eAAe,MAAM;AACtD,cAAM,SAAS,oBACX,SAAS,eAAe,EAAE,SAAS,CAAC,IACpC;AACJ,cAAM,kBAAkB,aAAa,MAAM;AAC3C,uBAAe,iBAAiB,kBAAkB;AAAA,MACpD;AAAA,IACF;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,QAA6B,eAAe,UAAU;AACrD,YAAM,YAAY,cAAc,MAAM,SAAyB,MAAM;AACrE,UAAI,cAAc,MAAM,SAAS;AAC/B,cAAM,UAAU;AAChB,qBAAa,CAAC,CAAC;AACf,YAAI,CAAC,gBAAgB,WAAW,MAAM,GAAG;AACvC,yBAAe,WAAW,sBAAsB,MAAM,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,cAAc,cAAc;AAAA,EAC/B;AAEA,QAAM,6BAAyB;AAAA,IAC7B,CAAC,WAAW;AACV,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK,cAAc;AACjB,8BAAoB,MAAM;AAC1B;AAAA,QACF;AAAA,QACA,KAAK,QAAQ;AACX,yBAAe,MAAM,SAAS,sBAAsB,MAAM,CAAC;AAC3D;AAAA,QACF;AAAA,QACA,KAAK;AACH,cAAI,OAAO,UAAU,oBAAoB;AACvC,mBAAO,YAAY,OAAO,OAAO,OAAO,MAAM,MAAM,OAAO;AAAA,UAC7D;AACA;AAAA,QAEF,SAAS;AACP,+BAAqB,MAAM;AAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAEA,CAAC,sBAAsB,cAAc;AAAA,EACvC;AAEA,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,QAAI,QAAQ;AACV,YAAM,kBAAkB;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,MACF;AACA,UAAI,iBAAiB;AACnB,cAAM,SAAS,aAAa,eAAe;AAC3C,cAAM,YAAY;AAAA,UAChB;AAAA,UACA,GAAG,gBAAgB,MAAM,IAAI;AAAA,QAC/B;AACA,cAAM,SAAS,SACX;AAAA,UACE,MAAM,iBAAiB;AAAA,UACvB;AAAA,UACA,aAAa;AAAA,QACf,IACA;AAAA,UACE,MAAM,iBAAiB;AAAA,UACvB,MAAM,gBAAgB,MAAM;AAAA,UAC5B,WAAW;AAAA,QACb;AACJ,6BAAqB,QAAQ,IAAI;AAAA,MACnC,WAAW,OAAO,OAAO,QAAQ,MAAM,SAAS,IAAI,GAAG;AACrD,cAAM,YAAY,eAAe,QAAQ,GAAG;AAC5C,cAAM,SAAS;AAAA,UACb,MAAM,iBAAiB;AAAA,UACvB,QAAQ,MAAM;AAAA,UACd,aAAa;AAAA,QACf;AACA,6BAAqB,QAAQ,IAAI;AAAA,MACnC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,sBAAsB,MAAM,CAAC;AAEjC,MAAI,MAAM,YAAY,QAAW;AAC/B,UAAM,UAAU,qBAAqB,QAAQ;AAAA,EAC/C,WAAW,aAAa,YAAY,SAAS;AAC3C,UAAM,UAAU,qBAAqB,UAAU,MAAM,OAAO;AAC5D,gBAAY,UAAU;AAAA,EACxB;AAEA,SACE;AAAA,IAAC,sBAAsB;AAAA,IAAtB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA,wBAAwB;AAAA,QACxB,SAAS;AAAA,MACX;AAAA,MAEC,gBAAM;AAAA;AAAA,EACT;AAEJ;AAEO,IAAM,4BAA4B,MAAM;AAC7C,QAAM,EAAE,uBAAuB,QAAI,2BAAW,qBAAqB;AACnE,SAAO;AACT;AAEO,IAAM,0BAA0B,MAAM;AAC3C,QAAM,EAAE,eAAe,QAAI,2BAAW,qBAAqB;AAC3D,SAAO;AACT;AAEO,IAAM,2BAA2B,MAAM;AAC5C,QAAM,EAAE,QAAQ,QAAI,2BAAW,qBAAqB;AACpD,SAAO;AACT;;;ADrMO,IAAM,0BAA0B,CACrC,IACA,MACA,UACA,gBAC+C;AA3BjD;AA4BE,QAAM,EAAE,kBAAkB,mBAAmB,YAAY,iBAAiB,IACxE,mBAAmB;AAErB,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,KACxC,sBAAiB,IAAI,eAAe,MAApC,YAAyC,CAAC;AAAA,EAC5C;AACA,QAAM,uBAAuB,0BAA0B;AACvD,QAAM,0BAAsB;AAAA,IAC1B,CAAC,UAAgC,YAA0B;AACzD,YAAM,uBAAuB,cAAc,OAAO;AAAA,QAChD,EAAE,UAAU,QAAQ;AAAA,MACtB,CAAC;AACD,uBAAiB,IAAI,iBAAiB,oBAAoB;AAC1D,uBAAiB,oBAAoB;AAAA,IACvC;AAAA,IACA,CAAC,eAAe,IAAI,gBAAgB;AAAA,EACtC;AAEA,QAAM,yBAAqB,4BAAY,MAAM;AAC3C,sBAAkB,IAAI,eAAe;AACrC,qBAAiB,CAAC,CAAC;AAAA,EACrB,GAAG,CAAC,IAAI,iBAAiB,CAAC;AAE1B,QAAM,mBAAe,4BAAY,MAAM;AACrC,UAAM,KAAK,iBAAiB,IAAI,aAAa;AAC7C,QAAI,IAAI;AACN,SAAG,YAAY;AAAA,IACjB;AACA,sBAAkB,EAAE;AACpB,eAAW,EAAE;AACb,yBAAqB,EAAE,MAAM,UAAU,MAAM,SAAS,CAAC;AAAA,EACzD,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,sBAAkB;AAAA,IACtB,OAAO,KAAK,OAAO,oBAAsC;AArE7D,UAAAC;AAsEM,UAAI,gBAAgB;AACpB,YAAM,YAAWA,MAAA,KAAK,YAAL,gBAAAA,IAAc;AAC/B,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,6BAAqB;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA,MAAM,UAAU,SAAY,WAAW,GAAG,QAAQ,IAAI,KAAK;AAAA,UAC3D;AAAA,UACA;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,QACnB,CAAoB;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM,sBAAsB,UAAU,WAAW;AAAA,EACpD;AAEA,QAAM,qBAAiB;AAAA,IACrB,OACE,QACA,QAC2C;AA5FjD,UAAAA;AA6FM,YAAM,EAAE,KAAK,IAAI;AACjB,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,qBAAqB,EAAE,MAAM,OAAMA,MAAA,OAAO,SAAP,OAAAA,MAAe,SAAS,CAAC;AAAA,QACrE,KAAK;AACH,iBAAO,aAAa;AAAA,QACtB,KAAK;AACH,iBAAO,gBAAgB,KAAK,OAAO,OAAO,OAAO,eAAe;AAAA,QAClE,KAAK;AACH,iBAAO,oBAAoB,OAAO,UAAU,OAAO,OAAO;AAAA,QAC5D,KAAK;AACH,iBAAO,mBAAmB;AAAA,QAC5B,KAAK;AACH,iBAAO,qBAAqB;AAAA,YAC1B;AAAA,YACA,MAAM,OAAO;AAAA,YACb,OAAO,OAAO;AAAA,UAChB,CAAC;AACD;AAAA,QACF,SAAS;AACP,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,gBAAgB,aAAa;AACvC;;;AgBlIA,IAAAC,oBAAsB;AACtB,IAAAC,eAA2B;AAC3B,IAAAC,eAAe;AACf,IAAAC,iBAQO;;;ACXP,6BAA8B;AAC9B,IAAAC,eAAuB;AACvB,IAAAC,eAAqD;AACrD,IAAAC,iBAQO;AAsGD,IAAAC,sBAAA;AAvFN,IAAMC,aAAY;AAEX,IAAM,SAAS,CAAC;AAAA,EACrB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,kBAAkB;AAAA,EAC/B;AAAA,EACA,QAAQ;AACV,MAAmB;AACjB,QAAM,oBAAgB,uBAAuB,IAAI;AACjD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiB,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAkB,KAAK;AAErD,QAAM,eAAe,gBAAgB;AACrC,QAAM,cAAc,CAAC,QACnB,6CAAe,EAAE,MAAM,SAAS,GAAG;AAErC,QAAM,uBAAuB,MAAM;AA9CrC;AA+CI,wBAAc,YAAd,mBAAuB;AAAA,EACzB;AAEA,QAAM,wBAAwB,CAAC,QAAoB;AAEjD,QAAI,gBAAgB;AAAA,EACtB;AAEA,QAAM,cAAc,aAAa;AAEjC,QAAM,gBAAY,aAAAC;AAAA,IAChBD;AAAA,IACA;AAAA,IACA,GAAGA,UAAS,IAAI,WAAW;AAAA,EAC7B;AAEA,QAAM,sBAAsB,MAAM;AAChC,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,qBAAqB,CAAC,QAAuC;AACjE,QAAI,IAAI,QAAQ,SAAS;AACvB,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,qBAAqB,CACzB,gBAAgB,IAChB,aAAa,IACb,oBAAoB,MACpB,gBAAgB,UACb;AA9EP;AA+EI,eAAW,KAAK;AAChB,QAAI,eAAe;AACjB,eAAS,aAAa;AAAA,IACxB,WAAW,eAAe,eAAe;AACvC,eAAS,UAAU;AACnB,iDAAc;AAAA,IAChB;AACA,QAAI,sBAAsB,OAAO;AAC/B,0BAAc,YAAd,mBAAuB;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,MAAkB;AACzC,iDAAe,EAAE,MAAM,YAAY,GAAG;AAAA,EACxC;AAEA,QAAM,eAA+B,CAAC;AACtC,QAAM,4BAA4C,CAAC;AACnD,QAAM,gBAAgC,CAAC;AAEvC,iDAAe,QAAQ,CAAC,cAAc,MAAM;AAC1C,YAAQ,aAAa,UAAU;AAAA,MAC7B,KAAK;AACH,qBAAa,SAAK,6BAAa,aAAa,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAChE;AAAA,MACF;AACE,kCAA0B;AAAA,cACxB,6BAAa,aAAa,SAAS,EAAE,KAAK,EAAE,CAAC;AAAA,QAC/C;AAAA,IACJ;AAAA,EACF;AAEA,WACE,aAAa;AAAA,IACX;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAGA,UAAS;AAAA,QACvB;AAAA,QAEA;AAAA,QACA,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,KAAK;AAAA,QACL,UAAU;AAAA;AAAA,MARN;AAAA,IASN;AAAA,EACF;AAEF,eACE,cAAc;AAAA,IACZ;AAAA,MAAC;AAAA;AAAA,QACC,aAAU;AAAA,QAEV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAQ;AAAA;AAAA,MAHJ;AAAA,IAIN;AAAA,EACF;AAEF,4BAA0B,SAAS,KACjC,aAAa;AAAA,IACX,6CAAC,SAAI,WAAU,oBAAmB,cAAW,OAC1C,uCADoD,eAEvD;AAAA,EACF;AAEF,gBAAc,SAAS,KACrB,aAAa;AAAA,IACX,6CAAC,SAAI,WAAU,oBAAmB,cAAW,OAC1C,2BADoD,SAEvD;AAAA,EACF;AAEF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,aAAAE,SAAG,mBAAmB,SAAS;AAAA,MAC1C;AAAA,MACA,aAAa;AAAA,MAEZ;AAAA;AAAA,EAuDH;AAEJ;;;ACxNA,IAAAC,iBAAgD;AAazC,IAAM,UAAU,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,MAAqB;AACnB,QAAM,iBAAiB,0BAA0B;AAEjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,mBAAmB;AAEvB,QAAM,CAAC,oBAAoB,aAAa,IAAI;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,YAAQ;AAAA,IACZ,MAAG;AAtCP;AAsCU,6BAAU,YAAY,MAAtB,YAA2B;AAAA;AAAA,IACjC,CAAC,WAAW,SAAS;AAAA,EACvB;AAEA,QAAM,kBAAc;AAAA,IAClB,CAACC,WAAkB;AACjB,UAAI,MAAM;AACR,uBAAe,EAAE,MAAM,aAAa,MAAM,OAAAA,OAAM,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,IAAI;AAAA,EACvB;AAEA,QAAM,oBAAgB,wBAAQ,MAAM,UAAU,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;AAElE,QAAM,WAAO;AAAA,IACX,CAAC,QAAiB,UAAU,IAAI,GAAG;AAAA,IACnC,CAAC,IAAI,SAAS;AAAA,EAChB;AAEA,QAAM,YAAQ;AAAA,IACZ,CAAC,QAAQ;AACP,iBAAW,IAAI,GAAG;AAClB,qBAAe,EAAE,MAAM,OAAO,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,IAAI,gBAAgB,UAAU;AAAA,EACjC;AAEA,QAAM,WAAO;AAAA,IACX,CAAC,OAAO,QAAQ;AACd,gBAAU,IAAI,KAAK,KAAK;AACxB,qBAAe,EAAE,MAAM,OAAO,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,IAAI,gBAAgB,SAAS;AAAA,EAChC;AACA,QAAM,kBAAc;AAAA,IAClB,CAAC,QAAiB,iBAAiB,IAAI,GAAG;AAAA,IAC1C,CAAC,IAAI,gBAAgB;AAAA,EACvB;AACA,QAAM,kBAAc;AAAA,IAClB,CAAC,OAAO,QAAQ,iBAAiB,IAAI,KAAK,KAAK;AAAA,IAC/C,CAAC,IAAI,gBAAgB;AAAA,EACvB;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,EAAE,MAAM,KAAK,GAAG,OAAO,MAAM;AAC5B,YAAM,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI;AACxB,WAAK,MAAM,GAAG;AAAA,IAChB;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvGA,IAAAC,iBAAoE;;;ACCpE,IAAAC,iBAAgE;AACzD,IAAM,cAAc,CAAC,UAAU,OAAO;AACtC,IAAM,aAAa,CAAC,QAAQ;AAC5B,IAAM,YAAY,CAAC,OAAO;AAgBjC,IAAM,cAAc,oBAAI,QAAsC;AAE9D,IAAM,gBAAgB,CACpB,SACA,aACAC,eACW;AACX,UAAQA,YAAW;AAAA,IACjB,KAAK;AACH,aAAO,YAAY;AAAA,IACrB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO,YAAY;AAAA,IACrB;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,iBAAiB,IAAI;AAAA,EAChC,CAAC,YAAmC;AAClC,eAAW,SAAS,SAAS;AAC3B,YAAM,EAAE,QAAQ,YAAY,IAAI;AAChC,YAAM,iBAAiB,YAAY,IAAI,MAAqB;AAC5D,UAAI,gBAAgB;AAClB,cAAM,EAAE,UAAU,aAAa,IAAI;AACnC,YAAI,cAAc;AAClB,mBAAW,CAACA,YAAW,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC5D,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,YACAA;AAAA,UACF;AACA,cAAI,YAAY,MAAM;AACpB,0BAAc;AACd,yBAAaA,UAA8B,IAAI;AAAA,UACjD;AAAA,QACF;AACA,YAAI,aAAa;AACf,sBAAY,SAAS,YAAY;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,kBACd,KACA,YACA,UACA,oBAAoB,OACd;AACN,QAAM,oBAAgB,uBAAO,UAAU;AACvC,QAAM,cAAU,4BAAY,CAAC,WAA8C;AACzE,UAAMC,QAAO,OAAO,sBAAsB;AAC1C,WAAO,cAAc,QAAQ;AAAA,MAC3B,CAAC,KAAgC,QAAQ;AACvC,YAAI,GAAG,IAAI,cAAc,QAAQA,OAAM,GAAwB;AAC/D,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AAUL,sCAAgB,MAAM;AACpB,UAAM,SAAS,IAAI;AACnB,QAAI,YAAY;AAEhB,mBAAe,mBAAmB;AAGhC,kBAAY,IAAI,QAAQ,EAAE,cAAc,CAAC,EAA0B,CAAC;AACpE,kBAAY;AAEZ,YAAM,EAAE,MAAM,IAAI;AAClB,UAAI,OAAO;AAET,cAAM,MAAM;AAAA,MACd;AACA,UAAI,CAAC,WAAW;AACd,cAAM,iBAAiB,YAAY,IAAI,MAAM;AAC7C,YAAI,gBAAgB;AAClB,gBAAM,eAAe,QAAQ,MAAM;AACnC,yBAAe,eAAe;AAC9B,yBAAe,QAAQ,MAAM;AAC7B,cAAI,mBAAmB;AACrB,qBAAS,YAAY;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ;AAEV,UAAI,YAAY,IAAI,MAAM,GAAG;AAC3B,cAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA,WAAK,iBAAiB;AAAA,IACxB;AACA,WAAO,MAAM;AACX,UAAI,UAAU,YAAY,IAAI,MAAM,GAAG;AACrC,uBAAe,UAAU,MAAM;AAC/B,oBAAY,OAAO,MAAM;AACzB,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,SAAS,mBAAmB,QAAQ,CAAC;AAE9C,sCAAgB,MAAM;AACpB,UAAM,SAAS,IAAI;AACnB,UAAM,SAAS,YAAY,IAAI,MAAM;AACrC,QAAI,QAAQ;AACV,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,cAAM,eAAe,QAAQ,MAAM;AACnC,eAAO,eAAe;AAAA,MACxB;AAEA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,KAAK,QAAQ,CAAC;AAIzC;;;AC1JA,SAAS,iBACP,WACA,oBACA;AAEA,QAAM,YAAY,SAAS,KAAK,cAAc,IAAI,SAAS,EAAE;AAC7D,QAAM,UAAU;AAAA,IACd,KAAK,SAAU,OAA4B,UAAkB;AAC3D,YAAM,MAAM,MAAM;AAAA;AAAA,QAEhB,KAAK,SAAS,eAAe,QAAQ;AAAA,MACvC;AACA,aAAO,MAAM,SAAS,GAAG,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,YACH,IAAI,MAAM,iBAAiB,SAAS,GAAG,OAAO,IAC9C,kDAAsB,CAAC;AAC7B;AAEA,IAAM,uBAAuB,CAC3B,CAAC,EAAE,EAAE,GACL,CAAC,EAAE,EAAE,MACF,KAAK;AAKH,IAAM,iBAAiB,CAC5B,gBAEA,OAAO,QAAQ,WAAW,EACvB,KAAK,oBAAoB,EACzB,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,GAAG,QAAQ;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI;AACvC,CAAC;AAEL,IAAI,sBAA+C;AAEnD,IAAM,kBAAkB,CAAC,YAAY,WAAW;AAG9C,QAAM,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,iBAAiB,SAAS;AACzD,SAAO,eAAe,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAC9C;AAGO,IAAM,iBAAiB,CAAC,cAAuB;AACpD,MAAI,wBAAwB,MAAM;AAChC,0BAAsB,gBAAgB,SAAS;AAAA,EACjD;AACA,SAAO;AACT;;;AFpDA,IAAMC,eAA4B,CAAC;AAQ5B,IAAM,iBAAiB,CAC5B,EAAE,aAAa,iBAAiB,YAAY,GAC5C,QACG;AACH,QAAM,CAAC,iBAAiB,kBAAkB,QAAI;AAAA,IAC5C,cAAc,QAAQ;AAAA,EACxB;AACA,QAAM,cAAU,uBAAO,SAAS,IAAI;AACpC,QAAM,qBAAiB;AAAA,IACrB,kBAAkB,eAAe,eAAe,IAAI,eAAuB;AAAA,EAC7E;AAGA,QAAM,cAAU,uBAAO,IAAI;AAE3B,QAAM,uBAAmB;AAAA,IACvB,CAAC,MAAM;AACL,UAAI,eAAe,SAAS;AAC1B,mBAAW,CAAC,MAAM,IAAI,KAAK,eAAe,SAAS;AACjD,cAAI,KAAK,MAAM;AACb,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,kCAA8B;AAAA,IAClC,CAAC,UAAU;AACT,UAAI,aAAa;AACf,cAAM,iBAAiB,eAAe,QAAQ;AAAA,UAC5C,CAAC,CAAC,IAAI,MAAsB,SAAS;AAAA,QACvC;AACA,YAAI,gBAAgB;AAClB,gBAAM,CAAC,EAAE,EAAE,QAAQ,IAAI;AACvB,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF,OAAO;AACL,eAAO,iBAAiB,KAAK;AAAA,MAC/B;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa,gBAAgB;AAAA,EAChC;AAGA;AAAA,IACE,OAAO;AAAA,IACP,eAAe,UAAU,CAAC,OAAO,IAAIA;AAAA,IACrC,CAAC,EAAE,OAAO,cAAc,MAA0B;AAChD,YAAM,SAAS,4BAA4B,aAAa;AACxD,UAAI,WAAW,QAAQ,SAAS;AAC9B,gBAAQ,UAAU;AAClB,2BAAmB,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,SAAS;AAClB,YAAM,WAAW,QAAQ;AACzB,UAAI,eAAe,SAAS;AAK1B,cAAM,EAAE,YAAY,IAAI,OAAO;AAC/B,cAAM,SAAS,4BAA4B,WAAW;AACtD,gBAAQ,UAAU;AAElB,YAAI,WAAW,UAAU;AACvB,6BAAmB,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,oBAAoB,6BAA6B,GAAG,CAAC;AAGzD,SAAO;AACT;;;AGpGA,IAAM,cAAc;AAEpB,IAAM,uBAAmD;AAAA,EACvD,CAAC,WAAW,GAAG;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AAClB;AAEO,IAAM,wBAAwB,CAAC,aAA2B;AARjE;AASE,oCAAqB,QAAQ,MAA7B,YAAkC;AAAA;AAEpC,IAAM,gBAAgB,CAAC,aAAqB,aAAa;AAEzD,IAAM,oBAA+C;AAAA,EACnD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AACR;AAEA,IAAM,mBAAmB,CAAC,UAAe;AAnBzC;AAmB4C,iCAAkB,KAAK,MAAvB,YAA4B;AAAA;AAGjE,IAAM,yBAAyB,CAAC,UAAiB;AACtD,SAAO,OAAO,KAAK,KAAK,EAAE;AAAA,IACxB,CAAC,QAAQ,aAAa;AACpB,YAAM,CAAC,cAAc,IAAI,IAAI;AAC7B,UAAI,sBAAsB,QAAQ,GAAG;AACnC,cAAM,QAAQ,cAAc,QAAQ,IAAI,iBAAiB,MAAM,QAAQ,CAAC,IAAI,MAAM,QAAQ;AAE1F,qBAAa,QAAQ,IAAI;AACzB,aAAK,QAAQ,IAAI;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,EACT;AACF;;;ACnCA,IAAAC,iBAA+C;AAE/C,IAAM,iBAA2B,CAAC;AAa3B,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,SAAS;AAAA,EACT;AACF,MAA2B;AACzB,QAAM,cAAc,WAAW;AAE/B,QAAM,eAAW,uBAAa,CAAC,CAAC;AAChC,QAAM,mBAAe,uBAAe;AAEpC,QAAM,kBAAc,4BAAY,MAAM;AACpC,QAAI,QAAQ,SAAS;AACnB,cAAQ,QAAQ,MAAM,SAAS,SAAS,QAAQ,SAAS;AACzD,cAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,IACzD;AACA,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,eAAW;AAAA,IACf,CAAC,EAAE,QAAQ,MAAM,MAAM;AACrB,eAAS,QAAQ,SAAS;AAC1B,eAAS,QAAQ,QAAQ;AACzB,UAAI,aAAa,YAAY,MAAM;AACjC,qBAAa,aAAa,OAAO;AAAA,MACnC;AACA,mBAAa,UAAU,OAAO,WAAW,aAAa,EAAE;AAAA,IAC1D;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA;AAAA,IACE;AAAA,IACA,cAAc,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;;;ACpDA,IAAAC,iBAAkD;AAiClD,IAAM,aAAa,EAAE,UAAU,KAAK;AAC7B,IAAM,cAAc,eAAAC,QAAM,cAA8B,UAAU;AAElE,IAAM,kBAAkB,MAAM;AApCrC;AAqCE,QAAM,cAAU,2BAAW,WAAW;AACtC,UAAO,wCAAS,aAAT,YAAqB;AAC9B;AAEO,IAAM,iBAAiB,UAAM,2BAAW,WAAW;;;AR6GpD,IAAAC,sBAAA;AAjIN,IAAMC,aAAY;AAIlB,IAAMC,YAAW,CAAC,OAAe,UAAkB;AACjD,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAAO,WAAO,SAAS;AACzB;AAMA,IAAM,WAAO,2BAAW,SAASC,MAC/B,OACA,cACA;AACA,QAAM;AAAA,IACJ,QAAAC,UAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,OAAO;AAAA,IACP,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,SAAK,yBAAM,MAAM;AACvB,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,CAAC,gBAAgB,kBAAkB,QAAI,yBAAgB;AAC7D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAED,gBAAc,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAE1C,QAAM,wBAAoB,4BAAY,CAACC,WAAkB;AACvD,uBAAmBA,MAAK;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM;AACvB,QAAI,eAAAC,QAAM,eAAe,QAAQ,MAAM,iBAAiB,iBAAiB;AACvE,aAAO,eAAAA,QAAM;AAAA,QACX;AAAA,QACAJ,UAAS,eAAe,cAAc;AAAA,MACxC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,uBAAmC;AAAA,IACvC,OAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,WAAW,WAAW,SAAS,CAAC;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,aAAAK,SAAGN,YAAW,WAAW;AAAA,QAClC,CAAC,GAAGA,UAAS,YAAY,GAAG;AAAA,QAC5B,CAAC,GAAGA,UAAS,WAAW,GAAG;AAAA,QAC3B,CAAC,GAAGA,UAAS,eAAe,GAAG,WAAW;AAAA,MAC5C,CAAC;AAAA,MACD,mBAAiB;AAAA,MACjB;AAAA,MACA,SAAK,yBAAW,cAAc,OAAO;AAAA,MACrC;AAAA,MACA,UAAU;AAAA,MAEV,wDAAC,YAAY,UAAZ,EAAqB,OAAO,kBAC1B;AAAA,iBACC;AAAA,UAACG;AAAA,UAAA;AAAA,YACE,GAAG;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF,IACE;AAAA,QACJ,6CAAC,SAAI,WAAW,GAAGH,UAAS,SAAS,KAAK,SACvC,qBAAW,GACd;AAAA,SACF;AAAA;AAAA,EACF;AAEJ,CAAC;AACD,KAAK,cAAc;AAWnB,IAAM,WAAW,eAAAK,QAAM,KAAK,IAAI;AAEhC,SAAS,cAAc;AAEvB,kBAAkB,QAAQ,UAAU,MAAM;;;AjBjJlC,IAAAE,uBAAA;AAnCR,IAAMC,aAAY;AAMX,IAAM,mBAAmB,CAAC,mBAA0C;AACzE,QAAM,EAAE,UAAU,KAAK,IAAI,eAAe;AAC1C,QAAM,CAAC,cAAc,eAAe,QAAI,yBAEtC;AAEF,8BAAQ,MAAM;AACZ,yCAAW;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACT,GAAG,KAAK,CAAC,aAAa;AACpB,WAAK,qCAA2B,uBAAsB,aAAa;AACjE,wBAAgB,SAAS;AAAA,MAC3B,OAAO;AACL,wBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,iBAAiB;AAE1C,SACE,+CAAC,SAAK,GAAG,gBAAgB,WAAWA,YACjC;AAAA,uBACC,gFACE;AAAA,oDAAC,YAAO,WAAW,GAAGA,UAAS,UAAU,qCAEzC;AAAA,MACA,8CAAC,SAAI,WAAW,GAAGA,UAAS,SAAS,+FAGrC;AAAA,OACF,IACE;AAAA,IACJ;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAGA,UAAS;AAAA,QACvB,aAAU;AAAA,QACV,SAAQ;AAAA;AAAA,IACV;AAAA,KACF;AAEJ;;;ADpCS,IAAAC,uBAAA;AAfT,IAAMC,aAAY;AAclB,IAAM,kBAAkB,CAAC,EAAE,gBAAgB,KAAK,MAAwB;AACtE,SAAO,+EAAG,0BAAgB,8CAAC,oBAAiB,IAAK,MAAK;AACxD;AAEO,IAAM,cAAc,CAAC;AAAA,EAC1B,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,MAAwB;AACtB,QAAM,gBAAY,aAAAC,SAAGD,YAAW,aAAa;AAE7C,SACE,8CAAC,YAAM,GAAG,WAAW,WAAsB,oBAAgB,MAAC,YAAU,MACpE,wDAAC,mBAAgB,eAA8B,GACjD;AAEJ;AAEA,YAAY,cAAc;AAC1B,kBAAkB,eAAe,WAAW;;;A2BxC5C,IAAAE,eAAe;AACf,IAAAC,iBAMO;AAiID,IAAAC,uBAAA;AA7HN,IAAMC,aAAY;AAgBX,IAAM,WAAW,eAAAC,QAAM,KAAK,SAASC,UAAS;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,kBAAc,uBAAgB;AACpC,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,cAAU,uBAAe,CAAC;AAEhC,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAE1C,QAAM,wBAAoB;AAAA,IACxB,CAAC,EAAE,KAAK,SAAS,MAAM;AACrB,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,UAAU,QAAQ,aAAa;AACjC,eAAO,OAAO,QAAQ;AAAA,MACxB,WAAW,UAAU,QAAQ,WAAW;AACtC,eAAO,OAAO,CAAC,QAAQ;AAAA,MACzB,WAAW,CAAC,UAAU,QAAQ,aAAa;AACzC,eAAO,OAAO,CAAC,QAAQ;AAAA,MACzB,WAAW,CAAC,UAAU,QAAQ,cAAc;AAC1C,eAAO,OAAO,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,OAAO,MAAM;AAAA,EACxB;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CAAC,QAAQ;AACP,YAAM,EAAE,IAAI,IAAI;AAChB,YAAM,iBAAiB,QAAQ,eAAe,QAAQ;AACtD,YAAM,eAAe,QAAQ,aAAa,QAAQ;AAClD,UAAK,UAAU,gBAAkB,CAAC,UAAU,gBAAiB;AAC3D,oBAAY,KAAK;AACjB,0BAAkB,GAAG;AACrB,0BAAkB,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,mBAAmB,OAAO,WAAW;AAAA,EAChD;AAEA,QAAM,wBAAoB,uBAAO,qBAAqB;AACtD,QAAM,gBAAgB,CAAC,QAAuB,kBAAkB,QAAQ,GAAG;AAE3E,QAAM,sBAAkB;AAAA,IACtB,CAAC,MAAM;AACL,kBAAY,UAAU;AACtB,YAAM,MAAM,EAAE,SAAS,YAAY,SAAS;AAC5C,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,OAAO,QAAQ,QAAQ,SAAS;AAClC,eAAO,OAAO,IAAI;AAAA,MACpB;AACA,cAAQ,UAAU;AAAA,IACpB;AAAA,IACA,CAAC,QAAQ,OAAO,MAAM;AAAA,EACxB;AAEA,QAAM,oBAAgB,4BAAY,MAAM;AAvF1C;AAwFI,WAAO,oBAAoB,aAAa,iBAAiB,KAAK;AAC9D,WAAO,oBAAoB,WAAW,eAAe,KAAK;AAC1D,IAAAA,WAAU;AACV,cAAU,KAAK;AACf,kBAAQ,YAAR,mBAAiB;AAAA,EACnB,GAAG,CAAC,iBAAiBA,YAAW,SAAS,CAAC;AAE1C,QAAM,sBAAkB;AAAA,IACtB,CAAC,MAAM;AACL,cAAQ,UAAU,SAAS,EAAE,UAAU,EAAE;AACzC,kBAAY,KAAK;AACjB,aAAO,iBAAiB,aAAa,iBAAiB,KAAK;AAC3D,aAAO,iBAAiB,WAAW,eAAe,KAAK;AACvD,QAAE,eAAe;AACjB,gBAAU,IAAI;AAAA,IAChB;AAAA,IACA,CAAC,QAAQ,iBAAiB,eAAe,OAAO,aAAa,SAAS;AAAA,EACxE;AAEA,QAAM,cAAc,MAAM;AA3G5B;AA4GI,QAAI,YAAY,SAAS;AACvB,kBAAY,UAAU;AAAA,IACxB,OAAO;AACL,oBAAQ,YAAR,mBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,sBAAkB,UAAU;AAAA,EAC9B;AAEA,QAAM,gBAAY,aAAAC,SAAGJ,YAAW;AAAA,IAC9B,CAAC,GAAGA,UAAS,SAAS,GAAG;AAAA,IACzB,CAAC,GAAGA,UAAS,SAAS,GAAG;AAAA,EAC3B,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,iBAAa;AAAA,MACb,KAAK;AAAA,MACL,MAAK;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,MACX,aAAa;AAAA,MACb,UAAU;AAAA,MAEV,wDAAC,SAAI,WAAW,GAAGA,UAAS,cAAc;AAAA;AAAA,EAC5C;AAEJ,CAAC;;;ACnID,IAAM,oBAGF,CAAC;AAEE,IAAM,WAAW;AACjB,IAAM,cAAc;AAE3B,IAAM,uBAAuB,CAAC,SAC5B,OAAO,KAAK,kBAAkB;AAEhC,IAAM,sBAAsB,CAC1BK,cACA,cACG;AACH,QAAM,SAAgD,CAAC;AACvD,EAAAA,aAAY,QAAQ,CAAC,eAAe;AAClC,WAAO,UAAU,IAAI,QAAQ,WAAW,UAAU;AAAA,EACpD,CAAC;AACD,SAAO;AACT;AAEO,IAAM,kBAAkB,CAC7B,UACAC,YACAD,iBACG;AACH,SAAO,SAAS,IAAI,CAAC,OAAO,UAAU;AAnCxC;AAoCI,UAAM,aAAa,QAAQ,OAAO,YAAY;AAC9C,UAAM,EAAE,CAACC,UAAS,GAAG,cAAc,KACjC,sBAAiB,KAAK,MAAtB,YAA2B;AAC7B,UAAM,WAAW,sBAAsB,KAAK;AAC5C,QAAID,cAAa;AACf,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,oBAAoBA,cAAa,KAAK;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,aAAO,EAAE,OAAO,UAAU,eAAe,WAAW;AAAA,IACtD;AAAA,EACF,CAAC;AACH;AAKO,IAAM,sCAAsC,CACjD,cACG;AACH,QAAM,QAAQ,UAAU;AACxB,QAAM,eAAe,UAAU,MAAM,oBAAoB;AACzD,QAAM,oBAAoB,MAAM,KAAK,EAAE,KAAK,CAAC;AAC7C,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,sBAAkB,CAAC,IAAI;AACvB,sBAAkB,QAAQ,CAAC,IAAI;AAAA,EACjC;AACA,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT,OAAO;AAIL,aAAS,IAAI,GAAG,kBAAkB,GAAG,IAAI,QAAQ,GAAG,KAAK;AACvD,UAAI,UAAU,CAAC,EAAE,cAAc,CAAC,iBAAiB;AAC/C,0BAAkB;AAAA,MACpB;AACA,wBAAkB,CAAC,KAAK;AAAA,IAC1B;AAGA,aAAS,IAAI,QAAQ,GAAG,IAAI,GAAG,KAAK;AAClC,UAAI,kBAAkB,CAAC,IAAI,UAAU;AACnC,0BAAkB,CAAC,KAAK;AAAA,MAC1B;AACA,UAAI,UAAU,CAAC,EAAE,YAAY;AAC3B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,wBAAwB,CACnC,aACA,QACG;AACH,QAAM,OAAO,wBAAwB,aAAa,GAAG;AACrD,QAAM,OAAO,yBAAyB,aAAa,GAAG;AACtD,QAAM,eAAe,SAAS,MAAM,SAAS,KAAK,CAAC,MAAM,IAAI,IAAI;AACjE,QAAM,aAAa,yBAAyB,aAAa,YAAY;AACrE,SAAO,CAAC,cAAc,UAAU;AAClC;AAEA,SAAS,yBACP,aACA,cACA;AACA,MAAI,cAAc;AAChB,UAAM,aAAa,CAAC;AACpB,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,UAAI,YAAY,CAAC,EAAE,YAAY,CAAC,aAAa,SAAS,CAAC,GAAG;AACxD,mBAAW,KAAK,CAAC;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,wBAAwB,aAA4B,KAAa;AACxE,MAAI,MAAM,KACR,aAAa;AACf,SAAO,OAAO,KAAK,CAAC,YAAY;AAC9B,UAAM,MAAM;AACZ,iBAAa,aAAa,aAAa,GAAG;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,aAA4B,KAAa;AACzE,MAAI,MAAM,KACR,aAAa;AACf,QAAM,QAAQ,YAAY;AAC1B,SAAO,MAAM,QAAQ,KAAK,CAAC,YAAY;AACrC,UAAM,MAAM;AACZ,iBAAa,aAAa,aAAa,GAAG;AAAA,EAC5C;AACA,SAAO,QAAQ,QAAQ,KAAK;AAC9B;AAEA,SAAS,aAAa,aAA4B,KAAsB;AACtE,QAAM,EAAE,aAAa,UAAU,YAAY,cAAc,IAAI,YAAY,GAAG;AAC5E,SAAO,QAAQ,CAAC,YAAY,CAAC,kBAAkB,eAAe,WAAW;AAC3E;;;A7BrHA,IAAM,sBAAsB,CAAC,SAC3B,CAAC,KAAK,YAAY,CAAC,KAAK;AAEnB,IAAM,sBAAsB,CAAC;AAAA,EAClC,UAAU;AAAA,EACV;AAAA,EACA;AACF,MAA6C;AAC3C,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,cAAU,uBAAsB;AACtC,QAAM,iBAAa,uBAAuB;AAC1C,QAAM,mBAAe,uBAAO,CAAC,CAAC;AAC9B,QAAM,CAAC,EAAE,WAAW,QAAI,yBAAS,CAAC,CAAC;AAEnC,QAAM,aAAa,CAAC,YAA4B;AAC9C,eAAW,UAAU;AACrB,gBAAY,CAAC,CAAC;AAAA,EAChB;AAEA,QAAM,YAAW,+BAAO,mBAAkB;AAC1C,QAAME,aAAY,WAAW,WAAW;AACxC,QAAM,eAAW;AAAA,IACf,MACE,MAAM,QAAQ,YAAY,IACtB,eACA,eAAAC,QAAM,eAAe,YAAY,IACjC,CAAC,YAAY,IACb,CAAC;AAAA,IACP,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,UAAU;AACT,YAAM,EAAE,SAAS,YAAY,IAAI;AACjC,UAAI,aAAa;AACf,cAAM,CAAC,cAAc,UAAU,IAAI;AAAA,UACjC;AAAA,UACA;AAAA,QACF;AACA,YAAI,cAAc;AAChB,uBAAa,QAAQ,CAACC,WAAU;AAlE1C;AAmEY,kBAAM,MAAK,aAAQ,YAAR,mBAAiB,WAAWA;AACvC,gBAAI,IAAI;AACN,oBAAM,EAAE,MAAM,QAAQ,IAAI,eAAe,IAAIF,UAAS;AACtD,0BAAYE,MAAK,EAAE,cAAc;AACjC,0BAAYA,MAAK,EAAE,UAAU;AAAA,YAC/B;AAAA,UACF,CAAC;AACD,cAAI,YAAY;AACd,uBAAW,QAAQ,CAACA,WAAU;AA3E1C;AA4Ec,oBAAM,MAAK,aAAQ,YAAR,mBAAiB,WAAWA;AACvC,kBAAI,IAAI;AACN,sBAAM,EAAE,CAACF,UAAS,GAAG,KAAK,IAAI,GAAG,sBAAsB;AACvD,4BAAYE,MAAK,EAAE,YAAY;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAACF,UAAS;AAAA,EACZ;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAC,KAAK,aAAa;AACjB,UAAI,WAAW,WAAW,QAAQ,SAAS;AACzC;AAAA,UACE;AAAA,YACE,WAAW;AAAA,YACX,QAAQ;AAAA,YACR;AAAA,YACAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAACA,UAAS;AAAA,EACZ;AAEA,QAAM,oBAAgB,4BAAY,MAAM;AACtC,UAAM,cAAc,QAAQ;AAC5B,QAAI,aAAa;AACf,yDAAkB,YAAY,OAAO,mBAAmB;AAAA,IAC1D;AACA,+CAAa,QAAQ,CAAC,SAAS;AAC7B,WAAK,cAAc;AACnB,WAAK,YAAY;AACjB,WAAK,WAAW;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,qBAAkC;AAAA,IACtC,CAAC,MAAM;AACL,aAAO,eAAAC,QAAM,cAAc,UAAU;AAAA,QACnC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,KAAK,YAAY,CAAC;AAAA,QAClB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACA,CAAC,YAAY,eAAe,iBAAiB,QAAQ;AAAA,EACvD;AAEA,8BAAQ,MAAM;AACZ,UAAM,CAAC,SAAS,IAAI,IAAI;AAAA,MACtB;AAAA,MACAD;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AACA,YAAQ,UAAU;AAClB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,UAAU,gBAAgBA,UAAS,CAAC;AAExC,SAAO;AAAA,IACL,SAAS,WAAW,WAAW,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,aACP,UACAA,YACA,gBACA,MACwB;AACxB,QAAM,YAAY,gBAAgB,UAAUA,UAAS;AACrD,QAAM,kCACJ,oCAAoC,SAAS;AAC/C,QAAM,UAAU,CAAC;AACjB,QAAM,OAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC;AACxB,QAAI,MAAM,KAAK,gCAAgC,CAAC,IAAI,aAAa;AAC/D,cAAQ,KAAK,kBAAkB,CAAC,CAAC;AACjC,WAAK,KAAK,EAAE,aAAa,MAAM,MAAM,KAAK,CAAC;AAAA,IAC7C;AACA,QAAI,MAAM,OAAO,MAAM;AACrB,YAAM,MAAM,KAAK,CAAC,MAAM,KAAK,CAAC,QAAI,+BAAY;AAC9C,cAAQ,KAAK,eAAAC,QAAM,aAAa,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,IACjD,OAAO;AACL,cAAQ,KAAK,KAAK;AAAA,IACpB;AACA,SAAK,KAAK,UAAU,CAAC,CAAC;AAEtB,QAAI,IAAI,KAAK,gCAAgC,CAAC,IAAI,aAAa;AAC7D,cAAQ,KAAK,kBAAkB,CAAC,CAAC;AACjC,WAAK,KAAK,EAAE,aAAa,KAAK,CAAC;AAAA,IACjC,WAAW,gCAAgC,CAAC,IAAI,UAAU;AACxD,cAAQ,KAAK,eAAe,QAAQ,MAAM,CAAC;AAC3C,WAAK,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,IAC9B;AAAA,EACF;AACA,SAAO,CAAC,SAAS,IAAI;AACvB;AAEA,SAAS,cACP,SACA,aACA,UACAD,YACA;AACA,QAAM,cAAc,WAAW,aAAa,QAAQ;AACpD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,IAAI,CAAC,OAAO,QAAQ;AACjC,UAAM,OAAO,YAAY,GAAG;AAC5B,UAAM,EAAE,aAAa,UAAU,UAAU,IAAI;AAC7C,UAAM,iBAAiB,gBAAgB;AACvC,QAAI,kBAAkB,UAAU;AAC9B,YAAM,EAAE,WAAW,gBAAgB,IAAI,MAAM,MAAM,SAAS,CAAC;AAC7D,YAAM,OAAO,iBAAiB,KAAK,cAAc;AACjD,UAAI,SAAS,iBAAiB;AAC5B,eAAO,eAAAC,QAAM,aAAa,OAAO;AAAA,UAC/B,OAAO;AAAA,YACL,GAAG,MAAM,MAAM;AAAA,YACf,WAAW;AAAA,YACX,CAACD,UAAS,GAAG;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAGA,SAAS,WAAW,aAA4B,UAAkB;AAChE,QAAM,gBAA0B,CAAC;AAEjC,cAAY,QAAQ,CAAC,MAAM,QAAQ;AACjC,QAAI,KAAK,gBAAgB,QAAW;AAClC,oBAAc,KAAK,GAAG;AAAA,IACxB;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,WAAW,IAAI,cAAc,CAAC,IAAI,cAAc,CAAC;AAEjE,QAAM,EAAE,cAAc,GAAG,UAAU,EAAE,IAAI,YAAY,OAAO;AAC5D,MAAI,gBAAgB,SAAS;AAE3B,WAAO;AAAA,EACT,WAAW,KAAK,IAAI,QAAQ,IAAI,cAAc,SAAS;AAErD,UAAM,aAAa,WAAW,IAAI,KAAK;AACvC,eAAW,KAAK,IAAI,GAAG,cAAc,OAAO,IAAI;AAAA,EAClD;AAEA,QAAM,cAAc,YAAY,cAAc,CAAC,CAAC;AAChD,QAAM,EAAE,aAAa,cAAc,EAAE,IAAI;AACzC,cAAY,cAAc,cAAc;AAExC,QAAM,eAAe,YAAY,cAAc,CAAC,CAAC;AACjD,QAAM,EAAE,aAAa,eAAe,EAAE,IAAI;AAC1C,eAAa,cAAc,eAAe;AAE1C,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAe;AACxC,SAAO,eAAAC,QAAM,cAAc,aAAa;AAAA,IACtC,MAAM,UAAU;AAAA,IAChB,KAAK,eAAe,KAAK;AAAA,EAC3B,CAAQ;AACV;AAEA,SAAS,eACP,IACAD,YACU;AACV,QAAM,EAAE,CAACA,UAAS,GAAG,KAAK,IAAI,GAAG,sBAAsB;AACvD,QAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAM,aAAa,MAAM,iBAAiB,OAAOA,UAAS,EAAE;AAC5D,QAAM,UAAU,WAAW,SAAS,IAAI,IAAI,SAAS,YAAY,EAAE,IAAI;AACvE,SAAO,EAAE,MAAM,QAAQ;AACzB;;;AD7NI,IAAAG,uBAAA;AAxCJ,IAAMC,aAAY;AAElB,IAAM,cAAU,2BAAW,SAASC,SAClC,OACA,KACA;AACA,QAAM;AAAA,IACJ,aAAAC;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,SAAS,QAAQ,IAAI,oBAAoB;AAAA,IAC/C;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,gBAAY,aAAAC,SAAGH,YAAW,eAAe;AAAA,IAC7C,CAAC,GAAGA,UAAS,SAAS,GAAG;AAAA,IACzB,CAAC,GAAGA,UAAS,MAAM,GAAG;AAAA,IACtB,aAAa;AAAA,IACb,aAAa;AAAA,EACf,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MAEA,mBAAiB,cAAc;AAAA,MAC/B;AAAA,MACA,SAAK,yBAAW,SAAS,GAAG;AAAA,MAC5B,OACE;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,aAAa;AAAA,MACf;AAAA,MAGD;AAAA;AAAA,EACH;AAEJ,CAAC;AACD,QAAQ,cAAc;AAEtB,IAAO,kBAAQ;;;A+BrEf,IAAAI,iBAA4B;AAuBnB,IAAAC,uBAAA;AAfF,IAAM,gBAAgB,SAASC,eAAc,OAA2B;AAC7E,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,WAAW,0BAA0B;AAE3C,QAAM,0BAAsB;AAAA,IAC1B,CAAC,UAAU;AACT,eAAS;AAAA,QACP,MAAM,OAAO;AAAA,QACb;AAAA,QACA;AAAA,MACF,CAAyB;AAAA,IAC3B;AAAA,IACA,CAAC,UAAU,IAAI;AAAA,EACjB;AAEA,SAAO,8CAAC,mBAAS,GAAG,OAAO,iBAAiB,qBAAqB;AACnE;AACA,cAAc,cAAc;AAE5B,kBAAkB,WAAW,eAAe,WAAW;;;AC3BvD,IAAAC,eAA2B;AAC3B,IAAAC,gBAAe;AACf,IAAAC,iBAAkD;;;ACFlD,IAAAC,oBAA4B;AAC5B,IAAAC,iBAQO;AAIP,IAAM,cAA4B,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAE/D,IAAM,eAAe;AAEd,IAAM,sBAAsB,CAAC;AAAA,EAClC,UAAU;AAAA,EACV,MAAM;AAAA,EACN;AACF,MAIM;AACJ,QAAM,cAAU,uBAAO,IAAI;AAC3B,QAAM,cAAU,uBAAO,IAAI;AAC3B,QAAM,iBAAa,uBAAuB;AAC1C,QAAM,OAAO,8BAAY;AAEzB,QAAM,YAAW,+BAAO,mBAAkB;AAC1C,QAAMC,aAAY,WAAW,WAAW;AAExC,QAAM,eAAW;AAAA,IACf,MACE,MAAM,QAAQ,YAAY,IACtB,mBACA,+BAAe,YAAY,IAC3B,CAAC,YAAY,IACb,CAAC;AAAA,IACP,CAAC,YAAY;AAAA,EACf;AAEA,QAAMC,oBAAe;AAAA,IACnB,CAACC,WAAUF,eAAqC;AAC9C,YAAM,YAAY,gBAAgBE,WAAUF,YAAW,WAAW;AAClE,YAAM,UAAU,CAAC;AACjB,YAAM,OAAO,CAAC;AACd,eAAS,IAAI,GAAG,IAAIE,UAAS,QAAQ,KAAK;AACxC,cAAM,QAAQA,UAAS,CAAC;AACxB,cAAM;AAAA,UACJ,OAAO,EAAE,MAAM,GAAG,KAAK;AAAA,QACzB,IAAI,MAAM;AACV,gBAAQ;AAAA,cACN,6BAAa,OAAO;AAAA,YAClB,SAAK,+BAAY;AAAA,YACjB,OAAO;AAAA,cACL,GAAG;AAAA,cACH,sBAAsB;AAAA,YACxB;AAAA,UACF,CAAC;AAAA,QACH;AACA,aAAK,KAAK,UAAU,CAAC,CAAC;AAAA,MACxB;AACA,aAAO,CAAC,SAAS,IAAI;AAAA,IACvB;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,8BAAQ,MAAM;AACZ,UAAM,CAAC,SAAS,IAAI,IAAID,cAAa,UAAUD,UAAS;AACxD,YAAQ,UAAU;AAClB,eAAW,UAAU;AAAA,EACvB,GAAG,CAACC,eAAc,UAAUD,UAAS,CAAC;AAEtC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,WAAW;AAAA,IACpB;AAAA,EACF;AACF;;;ADPI,IAAAG,uBAAA;AAjEJ,IAAMC,aAAY;AAMX,IAAM,gBAAY,2BAAW,SAASC,WAC3C,OACA,KACA;AACA,QAAM;AAAA,IACJ,aAAAC;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,MAAM,WAAW;AAAA,IACjB,WAAW;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,GAAG;AAAA,EACL,IAAI;AAIJ,QAAM,eAAW,wBAAQ,MAAM;AAC7B,WAAO,gBAAgB,YAAY;AAAA,EACrC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,EAAE,MAAM,SAAS,QAAQ,IAAI,oBAAoB;AAAA,IACrD;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AAED,QAAM,aAAa;AAAA,IACjB;AAAA,MACE,aAAAA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAY,cAAAC,SAAGH,YAAW,eAAe;AAAA,IAC7C,CAAC,GAAGA,UAAS,SAAS,GAAG;AAAA,IACzB,CAAC,GAAGA,UAAS,MAAM,GAAG;AAAA,IACtB,CAAC,GAAGA,UAAS,YAAY,GAAG;AAAA,IAC5B,aAAa;AAAA,IACb,aAAa;AAAA,EACf,CAAC;AAED,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,cAAc;AAAA,EAChB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,mBAAiB;AAAA,MACjB,aAAW;AAAA,MACX,mBAAiB,cAAc;AAAA,MAC/B;AAAA,MACA,SAAK,yBAAW,SAAS,GAAG;AAAA,MAC5B;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ,CAAC;AACD,UAAU,cAAc;;;AEpFf,IAAAI,uBAAA;AADF,IAAM,kBAAkB,SAASC,iBAAgB,OAAuB;AAC7E,SAAO,8CAAC,aAAW,GAAG,OAAO;AAC/B;AACA,gBAAgB,cAAc;AAE9B,kBAAkB,aAAa,iBAAiB,WAAW;;;ACR3D,IAAAC,iBAAwE;;;ACAxE,IAAAC,qBAA8B;AAC9B,IAAAC,iBAQO;;;ACTP,IAAAC,iBAA0D;AAuB1D,IAAMC,eAAc,oBAAI,IAAkC;AAE1D,IAAMC,iBAAgB,CACpB,SACA,MAMAC,eACW;AACX,UAAQA,YAAW;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK,MAAM,QAAQ,YAAY;AAAA,IACxC,KAAK;AACH,aAAO,KAAK,MAAM,QAAQ,WAAW;AAAA,IACvC,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK,KAAK,KAAK,MAAM,QAAQ,YAAY,CAAC;AAAA,IACnD,KAAK;AACH,aAAO,KAAK,KAAK,KAAK,MAAM,QAAQ,WAAW,CAAC;AAAA,IAClD,KAAK;AACH,aAAO,KAAK;AAAA,IACd;AACE,aAAO;AAAA,EACX;AACF;AAGA,IAAMC,kBAAiB,IAAI,eAAe,CAAC,YAAmC;AAC5E,aAAW,SAAS,SAAS;AAC3B,UAAM,EAAE,QAAQ,eAAe,eAAe,IAAI;AAClD,UAAM,iBAAiBH,aAAY,IAAI,MAAqB;AAC5D,QAAI,gBAAgB;AAClB,YAAM,CAAC,EAAE,WAAW,QAAQ,YAAY,MAAM,CAAC,IAAI;AACnD,YAAM,CAAC,EAAE,WAAW,eAAe,YAAY,aAAa,CAAC,IAC3D;AACF,YAAM,EAAE,UAAU,aAAa,IAAI;AACnC,UAAI,cAAc;AAClB,iBAAW,CAACE,YAAW,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC5D,cAAM,UAAUD;AAAA,UACd;AAAA,UACA,EAAE,QAAQ,OAAO,eAAe,aAAa;AAAA,UAC7CC;AAAA,QACF;AAEA,YAAI,YAAY,MAAM;AACpB,wBAAc;AACd,uBAAaA,UAA8B,IAAI;AAAA,QACjD;AAAA,MACF;AACA,UAAI,aAAa;AAEf,oBAAY,SAAS,YAAY;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAIM,SAASE,mBACd,KACA,YACA,UACA,oBAAoB,OACpB;AACA,QAAM,oBAAgB,uBAAO,UAAU;AAEvC,QAAM,cAAU,4BAAY,CAAC,WAA8C;AACzE,UAAM,EAAE,OAAO,OAAO,IAAI,OAAO,sBAAsB;AACvD,UAAM,EAAE,aAAa,cAAc,cAAc,cAAc,IAAI;AACnE,UAAM,gBAAgB,KAAK,MAAM,MAAM;AACvC,UAAM,eAAe,KAAK,MAAM,KAAK;AAErC,WAAO,cAAc,QAAQ;AAAA,MAC3B,CAAC,KAAgC,QAAQ;AACvC,YAAI,GAAG,IAAIH;AAAA,UACT;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AAUL,gCAAU,MAAM;AACd,UAAM,SAAS,IAAI;AACnB,mBAAe,mBAAmB;AAGhC,MAAAD,aAAY,IAAI,QAAQ,EAAE,cAAc,CAAC,EAA0B,CAAC;AAEpE,YAAM,iBAAiBA,aAAY,IAAI,MAAM;AAC7C,UAAI,gBAAgB;AAClB,cAAM,eAAe,QAAQ,MAAM;AACnC,uBAAe,eAAe;AAC9B,QAAAG,gBAAe,QAAQ,MAAM;AAC7B,YAAI,mBAAmB;AACrB,mBAAS,YAAY;AAAA,QACvB;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ;AAEV,UAAIH,aAAY,IAAI,MAAM,GAAG;AAC3B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,YACE;AAAA,UACF;AAAA,QACF;AAAA,MAIF;AAEA,uBAAiB;AAAA,IACnB;AACA,WAAO,MAAM;AACX,UAAI,UAAUA,aAAY,IAAI,MAAM,GAAG;AACrC,QAAAG,gBAAe,UAAU,MAAM;AAC/B,QAAAH,aAAY,OAAO,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,SAAS,GAAG,CAAC;AAEjB,gCAAU,MAAM;AACd,UAAM,SAAS,IAAI;AACnB,UAAM,SAASA,aAAY,IAAI,MAAM;AACrC,QAAI,QAAQ;AACV,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,cAAM,eAAe,QAAQ,MAAM;AACnC,eAAO,eAAe;AAAA,MACxB;AAEA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,KAAK,QAAQ,CAAC;AACzC;;;ADlLA,IAAM,oBAAoB,CAAC,gBAAgB,aAAa;AACxD,IAAMK,aAAY,CAAC,aAAa;AAChC,IAAMC,cAAa,CAAC,cAAc;AAClC,IAAMC,kBAAiB,CAAC;AA0BxB,IAAM,WAAW,CAAC,QAAgC,OAAO,SAAS,GAAG;AAErE,IAAM,YAAqB,EAAE,QAAQ,QAAQ,OAAO,OAAO;AAa3D,IAAM,oBAAoB,CACxB,QACA,UACY;AACZ,UAAI,kCAAc,MAAM,SAAK,kCAAc,KAAK,GAAG;AACjD,WAAO;AAAA,MACL,QAAQ,GAAG,MAAM;AAAA,MACjB,OAAO,GAAG,KAAK;AAAA,IACjB;AAAA,EACF,WAAW,OAAO,WAAW,YAAY,OAAO,UAAU,UAAU;AAClE,WAAO;AAAA,MACL,QAAQ,0BAAU;AAAA,MAClB,OAAO,wBAAS;AAAA,IAClB;AAAA,EACF,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,IAAM,sBAAsB,CAC1B,QACA,UAC6B;AAC7B,UAAI,kCAAc,MAAM,SAAK,kCAAc,KAAK,GAAG;AACjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf;AAAA,EACA,UAAU;AAAA,EACV;AACF,MAAkD;AAChD,QAAM,mBAAe,uBAAuB,IAAI;AAChD,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAwB;AAAA,IAC9C,KAAK,kBAAkB,QAAQ,KAAK;AAAA,IACpC,OAAO,oBAAoB,QAAQ,KAAK;AAAA,IACxC,OAAO;AAAA,MACL,QAAQ,0BAAU;AAAA,MAClB,OAAO,wBAAS;AAAA,IAClB;AAAA,EACF,CAAC;AACD,QAAM,cAAc,OAAO,WAAW;AACtC,QAAM,aAAa,OAAO,UAAU;AAEpC,QAAM,aACJ,eAAe,aACXA,kBACA,cACAF,aACA,aACAC,cACA;AAEN,8BAAQ,MAAM;AACZ,YAAQ,CAAC,gBAAgB;AACvB,YAAM,EAAE,OAAO,MAAM,IAAI;AACzB,cAAI,kCAAc,MAAM,SAAK,kCAAc,KAAK,KAAK,SAAS,OAAO;AACnE,cAAM,EAAE,QAAQ,aAAa,OAAO,WAAW,IAAI;AACnD,cAAM,EAAE,QAAQ,aAAa,OAAO,WAAW,IAAI;AAEnD,YAAI,gBAAgB,UAAU,eAAe,OAAO;AAClD,gBAAM,iBAAa,kCAAc,WAAW,IACxC,cAAc,cACd;AACJ,gBAAM,gBAAY,kCAAc,UAAU,IACtC,aAAa,aACb;AACJ,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,EAAE,QAAQ,MAAM;AAAA,YACvB,OAAO,EAAE,QAAQ,SAAS,YAAY,OAAO,QAAQ,UAAU;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,QAAM,eAA0B;AAAA,IAC9B,CAAC,EAAE,aAAa,aAAa,MAA2B;AACtD,YAAM,EAAE,KAAK,OAAO,MAAM,IAAI;AAC9B,UAAI,WAA0B;AAE9B,UACE,eACA,SAAS,WAAW,KACpB,KAAK,MAAM,WAAW,OAAM,+BAAO,QACnC;AACA,mBAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACL,OAAO,KAAK,MAAM,WAAW,KAAK;AAAA,YAClC;AAAA,UACF;AAAA,QACF;AAAA,MACF,WACE,cACA,SAAS,YAAY,KACrB,KAAK,MAAM,YAAY,OAAM,+BAAO,SACpC;AACA,mBAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACL,QAAQ,KAAK,MAAM,YAAY,KAAK;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAAA,MACF,WACE,SAAS,YAAY,KACrB,SAAS,WAAW,MACnB,iBAAgB,+BAAO,UAAS,kBAAiB,+BAAO,UACzD;AACA,mBAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACL,OAAO,KAAK,MAAM,WAAW,KAAK;AAAA,YAClC,QAAQ,KAAK,MAAM,YAAY,KAAK;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa,MAAM;AACrB,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,eAAe,cAAc,aAAa,YAAY,QAAQ,MAAM,KAAK;AAAA,EAC5E;AAEA,gCAAU,MAAM;AACd,QAAI,KAAK,OAAO;AACd,mDAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,cAAc,KAAK,KAAK,CAAC;AAE7B,EAAAE,mBAAkB,cAAc,YAAY,UAAU,IAAI;AAE1D,SAAO;AAAA,IACL;AAAA,IACA,SAAS,KAAK;AAAA,IACd,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AACF;;;AD9MA,IAAAC,eAA2B;AAC3B,IAAAC,gBAAe;AAyDX,IAAAC,uBAAA;AAzCJ,IAAM,YAAY;AAEX,IAAM,wBAAoB,2BAAW,SAASC,mBACnD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,cACA;AACA,QAAM,EAAE,cAAc,GAAG,sBAAsB,IAAI,qBAAqB;AAAA,IACtE;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,EAAE,SAAS,UAAU,IAAI;AAC/B,QAAM,aAAa,cAAc;AAEjC,QAAMC,YAAW,MAAM;AACrB,WAAO,aACF;AAAA,MACC,yBAAyB,GAAG,QAAQ,MAAM;AAAA,MAC1C,wBAAwB,GAAG,QAAQ,KAAK;AAAA,IAC1C,IACC;AAAA,MACC,GAAG;AAAA,MACH,yBAAyB,GAAG,QAAQ,MAAM;AAAA,MAC1C,wBAAwB,GAAG,QAAQ,KAAK;AAAA,MACxC,wBAAwB,GAAG,uCAAW,MAAM;AAAA,MAC5C,uBAAuB,GAAG,uCAAW,KAAK;AAAA,IAC5C;AAAA,EACN;AAEA,QAAM,gBAAY,yBAAW,cAAc,YAAY;AAEvD,SAAO,aACL;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,cAAAC,SAAG,WAAW,GAAG,SAAS,aAAa;AAAA,MAClD,OAAOD,UAAS;AAAA,MAChB,KAAK;AAAA;AAAA,EACP,IAEA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,cAAAC,SAAG,WAAW,SAAS;AAAA,MAClC,KAAK;AAAA,MACL,OAAOD,UAAS;AAAA,MAEf;AAAA;AAAA,EACH;AAEJ,CAAC;;;AG5ED,IAAAE,qBAA0C;AAC1C,IAAAC,qBAAuC;AAEvC,IAAAC,gBAAe;AACf,IAAAC,iBAKO;;;ACRP,IAAAC,0BAA+C;AAC/C,IAAAC,qBAIO;AACP,IAAAC,iBAAuD;;;ACPvD,IAAAC,qBAAuD;AAEvD,IAAM,mBAAmB;AAQlB,IAAM,oBAAoB,CAAC,YAChC,YAAY,QACZ,QAAQ,QAAQ,UAAU,cAC1B,QAAQ,kBAAkB,QAC1B,QAAQ,cAAc,UAAU;AAAA,EAC9B;AACF;AAEK,IAAM,oBAAoB,CAAC,aAChC,SAAS,KAAK,CAAC,IAAI,OAAO;AACxB,QAAM;AAAA,IACJ,SAAS,EAAE,OAAO,OAAO,IAAI;AAAA,EAC/B,IAAI;AACJ,QAAM;AAAA,IACJ,SAAS,EAAE,OAAO,OAAO,IAAI;AAAA,EAC/B,IAAI;AACJ,QAAM,gBAAgB,GAAG,UAAU,SAAS,SAAS;AACrD,QAAM,gBAAgB,GAAG,UAAU,SAAS,SAAS;AACrD,QAAM,yBAAyB,SAAS;AACxC,QAAM,yBAAyB,SAAS;AACxC,MAAI,iBAAiB,CAAC,eAAe;AACnC,WAAO;AAAA,EACT,WAAW,CAAC,iBAAiB,eAAe;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,wBAAwB;AAC1B,WAAO;AAAA,EACT,WAAW,wBAAwB;AACjC,WAAO;AAAA,EACT;AACA,SAAO,SAAS,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI;AAC/C,CAAC;AAEI,IAAM,mBAAmC,CAAC;AAS1C,IAAM,+BAA+B,CAC1C,WACA,cAA+B,iBACM;AACrC,QAAM,kBAAkC,CAAC;AACzC,QAAM,eAA+B,CAAC;AACtC,MAAI,kBAAkB;AACtB,MAAI,aAAa;AACjB,QAAM,iBAAiB;AAAA,IACrB,MAAM,KAAK,UAAU,QAAQ;AAAA,EAC/B;AACA,QAAM,oBAAoB,gBAAgB,aAAa,QAAQ;AAC/D,aAAW,SAAS,gBAAgB;AAClC,UAAM,UAAU;AAChB,UAAM;AAAA,MACJ,SAAS,EAAE,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,IAAI;AAAA,IAC9D,IAAI;AACJ,UAAM,EAAE,CAAC,iBAAiB,GAAG,SAAS,IAAI,QAAQ,sBAAsB;AACxE,QAAI,YAAY,iBAAiB;AAC/B,UAAI,UAAU,YAAY;AACxB,qBAAa,KAAK,gBAAgB,IAAI,CAAiB;AAAA,MACzD,OAAO;AACL,qBAAa,KAAK,EAAE,OAAO,OAAO,iBAAiB,CAAC;AAAA,MACtD;AACA,mBAAa;AAAA,IACf,WAAW,YAAY;AACrB,mBAAa,KAAK,EAAE,OAAO,OAAO,iBAAiB,CAAC;AAAA,IACtD,OAAO;AACL,sBAAgB,KAAK,EAAE,OAAO,OAAO,iBAAiB,CAAC;AAAA,IACzD;AACA,sBAAkB;AAAA,EACpB;AACA,SAAO,CAAC,iBAAiB,YAAY;AACvC;AAEO,IAAM,mCAAmC,CAC9C,WACA,iBACAC,gBACG;AACH,MAAI,iBAAiB;AACrB,QAAM,YAAYA,cAAY,GAAGA,WAAS,gBAAgB;AAC1D,MAAI,gBAAgB,KAAK,CAAC,EAAE,MAAM,MAAM,UAAU,UAAU,GAAG;AAC7D,QAAI,gBAAgB,WAAW,GAAG;AAChC,uBAAiB;AAAA,IACnB;AAAA,EACF;AACA,aAAW,WAAW,UAAU,UAAU;AACxC,UAAM;AAAA,MACJ,SAAS,EAAE,QAAQ,IAAI;AAAA,IACzB,IAAI;AACJ,QAAI,gBAAgB,WAAW,KAAK,gBAAgB;AAClD,gBAAU,UAAU,OAAO,SAAS;AAAA,IACtC,OAAO;AACL,gBAAU,UAAU,IAAI,SAAS;AAAA,IACnC;AACA,QACE,UAAU,cACV,gBAAgB,KAAK,CAAC,SAAS,KAAK,UAAU,KAAK,GACnD;AACA,cAAQ,UAAU,IAAI,SAAS;AAAA,IACjC,OAAO;AACL,cAAQ,UAAU,OAAO,SAAS;AAAA,IACpC;AAAA,EACF;AACF;AAEA,IAAM,cAAc,CAAC,UAAkB,EAAE,iBAAiB,MACxD,KAAK,IAAI,UAAU,SAAS,gBAAgB,CAAC;AAE/C,IAAM,cAAc,CAAC,UAAkB,EAAE,iBAAiB,MACxD,KAAK,IAAI,UAAU,SAAS,gBAAgB,CAAC;AAExC,IAAM,8CAA8C,CACzD,iBACA;AA/HF;AA+HK,sBAAa,SAAS,OAAK,kBAAa,GAAG,EAAE,MAAlB,mBAAqB,WAAU;AAAA;AAE/D,IAAM,yBAAyB,CAAC,kBAAkC;AAChE,MAAI,CAAC,mBAAmB,IAAI;AAC5B,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAM,OAAO,cAAc,CAAC;AAC5B,QACE,SAAS,KAAK,gBAAgB,IAC9B,SAAS,oBAAoB,gBAAgB,GAC7C;AACA,4BAAsB;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,+CAA+C,CAC1D,iBACA,iBACG;AAlJL;AAmJE,QAAM,wBAAwB,gBAAgB;AAAA,IAC5C;AAAA,IACA,OAAO;AAAA,EACT;AACA,QAAM,qBAAqB,aAAa,OAAe,aAAa,CAAC;AACrE,MAAI,qBAAqB,uBAAuB;AAC9C,WAAO;AAAA,EACT,OAAO;AACL,WAAO,aAAa,SAAS,OAAK,kBAAa,GAAG,EAAE,MAAlB,mBAAqB,WAAU;AAAA,EACnE;AACF;AAQO,IAAM,qCAAqC,CAChD,WACA,oBAEA,IAAI,QAAQ,CAAC,YAAY;AACvB,wBAAsB,MAAM;AAC1B,UAAM,CAAC,EAAE,EAAE,IAAI,6BAA6B,SAAS;AACrD,UAAM,kBAAkB,YAAY,iBAAiB,EAAE;AACvD,oBAAgB,QAAQ,CAAC,SAAS,qBAAqB,WAAW,IAAI,CAAC;AACvE,YAAQ,EAAE;AAAA,EACZ,CAAC;AACH,CAAC;AAQI,IAAM,qCAAqC,CAChD,WACA,YACA,YAEA,IAAI,QAAQ,CAAC,YAAY;AACvB,wBAAsB,MAAM;AAC1B,UAAM,CAAC,EAAE,EAAE,IAAI,6BAA6B,SAAS;AACrD,UAAM,0BAA0B,uBAAuB,EAAE;AACzD,QAAI,yBAAyB;AAC3B,YAAM,CAAC,iBAAiB,YAAY,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AACA,cAAQ,CAAC,iBAAiB,YAAY,CAAC;AAAA,IACzC,OAAO;AACL,cAAQ,CAAC,YAAY,OAAO,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AACH,CAAC;AAEI,IAAM,uBAAuB,CAClC,WACA,SACG;AACH,QAAM,SAAK,0CAAsB,WAAW,KAAK,KAAK;AACtD,MAAI,IAAI;AACN,OAAG,UAAU,IAAI,SAAS;AAAA,EAC5B,OAAO;AACL,UAAM;AAAA,MACJ,gDAAgD,KAAK,KAAK;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,IAAM,6BAA6B,CAAC,cACzC,MAAM,KAAK,UAAU,iBAAiB,UAAU,CAAC;AAEnD,IAAM,cAAc,CAAC,QAAwB,WAA2B;AACtE,QAAM,WAA2B,CAAC;AAClC,aAAW,QAAQ,QAAQ;AACzB,QAAI,CAAC,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,UAAU,KAAK,KAAK,GAAG;AACrD,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,qCAAqC,CAChD,WACA,iBACG;AACH,QAAM,2BAA2B,2BAA2B,SAAS;AACrE,2BAAyB,QAAQ,CAAC,OAAO;AACvC,UAAM;AAAA,MACJ,SAAS,EAAE,QAAQ,IAAI;AAAA,IACzB,IAAI;AACJ,QAAI,CAAC,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,GAAG;AAChD,SAAG,UAAU,OAAO,SAAS;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;AAEA,IAAM,uBAAuB,CAAC,cAC5B,UAAU,cAAc,yBAAyB;AACnD,IAAM,oBAAoB,CAAC,cACzB,UAAU,cAAc,UAAU;AACpC,IAAM,kBAAkB,CAAC,OACvB,SAAS,iBAAiB,EAAE,EAAE,iBAAiB,OAAO,CAAC;AAEzD,IAAM,oBAAoB,CACxB,WACA,sBACG;AACH,QAAM,EAAE,OAAO,eAAe,IAAI,UAAU,sBAAsB;AAClE,QAAM,eAAe;AAAA,IACnB,iBAAiB,SAAS,EAAE,iBAAiB,eAAe;AAAA,EAC9D;AACA,QAAM,EAAE,OAAO,eAAe,IAAI,kBAAkB,sBAAsB;AAC1E,SAAO,iBAAiB,eAAe;AACzC;AAOO,IAAM,0CAA0C,CACrD,cACY;AACZ,QAAM,oBAAoB,qBAAqB,SAAS;AACxD,QAAM,iBAAiB,kBAAkB,WAAW,iBAAiB;AACrE,QAAM,iBAAiB,gBAAgB,iBAAiB;AACxD,QAAM,iBAAiB,kBAAkB,SAAS;AAClD,QAAM,gBAAgB,gBAAgB,cAAc;AAEpD,MAAI,iBAAiB,iBAAiB,gBAAgB;AACpD,cAAU,UAAU,OAAO,YAAY;AACvC,mBAAe,UAAU,OAAO,SAAS;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,uBAAuB,CAAC,IAAa,OAAgB;AACzD,QAAM;AAAA,IACJ,SAAS,EAAE,OAAO,KAAK,KAAK,kBAAkB,KAAK,IAAI;AAAA,EACzD,IAAI;AACJ,QAAM;AAAA,IACJ,SAAS,EAAE,OAAO,KAAK,KAAK,kBAAkB,KAAK,IAAI;AAAA,EACzD,IAAI;AAEJ,MAAI,KAAK,IAAI;AACX,WAAO;AAAA,EACT,WAAW,KAAK,IAAI;AAClB,WAAO;AAAA,EACT,OAAO;AACL,WAAO,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,EACnC;AACF;AAEA,IAAM,+BAA+B,CAAC,cACpC,MAAM,KAAK,UAAU,iBAAiB,gBAAgB,CAAC,EAAE;AAAA,EACvD;AACF;AAOK,IAAM,4BAA4B,CACvC,WACA,iBACqC;AACrC,QAAM,iBAAiB,6BAA6B,SAAS;AAC7D,QAAM,oBAAgB;AAAA,IACpB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,EACF;AACA,MAAI,MAAM;AACV,MAAI,gBAAgB,eAAe,GAAG,GAAG;AACzC,QAAM,YAAY,gBAAgB,aAAa;AAC/C,QAAM,cAAc,gBAAgB,aAAa;AACjD,QAAM,oBAAoB,qBAAqB,SAAS;AACxD,MAAI,iBACF,kBAAkB,WAAW,iBAAiB,IAAI;AACpD,MAAI,kBAAkB,aAAa;AACjC,yBAAqB,eAAe,aAAa;AAAA,EACnD,OAAO;AAEL,UAAM,EAAE,MAAM,SAAS,IAAI,cAAc,sBAAsB;AAC/D,UAAM,qBAAqB;AAC3B,UAAM,cAAc,CAAC,aAAa;AAClC,WAAO,iBAAiB,aAAa;AACnC,aAAO;AACP,sBAAgB,eAAe,GAAG,GAAG;AACrC,kBAAY,KAAK,aAAa;AAC9B,YAAM,EAAE,MAAM,SAAS,IAAI,cAAc,sBAAsB;AAC/D,YAAM,aAAa,WAAW;AAC9B,uBAAiB,qBAAqB;AAAA,IACxC;AAEA,mDAAe,UAAU,OAAO;AAChC,gBAAY,QAAQ,CAAC,SAAS;AAC5B,WAAK,UAAU,IAAI,SAAS;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,QAAM,CAAC,iBAAiB,YAAY,IAClC,6BAA6B,SAAS;AACxC,qCAAmC,WAAW,YAAY;AAC1D,SAAO,CAAC,iBAAiB,YAAY;AACvC;AAEA,IAAM,uBAAuB,CAC3B,gBACA,sBACG;AACH,MAAI,CAAC,kBAAkB,CAAC,mBAAmB;AACzC,UAAM,MAAM,yCAAyC;AAAA,EACvD;AACA,iBAAe,UAAU,OAAO,SAAS;AACzC,oBAAkB,UAAU,IAAI,SAAS;AAC3C;;;ADjVO,IAAM,uBAAuB,CAAC;AAAA,EACnC,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAAkC;AAChC,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAgC,IAAI;AACtE,QAAM,sBAAkB,uBAAuB,gBAAgB;AAE/D,QAAM,mBAAe,uBAA8B,IAAI;AAEvD,QAAM,0BAAsB,4BAAY,CAAC,aAAyB;AA3CpE;AA4CI,QAAI,aAAa,SAAS;AACxB,yBAAa,QACV,cAAc,gDAAgD,MADjE,mBAEI,aAAa,YAAY;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,YAAY;AAC3C,QAAI,WAAW;AACb,UAAI,CAAC,YAAY,OAAO,IAAI;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,4CAA4C,OAAO,GAAG;AACxD,kBAAU,MAAM,mCAAmC,WAAW,OAAO;AAAA,MACvE;AACA,aACE,6CAA6C,YAAY,OAAO,GAChE;AACA,SAAC,YAAY,OAAO,IAAI,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,YAAI,wCAAwC,SAAS,GAAG;AACtD,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,gBAAgB,QAAQ,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC9D,4BAAoB,GAAG;AAAA,MACzB,WAAW,gBAAgB,QAAQ,SAAS,KAAK,QAAQ,WAAW,GAAG;AACrE,4BAAoB,IAAI;AAAA,MAC1B;AAEA,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,WAAW,aAAa,mBAAmB,CAAC;AAEhD,QAAM,kBAAkB,CACtB,QAGG,OAAO,QAAQ,YAAY,QAAQ,QAAQ,kBAAkB;AAElE,QAAM,CAAC,aAAa,iBAAiB,QAAI,wBAAQ,MAG5C;AACH,WAAO;AAAA,MACL,MAAM;AACJ,cAAM,EAAE,SAAS,UAAU,IAAI;AAC/B,eAAO,UAAU,IAAI,CAAC,SAAuB;AAC3C,iBAAO;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,QAAQ,iBAAiB,KAAK,KAAK;AAAA,YACnC,SAAS,EAAE,cAAc,KAAK;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA,MAGA,CAAC,EAAE,QAAQ,MAAM;AACf,YAAI,aAAa,gBAAgB,OAAO,GAAG;AAEzC,gBAAM,CAAC,EAAE,YAAY,IAAI;AAAA,YACvB;AAAA,YACA,QAAQ;AAAA,UACV;AACA,0BAAgB,UAAU;AAC1B,qFAA8B,QAAQ;AAAA,QACxC;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,2BAA2B,CAAC;AAE3C,QAAMC,sBAAiB,wBAAQ,MAAM;AACnC,UAAM,EAAE,SAAS,IAAI,4BAAS,WAAW;AACzC,QAAI,cAAc;AAClB,WAAO,IAAI,eAAe,CAAC,YAAmC;AAC5D,iBAAW,SAAS,SAAS;AAC3B,cAAM,EAAE,CAAC,QAAQ,GAAG,WAAW,IAAI,MAAM;AAGzC,cAAM,OAAO,KAAK,MAAM,UAAoB;AAC5C,gBAAI,kCAAc,IAAI,KAAK,gBAAgB,MAAM;AAC/C,wBAAc;AACd,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,WAAW,CAAC;AAE9B,mDAAyB,MAAM;AAC7B,iBAAa;AAAA,EACf,GAAG,CAAC,cAAc,SAAS,CAAC;AAE5B,8BAAQ,MAAM;AACZ,QAAI,WAAW;AACb,MAAAA,gBAAe,QAAQ,SAAS;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,WAAWA,eAAc,CAAC;AAE9B,QAAM,kBAAc,4BAAY,CAAC,OAA8B;AAC7D,iBAAc,aAAa,UAAU,EAAG;AAAA,EAC1C,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa;AAAA,IACjB,CAAC,WAAmB,YAAoB;AACtC,+CAAa,WAAW;AAAA,IAC1B;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,EAAE,aAAa,6BAA6B,GAAG,aAAa,QAChE,wBAAAC,iBAAY;AAAA,IACV;AAAA,IACA;AAAA;AAAA,IAEA,oBAAoB;AAAA;AAAA,IAEpB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAW;AAAA,EACb,CAAC;AAEH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,GAAG;AAAA,EACL;AACF;;;AD1GQ,IAAAC,uBAAA;AA/DR,IAAMC,cAAY;AAclB,IAAM,gBAAgB,eAAAC,QAAM;AAAA,EAC1B,CAAC;AAAA,IACC,gBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,mBAAmB;AAAA,EACrB,MAA8B;AAC5B,UAAM,gBAAgB,gBAAgB,QAAQ;AAC9C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,qBAAqB;AAAA,MACvB;AAAA,MACA,WAAW,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,SAAS,gBAAgB,aAAa,SAAS,GAAG,UAAU;AAElE,UAAM,QAAQ;AAAA,MACZ,+BAA+B,GAAG,MAAM;AAAA,IAC1C;AAEA,UAAM,gBAAY,cAAAC,SAAG,GAAGH,WAAS,kBAAkB,eAAe;AAAA,MAChE,CAAC,GAAGA,WAAS,aAAa,GAAG,gBAAgB;AAAA,MAC7C,CAAC,GAAGA,WAAS,WAAW,GAAG,gBAAgB;AAAA,IAC7C,CAAC;AAED,UAAM,UAAU,cAAc,IAAI,CAAC,SAAS,MAAM;AAChD,YAAM;AAAA,QACJ,cAAc;AAAA,QACd,0BAA0B,mBAAmB;AAAA,QAC7C,IAAI,SAAS,GAAG,EAAE,IAAI,CAAC;AAAA,QACvB,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACvB,IAAI,QAAQ;AACZ,aACE;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAAG,SAAG,GAAGH,WAAS,SAAS;AAAA,YACjC,yBAAyB,qBAAqB;AAAA,UAChD,CAAC;AAAA,UACD,cAAY;AAAA,UACZ,cAAY;AAAA,UACZ,cAAY;AAAA,UACZ,0BAAwB;AAAA,UACxB,IAAI,GAAG,MAAM;AAAA,UAEb,aAAa;AAAA,UAEZ;AAAA;AAAA,QAHI;AAAA,MAIP;AAAA,IAEJ,CAAC;AAED,UAAM,oBACJ;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAGA,WAAS;AAAA,QACvB,cAAW;AAAA,QAGX;AAAA,UAAC;AAAA;AAAA,YACE,GAAGE;AAAA,YACJ,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,MARI;AAAA,IASN;AAGF,YAAQ,KAAK,iBAAiB;AAE9B,WACE,+CAAC,SAAI,WAAsB,KAAK,SAAS,OACtC;AAAA;AAAA,MACA;AAAA,OACH;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;AAErB,IAAM,wBAAoB,2BAAW,SAASE,mBACnD;AAAA,EACE,gBAAAF;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,cACA;AACA,QAAM,SAAK,0BAAM,MAAM;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,cAAAC,aAAG,cAAAA,SAAG,WAAWH,WAAS,CAAC;AAAA,MACtC;AAAA,MACA,KAAK;AAAA,MAEL;AAAA,QAAC;AAAA;AAAA,UACC,gBAAgBE;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ,CAAC;;;AGtKD,IAAAG,qBAAqB;AACrB,IAAAC,0BAKO;AACP,IAAAC,gBAAe;AACf,IAAAC,iBAMO;AAkCD,IAAAC,uBAAA;AA3BN,IAAM,mBAAmB,CAAC,gBAA6B;AACrD,QAAM,QAAQ,YAAY,UAAU,IAAI;AACxC,QAAM,KAAK;AACX,SAAO,MAAM,QAAQ;AACrB,SAAO;AACT;AAWO,IAAM,kBAAc;AAAA,EACzB,CAAC;AAAA,IACC;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,MAAwB;AACtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,cAAAC,SAAG,kBAAkB,SAAS;AAAA,QACzC,kBAAc;AAAA,QACd,aAAU;AAAA,QACT,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;AAenB,IAAM,UAAU,CAAC;AAAA,EACtB,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd,GAAG;AACL,MAAoB;AAClB,QAAM,WAAW,0BAA0B;AAC3C,QAAMC,cAAY;AAElB,WAAS,gBAAgB,KAAiB;AArF5C;AAsFI,UAAM,SAAS,IAAI;AACnB,UAAM,kBAAkB,OAAO,QAAQ,iBAAiB;AACxD,UAAM,MAAM,UAAS,2BAAgB,YAAhB,mBAAyB,UAAzB,YAAkC,IAAI;AAC3D,UAAM;AAAA,MACJ,OAAO,EAAE,SAAS,UAAU,SAAS,UAAU,GAAGC,OAAM;AAAA,IAC1D,IAAI,SAAS,GAAG;AAChB,UAAM,EAAE,WAAW,mBAAmB,IAAI,QAAQ;AAClD,UAAM,EAAE,QAAQ,MAAM,KAAK,MAAM,IAC/B,gBAAgB,sBAAsB;AACxC,UAAM,SAAK,yBAAK;AAChB,UAAM,cAAc,EAAE,IAAI,KAAK,GAAG;AAClC,UAAM,YAAY,WAChB,UAEA;AAAA,MAAC;AAAA;AAAA,QACE,GAAGF;AAAA,QACH,GAAG;AAAA,QACH,GAAGE;AAAA,QACH,GAAG;AAAA,QACJ,OAAOA,OAAM;AAAA,QAEZ;AAAA;AAAA,IACH;AAGF,aAAS;AAAA,MACP,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,MAAM;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACA,aAAa,iBAAiB,eAAe;AAAA,MAC7C,KAAK,IAAI;AAAA,MACT,cAAc;AAAA,QACZ,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,yBAAyB;AAAA,QACzB,0BAA0B;AAAA,QAC1B,eAAe;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAGH;AAAA,MACH,GAAG;AAAA,MACJ,eAAW,cAAAD,SAAGG,aAAW,WAAW,GAAGA,WAAS,IAAI,WAAW,EAAE;AAAA,MACjE;AAAA,MACA,UAAU;AAAA,MAET,mBAAS;AAAA,QAAI,CAAC,OAAO,QACpB,MAAM,SAAS,kBACX,6BAAa,OAAO;AAAA,UAClB,KAAK;AAAA,UACL,aAAa;AAAA,QACf,CAAC,IACD;AAAA,MACN;AAAA;AAAA,EACF;AAEJ;AAEA,kBAAkB,WAAW,SAAS,MAAM;;;AC3J5C,IAAAE,0BAA6C;AAC7C,IAAAC,qBAAsB;AACtB,IAAAC,gBAAe;AACf,IAAAC,iBAOO;AA8FC,IAAAC,uBAAA;AAxFR,IAAMC,cAAY;AAElB,IAAM,oBAAoB,MAAM;AAEhC,IAAM,mBAAmB,CACvB,aACQ;AACR,QAAM,WAAgB,CAAC;AACvB,iBAAAC,QAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,QAAI,eAAAA,QAAM,eAAe,KAAK,GAAG;AAC/B,eAAS,KAAK,KAAU;AAAA,IAC1B,OAAO;AACL,cAAQ,KAAK,yCAAyC;AAAA,IACxD;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,IAAM,uBAA+C;AAAA,EACnD,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;AAEO,IAAM,YAAQ,2BAAW,SAASC,OACvC;AAAA,EACE,eAAAC,iBAAgB;AAAA,EAChB,SAAS;AAAA,EACT;AAAA,EACA,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,IAAI;AAAA,EACJ,qBAAqB;AAAA;AAAA,EAErB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GACA,KACA;AA5DF;AA6DE,QAAM,SAAK,0BAAM,MAAM;AACvB,QAAM,gBAAY,uBAAiB,CAAC,CAAC;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,IAAIA;AAEJ,QAAM,yBAAqB;AAAA,IACzB,CACE,UACA,SACA,oBACA,aACG;AACH,6CAAY,UAAU;AAAA,IACxB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,cAAc,MAAM;AAjF5B,QAAAC;AAqFI,QAAI,eAAAH,QAAM,eAAe,QAAQ,GAAG;AAClC,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,cAAOG,MAAA,SAAS,MAAM,MAAf,OAAAA,MAAoB;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MACjB,iBAAiB,QAAQ,EAAE,IAAI,CAACC,QAAO,QAAQ;AAC7C,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ,IAAI,UAAU,GAAG,EAAE,IAAI,GAAG;AAAA,MAC1B,qBAAqB;AAAA,IACvB,IAAIA,OAAM;AACV,UAAM,QAAQ,YAAYA,QAAO,KAAK,UAAU,OAAO;AACvD,cAAU,QAAQ,KAAK,KAAK;AAC5B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,cAAc;AAAA,QACd,aAAW,WAAWA,QAAO,GAAG;AAAA,QAEhC,IAAI,GAAG,OAAO;AAAA,QACd,OAAO;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA;AAAA,MANL;AAAA,IAOP;AAAA,EAEJ,CAAC;AAEH,QAAM,QAAQ,YAAY;AAC1B,QAAM,eAAe,aAAa,UAAU,aAAa;AACzD,QAAM,sBAAsB,eAAe,aAAa;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,cAAAC,SAAGN,aAAW,eAAe;AAAA,QACtC,CAAC,GAAGA,WAAS,aAAa,GAAG;AAAA,MAC/B,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA,mBACC;AAAA,UAAC;AAAA;AAAA,YACE,GAAGG;AAAA,YACJ,iBACE,KAAAA,kBAAA,gBAAAA,eAAe,mBAAf,YAAkC,UAAU,OAAO,KAAK;AAAA,YAE1D,eAAeA,eAAc,kBAAkB;AAAA,YAC/C,uBAAqB;AAAA,YACrB,eAAW,cAAAG,SAAG,gBAAgB,iBAAiB;AAAA,YAC/C,cAAW;AAAA,YACX;AAAA,YACA,gBAAgB;AAAA,YAChB;AAAA,YACA,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB;AAAA,YACA,aAAa;AAAA,YAGZ,qBAAW;AAAA;AAAA,QACd,IACE;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACC,mBAAiB,GAAG,EAAE,IAAI,MAAM;AAAA,YAChC,WAAW,GAAGN,WAAS;AAAA,YACvB,MAAK;AAAA,YAEJ;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AACD,MAAM,cAAc;;;ACnKpB,IAAAO,qBAAsB;AACtB,IAAAC,iBAA2C;AAgBzC,IAAAC,uBAAA;AADF,IAAM,wBAAwB,MAC5B;AAAA,EAAC;AAAA;AAAA,IACC,YAAU;AAAA,IACV,OAAO,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,EAAE;AAAA;AACpD;AAGK,IAAM,cAAc,CAAC,UAAsB;AAvBlD;AAwBE,QAAM,UAAM,uBAAuB,IAAI;AACvC,QAAM,WAAW,0BAA0B;AAC3C,QAAM,EAAE,UAAU,IAAI,mBAAmB;AAEzC,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,SAAK,0BAAM,MAAM;AAEvB,QAAM,CAAC,kBAAkB,IAAI,wBAAwB,IAAI,KAAK,IAAI;AAClE,QAAM,4BAA4B,wBAAwB;AAC1D,QAAM,kBACJ,uDAAsB,8BAAtB,YAAmD;AAErD,QAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAI,MAAM;AACR,eAAS,EAAE,MAAM,cAAc,IAAI,MAAM,QAAQ,CAAC;AAClD,qEAAwB;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,aAAqB;AACpB,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,cAAM;AAAA,UACJ,OAAO,EAAE,aAAa,UAAU,MAAAC,QAAO,SAAS;AAAA,QAClD,IAAI,SAAS,QAAQ;AACrB,iBAAS,EAAE,MAAM,UAAU,MAAAA,MAAK,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,EACrB;AAEA,QAAM,mBAAe,4BAAY,MAAM;AACrC,QAAI,MAAM;AACR,YAAM,WAAW,eAAAC,QAAM,SAAS,MAAM,QAAQ;AAC9C,YAAM,YAAY,eAAe,QAAQ;AACzC,eAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,UAAU,gBAAgB,UAAU,IAAI,CAAC;AAE7C,QAAM,oBAAgB;AAAA,IACpB,CAAC,WAAmB,YAAoB;AACtC,UAAI,MAAM;AACR,iBAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,UAAU,IAAI;AAAA,EACjB;AAGA,QAAM,kBAAkB,OAAO,GAAQ,UAAkB;AACvD,QAAI;AAEJ,UAAM,kBAAkB,YACtB,IAAI,QAAQ,CAAC,YAAY;AACvB,cAAQ,IAAI,6CAA6C;AACzD,oBAAc;AAAA,IAChB,CAAC;AAEH,UAAM,WAAW,MAAM;AAAA,MACrB,EAAE,MAAM,aAAa,OAAO,gBAAgB;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,iDAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,UAAkB,SAAiB;AACxD,aAAS,EAAE,MAAM,aAAa,MAAM,GAAG,IAAI,IAAI,QAAQ,IAAI,OAAO,KAAK,CAAC;AAAA,EAC1E;AAEA,QAAM,cAA+B,CAAC,WAAW,KAAK,mBAAmB;AACvE,UAAM,EAAE,IAAAC,KAAI,MAAM,IAAI,UAAU;AAChC,WACE,UAAUA,KAAI,YAAY,KAC1B;AAAA,IAEA,mBAAmB,WAAW,KAAK,cAAc;AAAA,EAErD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,uBAAuB;AAAA,MACvB;AAAA;AAAA,EACF;AAEJ;AACA,YAAY,cAAc;AAE1B,kBAAkB,SAAS,aAAa,WAAW;;;AC7InD,IAAAC,0BAIO;AACP,IAAAC,qBAAsB;AACtB,IAAAC,gBAAe;AACf,IAAAC,iBAAuC;;;ACPvC,IAAAC,qBAA8B;AAC9B,IAAAC,iBAMO;;;ACPP,IAAAC,eAA8B;AAC9B,IAAAC,qBAMO;AACP,IAAAC,iBAUO;AACP,IAAAD,qBAOO;;;AC1BP,IAAAE,qBAAoC;AAE7B,IAAM,iBAAiB,CAC5B,WACA,UACG;AACH,MAAI,WAAW;AACb,UAAM,YAAY,UAAU;AAAA,MAC1B,oBAAoB,KAAK;AAAA,IAC3B;AACA,eAAO,wCAAoB,SAAS;AAAA,EACtC;AACA,SAAO;AACT;AAKO,IAAM,uBAAuB,CAAC,cACnC,eAAe,WAAW,2BAA2B;;;ADcvD,IAAM,aAAa;AAAA,EACjB,YAAY;AAAA,IACV,CAAC,uBAAI,GAAG;AAAA,IACR,CAAC,sBAAG,GAAG;AAAA,IACP,CAAC,4BAAS,GAAG;AAAA,IACb,CAAC,6BAAU,GAAG;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,CAAC,uBAAI,GAAG;AAAA,IACR,CAAC,sBAAG,GAAG;AAAA,IACP,CAAC,0BAAO,GAAG;AAAA,IACX,CAAC,4BAAS,GAAG;AAAA,EACf;AACF;AAEA,IAAM,sBAAsB,CAAC,OAC3B,OAAO,QAAQ,GAAG,QAAQ,UAAU;AAEtC,IAAM,qBAAqB,CACzB,WACA,WACA,YACA,SACA,sBACG;AACH,MAAI,WAAW;AACb,UAAM,iBAAiB,cAAc,SAAS,UAAU;AACxD,UAAM,iBAAiB,cAAc,SAAS,UAAU;AACxD,UAAM,cAAc,kBAAkB;AACtC,UAAM,cAAc,qBAAqB,WAAW,SAAS,IAAI;AACjE,UAAM,mBACJ,qBAAqB,CAAC,oBAAoB,WAAW;AACvD,UAAM,4BACJ,CAAC,qBAAqB,oBAAoB,WAAW;AACvD,yBAAqB,CAAC,oBAAoB,WAAW;AACrD,WAAO,gBAAgB,oBAAoB;AAAA,EAC7C,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,IAAM,kBAAkB,CACtB,KACA,cAA+B,iBAC5B,WAAW,WAAW,EAAE,GAAG,MAAM;AAEtC,IAAM,sBAAsB,CAAC,QAAgB,QAAQ;AAErD,SAAS,YAAY,OAAe,WAA0B,KAAa;AACzE,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,EACT,WAAW,cAAc,OAAO;AAC9B,WAAO,QAAQ;AAAA,EACjB,WAAW,cAAc,OAAO;AAC9B,QAAI,MAAM,GAAG;AACX,aAAO,MAAM;AAAA,IACf,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT,WAAW,QAAQ,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB,CAAC,YAC3B,YAAY,QAAQ,CAAC,QAAQ,UAAU,SAAS,SAAS;AAE3D,IAAM,kBAAkB,CAAC,cACvB,MAAM,KAAK,UAAU,iBAAiB,cAAc,CAAC;AAEvD,IAAM,yBAAyB,CAAC,cAAkC;AAChE,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT,OAAO;AACL,UAAM,UAAU,gBAAgB,SAAS;AACzC,UAAM,cAAc,QAAQ,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK;AACxD,WAAO,YAAY,QAAQ,UAAU;AAAA,EACvC;AACF;AAGA,IAAM,uBAAuB,CAC3B,WACA,OACA,qBAAqB,UAClB;AACH,MAAI,cAAc,MAAM;AACtB,UAAM,UAAU,gBAAgB,SAAS;AACzC,UAAM,SAAS,QAAQ,KAAK;AAC5B,QAAI,CAAC,sBAAsB,oBAAoB,MAAM,GAAG;AACtD,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAoCO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,MAA+D;AAC7D,QAAM,wBAAoB,uBAAO,KAAK;AAEtC,QAAM,iBAAa,uBAAe,EAAE;AACpC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,gBAAgB,kBAAkB,QAAI,4BAAc;AAAA,IACzD,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,EACR,CAAC;AAED,QAAM,wBAAoB;AAAA,IACxB,CAAC,UAAkB;AACjB,yBAAoB,WAAW,UAAU,KAAM;AAAA,IACjD;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,QAAM,yBAAqB,uBAAO,KAAK;AAEvC,QAAM,gBAAY;AAAA,IAChB,CACE,WACA,iBAAiB,OACjB,cACA,QAAQ,OACL;AASH,cAAQ,IAAI,cAAc,SAAS,EAAE;AACrC,wBAAkB,SAAS;AAE3B,UAAI,iBAAiB,QAAQ,CAAC,mBAAmB,SAAS;AACxD,2BAAmB,UAAU;AAAA,MAC/B;AAEA,YAAM,WAAW,MAAM;AACrB,cAAM,UAAU;AAAA,UACd,aAAa;AAAA,UACb;AAAA,UACA;AAAA,QACF;AACA,YAAI,SAAS;AACX,gBAAM,wBAAoB,wCAAoB,OAAO;AACrD,iEAAmB;AAAA,QACrB;AAAA,MACF;AACA,UAAI,gBAAgB;AAClB,iBAAS;AAAA,MACX,OAAO;AACL,mBAAW,UAAU,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,CAAC,cAAc,iBAAiB;AAAA,EAClC;AAEA,QAAM,UAAU,CAAC,MAA+B;AAI9C,QAAI,WAAW,YAAY,IAAI;AAG7B,UAAI,EAAE,OAAO,aAAa,GAAG;AAG3B,cAAM,YAAQ,4CAAoB,+BAAW,EAAE,QAAQ,OAAO,CAAC;AAC/D,0BAAkB,KAAK;AAAA,MACzB,WAAW,EAAE,OAAO,aAAa,IAAI;AAAA,MAGrC,OAAO;AACL,cAAM,QAAQ,qBAAqB,aAAa,OAAO;AACvD,YAAI,UAAU,IAAI;AAChB,gCAAsB,MAAM;AAC1B,8BAAkB,KAAK;AAAA,UACzB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAgB;AAAA,IACpB,MAAG;AA1QP;AA0QU,sCAAa,YAAb,mBAAsB,iBAAiB,gBAAgB,WAAvD,YAAiE;AAAA;AAAA,IACvE,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,YAA2B,OAAO,QAAiB;AA/QxD;AAgRM,YAAM,aAAa,cAAc;AACjC,YAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM;AAE9C,UAAI,UAAU,YAAY,YAAY,WAAW,KAAK;AACtD,YAAM,gBACJ,cAAc,UAAU,QAAQ,cAAc,QAAQ,QAAQ;AAEhE,YAAM,sBACJ,kBAAa,YAAb,mBAAsB;AAAA,QACpB;AAAA,YACG;AAEP,aACE;AAAA,QACE,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA;AACA,cAAM,SAAS,YAAY,YAAY,eAAe,OAAO;AAC7D,YAAI,WAAW,SAAS;AAGtB,iBAAO;AAAA,QACT,OAAO;AACL,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,EAC9B;AAEA,QAAM,yBAAqB;AAAA,IACzB,CAAC,MAA2B;AAC1B,YAAM,YAAY,WAAW,WAAW,EAAE,EAAE,GAAG;AAC/C,YAAM,UAAU,qBAAqB,WAAW,cAAc;AAC9D,cAAQ,IAAI,oBAAoB,cAAc,eAAe,OAAO,GAAG;AACvE,UAAI,YAAY,gBAAgB;AAC9B,cAAM,iBAAiB;AACvB,kBAAU,SAAS,cAAc;AAAA,MACnC,OAAO;AACL,uEAAwB,cAAc,QAAQ,UAAU;AAAA,MAC1D;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,6BAAyB,4BAAY,MAAM;AAC/C,UAAM,KAAK,qBAAqB,aAAa,SAAS,cAAc;AACpE,QAAI,IAAI;AACN,aAAO,GAAG,cAAc,eAAe,KAAK;AAAA,IAC9C;AACA,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,cAAc,CAAC;AAEjC,QAAM,iCAA6B,4BAAY,MAAM;AACnD,UAAM,KAAK,qBAAqB,aAAa,SAAS,cAAc;AACpE,QAAI,IAAI;AACN,aAAO,GAAG,cAAc,yBAAyB,KAAK;AAAA,IACxD;AACA,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,cAAc,CAAC;AAEjC,QAAM,uBAAmB,4BAAY,MAAM;AACzC,UAAM,KAAK,qBAAqB,aAAa,SAAS,cAAc;AACpE,UAAM,SAAS,yBAAI,cAAc;AACjC,QAAI,QAAQ;AACV,iDAAmB,QAAQ,OAAO;AAAA,IACpC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,cAAc,CAAC;AAEjC,QAAM,oBAAgB;AAAA,IACpB,CAAC,MAAqB;AACpB,UAAI,cAAc,IAAI,KAAK,gBAAgB,EAAE,KAAK,WAAW,GAAG;AAC9D,UAAE,eAAe;AACjB,YAAI,mBAAmB,SAAS;AAC9B,6BAAmB,CAAC;AAAA,QACtB,OAAO;AACL,6BAAmB,UAAU;AAC7B,6BAAmB,CAAC;AAAA,QACtB;AAAA,MACF,WACE,oBAAoB,EAAE,GAAG,KACzB,uBAAuB,KACvB,CAAC,2BAA2B,GAC5B;AACA,yBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAIA,QAAM,kBAAkB,CAAC,GAAoB,cAAsB;AACjE,sBAAkB,SAAS;AAAA,EAC7B;AAEA,QAAM,kBAAc,4BAAY,MAAM;AACpC,QAAI,CAAC,UAAU;AACb,kBAAY,IAAI;AAChB,UAAI,CAAC,kBAAkB,SAAS;AAC9B,2BAAmB,UAAU;AAAA,MAC/B,OAAO;AACL,0BAAkB,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,+BAA2B,4BAAY,MAAM;AACjD,QAAI,CAAC,UAAU;AACb,wBAAkB,UAAU;AAAA,IAC9B;AACA,uBAAmB,UAAU;AAAA,EAC/B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,8BAA0B;AAAA,IAC9B,CAAC,gBAAgB;AACf,WAAI,2CAAa,UAAS,UAAU;AAClC,cAAM,QAAQ,uBAAuB,aAAa,OAAO;AACzD,YAAI,UAAU,IAAI;AAChB,oBAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,iBAAiB;AAAA,IACrB,QAAQ,CAAC,MAAkB;AACzB,YAAM,eAAgB,EAAE,OAAuB,QAAQ,aAAa;AACpE,YAAM,aAAa,EAAE;AACrB,UAAI,gBAAgB,EAAC,6CAAc,SAAS,cAAa;AACvD,0BAAkB,EAAE;AACpB,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,IACA,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,cAAc,MAAM;AAClB,yBAAmB,UAAU;AAC7B,wBAAkB,EAAE;AACpB,wBAAkB,UAAU;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,cAAc,mBAAmB,UAAU,iBAAiB;AAAA,IAC5D,wBAAwB;AAAA,IACxB;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,IACX,qBAAqB;AAAA,IACrB;AAAA,EACF;AACF;;;AEhcA,IAAAC,qBAAyD;AACzD,IAAAC,0BAOO;AACP,IAAAC,iBAAkE;AAElE,IAAM,uBAAuB,CAAC,SAAS,GAAG;AAiB1C,IAAM,wBAAsC,CAAC;AAUtC,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,MAA+C;AAC7C,QAAM,CAAC,UAAU,aAAa,YAAY,QAAI,uCAAc;AAAA,IAC1D,YAAY;AAAA,IACZ,SAAS,4CAAmB,CAAC;AAAA,IAC7B,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AASD,QAAM,uBAAmB;AAAA,IACvB,CAAC,QAAuB,qBAAqB,SAAS,IAAI,GAAG;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAC,WAAmB,aAAa,UAAU;AACzC,YAAM,kBAAc,gDAAuB,mBAAmB,UAAU,IACpE,SAAS,OAAO,SAAS,IACzB,CAAC,SAAS;AAEd,kBAAY,WAAW;AACvB,6DAAoB;AAAA,IACtB;AAAA,IACA,CAAC,mBAAmB,UAAU,mBAAmB,WAAW;AAAA,EAC9D;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,WAAmB,aAAa,UAAU;AACzC,YAAM,cACJ,sBAAsB,kBACrB,sBAAsB,0BAA0B,CAAC,aAC9C,CAAC,IACD,SAAS,OAAO,CAAC,UAAU,UAAU,SAAS;AACpD,kBAAY,WAAW;AACvB,6DAAoB;AAAA,IACtB;AAAA,IACA,CAAC,mBAAmB,UAAU,mBAAmB,WAAW;AAAA,EAC9D;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,MAAqB;AACpB,UAAI,iBAAiB,CAAC,SAAK,wCAAoB,EAAE,MAAqB,GAAG;AACvE,YAAI,CAAC,SAAS,SAAS,cAAc,GAAG;AACtC,YAAE,gBAAgB;AAClB,YAAE,eAAe;AACjB,qBAAW,gBAAgB,EAAE,QAAQ;AAAA,QACvC,eAAW,8CAAqB,iBAAiB,GAAG;AAClD,YAAE,gBAAgB;AAClB,YAAE,eAAe;AACjB,uBAAa,gBAAgB,EAAE,QAAQ;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAc;AAAA,IAClB,CAAC,GAAe,cAAsB;AACpC,YAAM,cAAU,wCAAoB,EAAE,MAAqB;AAC3D,cAAI,wCAAoB,OAAO,GAAG;AAChC,YAAI,CAAC,SAAS,SAAS,SAAS,GAAG;AACjC,qBAAW,WAAW,EAAE,QAAQ;AAAA,QAClC,eAAW,8CAAqB,iBAAiB,GAAG;AAClD,uBAAa,WAAW,EAAE,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,cAAc,YAAY,UAAU,iBAAiB;AAAA,EACxD;AAEA,QAAM,mBAAe,+CAAsB,iBAAiB,IACxD,wBACA;AAAA,IACE,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAEJ,SAAO;AAAA,IACL,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHpHO,IAAM,aAAa,CAAC;AAAA,EACzB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,oBAAgB,uBAAO,mBAAmB;AAEhD,QAAM;AAAA,IACJ,WAAW;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,GAAG;AAAA,EACL,IAAI,sBAAsB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM;AAAA,IACJ,cAAc;AAAA,IACd,cAAc,EAAE,SAAS,UAAU;AAAA,IACnC,UAAU;AAAA,EACZ,IAAI,aAAa;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AAKD,gBAAc,UAAU;AAExB,QAAM,kBAAc;AAAA,IAClB,CAAC,QAAsC;AAvE3C;AAwEM,YAAM,SAAS,IAAI;AACnB,YAAM,cAAc,OAAO,QAAQ,cAAc;AACjD,UAAI,aAAa;AACf,cAAM,QAAQ,UAAS,iBAAY,QAAQ,UAApB,YAA6B,IAAI;AACxD,YAAI,UAAU,UAAM,kCAAc,KAAK,GAAG;AACxC,kCAAwB,KAAK,KAAK;AAClC,6CAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,yBAAyB,OAAO;AAAA,EACnC;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,QAAuB;AACtB,gCAA0B,GAAG;AAC7B,UAAI,CAAC,IAAI,kBAAkB;AACzB,+CAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,CAAC,2BAA2B,SAAS;AAAA,EACvC;AAEA,QAAM,kCAA8B;AAAA,IAClC,CAAC,SAAuB;AACtB,YAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,UAAI,CAAC,MAAM,KAAK,GAAG;AAEjB,kCAA0B,KAAK;AAC/B,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,uBAAuB,yBAAyB;AAAA,EACnD;AAEA,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,IACT,SAAS,aAAa;AAAA,IACtB,WAAW;AAAA,EACb;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,cAAc,aAAa;AAAA,IAC3B,cAAc,aAAa;AAAA,IAC3B,gBAAgB;AAAA,MACd,gBAAgB;AAAA,QACd,WAAW;AAAA,QACX,aAAa,aAAa;AAAA,MAC5B;AAAA,MACA,GAAG,aAAa;AAAA,MAChB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;ADlCI,IAAAC,uBAAA;AA5EJ,IAAMC,cAAY;AAoBX,IAAM,UAAU,CAAC;AAAA,EACtB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,GAAG;AACL,MAAoB;AAClB,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI,WAAW;AAAA,IACb,iBAAiB;AAAA,IACjB;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAK,0BAAM,MAAM;AAEvB,QAAM,YAAQ;AAAA,IACZ,MACE,gBAAgB,QAAQ,EAAE,IAAI,CAAC,OAAO,UAAU;AAC9C,YAAM;AAAA,QACJ,IAAI,SAAS,GAAG,EAAE,QAAQ,KAAK;AAAA,QAC/B,WAAW;AAAA,QACX,GAAG;AAAA,MACL,IAAI,MAAM;AACV,YAAM,WAAW,gBAAgB,SAAS,KAAK;AAC/C,aAAO,eAAAC,QAAM,aAAa,OAAO;AAAA,QAC/B,OAAG,8CAAqB,UAAU,SAAS;AAAA,QAC3C,eAAW,cAAAC,SAAG,kBAAkB,aAAa;AAAA,QAC7C,0BAA0B,WAAW,MAAM;AAAA,QAC3C,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,iBAAiB;AAAA,QACjB,UAAU,iBAAiB,QAAQ,IAAI;AAAA,MACzC,CAAC;AAAA,IACH,CAAC;AAAA,IACH,CAAC,iBAAiB,UAAU,cAAc,IAAI,SAAS;AAAA,EACzD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACH,GAAG,YAAY;AAAA,MAChB,eAAW,cAAAA,SAAG,WAAWF,aAAW,GAAGA,WAAS,IAAI,WAAW,IAAI;AAAA,QACjE,CAAC,GAAGA,WAAS,cAAc,GAAG,eAAe;AAAA,QAC7C,CAAC,GAAGA,WAAS,WAAW,GAAG,eAAe;AAAA,QAC1C,CAAC,GAAGA,WAAS,iBAAiB,GAAG;AAAA,MACnC,CAAC;AAAA,MACA,GAAG;AAAA,MACJ,KAAK;AAAA,MAEJ;AAAA;AAAA,EACH;AAEJ;;;AK3GA,IAAAG,iBAAgC;AAkC1B,IAAAC,uBAAA;AA5BC,IAAM,gBAAgB,CAAC,EAAE,SAAS,MAAW;AAClD,QAAM,aAAa;AACnB,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,QAAQ;AAC7C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,QAAQ;AAGnE,QAAM,kBAAkB,CAAC,iBAAsB;AAC7C,UAAM,kBAAkB,sBAAsB,QAAQ,YAAY;AAClE,yBAAqB,eAAe;AAAA,EACtC;AAGA,QAAM,eAAe,CAAC,UAAe,UAAe;AAClD,YAAQ,IAAI,UAAU,QAAQ,OAAO,KAAK,EAAE;AAE5C,UAAM,eAAe,eAAAC,QAAM,aAAa,mBAAmB;AAAA,MACzD,OAAO;AAAA,QACL,GAAG,kBAAkB,MAAM;AAAA,QAC3B,CAAC,QAAQ,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AACD,yBAAqB,YAAY;AACjC,cAAU,eAAAA,QAAM,aAAa,QAAQ,CAAC,GAAG,YAAY,CAAC;AAAA,EACxD;AAEA,SACE,+CAAC,SAAI,oBAAkB,GAAG,UAAU,IACjC;AAAA;AAAA,IACD,8CAAC,QAAG;AAAA,IACJ,+CAAC,SAAI,OAAO,EAAE,SAAS,OAAO,GAC5B;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,cAAc,kBAAkB,MAAM;AAAA,UACtC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA;AAAA,MACT;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU;AAAA,UACV,OAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,iBAAiB,OAAO;AAAA;AAAA,MAC5D;AAAA,OACF;AAAA,KAIF;AAEJ;;;ACrDA,IAAAC,eAAiC;AA4B3B,IAAAC,uBAAA;AA1BN,IAAMC,YAAW,CAAC;AAElB,IAAM,aAAa;AAAA,EACjB,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,IAAM,YAAY,CAAC,EAAE,SAAS,UAAU,OAAO,SAAS,MAAM;AAC5D,SACE,+CAAC,SAAI,WAAW,oBAAoB,OAAO,iBACzC;AAAA,mDAAC,SAAI,WAAW,cACd;AAAA,oDAAC,UAAK,WAAU,gBAAgB,mBAAQ;AAAA,MACxC,8CAAC,0BAAU,WAAU,gBAAe,OAAO,EAAE,OAAO,GAAG,GACrD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,CAAC,KAAK,UAAU,SAAS,SAAS,OAAO,KAAK;AAAA;AAAA,MAC1D,GACF;AAAA,OACF;AAAA,IACA,+CAAC,SAAI,WAAW,gBACd;AAAA,oDAAC,SAAI,WAAW,eACd,wDAAC,0BAAU,WAAU,gBAAe,OAAO,EAAE,OAAO,GAAG,GACrD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,CAAC,KAAK,UAAU,SAAS,SAAS,QAAQ,KAAK;AAAA;AAAA,MAC3D,GACF,GACF;AAAA,MACC;AAAA,MACD,8CAAC,SAAI,WAAW,gBACd,wDAAC,0BAAU,WAAU,gBAAe,OAAO,EAAE,OAAO,GAAG,GACrD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,CAAC,KAAK,UAAU,SAAS,SAAS,SAAS,KAAK;AAAA;AAAA,MAC5D,GACF,GACF;AAAA,OACF;AAAA,IACA,8CAAC,SAAI,WAAW,iBACd,wDAAC,0BAAU,WAAU,gBAAe,OAAO,EAAE,OAAO,GAAG,GACrD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM;AAAA,QACb,UAAU,CAAC,KAAK,UAAU,SAAS,SAAS,UAAU,KAAK;AAAA;AAAA,IAC7D,GACF,GACF;AAAA,KACF;AAEJ;AAEO,IAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AACd;AAEO,IAAM,iBAAiB;AAAA,EAC5B,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,aAAa;AACf;AAEO,IAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AACnB;AAEA,IAAM,YAAY;AAClB,IAAM,cAAc,OAAO,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS;AAC1F,IAAM,UAAU,IAAI,OAAO,WAAW;AACtC,IAAM,aAAa;AAEZ,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,eAAe,YAAY;AAEzC,QAAM,eAAe,CAAC,SAASC,YAAW,aAAa;AACrD,UAAM,QAAQ,SAAS,YAAY,KAAK,EAAE;AAC1C,UAAM,WAAW,WAAW,OAAO,EAAEA,UAAS;AAC9C,aAAS,UAAU,KAAK;AAAA,EAC1B;AAEA,QAAM;AAAA,IACJ,WAAW,KAAK;AAAA,IAChB,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,IACnB,YAAY,KAAK;AAAA,EACnB,IAAI;AACJ,QAAM;AAAA,IACJ,gBAAgB,KAAK;AAAA,IACrB,kBAAkB,KAAK;AAAA,IACvB,mBAAmB,KAAK;AAAA,IACxB,iBAAiB,KAAK;AAAA,EACxB,IAAI;AACJ,QAAM;AAAA,IACJ,YAAY,KAAK;AAAA,IACjB,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,aAAa,KAAK;AAAA,EACpB,IAAI;AACJ,SACE,8CAAC,SAAI,WAAU,sBAAqB,OAAO,EAAE,OAAO,QAAQ,GAAG,MAAM,GACnE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAO,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG;AAAA,MAClD,UAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG;AAAA,UAClD,UAAU;AAAA,UAEV;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAO,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG;AAAA,cAClD,UAAU;AAAA,cAEV,wDAAC,SAAI,WAAU,kBAAiB;AAAA;AAAA,UAClC;AAAA;AAAA,MACF;AAAA;AAAA,EACF,GACF;AAEJ;AAGO,SAAS,mBACd,cAAcD,WACd,cAAcA,WACd;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,YACJ,MAAM,cACN,MAAM,eACN,MAAM,aACJ;AAAA,EACN,WAAW,OAAO,WAAW,UAAU;AACrC,UAAM,QAAQ,QAAQ,KAAK,MAAM;AACjC,QAAI,UAAU,MAAM;AAClB,cAAQ,MAAM,iCAAiC,MAAM,GAAG;AAAA,IAC1D,OAAO;AACL,YAAM,CAAC,EAAE,MAAM,MAAM,MAAM,IAAI,IAAI;AACnC,YAAM,SAAS,QAAQ,QAAQ;AAC/B,UAAI,UAAU,MAAM;AAClB,cAAM,YAAY,SAAS,MAAM,EAAE;AACnC,cAAM,cAAc,SAAS,MAAM,EAAE;AACrC,cAAM,eAAe,SAAS,MAAM,EAAE;AACtC,cAAM,aAAa,SAAS,MAAM,EAAE;AAAA,MACtC,WAAW,QAAQ;AACjB,cAAM,YAAY,SAAS,MAAM,EAAE;AACnC,cAAM,cAAc,MAAM,aAAa,SAAS,MAAM,EAAE;AACxD,cAAM,eAAe,SAAS,MAAM,EAAE;AAAA,MACxC,WAAW,QAAQ,MAAM;AACvB,cAAM,YAAY,MAAM,eAAe,SAAS,MAAM,EAAE;AACxD,cAAM,cAAc,MAAM,aAAa,SAAS,MAAM,EAAE;AAAA,MAC1D,OAAO;AACL,cAAM,YACJ,MAAM,cACN,MAAM,eACN,MAAM,aACJ,SAAS,MAAM,EAAE;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,cAAc;AAAU,UAAM,YAAY;AACrD,MAAI,OAAO,gBAAgB;AAAU,UAAM,cAAc;AACzD,MAAI,OAAO,iBAAiB;AAAU,UAAM,eAAe;AAC3D,MAAI,OAAO,eAAe;AAAU,UAAM,aAAa;AAEvD,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,aACJ,MAAM,eACN,MAAM,gBACN,MAAM,cACJ;AAAA,EACN,WAAW,OAAO,YAAY,UAAU;AACtC,UAAM,QAAQ,QAAQ,KAAK,OAAO;AAClC,QAAI,UAAU,MAAM;AAClB,cAAQ,MAAM,kCAAkC,OAAO,GAAG;AAAA,IAC5D,OAAO;AACL,YAAM,CAAC,EAAE,MAAM,MAAM,MAAM,IAAI,IAAI;AACnC,YAAM,SAAS,QAAQ,QAAQ;AAC/B,UAAI,UAAU,MAAM;AAClB,cAAM,aAAa,SAAS,MAAM,EAAE;AACpC,cAAM,eAAe,SAAS,MAAM,EAAE;AACtC,cAAM,gBAAgB,SAAS,MAAM,EAAE;AACvC,cAAM,cAAc,SAAS,MAAM,EAAE;AAAA,MACvC,WAAW,QAAQ;AACjB,cAAM,aAAa,SAAS,MAAM,EAAE;AACpC,cAAM,eAAe,MAAM,cAAc,SAAS,MAAM,EAAE;AAC1D,cAAM,gBAAgB,SAAS,MAAM,EAAE;AAAA,MACzC,WAAW,QAAQ,MAAM;AACvB,cAAM,aAAa,MAAM,gBAAgB,SAAS,MAAM,EAAE;AAC1D,cAAM,eAAe,MAAM,cAAc,SAAS,MAAM,EAAE;AAAA,MAC5D,OAAO;AACL,cAAM,aACJ,MAAM,eACN,MAAM,gBACN,MAAM,eACJ,SAAS,MAAM,EAAE;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,eAAe;AAAU,UAAM,aAAa;AACvD,MAAI,OAAO,iBAAiB;AAAU,UAAM,eAAe;AAC3D,MAAI,OAAO,kBAAkB;AAAU,UAAM,gBAAgB;AAC7D,MAAI,OAAO,gBAAgB;AAAU,UAAM,cAAc;AAEzD,SAAO,eAAe,OAAO,WAAW;AAC1C;AAEA,SAAS,eAAe,eAAeA,WAAU;AAC/C,QAAM,QAAQ,EAAE,GAAG,aAAa;AAGhC,MAAI;AAEJ,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,MAAI,eAAe,CAAC;AACpB,MAAI,gBAAgB,CAAC;AAErB,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,YACJ,MAAM,cACN,MAAM,eACN,MAAM,aACJ;AACJ,mBAAe;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,aACJ,MAAM,eACN,MAAM,gBACN,MAAM,cACJ;AACJ,oBAAgB;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MACE,UACA,eACA,kBACA,oBACA,qBACA,iBACA;AACA,QAAI,OAAO,WAAW,aAAa,QAAQ,WAAW,KAAK,MAAM,IAAI;AAEnE,OAAC,EAAE,aAAa,WAAW,IAAI;AAC/B,oBAAc,SAAS,aAAa,EAAE;AAAA,IACxC;AAEA,QAAI,aAAa;AACf,uBACE,mBAAmB,SAAY,cAAc;AAC/C,yBACE,qBAAqB,SAAY,cAAc;AACjD,0BACE,sBAAsB,SAAY,cAAc;AAClD,wBACE,oBAAoB,SAAY,cAAc;AAAA,IAClD;AAEA,kBAAc,eAAe;AAC7B,UAAM,YAAY;AAAA,kBACJ,WAAW,IAAI,mBAAmB,CAAC,MAC/C,kBAAkB,CACpB;AAAA,kBACc,WAAW,IAAI,CAAC,oBAAoB,CAAC,MACjD,CAAC,qBAAqB,CACxB;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO;AAAA,EACT;AAIF;;;AChXA,IAAAE,iBAAkB;AAClB,IAAAC,gBAAe;AAIf,IAAAC,0BAAqB;AAuBf,IAAAC,uBAAA;AArBN,IAAM,gBAAgB;AAEtB,IAAM,aAAa,CAAC,WAAW,OAAO,QAAQ;AAC5C,SAAO;AAAA,IACL,OAAO,OAAO,SAAS;AAAA,IACvB;AAAA,IACA,YAAY,eAAAC,QAAM,SAAS;AAAA,MAAI,UAAU,MAAM;AAAA,MAAU,CAAC,OAAO,MAC/D,WAAW,OAAO,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;AAAA,IAClD;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB,CAAC,EAAE,QAAQ,UAAU,MAAM,MAAM;AAC/D,QAAM,WAAW,CAAC,WAAW,MAAM,CAAC;AAEpC,QAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM;AAC3C,aAAS,IAAI;AAAA,EACf;AAEA,SACE,8CAAC,SAAI,eAAW,cAAAC,SAAG,aAAa,GAAG,OACjC;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,gBAAe;AAAA,MACf,mBAAmB;AAAA;AAAA,EACrB,GACF;AAEJ;",
|
|
6
|
+
"names": ["import_clsx", "componentName", "cx", "import_jsx_runtime", "classBase", "cx", "import_react", "import_jsx_runtime", "Component", "import_react", "React", "path", "nextStep", "import_react", "import_vuu_utils", "rect", "left", "right", "header", "isTower", "isTerrace", "rect", "rect", "allBoxesContainingPoint", "_a", "clientRect", "import_clsx", "import_jsx_runtime", "classBase", "cx", "import_jsx_runtime", "path", "Stack", "SCALE_FACTOR", "import_clsx", "import_react", "import_jsx_runtime", "DraggableLayout", "classnames", "import_core", "import_clsx", "import_react", "import_vuu_utils", "import_react", "import_clsx", "import_core", "import_react", "import_react", "import_react", "import_vuu_utils", "import_react", "flexDirection", "dimension", "React", "import_react", "import_vuu_utils", "import_react", "import_vuu_utils", "import_react", "import_react", "React", "getStyle", "children", "React", "flexDirection", "dimension", "import_react", "import_react", "React", "import_react", "flexDirection", "children", "flexBasis", "display", "style", "path", "child", "React", "import_react", "React", "dimension", "import_vuu_utils", "import_react", "updateChildren", "React", "flexDirection", "dimension", "React", "import_react", "import_react", "rect", "import_jsx_runtime", "_a", "import_vuu_utils", "import_core", "import_clsx", "import_react", "import_core", "import_clsx", "import_react", "import_jsx_runtime", "classBase", "classnames", "cx", "import_react", "title", "import_react", "import_react", "dimension", "rect", "EMPTY_ARRAY", "import_react", "import_react", "React", "import_jsx_runtime", "classBase", "getProps", "View", "Header", "props", "React", "cx", "import_jsx_runtime", "classBase", "import_jsx_runtime", "classBase", "cx", "import_clsx", "import_react", "import_jsx_runtime", "classBase", "React", "Splitter", "onDragEnd", "cx", "breakPoints", "dimension", "dimension", "React", "index", "import_jsx_runtime", "classBase", "Flexbox", "breakPoints", "cx", "import_react", "import_jsx_runtime", "FlexboxLayout", "import_core", "import_clsx", "import_react", "import_vuu_utils", "import_react", "dimension", "buildContent", "children", "import_jsx_runtime", "classBase", "FluidGrid", "breakPoints", "cx", "import_jsx_runtime", "FluidGridLayout", "import_react", "import_vuu_utils", "import_react", "import_react", "observedMap", "getTargetSize", "dimension", "resizeObserver", "useResizeObserver", "WidthOnly", "HeightOnly", "NO_MEASUREMENT", "useResizeObserver", "import_core", "import_clsx", "import_jsx_runtime", "MeasuredContainer", "getStyle", "cx", "import_vuu_popups", "import_vuu_utils", "import_clsx", "import_react", "import_vuu_ui_controls", "import_vuu_utils", "import_react", "import_vuu_utils", "classBase", "resizeObserver", "useDragDrop", "import_jsx_runtime", "classBase", "React", "PopupMenuProps", "cx", "OverflowContainer", "import_vuu_utils", "import_vuu_ui_controls", "import_clsx", "import_react", "import_jsx_runtime", "cx", "ListProps", "ViewProps", "classBase", "props", "import_vuu_ui_controls", "import_vuu_utils", "import_clsx", "import_react", "import_jsx_runtime", "classBase", "React", "Stack", "TabstripProps", "_a", "child", "cx", "import_vuu_utils", "import_react", "import_jsx_runtime", "path", "React", "id", "import_vuu_ui_controls", "import_vuu_utils", "import_clsx", "import_react", "import_vuu_utils", "import_react", "import_core", "import_vuu_utils", "import_react", "import_vuu_utils", "import_vuu_utils", "import_vuu_ui_controls", "import_react", "import_jsx_runtime", "classBase", "React", "cx", "import_react", "import_jsx_runtime", "React", "import_core", "import_jsx_runtime", "NO_STYLE", "dimension", "import_react", "import_clsx", "import_vuu_ui_controls", "import_jsx_runtime", "React", "cx"]
|
|
7
7
|
}
|