@vuu-ui/vuu-shell 0.8.7 → 0.8.8-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 +8824 -5
- package/cjs/index.js.map +4 -4
- package/esm/index.js +8919 -5
- package/esm/index.js.map +4 -4
- package/index.css +1309 -1
- package/index.css.map +3 -3
- package/package.json +6 -6
- package/types/vuu-shell/src/shell-layouts/context-panel/ContextPanel.d.ts +3 -2
- package/LICENSE +0 -201
- package/types/vuu-popups/src/dialog/Dialog.d.ts +0 -7
- package/types/vuu-popups/src/dialog/index.d.ts +0 -1
- package/types/vuu-popups/src/index.d.ts +0 -5
- package/types/vuu-popups/src/menu/ContextMenu.d.ts +0 -15
- package/types/vuu-popups/src/menu/MenuList.d.ts +0 -43
- package/types/vuu-popups/src/menu/context-menu-provider.d.ts +0 -10
- package/types/vuu-popups/src/menu/index.d.ts +0 -4
- package/types/vuu-popups/src/menu/key-code.d.ts +0 -12
- package/types/vuu-popups/src/menu/list-dom-utils.d.ts +0 -4
- package/types/vuu-popups/src/menu/use-cascade.d.ts +0 -25
- package/types/vuu-popups/src/menu/use-items-with-ids-next.d.ts +0 -13
- package/types/vuu-popups/src/menu/use-keyboard-navigation.d.ts +0 -26
- package/types/vuu-popups/src/menu/useContextMenu.d.ts +0 -13
- package/types/vuu-popups/src/menu/utils.d.ts +0 -2
- package/types/vuu-popups/src/popup/index.d.ts +0 -1
- package/types/vuu-popups/src/popup/popup-service.d.ts +0 -55
- package/types/vuu-popups/src/popup-menu/PopupMenu.d.ts +0 -14
- package/types/vuu-popups/src/popup-menu/index.d.ts +0 -1
- package/types/vuu-popups/src/portal/Portal.d.ts +0 -8
- package/types/vuu-popups/src/portal/index.d.ts +0 -3
- package/types/vuu-popups/src/portal/portal-utils.d.ts +0 -1
- package/types/vuu-popups/src/portal/render-portal.d.ts +0 -10
package/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/vuu-shell/src/index.ts", "../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.tsx", "../../../packages/vuu-shell/src/density-switch/DensitySwitch.tsx", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/feature/css-module-loader.ts", "../../../packages/vuu-shell/src/layout-management/SaveLayoutPanel.tsx", "../../../packages/vuu-icons/src/VuuLogo.tsx", "../../../packages/vuu-shell/src/left-nav/LeftNav.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/DragDropProvider.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useDragDropNaturalMovementNext.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useDragDisplacers.ts", "../../../packages/vuu-ui-controls/src/drag-drop/drop-target-utils.ts", "../../../packages/vuu-ui-controls/src/drag-drop/Draggable.tsx", "../../../
|
|
4
|
-
"sourcesContent": ["export * from \"./connection-status\";\nexport * from \"./density-switch\";\nexport * from \"./feature\";\nexport * from \"./layout-management\";\nexport * from \"./left-nav\";\nexport * from \"./login\";\nexport * from \"./session-editing-form\";\nexport * from \"./shell\";\nexport * from \"./shell-layouts\";\nexport * from \"./shellTypes\";\nexport * from \"./ShellContextProvider\";\nexport * from \"./theme-provider\";\nexport * from \"./theme-switch\";\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 } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\nconst componentsMap = new Map();\n\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 return componentsMap.get(url);\n};\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n console.log(\"Feature render\", { css, url, props });\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 <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</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\">loading</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 \"./SaveLayoutPanel.css\";\nexport const SaveLayoutPanel = () => {\n const classBase = \"vuuSaveLayoutPanel\";\n return <div className={classBase}>save layout</div>;\n};\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 { Action, 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 {\n CSSProperties,\n HTMLAttributes,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { useThemeAttributes } from \"../theme-provider\";\n\nimport \"./LeftNav.css\";\n\nconst classBase = \"vuuLeftNav\";\n\ninterface LeftNavProps extends HTMLAttributes<HTMLDivElement> {\n \"data-path\"?: string;\n onResize?: (size: number) => void;\n open?: boolean;\n sizeCollapsed?: number;\n sizeContent?: number;\n sizeExpanded?: number;\n}\n\ntype NavStatus = \"menu-full\" | \"menu-icons\" | \"menu-content\";\ntype NavState = {\n activeTabIndex: number;\n navStatus: NavStatus;\n};\n\nexport const LeftNav = ({\n \"data-path\": path,\n onResize,\n open = true,\n sizeCollapsed = 80,\n sizeContent = 240,\n sizeExpanded = 240,\n style: styleProp,\n ...htmlAttributes\n}: LeftNavProps) => {\n const dispatch = useLayoutProviderDispatch();\n const openRef = useRef(open);\n const [navState, setNavState] = useState<NavState>({\n activeTabIndex: 0,\n navStatus: \"menu-full\",\n });\n const [themeClass] = useThemeAttributes();\n\n const getWidthAndStatus = useCallback(\n (isOpen: boolean, tabIndex: number): [number, NavStatus] => {\n switch (tabIndex) {\n case 0:\n return isOpen\n ? [sizeExpanded, \"menu-full\"]\n : [sizeCollapsed, \"menu-icons\"];\n default:\n return [sizeCollapsed + sizeContent, \"menu-content\"];\n }\n },\n [sizeCollapsed, sizeContent, sizeExpanded]\n );\n\n const handleTabSelection = useCallback(\n (value: number) => {\n const [width, navStatus] = getWidthAndStatus(openRef.current, value);\n setNavState({\n activeTabIndex: value,\n navStatus,\n });\n dispatch({\n type: Action.LAYOUT_RESIZE,\n path,\n size: width,\n } as LayoutResizeAction);\n },\n [dispatch, getWidthAndStatus, path]\n );\n\n const toggleSize = useCallback(() => {\n openRef.current = !openRef.current;\n setNavState(({ activeTabIndex, navStatus }) => ({\n activeTabIndex,\n navStatus: navStatus === \"menu-icons\" ? \"menu-full\" : \"menu-icons\",\n }));\n dispatch({\n type: Action.LAYOUT_RESIZE,\n path,\n size: openRef.current ? 240 : 80,\n } as LayoutResizeAction);\n }, [dispatch, path]);\n\n const style = {\n ...styleProp,\n \"--nav-menu-collapsed-width\": `${sizeCollapsed}px`,\n \"--nav-menu-expanded-width\": `${sizeExpanded}px`,\n } as CSSProperties;\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, `${classBase}-${navState.navStatus}`)}\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=\"tables\" label=\"VUU TABLES\"></Tab>\n <Tab data-icon=\"templates\" label=\"LAYOUT TEMPLATES\"></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\": openRef.current,\n \"vuuLeftNav-toggleButton-closed\": !openRef.current,\n })}\n data-icon={openRef.current ? \"chevron-left\" : \"chevron-right\"}\n onClick={toggleSize}\n />\n </div>\n </div>\n <Stack\n active={navState.activeTabIndex - 1}\n className={`${classBase}-menu-secondary`}\n showTabs={false}\n >\n <div style={{ background: \"yellow\", height: \"100%\" }}>VUU Tables</div>\n <div style={{ background: \"green\", height: \"100%\" }}>\n Layout Templates\n </div>\n <div style={{ background: \"red\", height: \"100%\" }}>My Layouts</div>\n </Stack>\n </div>\n );\n};\n", "import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n} from \"react\";\n\nconst NO_DRAG_CONTEXT = {\n isDragSource: false,\n isDropTarget: false,\n register: () => undefined,\n};\n\nconst unconfiguredRegistrationCall = () =>\n console.log(`have you forgotten to provide a DragDrop Provider ?`);\n\nexport interface DragDropContextProps {\n dragSources?: Map<string, string[]>;\n dropTargets?: Map<string, string[]>;\n registerDragDropParty: (id: string) => void;\n}\n\nconst DragDropContext = createContext<DragDropContextProps>({\n registerDragDropParty: unconfiguredRegistrationCall,\n});\n\nexport type DragSources = { [key: string]: { dropTargets: string | string[] } };\nexport interface DragDropProviderProps {\n children: ReactNode;\n dragSources: DragSources;\n}\n\nexport const DragDropProvider = ({\n children,\n dragSources: dragSourcesProp,\n}: DragDropProviderProps) => {\n const [dragSources, dropTargets] = useMemo(() => {\n const sources = new Map<string, string[]>();\n const targets = new Map<string, string[]>();\n\n for (const [sourceId, { dropTargets }] of Object.entries(dragSourcesProp)) {\n const sourceEntry = sources.get(sourceId);\n const targetIds = Array.isArray(dropTargets)\n ? dropTargets\n : [dropTargets];\n if (sourceEntry) {\n sourceEntry.push(...targetIds);\n } else {\n sources.set(sourceId, targetIds);\n }\n for (const targetId of targetIds) {\n const targetEntry = targets.get(targetId);\n if (targetEntry) {\n targetEntry.push(sourceId);\n } else {\n targets.set(targetId, [sourceId]);\n }\n }\n }\n return [sources, targets];\n }, [dragSourcesProp]);\n\n console.log({\n dragSources,\n dropTargets,\n });\n\n const registerDragDropParty = useCallback((id: string) => {\n console.log(`registerDragDropParty ${id}`);\n }, []);\n\n const contextValue: DragDropContextProps = useMemo(\n () => ({\n dragSources,\n dropTargets,\n registerDragDropParty,\n }),\n [dragSources, dropTargets, registerDragDropParty]\n );\n\n return (\n <DragDropContext.Provider value={contextValue}>\n {children}\n </DragDropContext.Provider>\n );\n};\n\nexport interface DragDropProviderResult {\n isDragSource: boolean;\n isDropTarget: boolean;\n register: (id: string) => void;\n}\n\nexport const useDragDropProvider = (id?: string): DragDropProviderResult => {\n const { dragSources, dropTargets, registerDragDropParty } =\n useContext(DragDropContext);\n if (id) {\n const isDragSource = dragSources?.has(id) ?? false;\n const isDropTarget = dropTargets?.has(id) ?? false;\n\n return {\n isDragSource,\n isDropTarget,\n register: registerDragDropParty,\n };\n } else {\n return NO_DRAG_CONTEXT;\n }\n};\n", "import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n Direction,\n InternalDragDropProps,\n InternalDragHookResult,\n ViewportRange,\n} from \"./dragDropTypesNext\";\nimport { useDragDisplacers } from \"./useDragDisplacers\";\n\nimport {\n dimensions,\n getIndexOfDraggedItem,\n getNextDropTarget,\n MeasuredDropTarget,\n measureDropTargets,\n NOT_HIDDEN,\n NOT_OVERFLOWED,\n} from \"./drop-target-utils\";\n\nexport const useDragDropNaturalMovement = ({\n draggableRef,\n onDrop,\n orientation = \"horizontal\",\n containerRef,\n itemQuery = \"*\",\n selected,\n viewportRange,\n}: InternalDragDropProps): InternalDragHookResult => {\n const dragDirectionRef = useRef<Direction | undefined>();\n\n const isScrollable = useRef(false);\n /** current position of dragged element */\n const dragPosRef = useRef<number>(-1);\n const measuredDropTargets = useRef<MeasuredDropTarget[]>([]);\n const overflowMenuShowingRef = useRef(false);\n\n const [showOverflow, setShowOverflow] = useState(false);\n\n const { clearSpacers, displaceItem, displaceLastItem } = useDragDisplacers();\n\n const draggedItemRef = useRef<MeasuredDropTarget>();\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED}${NOT_HIDDEN},.vuuOverflowContainer-OverflowIndicator)`;\n\n // const { setMeasurements: setVizData } = useListViz();\n\n const indexOf = (dropTarget: MeasuredDropTarget) =>\n measuredDropTargets.current.findIndex((d) => d.id === dropTarget.id);\n\n // Shouldn't need this - but viewportRange is always stale in stopScrolling. Checked all dependencies\n // look ok. Something to do with setTimeout / scrollHandler ?\n const rangeRef = useRef<ViewportRange>();\n rangeRef.current = viewportRange;\n\n const handleScrollStart = useCallback(() => {\n clearSpacers();\n }, [clearSpacers]);\n\n const handleScrollStop = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", _scrollPos: number, atEnd: boolean) => {\n const { current: container } = containerRef;\n const { current: draggedItem } = draggedItemRef;\n if (container && draggedItem) {\n measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n rangeRef.current\n );\n\n // setVizData?.(measuredDropTargets.current);\n\n const { size } = draggedItem;\n const dragPos = dragPosRef.current;\n const midPos = dragPos + size / 2;\n const { current: dropTargets } = measuredDropTargets;\n const dropTarget = getNextDropTarget(dropTargets, midPos, \"fwd\");\n\n if (dropTarget) {\n const targetIndex = indexOf(dropTarget);\n const nextInsertPos = targetIndex;\n const nextDropTarget = dropTargets[nextInsertPos];\n\n if (atEnd && scrollDirection === \"fwd\") {\n displaceLastItem(\n dropTargets,\n dropTargets[dropTargets.length - 1],\n size,\n false,\n \"static\",\n orientation\n );\n } else {\n displaceItem(\n dropTargets,\n nextDropTarget,\n size,\n true,\n \"static\",\n orientation\n );\n }\n // setVizData?.(\n // measuredDropTargets.current,\n // nextDropTarget,\n // dropZoneRef.current\n // );\n }\n }\n },\n [\n containerRef,\n displaceItem,\n displaceLastItem,\n fullItemQuery,\n orientation,\n // setVizData,\n ]\n );\n\n const beginDrag = useCallback(\n (evt: MouseEvent) => {\n const evtTarget = evt.target as HTMLElement;\n const dragElement = evtTarget.closest(itemQuery) as HTMLElement;\n if (\n //TODO need a different check for selected\n dragElement.ariaSelected &&\n Array.isArray(selected) &&\n selected.length > 1\n ) {\n console.log(\"its a selected element, and we have a multi select\");\n }\n const { current: container } = containerRef;\n if (container && dragElement) {\n const { SCROLL_SIZE, CLIENT_SIZE } = dimensions(orientation);\n const { id: draggedItemId } = dragElement;\n\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n container;\n isScrollable.current = scrollSize > clientSize;\n const dropTargets = (measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n viewportRange,\n draggedItemId\n ));\n\n console.log({ dropTargets });\n\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const draggedItem = dropTargets[indexOfDraggedItem];\n\n if (draggedItem && container) {\n draggedItemRef.current = draggedItem;\n\n const displaceFunction = draggedItem.isLast\n ? displaceLastItem\n : displaceItem;\n\n // setVizData?.(dropTargets, displacedItem, dropZone);\n\n displaceFunction(\n dropTargets,\n draggedItem,\n draggedItem.size,\n false,\n \"static\",\n orientation\n );\n }\n }\n },\n [\n containerRef,\n displaceItem,\n displaceLastItem,\n fullItemQuery,\n itemQuery,\n orientation,\n selected,\n // setVizData,\n viewportRange,\n ]\n );\n\n const [showPopup, hidePopup] = useMemo(() => {\n let popupShowing = false;\n const show = (dropTarget: MeasuredDropTarget) => {\n if (!popupShowing) {\n popupShowing = true;\n const button = dropTarget.element.querySelector(\".vuuPopupMenu\");\n if (button) {\n const evt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n button.dispatchEvent(evt);\n }\n }\n };\n\n const hide = (dropTarget: MeasuredDropTarget) => {\n if (popupShowing) {\n popupShowing = false;\n const button = dropTarget.element.querySelector(\".vuuPopupMenu\");\n if (button) {\n const evt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n button.dispatchEvent(evt);\n }\n }\n };\n\n return [show, hide];\n }, []);\n\n const drag = useCallback(\n (dragPos: number, mouseMoveDirection: \"fwd\" | \"bwd\") => {\n const { current: draggedItem } = draggedItemRef;\n\n if (draggedItem) {\n if (draggableRef.current && containerRef.current) {\n dragPosRef.current = dragPos;\n\n const { current: dropTargets } = measuredDropTargets;\n const nextDropTarget = getNextDropTarget(\n dropTargets,\n dragPos,\n mouseMoveDirection\n );\n\n if (nextDropTarget && !nextDropTarget.isDraggedItem) {\n if (nextDropTarget.isOverflowIndicator) {\n // Does this belong in here or can we abstract it out\n setShowOverflow((overflowMenuShowingRef.current = true));\n showPopup(nextDropTarget);\n } else {\n const { size } = draggedItem;\n const targetIndex = indexOf(nextDropTarget);\n\n const displaceFunc =\n targetIndex === dropTargets.length - 1\n ? displaceLastItem\n : displaceItem;\n\n displaceFunc(\n dropTargets,\n nextDropTarget,\n size,\n true,\n mouseMoveDirection,\n orientation\n );\n // setVizData?.(dropTargets, nextDropTarget, nextDropZone);\n\n const overflowIndicator = dropTargets.at(\n -1\n ) as MeasuredDropTarget;\n hidePopup(overflowIndicator);\n setShowOverflow((overflowMenuShowingRef.current = false));\n }\n }\n\n dragDirectionRef.current = mouseMoveDirection;\n }\n }\n },\n [\n containerRef,\n displaceItem,\n displaceLastItem,\n draggableRef,\n hidePopup,\n orientation,\n showPopup,\n ]\n );\n\n const drop = useCallback(() => {\n clearSpacers();\n\n const { current: dropTargets } = measuredDropTargets;\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const draggedItem = dropTargets[indexOfDraggedItem];\n\n if (draggedItem) {\n dragDirectionRef.current = undefined;\n\n if (overflowMenuShowingRef.current) {\n onDrop(draggedItem.index, -1);\n } else {\n onDrop(draggedItem.index, indexOfDraggedItem);\n }\n }\n setShowOverflow(false);\n\n if (containerRef.current) {\n // TODO we're not catching every scenario where we need to control\n // the final scroll position here.\n const scrollTop = containerRef.current?.scrollTop;\n if (indexOfDraggedItem < dropTargets.length) {\n containerRef.current.scrollTop = scrollTop;\n }\n }\n }, [clearSpacers, containerRef, onDrop]);\n\n return {\n beginDrag,\n drag,\n drop,\n handleScrollStart,\n handleScrollStop,\n revealOverflowedItems: showOverflow,\n };\n};\n", "import { useCallback, useMemo, useRef } from \"react\";\nimport {\n MeasuredDropTarget,\n mutateDropTargetsSwitchDropTargetPosition,\n} from \"./drop-target-utils\";\nimport { createDragSpacer as createDragDisplacer } from \"./Draggable\";\nimport { Direction } from \"./dragDropTypesNext\";\n\nexport type DragDisplacersHookResult = {\n displaceItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\"\n ) => void;\n displaceLastItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\"\n ) => void;\n clearSpacers: () => void;\n};\n\nexport type DragDisplacersHook = () => DragDisplacersHookResult;\n/**\n * Manage a pair of displacer elements to smoothly display a moving gap between\n * list items of any kind. Designed to be used in a drag drop operation. The 'static'\n * direction option should be used at drag start or following scroll.\n */\nexport const useDragDisplacers: DragDisplacersHook = () => {\n const animationFrame = useRef(0);\n const transitioning = useRef(false);\n\n const spacers = useMemo(\n // We only need to listen for transition end on one of the spacers\n () => [createDragDisplacer(transitioning), createDragDisplacer()],\n []\n );\n\n const clearSpacers = useCallback(\n () => spacers.forEach((spacer) => spacer.remove()),\n [spacers]\n );\n\n const animateTransition = useCallback(\n (size: number, propertyName = \"width\") => {\n const [spacer1, spacer2] = spacers;\n animationFrame.current = requestAnimationFrame(() => {\n transitioning.current = true;\n spacer1.style.cssText = `${propertyName}: 0px`;\n spacer2.style.cssText = `${propertyName}: ${size}px`;\n spacers[0] = spacer2;\n spacers[1] = spacer1;\n });\n },\n [spacers]\n );\n\n const cancelAnyPendingAnimation = useCallback(() => {\n if (animationFrame.current) {\n cancelAnimationFrame(animationFrame.current);\n animationFrame.current = 0;\n }\n }, []);\n\n const displaceItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n orientation: \"horizontal\" | \"vertical\" = \"horizontal\"\n ) => {\n if (dropTarget) {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n cancelAnyPendingAnimation();\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n if (direction === \"fwd\") {\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.after(spacer1);\n dropTarget.element.before(spacer2);\n }\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else if (direction === \"static\") {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.before(spacer1);\n } else {\n throw Error(\n \"useDragDisplacers currently only supports noTransition for static displacement\"\n );\n }\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n }\n },\n [animateTransition, cancelAnyPendingAnimation, clearSpacers, spacers]\n );\n const displaceLastItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n orientation: \"horizontal\" | \"vertical\" = \"horizontal\"\n ) => {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n\n cancelAnyPendingAnimation();\n\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.after(spacer1);\n }\n\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n },\n [animateTransition, cancelAnyPendingAnimation, clearSpacers, spacers]\n );\n\n return {\n displaceItem,\n displaceLastItem,\n clearSpacers,\n };\n};\n", "import { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { ViewportRange } from \"./dragDropTypesNext\";\nimport { Direction, Rect } from \"./dragDropTypesNext\";\n\nconst LEFT_RIGHT = [\"left\", \"right\"];\nconst TOP_BOTTOM = [\"top\", \"bottom\"];\n// duplicated in repsonsive\n\nexport const NOT_OVERFLOWED = \":not(.wrapped)\";\nexport const NOT_HIDDEN = ':not([aria-hidden=\"true\"])';\n\nexport type MeasuredDropTarget = {\n /** \n The index position currently occupied by this item. If draggable \n is dropped here, this will be the destination drop position.\n */\n currentIndex: number;\n dataIndex?: number;\n element: HTMLElement;\n id: string;\n index: number;\n isDraggedItem: boolean;\n isLast?: boolean;\n isOverflowIndicator?: boolean;\n start: number;\n end: number;\n mid: number;\n size: number;\n};\n\nexport type targetType = {\n element: HTMLElement | null;\n index: number;\n isLast?: boolean;\n};\n\n/** clones and removes id */\nexport const cloneElement = <T extends HTMLElement>(element: T): T => {\n const dolly = element.cloneNode(true) as T;\n // TOSO should we care about nested id values - perhaps an additional param, defaulting to false ?\n dolly.removeAttribute(\"id\");\n // Set index to -1 in case a moueMove event as we wait for drop to take effect might set highlighted\n // index to wrong value (see useList) -1 will be ignored;\n dolly.dataset.index = \"-1\";\n return dolly;\n};\n\ntype MousePosKey = keyof Pick<MouseEvent, \"clientX\" | \"clientY\">;\ntype DOMRectKey = keyof Omit<DOMRect, \"toJSON\">;\ntype DOMRectDimensionKey = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype Dimension = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype ElementDimension = keyof Pick<\n HTMLElement,\n | \"scrollHeight\"\n | \"scrollWidth\"\n | \"clientHeight\"\n | \"clientWidth\"\n | \"scrollTop\"\n | \"scrollLeft\"\n>;\n\ntype ElementPosition = \"x\" | \"y\";\n\nexport const measureElementSizeAndPosition = (\n element: HTMLElement,\n dimension: Dimension = \"width\",\n includeAutoMargin = false\n) => {\n const pos = dimension === \"width\" ? \"left\" : \"top\";\n const { [dimension]: size, [pos]: position } =\n element.getBoundingClientRect();\n const { padEnd = false, padStart = false } = element.dataset;\n const style = getComputedStyle(element);\n const [start, end] = dimension === \"width\" ? LEFT_RIGHT : TOP_BOTTOM;\n const marginStart =\n padStart && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${start}`), 10);\n const marginEnd =\n padEnd && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${end}`), 10);\n\n let minWidth = size;\n const flexShrink = parseInt(style.getPropertyValue(\"flex-shrink\"), 10);\n if (flexShrink > 0) {\n const flexBasis = parseInt(style.getPropertyValue(\"flex-basis\"), 10);\n if (!isNaN(flexBasis) && flexBasis > 0) {\n minWidth = flexBasis;\n }\n }\n return [position, marginStart + minWidth + marginEnd];\n};\n\nconst DIMENSIONS = {\n horizontal: {\n CLIENT_POS: \"clientX\" as MousePosKey,\n CLIENT_SIZE: \"clientWidth\" as ElementDimension,\n CONTRA: \"top\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientY\" as MousePosKey,\n CONTRA_END: \"bottom\" as DOMRectDimensionKey,\n CONTRA_POS: \"y\" as ElementPosition,\n DIMENSION: \"width\" as DOMRectDimensionKey,\n END: \"right\" as DOMRectKey,\n POS: \"x\" as ElementPosition,\n SCROLL_POS: \"scrollLeft\" as ElementDimension,\n SCROLL_SIZE: \"scrollWidth\" as ElementDimension,\n START: \"left\" as DOMRectKey,\n },\n vertical: {\n CLIENT_POS: \"clientY\" as MousePosKey,\n CLIENT_SIZE: \"clientHeight\" as ElementDimension,\n CONTRA: \"left\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientX\" as MousePosKey,\n CONTRA_END: \"right\" as DOMRectDimensionKey,\n CONTRA_POS: \"x\" as ElementPosition,\n DIMENSION: \"height\" as DOMRectDimensionKey,\n END: \"bottom\" as DOMRectKey,\n POS: \"y\" as ElementPosition,\n SCROLL_POS: \"scrollTop\" as ElementDimension,\n SCROLL_SIZE: \"scrollHeight\" as ElementDimension,\n START: \"top\" as DOMRectKey,\n },\n};\nexport const dimensions = (orientation: orientationType) =>\n DIMENSIONS[orientation];\n\nexport const getItemById = (\n measuredItems: MeasuredDropTarget[],\n id: string\n) => {\n const result = measuredItems.find((item) => item.id === id);\n if (result) {\n return result;\n }\n // else {\n // throw Error(`measuredItems do not contain an item with id #${id}`);\n // }\n};\n\nexport const removeDraggedItem = (\n measuredItems: MeasuredDropTarget[],\n index: number\n) => {\n measuredItems.splice(index, 1);\n for (let i = index; i < measuredItems.length; i++) {\n measuredItems[i].currentIndex -= 1;\n }\n};\n\nexport type dropZone = \"start\" | \"end\";\n\nexport const measureDropTargets = (\n container: HTMLElement,\n orientation: orientationType,\n itemQuery?: string,\n viewportRange?: ViewportRange,\n draggedItemId?: string\n) => {\n const dragThresholds: MeasuredDropTarget[] = [];\n const { DIMENSION } = dimensions(orientation);\n const children = Array.from(\n itemQuery ? container.querySelectorAll(itemQuery) : container.children\n );\n\n const itemCount = children.length;\n const start =\n typeof viewportRange?.from === \"number\"\n ? viewportRange.atEnd\n ? Math.max(0, viewportRange.from - 1)\n : viewportRange.from\n : 0;\n const end =\n typeof viewportRange?.to === \"number\"\n ? Math.min(viewportRange.to + 2, itemCount - 1)\n : itemCount - 1;\n for (let index = start; index <= end; index++) {\n const element = children[index] as HTMLElement;\n const [start, size] = measureElementSizeAndPosition(element, DIMENSION);\n const isLast = index === itemCount - 1;\n const id = element.id;\n\n const dataIndex = parseInt(element.dataset.index ?? \"-1\");\n\n dragThresholds.push({\n currentIndex: index,\n dataIndex: isNaN(dataIndex) ? -1 : dataIndex,\n id,\n index,\n isDraggedItem: draggedItemId === id,\n isLast,\n isOverflowIndicator: element.dataset.index === \"overflow\",\n element: element as HTMLElement,\n start,\n end: start + size,\n size,\n mid: start + size / 2,\n });\n }\n return dragThresholds;\n};\n\nexport const getIndexOfDraggedItem = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets.findIndex((d) => d.isDraggedItem);\n\n// As the draggedItem is moved, displacing existing items, mirror\n// the movements within the dropTargets collection\nexport const mutateDropTargetsSwitchDropTargetPosition = (\n dropTargets: MeasuredDropTarget[],\n direction: Direction\n) => {\n // console.log(`switchDropTargetPosition\n // direction: ${direction} ${dropTargetsDebugString(dropTargets)}`);\n\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const indexOfTarget =\n direction === \"fwd\" ? indexOfDraggedItem + 1 : indexOfDraggedItem - 1;\n\n if (indexOfTarget < 0 || indexOfTarget >= dropTargets.length) {\n throw Error(\"switchDropTargetPosition index out of range\");\n }\n\n const draggedItem = dropTargets.at(indexOfDraggedItem) as MeasuredDropTarget;\n const targetItem = dropTargets.at(indexOfTarget) as MeasuredDropTarget;\n\n const diff = targetItem.size - draggedItem.size;\n\n if (direction === \"fwd\") {\n const draggedStart = targetItem.start + diff;\n const draggedEnd = targetItem.end;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start;\n const targetEnd = draggedItem.end + diff;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfDraggedItem, 2, newTargetItem, newDraggedItem);\n } else {\n const draggedStart = targetItem.start;\n const draggedEnd = targetItem.end - diff;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start - diff;\n const targetEnd = draggedItem.end;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfTarget, 2, newDraggedItem, newTargetItem);\n }\n\n // console.log(`${direction} ${dropTargetsDebugString(dropTargets)}`);\n};\n\nexport const getNextDropTarget = (\n dropTargets: MeasuredDropTarget[],\n pos: number,\n mouseMoveDirection: Direction\n): MeasuredDropTarget => {\n const len = dropTargets.length;\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const draggedItem = dropTargets[indexOfDraggedItem];\n\n if (mouseMoveDirection === \"fwd\") {\n const leadingEdge = Math.round(pos + draggedItem.size);\n for (let index = len - 1; index >= 0; index--) {\n const dropTarget = dropTargets[index];\n if (leadingEdge > dropTarget.mid) {\n if (index < indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n } else {\n const leadingEdge = Math.round(pos);\n for (let index = 0; index < len; index++) {\n const dropTarget = dropTargets[index];\n if (leadingEdge < dropTarget.mid) {\n if (index > indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n }\n throw Error(\"no dropTraget identified\");\n};\n\n/**\n * An item within a scrollable container might have a width or height greater than that of\n * the container. If we drag such an item, we don't want the draggable to be larger than\n * the container.\n */\nexport function constrainRect(targetRect: Rect, constraintRect: Rect): Rect {\n const { height, left, top, width } = targetRect;\n const { height: constrainedHeight, width: constrainedWidth } = constraintRect;\n return {\n height: Math.min(height, constrainedHeight),\n left,\n top,\n width: Math.min(width, constrainedWidth),\n };\n}\n\nexport const moveItem = <T = unknown>(\n items: T[],\n fromIndex: number,\n toIndex: number\n): T[] => {\n if (fromIndex === toIndex) {\n return items;\n } else {\n const newItems = items.slice();\n const [item] = newItems.splice(fromIndex, 1);\n if (toIndex === -1) {\n return newItems.concat(item);\n } else {\n const offset = toIndex > fromIndex ? 0 : 0;\n newItems.splice(toIndex + offset, 0, item);\n return newItems;\n }\n }\n};\n\nexport const dropTargetsDebugString = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets\n .map(\n (d, i) =>\n `\\n${d.isDraggedItem ? \"*\" : \" \"}[${i}] width : ${Math.floor(\n d.size\n )} ${Math.floor(d.start)} - ${Math.floor(d.end)} (mid ${Math.floor(\n d.mid\n )})`\n )\n .join(\"\");\n", "import { useForkRef } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n CSSProperties,\n forwardRef,\n MutableRefObject,\n TransitionEventHandler,\n useCallback,\n} from \"react\";\nimport { Portal } from \"@vuu-ui/vuu-popups\";\n\nimport \"./Draggable.css\";\n\nconst makeClassNames = (classNames: string) =>\n classNames.split(\" \").map((className) => `vuuDraggable-${className}`);\nexport const Draggable = forwardRef<\n HTMLDivElement,\n {\n wrapperClassName: string;\n element: HTMLElement;\n onTransitionEnd?: TransitionEventHandler;\n scale?: number;\n style: CSSProperties;\n }\n>(function Draggable(\n { wrapperClassName, element, onTransitionEnd, style, scale = 1 },\n forwardedRef\n) {\n const callbackRef = useCallback(\n (el: HTMLDivElement) => {\n if (el) {\n el.innerHTML = \"\";\n el.appendChild(element);\n if (scale !== 1) {\n el.style.transform = `scale(${scale},${scale})`;\n }\n }\n },\n [element, scale]\n );\n const forkedRef = useForkRef<HTMLDivElement>(forwardedRef, callbackRef);\n\n return (\n <Portal>\n <div\n className={clsx(\"vuuDraggable\", ...makeClassNames(wrapperClassName))}\n ref={forkedRef}\n onTransitionEnd={onTransitionEnd}\n style={style}\n />\n </Portal>\n );\n});\n\n// const colors = [\"black\", \"red\", \"green\", \"yellow\"];\n// let color_idx = 0;\nexport const createDragSpacer = (\n transitioning?: MutableRefObject<boolean>\n): HTMLElement => {\n // const idx = color_idx++ % 4;\n\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-spacer\";\n if (transitioning) {\n spacer.addEventListener(\"transitionend\", () => {\n transitioning.current = false;\n });\n }\n return spacer;\n};\n\nexport const createDropIndicatorPosition = (): HTMLElement => {\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-dropIndicatorPosition\";\n return spacer;\n};\n\nexport const createDropIndicator = (\n transitioning?: MutableRefObject<boolean>\n): HTMLElement => {\n // const idx = color_idx++ % 4;\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-dropIndicator\";\n if (transitioning) {\n spacer.addEventListener(\"transitionend\", () => {\n transitioning.current = false;\n });\n }\n return spacer;\n};\n", "function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;", "import { Scrim } from \"@salt-ds/lab\";\nimport { Button, Text } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport \"./Dialog.css\";\n\nconst classBase = \"vuuDialog\";\n\nexport interface DialogProps extends HTMLAttributes<HTMLDivElement> {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const Dialog = ({\n children,\n className,\n isOpen = false,\n onClose,\n title,\n ...props\n}: DialogProps) => {\n const root = useRef<HTMLDivElement>(null);\n const [posX] = useState(0);\n const [posY] = useState(0);\n\n const close = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleRender = useCallback(() => {\n // if (center && isOpen && root.current) {\n // const { width, height } = root.current.getBoundingClientRect();\n // const { innerWidth, innerHeight } = window;\n // const x = innerWidth / 2 - width / 2;\n // const y = innerHeight / 2 - height / 2;\n // setPosX(x);\n // setPosY(y);\n // }\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <Portal onRender={handleRender} x={posX} y={posY}>\n <Scrim className={`${classBase}-scrim`} open={isOpen}>\n <div {...props} className={cx(classBase, className)} ref={root}>\n <div className={cx(\"vuuToolbarProxy\", `${classBase}-header`)}>\n <Text>{title}</Text>\n <Button\n key=\"close\"\n onClick={close}\n data-align=\"end\"\n data-icon=\"close\"\n />\n </div>\n {children}\n </div>\n </Scrim>\n </Portal>\n );\n};\n", "import { ReactElement, useLayoutEffect, useMemo } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createContainer, renderPortal } from \"./render-portal\";\nimport { useThemeAttributes } from \"@vuu-ui/vuu-shell\";\nimport cx from \"classnames\";\n\nexport interface PortalProps {\n children: ReactElement;\n onRender?: () => void;\n x?: number;\n y?: number;\n}\n\nexport const Portal = function Portal({\n children,\n x = 0,\n y = 0,\n onRender,\n}: PortalProps) {\n // Do we need to accept container here as a prop ?\n const [themeClass, densityClass, dataMode] = useThemeAttributes();\n const renderContainer = useMemo(() => {\n return createContainer({\n className: cx(themeClass, densityClass),\n dataMode,\n });\n }, [dataMode, densityClass, themeClass]);\n\n useLayoutEffect(() => {\n renderPortal(children, renderContainer, x, y, onRender);\n }, [children, onRender, renderContainer, x, y]);\n\n useLayoutEffect(() => {\n return () => {\n if (renderContainer) {\n ReactDOM.unmountComponentAtNode(renderContainer);\n if (renderContainer.classList.contains(\"vuuPopup\")) {\n renderContainer.parentElement?.removeChild(renderContainer);\n }\n }\n };\n }, [renderContainer]);\n\n // useLayoutEffect(() => {\n // renderContainer.current = renderPortal(children, x, y, container)\n // return () => {\n // if (renderContainer.current){\n // console.log('EXPLICIT UNMOUNT')\n // ReactDOM.unmountComponentAtNode(renderContainer.current);\n // if (renderContainer.current.classList.contains('hwReactPopup')){\n // renderContainer.current.parentElement.removeChild(renderContainer.current);\n // renderContainer.current = null;\n // }\n // }\n // }\n // },[])\n return null;\n};\n", "import * as ReactDOM from \"react-dom\";\nimport { ReactElement } from \"react\";\nimport cx from \"classnames\";\n\nlet containerId = 1;\n\nconst getPortalContainer = ({\n className,\n dataMode,\n x = 0,\n y = 0,\n win = window,\n}: HTMLContainerProps) => {\n const el = win.document.createElement(\"div\");\n el.className = cx(`vuuPopup ${containerId++}`, className);\n el.style.cssText = `left:${x}px; top:${y}px;`;\n if (dataMode) {\n el.dataset.mode = dataMode;\n }\n win.document.body.appendChild(el);\n return el;\n};\n\nexport interface HTMLContainerProps {\n className?: string;\n dataMode?: string;\n x?: number;\n y?: number;\n win?: typeof globalThis;\n}\n\nexport const createContainer = (props: HTMLContainerProps) =>\n getPortalContainer(props);\n\nexport const renderPortal = (\n component: ReactElement,\n container: HTMLElement,\n x: number,\n y: number,\n onRender?: () => void\n) => {\n // check this first to see if position has changed\n container.style.cssText = `left:${x}px; top:${y}px;position: absolute;`;\n\n ReactDOM.render(component, container, onRender);\n};\n", "import { useCallback, useRef } from \"react\";\nimport { Portal } from \"../portal\";\nimport MenuList, { MenuListProps } from \"./MenuList\";\nimport { useCascade } from \"./use-cascade\";\n// import { useClickAway } from \"./use-click-away\";\nimport { useItemsWithIdsNext } from \"./use-items-with-ids-next\";\nimport { useId } from \"@vuu-ui/vuu-layout\";\nimport { PopupCloseCallback } from \"../popup\";\nimport { ContextMenuOptions } from \"./useContextMenu\";\n\nexport interface ContextMenuProps extends Omit<MenuListProps, \"onCloseMenu\"> {\n onClose?: PopupCloseCallback;\n position?: { x: number; y: number };\n withPortal?: boolean;\n}\n\nconst noop = () => undefined;\n\nexport const ContextMenu = ({\n activatedByKeyboard,\n children: childrenProp,\n className,\n id: idProp,\n onClose = () => undefined,\n position = { x: 0, y: 0 },\n style,\n ...menuListProps\n}: ContextMenuProps) => {\n const closeHandlerRef = useRef<ContextMenuProps[\"onClose\"]>(onClose);\n closeHandlerRef.current = onClose;\n\n const id = useId(idProp);\n const closeMenuRef = useRef<(location?: string) => void>(noop);\n const [menus, actions] = useItemsWithIdsNext(childrenProp, id);\n const navigatingWithKeyboard = useRef(activatedByKeyboard);\n const handleMouseEnterItem = useCallback(() => {\n navigatingWithKeyboard.current = false;\n }, []);\n\n console.log({ actions, menus });\n\n const handleActivate = useCallback(\n (menuItemId: string) => {\n const actionId = menuItemId.slice(9);\n const { action, options } = actions[actionId];\n closeMenuRef.current(id);\n onClose({\n type: \"menu-action\",\n menuId: action,\n options: options as ContextMenuOptions,\n });\n },\n [actions, id, onClose]\n );\n\n const { closeMenu, listItemProps, openMenu, openMenus, handleRender } =\n useCascade({\n // FIXME\n id: `${id}`,\n onActivate: handleActivate,\n onMouseEnterItem: handleMouseEnterItem,\n position,\n });\n closeMenuRef.current = closeMenu;\n\n const handleCloseMenu = () => {\n console.log(\"handleCloseMenu\");\n navigatingWithKeyboard.current = true;\n closeMenu();\n };\n\n const handleHighlightMenuItem = () => {\n // console.log(`highlight ${idx}`);\n };\n\n const lastMenu = openMenus.length - 1;\n\n const getChildMenuId = (i: number) => {\n if (i >= lastMenu) {\n return undefined;\n } else {\n const { id } = openMenus[i + 1];\n return id;\n }\n };\n\n return (\n <>\n {openMenus.map(({ id: menuId, left, top }, i, all) => {\n const childMenuId = getChildMenuId(i);\n // TODO don't need the portal here, vuu popup service takes care of this\n return (\n <Portal key={i} x={left} y={top} onRender={handleRender}>\n <MenuList\n {...menuListProps}\n activatedByKeyboard={navigatingWithKeyboard.current}\n childMenuShowing={childMenuId}\n className={className}\n id={menuId}\n isRoot={i === 0}\n key={i}\n listItemProps={listItemProps}\n onActivate={handleActivate}\n onHighlightMenuItem={handleHighlightMenuItem}\n onCloseMenu={handleCloseMenu}\n onOpenMenu={openMenu}\n style={style}\n tabIndex={i === all.length - 1 ? 0 : undefined}\n >\n {menus[menuId]}\n </MenuList>\n </Portal>\n );\n })}\n </>\n );\n};\n\nContextMenu.displayName = \"ContextMenu\";\n", "import React, {\n FC,\n HTMLAttributes,\n ReactElement,\n ReactNode,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\n//TODO do we want this dependency ?\nimport { useId } from \"@vuu-ui/vuu-layout\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport { isMenuItemGroup } from \"./use-items-with-ids-next\";\n\nimport \"./MenuList.css\";\n\nconst classBase = \"vuuMenuList\";\n\nexport const Separator = () => <li className=\"vuuMenuItem-divider\" />;\n\nexport interface MenuItemGroupProps {\n children:\n | ReactElement<MenuItemProps>[]\n | [ReactElement<MenuItemLabelProps>, ...ReactElement<MenuItemProps>[]];\n label?: string;\n}\n\nexport interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {\n action?: string;\n idx?: number;\n options?: unknown;\n}\n\n// Purely used as markers, props will be extracted\nexport const MenuItemGroup: FC<MenuItemGroupProps> = () => null;\n// eslint-disable-next-line no-unused-vars\nexport const MenuItem = ({ children, idx, ...props }: MenuItemProps) => {\n return <div {...props}>{children}</div>;\n};\n\nexport interface MenuItemLabelProps {\n children: ReactNode;\n}\nconst MenuItemLabel = ({ children }: { children: ReactNode }) => (\n <>{children}</>\n);\nMenuItemLabel.displayName = \"MenuItemLabel\";\nMenuItem.Label = MenuItemLabel;\n\nconst getDisplayName = (item: ReactNode) =>\n React.isValidElement(item) &&\n typeof item.type !== \"string\" &&\n \"displayName\" in item.type\n ? item.type.displayName\n : undefined;\n\nexport const isMenuItemLabel = (\n item: ReactNode\n): item is ReactElement<MenuItemLabelProps> =>\n getDisplayName(item) === \"MenuItemLabel\";\n\nconst hasIcon = (child: ReactElement) => child.props[\"data-icon\"];\n\nexport interface MenuListProps extends HTMLAttributes<HTMLDivElement> {\n activatedByKeyboard?: boolean;\n children: ReactElement[];\n childMenuShowing?: string;\n highlightedIdx?: number;\n isRoot?: boolean;\n listItemProps?: Partial<MenuItemProps>;\n onActivate?: (menuId: string) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuItemEl: HTMLElement) => void;\n onHighlightMenuItem?: (idx: number) => void;\n}\n\nconst MenuList = ({\n activatedByKeyboard,\n childMenuShowing,\n children,\n className,\n highlightedIdx: highlightedIdxProp,\n id: idProp,\n isRoot,\n listItemProps,\n onHighlightMenuItem,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ...props\n}: MenuListProps) => {\n const id = useId(idProp);\n const root = useRef<HTMLDivElement>(null);\n\n // The id generation be,ongs in useIttemsWithIds\n const mapIdxToId = useMemo(() => new Map(), []);\n\n const handleActivate = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onActivate?.(el.id);\n };\n\n const { focusVisible, highlightedIndex, listProps } = useKeyboardNavigation({\n count: React.Children.count(children),\n highlightedIndex: highlightedIdxProp,\n onActivate: handleActivate,\n onHighlight: onHighlightMenuItem,\n onOpenMenu,\n onCloseMenu,\n });\n\n const appliedFocusVisible = childMenuShowing == undefined ? focusVisible : -1;\n\n useLayoutEffect(() => {\n if (childMenuShowing === undefined && activatedByKeyboard) {\n root.current?.focus();\n }\n }, [activatedByKeyboard, childMenuShowing]);\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined || highlightedIndex === -1\n ? undefined\n : mapIdxToId.get(highlightedIndex);\n\n function renderContent() {\n const propsCommonToAllListItems = {\n ...listItemProps,\n role: \"menuitem\",\n };\n\n const maybeIcon = (\n childElement: ReactElement,\n withIcon: boolean,\n iconName?: string\n ) =>\n withIcon\n ? [\n <span\n className=\"vuuIconContainer\"\n data-icon={iconName}\n key=\"icon\"\n />,\n ].concat(childElement)\n : childElement;\n\n function addClonedChild(\n list: ReactElement[],\n child: ReactElement,\n idx: number,\n withIcon: boolean\n ) {\n const {\n children,\n className,\n \"data-icon\": iconName,\n id: itemId,\n hasSeparator,\n label,\n ...props\n } = child.props;\n const hasSubMenu = isMenuItemGroup(child);\n const subMenuShowing = hasSubMenu && childMenuShowing === itemId;\n const ariaControls = subMenuShowing ? `${id}-${itemId}` : undefined;\n\n list.push(\n <MenuItem\n {...props}\n {...propsCommonToAllListItems}\n {...getMenuItemProps(\n itemId,\n idx,\n child.key ?? itemId,\n highlightedIndex,\n appliedFocusVisible,\n className,\n hasSeparator\n )}\n aria-controls={ariaControls}\n aria-haspopup={hasSubMenu || undefined}\n aria-expanded={subMenuShowing || undefined}\n >\n {hasSubMenu\n ? maybeIcon(label ?? children, withIcon, iconName)\n : maybeIcon(children, withIcon, iconName)}\n </MenuItem>\n );\n // mapIdxToId.set(idx, itemId);\n }\n\n const listItems: ReactElement[] = [];\n\n if (children.length > 0) {\n const withIcon = children.some(hasIcon);\n children.forEach((child, idx) => {\n addClonedChild(listItems, child, idx, withIcon);\n });\n }\n\n return listItems;\n }\n\n return (\n <div\n {...props}\n {...listProps}\n aria-activedescendant={getActiveDescendant()}\n className={cx(classBase, className, {\n [`${classBase}-childMenuShowing`]: childMenuShowing !== undefined,\n })}\n data-root={isRoot || undefined}\n id={id}\n ref={root}\n role=\"menu\"\n >\n {renderContent()}\n </div>\n );\n};\n\nconst getMenuItemProps = (\n itemId: string,\n idx: number,\n key: string,\n highlightedIdx: number,\n focusVisible: number,\n className: string,\n hasSeparator: boolean\n) => ({\n id: `menuitem-${itemId}`,\n key: key ?? idx,\n \"data-idx\": idx,\n \"data-highlighted\": idx === highlightedIdx || undefined,\n className: cx(\"vuuMenuItem\", className, {\n \"vuuMenuItem-separator\": hasSeparator,\n focusVisible: focusVisible === idx,\n }),\n});\n\nMenuList.displayName = \"MenuList\";\nexport default MenuList;\n", "import {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { hasPopup, isRoot } from \"./utils\";\nimport { isNavigationKey } from \"./key-code\";\n\nexport interface KeyboardNavigationProps {\n autoHighlightFirstItem?: boolean;\n count: number;\n highlightedIndex?: number;\n onActivate: (idx: number) => void;\n onHighlight?: (idx: number) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuItemEl: HTMLElement) => void;\n}\n\nexport interface KeyboardHookListProps {\n // onBlur: (evt: FocusEvent) => void;\n onFocus: (evt: FocusEvent) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onMouseDownCapture: () => void;\n onMouseMove: () => void;\n onMouseLeave: () => void;\n}\n\nexport interface NavigationHookResult {\n focusVisible: number;\n controlledHighlighting: boolean;\n highlightedIndex: number;\n setHighlightedIndex: (idx: number) => void;\n // keyboardNavigation: RefObject<boolean>;\n listProps: KeyboardHookListProps;\n setIgnoreFocus: (ignoreFocus: boolean) => void;\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n autoHighlightFirstItem = false,\n count,\n highlightedIndex: highlightedIndexProp,\n onActivate,\n onHighlight,\n // onKeyDown,\n onCloseMenu,\n onOpenMenu,\n}: KeyboardNavigationProps): NavigationHookResult => {\n const highlightedIndexRef = useRef(\n highlightedIndexProp ?? autoHighlightFirstItem ? 0 : -1\n );\n const [, forceRender] = useState<unknown>(null);\n const controlledHighlighting = highlightedIndexProp !== undefined;\n\n const setHighlightedIdx = useCallback(\n (idx) => {\n highlightedIndexRef.current = idx;\n onHighlight?.(idx);\n forceRender({});\n },\n [onHighlight]\n );\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n if (idx !== highlightedIndexRef.current) {\n if (!controlledHighlighting) {\n setHighlightedIdx(idx);\n }\n }\n },\n [controlledHighlighting, setHighlightedIdx]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const highlightedIndex = controlledHighlighting\n ? highlightedIndexProp\n : highlightedIndexRef.current;\n\n const navigateChildldItems = useCallback(\n (e: KeyboardEvent) => {\n const nextIdx = nextItemIdx(count, e.key, highlightedIndexRef.current);\n if (nextIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(nextIdx);\n }\n },\n [count, setHighlightedIndex]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildldItems(e);\n } else if (\n (e.key === \"ArrowRight\" || e.key === \"Enter\") &&\n hasPopup(e.target as HTMLElement, highlightedIndex)\n ) {\n const menuEl = e.target as HTMLElement;\n const menuItemEl = menuEl.querySelector(\n `:scope > [data-idx='${highlightedIndex}']`\n ) as HTMLElement;\n\n if (menuItemEl) {\n onOpenMenu?.(menuItemEl);\n }\n } else if (e.key === \"ArrowLeft\" && !isRoot(e.target as HTMLElement)) {\n onCloseMenu(highlightedIndex);\n } else if (e.key === \"Enter\") {\n onActivate && onActivate(highlightedIndex);\n } else if (e.key === \"Tab\") {\n onCloseMenu(-1);\n }\n },\n [\n highlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ]\n );\n\n const listProps: KeyboardHookListProps = useMemo(\n () => ({\n onFocus: () => {\n if (highlightedIndex === -1) {\n setHighlightedIdx(0);\n }\n },\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n // label === 'ParsedInput' && console.log(`%c[useKeyboardNavigationHook]<${label}> onMouseLeave`,'color:brown')\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [handleKeyDown, highlightedIndex, setHighlightedIdx, setHighlightedIndex]\n );\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting,\n highlightedIndex,\n setHighlightedIndex: setHighlightedIndex,\n // keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n\n// need to be able to accommodate disabled items\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === \"ArrowUp\") {\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", "export const isRoot = (el: HTMLElement) =>\n el.closest(`[data-root='true']`) !== null;\n\nexport const hasPopup = (el: HTMLElement, idx: number) =>\n (el.ariaHasPopup === \"true\" && el.dataset?.idx === `${idx}`) ||\n el.querySelector(`:scope > [data-idx='${idx}'][aria-haspopup='true']`) !==\n null;\n", "function union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: { key: string },\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import React, { ReactElement, ReactNode, useCallback, useMemo } from \"react\";\nimport { isMenuItemLabel, MenuItemGroup, Separator } from \"./MenuList\";\n\nexport const isMenuItemGroup = (child: ReactElement) =>\n child.type === MenuItemGroup || !!child.props[\"data-group\"];\n\ntype Menus = { [key: string]: ReactElement[] };\ntype Actions = { [key: string]: { action: string; options?: unknown } };\n\nconst getLabelFromChildren = (children: ReactNode) => {\n if (Array.isArray(children) && isMenuItemLabel(children[0])) {\n return children[0];\n }\n};\n\nconst assignId = (\n child: ReactElement,\n path: string,\n group: boolean,\n hasSeparator = false\n) => {\n const {\n props: { children },\n } = child;\n // If we have a leaf MenuItem, any children will be label etc\n // if we have a GroupMenuItem, firet item mat be Label\n return {\n childWithId: React.cloneElement(child, {\n hasSeparator,\n id: `${path}`,\n key: path,\n children: group ? getLabelFromChildren(children) : children,\n }),\n grandChildren: group ? children : undefined,\n };\n};\n\nexport const useItemsWithIdsNext = (\n childrenProp: ReactElement[],\n rootId: string\n): [Menus, Actions] => {\n const normalizeChildren = useCallback(() => {\n const collectChildren = (\n children: ReactElement[],\n path = rootId,\n menus: Menus = {},\n actions: Actions = {}\n ) => {\n const list: ReactElement[] = (menus[path] = []);\n let idx = 0;\n let hasSeparator = false;\n\n React.Children.forEach(children, (child) => {\n if (isMenuItemLabel(child)) {\n // do nothing\n } else if (child.type === Separator) {\n hasSeparator = true;\n } else {\n const hasChildItems = isMenuItemGroup(child);\n const childPath = `${path}-${idx}`;\n const {\n props: { action, options },\n } = child;\n\n const { childWithId, grandChildren } = assignId(\n child,\n childPath,\n hasChildItems,\n hasSeparator\n );\n list.push(childWithId);\n if (grandChildren) {\n collectChildren(grandChildren, childPath, menus, actions);\n } else {\n actions[childPath] = { action, options };\n }\n idx += 1;\n hasSeparator = false;\n }\n });\n return [menus, actions];\n };\n\n return collectChildren(childrenProp);\n }, [rootId, childrenProp]);\n\n const [menus, actions] = useMemo(\n () => normalizeChildren(),\n [normalizeChildren]\n );\n\n return [menus, actions] as [Menus, Actions];\n};\n", "import {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { closestListItem } from \"./list-dom-utils\";\nimport { MenuItemProps } from \"./MenuList\";\n// import {mousePosition} from './aim/utils';\n// import {aiming} from './aim/aim';\n\nconst nudge = (\n menus: RuntimeMenuDescriptor[],\n distance: number,\n pos: \"left\" | \"top\"\n) => {\n return menus.map((m, i) =>\n i === menus.length - 1\n ? {\n ...m,\n [pos]: m[pos] - distance,\n }\n : m\n );\n};\nconst nudgeLeft = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"left\");\nconst nudgeUp = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"top\");\n\nconst flipSides = (id: string, menus: RuntimeMenuDescriptor[]) => {\n const [parentMenu, menu] = menus.slice(-2);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el === null) {\n throw Error(`useCascade.flipSides element with id ${menu.id} not found`);\n }\n const { width } = el.getBoundingClientRect();\n return menus.map((m) =>\n m === menu\n ? {\n ...m,\n left: parentMenu.left - (width - 2),\n }\n : m\n );\n};\n\n// const closedNode = (el: HTMLElement) =>\n// el.ariaHasPopup === \"true\" && el.ariaExpanded !== \"true\";\nconst getPosition = (el: HTMLElement, openMenus: RuntimeMenuDescriptor[]) => {\n const [{ left, top: menuTop }] = openMenus.slice(-1);\n // const {top, right, bottom, left} = el.getBoundingClientRect();\n // this will not work for MenuList within window, we need the\n // const {offsetLeft: left, offsetTop: menuTop} = el.closest('.vuuMenuList');\n const { offsetWidth: width, offsetTop: top } = el;\n return { left: left + width, top: top + menuTop };\n};\n\nexport type RuntimeMenuDescriptor = {\n id: string;\n left: number;\n top: number;\n};\n\nexport const getHostMenuId = (id: string, rootId: string) => {\n const pos = id.lastIndexOf(\"-\");\n return pos > -1 ? id.slice(9, pos) : rootId;\n};\n\nconst getTargetMenuId = (id: string) => id.slice(9);\n\nconst getMenuItemDetails = (\n { ariaExpanded, ariaHasPopup, id }: HTMLElement,\n rootId: string\n) => {\n if (id.startsWith(\"menuitem\")) {\n return {\n hostMenuId: getHostMenuId(id, rootId),\n targetMenuId: getTargetMenuId(id),\n menuItemId: id,\n isGroup: ariaHasPopup === \"true\",\n isOpen: ariaExpanded === \"true\",\n };\n } else {\n throw Error(`getMenuItemDetails #${id} is not a menuitem`);\n }\n};\n\nexport interface CascadeHookProps {\n id: string;\n onActivate: (menuId: string) => void;\n onMouseEnterItem: (evt: MouseEvent, itemId: string) => void;\n position: { x: number; y: number };\n}\n\nexport interface CascadeHooksResult {\n closeMenu: () => void;\n handleRender: () => void;\n listItemProps: Partial<MenuItemProps>;\n openMenu: (menuItemEl: HTMLElement) => void;\n openMenus: RuntimeMenuDescriptor[];\n}\n\ntype MenuStatus = \"no-popup\" | \"popup-open\" | \"pending-close\" | \"popup-pending\";\ntype MenuState = { [key: string]: MenuStatus };\n\nexport const useCascade = ({\n id: rootId,\n onActivate,\n onMouseEnterItem,\n position: { x: posX, y: posY },\n}: CascadeHookProps): CascadeHooksResult => {\n const [, forceRefresh] = useState({});\n const openMenus = useRef<RuntimeMenuDescriptor[]>([\n { id: rootId, left: posX, top: posY },\n ]);\n\n const menuIsOpen = useCallback(\n (menuId: string) =>\n openMenus.current.findIndex((menu) => menu.id === menuId) !== -1,\n []\n );\n\n const getOpenMenuStatus = useCallback((menuId: string) => {\n const state = menuState.current[menuId];\n if (state === undefined) {\n throw Error(`getOpenMenuState no entry for menu ${menuId}`);\n }\n return state;\n }, []);\n\n const setOpenMenus = useCallback((menus: RuntimeMenuDescriptor[]) => {\n openMenus.current = menus;\n forceRefresh({});\n }, []);\n\n const menuOpenPendingTimeout = useRef<number | undefined>();\n const menuClosePendingTimeout = useRef<number | undefined>();\n const menuState = useRef<MenuState>({ [rootId]: \"no-popup\" });\n // const prevLevel = useRef(0);\n\n // const prevAim = useRef({mousePos: null, distance: true});\n\n const openMenu = useCallback(\n (hostMenuId = rootId, targetMenuId: string, itemId = null) => {\n if (hostMenuId === rootId && itemId === null) {\n setOpenMenus([{ id: rootId, left: posX, top: posY }]);\n } else {\n menuState.current[hostMenuId] = \"popup-open\";\n const el = document.getElementById(itemId) as HTMLElement;\n if (el !== null) {\n const { left, top } = getPosition(el, openMenus.current);\n setOpenMenus(\n openMenus.current.concat({ id: targetMenuId, left, top })\n );\n } else {\n throw Error(`openMenu no menuItem ${itemId}`);\n }\n }\n },\n [rootId, posX, posY, setOpenMenus]\n );\n\n const closeMenu = useCallback(\n (menuId?: string) => {\n if (menuId === rootId) {\n setOpenMenus([]);\n } else {\n const menus = openMenus.current.slice();\n const lastMenu = menus.pop() as RuntimeMenuDescriptor;\n menuState.current[lastMenu.id] = \"no-popup\";\n const parentMenu = menus.at(-1);\n if (parentMenu) {\n menuState.current[parentMenu.id] = \"no-popup\";\n }\n setOpenMenus(menus);\n }\n },\n [rootId, setOpenMenus]\n );\n\n const closeMenus = useCallback(\n (menuItemId) => {\n const menus = openMenus.current.slice();\n const menuItemMenuId = menuItemId.slice(9);\n let { id: lastMenuId } = menus.at(-1) as RuntimeMenuDescriptor;\n while (menus.length > 1 && !menuItemMenuId.startsWith(lastMenuId)) {\n const parentMenuId = getHostMenuId(lastMenuId, rootId);\n menus.pop();\n menuState.current[lastMenuId] = \"no-popup\";\n menuState.current[parentMenuId] = \"no-popup\";\n ({ id: lastMenuId } = menus[menus.length - 1]);\n }\n if (menus.length < openMenus.current.length) {\n setOpenMenus(menus);\n }\n },\n [rootId, setOpenMenus]\n );\n\n const clearAnyScheduledOpenTasks = useCallback(() => {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n }\n }, []);\n\n const scheduleOpen = useCallback(\n (hostMenuId: string, targetMenuId: string, menuItemId: string) => {\n clearAnyScheduledOpenTasks();\n // do we need to set target state to pending-open ?s\n\n menuOpenPendingTimeout.current = window.setTimeout(() => {\n console.log(\n `scheduleOpen<timeout> opening menu ${targetMenuId} from menu ${hostMenuId} via menuitem ${menuItemId}`\n );\n closeMenus(menuItemId);\n menuState.current[hostMenuId] = \"popup-open\";\n menuState.current[targetMenuId] = \"no-popup\";\n openMenu(hostMenuId, targetMenuId, menuItemId);\n }, 400);\n },\n [clearAnyScheduledOpenTasks, closeMenus, openMenu]\n );\n\n const scheduleClose = useCallback(\n (hostMenuId: string, openMenuId: string, itemId: string) => {\n console.log(\n `scheduleClose openMenuId ${openMenuId} from parent menu ${hostMenuId} itemId ${itemId}`\n );\n menuState.current[openMenuId] = \"pending-close\";\n menuClosePendingTimeout.current = window.setTimeout(() => {\n closeMenus(itemId);\n }, 400);\n },\n [closeMenus]\n );\n\n const handleRender = useCallback(() => {\n const { current: menus } = openMenus;\n const [menu] = menus.slice(-1);\n const el = document.getElementById(menu.id);\n console.log(\n `handle render ${JSON.stringify(menu)} tabindex ${el?.tabIndex}`\n );\n if (el) {\n const { right, bottom } = el.getBoundingClientRect();\n const { clientHeight, clientWidth } = document.body;\n if (right > clientWidth) {\n const newMenus =\n menus.length > 1\n ? flipSides(rootId, menus)\n : nudgeLeft(menus, right - clientWidth);\n setOpenMenus(newMenus);\n } else if (bottom > clientHeight) {\n const newMenus = nudgeUp(menus, bottom - clientHeight);\n setOpenMenus(newMenus);\n }\n\n if (typeof el.tabIndex === \"number\") {\n console.log(`focus el ${el.id}`);\n el.focus();\n }\n } else {\n console.log(`no element found with if ${menu.id}`);\n }\n }, [rootId, setOpenMenus]);\n\n // TODO introduce a delay parameter that allows click to requeat an immediate render\n const triggerChildMenu = useCallback(\n (menuItemEl: HTMLElement) => {\n const { hostMenuId, targetMenuId, menuItemId, isGroup, isOpen } =\n getMenuItemDetails(menuItemEl, rootId);\n\n const {\n current: { [hostMenuId]: state },\n } = menuState;\n\n // console.log(\n // `%ctriggerChildMenu\n // menuItem ${menuItemId}\n // host menu: ${hostMenuId}\n // target menu: ${targetMenuId}\n // item index: ${menuItemId}\n // state ${state}\n // isGroup ${isGroup} isOpen ${isOpen}\n // openMenus: ${JSON.stringify(openMenus.current)}\n // full state='${JSON.stringify(menuState.current)}`,\n // \"color: green; font-weight: bold;\"\n // );\n\n console.log(`trigger child menu ${menuItemId}`);\n if (state === \"no-popup\" && isGroup) {\n menuState.current[hostMenuId] = \"popup-pending\";\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (state === \"popup-pending\" && !isGroup) {\n menuState.current[hostMenuId] = \"no-popup\";\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n } else if (state === \"popup-pending\" && isGroup) {\n clearTimeout(menuOpenPendingTimeout.current);\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (state === \"popup-open\") {\n if (menuIsOpen(targetMenuId)) {\n const menuStatus = getOpenMenuStatus(targetMenuId);\n console.log({ menuStatus });\n // Close any child menus of the target menu. This can happen if we have\n // opened child menus, then moused out of the menu entirely, to re-enter\n // at a higher level\n closeMenus(menuItemId);\n\n switch (menuStatus) {\n case \"pending-close\":\n // cancel the close\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[targetMenuId] = \"no-popup\";\n clearAnyScheduledOpenTasks();\n break;\n default:\n }\n } else {\n // TODO review the below, suspectb it's over complicating things\n const [parentOfLastOpenedMenu, lastOpenedMenu] =\n openMenus.current.slice(-2);\n if (\n parentOfLastOpenedMenu.id === hostMenuId &&\n menuState.current[lastOpenedMenu.id] !== \"pending-close\" /*&&\n sameLevel*/\n ) {\n scheduleClose(hostMenuId, lastOpenedMenu.id, menuItemId);\n if (isGroup && !isOpen) {\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n }\n } else if (\n parentOfLastOpenedMenu.id === hostMenuId &&\n isGroup &&\n menuItemId !== lastOpenedMenu.id &&\n menuState.current[lastOpenedMenu.id] === \"pending-close\"\n ) {\n // if there is already an item queued for opening cancel it\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (isGroup) {\n // closeMenus(menuId, itemId);\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (\n !(\n (menuState.current[lastOpenedMenu.id] === \"pending-close\") /*&&\n sameLevel*/\n )\n ) {\n closeMenus(menuItemId);\n }\n }\n }\n\n if (state === \"pending-close\") {\n clearAnyScheduledOpenTasks();\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[hostMenuId] = \"popup-open\";\n }\n },\n [\n clearAnyScheduledOpenTasks,\n closeMenus,\n getOpenMenuStatus,\n menuIsOpen,\n rootId,\n scheduleClose,\n scheduleOpen,\n ]\n );\n\n const listItemProps: Partial<MenuItemProps> = useMemo(\n () => ({\n onMouseEnter: (evt: MouseEvent) => {\n const menuItemEl = closestListItem(evt.target as HTMLElement);\n triggerChildMenu(menuItemEl);\n onMouseEnterItem(evt, menuItemEl.id);\n },\n\n onClick: (evt: SyntheticEvent) => {\n const listItemEl = closestListItem(evt.target as HTMLElement);\n const { isGroup, menuItemId } = getMenuItemDetails(listItemEl, rootId);\n if (isGroup) {\n triggerChildMenu(listItemEl);\n } else {\n onActivate(menuItemId);\n }\n },\n }),\n [onActivate, onMouseEnterItem, rootId, triggerChildMenu]\n );\n\n return {\n closeMenu,\n handleRender,\n listItemProps,\n openMenu: triggerChildMenu,\n openMenus: openMenus.current,\n };\n};\n", "// const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n// listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n const idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if (listItemEl.ariaPosInSet) {\n return parseInt(listItemEl.ariaPosInSet, 10) - 1;\n }\n }\n}\n\nconst listItemId = (el: HTMLElement | null | undefined) => el?.id;\n\nexport const closestListItem = (el: HTMLElement | null | undefined) =>\n el?.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import type {\n ContextMenuContextType,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { createContext, ReactNode, useCallback, useMemo } from \"react\";\n\nexport const ContextMenuContext = createContext<ContextMenuContextType | null>(\n null\n);\n\nexport interface ContextMenuProviderProps {\n children: ReactNode;\n label?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder: MenuBuilder;\n}\n\ninterface ProviderProps extends ContextMenuProviderProps {\n context: ContextMenuContextType | null;\n}\n\nconst Provider = ({\n children,\n context,\n menuActionHandler,\n menuBuilder,\n}: ProviderProps) => {\n const menuBuilders = useMemo(() => {\n if (context?.menuBuilders && menuBuilder) {\n return context.menuBuilders.concat(menuBuilder);\n } else if (menuBuilder) {\n return [menuBuilder];\n } else {\n return context?.menuBuilders || [];\n }\n }, [context, menuBuilder]);\n\n const handleMenuAction = useCallback(\n (reason) => {\n if (menuActionHandler?.(reason)) {\n return true;\n }\n\n if (context?.menuActionHandler?.(reason)) {\n return true;\n }\n },\n [context, menuActionHandler]\n );\n\n return (\n <ContextMenuContext.Provider\n value={{\n menuActionHandler: handleMenuAction,\n menuBuilders,\n }}\n >\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Need an option for local menu to override higher-level menu, rather than extend\nexport const ContextMenuProvider = ({\n children,\n label,\n menuActionHandler,\n menuBuilder,\n}: ContextMenuProviderProps) => {\n return (\n <ContextMenuContext.Consumer>\n {(parentContext) => (\n <Provider\n context={parentContext}\n label={label}\n menuActionHandler={menuActionHandler}\n menuBuilder={menuBuilder}\n >\n {children}\n </Provider>\n )}\n </ContextMenuContext.Consumer>\n );\n};\n", "import { ContextMenuItemDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport { useThemeAttributes } from \"@vuu-ui/vuu-shell\";\nimport { isGroupMenuItemDescriptor } from \"@vuu-ui/vuu-utils\";\nimport cx from \"classnames\";\nimport { cloneElement, MouseEvent, useCallback, useContext } from \"react\";\nimport {\n MenuActionClosePopup,\n PopupCloseReason,\n PopupService,\n reasonIsMenuAction,\n} from \"../popup\";\nimport { MenuActionHandler, MenuBuilder } from \"@vuu-ui/vuu-data-types\";\nimport { ContextMenu, ContextMenuProps } from \"./ContextMenu\";\nimport { MenuItem, MenuItemGroup } from \"./MenuList\";\nimport { ContextMenuContext } from \"./context-menu-provider\";\n\nexport type ContextMenuOptions = {\n [key: string]: unknown;\n contextMenu?: JSX.Element;\n ContextMenuProps?: Partial<ContextMenuProps> & {\n className?: string;\n \"data-mode\"?: string;\n };\n};\n\nexport type ShowContextMenu = (\n e: MouseEvent<HTMLElement>,\n location: string,\n options: ContextMenuOptions\n) => void;\n\n// The argument allows a top-level menuBuilder to operate outside the Context\nexport const useContextMenu = (\n menuBuilder?: MenuBuilder,\n menuActionHandler?: MenuActionHandler\n): [ShowContextMenu, () => void] => {\n const ctx = useContext(ContextMenuContext);\n const [themeClass, densityClass, dataMode] = useThemeAttributes();\n\n const buildMenuOptions = useCallback(\n (menuBuilders: MenuBuilder[], location, options) => {\n let results: ContextMenuItemDescriptor[] = [];\n for (const menuBuilder of menuBuilders) {\n // Maybe we should leave the concatenation to the menuBuilder, then it can control menuItem order\n results = results.concat(menuBuilder(location, options));\n }\n return results;\n },\n []\n );\n\n const handleShowContextMenu = useCallback(\n (\n e: MouseEvent<HTMLElement>,\n location: string,\n { ContextMenuProps, contextMenu, ...options }: ContextMenuOptions\n ) => {\n e.stopPropagation();\n e.preventDefault();\n\n if (contextMenu) {\n return showContextMenuComponent(e, contextMenu);\n }\n\n const menuBuilders: MenuBuilder[] = [];\n if (menuBuilder) {\n menuBuilders.push(menuBuilder);\n }\n if (\n ctx &&\n Array.isArray(ctx?.menuBuilders) &&\n ctx.menuBuilders.length > 0\n ) {\n menuBuilders.push(...ctx.menuBuilders);\n }\n\n if (menuBuilders.length > 0) {\n const menuItemDescriptors = buildMenuOptions(\n menuBuilders,\n location,\n options\n );\n\n // const menuHandler = menuActionHandler ?? ctx?.menuActionHandler;\n const menuHandler: MenuActionHandler = (\n action: MenuActionClosePopup\n ) => {\n if (menuActionHandler?.(action) === true) {\n return true;\n } else {\n return ctx?.menuActionHandler(action);\n }\n };\n\n if (menuItemDescriptors.length && menuHandler) {\n console.log(`showContextMenu ${location}`, {\n options,\n });\n showContextMenu(e, menuItemDescriptors, menuHandler, {\n ...ContextMenuProps,\n className: cx(\n ContextMenuProps?.className,\n themeClass,\n densityClass\n ),\n \"data-mode\": dataMode,\n });\n }\n } else {\n console.warn(\n \"useContextMenu, no menuBuilders configured. These should be supplied via the ContextMenuProvider(s)\"\n );\n }\n },\n [\n buildMenuOptions,\n ctx,\n dataMode,\n densityClass,\n menuActionHandler,\n menuBuilder,\n themeClass,\n ]\n );\n\n const hideContextMenu = useCallback(() => {\n console.log(\"hide comnytext menu\");\n }, []);\n\n return [handleShowContextMenu, hideContextMenu];\n};\n\nconst NO_OPTIONS = {};\n\nconst showContextMenuComponent = (\n e: MouseEvent<HTMLElement>,\n contextMenu: JSX.Element\n) => {\n const position = {\n x: e.clientX,\n y: e.clientY,\n };\n\n PopupService.showPopup({\n focus: true,\n left: 0,\n top: 0,\n component: cloneElement(contextMenu, { position }),\n });\n};\n\nconst showContextMenu = (\n e: MouseEvent<HTMLElement>,\n menuDescriptors: ContextMenuItemDescriptor[],\n handleContextMenuAction: MenuActionHandler,\n {\n position: positionProp,\n ...contextMenuProps\n }: ContextMenuOptions[\"ContextMenuProps\"] = NO_OPTIONS\n) => {\n const menuItems = (menuDescriptors: ContextMenuItemDescriptor[]) => {\n const fromDescriptor = (menuItem: ContextMenuItemDescriptor, i: number) =>\n isGroupMenuItemDescriptor(menuItem) ? (\n <MenuItemGroup key={i} label={menuItem.label}>\n {menuItem.children.map(fromDescriptor)}\n </MenuItemGroup>\n ) : (\n <MenuItem\n key={i}\n action={menuItem.action}\n data-icon={menuItem.icon}\n options={menuItem.options}\n >\n {menuItem.label}\n </MenuItem>\n );\n\n return menuDescriptors.map(fromDescriptor);\n };\n\n const handleClose = (reason?: PopupCloseReason) => {\n if (reasonIsMenuAction(reason)) {\n handleContextMenuAction(reason);\n // TODO this results in onClose being called twice on component\n // cant simply be removed, some refactoring work needed\n PopupService.hidePopup();\n }\n contextMenuProps?.onClose?.(reason);\n };\n\n const position = positionProp ?? {\n x: e.clientX,\n y: e.clientY,\n };\n\n const component = (\n <ContextMenu\n {...contextMenuProps}\n onClose={handleClose}\n position={position}\n >\n {menuItems(menuDescriptors)}\n </ContextMenu>\n );\n PopupService.showPopup({ left: 0, top: 0, component, focus: true });\n};\n", "import cx from \"classnames\";\nimport React, {\n createElement,\n CSSProperties,\n HTMLAttributes,\n ReactElement,\n useEffect,\n useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ContextMenuOptions } from \"../menu\";\nimport { renderPortal } from \"../portal\";\n\nimport \"./popup-service.css\";\n\nlet _dialogOpen = false;\nconst _popups: string[] = [];\n\nexport type PopupCloseCallback = (reason?: PopupCloseReason) => void;\n\nexport type ClickAwayClosePopup = {\n type: \"click-away\";\n mouseEvt: MouseEvent;\n};\n\nexport type MenuActionClosePopup = {\n menuId: string;\n options: ContextMenuOptions;\n type: \"menu-action\";\n};\n\nexport type PopupCloseReason = ClickAwayClosePopup | MenuActionClosePopup;\n\nexport const reasonIsMenuAction = (\n reason?: PopupCloseReason\n): reason is MenuActionClosePopup => reason?.type === \"menu-action\";\n\nexport const reasonIsClickAway = (\n reason?: PopupCloseReason\n): reason is ClickAwayClosePopup => reason?.type === \"click-away\";\n\nfunction specialKeyHandler(e: KeyboardEvent) {\n if (e.key === \"Esc\") {\n if (_popups.length) {\n closeAllPopups();\n } else if (_dialogOpen) {\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n }\n}\n\nfunction outsideClickHandler(e: MouseEvent) {\n if (_popups.length) {\n console.log(`Popup.outsideClickHandler ... `);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n if (popupContainers[i].contains(e.target as HTMLElement)) {\n console.log(` ... its ok, he's one of us`);\n return;\n }\n }\n console.log(\" ... close all\");\n closeAllPopups({ mouseEvt: e, type: \"click-away\" });\n }\n}\n\nfunction closeAllPopups(reason?: PopupCloseReason) {\n if (_popups.length === 1) {\n PopupService.hidePopup(reason, \"anon\", \"all\");\n } else if (_popups.length) {\n // onsole.log(`closeAllPopups`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n ReactDOM.unmountComponentAtNode(popupContainers[i]);\n }\n popupClosed(\"*\");\n }\n}\n\nfunction dialogOpened() {\n if (_dialogOpen === false) {\n _dialogOpen = true;\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction dialogClosed() {\n if (_dialogOpen) {\n _dialogOpen = false;\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction popupOpened(name: string) {\n if (_popups.indexOf(name) === -1) {\n _popups.push(name);\n //onsole.log('PopupService, popup opened ' + name + ' popups : ' + _popups);\n if (_dialogOpen === false) {\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n window.addEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nfunction popupClosed(name: string /*, group=null*/) {\n if (_popups.length) {\n if (name === \"*\") {\n _popups.length = 0;\n } else {\n const pos = _popups.indexOf(name);\n if (pos !== -1) {\n _popups.splice(pos, 1);\n }\n }\n //onsole.log('PopupService, popup closed ' + name + ' popups : ' + _popups);\n if (_popups.length === 0 && _dialogOpen === false) {\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n window.removeEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nconst PopupComponent = ({\n children,\n position,\n style,\n}: HTMLAttributes<HTMLDivElement> & {\n position?: \"above\" | \"below\" | \"\";\n style?: CSSProperties;\n}) => {\n const className = cx(\"hwPopup\", \"hwPopupContainer\", position);\n return createElement(\"div\", { className, style }, children);\n};\n\nlet incrementingKey = 1;\n\nexport interface ShowPopupProps {\n depth?: number;\n /**\n * if true, focus will be invoked on first focusable element\n */\n focus?: boolean;\n name?: string;\n group?: string;\n position?: \"above\" | \"below\" | \"\";\n left?: number;\n right?: \"auto\" | number;\n top?: number;\n component: ReactElement;\n width?: number | \"auto\";\n}\n\nexport class PopupService {\n static onClose: PopupCloseCallback | undefined;\n static showPopup({\n group = \"all\",\n name = \"anon\",\n left = 0,\n position = \"\",\n right = \"auto\",\n top = 0,\n width = \"auto\",\n component,\n }: ShowPopupProps) {\n if (!component) {\n throw Error(`PopupService showPopup, no component supplied`);\n }\n\n if (typeof component.props.onClose === \"function\") {\n PopupService.onClose = component.props.onClose;\n } else {\n PopupService.onClose = undefined;\n }\n\n popupOpened(name);\n\n document.addEventListener(\"keydown\", PopupService.escapeKeyListener, true);\n\n let el = document.body.querySelector(\".vuuPopup.\" + group) as HTMLElement;\n if (el === null) {\n el = document.createElement(\"div\") as HTMLElement;\n el.className = \"vuuPopup \" + group;\n document.body.appendChild(el);\n }\n\n const style = { width };\n\n renderPortal(\n createElement(\n PopupComponent,\n { key: incrementingKey++, position, style },\n component\n ),\n el,\n left,\n top,\n () => {\n PopupService.keepWithinThePage(el, right);\n }\n );\n }\n\n static escapeKeyListener(evt: KeyboardEvent) {\n if (evt.key === \"Escape\") {\n console.log(`%cESC listener`, \"color:green;font-weight:bold;\");\n PopupService.hidePopup();\n }\n }\n\n static hidePopup(reason?: PopupCloseReason, name = \"anon\", group = \"all\") {\n console.log(`PopupService.hidePopup`, {\n reason,\n });\n if (_popups.indexOf(name) !== -1) {\n popupClosed(name);\n const popupRoot = document.body.querySelector(`.vuuPopup.${group}`);\n if (popupRoot) {\n ReactDOM.unmountComponentAtNode(popupRoot);\n }\n }\n document.removeEventListener(\n \"keydown\",\n PopupService.escapeKeyListener,\n true\n );\n\n console.log(\n `PopupService will call onClose if found ${typeof PopupService?.onClose}`\n );\n PopupService?.onClose?.(reason);\n }\n\n static keepWithinThePage(el: HTMLElement, right: number | \"auto\" = \"auto\") {\n const target = el.querySelector(\".vuuPopupContainer > *\") as HTMLElement;\n if (target) {\n const {\n top,\n left,\n width,\n height,\n right: currentRight,\n } = target.getBoundingClientRect();\n\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const overflowH = h - (top + height);\n if (overflowH < 0) {\n target.style.top = Math.round(top) + overflowH + \"px\";\n }\n\n const overflowW = w - (left + width);\n if (overflowW < 0) {\n target.style.left = Math.round(left) + overflowW + \"px\";\n }\n\n if (typeof right === \"number\" && right !== currentRight) {\n const adjustment = right - currentRight;\n target.style.left = left + adjustment + \"px\";\n }\n }\n }\n}\n\nexport class DialogService {\n static showDialog(dialog: ReactElement) {\n const containerEl = \".vuuDialog\";\n const onClose = dialog.props.onClose;\n\n dialogOpened();\n\n ReactDOM.render(\n React.cloneElement(dialog, {\n container: containerEl,\n onClose: () => {\n DialogService.closeDialog();\n if (onClose) {\n onClose();\n }\n },\n }),\n document.body.querySelector(containerEl)\n );\n }\n\n static closeDialog() {\n dialogClosed();\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n}\n\nexport interface PopupProps {\n children: ReactElement;\n close?: boolean;\n depth: number;\n group?: string;\n name: string;\n position?: \"above\" | \"below\" | \"\";\n width: number;\n}\n\nexport const Popup = (props: PopupProps) => {\n const pendingTask = useRef<number | undefined>();\n const ref = useRef<HTMLElement>(null);\n\n const show = (props: PopupProps, boundingClientRect: DOMRect) => {\n const { name, group, depth, width } = props;\n let left: number | undefined;\n let top: number | undefined;\n\n if (pendingTask.current) {\n window.clearTimeout(pendingTask.current);\n pendingTask.current = undefined;\n }\n\n if (props.close === true) {\n PopupService.hidePopup(undefined, name, group);\n } else {\n const { position, children: component } = props;\n const {\n left: targetLeft,\n top: targetTop,\n width: clientWidth,\n bottom: targetBottom,\n } = boundingClientRect;\n\n if (position === \"below\") {\n left = targetLeft;\n top = targetBottom;\n } else if (position === \"above\") {\n left = targetLeft;\n top = targetTop;\n }\n\n pendingTask.current = window.setTimeout(() => {\n PopupService.showPopup({\n name,\n group,\n depth,\n position,\n left,\n top,\n width: width || clientWidth,\n component,\n });\n }, 10);\n }\n };\n\n useEffect(() => {\n if (ref.current) {\n const el = ref.current.parentElement;\n const boundingClientRect = el?.getBoundingClientRect();\n if (boundingClientRect) {\n show(props, boundingClientRect);\n }\n }\n\n return () => {\n PopupService.hidePopup(undefined, props.name, props.group);\n };\n }, [props]);\n\n return React.createElement(\"div\", { className: \"popup-proxy\", ref });\n};\n", "import {\n HTMLAttributes,\n MouseEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n PopupCloseReason,\n reasonIsClickAway,\n useContextMenu,\n} from \"@vuu-ui/vuu-popups\";\nimport cx from \"classnames\";\nimport { Button } from \"@salt-ds/core\";\nimport { useId } from \"@vuu-ui/vuu-layout\";\n\nimport \"./PopupMenu.css\";\nimport { MenuActionHandler, MenuBuilder } from \"@vuu-ui/vuu-data-types\";\n\nconst classBase = \"vuuPopupMenu\";\n\nexport interface PopupMenuProps extends HTMLAttributes<HTMLButtonElement> {\n icon?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder?: MenuBuilder;\n menuLocation?: string;\n menuOptions?: { [key: string]: unknown };\n onMenuClose?: () => void;\n}\n\nconst getPosition = (element: HTMLElement | null) => {\n if (element) {\n const { bottom, left } = element.getBoundingClientRect();\n return { x: left, y: bottom + 6 };\n }\n};\n\nexport const PopupMenu = ({\n className,\n icon = \"more-vert\",\n id: idProp,\n menuActionHandler,\n menuBuilder,\n menuLocation = \"header\",\n menuOptions,\n onMenuClose,\n tabIndex = 0,\n ...htmlAttributes\n}: PopupMenuProps) => {\n const rootRef = useRef<HTMLButtonElement>(null);\n const suppressShowMenuRef = useRef(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const id = useId(idProp);\n const [showContextMenu] = useContextMenu(menuBuilder, menuActionHandler);\n\n const handleMenuClose = useCallback(\n (reason?: PopupCloseReason) => {\n console.log(`PopupMenu popup closed`, {\n reason,\n });\n setMenuOpen(false);\n // If user has clicked the MenuButton whilst menu is open, we want to close it.\n // The PopupService will close it for us as a 'click-away' event. We don't want\n // that click on the button to re-open it.\n if (reasonIsClickAway(reason)) {\n const target = reason.mouseEvt.target as HTMLElement;\n if (target === rootRef.current) {\n suppressShowMenuRef.current = true;\n }\n } else {\n requestAnimationFrame(() => {\n onMenuClose?.();\n if (tabIndex !== -1) {\n rootRef.current?.focus();\n }\n });\n }\n },\n [onMenuClose, tabIndex]\n );\n\n const showMenu = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n if (suppressShowMenuRef.current) {\n suppressShowMenuRef.current = false;\n } else {\n setMenuOpen(true);\n showContextMenu(e, menuLocation, {\n ContextMenuProps: {\n id: `${id}-menu`,\n onClose: handleMenuClose,\n position: getPosition(rootRef.current),\n },\n ...menuOptions,\n });\n }\n },\n [handleMenuClose, id, menuLocation, menuOptions, showContextMenu]\n );\n\n return (\n <Button\n {...htmlAttributes}\n aria-controls={`${id}-menu-root`}\n aria-expanded={menuOpen}\n aria-haspopup=\"menu\"\n className={cx(classBase, className, {\n [`${classBase}-open`]: menuOpen,\n })}\n data-icon={icon}\n id={id}\n onClick={showMenu}\n ref={rootRef}\n tabIndex={tabIndex}\n variant=\"secondary\"\n />\n );\n};\n", "import { useCallback, useRef, useState } from \"react\";\n\nimport {\n InternalDragDropProps,\n InternalDragHookResult,\n Direction,\n ViewportRange,\n} from \"./dragDropTypesNext\";\nimport { useDropIndicator } from \"./useDropIndicator\";\n\nimport {\n dimensions,\n getItemById,\n MeasuredDropTarget,\n measureDropTargets,\n getNextDropTarget,\n dropZone,\n removeDraggedItem,\n} from \"./drop-target-utils\";\n\nimport { createDropIndicator, Draggable } from \"./Draggable\";\n\nconst NOT_OVERFLOWED = ':not([data-overflowed=\"true\"])';\nconst NOT_HIDDEN = ':not([aria-hidden=\"true\"])';\n\nexport const useDragDropIndicator = ({\n draggableRef,\n onDrop,\n orientation = \"horizontal\",\n containerRef,\n itemQuery = \"*\",\n selected,\n viewportRange,\n}: InternalDragDropProps): InternalDragHookResult => {\n const dragDirectionRef = useRef<Direction | undefined>();\n const dropIndicatorRef = useRef<HTMLDivElement>(null);\n const dropTargetRef = useRef<MeasuredDropTarget | null>(null);\n const dropZoneRef = useRef<dropZone | \"\">(\"\");\n const isScrollable = useRef(false);\n /** current position of dragged element */\n const dragPosRef = useRef<number>(-1);\n const measuredDropTargets = useRef<MeasuredDropTarget[]>([]);\n const overflowMenuShowingRef = useRef(false);\n\n const [showOverflow, setShowOverflow] = useState(false);\n const [dropIndicator, setDropIndicator] = useState<JSX.Element | undefined>();\n\n const { clearSpacer, positionDropIndicator } = useDropIndicator();\n\n const draggedItemRef = useRef<MeasuredDropTarget>();\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED}${NOT_HIDDEN},[data-overflow-indicator])`;\n\n // const { setMeasurements: setVizData } = useListViz();\n\n const indexOf = (dropTarget: MeasuredDropTarget) =>\n measuredDropTargets.current.findIndex((d) => d.id === dropTarget.id);\n\n const reposition = (\n dropTarget: MeasuredDropTarget,\n distance: number,\n indexShift?: number\n ) => {\n dropTarget.start += distance;\n dropTarget.mid += distance;\n dropTarget.end += distance;\n if (typeof indexShift === \"number\") {\n dropTarget.currentIndex += indexShift;\n }\n };\n\n // Shouldn't need this - but viewportRange is always stale in stopScrolling. Checked all dependencies\n // look ok. Something to do with setTimeout / scrollHandler ?\n const rangeRef = useRef<ViewportRange>();\n rangeRef.current = viewportRange;\n\n const handleScrollStart = useCallback(() => {\n clearSpacer();\n }, [clearSpacer]);\n\n const handleScrollStop = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", _scrollPos: number, atEnd: boolean) => {\n const { current: container } = containerRef;\n const { current: draggedItem } = draggedItemRef;\n if (container && draggedItem) {\n measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n rangeRef.current\n );\n // setVizData(measuredDropTargets.current);\n\n const { size } = draggedItem;\n const dragPos = dragPosRef.current;\n const midPos = dragPos + size / 2;\n const { current: dropTargets } = measuredDropTargets;\n const nextDropTarget = getNextDropTarget(dropTargets, midPos, \"fwd\");\n if (nextDropTarget) {\n if (atEnd && scrollDirection === \"fwd\") {\n positionDropIndicator(dropTargets[dropTargets.length - 1], \"start\");\n } else {\n positionDropIndicator(nextDropTarget, \"start\");\n }\n }\n\n // setVizData(measuredDropTargets.current, nextDropTarget);\n }\n },\n [\n containerRef,\n positionDropIndicator,\n fullItemQuery,\n orientation,\n // setVizData,\n ]\n );\n\n const beginDrag = useCallback(\n (evt: MouseEvent) => {\n const evtTarget = evt.target as HTMLElement;\n const dragElement = evtTarget.closest(itemQuery) as HTMLElement;\n if (\n dragElement.ariaSelected &&\n Array.isArray(selected) &&\n selected.length > 1\n ) {\n console.log(\"its a selected element, and we have a multi select\");\n }\n const { current: container } = containerRef;\n if (container && dragElement) {\n const { SCROLL_SIZE, CLIENT_SIZE } = dimensions(orientation);\n const { id: draggedItemId } = dragElement;\n\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n container;\n isScrollable.current = scrollSize > clientSize;\n\n const dropTargets = (measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n viewportRange\n ));\n\n const draggedItem = getItemById(dropTargets, draggedItemId);\n\n if (draggedItem && container) {\n const targetIndex = indexOf(draggedItem);\n removeDraggedItem(dropTargets, targetIndex);\n draggedItemRef.current = draggedItem;\n\n // This begins to deviate from NaturalMovement here -----------\n const { current: range } = rangeRef;\n //TODO when our viewport is the last 'page' of a scrolling viewport\n // the viewport will scoll up by one row when we remove an item, so\n // the position of each item will move down.\n if (range?.atEnd) {\n for (let i = 0; i < dropTargets.length; i++) {\n reposition(dropTargets[i], draggedItem.size);\n }\n }\n for (let i = targetIndex; i < dropTargets.length; i++) {\n reposition(dropTargets[i], -draggedItem.size, -1);\n }\n\n const [dropTarget, dropZone] = draggedItem.isLast\n ? [dropTargets[dropTargets.length - 1], \"end\"]\n : [dropTargets[targetIndex], \"start\"];\n\n dropTargetRef.current = dropTarget;\n dropZoneRef.current = dropZone as dropZone;\n\n // setVizData(dropTargets, dropTarget, dropZone);\n\n const dropIndicatorPosition = positionDropIndicator(\n dropTarget,\n dropZone as dropZone\n );\n\n const { top, left, width } =\n dropIndicatorPosition.getBoundingClientRect();\n // Next render will remove the dragged item, that will offset our initial\n // dropIndicatorPosition\n const dropIndicatorRect = {\n top: draggedItem.isLast\n ? range?.atEnd && !range.atStart\n ? top + draggedItem.size - 2\n : top - 2\n : top - draggedItem.size - 2,\n left,\n width,\n height: 2,\n };\n\n setDropIndicator(\n <Draggable\n wrapperClassName=\"dropIndicatorContainer\"\n style={dropIndicatorRect}\n ref={dropIndicatorRef}\n element={createDropIndicator()}\n />\n );\n }\n }\n },\n [\n itemQuery,\n selected,\n containerRef,\n orientation,\n fullItemQuery,\n viewportRange,\n // setVizData,\n positionDropIndicator,\n ]\n );\n\n const drag = useCallback(\n (dragPos: number, mouseMoveDirection: \"fwd\" | \"bwd\") => {\n const { current: currentDropTarget } = dropTargetRef;\n const { current: draggedItem } = draggedItemRef;\n\n if (draggedItem) {\n if (draggableRef.current && containerRef.current) {\n const START = orientation === \"horizontal\" ? \"left\" : \"top\";\n dragPosRef.current = dragPos;\n\n const { current: dropTargets } = measuredDropTargets;\n const nextDropTarget = getNextDropTarget(\n dropTargets,\n dragPos,\n mouseMoveDirection\n );\n\n if (\n nextDropTarget &&\n nextDropTarget.index !== currentDropTarget?.index\n // mouseMoveDirection !== dragDirectionRef.current\n ) {\n if (nextDropTarget.isOverflowIndicator) {\n // Does this belong in here or can we abstract it out\n setShowOverflow((overflowMenuShowingRef.current = true));\n } else if (dropIndicatorRef.current) {\n const targetIndex = indexOf(nextDropTarget);\n if (targetIndex === dropTargets.length - 1) {\n // because we maintain at least one out-of-viewport row in\n // the dropTargets, this means we are at the very last item.\n const dropTarget = dropTargets[dropTargets.length - 1];\n const dropIndicatorPosition = positionDropIndicator(\n dropTarget,\n \"start\"\n );\n const dropIndicatorRect =\n dropIndicatorPosition.getBoundingClientRect();\n dropIndicatorRef.current.style[\n START\n ] = `${dropIndicatorRect.top}px`;\n } else {\n const dropIndicatorPosition = positionDropIndicator(\n nextDropTarget,\n \"start\"\n ) as unknown as HTMLElement;\n const dropIndicatorRect =\n dropIndicatorPosition.getBoundingClientRect();\n dropIndicatorRef.current.style[\n START\n ] = `${dropIndicatorRect.top}px`;\n }\n // setVizData(dropTargets, nextDropTarget, nextDropZone);\n\n setShowOverflow((overflowMenuShowingRef.current = false));\n }\n\n dropTargetRef.current = nextDropTarget;\n dragDirectionRef.current = mouseMoveDirection;\n }\n }\n }\n },\n [draggableRef, containerRef, orientation, positionDropIndicator]\n );\n\n const drop = useCallback(() => {\n clearSpacer();\n const { current: draggedItem } = draggedItemRef;\n const { current: dropTarget } = dropTargetRef;\n const { current: dropZone } = dropZoneRef;\n const { current: range } = rangeRef;\n\n if (draggedItem && range && dropTarget) {\n const { index: fromIndex } = draggedItem;\n\n const dropBefore = dropZone === \"start\";\n const {\n index: originalDropTargetIndex,\n currentIndex: currentDropTargetIndex,\n } = dropTarget;\n\n dropTargetRef.current = null;\n dragDirectionRef.current = undefined;\n\n //TODO why is this different from Natural Movement ?\n if (overflowMenuShowingRef.current) {\n onDrop(fromIndex, -1);\n } else {\n if (fromIndex < originalDropTargetIndex) {\n onDrop(\n fromIndex,\n dropBefore ? currentDropTargetIndex : currentDropTargetIndex + 1\n );\n } else {\n onDrop(\n fromIndex,\n dropBefore ? originalDropTargetIndex : originalDropTargetIndex + 1\n );\n }\n }\n setDropIndicator(undefined);\n }\n setShowOverflow(false);\n }, [clearSpacer, onDrop]);\n\n return {\n beginDrag,\n drag,\n drop,\n dropIndicator,\n handleScrollStart,\n handleScrollStop,\n revealOverflowedItems: showOverflow,\n };\n};\n", "import { useCallback, useMemo } from \"react\";\nimport { dropZone, MeasuredDropTarget } from \"./drop-target-utils\";\nimport { createDropIndicatorPosition } from \"./Draggable\";\n\nexport const SPACER_SIZE = 0;\n\nexport type DropIndicatorHookResult = {\n positionDropIndicator: (\n dropTarget: MeasuredDropTarget,\n dropZone: dropZone\n ) => HTMLElement;\n clearSpacer: () => void;\n};\n\nexport type DropIndicatorHook = () => DropIndicatorHookResult;\n\nexport const useDropIndicator: DropIndicatorHook = () => {\n const spacer = useMemo(() => createDropIndicatorPosition(), []);\n const clearSpacer = useCallback(() => spacer.remove(), [spacer]);\n const positionDropIndicator = useCallback(\n (dropTarget: MeasuredDropTarget, dropZone: \"start\" | \"end\" = \"end\") => {\n if (dropZone === \"end\") {\n dropTarget.element.after(spacer);\n } else {\n dropTarget.element.before(spacer);\n }\n return spacer;\n },\n [spacer]\n );\n\n return {\n positionDropIndicator,\n clearSpacer,\n };\n};\n", "import {\n DragDropHook,\n InternalDragDropProps,\n InternalDragHookResult,\n MouseOffset,\n} from \"./dragDropTypesNext\";\nimport { useDragDropNaturalMovement } from \"./useDragDropNaturalMovementNext\";\nimport { useDragDropIndicator } from \"./useDragDropIndicator\";\nimport { useDragDropProvider } from \"./DragDropProvider\";\nimport {\n MouseEventHandler,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n cloneElement,\n constrainRect,\n dimensions,\n NOT_OVERFLOWED,\n} from \"./drop-target-utils\";\nimport { useAutoScroll, ScrollStopHandler } from \"./useAutoScroll\";\nimport { Draggable } from \"./Draggable\";\n\nconst NULL_DRAG_DROP_RESULT = {\n beginDrag: () => undefined,\n drag: () => undefined,\n draggableRef: { current: null },\n drop: () => undefined,\n isDragging: false,\n isScrolling: false,\n handleScrollStart: () => undefined,\n handleScrollStop: () => undefined,\n revealOverflowedItems: false,\n};\n\ntype DraggableStatus = {\n draggable?: JSX.Element;\n draggedItemIndex: number;\n isDragging: boolean;\n};\n\ntype DragBoundary = {\n start: number;\n end: number;\n contraStart: number;\n contraEnd: number;\n};\n\nconst UNBOUNDED: DragBoundary = {\n start: 0,\n end: 1000,\n contraStart: 0,\n contraEnd: 1000,\n};\n\ntype InternalHook = (props: InternalDragDropProps) => InternalDragHookResult;\nconst noDragDrop: InternalHook = () => NULL_DRAG_DROP_RESULT;\nconst dragThreshold = 3;\n\nconst getDraggableElement = (\n el: EventTarget | null,\n query: string\n): HTMLElement => (el as HTMLElement).closest(query) as HTMLElement;\n\nconst isOverflowElement = (element: HTMLElement) =>\n element.dataset.index === \"overflow\" &&\n element.parentElement !== null &&\n element.parentElement.classList.contains(\"overflowed\");\n\nconst getLastElement = (\n container: HTMLElement,\n itemQuery: string\n): [HTMLElement, boolean] => {\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED},.vuuOverflowContainer-OverflowIndicator)`;\n const childElements = Array.from(container.querySelectorAll(fullItemQuery));\n const lastElement = childElements.pop() as HTMLElement;\n return [lastElement, isOverflowElement(lastElement)];\n};\n\nexport const useDragDropNext: DragDropHook = ({\n allowDragDrop,\n containerRef,\n draggableClassName,\n itemQuery = \"*\",\n onDragStart,\n onDrop,\n onDropSettle,\n orientation,\n ...dragDropProps\n}) => {\n const dragBoundaries = useRef<DragBoundary>({\n start: 0,\n end: 0,\n contraStart: 0,\n contraEnd: 0,\n });\n const [draggableStatus, setDraggableStatus] = useState<DraggableStatus>({\n draggable: undefined,\n draggedItemIndex: -1,\n isDragging: false,\n });\n // A ref to the draggable element\n const draggableRef = useRef<HTMLDivElement>(null);\n const dragElementRef = useRef<HTMLElement>();\n const mouseDownTimer = useRef<number | null>(null);\n /** do we actually have scrollable content */\n const isScrollableRef = useRef(false);\n /** Distance between start (top | left) of dragged element and point where user pressed to drag */\n const mouseOffsetRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** current mouse position */\n const mousePosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** mouse position when mousedown initiated drag */\n const startPosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** references the dragged Item during its final 'settling' phase post drop */\n const settlingItemRef = useRef<HTMLDivElement | null>(null);\n\n const dropPosRef = useRef(-1);\n const dropIndexRef = useRef(-1);\n\n const handleScrollStopRef = useRef<ScrollStopHandler>();\n\n const { isDragSource, isDropTarget, register } = useDragDropProvider(\n dragDropProps.id\n );\n\n if (dragDropProps.id && (isDragSource || isDropTarget)) {\n register(dragDropProps.id);\n }\n\n const terminateDrag = useCallback(() => {\n const { current: toIndex } = dropIndexRef;\n const droppedItem = containerRef.current?.querySelector(\n `${itemQuery}[data-index=\"${toIndex}\"]`\n );\n if (droppedItem) {\n droppedItem.classList.remove(\"vuuDropTarget-settling\");\n }\n\n dropIndexRef.current = -1;\n onDropSettle?.(toIndex);\n setDraggableStatus((status) => ({\n ...status,\n draggable: undefined,\n }));\n }, [containerRef, itemQuery, onDropSettle]);\n\n const getScrollDirection = useCallback(\n (mousePos: number) => {\n if (containerRef.current) {\n const { POS, SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize,\n } = containerRef.current;\n\n const maxScroll = scrollSize - clientSize;\n const canScrollFwd = scrollPos < maxScroll;\n const viewportEnd = dragBoundaries.current.end;\n const bwd =\n scrollPos > 0 &&\n mousePos - mouseOffsetRef.current[POS] <=\n dragBoundaries.current.start;\n const fwd =\n canScrollFwd && mousePos - mouseOffsetRef.current[POS] >= viewportEnd;\n return bwd ? \"bwd\" : fwd ? \"fwd\" : \"\";\n }\n },\n [containerRef, orientation]\n );\n\n const useDragDropHook: InternalHook =\n allowDragDrop === true || allowDragDrop === \"natural-movement\"\n ? useDragDropNaturalMovement\n : allowDragDrop === \"drop-indicator\"\n ? useDragDropIndicator\n : noDragDrop;\n\n const onScrollingStopped = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", scrollPos: number, atEnd: boolean) => {\n handleScrollStopRef.current?.(scrollDirection, scrollPos, atEnd);\n },\n []\n );\n\n const { isScrolling, startScrolling, stopScrolling } = useAutoScroll({\n containerRef,\n onScrollingStopped,\n orientation,\n });\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n //TODO why do we need both this and dropIndexRef ?\n dropPosRef.current = toIndex;\n onDrop?.(fromIndex, toIndex);\n dropIndexRef.current = toIndex;\n },\n [onDrop]\n );\n\n const {\n beginDrag,\n drag,\n drop,\n handleScrollStart,\n handleScrollStop,\n ...dragResult\n } = useDragDropHook({\n ...dragDropProps,\n containerRef,\n draggableRef,\n isDragSource,\n isDropTarget,\n itemQuery,\n onDrop: handleDrop,\n orientation,\n });\n // To avoid circular ref between hooks\n handleScrollStopRef.current = handleScrollStop;\n\n const dragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { CLIENT_POS, CONTRA_CLIENT_POS, CONTRA_POS, POS } =\n dimensions(orientation);\n const { clientX, clientY } = evt;\n const { [CLIENT_POS]: clientPos, [CONTRA_CLIENT_POS]: clientContraPos } =\n evt;\n const lastClientPos = mousePosRef.current[POS];\n const lastClientContraPos = mousePosRef.current[CONTRA_POS];\n\n const dragDistance = Math.abs(lastClientPos - clientPos);\n const dragOutDistance = isDragSource\n ? Math.abs(lastClientContraPos - clientContraPos)\n : 0;\n\n if (dragOutDistance - dragDistance > 5) {\n // remove the drag boundaries\n dragBoundaries.current = UNBOUNDED;\n // Need to notify the dragDropHook, so it can clearSpacers\n // and begin tracking draggable coordinates for entry into a droptarget\n }\n\n mousePosRef.current.x = clientX;\n mousePosRef.current.y = clientY;\n\n if (dragBoundaries.current === UNBOUNDED && draggableRef.current) {\n const dragPosX = mousePosRef.current.x - mouseOffsetRef.current.x;\n const dragPosY = mousePosRef.current.y - mouseOffsetRef.current.y;\n draggableRef.current.style.top = `${dragPosY}px`;\n draggableRef.current.style.left = `${dragPosX}px`;\n } else if (dragDistance > 0 && draggableRef.current) {\n const mouseMoveDirection = lastClientPos < clientPos ? \"fwd\" : \"bwd\";\n const scrollDirection = getScrollDirection(clientPos);\n const dragPos = mousePosRef.current[POS] - mouseOffsetRef.current[POS];\n\n if (\n scrollDirection &&\n isScrollableRef.current &&\n !isScrolling.current\n ) {\n handleScrollStart();\n startScrolling(scrollDirection, 1);\n } else if (!scrollDirection && isScrolling.current) {\n stopScrolling();\n }\n\n if (!isScrolling.current) {\n const renderDragPos = Math.round(\n Math.max(\n dragBoundaries.current.start,\n Math.min(dragBoundaries.current.end, dragPos)\n )\n );\n const START = orientation === \"horizontal\" ? \"left\" : \"top\";\n draggableRef.current.style[START] = `${renderDragPos}px`;\n drag(renderDragPos, mouseMoveDirection);\n }\n }\n },\n [\n drag,\n draggableRef,\n getScrollDirection,\n handleScrollStart,\n isDragSource,\n isScrolling,\n orientation,\n startScrolling,\n stopScrolling,\n ]\n );\n const dragMouseUpHandler = useCallback(() => {\n document.removeEventListener(\"mousemove\", dragMouseMoveHandler, false);\n document.removeEventListener(\"mouseup\", dragMouseUpHandler, false);\n settlingItemRef.current = draggableRef.current;\n // The implementation hook is currently invoking the onDrop callback, we should move it into here\n drop();\n setDraggableStatus((status) => ({\n ...status,\n draggedItemIndex: -1,\n isDragging: false,\n }));\n dragElementRef.current = undefined;\n }, [dragMouseMoveHandler, draggableRef, drop]);\n\n const dragStart = useCallback(\n (evt: MouseEvent) => {\n const { clientX, clientY, target } = evt;\n const dragElement = getDraggableElement(target, itemQuery);\n const { current: container } = containerRef;\n if (container && dragElement) {\n const {\n CONTRA,\n CONTRA_END,\n DIMENSION,\n END,\n SCROLL_SIZE,\n CLIENT_SIZE,\n START,\n } = dimensions(orientation);\n\n dragElementRef.current = dragElement;\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n container;\n isScrollableRef.current = scrollSize > clientSize;\n\n const [lastElement, lastItemIsOverflowIndicator] = getLastElement(\n container,\n itemQuery\n );\n\n const containerRect = container.getBoundingClientRect();\n const draggableRect = dragElement.getBoundingClientRect();\n const draggableSize = draggableRect[DIMENSION];\n const { [START]: lastItemStart, [END]: lastItemEnd } =\n lastElement.getBoundingClientRect();\n\n mouseOffsetRef.current.x = clientX - draggableRect.left;\n mouseOffsetRef.current.y = clientY - draggableRect.top;\n\n dragBoundaries.current.start = containerRect[START];\n dragBoundaries.current.end = lastItemIsOverflowIndicator\n ? Math.max(lastItemStart, containerRect.right - draggableSize)\n : isScrollableRef.current\n ? containerRect[START] + containerRect[DIMENSION] - draggableSize\n : lastItemEnd - draggableSize;\n dragBoundaries.current.contraStart = containerRect[CONTRA];\n dragBoundaries.current.contraEnd = containerRect[CONTRA_END];\n\n beginDrag(evt);\n\n const {\n dataset: { index = \"-1\" },\n } = dragElement;\n\n setDraggableStatus({\n isDragging: true,\n draggable: (\n <Draggable\n element={cloneElement(dragElement)}\n onTransitionEnd={terminateDrag}\n ref={draggableRef}\n style={constrainRect(draggableRect, containerRect)}\n wrapperClassName={draggableClassName}\n />\n ),\n draggedItemIndex: parseInt(index),\n });\n\n onDragStart?.();\n\n document.addEventListener(\"mousemove\", dragMouseMoveHandler, false);\n document.addEventListener(\"mouseup\", dragMouseUpHandler, false);\n }\n },\n [\n beginDrag,\n containerRef,\n dragMouseMoveHandler,\n dragMouseUpHandler,\n draggableClassName,\n draggableRef,\n itemQuery,\n onDragStart,\n orientation,\n terminateDrag,\n ]\n );\n\n const preDragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { CLIENT_POS, POS } = dimensions(orientation);\n const { [CLIENT_POS]: clientPos } = evt;\n const mouseMoveDistance = Math.abs(clientPos - startPosRef.current[POS]);\n if (mouseMoveDistance > dragThreshold && containerRef.current) {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n dragStart(evt);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [containerRef, beginDrag, orientation]\n );\n\n const preDragMouseUpHandler = useCallback(() => {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n }, [preDragMouseMoveHandler]);\n\n const mouseDownHandler: MouseEventHandler = useCallback(\n (evt) => {\n console.log(`useDragDropNext onMouseDown`);\n const { current: container } = containerRef;\n if (container && !evt.defaultPrevented) {\n const { clientX, clientY } = evt;\n mousePosRef.current.x = startPosRef.current.x = clientX;\n mousePosRef.current.y = startPosRef.current.y = clientY;\n\n document.addEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.addEventListener(\"mouseup\", preDragMouseUpHandler, false);\n\n evt.persist();\n\n mouseDownTimer.current = window.setTimeout(() => {\n document.removeEventListener(\n \"mousemove\",\n preDragMouseMoveHandler,\n false\n );\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n dragStart(evt.nativeEvent);\n }, 500);\n }\n },\n [containerRef, dragStart, preDragMouseMoveHandler, preDragMouseUpHandler]\n );\n\n const { current: settlingItem } = settlingItemRef;\n useLayoutEffect(() => {\n if (settlingItem && containerRef.current) {\n const dropPos = dropPosRef.current;\n const droppedItem = containerRef.current.querySelector(\n `${itemQuery}[data-index=\"${dropPos}\"]`\n );\n if (droppedItem) {\n droppedItem.classList.add(\"vuuDropTarget-settling\");\n requestAnimationFrame(() => {\n const { top: targetTop, left: targetLeft } =\n droppedItem.getBoundingClientRect();\n const { top: currentTop, left: currentLeft } =\n settlingItem.getBoundingClientRect();\n // If the droppedItem is already exactly in the drop position, we can just\n // terminate the drag here and now. Most likely, though, it is out by a few\n // pixels. We animate the dragged item into the final resting place before\n // terminating the drag.\n if (currentLeft !== targetLeft || currentTop !== targetTop) {\n settlingItem.classList.add(\"vuuDraggable-settling\");\n settlingItem.style.top = `${targetTop}px`;\n settlingItem.style.left = `${targetLeft}px`;\n } else {\n terminateDrag();\n }\n });\n } else {\n console.log(`dont have the dropped item (at ${dropPos})`);\n }\n settlingItemRef.current = null;\n }\n }, [containerRef, itemQuery, settlingItem, terminateDrag]);\n\n return {\n ...dragResult,\n ...draggableStatus,\n isScrolling,\n onMouseDown: allowDragDrop ? mouseDownHandler : undefined,\n };\n};\n", "import { RefObject, useCallback, useRef } from \"react\";\nimport { dimensions } from \"./drop-target-utils\";\n\nexport type ScrollStopHandler = (\n scrollDirection: \"fwd\" | \"bwd\",\n scrollPos: number,\n atEnd: boolean\n) => void;\n\nexport const useAutoScroll = ({\n containerRef,\n onScrollingStopped,\n orientation = \"vertical\",\n}: {\n containerRef: RefObject<HTMLElement>;\n onScrollingStopped?: ScrollStopHandler;\n orientation?: \"horizontal\" | \"vertical\";\n}) => {\n const scrollTimer = useRef<number | null>(null);\n const isScrolling = useRef(false);\n const scrollPosRef = useRef(0);\n const lastScrollDirectionRef = useRef<\"fwd\" | \"bwd\">(\"fwd\");\n\n const stopScrolling = useCallback(\n (atEnd = false) => {\n console.log(\"[useAutoScroll] stopScrolling\");\n if (scrollTimer.current !== null) {\n clearTimeout(scrollTimer.current);\n scrollTimer.current = null;\n }\n isScrolling.current = false;\n onScrollingStopped?.(\n lastScrollDirectionRef.current,\n scrollPosRef.current,\n atEnd\n );\n },\n [onScrollingStopped]\n );\n\n const startScrolling = useCallback(\n (direction: \"fwd\" | \"bwd\", scrollRate: number, scrollUnit = 30) => {\n const { current: container } = containerRef;\n if (container) {\n const { SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize,\n } = container;\n const maxScroll =\n direction === \"fwd\" ? scrollSize - clientSize - scrollPos : scrollPos;\n const nextScroll = Math.min(maxScroll, scrollUnit);\n\n if (direction === \"fwd\") {\n lastScrollDirectionRef.current = \"fwd\";\n container[SCROLL_POS as \"scrollTop\" | \"scrollLeft\"] =\n scrollPosRef.current = scrollPos + nextScroll;\n } else {\n lastScrollDirectionRef.current = \"bwd\";\n container[SCROLL_POS as \"scrollTop\" | \"scrollLeft\"] =\n scrollPosRef.current = scrollPos - nextScroll;\n }\n\n if (nextScroll === maxScroll) {\n stopScrolling(true);\n } else {\n isScrolling.current = true;\n scrollTimer.current = window.setTimeout(() => {\n startScrolling(direction, scrollRate, scrollUnit);\n }, 100);\n }\n }\n },\n [containerRef, orientation, stopScrolling]\n );\n\n return {\n isScrolling,\n startScrolling,\n stopScrolling,\n };\n};\n", "import { clsx } from \"clsx\";\nimport {\n ChangeEvent,\n KeyboardEvent,\n useCallback,\n useLayoutEffect,\n forwardRef,\n ForwardedRef,\n ReactElement,\n useRef,\n HTMLAttributes,\n} from \"react\";\nimport { Input, useControlled } from \"@salt-ds/core\";\n\nimport \"./EditableLabel.css\";\n\nconst classBase = \"vuuEditableLabel\";\n\nexport interface EditableLabelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n className?: string;\n defaultEditing?: boolean;\n defaultValue?: string;\n editing?: boolean;\n onEnterEditMode: () => void;\n onChange?: (value: string) => void;\n onExitEditMode: (\n originalLabel: string | undefined,\n editedLabel: string | undefined,\n allowDeactivation?: boolean,\n editCancelled?: boolean\n ) => void;\n defaultIsEditing?: boolean;\n value?: string;\n}\n\nexport const EditableLabel = forwardRef(function EditableLabel(\n {\n className: classNameProp,\n defaultEditing,\n defaultValue,\n editing: editingProp,\n onChange,\n onEnterEditMode,\n onExitEditMode,\n value: valueProp,\n ...restProps\n }: EditableLabelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n): ReactElement<EditableLabelProps> {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const editingRef = useRef<boolean>(false);\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue ?? \"\",\n name: \"EditableLabel\",\n state: \"value\",\n });\n\n const [editing, _setEditing] = useControlled({\n controlled: editingProp,\n default: defaultEditing ?? false,\n name: \"EditableLabel\",\n state: \"editing\",\n });\n\n const setEditing = useCallback((value: boolean) => {\n _setEditing((editingRef.current = value));\n }, []);\n\n const initialValue = useRef(value);\n\n useLayoutEffect(() => {\n if (editing) {\n if (inputRef.current !== null) {\n inputRef.current.select();\n inputRef.current.focus();\n }\n }\n }, [editing, inputRef]);\n\n const enterEditMode = useCallback(() => {\n setEditing(true);\n // ignoreBlur.current = false;\n onEnterEditMode && onEnterEditMode();\n }, [onEnterEditMode, setEditing]);\n\n const exitEditMode = ({\n cancelEdit = false,\n allowDeactivation = false,\n } = {}) => {\n setEditing(false);\n const originalValue = initialValue.current;\n if (originalValue !== value) {\n if (cancelEdit) {\n setValue(originalValue);\n } else {\n initialValue.current = value;\n }\n }\n onExitEditMode &&\n onExitEditMode(originalValue, value, allowDeactivation, cancelEdit);\n };\n\n const handleChange = (evt: ChangeEvent<HTMLInputElement>) => {\n const { value } = evt.target;\n setValue(value);\n onChange && onChange(value);\n };\n\n const handleDoubleClick = () => {\n enterEditMode();\n };\n\n // We need the ref here as the blur fires before setEditing has taken effect,\n // so we get a double call to exitEditMode if edit is cancelled.\n const handleBlur = () => {\n if (editingRef.current) {\n exitEditMode({ allowDeactivation: true });\n }\n };\n\n const handleKeyDown = (evt: KeyboardEvent<HTMLInputElement>) => {\n if (editing && evt.key === \"Enter\") {\n evt.stopPropagation();\n // we are likely to lose focus as a consequence of user response\n // to exitEdit transition, don't want it to trigger another\n //shouldn't we call setEditing here in case we are in uncontrolled mode ?\n exitEditMode();\n } else if (evt.key === \"ArrowRight\" || evt.key === \"ArrowLeft\") {\n evt.stopPropagation();\n } else if (evt.key === \"Escape\") {\n exitEditMode({ cancelEdit: true });\n }\n };\n\n const className = clsx(classBase, classNameProp, {\n [`${classBase}-editing`]: editing,\n });\n return (\n <div\n {...restProps}\n className={className}\n onDoubleClick={handleDoubleClick}\n data-text={value}\n ref={forwardedRef}\n >\n {editing ? (\n <Input\n inputProps={{ className: `${classBase}-input` }}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n inputRef={inputRef}\n style={{ padding: 0 }}\n textAlign=\"left\"\n variant=\"secondary\"\n />\n ) : (\n value\n )}\n </div>\n );\n});\n", "import { asReactElements, OverflowContainer, useId } from \"@vuu-ui/vuu-layout\";\nimport { Button } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport React, { useMemo, useRef } from \"react\";\nimport { TabProps, TabstripProps } from \"./TabsTypes\";\nimport { useTabstrip } from \"./useTabstrip\";\n\nimport \"./Tabstrip.css\";\n\nconst classBase = \"vuuTabstrip\";\n\nexport const Tabstrip = ({\n activeTabIndex: activeTabIndexProp,\n allowAddTab,\n allowCloseTab,\n allowDragDrop = false,\n allowRenameTab = false,\n animateSelectionThumb = false,\n children,\n className: classNameProp,\n id: idProp,\n keyBoardActivation = \"manual\",\n location,\n onActiveChange,\n onAddTab,\n onCloseTab,\n onExitEditMode,\n onMoveTab,\n orientation = \"horizontal\",\n showTabMenuButton,\n style: styleProp,\n ...htmlAttributes\n}: TabstripProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n activeTabIndex,\n focusVisible,\n containerStyle,\n draggedItemIndex,\n onClickAddTab,\n tabProps,\n ...tabstripHook\n } = useTabstrip({\n activeTabIndex: activeTabIndexProp,\n allowDragDrop,\n animateSelectionThumb,\n containerRef: rootRef,\n keyBoardActivation,\n onActiveChange,\n onAddTab,\n onCloseTab,\n onExitEditMode,\n onMoveTab,\n orientation,\n });\n\n const id = useId(idProp);\n const className = cx(classBase, `${classBase}-${orientation}`, classNameProp);\n const style =\n styleProp || containerStyle\n ? {\n ...styleProp,\n ...containerStyle,\n }\n : undefined;\n\n const tabs = useMemo(\n () =>\n asReactElements(children)\n .map((child, index) => {\n const {\n id: tabId = `${id}-tab-${index}`,\n closeable = allowCloseTab,\n editable = allowRenameTab,\n showMenuButton = showTabMenuButton,\n } = child.props;\n const selected = index === activeTabIndex;\n return React.cloneElement(child, {\n ...tabProps,\n ...tabstripHook.navigationProps,\n closeable,\n \"data-overflow-priority\": selected ? \"1\" : undefined,\n dragging: draggedItemIndex === index,\n editable,\n focusVisible: focusVisible === index,\n id: tabId,\n index,\n key: index,\n location,\n selected,\n showMenuButton,\n tabIndex: selected ? 0 : -1,\n } as Partial<TabProps>);\n })\n .concat(\n allowAddTab ? (\n <Button\n {...tabstripHook.navigationProps}\n aria-label=\"Create Tab\"\n className={`${classBase}-addTabButton`}\n data-icon=\"add\"\n data-overflow-priority=\"1\"\n key=\"addButton\"\n onClick={onClickAddTab}\n variant=\"secondary\"\n tabIndex={-1}\n />\n ) : (\n []\n )\n ),\n [\n activeTabIndex,\n allowAddTab,\n allowCloseTab,\n allowRenameTab,\n children,\n focusVisible,\n id,\n location,\n onClickAddTab,\n showTabMenuButton,\n tabProps,\n draggedItemIndex,\n tabstripHook.navigationProps,\n ]\n );\n\n return (\n <>\n <OverflowContainer\n {...htmlAttributes}\n {...tabstripHook.containerProps}\n className={className}\n height={28}\n id={id}\n orientation={orientation}\n overflowIcon=\"more-horiz\"\n ref={rootRef}\n style={style}\n >\n {tabs}\n </OverflowContainer>\n {tabstripHook.draggable}\n </>\n );\n};\n", "import type { MenuActionHandler } from \"@vuu-ui/vuu-data-types\";\nimport type { OverflowItem } from \"@vuu-ui/vuu-layout\";\nimport type { orientationType } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport { useDragDropNext as useDragDrop } from \"../drag-drop\";\nimport { isTabMenuOptions } from \"./TabMenuOptions\";\nimport { getIndexOfSelectedTab } from \"./tabstrip-dom-utils\";\nimport { useAnimatedSelectionThumb } from \"./useAnimatedSelectionThumb\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { useSelection } from \"./useSelection\";\n\nexport type ExitEditModeHandler = (\n originalValue: string,\n editedValue: string,\n allowDeactivation: boolean,\n tabIndex: number\n) => void;\n\nexport interface TabstripHookProps {\n activeTabIndex: number;\n allowDragDrop: boolean;\n animateSelectionThumb: boolean;\n containerRef: RefObject<HTMLElement>;\n onActiveChange?: (tabIndex: number) => void;\n onAddTab?: () => void;\n onCloseTab?: (tabIndex: number, newActiveTabIndex: number) => void;\n onExitEditMode?: ExitEditModeHandler;\n onMoveTab?: (fromIndex: number, toIndex: number) => void;\n orientation: orientationType;\n keyBoardActivation?: \"manual\" | \"automatic\";\n}\n\nconst editKeys = new Set([\"Enter\", \" \"]);\nconst isEditKey = (key: string) => editKeys.has(key);\n\nconst getElementWithIndex = (container: HTMLElement | null, index: number) => {\n if (container) {\n return container.querySelector(`[data-index=\"${index}\"]`) as HTMLElement;\n } else {\n return null;\n }\n};\n\nexport const useTabstrip = ({\n activeTabIndex: activeTabIndexProp,\n allowDragDrop,\n animateSelectionThumb,\n containerRef,\n onActiveChange,\n onAddTab,\n onCloseTab,\n onExitEditMode,\n onMoveTab,\n orientation,\n keyBoardActivation,\n}: TabstripHookProps) => {\n const lastSelection = useRef(activeTabIndexProp);\n\n const {\n focusTab: keyboardHookFocusTab,\n highlightedIdx,\n onClick: keyboardHookHandleClick,\n onKeyDown: keyboardHookHandleKeyDown,\n setHighlightedIdx: keyboardHookSetHighlightedIndex,\n ...keyboardHook\n } = useKeyboardNavigation({\n containerRef,\n keyBoardActivation,\n orientation,\n selectedIndex: lastSelection.current,\n });\n\n const {\n activateTab: selectionHookActivateTab,\n onClick: selectionHookHandleClick,\n onKeyDown: selectionHookHandleKeyDown,\n selected: selectionHookSelected,\n } = useSelection({\n highlightedIdx,\n onSelectionChange: onActiveChange,\n selected: activeTabIndexProp,\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 { containerStyle, resumeAnimation, suspendAnimation } =\n useAnimatedSelectionThumb(\n containerRef,\n animateSelectionThumb ? selectionHookSelected : -1,\n orientation\n );\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n const { current: selected } = lastSelection;\n console.log(\n `useTabstrip handleDrop ${fromIndex} - ${toIndex} ${selected}`\n );\n onMoveTab?.(fromIndex, toIndex);\n let nextSelectedTab = -1;\n if (toIndex !== -1) {\n if (selected === fromIndex) {\n nextSelectedTab = toIndex;\n } else if (fromIndex > selected && toIndex <= selected) {\n nextSelectedTab = selected + 1;\n } else if (fromIndex < selected && toIndex >= selected) {\n nextSelectedTab = selected - 1;\n }\n if (nextSelectedTab !== -1) {\n suspendAnimation();\n selectionHookActivateTab(nextSelectedTab);\n requestAnimationFrame(resumeAnimation);\n }\n keyboardHookFocusTab(toIndex, false, false, 350);\n }\n },\n [\n keyboardHookFocusTab,\n onMoveTab,\n resumeAnimation,\n selectionHookActivateTab,\n suspendAnimation,\n ]\n );\n\n const { onMouseDown: dragDropHookHandleMouseDown, ...dragDropHook } =\n useDragDrop({\n allowDragDrop,\n containerRef,\n // this is for useDragDropNext\n draggableClassName: `tabstrip-${orientation}`,\n // extendedDropZone: overflowedItems.length > 0,\n onDrop: handleDrop,\n orientation: \"horizontal\",\n itemQuery: \".vuuOverflowContainer-item\",\n });\n\n const handleExitEditMode = useCallback<ExitEditModeHandler>(\n (originalValue, editedValue, allowDeactivation, tabIndex) => {\n console.log(\n `handleExitEditMode ${originalValue} ${editedValue} ${allowDeactivation} ${tabIndex}`\n );\n onExitEditMode?.(originalValue, editedValue, allowDeactivation, tabIndex);\n if (!allowDeactivation) {\n // this indicates that Enter or Esc key has been pressed, hence we\n // want to make sure keyboardHook treats this as a keyboard event\n // (and applies focusVisible). The last parameter here does that.\n keyboardHookFocusTab(tabIndex, false, true);\n }\n },\n [keyboardHookFocusTab, onExitEditMode]\n );\n\n const handleClick = useCallback(\n (evt: ReactMouseEvent<HTMLElement>, tabIndex: number) => {\n // releasing the mouse at end of drag will trigger a click, ignore those\n // if (!dragDropHook.isDragging) {\n keyboardHookHandleClick(evt, tabIndex);\n selectionHookHandleClick(evt, tabIndex);\n // }\n },\n // [dragDropHook.isDragging, keyboardHook, selectionHook]\n [keyboardHookHandleClick, selectionHookHandleClick]\n );\n\n const getEditableLabel = useCallback(\n (tabIndex = highlightedIdx) => {\n const targetEl = getElementWithIndex(containerRef.current, tabIndex);\n if (targetEl) {\n return targetEl.querySelector(\".vuuEditableLabel\") as HTMLElement;\n }\n },\n [containerRef, highlightedIdx]\n );\n\n const tabInEditMode = useCallback(\n (tabIndex = highlightedIdx) => {\n const editableLabel = getEditableLabel(tabIndex);\n if (editableLabel) {\n return editableLabel.classList.contains(\"vuuEditableLabel-editing\");\n }\n return false;\n },\n [getEditableLabel, highlightedIdx]\n );\n\n const editTab = useCallback(\n (tabIndex = highlightedIdx) => {\n const editableLabelEl = getEditableLabel(tabIndex);\n if (editableLabelEl) {\n const evt = new MouseEvent(\"dblclick\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n editableLabelEl.dispatchEvent(evt);\n }\n },\n [getEditableLabel, highlightedIdx]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n keyboardHookHandleKeyDown(evt);\n if (!evt.defaultPrevented) {\n selectionHookHandleKeyDown(evt);\n }\n if (!evt.defaultPrevented && isEditKey(evt.key)) {\n editTab();\n }\n },\n [editTab, keyboardHookHandleKeyDown, selectionHookHandleKeyDown]\n );\n\n const handleCloseTabFromMenu = useCallback(\n (tabIndex: number) => {\n const selectedTabIndex = getIndexOfSelectedTab(containerRef.current);\n const newActiveTabIndex =\n selectedTabIndex > tabIndex\n ? selectedTabIndex - 1\n : selectedTabIndex === tabIndex\n ? 0\n : selectedTabIndex;\n suspendAnimation();\n // containerRef.current?.classList.add(\"vuuTabThumb-noTransition\");\n onCloseTab?.(tabIndex, newActiveTabIndex);\n setTimeout(() => {\n resumeAnimation();\n // containerRef.current?.classList.remove(\"vuuTabThumb-noTransition\");\n }, 200);\n return true;\n },\n [containerRef, onCloseTab, resumeAnimation, suspendAnimation]\n );\n\n const handleRenameTabFromMenu = useCallback(\n (tabIndex: number) => {\n editTab(tabIndex);\n return true;\n },\n [editTab]\n );\n\n const handleTabMenuAction = useCallback<MenuActionHandler>(\n (action) => {\n if (isTabMenuOptions(action.options)) {\n switch (action.menuId) {\n case \"close-tab\":\n return handleCloseTabFromMenu(action.options.tabIndex);\n case \"rename-tab\":\n return handleRenameTabFromMenu(action.options.tabIndex);\n default:\n console.log(`tab menu action ${action.menuId}`);\n }\n }\n return false;\n },\n [handleCloseTabFromMenu, handleRenameTabFromMenu]\n );\n\n //TODO( why do we sometimes see this fired twice eg following rename)\n const handleTabMenuClose = useCallback(() => {\n if (!tabInEditMode()) {\n keyboardHookFocusTab(highlightedIdx);\n } else {\n keyboardHookSetHighlightedIndex(highlightedIdx);\n }\n }, [\n highlightedIdx,\n keyboardHookFocusTab,\n keyboardHookSetHighlightedIndex,\n tabInEditMode,\n ]);\n\n const onSwitchWrappedItemIntoView = useCallback(\n (item: OverflowItem) => {\n const index = parseInt(item.index);\n if (!isNaN(index)) {\n selectionHookActivateTab(index);\n }\n },\n [selectionHookActivateTab]\n );\n\n const navigationProps = {\n onFocus: keyboardHook.onFocus,\n onKeyDown: handleKeyDown,\n };\n\n const handleAddTabClick = useCallback(() => {\n onAddTab?.();\n requestAnimationFrame(() => {\n const selectedTabIndex = getIndexOfSelectedTab(containerRef.current);\n if (selectedTabIndex !== -1) {\n keyboardHookFocusTab(selectedTabIndex);\n }\n });\n }, [containerRef, keyboardHookFocusTab, onAddTab]);\n\n const tabProps = {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onExitEditMode: handleExitEditMode,\n onMenuAction: handleTabMenuAction,\n onMenuClose: handleTabMenuClose,\n onMouseDown: dragDropHookHandleMouseDown,\n };\n\n return {\n activeTabIndex: selectionHookSelected,\n containerStyle,\n focusVisible: keyboardHook.focusVisible,\n containerProps: {\n ...keyboardHook.containerProps,\n onSwitchWrappedItemIntoView,\n },\n navigationProps,\n onClickAddTab: handleAddTabClick,\n tabProps,\n ...dragDropHook,\n };\n};\n", "import { ContextMenuItemDescriptor } from \"packages/vuu-data-types\";\n\nexport type MenuOptions = { [key: string]: unknown };\n\nexport interface TabMenuOptions {\n tabIndex: number;\n}\n\nexport const isTabMenuOptions = (options: unknown): options is TabMenuOptions =>\n typeof options === \"object\" &&\n options !== null &&\n \"tabIndex\" in options &&\n typeof options.tabIndex === \"number\";\n\nexport const closeCommand = (options?: MenuOptions) =>\n ({\n label: `Close`,\n location: \"tab\",\n action: `close-tab`,\n options,\n } as ContextMenuItemDescriptor);\n\nexport const renameCommand = (options?: MenuOptions) =>\n ({\n label: `Rename`,\n location: \"tab\",\n action: `rename-tab`,\n options,\n } as ContextMenuItemDescriptor);\n", "export const getElementIndex = (el: HTMLElement | null) => {\n if (el) {\n const index = parseInt(el.dataset.index || \"\");\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nconst getIndexOfItem = (container: HTMLElement | null, query: string) => {\n if (container) {\n const targetTab = container.querySelector(\n `[data-index]:has(${query})`\n ) as HTMLElement;\n return getElementIndex(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 { isValidNumber, MEASURES, orientationType } from \"@vuu-ui/vuu-utils\";\nimport { CSSProperties, RefObject, useCallback, useMemo, useRef } from \"react\";\n\nexport const useAnimatedSelectionThumb = (\n containerRef: RefObject<HTMLElement>,\n activeTabIndex: number,\n orientation: orientationType = \"horizontal\"\n) => {\n const animationSuspendedRef = useRef(false);\n const suspendAnimation = useCallback(() => {\n animationSuspendedRef.current = true;\n }, []);\n\n const resumeAnimation = useCallback(() => {\n animationSuspendedRef.current = false;\n }, []);\n\n const onTransitionEnd = useCallback(() => {\n containerRef.current?.style.setProperty(\"--tab-thumb-transition\", \"none\");\n containerRef.current?.removeEventListener(\"transitionend\", onTransitionEnd);\n }, [containerRef]);\n const lastSelectedRef = useRef(-1);\n return useMemo(() => {\n let offset = 0;\n let size = 0;\n if (lastSelectedRef.current !== -1) {\n const oldSelected =\n containerRef.current?.querySelector(\".vuuTab-selected\");\n const newSelected = containerRef.current?.querySelector(\n `[data-index=\"${activeTabIndex}\"] .vuuTab`\n );\n const { positionProp, sizeProp } = MEASURES[orientation];\n if (oldSelected && newSelected && !animationSuspendedRef.current) {\n const { [positionProp]: oldPosition, [sizeProp]: oldSize } =\n oldSelected.getBoundingClientRect();\n const { [positionProp]: newPosition } =\n newSelected.getBoundingClientRect();\n if (\n isValidNumber(oldPosition) &&\n isValidNumber(newPosition) &&\n isValidNumber(oldSize)\n ) {\n console.log({ orientation, positionProp, oldPosition, newPosition });\n offset = oldPosition - newPosition;\n size = oldSize;\n const speed = orientation === \"horizontal\" ? 1100 : 700;\n const duration = Math.abs(offset / speed);\n requestAnimationFrame(() => {\n containerRef.current?.style.setProperty(\n \"--tab-thumb-offset\",\n \"0px\"\n );\n containerRef.current?.style.setProperty(\"--tab-thumb-size\", \"100%\");\n containerRef.current?.style.setProperty(\n \"--tab-thumb-transition\",\n `all ${duration}s ease`\n );\n containerRef.current?.addEventListener(\n \"transitionend\",\n onTransitionEnd\n );\n });\n }\n }\n }\n lastSelectedRef.current = activeTabIndex;\n if (animationSuspendedRef.current) {\n return {\n containerStyle: {\n \"--tab-thumb-offset\": \"0px\",\n \"--tab-thumb-size\": \"100%\",\n } as CSSProperties,\n resumeAnimation,\n suspendAnimation,\n };\n } else {\n return {\n containerStyle: {\n \"--tab-thumb-offset\": `${offset}px`,\n \"--tab-thumb-size\": size ? `${size}px` : undefined,\n } as CSSProperties,\n resumeAnimation,\n suspendAnimation,\n };\n }\n }, [\n activeTabIndex,\n containerRef,\n orientation,\n onTransitionEnd,\n resumeAnimation,\n suspendAnimation,\n ]);\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport { getFocusableElement, orientationType } 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 \"./tabstrip-dom-utils\";\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 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 getElementByPosition = (container: HTMLElement | null, index: number) =>\n container\n ? (container.querySelector(`[data-index=\"${index}\"]`) as HTMLElement)\n : null;\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface TabstripNavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n keyBoardActivation?: \"manual\" | \"automatic\";\n orientation: orientationType;\n selectedIndex: number | null;\n}\n\ninterface TabstripNavigationHookResult {\n containerProps: ContainerNavigationProps;\n highlightedIdx: number;\n focusTab: (\n tabIndex: 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 setHighlightedIdx: (highlightedIndex: number) => void;\n}\n\nexport const useKeyboardNavigation = ({\n containerRef,\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n keyBoardActivation,\n orientation,\n selectedIndex: selectedTabIndex = 0,\n}: TabstripNavigationHookProps): TabstripNavigationHookResult => {\n const manualActivation = keyBoardActivation === \"manual\";\n const mouseClickPending = useRef(false);\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\n const [, forceRefresh] = useState({});\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 focusTab = useCallback(\n (\n tabIndex: 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 setHighlightedIdx(tabIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const element = getElementByPosition(containerRef.current, tabIndex);\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 === -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 } else {\n setTimeout(() => {\n // The selected tab will have tabIndex 0 make sure our internal state is aligned.\n if (focusedRef.current === -1 && selectedTabIndex !== null) {\n setHighlightedIdx(selectedTabIndex);\n }\n }, 200);\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 while (\n ((nextDirection === \"fwd\" && nextIdx < indexCount) ||\n (nextDirection === \"bwd\" && nextIdx > 0)) &&\n !isNonWrappedElement(\n getElementByPosition(containerRef.current, nextIdx)\n )\n ) {\n const newIdx = nextItemIdx(indexCount, nextDirection, nextIdx);\n if (newIdx === nextIdx) {\n break;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [containerRef, getIndexCount]\n );\n\n // forceFocusVisible supports an edge case - first or last Tab are clicked\n // then Left or Right Arrow keys are pressed, There will be no navigation\n // but focusVisible must be applied\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent, forceFocusVisible = false) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n if (manualActivation) {\n focusTab(nextIdx, immediateFocus);\n } else {\n // activateTab(newTabIndex);\n }\n } else if (forceFocusVisible) {\n forceRefresh({});\n }\n },\n [\n highlightedIdx,\n manualActivation,\n nextFocusableItemIdx,\n focusTab,\n orientation,\n ]\n );\n\n const highlightedTabHasMenu = 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 activateTabMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n const menuEl = el?.querySelector(\".vuuPopupMenu\") as HTMLElement;\n if (menuEl) {\n const evt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n menuEl.dispatchEvent(evt);\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, true);\n }\n } else if (isMenuActivationKey(e.key) && highlightedTabHasMenu()) {\n activateTabMenu();\n }\n },\n [\n activateTabMenu,\n getIndexCount,\n highlightedTabHasMenu,\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, tabIndex: number) => {\n setHighlightedIdx(tabIndex);\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 containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".vuuTabstrip\");\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 focusTab,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n setHighlightedIdx,\n };\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport { KeyboardEvent, MouseEvent, useCallback } from \"react\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport const isTabElement = (el: HTMLElement): boolean =>\n el && el.matches('[class*=\"vuuTab \"]');\n\n// TODO use SelectionProps\nexport const useSelection = ({\n defaultSelected,\n highlightedIdx,\n onSelectionChange,\n selected: selectedProp,\n}: {\n defaultSelected?: number;\n highlightedIdx: number;\n onSelectionChange?: (tabIndex: number) => void;\n selected?: number;\n}): {\n activateTab: (tabIndex: number) => void;\n isControlled: boolean;\n onClick: (evt: MouseEvent<Element>, tabIndex: number) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n selected: number;\n} => {\n const [selected, setSelected, isControlled] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? 0,\n name: \"Tabstrip\",\n state: \"value\",\n });\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => defaultSelectionKeys.includes(evt.key),\n []\n );\n\n const selectItem = useCallback(\n (tabIndex: number) => {\n setSelected(tabIndex);\n onSelectionChange?.(tabIndex);\n },\n [onSelectionChange, setSelected]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const targetElement = e.target as HTMLElement;\n if (\n isSelectionEvent(e) &&\n highlightedIdx !== selected &&\n isTabElement(targetElement)\n ) {\n e.stopPropagation();\n e.preventDefault();\n selectItem(highlightedIdx);\n }\n },\n [isSelectionEvent, highlightedIdx, selected, selectItem]\n );\n\n const onClick = useCallback(\n (e: MouseEvent, tabIndex: number) => {\n if (tabIndex !== selected) {\n selectItem(tabIndex);\n }\n },\n [selectItem, selected]\n );\n\n return {\n activateTab: selectItem,\n isControlled,\n onClick,\n onKeyDown: handleKeyDown,\n selected,\n };\n};\n", "// TODO close button needs to be a button. Hence tab needs to include 2 buttons\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { MenuActionHandler } from \"packages/vuu-data-types\";\nimport {\n FocusEvent,\n ForwardedRef,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n useCallback,\n useRef,\n} from \"react\";\nimport { EditableLabel, EditableLabelProps } from \"../editable-label\";\nimport { TabMenu } from \"./TabMenu\";\nimport { TabProps } from \"./TabsTypes\";\n\nimport \"./Tab.css\";\n\nconst classBase = \"vuuTab\";\n\nconst noop = () => undefined;\n\nexport const Tab = forwardRef(function Tab(\n {\n ariaControls,\n children,\n className,\n closeable = false,\n dragging,\n editable = false,\n editing,\n focusVisible,\n index = -1,\n label,\n location,\n onClick,\n onClose,\n onEnterEditMode = noop,\n onExitEditMode = noop,\n onFocus: onFocusProp,\n onKeyUp,\n onMenuAction,\n onMenuClose,\n orientation,\n selected,\n showMenuButton = closeable || editable,\n tabIndex,\n ...props\n }: TabProps,\n ref: ForwardedRef<HTMLDivElement>\n): ReactElement<TabProps> {\n if (showMenuButton && typeof onMenuAction !== \"function\") {\n throw Error(\"Tab onMenuAction must be provided if showMenuButton is set\");\n }\n\n const rootRef = useRef<HTMLDivElement>(null);\n const editableRef = useRef<HTMLDivElement>(null);\n const setForkRef = useForkRef(ref, rootRef);\n const handleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n if (!editing) {\n e.preventDefault();\n onClick?.(e, index);\n }\n },\n [editing, index, onClick]\n );\n\n const handleOnExitEditMode: EditableLabelProps[\"onExitEditMode\"] = (\n originalValue = \"\",\n editedValue = \"\",\n allowDeactivation = true\n ) => onExitEditMode(originalValue, editedValue, allowDeactivation, index);\n\n const handleKeyUp = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"Backspace\":\n case \"Delete\":\n if (closeable) {\n e.stopPropagation();\n onClose && onClose(index);\n }\n break;\n default:\n onKeyUp && onKeyUp(e, index);\n }\n };\n\n const getLabel = () => {\n if (editable) {\n return (\n <EditableLabel\n editing={editing}\n defaultValue={label}\n // Create a fresh instance after each edit, so it can be uncontrolled ...\n key={label}\n onEnterEditMode={onEnterEditMode}\n onExitEditMode={handleOnExitEditMode}\n ref={editableRef}\n />\n );\n } else {\n return label;\n }\n };\n\n const handleFocus = (evt: FocusEvent<HTMLElement>) => {\n if (editableRef.current) {\n const editable = editableRef.current as HTMLElement;\n const input = editable.querySelector(\n \".vuuEditableLabel-input\"\n ) as HTMLInputElement;\n input?.focus();\n }\n onFocusProp?.(evt);\n };\n\n return (\n <div\n {...props}\n aria-controls={ariaControls}\n aria-selected={selected}\n className={cx(classBase, {\n [`${classBase}-closeable`]: closeable,\n \"vuuDraggable-dragAway\": dragging,\n [`${classBase}-editing`]: editing,\n [`${classBase}-selected`]: selected || undefined,\n [`${classBase}-vertical`]: orientation === \"vertical\",\n [`vuuFocusVisible`]: focusVisible,\n })}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyUp={handleKeyUp}\n ref={setForkRef}\n role=\"tab\"\n tabIndex={tabIndex}\n >\n <div className={`${classBase}-main`}>\n <span\n className={`${classBase}-text`}\n // data-text is important, it determines the width of the tab. A pseudo\n // element assigns data-text as content. This is styled as selected tab\n // text. That means width of tab always corresponds to its selected state,\n // so tabs do not change size when selected (ie when the text is bolded).\n // Do not include if we have editable content, EditableLabel will determine\n // the width\n data-text={editable ? undefined : label}\n >\n {children ?? getLabel()}\n </span>\n </div>\n {showMenuButton ? (\n <TabMenu\n allowClose={closeable}\n allowRename={editable}\n location={location}\n onMenuAction={onMenuAction as MenuActionHandler}\n onMenuClose={onMenuClose}\n index={index}\n />\n ) : null}\n </div>\n );\n});\n", "import { PopupMenu } from \"@vuu-ui/vuu-popups\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"packages/vuu-data-types\";\nimport { useMemo } from \"react\";\nimport cx from \"classnames\";\n\nimport \"./TabMenu.css\";\nimport { closeCommand, MenuOptions, renameCommand } from \"./TabMenuOptions\";\n\nconst classBase = \"vuuTabMenu\";\n\nexport interface TabMenuProps {\n allowClose: boolean;\n allowRename: boolean;\n location?: string;\n onMenuAction: MenuActionHandler;\n onMenuClose?: () => void;\n index: number;\n}\n\nexport const TabMenu = ({\n allowClose,\n allowRename,\n location,\n onMenuAction,\n onMenuClose,\n index,\n}: TabMenuProps) => {\n const [menuBuilder, menuOptions] = useMemo(\n (): [MenuBuilder, MenuOptions] => [\n (_location, options) => {\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (allowRename) {\n menuItems.push(renameCommand(options as MenuOptions));\n }\n if (allowClose) {\n menuItems.push(closeCommand(options as MenuOptions));\n }\n return menuItems;\n },\n {\n tabIndex: index,\n },\n ],\n [allowClose, allowRename, index]\n );\n\n return (\n <PopupMenu\n className={classBase}\n menuBuilder={menuBuilder}\n menuActionHandler={onMenuAction}\n menuLocation={cx(\"tab\", location)}\n menuOptions={menuOptions}\n onMenuClose={onMenuClose}\n tabIndex={-1}\n />\n );\n};\n", "import { useForkRef, useIdMemo as useId } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n MouseEvent,\n useRef,\n} from \"react\";\nimport { closestListItemIndex } from \"./list-dom-utils\";\nimport { useItemsWithIds } from \"./use-items-with-ids\";\nimport {\n GroupSelection,\n groupSelectionEnabled,\n TreeNodeSelectionHandler,\n TreeSelection,\n} from \"./use-selection\";\nimport { useViewportTracking } from \"./use-viewport-tracking\";\nimport { useTree } from \"./useTree\";\n\nimport \"./Tree.css\";\n\nconst classBase = \"vuuTree\";\n\ntype Indexer = {\n value: number;\n};\n\nexport interface TreeSourceNode {\n id: string;\n icon?: string;\n header?: boolean;\n label: string;\n childNodes?: TreeSourceNode[];\n}\nexport interface NormalisedTreeSourceNode extends TreeSourceNode {\n childNodes?: NormalisedTreeSourceNode[];\n count: number;\n expanded?: boolean;\n index: number;\n level: number;\n}\n\nexport interface NonLeafNode extends NormalisedTreeSourceNode {\n childNodes: NormalisedTreeSourceNode[];\n}\n\nexport const isExpanded = (\n node: NormalisedTreeSourceNode\n): node is NonLeafNode => node.expanded === true;\n\nexport interface TreeNodeProps extends HTMLAttributes<HTMLLIElement> {\n idx?: number;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport const TreeNode = ({ children, idx, ...props }: TreeNodeProps) => {\n return <li {...props}>{children}</li>;\n};\n\nexport interface TreeProps extends HTMLAttributes<HTMLUListElement> {\n allowDragDrop?: boolean;\n defaultSelected?: any;\n groupSelection?: GroupSelection;\n onHighlight?: (index: number) => void;\n onSelectionChange: (selected: TreeSourceNode[]) => void;\n revealSelected?: boolean;\n selected?: string[];\n selection?: TreeSelection;\n source: TreeSourceNode[];\n}\n\nconst Tree = forwardRef(function Tree(\n {\n allowDragDrop,\n className,\n defaultSelected,\n groupSelection = \"none\",\n id: idProp,\n onHighlight,\n onSelectionChange,\n revealSelected,\n selected: selectedProp,\n selection = \"single\",\n source,\n ...htmlAttributes\n }: TreeProps,\n forwardedRef: ForwardedRef<HTMLUListElement>\n) {\n const id = useId(idProp);\n const rootRef = useRef<HTMLUListElement>(null);\n\n // returns the full source data\n const [, sourceWithIds, sourceItemById] = useItemsWithIds(source, id, {\n revealSelected: revealSelected\n ? selectedProp ?? defaultSelected ?? false\n : undefined,\n });\n\n const handleSelectionChange: TreeNodeSelectionHandler = (evt, selected) => {\n if (onSelectionChange) {\n const sourceItems = selected\n .map((id) => sourceItemById(id))\n .filter((sourceItem) => sourceItem !== undefined) as TreeSourceNode[];\n onSelectionChange(sourceItems);\n }\n };\n\n const {\n focusVisible,\n highlightedIdx,\n hiliteItemAtIndex,\n listProps,\n listItemHandlers,\n selected,\n visibleData,\n } = useTree({\n defaultSelected,\n groupSelection,\n onChange: handleSelectionChange,\n onHighlight,\n selected: selectedProp,\n selection,\n sourceWithIds,\n });\n\n // const isScrolling = useViewportTracking(root, highlightedIdx);\n useViewportTracking(rootRef, highlightedIdx);\n\n const defaultItemHandlers = {\n onMouseEnter: (evt: MouseEvent) => {\n // if (!isScrolling.current) {\n const targetEl = evt.target as HTMLElement;\n const idx = closestListItemIndex(targetEl);\n hiliteItemAtIndex(idx);\n // onMouseEnterListItem && onMouseEnterListItem(evt, idx);\n // }\n },\n };\n\n const propsCommonToAllListItems = {\n ...defaultItemHandlers,\n ...listItemHandlers,\n role: \"treeitem\",\n };\n const allowGroupSelect = groupSelectionEnabled(groupSelection);\n\n /**\n * Add a ListItem from source item\n */\n function addLeafNode(\n list: JSX.Element[],\n item: NormalisedTreeSourceNode,\n idx: Indexer\n ) {\n list.push(\n <TreeNode\n {...propsCommonToAllListItems}\n {...getListItemProps(item, idx, highlightedIdx, selected, focusVisible)}\n >\n {item.icon ? (\n <span className={`${classBase}Node-icon`} data-icon={item.icon} />\n ) : null}\n <span>{item.label}</span>\n </TreeNode>\n );\n idx.value += 1;\n }\n\n function addGroupNode(\n list: JSX.Element[],\n child: NormalisedTreeSourceNode,\n idx: Indexer,\n id: string,\n title: string\n ) {\n const { value: i } = idx;\n idx.value += 1;\n list.push(\n <TreeNode\n {...listItemHandlers}\n aria-expanded={child.expanded}\n aria-level={child.level}\n aria-selected={selected.includes(id) || undefined}\n className={cx(`${classBase}Node`, {\n focusVisible: focusVisible === i,\n [`${classBase}Node-toggle`]: !allowGroupSelect,\n })}\n data-idx={i}\n data-highlighted={i === highlightedIdx || undefined}\n data-selectable\n id={id}\n key={`header-${i}`}\n >\n {allowGroupSelect ? (\n <div className={`${classBase}Node-label`}>\n <span className={`${classBase}Node-toggle`} />\n {title}\n </div>\n ) : (\n <div className={`${classBase}Node-label`}>\n {child.icon ? (\n <span\n className={`${classBase}Node-icon`}\n data-icon={child.icon}\n />\n ) : null}\n <span>{title}</span>\n </div>\n )}\n <ul role=\"group\">\n {isExpanded(child) ? renderSourceContent(child.childNodes, idx) : \"\"}\n </ul>\n </TreeNode>\n );\n }\n\n function renderSourceContent(\n items: NormalisedTreeSourceNode[],\n idx = { value: 0 }\n ) {\n if (items?.length > 0) {\n const listItems: JSX.Element[] = [];\n for (const item of items) {\n if (item.childNodes) {\n addGroupNode(listItems, item, idx, item.id, item.label);\n } else {\n addLeafNode(listItems, item, idx);\n }\n }\n return listItems;\n }\n }\n\n return (\n <ul\n {...htmlAttributes}\n {...listProps}\n className={cx(classBase, className)}\n id={`Tree-${id}`}\n ref={useForkRef<HTMLUListElement>(rootRef, forwardedRef)}\n role=\"tree\"\n tabIndex={0}\n >\n {renderSourceContent(visibleData)}\n </ul>\n );\n});\n\nconst getListItemProps = (\n item: NormalisedTreeSourceNode,\n idx: Indexer,\n highlightedIdx: number,\n selected: string[],\n focusVisible: number,\n className?: string\n) => ({\n id: item.id,\n key: item.id,\n \"aria-level\": item.level,\n \"aria-selected\": selected.includes(item.id) || undefined,\n \"data-idx\": idx.value,\n \"data-highlighted\": idx.value === highlightedIdx || undefined,\n className: cx(\"vuuTreeNode\", className, {\n focusVisible: focusVisible === idx.value,\n }),\n});\n\nTree.displayName = \"Tree\";\nexport default Tree;\n", "export const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n let idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if ((idx = listItemEl.ariaPosInSet ?? \"-1\")) {\n return parseInt(idx, 10) - 1;\n }\n }\n}\n\nexport const listItemId = (el: HTMLElement | null) => el?.id;\n\nexport const closestListItem = (el: HTMLElement) =>\n el.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { useCallback, useMemo } from \"react\";\nimport { NormalisedTreeSourceNode, TreeSourceNode } from \"./Tree\";\n\nconst PathSeparators = new Set([\"/\", \"-\", \".\"]);\n// TODO where do we define or identify separators\nconst isPathSeparator = (char: string) => PathSeparators.has(char);\n\nconst isParentPath = (parentPath: string, childPath: string) =>\n childPath.startsWith(parentPath) &&\n isPathSeparator(childPath[parentPath.length]);\n\ntype Indexer = {\n index: number;\n};\n\ntype SourceItemById = (\n id: string,\n target?: NormalisedTreeSourceNode[]\n) => TreeSourceNode | undefined;\n\nexport const useItemsWithIds = (\n sourceProp: TreeSourceNode[],\n idRoot = \"root\",\n {\n collapsibleHeaders = undefined,\n defaultExpanded = false,\n revealSelected = false,\n } = {}\n): [number, NormalisedTreeSourceNode[], SourceItemById] => {\n const countChildItems = (\n item: TreeSourceNode,\n items: TreeSourceNode[],\n idx: number\n ) => {\n if (item.childNodes) {\n return item.childNodes.length;\n } else if (item.header) {\n let i = idx + 1;\n let count = 0;\n while (i < items.length && !items[i].header) {\n count++;\n i++;\n }\n return count;\n } else {\n return 0;\n }\n };\n\n const isExpanded = useCallback(\n (path) => {\n if (Array.isArray(revealSelected)) {\n return revealSelected.some((id) => isParentPath(path, id));\n }\n return defaultExpanded;\n },\n [defaultExpanded, revealSelected]\n );\n\n const normalizeItems = useCallback(\n (\n items: TreeSourceNode[],\n indexer: Indexer,\n level = 1,\n path = \"\",\n results: NormalisedTreeSourceNode[] = [],\n flattenedSource: TreeSourceNode[] = []\n ): [number, NormalisedTreeSourceNode[], TreeSourceNode[]] => {\n let count = 0;\n // TODO get rid of the Proxy\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `${i}`;\n const id = item.id ?? `${idRoot}-${childPath}`;\n\n const expanded = nonCollapsible ? undefined : isExpanded(id);\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: NormalisedTreeSourceNode = {\n ...item,\n childNodes: undefined,\n id,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n expanded,\n index: indexer.index,\n level,\n };\n results.push(normalisedItem);\n flattenedSource.push(items[i]);\n\n count += 1;\n indexer.index += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [childCount, children] = normalizeItems(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedSource\n );\n normalisedItem.childNodes = children;\n if (expanded === true || isNonCollapsibleGroupNode) {\n count += childCount;\n }\n }\n });\n return [count, results, flattenedSource];\n },\n [collapsibleHeaders, idRoot, isExpanded]\n );\n\n const [count, sourceWithIds, flattenedSource] = useMemo<\n [number, NormalisedTreeSourceNode[], TreeSourceNode[]]\n >(() => {\n return normalizeItems(sourceProp, { index: 0 });\n }, [normalizeItems, sourceProp]);\n\n const sourceItemById = useCallback<SourceItemById>(\n (id, target = sourceWithIds): TreeSourceNode | undefined => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id))\n );\n if (sourceWithId?.id === id) {\n return flattenedSource[sourceWithId.index];\n } else if (sourceWithId) {\n return sourceItemById(id, sourceWithId.childNodes);\n }\n },\n [flattenedSource, sourceWithIds]\n );\n\n return [count, sourceWithIds, sourceItemById];\n};\n", "import {\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nexport type TreeSelection =\n | \"none\"\n | \"single\"\n | \"checkbox\"\n | \"multi\"\n | \"extended\";\n\nexport const SINGLE = \"single\";\nexport const CHECKBOX = \"checkbox\";\nexport const MULTI = \"multi\";\nexport const EXTENDED = \"extended\";\n\nexport type GroupSelection = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nconst NO_HANDLERS = {};\n\nconst isCollapsibleItem = (item: NormalisedTreeSourceNode) =>\n item.expanded !== undefined;\n\nexport type TreeNodeSelectionHandler = (\n evt: SyntheticEvent,\n selected: string[]\n) => void;\n\nexport const groupSelectionEnabled = (groupSelection: GroupSelection) =>\n groupSelection && groupSelection !== \"none\";\n\nexport interface SelectionHookProps {\n defaultSelected?: string[];\n highlightedIdx: number;\n onChange: TreeNodeSelectionHandler;\n selected?: string[];\n selection: TreeSelection;\n selectionKeys?: string[];\n treeNodes: NormalisedTreeSourceNode[];\n}\n\nexport interface SelectionHookResult {\n listHandlers: {\n onKeyDown?: (evt: KeyboardEvent) => void;\n onKeyboardNavigation?: (evt: KeyboardEvent, currentIndex: number) => void;\n };\n listItemHandlers: {\n onClick?: (evt: MouseEvent) => void;\n };\n selected: string[];\n setSelected: (selected: string[]) => void;\n}\n\nexport const useSelection = ({\n defaultSelected,\n highlightedIdx,\n treeNodes,\n onChange,\n selected: selectedProp,\n selection = SINGLE,\n selectionKeys = defaultSelectionKeys,\n}: SelectionHookProps): SelectionHookResult => {\n const singleSelect = selection === SINGLE;\n const multiSelect = selection === MULTI || selection.startsWith(CHECKBOX);\n const extendedSelect = selection === EXTENDED;\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt) => selectionKeys.includes(evt.key),\n [selectionKeys]\n );\n\n const [selected, setSelected] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"selected\",\n });\n\n // const highlightedIdxRef = useRef();\n // highlightedIdxRef.current = highlightedIdx;\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n id: string,\n rangeSelect: boolean,\n preserveExistingSelection = false\n ) => {\n const { current: active } = lastActive;\n const isSelected = selected?.includes(id);\n const inactiveRange = active === -1;\n const actsLikeSingleSelect =\n singleSelect ||\n (extendedSelect &&\n !preserveExistingSelection &&\n (!rangeSelect || inactiveRange));\n const actsLikeMultiSelect =\n multiSelect ||\n (extendedSelect && preserveExistingSelection && !rangeSelect);\n\n let newSelected: string[] = [];\n if (actsLikeSingleSelect && isSelected) {\n newSelected = [];\n } else if (actsLikeSingleSelect) {\n newSelected = [id];\n } else if (actsLikeMultiSelect && isSelected) {\n newSelected = selected.filter((i) => i !== id);\n } else if (actsLikeMultiSelect) {\n newSelected = selected.concat(id);\n } else if (extendedSelect) {\n const [from, to] = idx > active ? [active, idx] : [idx, active];\n newSelected = selected.slice();\n for (let i = from; i <= to; i++) {\n const { id } = treeNodes[i];\n if (!selected.includes(id)) {\n newSelected.push(id);\n }\n }\n }\n setSelected(newSelected);\n if (onChange) {\n onChange(evt, newSelected);\n }\n },\n [\n extendedSelect,\n treeNodes,\n multiSelect,\n onChange,\n selected,\n setSelected,\n singleSelect,\n ]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n if (~highlightedIdx && isSelectionEvent(evt)) {\n evt.preventDefault();\n const item = treeNodes[highlightedIdx];\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item.id,\n false,\n evt.ctrlKey || evt.metaKey\n );\n if (extendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n },\n [\n extendedSelect,\n highlightedIdx,\n treeNodes,\n isSelectionEvent,\n selectItemAtIndex,\n ]\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (extendedSelect && evt.shiftKey) {\n const item = treeNodes[currentIndex];\n selectItemAtIndex(evt, currentIndex, item.id, true);\n }\n },\n [extendedSelect, treeNodes, selectItemAtIndex]\n );\n\n const listHandlers =\n selection === \"none\"\n ? NO_HANDLERS\n : {\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n if (highlightedIdx !== -1) {\n const item = treeNodes[highlightedIdx];\n if (!isCollapsibleItem(item)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item.id,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey\n );\n if (extendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n }\n },\n [extendedSelect, highlightedIdx, treeNodes, selectItemAtIndex]\n );\n\n const listItemHandlers =\n selection === \"none\"\n ? NO_HANDLERS\n : {\n onClick: handleClick,\n };\n\n return {\n listHandlers,\n listItemHandlers,\n selected,\n setSelected,\n };\n};\n", "import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { useResizeObserver } from \"./use-resize-observer\";\n\nconst HeightOnly = [\"height\", \"scrollHeight\"];\n\nexport const useViewportTracking = (\n root: RefObject<HTMLElement>,\n highlightedIdx: number,\n stickyHeaders = false\n) => {\n const scrollTop = useRef(0);\n const scrolling = useRef(false);\n const rootHeight = useRef(0);\n const rootScrollHeight = useRef(0);\n\n const scrollIntoView = useCallback(\n (el) => {\n const targetEl = el.ariaExpanded ? el.firstChild : el;\n const headerHeight = stickyHeaders ? 30 : 0;\n const t = targetEl.offsetTop;\n const h = targetEl.offsetHeight;\n const viewportStart = scrollTop.current + headerHeight;\n const viewportEnd = viewportStart + rootHeight.current - headerHeight;\n\n if (t + h > viewportEnd || t < viewportStart) {\n scrollTop.current =\n t + h > viewportEnd\n ? scrollTop.current + (t + h) - viewportEnd\n : t - headerHeight;\n\n scrolling.current = true;\n if (root.current) {\n root.current.scrollTop = scrollTop.current;\n }\n setTimeout(() => {\n scrolling.current = false;\n });\n }\n },\n [root, stickyHeaders]\n );\n\n const scrollHandler = useCallback((e) => {\n scrollTop.current = e.target.scrollTop;\n }, []);\n\n useEffect(() => {\n const { current: rootEl } = root;\n if (rootEl) {\n rootEl.addEventListener(\"scroll\", scrollHandler);\n }\n\n return () => {\n if (rootEl) {\n rootEl.removeEventListener(\"scroll\", scrollHandler);\n }\n };\n }, [root, scrollHandler]);\n\n useLayoutEffect(() => {\n if (\n highlightedIdx !== -1 &&\n rootScrollHeight.current > rootHeight.current\n ) {\n if (root.current) {\n const item = root.current.querySelector(`\n [data-idx='${highlightedIdx}'],\n [aria-posinset='${highlightedIdx + 1}']\n `);\n if (item === null) {\n console.log(\n \"[useViewportTracking], is this virtualised ? we're going to have to know rowHeight\"\n );\n } else {\n scrollIntoView(item);\n }\n }\n }\n }, [highlightedIdx, root, scrollIntoView]);\n\n useEffect(() => {\n // onsole.log('TODO measure the sticky header')\n }, [stickyHeaders]);\n\n const onResize = useCallback(({ height, scrollHeight }) => {\n rootHeight.current = height;\n rootScrollHeight.current = scrollHeight;\n }, []);\n\n useResizeObserver(root, HeightOnly, onResize, true);\n\n return scrolling;\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 element.clientHeight;\n case \"clientWidth\":\n return element.clientWidth;\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(element.scrollHeight);\n case \"scrollWidth\":\n return Math.ceil(element.scrollWidth);\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\nconst isScrollAttribute = {\n scrollHeight: true,\n scrollWidth: true,\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 (let [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: 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 return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n { width, height, contentHeight, contentWidth },\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 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 { KeyboardEvent, useCallback, useRef } from \"react\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport {\n GroupSelection,\n TreeNodeSelectionHandler,\n TreeSelection,\n useSelection,\n} from \"./use-selection\";\nimport { useHierarchicalData } from \"./use-hierarchical-data\";\nimport { useCollapsibleGroups } from \"./use-collapsible-groups\";\nimport { useTreeKeyboardNavigation } from \"./use-tree-keyboard-navigation\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nconst EMPTY_ARRAY: string[] = [];\n\nexport interface TreeHookProps {\n defaultSelected?: string[];\n groupSelection: GroupSelection;\n onChange: TreeNodeSelectionHandler;\n onHighlight?: (index: number) => void;\n selected?: string[];\n selection: TreeSelection;\n sourceWithIds: NormalisedTreeSourceNode[];\n}\n\nexport const useTree = ({\n defaultSelected,\n sourceWithIds,\n onChange,\n onHighlight: onHighlightProp,\n selected: selectedProp,\n selection,\n}: TreeHookProps) => {\n const lastSelection = useRef<string[]>(EMPTY_ARRAY);\n const dataHook = useHierarchicalData(sourceWithIds);\n\n const handleKeyboardNavigation = (evt: KeyboardEvent, nextIdx: number) => {\n selectionHook.listHandlers.onKeyboardNavigation?.(evt, nextIdx);\n };\n\n const { highlightedIdx, ...keyboardHook } = useKeyboardNavigation({\n treeNodes: dataHook.indexPositions,\n onHighlight: onHighlightProp,\n onKeyboardNavigation: handleKeyboardNavigation,\n selected: lastSelection.current,\n });\n\n const collapsibleHook = useCollapsibleGroups({\n collapsibleHeaders: true,\n highlightedIdx,\n treeNodes: dataHook.indexPositions,\n setVisibleData: dataHook.setData,\n source: dataHook.data,\n });\n\n const selectionHook = useSelection({\n defaultSelected,\n highlightedIdx,\n treeNodes: dataHook.indexPositions,\n onChange,\n selected: selectedProp,\n selection,\n });\n\n const treeNavigationHook = useTreeKeyboardNavigation({\n source: dataHook.data,\n highlightedIdx,\n hiliteItemAtIndex: keyboardHook.hiliteItemAtIndex,\n indexPositions: dataHook.indexPositions,\n });\n\n const handleClick = useCallback(\n (evt) => {\n collapsibleHook.listItemHandlers?.onClick(evt);\n if (!evt.defaultPrevented) {\n selectionHook.listItemHandlers?.onClick?.(evt);\n }\n },\n [collapsibleHook, selectionHook]\n );\n\n const handleKeyDown = useCallback(\n (evt) => {\n keyboardHook.listProps.onKeyDown?.(evt);\n if (!evt.defaultPrevented) {\n selectionHook.listHandlers.onKeyDown?.(evt);\n }\n if (!evt.defaultPrevented) {\n collapsibleHook.listHandlers.onKeyDown?.(evt);\n }\n if (!evt.defaultPrevented) {\n treeNavigationHook.listHandlers.onKeyDown?.(evt);\n }\n },\n [\n collapsibleHook.listHandlers,\n keyboardHook.listProps,\n selectionHook.listHandlers,\n treeNavigationHook.listHandlers,\n ]\n );\n\n const getActiveDescendant = () =>\n highlightedIdx === undefined || highlightedIdx === -1\n ? undefined\n : dataHook.indexPositions[highlightedIdx]?.id;\n\n // We need this on reEntry for navigation hook to handle focus\n lastSelection.current = selectionHook.selected;\n\n const listProps = {\n \"aria-activedescendant\": getActiveDescendant(),\n onBlur: keyboardHook.listProps.onBlur,\n onFocus: keyboardHook.listProps.onFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: keyboardHook.listProps.onMouseDownCapture,\n onMouseLeave: keyboardHook.listProps.onMouseLeave,\n onMouseMove: keyboardHook.listProps.onMouseMove,\n };\n\n const listItemHandlers = {\n onClick: handleClick,\n };\n\n return {\n focusVisible: keyboardHook.focusVisible,\n highlightedIdx,\n hiliteItemAtIndex: keyboardHook.hiliteItemAtIndex,\n listProps,\n listItemHandlers,\n selected: selectionHook.selected,\n visibleData: dataHook.data,\n };\n};\n", "import { KeyboardEvent, useCallback, useMemo, useRef } from \"react\";\nimport { getIndexOfNode, getNodeById } from \"./hierarchical-data-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { ArrowDown, ArrowLeft, ArrowUp, isNavigationKey } from \"./key-code\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === ArrowUp || key === ArrowLeft) {\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 isLeaf = (item: NormalisedTreeSourceNode) =>\n !item.header && !item.childNodes;\nconst isFocusable = (item: NormalisedTreeSourceNode) =>\n isLeaf(item) || item.expanded !== undefined;\n\nexport interface KeyboardNavigationHookProps {\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n onHighlight?: (highlightedIdx: number) => void;\n onKeyboardNavigation?: (evt: KeyboardEvent, nextIdx: number) => void;\n selected: string[];\n treeNodes: NormalisedTreeSourceNode[];\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n treeNodes,\n onHighlight,\n onKeyboardNavigation,\n selected = [],\n}: KeyboardNavigationHookProps) => {\n const { bwd: ArrowBwd, fwd: ArrowFwd } = useMemo(\n () => ({\n bwd: ArrowUp,\n fwd: ArrowDown,\n }),\n []\n );\n\n const [highlightedIdx, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"highlightedIdx\",\n });\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n },\n [onHighlight, setHighlightedIdx]\n );\n\n const nextFocusableItemIdx = useCallback(\n (key = ArrowFwd, idx = key === ArrowFwd ? -1 : treeNodes.length) => {\n let nextIdx = nextItemIdx(treeNodes.length, key, idx);\n while (\n nextIdx !== -1 &&\n ((key === ArrowFwd && nextIdx < treeNodes.length) ||\n (key === ArrowBwd && nextIdx > 0)) &&\n !isFocusable(treeNodes[nextIdx])\n ) {\n nextIdx = nextItemIdx(treeNodes.length, key, nextIdx);\n }\n return nextIdx;\n },\n [ArrowBwd, ArrowFwd, treeNodes]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const handleFocus = useCallback(() => {\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else if (selected.length > 0) {\n const node = getNodeById(treeNodes, selected[0]);\n if (node) {\n const idx = getIndexOfNode(treeNodes, node);\n setHighlightedIndex(idx);\n }\n } else {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }, [treeNodes, nextFocusableItemIdx, selected, setHighlightedIndex]);\n\n const navigateChildItems = useCallback(\n (e) => {\n const nextIdx = nextFocusableItemIdx(e.key, highlightedIdx);\n if (nextIdx !== highlightedIdx) {\n setHighlightedIndex(nextIdx);\n // What exactly is the point of this ?\n onKeyboardNavigation?.(e, nextIdx);\n }\n },\n [\n highlightedIdx,\n nextFocusableItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (treeNodes.length > 0 && isNavigationKey(e, \"vertical\")) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildItems(e);\n }\n },\n [treeNodes, navigateChildItems]\n );\n\n const listProps = useMemo(\n () => ({\n onBlur: () => {\n setHighlightedIndex(-1);\n },\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n // SHould this be here - this is not strictly keyboard nav\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [handleFocus, handleKeyDown, setHighlightedIndex]\n );\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIdx : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIdx,\n hiliteItemAtIndex: setHighlightedIndex,\n keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n", "import { NonLeafNode, NormalisedTreeSourceNode } from \"./Tree\";\n\nexport const getNodeParentPath = ({ id }: NormalisedTreeSourceNode) => {\n let pos = id.lastIndexOf(\"-\");\n if (pos !== -1) {\n // using the built-in hierarchical id scheme\n // rootId-n-n.n\n const path = id.slice(pos + 1);\n const steps = path.split(\".\");\n if (steps.length === 1) {\n return null;\n } else {\n steps.pop();\n return `${id.slice(0, pos)}-${steps.join(\".\")}`;\n }\n } else if ((pos = id.lastIndexOf(\"/\")) !== -1) {\n // using a path scheme step/step/step\n return id.slice(0, pos);\n }\n};\n\nexport const isGroupNode = (node: NormalisedTreeSourceNode) =>\n node.childNodes !== undefined;\nexport const isCollapsibleGroupNode = (node: NormalisedTreeSourceNode) =>\n isGroupNode(node) && node.expanded !== undefined;\nexport const isHeader = (node: NormalisedTreeSourceNode) =>\n node.header === true;\n\nconst PATH_SEPARATORS = new Set([\".\", \"/\"]);\n\nconst isDescendantOf = (\n node: NormalisedTreeSourceNode,\n targetPath: string\n): node is NonLeafNode => {\n if (!targetPath.startsWith(node.id)) {\n return false;\n } else {\n return PATH_SEPARATORS.has(targetPath.charAt(node.id.length));\n }\n};\n\nexport const getNodeById = (\n nodes: NormalisedTreeSourceNode[],\n id: string\n): NormalisedTreeSourceNode | undefined => {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n } else if (isDescendantOf(node, id)) {\n return getNodeById(node.childNodes, id);\n }\n }\n};\n\nexport const getIndexOfNode = (\n treeNodes: NormalisedTreeSourceNode[],\n node: NormalisedTreeSourceNode\n) => {\n const id = typeof node === \"string\" ? node : node.id;\n for (let i = 0; i < treeNodes.length; i++) {\n if (treeNodes[i].id === id) {\n return i;\n }\n }\n};\n\nexport const replaceNode = (\n nodes: NormalisedTreeSourceNode[],\n id: string,\n props: Partial<NormalisedTreeSourceNode>\n): NormalisedTreeSourceNode[] => {\n let childNodes;\n const newNodes = nodes.map((node) => {\n if (node.id === id) {\n return {\n ...node,\n ...props,\n };\n } else if (isDescendantOf(node, id)) {\n childNodes = replaceNode(node.childNodes, id, props);\n return {\n ...node,\n childNodes,\n };\n } else {\n return node;\n }\n });\n\n return newNodes;\n};\n", "import { KeyboardEvent } from \"react\";\n\nfunction union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: KeyboardEvent,\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import { useRef, useState } from \"react\";\nimport { isGroupNode, isHeader } from \"./hierarchical-data-utils\";\nimport { isExpanded, NormalisedTreeSourceNode } from \"./Tree\";\n\nconst populateIndices = (\n nodes: NormalisedTreeSourceNode[],\n results: NormalisedTreeSourceNode[] = [],\n idx = { value: 0 }\n) => {\n let skipToNextHeader = false;\n for (const node of nodes) {\n if (skipToNextHeader && !isHeader(node)) {\n continue;\n } else {\n results[idx.value] = node;\n idx.value += 1;\n skipToNextHeader = false;\n if (isHeader(node) && node.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(node)) {\n if (isExpanded(node)) {\n populateIndices(node.childNodes, results, idx);\n }\n }\n }\n }\n return results;\n};\n\n//TODO return a read-only data structure\n// Question: is source changes at runtime, do we lose any current state ?\nexport const useHierarchicalData = (source: NormalisedTreeSourceNode[]) => {\n // console.log(`%c[useHierarchicalData<${label}>] entry`, 'color: green; font-weight: bold;');\n\n const externalSource = useRef(source);\n const statefulSource = useRef(source);\n const indexPositions = useRef(populateIndices(source));\n const [, forceUpdate] = useState({});\n\n // Maintain a mapping between nodes and their current index position within the rendered list.\n // This index position is liable to change with every expand/collapse operation. We require this\n // when handling keyboard events - these are List level, not listItem level, so we depend on the\n\n // Client needs to be careful source is not recreated inadvertently on each render\n if (source !== externalSource.current) {\n // console.log(\n // `%cuseHierarchicalData source has changed`,\n // 'color:red;font-weight: bold;',\n // externalSource.current,\n // source\n // );\n externalSource.current = source;\n // we might want to try and merge existing state here ?\n statefulSource.current = source;\n indexPositions.current = populateIndices(source);\n }\n\n const setData = (value: NormalisedTreeSourceNode[]) => {\n statefulSource.current = value;\n indexPositions.current = populateIndices(value);\n // console.log(\n // `data set in ${label} (${indexPositions.current.length} visible items)`,\n // indexPositions.current.map((i) => ({ index: i.index, label: i.label }))\n // );\n forceUpdate({});\n };\n\n return {\n // data, // do we actually use the data anywhere\n data: statefulSource.current,\n indexPositions: indexPositions.current,\n setData,\n };\n};\n", "import { KeyboardEvent, MouseEvent, useCallback, useRef } from \"react\";\nimport { closestListItem } from \"./list-dom-utils\";\nimport { ArrowLeft, ArrowRight, Enter } from \"./key-code\";\nimport { getNodeById, replaceNode } from \"./hierarchical-data-utils\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nconst NO_HANDLERS: CollapsibleHookResult[\"listHandlers\"] = {};\nconst isToggleElement = (element: HTMLElement) =>\n element && element.hasAttribute(\"aria-expanded\");\n\nexport interface CollapsibleGroupsHookProps {\n collapsibleHeaders?: boolean;\n highlightedIdx: number;\n treeNodes: NormalisedTreeSourceNode[];\n setVisibleData: (nodes: NormalisedTreeSourceNode[]) => void;\n source: NormalisedTreeSourceNode[];\n}\n\nexport interface CollapsibleHookResult {\n listHandlers: {\n onKeyDown?: (e: KeyboardEvent) => void;\n };\n listItemHandlers: {\n onClick: (e: MouseEvent) => void;\n };\n}\n\nexport const useCollapsibleGroups = ({\n collapsibleHeaders,\n highlightedIdx,\n treeNodes,\n setVisibleData,\n source,\n}: CollapsibleGroupsHookProps): CollapsibleHookResult => {\n const fullSource = useRef<NormalisedTreeSourceNode[]>(source);\n const stateSource = useRef<NormalisedTreeSourceNode[]>(fullSource.current);\n\n const setSource = useCallback(\n (value) => {\n setVisibleData((stateSource.current = value));\n },\n [setVisibleData]\n );\n\n const expandNode = useCallback(\n (nodeList: NormalisedTreeSourceNode[], { id }: NormalisedTreeSourceNode) =>\n replaceNode(nodeList, id, { expanded: true }),\n []\n );\n\n const collapseNode = useCallback(\n (nodeList, { id }) => replaceNode(nodeList, id, { expanded: false }),\n []\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === ArrowRight || e.key === Enter) {\n const node = treeNodes[highlightedIdx];\n if (node) {\n if (node.expanded === false) {\n e.preventDefault();\n setSource(expandNode(stateSource.current, node));\n }\n }\n }\n\n if (e.key === ArrowLeft || e.key === Enter) {\n const node = treeNodes[highlightedIdx];\n if (node) {\n if (node.expanded) {\n e.preventDefault();\n setSource(collapseNode(stateSource.current, node));\n }\n }\n }\n },\n [collapseNode, expandNode, highlightedIdx, treeNodes, setSource]\n );\n\n /**\n * These are List handlers, so we will not have reference to the actual node\n * element. We must rely on highlightedIdx to tell us which node is interactive.\n */\n const listHandlers = collapsibleHeaders\n ? {\n onKeyDown: handleKeyDown,\n }\n : NO_HANDLERS;\n\n const handleClick = useCallback(\n (evt) => {\n const el = closestListItem(evt.target);\n if (isToggleElement(el)) {\n evt.stopPropagation();\n evt.preventDefault();\n const node = getNodeById(source, el.id);\n if (node?.expanded === false) {\n setSource(expandNode(source, node));\n } else if (node?.expanded === true) {\n setSource(collapseNode(source, node));\n }\n }\n },\n [collapseNode, expandNode, setSource, source]\n );\n\n const listItemHandlers = {\n onClick: handleClick,\n };\n\n return {\n listHandlers,\n listItemHandlers,\n };\n};\n", "import { useCallback } from \"react\";\nimport { ArrowLeft } from \"./key-code\";\nimport {\n getNodeById,\n getNodeParentPath,\n getIndexOfNode,\n} from \"./hierarchical-data-utils\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nexport interface TreeKeyboardNavigationHookProps {\n highlightedIdx: number;\n hiliteItemAtIndex: (idx: number) => void;\n indexPositions: NormalisedTreeSourceNode[];\n source: NormalisedTreeSourceNode[];\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useTreeKeyboardNavigation = ({\n highlightedIdx,\n hiliteItemAtIndex,\n indexPositions,\n source,\n}: TreeKeyboardNavigationHookProps) => {\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === ArrowLeft) {\n const node = indexPositions[highlightedIdx];\n const parentId = getNodeParentPath(node);\n if (parentId) {\n e.preventDefault();\n const parentNode = getNodeById(source, parentId);\n if (parentNode) {\n const idx = getIndexOfNode(indexPositions, parentNode);\n if (idx !== undefined) {\n hiliteItemAtIndex(idx);\n }\n }\n }\n }\n },\n [highlightedIdx, hiliteItemAtIndex, indexPositions, source]\n );\n\n const listHandlers = {\n onKeyDown: handleKeyDown,\n };\n\n return {\n listHandlers,\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: \"salt\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, string];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"salt\",\n \"salt-density-high\",\n \"light\",\n];\n\nexport const useThemeAttributes = (): [string, string, string] => {\n const context = useContext(ThemeContext);\n if (context) {\n return [\n `${context.theme}-theme`,\n `salt-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 { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button, FormField, FormFieldLabel, Input } from \"@salt-ds/core\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n requirePassword?: boolean;\n}\n\nexport const LoginPanel = ({\n requirePassword = true,\n onSubmit,\n}: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\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 dataIsValid =\n username.trim() !== \"\" &&\n (requirePassword === false || password.trim() !== \"\");\n\n return (\n <div className={classBase}>\n <FormField style={{ width: 200 }}>\n <FormFieldLabel>Username</FormFieldLabel>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n {requirePassword ? (\n <FormField style={{ width: 200 }}>\n <FormFieldLabel>Password</FormFieldLabel>\n <Input\n inputProps={{\n type: \"password\",\n }}\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\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 );\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 {\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 { connectToServer } from \"@vuu-ui/vuu-data\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { useLayoutConfig } from \"./layout-config\";\nimport { DraggableLayout, LayoutProvider } from \"@vuu-ui/vuu-layout\";\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { AppHeader } from \"./app-header\";\nimport { ThemeMode, ThemeProvider, useThemeAttributes } from \"./theme-provider\";\nimport { logger } from \"@vuu-ui/vuu-utils\";\nimport { useShellLayout } from \"./shell-layouts\";\nimport { SaveLocation } from \"./shellTypes\";\n\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst { error } = logger(\"Shell\");\n\nconst warningLayout = {\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 interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\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 children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\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 layoutId = useRef(\"latest\");\n const [layout, saveLayoutConfig, loadLayoutById] = useLayoutConfig({\n defaultLayout,\n saveLocation,\n user,\n });\n\n const handleLayoutChange = useCallback(\n (layout) => {\n try {\n saveLayoutConfig(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\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 shellLayout = useShellLayout({\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 leftSidePanel,\n });\n\n return (\n // ShellContext TBD\n <ThemeProvider>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode={dataMode}\n ref={rootRef}\n {...htmlAttributes}\n >\n {shellLayout}\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ThemeProvider>\n );\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { SaveLocation } from \"../shellTypes\";\nimport { loadLocalConfig, saveLocalConfig } from \"./local-config\";\nimport { loadRemoteConfig, saveRemoteConfig } from \"./remote-config\";\n\nexport interface LayoutConfigHookProps {\n defaultLayout: LayoutJSON;\n saveLocation: SaveLocation;\n saveUrl?: string;\n user: VuuUser;\n}\n\nexport type LayoutHookResult = [\n LayoutJSON,\n (layout: LayoutJSON) => void,\n (id: string) => void\n];\n\nexport const useLayoutConfig = ({\n saveLocation,\n saveUrl = \"api/vui\",\n user,\n defaultLayout,\n}: LayoutConfigHookProps): LayoutHookResult => {\n const [layout, _setLayout] = useState(defaultLayout);\n const usingRemote = saveLocation === \"remote\";\n const loadConfig = usingRemote ? loadRemoteConfig : loadLocalConfig;\n const saveConfig = usingRemote ? saveRemoteConfig : saveLocalConfig;\n\n const load = useCallback(\n async (id = \"latest\") => {\n try {\n const layout = await loadConfig(saveUrl, user, id);\n _setLayout(layout);\n } catch {\n _setLayout(defaultLayout);\n }\n },\n [defaultLayout, loadConfig, saveUrl, user]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n saveConfig(saveUrl, user, data);\n },\n [saveConfig, saveUrl, user]\n );\n\n const loadLayoutById = useCallback((id) => load(id), [load]);\n\n return [layout, saveData, loadLayoutById];\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n console.log(\n `load local config at ${saveUrl} for user ${user.username}, id ${id}`\n );\n const data = localStorage.getItem(saveUrl);\n if (data) {\n const layout = JSON.parse(data);\n resolve(layout);\n } else {\n reject();\n }\n });\n\nexport const saveLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n): Promise<undefined> =>\n new Promise((resolve, reject) => {\n try {\n localStorage.setItem(saveUrl, JSON.stringify(data));\n resolve(undefined);\n } catch {\n reject();\n }\n });\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}/${id}`, {})\n .then((response) => {\n if (response.ok) {\n resolve(response.json());\n } else {\n reject(undefined);\n }\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n // setLayout(defaultLayout);\n reject(undefined);\n });\n });\n\nexport const saveRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n) =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n if (response.ok) {\n resolve(undefined);\n } else {\n reject();\n }\n });\n });\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\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 return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@salt-ds/lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\nimport { VuuUser } from \"../shell\";\n\nexport interface UserProfileProps {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const UserProfile = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n}: UserProfileProps) => {\n const handleNavigate = (id: string) => {\n onNavigate(id);\n };\n\n return (\n <DropdownBase className=\"vuuUserProfile\" placement=\"bottom-end\">\n <Button variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { List, ListItem, ListItemProps } from \"@salt-ds/lab\";\nimport { Button } from \"@salt-ds/core\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { getLayoutHistory, LayoutHistoryItem } from \"../get-layout-history\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = (\n { lastUpdate: l1 }: LayoutHistoryItem,\n { lastUpdate: l2 }: LayoutHistoryItem\n) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\ntype HistoryEntry = {\n id: string;\n label: string;\n lastUpdate: number;\n};\n\nconst HistoryListItem = (props: ListItemProps<HistoryEntry>) => {\n return <ListItem {...props} />;\n};\n\nexport interface UserPanelProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n layoutId: string;\n}\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" }: UserPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const [history, setHistory] = useState<HistoryEntry[]>([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map<HistoryEntry>(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? null\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List<HistoryEntry>\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "import { VuuUser } from \"./shell\";\n\nexport interface LayoutHistoryItem {\n user: string;\n id: string;\n uniqueId: string;\n lastUpdate: number;\n}\n\nexport const getLayoutHistory = async (\n user: VuuUser\n): Promise<LayoutHistoryItem[]> => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(\"error getting history\");\n });\n\n return history;\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 { Button } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { useCallback } from \"react\";\nimport { useLayoutProviderDispatch } 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 context?: string;\n expanded?: boolean;\n overlay?: boolean;\n}\n\nexport const ContextPanel = ({\n className: classNameProp,\n expanded = false,\n overlay = false,\n title,\n}: ContextPanelProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\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 return (\n <div className={cx(classBase, className)}>\n <div className={`${classBase}-inner`}>\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>\n </div>\n );\n};\n", "import { DraggableLayout, Flexbox } from \"@vuu-ui/vuu-layout\";\nimport { ReactElement } from \"react\";\nimport { ContextPanel } from \"./context-panel\";\nimport { ShellLayoutProps } from \"./useShellLayout\";\n\nexport const useFullHeightLeftPanel = ({\n appHeader,\n leftSidePanel,\n}: ShellLayoutProps): ReactElement => {\n return (\n <Flexbox\n className=\"App\"\n style={{\n flexDirection: \"row\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n {leftSidePanel}\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\n id=\"context-panel\"\n overlay\n title=\"Column Settings\"\n ></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 leftSidePanel,\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(leftSidePanel).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 { ReactElement } from \"react\";\nimport { useFullHeightLeftPanel } from \"./useFullHeightLeftPanel\";\nimport { useInlayLeftPanel } from \"./useInlayLeftPanel\";\n\nexport type ShellLayoutType = \"full-height\" | \"inlay\";\nexport interface ShellLayoutProps {\n appHeader: ReactElement;\n leftSidePanel?: ReactElement;\n}\n\nexport const useShellLayout = ({\n leftSidePanelLayout = \"inlay\",\n ...props\n}:\n | ShellLayoutProps & {\n leftSidePanelLayout?: \"full-height\" | \"inlay\";\n }) => {\n const useLayoutHook =\n leftSidePanelLayout === \"inlay\"\n ? useInlayLeftPanel\n : useFullHeightLeftPanel;\n\n return useLayoutHook(props);\n};\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { RpcResponseHandler } from \"packages/vuu-data-react/src\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["src_exports", "__export", "ConnectionStatusIcon", "ContextPanel", "DEFAULT_DENSITY", "DEFAULT_THEME", "DEFAULT_THEME_MODE", "DensitySwitch", "Feature", "LeftNav", "LoginPanel", "SaveLayoutPanel", "SessionEditingForm", "Shell", "ShellContextProvider", "ThemeContext", "ThemeProvider", "ThemeSwitch", "getAuthDetailsFromCookies", "getAuthModeFromCookies", "logout", "redirectToLogin", "useShellContext", "useShellLayout", "useThemeAttributes", "__toCommonJS", "import_react", "import_classnames", "import_jsx_runtime", "ConnectionStatusIcon", "connectionStatus", "className", "element", "props", "classBase", "setClassBase", "statusIcon", "React", "cx", "import_lab", "import_react", "import_classnames", "import_jsx_runtime", "classBase", "densities", "DEFAULT_DENSITY", "DensitySwitch", "classNameProp", "defaultDensity", "onChange", "handleSelectionChange", "_event", "selectedItem", "className", "cx", "import_react", "import_vuu_layout", "import_react", "import_jsx_runtime", "ErrorBoundary", "React", "props", "error", "errorInfo", "import_jsx_runtime", "Loader", "importCSS", "path", "container", "x", "import_jsx_runtime", "componentsMap", "useCachedFeature", "url", "React", "RawFeature", "css", "params", "props", "importCSS", "styleSheet", "LazyFeature", "ErrorBoundary", "Loader", "Feature", "import_jsx_runtime", "SaveLayoutPanel", "import_react", "import_jsx_runtime", "VuuLogo", "import_vuu_layout", "import_react", "import_jsx_runtime", "NO_DRAG_CONTEXT", "unconfiguredRegistrationCall", "DragDropContext", "useDragDropProvider", "id", "_a", "_b", "dragSources", "dropTargets", "registerDragDropParty", "DragDropContext", "isDragSource", "isDropTarget", "NO_DRAG_CONTEXT", "import_react", "import_react", "LEFT_RIGHT", "TOP_BOTTOM", "NOT_OVERFLOWED", "NOT_HIDDEN", "cloneElement", "element", "dolly", "measureElementSizeAndPosition", "dimension", "includeAutoMargin", "pos", "size", "position", "padEnd", "padStart", "style", "start", "end", "marginStart", "marginEnd", "minWidth", "flexBasis", "DIMENSIONS", "dimensions", "orientation", "getItemById", "measuredItems", "id", "result", "item", "removeDraggedItem", "index", "i", "measureDropTargets", "container", "itemQuery", "viewportRange", "draggedItemId", "_a", "dragThresholds", "DIMENSION", "children", "itemCount", "isLast", "dataIndex", "getIndexOfDraggedItem", "dropTargets", "d", "mutateDropTargetsSwitchDropTargetPosition", "direction", "indexOfDraggedItem", "indexOfTarget", "draggedItem", "targetItem", "diff", "draggedStart", "draggedEnd", "newDraggedItem", "targetStart", "targetEnd", "newTargetItem", "getNextDropTarget", "mouseMoveDirection", "len", "leadingEdge", "dropTarget", "constrainRect", "targetRect", "constraintRect", "height", "left", "top", "width", "constrainedHeight", "constrainedWidth", "import_core", "r", "f", "clsx", "import_react", "import_lab", "import_core", "import_classnames", "import_react", "import_react", "ReactDOM", "ReactDOM", "import_classnames", "containerId", "getPortalContainer", "className", "dataMode", "x", "y", "win", "el", "cx", "createContainer", "props", "renderPortal", "component", "container", "onRender", "import_classnames", "Portal", "children", "x", "y", "onRender", "themeClass", "densityClass", "dataMode", "useThemeAttributes", "renderContainer", "createContainer", "cx", "renderPortal", "_a", "import_jsx_runtime", "import_react", "import_react", "import_classnames", "import_vuu_layout", "import_react", "isRoot", "el", "hasPopup", "idx", "_a", "union", "set1", "sets", "result", "set", "element", "Enter", "Delete", "actionKeys", "Enter", "focusKeys", "arrowLeftRightKeys", "verticalNavigationKeys", "horizontalNavigationKeys", "functionKeys", "specialKeys", "union", "isNavigationKey", "key", "orientation", "verticalNavigationKeys", "horizontalNavigationKeys", "useKeyboardNavigation", "autoHighlightFirstItem", "count", "highlightedIndexProp", "onActivate", "onHighlight", "onCloseMenu", "onOpenMenu", "highlightedIndexRef", "forceRender", "controlledHighlighting", "setHighlightedIdx", "idx", "setHighlightedIndex", "keyBoardNavigation", "ignoreFocus", "setIgnoreFocus", "value", "highlightedIndex", "navigateChildldItems", "e", "nextIdx", "nextItemIdx", "handleKeyDown", "isNavigationKey", "hasPopup", "menuItemEl", "isRoot", "listProps", "key", "import_react", "isMenuItemGroup", "child", "MenuItemGroup", "getLabelFromChildren", "children", "isMenuItemLabel", "assignId", "path", "group", "hasSeparator", "React", "useItemsWithIdsNext", "childrenProp", "rootId", "normalizeChildren", "collectChildren", "menus", "actions", "list", "idx", "Separator", "hasChildItems", "childPath", "action", "options", "childWithId", "grandChildren", "import_jsx_runtime", "classBase", "Separator", "MenuItemGroup", "MenuItem", "children", "idx", "props", "MenuItemLabel", "getDisplayName", "item", "React", "isMenuItemLabel", "hasIcon", "child", "MenuList", "activatedByKeyboard", "childMenuShowing", "className", "highlightedIdxProp", "idProp", "isRoot", "listItemProps", "onHighlightMenuItem", "onActivate", "onCloseMenu", "onOpenMenu", "id", "root", "mapIdxToId", "handleActivate", "_a", "el", "focusVisible", "highlightedIndex", "listProps", "useKeyboardNavigation", "appliedFocusVisible", "getActiveDescendant", "renderContent", "propsCommonToAllListItems", "maybeIcon", "childElement", "withIcon", "iconName", "addClonedChild", "list", "itemId", "hasSeparator", "label", "hasSubMenu", "isMenuItemGroup", "subMenuShowing", "ariaControls", "getMenuItemProps", "listItems", "cx", "key", "highlightedIdx", "MenuList_default", "import_react", "closestListItem", "el", "nudge", "menus", "distance", "pos", "m", "i", "nudgeLeft", "nudgeUp", "flipSides", "id", "parentMenu", "menu", "el", "width", "getPosition", "openMenus", "left", "menuTop", "top", "getHostMenuId", "rootId", "getTargetMenuId", "getMenuItemDetails", "ariaExpanded", "ariaHasPopup", "useCascade", "onActivate", "onMouseEnterItem", "posX", "posY", "forceRefresh", "menuIsOpen", "menuId", "getOpenMenuStatus", "state", "menuState", "setOpenMenus", "menuOpenPendingTimeout", "menuClosePendingTimeout", "openMenu", "hostMenuId", "targetMenuId", "itemId", "closeMenu", "lastMenu", "closeMenus", "menuItemId", "menuItemMenuId", "lastMenuId", "parentMenuId", "clearAnyScheduledOpenTasks", "scheduleOpen", "scheduleClose", "openMenuId", "handleRender", "right", "bottom", "clientHeight", "clientWidth", "newMenus", "triggerChildMenu", "menuItemEl", "isGroup", "isOpen", "menuStatus", "parentOfLastOpenedMenu", "lastOpenedMenu", "listItemProps", "evt", "closestListItem", "listItemEl", "import_vuu_layout", "import_jsx_runtime", "import_react", "noop", "ContextMenu", "activatedByKeyboard", "childrenProp", "className", "idProp", "onClose", "position", "style", "menuListProps", "closeHandlerRef", "id", "closeMenuRef", "menus", "actions", "useItemsWithIdsNext", "navigatingWithKeyboard", "handleMouseEnterItem", "handleActivate", "menuItemId", "actionId", "action", "options", "closeMenu", "listItemProps", "openMenu", "openMenus", "handleRender", "useCascade", "handleCloseMenu", "handleHighlightMenuItem", "lastMenu", "getChildMenuId", "i", "menuId", "left", "top", "all", "childMenuId", "Portal", "MenuList_default", "import_react", "import_jsx_runtime", "ContextMenuContext", "import_vuu_utils", "import_classnames", "import_react", "import_classnames", "import_react", "import_react_dom", "_dialogOpen", "_popups", "reasonIsMenuAction", "reason", "reasonIsClickAway", "specialKeyHandler", "closeAllPopups", "dialogRoot", "ReactDOM", "outsideClickHandler", "popupContainers", "i", "PopupService", "popupClosed", "popupOpened", "name", "_popups", "_dialogOpen", "specialKeyHandler", "outsideClickHandler", "popupClosed", "pos", "PopupComponent", "children", "position", "style", "className", "cx", "incrementingKey", "PopupService", "group", "left", "right", "top", "width", "component", "el", "renderPortal", "evt", "reason", "_a", "popupRoot", "ReactDOM", "target", "height", "currentRight", "w", "overflowH", "overflowW", "adjustment", "import_jsx_runtime", "useContextMenu", "menuBuilder", "menuActionHandler", "ctx", "ContextMenuContext", "themeClass", "densityClass", "dataMode", "useThemeAttributes", "buildMenuOptions", "menuBuilders", "location", "options", "results", "handleShowContextMenu", "e", "ContextMenuProps", "contextMenu", "showContextMenuComponent", "menuItemDescriptors", "menuHandler", "action", "showContextMenu", "cx", "hideContextMenu", "NO_OPTIONS", "position", "PopupService", "menuDescriptors", "handleContextMenuAction", "positionProp", "contextMenuProps", "menuItems", "fromDescriptor", "menuItem", "MenuItemGroup", "MenuItem", "handleClose", "reason", "_a", "reasonIsMenuAction", "component", "ContextMenu", "import_react", "import_classnames", "import_core", "import_vuu_layout", "import_jsx_runtime", "classBase", "getPosition", "element", "bottom", "left", "PopupMenu", "className", "icon", "idProp", "menuActionHandler", "menuBuilder", "menuLocation", "menuOptions", "onMenuClose", "tabIndex", "htmlAttributes", "rootRef", "suppressShowMenuRef", "menuOpen", "setMenuOpen", "id", "showContextMenu", "useContextMenu", "handleMenuClose", "reason", "reasonIsClickAway", "_a", "showMenu", "e", "cx", "import_jsx_runtime", "makeClassNames", "classNames", "className", "Draggable", "wrapperClassName", "element", "onTransitionEnd", "style", "scale", "forwardedRef", "callbackRef", "el", "forkedRef", "Portal", "clsx", "createDragSpacer", "transitioning", "spacer", "createDropIndicatorPosition", "createDropIndicator", "useDragDisplacers", "animationFrame", "transitioning", "spacers", "createDragSpacer", "clearSpacers", "spacer", "animateTransition", "size", "propertyName", "spacer1", "spacer2", "cancelAnyPendingAnimation", "displaceItem", "dropTargets", "dropTarget", "useTransition", "direction", "orientation", "mutateDropTargetsSwitchDropTargetPosition", "displaceLastItem", "useDragDropNaturalMovement", "draggableRef", "onDrop", "orientation", "containerRef", "itemQuery", "selected", "viewportRange", "dragDirectionRef", "isScrollable", "dragPosRef", "measuredDropTargets", "overflowMenuShowingRef", "showOverflow", "setShowOverflow", "clearSpacers", "displaceItem", "displaceLastItem", "useDragDisplacers", "draggedItemRef", "fullItemQuery", "NOT_OVERFLOWED", "NOT_HIDDEN", "indexOf", "dropTarget", "d", "rangeRef", "handleScrollStart", "handleScrollStop", "scrollDirection", "_scrollPos", "atEnd", "container", "draggedItem", "measureDropTargets", "size", "midPos", "dropTargets", "getNextDropTarget", "nextInsertPos", "nextDropTarget", "beginDrag", "evt", "dragElement", "SCROLL_SIZE", "CLIENT_SIZE", "dimensions", "draggedItemId", "scrollSize", "clientSize", "indexOfDraggedItem", "getIndexOfDraggedItem", "showPopup", "hidePopup", "popupShowing", "button", "drag", "dragPos", "mouseMoveDirection", "overflowIndicator", "drop", "_a", "scrollTop", "import_react", "import_react", "useDropIndicator", "spacer", "createDropIndicatorPosition", "clearSpacer", "dropTarget", "dropZone", "import_jsx_runtime", "NOT_OVERFLOWED", "NOT_HIDDEN", "useDragDropIndicator", "draggableRef", "onDrop", "orientation", "containerRef", "itemQuery", "selected", "viewportRange", "dragDirectionRef", "dropIndicatorRef", "dropTargetRef", "dropZoneRef", "isScrollable", "dragPosRef", "measuredDropTargets", "overflowMenuShowingRef", "showOverflow", "setShowOverflow", "dropIndicator", "setDropIndicator", "clearSpacer", "positionDropIndicator", "useDropIndicator", "draggedItemRef", "fullItemQuery", "indexOf", "dropTarget", "d", "reposition", "distance", "indexShift", "rangeRef", "handleScrollStart", "handleScrollStop", "scrollDirection", "_scrollPos", "atEnd", "container", "draggedItem", "measureDropTargets", "size", "midPos", "dropTargets", "nextDropTarget", "getNextDropTarget", "beginDrag", "evt", "dragElement", "SCROLL_SIZE", "CLIENT_SIZE", "dimensions", "draggedItemId", "scrollSize", "clientSize", "getItemById", "targetIndex", "removeDraggedItem", "range", "i", "dropZone", "dropIndicatorPosition", "top", "left", "width", "dropIndicatorRect", "Draggable", "createDropIndicator", "drag", "dragPos", "mouseMoveDirection", "currentDropTarget", "START", "drop", "fromIndex", "dropBefore", "originalDropTargetIndex", "currentDropTargetIndex", "import_react", "import_react", "useAutoScroll", "containerRef", "onScrollingStopped", "orientation", "scrollTimer", "isScrolling", "scrollPosRef", "lastScrollDirectionRef", "stopScrolling", "atEnd", "startScrolling", "direction", "scrollRate", "scrollUnit", "container", "SCROLL_POS", "SCROLL_SIZE", "CLIENT_SIZE", "dimensions", "scrollPos", "scrollSize", "clientSize", "maxScroll", "nextScroll", "import_jsx_runtime", "NULL_DRAG_DROP_RESULT", "UNBOUNDED", "noDragDrop", "dragThreshold", "getDraggableElement", "el", "query", "isOverflowElement", "element", "getLastElement", "container", "itemQuery", "fullItemQuery", "NOT_OVERFLOWED", "lastElement", "useDragDropNext", "allowDragDrop", "containerRef", "draggableClassName", "onDragStart", "onDrop", "onDropSettle", "orientation", "dragDropProps", "dragBoundaries", "draggableStatus", "setDraggableStatus", "draggableRef", "dragElementRef", "mouseDownTimer", "isScrollableRef", "mouseOffsetRef", "mousePosRef", "startPosRef", "settlingItemRef", "dropPosRef", "dropIndexRef", "handleScrollStopRef", "isDragSource", "isDropTarget", "register", "useDragDropProvider", "terminateDrag", "_a", "toIndex", "droppedItem", "status", "getScrollDirection", "mousePos", "POS", "SCROLL_POS", "SCROLL_SIZE", "CLIENT_SIZE", "dimensions", "scrollPos", "scrollSize", "clientSize", "maxScroll", "canScrollFwd", "viewportEnd", "bwd", "fwd", "useDragDropHook", "useDragDropNaturalMovement", "useDragDropIndicator", "onScrollingStopped", "scrollDirection", "atEnd", "isScrolling", "startScrolling", "stopScrolling", "useAutoScroll", "handleDrop", "fromIndex", "beginDrag", "drag", "drop", "handleScrollStart", "handleScrollStop", "dragResult", "dragMouseMoveHandler", "evt", "CLIENT_POS", "CONTRA_CLIENT_POS", "CONTRA_POS", "clientX", "clientY", "clientPos", "clientContraPos", "lastClientPos", "lastClientContraPos", "dragDistance", "dragPosX", "dragPosY", "mouseMoveDirection", "dragPos", "renderDragPos", "START", "dragMouseUpHandler", "dragStart", "target", "dragElement", "CONTRA", "CONTRA_END", "DIMENSION", "END", "lastItemIsOverflowIndicator", "containerRect", "draggableRect", "draggableSize", "lastItemStart", "lastItemEnd", "index", "Draggable", "cloneElement", "constrainRect", "preDragMouseMoveHandler", "preDragMouseUpHandler", "mouseDownHandler", "settlingItem", "dropPos", "targetTop", "targetLeft", "currentTop", "currentLeft", "import_react", "import_core", "import_jsx_runtime", "classBase", "EditableLabel", "classNameProp", "defaultEditing", "defaultValue", "editingProp", "onChange", "onEnterEditMode", "onExitEditMode", "valueProp", "restProps", "forwardedRef", "inputRef", "editingRef", "value", "setValue", "editing", "_setEditing", "setEditing", "initialValue", "enterEditMode", "exitEditMode", "cancelEdit", "allowDeactivation", "originalValue", "handleChange", "evt", "handleDoubleClick", "handleBlur", "handleKeyDown", "className", "clsx", "import_vuu_layout", "import_core", "import_classnames", "import_react", "import_react", "isTabMenuOptions", "options", "closeCommand", "renameCommand", "getElementIndex", "el", "index", "getIndexOfItem", "container", "query", "targetTab", "getIndexOfSelectedTab", "getIndexOfEditedItem", "import_vuu_utils", "import_react", "useAnimatedSelectionThumb", "containerRef", "activeTabIndex", "orientation", "animationSuspendedRef", "suspendAnimation", "resumeAnimation", "onTransitionEnd", "_a", "_b", "lastSelectedRef", "offset", "size", "oldSelected", "newSelected", "positionProp", "sizeProp", "oldPosition", "oldSize", "newPosition", "duration", "_c", "_d", "import_core", "import_vuu_utils", "import_react", "navigation", "isNavigationKey", "key", "orientation", "isMenuActivationKey", "nextItemIdx", "count", "direction", "idx", "isNonWrappedElement", "element", "getElementByPosition", "container", "index", "useKeyboardNavigation", "containerRef", "defaultHighlightedIdx", "highlightedIdxProp", "keyBoardActivation", "selectedTabIndex", "manualActivation", "mouseClickPending", "focusedRef", "hasFocus", "setHasFocus", "forceRefresh", "highlightedIdx", "_setHighlightedIdx", "setHighlightedIdx", "value", "keyboardNavigation", "focusTab", "tabIndex", "immediateFocus", "withKeyboard", "delay", "setFocus", "focussableElement", "onFocus", "e", "getIndexOfEditedItem", "getIndexCount", "_a", "_b", "nextFocusableItemIdx", "indexCount", "nextIdx", "nextDirection", "newIdx", "navigateChildItems", "forceFocusVisible", "highlightedTabHasMenu", "el", "activateTabMenu", "menuEl", "evt", "handleKeyDown", "handleItemClick", "_", "handleFocus", "handleContainerMouseDown", "sourceTarget", "destTarget", "import_core", "import_react", "defaultSelectionKeys", "isTabElement", "el", "useSelection", "defaultSelected", "highlightedIdx", "onSelectionChange", "selectedProp", "selected", "setSelected", "isControlled", "isSelectionEvent", "evt", "selectItem", "tabIndex", "handleKeyDown", "e", "targetElement", "onClick", "editKeys", "isEditKey", "key", "getElementWithIndex", "container", "index", "useTabstrip", "activeTabIndexProp", "allowDragDrop", "animateSelectionThumb", "containerRef", "onActiveChange", "onAddTab", "onCloseTab", "onExitEditMode", "onMoveTab", "orientation", "keyBoardActivation", "lastSelection", "keyboardHookFocusTab", "highlightedIdx", "keyboardHookHandleClick", "keyboardHookHandleKeyDown", "keyboardHookSetHighlightedIndex", "keyboardHook", "useKeyboardNavigation", "selectionHookActivateTab", "selectionHookHandleClick", "selectionHookHandleKeyDown", "selectionHookSelected", "useSelection", "containerStyle", "resumeAnimation", "suspendAnimation", "useAnimatedSelectionThumb", "handleDrop", "fromIndex", "toIndex", "selected", "nextSelectedTab", "dragDropHookHandleMouseDown", "dragDropHook", "useDragDropNext", "handleExitEditMode", "originalValue", "editedValue", "allowDeactivation", "tabIndex", "handleClick", "evt", "getEditableLabel", "targetEl", "tabInEditMode", "editableLabel", "editTab", "editableLabelEl", "handleKeyDown", "handleCloseTabFromMenu", "selectedTabIndex", "getIndexOfSelectedTab", "newActiveTabIndex", "handleRenameTabFromMenu", "handleTabMenuAction", "action", "isTabMenuOptions", "handleTabMenuClose", "onSwitchWrappedItemIntoView", "item", "navigationProps", "handleAddTabClick", "tabProps", "import_jsx_runtime", "import_react", "classBase", "Tabstrip", "activeTabIndexProp", "allowAddTab", "allowCloseTab", "allowDragDrop", "allowRenameTab", "animateSelectionThumb", "children", "classNameProp", "idProp", "keyBoardActivation", "location", "onActiveChange", "onAddTab", "onCloseTab", "onExitEditMode", "onMoveTab", "orientation", "showTabMenuButton", "styleProp", "htmlAttributes", "rootRef", "activeTabIndex", "focusVisible", "containerStyle", "draggedItemIndex", "onClickAddTab", "tabProps", "tabstripHook", "useTabstrip", "id", "className", "cx", "style", "tabs", "child", "index", "tabId", "closeable", "editable", "showMenuButton", "selected", "React", "import_core", "import_classnames", "import_react", "import_react", "import_classnames", "import_jsx_runtime", "classBase", "TabMenu", "allowClose", "allowRename", "location", "onMenuAction", "onMenuClose", "index", "menuBuilder", "menuOptions", "_location", "options", "menuItems", "renameCommand", "closeCommand", "PopupMenu", "cx", "import_jsx_runtime", "classBase", "noop", "Tab", "ariaControls", "children", "className", "closeable", "dragging", "editable", "editing", "focusVisible", "index", "label", "location", "onClick", "onClose", "onEnterEditMode", "onExitEditMode", "onFocusProp", "onKeyUp", "onMenuAction", "onMenuClose", "orientation", "selected", "showMenuButton", "tabIndex", "props", "ref", "rootRef", "editableRef", "setForkRef", "handleClick", "e", "handleOnExitEditMode", "originalValue", "editedValue", "allowDeactivation", "handleKeyUp", "getLabel", "EditableLabel", "handleFocus", "evt", "input", "cx", "TabMenu", "import_core", "import_classnames", "import_react", "listItemIndex", "listItemEl", "_a", "idx", "closestListItem", "el", "closestListItemIndex", "el", "listItemIndex", "closestListItem", "import_react", "PathSeparators", "isPathSeparator", "char", "isParentPath", "parentPath", "childPath", "useItemsWithIds", "sourceProp", "idRoot", "collapsibleHeaders", "defaultExpanded", "revealSelected", "countChildItems", "item", "items", "idx", "i", "count", "isExpanded", "path", "id", "normalizeItems", "indexer", "level", "results", "flattenedSource", "all", "_a", "isCollapsibleHeader", "isNonCollapsibleGroupNode", "isLeaf", "nonCollapsible", "expanded", "normalisedItem", "childCount", "children", "sourceWithIds", "sourceItemById", "target", "sourceWithId", "import_react", "import_core", "SINGLE", "CHECKBOX", "MULTI", "EXTENDED", "defaultSelectionKeys", "NO_HANDLERS", "isCollapsibleItem", "item", "groupSelectionEnabled", "groupSelection", "useSelection", "defaultSelected", "highlightedIdx", "treeNodes", "onChange", "selectedProp", "selection", "selectionKeys", "singleSelect", "multiSelect", "extendedSelect", "lastActive", "isSelectionEvent", "evt", "selected", "setSelected", "selectItemAtIndex", "idx", "id", "rangeSelect", "preserveExistingSelection", "active", "isSelected", "actsLikeSingleSelect", "actsLikeMultiSelect", "newSelected", "i", "from", "to", "handleKeyDown", "handleKeyboardNavigation", "currentIndex", "listHandlers", "handleClick", "import_react", "import_react", "observedMap", "getTargetSize", "element", "size", "dimension", "resizeObserver", "entries", "entry", "target", "borderBoxSize", "contentBoxSize", "observedTarget", "observedMap", "height", "width", "contentHeight", "contentWidth", "onResize", "measurements", "sizeChanged", "dimension", "size", "newSize", "getTargetSize", "useResizeObserver", "ref", "dimensions", "reportInitialSize", "dimensionsRef", "measure", "map", "dim", "registerObserver", "record", "HeightOnly", "useViewportTracking", "root", "highlightedIdx", "stickyHeaders", "scrollTop", "scrolling", "rootHeight", "rootScrollHeight", "scrollIntoView", "el", "targetEl", "headerHeight", "t", "h", "viewportStart", "viewportEnd", "scrollHandler", "e", "rootEl", "item", "onResize", "height", "scrollHeight", "useResizeObserver", "import_react", "import_react", "getNodeParentPath", "id", "pos", "steps", "isGroupNode", "node", "isHeader", "node", "PATH_SEPARATORS", "isDescendantOf", "targetPath", "getNodeById", "nodes", "id", "getIndexOfNode", "treeNodes", "i", "replaceNode", "props", "childNodes", "import_core", "union", "set1", "sets", "result", "set", "element", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Enter", "Delete", "actionKeys", "Enter", "focusKeys", "arrowLeftRightKeys", "verticalNavigationKeys", "horizontalNavigationKeys", "functionKeys", "specialKeys", "union", "isNavigationKey", "key", "orientation", "verticalNavigationKeys", "horizontalNavigationKeys", "nextItemIdx", "count", "key", "idx", "ArrowUp", "ArrowLeft", "isLeaf", "item", "isFocusable", "useKeyboardNavigation", "defaultHighlightedIdx", "highlightedIdxProp", "treeNodes", "onHighlight", "onKeyboardNavigation", "selected", "ArrowBwd", "ArrowFwd", "ArrowDown", "highlightedIdx", "setHighlightedIdx", "isControlledHighlighting", "setHighlightedIndex", "nextFocusableItemIdx", "nextIdx", "keyBoardNavigation", "ignoreFocus", "setIgnoreFocus", "value", "handleFocus", "node", "getNodeById", "getIndexOfNode", "navigateChildItems", "e", "handleKeyDown", "isNavigationKey", "listProps", "import_react", "populateIndices", "nodes", "results", "idx", "skipToNextHeader", "node", "isHeader", "isGroupNode", "isExpanded", "useHierarchicalData", "source", "externalSource", "statefulSource", "indexPositions", "forceUpdate", "setData", "value", "import_react", "NO_HANDLERS", "isToggleElement", "element", "useCollapsibleGroups", "collapsibleHeaders", "highlightedIdx", "treeNodes", "setVisibleData", "source", "fullSource", "stateSource", "setSource", "value", "expandNode", "nodeList", "id", "replaceNode", "collapseNode", "handleKeyDown", "e", "ArrowRight", "Enter", "node", "ArrowLeft", "listHandlers", "listItemHandlers", "evt", "el", "closestListItem", "getNodeById", "import_react", "useTreeKeyboardNavigation", "highlightedIdx", "hiliteItemAtIndex", "indexPositions", "source", "e", "ArrowLeft", "node", "parentId", "getNodeParentPath", "parentNode", "getNodeById", "idx", "getIndexOfNode", "EMPTY_ARRAY", "useTree", "defaultSelected", "sourceWithIds", "onChange", "onHighlightProp", "selectedProp", "selection", "lastSelection", "dataHook", "useHierarchicalData", "handleKeyboardNavigation", "evt", "nextIdx", "_a", "_b", "selectionHook", "highlightedIdx", "keyboardHook", "useKeyboardNavigation", "collapsibleHook", "useCollapsibleGroups", "useSelection", "treeNavigationHook", "useTreeKeyboardNavigation", "handleClick", "_c", "handleKeyDown", "_d", "_e", "_f", "_g", "_h", "getActiveDescendant", "listProps", "listItemHandlers", "import_jsx_runtime", "import_react", "classBase", "isExpanded", "node", "TreeNode", "children", "idx", "props", "Tree", "allowDragDrop", "className", "defaultSelected", "groupSelection", "idProp", "onHighlight", "onSelectionChange", "revealSelected", "selectedProp", "selection", "source", "htmlAttributes", "forwardedRef", "_a", "id", "useId", "rootRef", "sourceWithIds", "sourceItemById", "useItemsWithIds", "handleSelectionChange", "evt", "selected", "sourceItems", "sourceItem", "focusVisible", "highlightedIdx", "hiliteItemAtIndex", "listProps", "listItemHandlers", "visibleData", "useTree", "useViewportTracking", "propsCommonToAllListItems", "targetEl", "closestListItemIndex", "allowGroupSelect", "groupSelectionEnabled", "addLeafNode", "list", "item", "getListItemProps", "addGroupNode", "child", "title", "i", "cx", "renderSourceContent", "items", "listItems", "import_classnames", "import_react", "import_react", "import_classnames", "import_jsx_runtime", "DEFAULT_DENSITY", "DEFAULT_THEME", "DEFAULT_THEME_MODE", "ThemeContext", "DEFAULT_THEME_ATTRIBUTES", "useThemeAttributes", "context", "createThemedChildren", "children", "theme", "themeMode", "density", "_a", "cx", "ThemeProvider", "applyThemeClasses", "themeProp", "themeModeProp", "densityProp", "_b", "_c", "inheritedDensity", "inheritedThemeMode", "inheritedTheme", "themedChildren", "import_jsx_runtime", "classBase", "LeftNav", "path", "onResize", "open", "sizeCollapsed", "sizeContent", "sizeExpanded", "styleProp", "htmlAttributes", "dispatch", "openRef", "navState", "setNavState", "themeClass", "useThemeAttributes", "getWidthAndStatus", "isOpen", "tabIndex", "handleTabSelection", "value", "width", "navStatus", "toggleSize", "activeTabIndex", "style", "cx", "VuuLogo", "Tabstrip", "Tab", "import_react", "import_core", "import_jsx_runtime", "classBase", "LoginPanel", "requirePassword", "onSubmit", "username", "setUserName", "password", "setPassword", "login", "handleUsername", "evt", "handlePassword", "dataIsValid", "import_vuu_utils", "getAuthModeFromCookies", "mode", "getAuthDetailsFromCookies", "username", "token", "getDefaultLoginUrl", "redirectToLogin", "loginUrl", "logout", "import_react", "import_classnames", "import_core", "import_vuu_data", "import_vuu_utils", "import_jsx_runtime", "classBase", "getField", "fields", "name", "field", "f", "getFieldNameAndValue", "evt", "value", "Status", "getTypedValue", "type", "throwIfUndefined", "typedValue", "getDataSource", "dataSource", "schema", "col", "SessionEditingForm", "className", "keyField", "dataSourceProp", "idProp", "onClose", "htmlAttributes", "values", "setValues", "errorMessage", "setErrorMessage", "formContentRef", "initialDataRef", "dataStatusRef", "applyServerData", "data", "columnMap", "column", "ds", "message", "id", "handleChange", "newValues", "notUpdated", "handleBlur", "rowKey", "applyAction", "action", "handleSubmit", "response", "handleKeyDown", "handleCancel", "getFormControl", "_a", "firstInput", "isDirty", "cx", "import_vuu_data", "import_classnames", "import_react", "import_react", "loadLocalConfig", "saveUrl", "user", "id", "resolve", "reject", "data", "layout", "saveLocalConfig", "loadRemoteConfig", "saveUrl", "user", "id", "resolve", "reject", "response", "saveRemoteConfig", "data", "useLayoutConfig", "saveLocation", "saveUrl", "user", "defaultLayout", "layout", "_setLayout", "usingRemote", "loadConfig", "loadRemoteConfig", "loadLocalConfig", "saveConfig", "saveRemoteConfig", "saveLocalConfig", "load", "id", "saveData", "data", "loadLayoutById", "import_vuu_layout", "import_react", "import_core", "import_lab", "import_icons", "import_vuu_utils", "import_lab", "import_core", "import_icons", "import_react", "getLayoutHistory", "user", "response", "import_jsx_runtime", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "UserPanel", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "getHistory", "sortedHistory", "getLayoutHistory", "item", "id", "lastUpdate", "handleHisorySelected", "evt", "selected", "handleLogout", "logout", "i", "import_jsx_runtime", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "UserPanel", "id", "import_classnames", "import_core", "import_react", "import_jsx_runtime", "classBase", "ThemeSwitch", "classNameProp", "defaultModeProp", "modeProp", "onChange", "htmlAttributes", "mode", "setMode", "handleChangeSecondary", "evt", "value", "className", "cx", "import_classnames", "import_jsx_runtime", "classBase", "AppHeader", "classNameProp", "layoutId", "loginUrl", "onNavigate", "onSwitchTheme", "themeMode", "user", "htmlAttributes", "className", "cx", "handleSwitchTheme", "mode", "ThemeSwitch", "UserProfile", "import_vuu_utils", "import_core", "import_classnames", "import_react", "import_vuu_layout", "import_jsx_runtime", "classBase", "ContextPanel", "classNameProp", "expanded", "overlay", "title", "dispatchLayoutAction", "handleClose", "className", "cx", "import_vuu_layout", "import_jsx_runtime", "useFullHeightLeftPanel", "appHeader", "leftSidePanel", "ContextPanel", "import_vuu_layout", "import_react", "import_jsx_runtime", "useInlayLeftPanel", "appHeader", "leftSidePanel", "paletteView", "open", "setOpen", "handleDrawerClick", "e", "_a", "target", "getDrawers", "drawers", "useShellLayout", "leftSidePanelLayout", "props", "useInlayLeftPanel", "useFullHeightLeftPanel", "import_jsx_runtime", "error", "warningLayout", "Shell", "children", "classNameProp", "defaultLayout", "leftSidePanel", "leftSidePanelLayout", "loginUrl", "saveLocation", "saveUrl", "serverUrl", "user", "htmlAttributes", "rootRef", "layoutId", "layout", "saveLayoutConfig", "loadLayoutById", "useLayoutConfig", "handleLayoutChange", "handleSwitchTheme", "mode", "handleNavigate", "id", "themeClass", "densityClass", "dataMode", "useThemeAttributes", "className", "cx", "shellLayout", "useShellLayout", "AppHeader", "ThemeProvider", "import_react", "import_jsx_runtime", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext"]
|
|
3
|
+
"sources": ["../../../packages/vuu-shell/src/index.ts", "../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.tsx", "../../../packages/vuu-shell/src/density-switch/DensitySwitch.tsx", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/feature/css-module-loader.ts", "../../../packages/vuu-shell/src/layout-management/SaveLayoutPanel.tsx", "../../../packages/vuu-icons/src/VuuLogo.tsx", "../../../packages/vuu-shell/src/left-nav/LeftNav.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/DragDropProvider.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useDragDropNaturalMovementNext.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useDragDisplacers.ts", "../../../packages/vuu-ui-controls/src/drag-drop/drop-target-utils.ts", "../../../packages/vuu-ui-controls/src/drag-drop/Draggable.tsx", "../../../packages/vuu-popups/src/dialog/Dialog.tsx", "../../../packages/vuu-popups/src/portal/Portal.tsx", "../../../packages/vuu-popups/src/portal/render-portal.tsx", "../../../packages/vuu-popups/src/menu/ContextMenu.tsx", "../../../packages/vuu-popups/src/menu/MenuList.tsx", "../../../packages/vuu-popups/src/menu/use-keyboard-navigation.ts", "../../../packages/vuu-popups/src/menu/utils.ts", "../../../packages/vuu-popups/src/menu/key-code.ts", "../../../packages/vuu-popups/src/menu/use-items-with-ids-next.ts", "../../../packages/vuu-popups/src/menu/use-cascade.ts", "../../../packages/vuu-popups/src/menu/list-dom-utils.ts", "../../../packages/vuu-popups/src/menu/context-menu-provider.tsx", "../../../packages/vuu-popups/src/menu/useContextMenu.tsx", "../../../packages/vuu-popups/src/popup/popup-service.ts", "../../../packages/vuu-popups/src/popup-menu/PopupMenu.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useDragDropIndicator.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useDropIndicator.ts", "../../../packages/vuu-ui-controls/src/drag-drop/useDragDropNext.tsx", "../../../packages/vuu-ui-controls/src/drag-drop/useAutoScroll.ts", "../../../packages/vuu-ui-controls/src/editable-label/EditableLabel.tsx", "../../../packages/vuu-ui-controls/src/list/Highlighter.tsx", "../../../packages/vuu-ui-controls/src/utils/escapeRegExp.ts", "../../../packages/vuu-ui-controls/src/list/ListItem.tsx", "../../../packages/vuu-ui-controls/src/list/CheckboxIcon.tsx", "../../../packages/vuu-ui-controls/src/list/List.tsx", "../../../packages/vuu-ui-controls/src/list/common-hooks/collectionProvider.tsx", "../../../packages/vuu-ui-controls/src/list/common-hooks/itemToString.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/keyUtils.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useCollapsibleGroups.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/list-dom-utils.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/selectionTypes.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useCollectionItems.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/utils/collection-item-utils.ts", "../../../packages/vuu-ui-controls/src/list/ListItemGroup.ts", "../../../packages/vuu-ui-controls/src/list/ListItemHeader.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/utils/filter-utils.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/utils/isSelected.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useImperativeScrollingAPI.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useKeyboardNavigation.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useSelection.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useTypeahead.ts", "../../../packages/vuu-ui-controls/src/list/common-hooks/useViewportTracking.ts", "../../../packages/vuu-ui-controls/src/common-hooks/use-resize-observer.ts", "../../../packages/vuu-ui-controls/src/list/useList.ts", "../../../packages/vuu-ui-controls/src/list/useListHeight.ts", "../../../packages/vuu-ui-controls/src/list/useScrollPosition.ts", "../../../packages/vuu-ui-controls/src/list/VirtualizedList.tsx", "../../../node_modules/clsx/dist/clsx.m.js", "../../../packages/vuu-ui-controls/src/list/useVirtualization.ts", "../../../packages/vuu-ui-controls/src/list/keyset.ts", "../../../packages/vuu-ui-controls/src/tabstrip/Tabstrip.tsx", "../../../packages/vuu-ui-controls/src/tabstrip/useTabstrip.ts", "../../../packages/vuu-ui-controls/src/tabstrip/TabMenuOptions.ts", "../../../packages/vuu-ui-controls/src/tabstrip/tabstrip-dom-utils.ts", "../../../packages/vuu-ui-controls/src/tabstrip/useAnimatedSelectionThumb.ts", "../../../packages/vuu-ui-controls/src/tabstrip/useKeyboardNavigation.ts", "../../../packages/vuu-ui-controls/src/tabstrip/useSelection.ts", "../../../packages/vuu-ui-controls/src/tabstrip/Tab.tsx", "../../../packages/vuu-ui-controls/src/tabstrip/TabMenu.tsx", "../../../packages/vuu-ui-controls/src/tree/Tree.tsx", "../../../packages/vuu-ui-controls/src/tree/list-dom-utils.ts", "../../../packages/vuu-ui-controls/src/tree/use-items-with-ids.ts", "../../../packages/vuu-ui-controls/src/tree/use-selection.ts", "../../../packages/vuu-ui-controls/src/tree/use-viewport-tracking.ts", "../../../packages/vuu-ui-controls/src/tree/useTree.ts", "../../../packages/vuu-ui-controls/src/tree/use-keyboard-navigation.ts", "../../../packages/vuu-ui-controls/src/tree/hierarchical-data-utils.ts", "../../../packages/vuu-ui-controls/src/tree/key-code.ts", "../../../packages/vuu-ui-controls/src/tree/use-hierarchical-data.ts", "../../../packages/vuu-ui-controls/src/tree/use-collapsible-groups.ts", "../../../packages/vuu-ui-controls/src/tree/use-tree-keyboard-navigation.ts", "../../../packages/vuu-shell/src/theme-provider/ThemeProvider.tsx", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/session-editing-form/SessionEditingForm.tsx", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/layout-config/use-layout-config.ts", "../../../packages/vuu-shell/src/layout-config/local-config.ts", "../../../packages/vuu-shell/src/layout-config/remote-config.ts", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.ts", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.tsx", "../../../packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.tsx", "../../../packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.tsx", "../../../packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.tsx", "../../../packages/vuu-shell/src/shell-layouts/useShellLayout.ts", "../../../packages/vuu-shell/src/ShellContextProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["export * from \"./connection-status\";\nexport * from \"./density-switch\";\nexport * from \"./feature\";\nexport * from \"./layout-management\";\nexport * from \"./left-nav\";\nexport * from \"./login\";\nexport * from \"./session-editing-form\";\nexport * from \"./shell\";\nexport * from \"./shell-layouts\";\nexport * from \"./shellTypes\";\nexport * from \"./ShellContextProvider\";\nexport * from \"./theme-provider\";\nexport * from \"./theme-switch\";\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 } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\nimport { importCSS } from \"./css-module-loader\";\n\nconst componentsMap = new Map();\n\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 return componentsMap.get(url);\n};\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n console.log(\"Feature render\", { css, url, props });\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 <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</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\">loading</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 \"./SaveLayoutPanel.css\";\nexport const SaveLayoutPanel = () => {\n const classBase = \"vuuSaveLayoutPanel\";\n return <div className={classBase}>save layout</div>;\n};\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 { Action, 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 {\n CSSProperties,\n HTMLAttributes,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { useThemeAttributes } from \"../theme-provider\";\n\nimport \"./LeftNav.css\";\n\nconst classBase = \"vuuLeftNav\";\n\ninterface LeftNavProps extends HTMLAttributes<HTMLDivElement> {\n \"data-path\"?: string;\n onResize?: (size: number) => void;\n open?: boolean;\n sizeCollapsed?: number;\n sizeContent?: number;\n sizeExpanded?: number;\n}\n\ntype NavStatus = \"menu-full\" | \"menu-icons\" | \"menu-content\";\ntype NavState = {\n activeTabIndex: number;\n navStatus: NavStatus;\n};\n\nexport const LeftNav = ({\n \"data-path\": path,\n onResize,\n open = true,\n sizeCollapsed = 80,\n sizeContent = 240,\n sizeExpanded = 240,\n style: styleProp,\n ...htmlAttributes\n}: LeftNavProps) => {\n const dispatch = useLayoutProviderDispatch();\n const openRef = useRef(open);\n const [navState, setNavState] = useState<NavState>({\n activeTabIndex: 0,\n navStatus: \"menu-full\",\n });\n const [themeClass] = useThemeAttributes();\n\n const getWidthAndStatus = useCallback(\n (isOpen: boolean, tabIndex: number): [number, NavStatus] => {\n switch (tabIndex) {\n case 0:\n return isOpen\n ? [sizeExpanded, \"menu-full\"]\n : [sizeCollapsed, \"menu-icons\"];\n default:\n return [sizeCollapsed + sizeContent, \"menu-content\"];\n }\n },\n [sizeCollapsed, sizeContent, sizeExpanded]\n );\n\n const handleTabSelection = useCallback(\n (value: number) => {\n const [width, navStatus] = getWidthAndStatus(openRef.current, value);\n setNavState({\n activeTabIndex: value,\n navStatus,\n });\n dispatch({\n type: Action.LAYOUT_RESIZE,\n path,\n size: width,\n } as LayoutResizeAction);\n },\n [dispatch, getWidthAndStatus, path]\n );\n\n const toggleSize = useCallback(() => {\n openRef.current = !openRef.current;\n setNavState(({ activeTabIndex, navStatus }) => ({\n activeTabIndex,\n navStatus: navStatus === \"menu-icons\" ? \"menu-full\" : \"menu-icons\",\n }));\n dispatch({\n type: Action.LAYOUT_RESIZE,\n path,\n size: openRef.current ? 240 : 80,\n } as LayoutResizeAction);\n }, [dispatch, path]);\n\n const style = {\n ...styleProp,\n \"--nav-menu-collapsed-width\": `${sizeCollapsed}px`,\n \"--nav-menu-expanded-width\": `${sizeExpanded}px`,\n } as CSSProperties;\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, `${classBase}-${navState.navStatus}`)}\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=\"tables\" label=\"VUU TABLES\"></Tab>\n <Tab data-icon=\"templates\" label=\"LAYOUT TEMPLATES\"></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\": openRef.current,\n \"vuuLeftNav-toggleButton-closed\": !openRef.current,\n })}\n data-icon={openRef.current ? \"chevron-left\" : \"chevron-right\"}\n onClick={toggleSize}\n />\n </div>\n </div>\n <Stack\n active={navState.activeTabIndex - 1}\n className={`${classBase}-menu-secondary`}\n showTabs={false}\n >\n <div style={{ background: \"yellow\", height: \"100%\" }}>VUU Tables</div>\n <div style={{ background: \"green\", height: \"100%\" }}>\n Layout Templates\n </div>\n <div style={{ background: \"red\", height: \"100%\" }}>My Layouts</div>\n </Stack>\n </div>\n );\n};\n", "import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n} from \"react\";\n\nconst NO_DRAG_CONTEXT = {\n isDragSource: false,\n isDropTarget: false,\n register: () => undefined,\n};\n\nconst unconfiguredRegistrationCall = () =>\n console.log(`have you forgotten to provide a DragDrop Provider ?`);\n\nexport interface DragDropContextProps {\n dragSources?: Map<string, string[]>;\n dropTargets?: Map<string, string[]>;\n registerDragDropParty: (id: string) => void;\n}\n\nconst DragDropContext = createContext<DragDropContextProps>({\n registerDragDropParty: unconfiguredRegistrationCall,\n});\n\nexport type DragSources = { [key: string]: { dropTargets: string | string[] } };\nexport interface DragDropProviderProps {\n children: ReactNode;\n dragSources: DragSources;\n}\n\nexport const DragDropProvider = ({\n children,\n dragSources: dragSourcesProp,\n}: DragDropProviderProps) => {\n const [dragSources, dropTargets] = useMemo(() => {\n const sources = new Map<string, string[]>();\n const targets = new Map<string, string[]>();\n\n for (const [sourceId, { dropTargets }] of Object.entries(dragSourcesProp)) {\n const sourceEntry = sources.get(sourceId);\n const targetIds = Array.isArray(dropTargets)\n ? dropTargets\n : [dropTargets];\n if (sourceEntry) {\n sourceEntry.push(...targetIds);\n } else {\n sources.set(sourceId, targetIds);\n }\n for (const targetId of targetIds) {\n const targetEntry = targets.get(targetId);\n if (targetEntry) {\n targetEntry.push(sourceId);\n } else {\n targets.set(targetId, [sourceId]);\n }\n }\n }\n return [sources, targets];\n }, [dragSourcesProp]);\n\n console.log({\n dragSources,\n dropTargets,\n });\n\n const registerDragDropParty = useCallback((id: string) => {\n console.log(`registerDragDropParty ${id}`);\n }, []);\n\n const contextValue: DragDropContextProps = useMemo(\n () => ({\n dragSources,\n dropTargets,\n registerDragDropParty,\n }),\n [dragSources, dropTargets, registerDragDropParty]\n );\n\n return (\n <DragDropContext.Provider value={contextValue}>\n {children}\n </DragDropContext.Provider>\n );\n};\n\nexport interface DragDropProviderResult {\n isDragSource: boolean;\n isDropTarget: boolean;\n register: (id: string) => void;\n}\n\nexport const useDragDropProvider = (id?: string): DragDropProviderResult => {\n const { dragSources, dropTargets, registerDragDropParty } =\n useContext(DragDropContext);\n if (id) {\n const isDragSource = dragSources?.has(id) ?? false;\n const isDropTarget = dropTargets?.has(id) ?? false;\n\n return {\n isDragSource,\n isDropTarget,\n register: registerDragDropParty,\n };\n } else {\n return NO_DRAG_CONTEXT;\n }\n};\n", "import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n Direction,\n InternalDragDropProps,\n InternalDragHookResult,\n ViewportRange,\n} from \"./dragDropTypesNext\";\nimport { useDragDisplacers } from \"./useDragDisplacers\";\n\nimport {\n dimensions,\n getIndexOfDraggedItem,\n getNextDropTarget,\n MeasuredDropTarget,\n measureDropTargets,\n NOT_HIDDEN,\n NOT_OVERFLOWED,\n} from \"./drop-target-utils\";\n\nexport const useDragDropNaturalMovement = ({\n draggableRef,\n onDrop,\n orientation = \"horizontal\",\n containerRef,\n itemQuery = \"*\",\n selected,\n viewportRange,\n}: InternalDragDropProps): InternalDragHookResult => {\n const dragDirectionRef = useRef<Direction | undefined>();\n\n const isScrollable = useRef(false);\n /** current position of dragged element */\n const dragPosRef = useRef<number>(-1);\n const measuredDropTargets = useRef<MeasuredDropTarget[]>([]);\n const overflowMenuShowingRef = useRef(false);\n\n const [showOverflow, setShowOverflow] = useState(false);\n\n const { clearSpacers, displaceItem, displaceLastItem } = useDragDisplacers();\n\n const draggedItemRef = useRef<MeasuredDropTarget>();\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED}${NOT_HIDDEN},.vuuOverflowContainer-OverflowIndicator)`;\n\n // const { setMeasurements: setVizData } = useListViz();\n\n const indexOf = (dropTarget: MeasuredDropTarget) =>\n measuredDropTargets.current.findIndex((d) => d.id === dropTarget.id);\n\n // Shouldn't need this - but viewportRange is always stale in stopScrolling. Checked all dependencies\n // look ok. Something to do with setTimeout / scrollHandler ?\n const rangeRef = useRef<ViewportRange>();\n rangeRef.current = viewportRange;\n\n const handleScrollStart = useCallback(() => {\n clearSpacers();\n }, [clearSpacers]);\n\n const handleScrollStop = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", _scrollPos: number, atEnd: boolean) => {\n const { current: container } = containerRef;\n const { current: draggedItem } = draggedItemRef;\n if (container && draggedItem) {\n measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n rangeRef.current\n );\n if (scrollDirection === \"fwd\") {\n measuredDropTargets.current.push(draggedItem);\n } else {\n measuredDropTargets.current.unshift(draggedItem);\n }\n\n // setVizData?.(measuredDropTargets.current);\n\n const { size } = draggedItem;\n const dragPos = dragPosRef.current;\n const midPos = dragPos + size / 2;\n const { current: dropTargets } = measuredDropTargets;\n const dropTarget = getNextDropTarget(dropTargets, midPos, \"fwd\");\n\n if (dropTarget) {\n const targetIndex = indexOf(dropTarget);\n const nextInsertPos = targetIndex;\n const nextDropTarget = dropTargets[nextInsertPos];\n\n if (atEnd && scrollDirection === \"fwd\") {\n displaceLastItem(\n dropTargets,\n dropTargets[dropTargets.length - 1],\n size,\n false,\n \"static\",\n orientation\n );\n } else {\n displaceItem(\n dropTargets,\n nextDropTarget,\n size,\n true,\n \"static\",\n orientation\n );\n }\n // setVizData?.(\n // measuredDropTargets.current,\n // nextDropTarget,\n // dropZoneRef.current\n // );\n }\n }\n },\n [\n containerRef,\n displaceItem,\n displaceLastItem,\n fullItemQuery,\n orientation,\n // setVizData,\n ]\n );\n\n const beginDrag = useCallback(\n (evt: MouseEvent) => {\n const evtTarget = evt.target as HTMLElement;\n const dragElement = evtTarget.closest(itemQuery) as HTMLElement;\n if (\n //TODO need a different check for selected\n dragElement.ariaSelected &&\n Array.isArray(selected) &&\n selected.length > 1\n ) {\n console.log(\"its a selected element, and we have a multi select\");\n }\n const { current: container } = containerRef;\n if (container && dragElement) {\n const { SCROLL_SIZE, CLIENT_SIZE } = dimensions(orientation);\n const { id: draggedItemId } = dragElement;\n\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n container;\n isScrollable.current = scrollSize > clientSize;\n const dropTargets = (measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n viewportRange,\n draggedItemId\n ));\n\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const draggedItem = dropTargets[indexOfDraggedItem];\n\n if (draggedItem && container) {\n draggedItemRef.current = draggedItem;\n\n const displaceFunction = draggedItem.isLast\n ? displaceLastItem\n : displaceItem;\n\n // setVizData?.(dropTargets, displacedItem, dropZone);\n\n console.log({ indexOfDraggedItem, draggedItem });\n\n displaceFunction(\n dropTargets,\n draggedItem,\n draggedItem.size,\n false,\n \"static\",\n orientation\n );\n }\n }\n },\n [\n containerRef,\n displaceItem,\n displaceLastItem,\n fullItemQuery,\n itemQuery,\n orientation,\n selected,\n // setVizData,\n viewportRange,\n ]\n );\n\n const [showPopup, hidePopup] = useMemo(() => {\n let popupShowing = false;\n const show = (dropTarget: MeasuredDropTarget) => {\n if (!popupShowing) {\n popupShowing = true;\n const button = dropTarget.element.querySelector(\".vuuPopupMenu\");\n if (button) {\n const evt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n button.dispatchEvent(evt);\n }\n }\n };\n\n const hide = (dropTarget: MeasuredDropTarget) => {\n if (popupShowing) {\n popupShowing = false;\n const button = dropTarget.element.querySelector(\".vuuPopupMenu\");\n if (button) {\n const evt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n button.dispatchEvent(evt);\n }\n }\n };\n\n return [show, hide];\n }, []);\n\n const drag = useCallback(\n (dragPos: number, mouseMoveDirection: \"fwd\" | \"bwd\") => {\n const { current: draggedItem } = draggedItemRef;\n\n if (draggedItem) {\n if (draggableRef.current && containerRef.current) {\n dragPosRef.current = dragPos;\n\n const { current: dropTargets } = measuredDropTargets;\n const nextDropTarget = getNextDropTarget(\n dropTargets,\n dragPos,\n mouseMoveDirection\n );\n\n if (nextDropTarget && !nextDropTarget.isDraggedItem) {\n if (nextDropTarget.isOverflowIndicator) {\n // Does this belong in here or can we abstract it out\n setShowOverflow((overflowMenuShowingRef.current = true));\n showPopup(nextDropTarget);\n } else {\n const { size } = draggedItem;\n const targetIndex = indexOf(nextDropTarget);\n\n const displaceFunc =\n targetIndex === dropTargets.length - 1\n ? displaceLastItem\n : displaceItem;\n\n displaceFunc(\n dropTargets,\n nextDropTarget,\n size,\n true,\n mouseMoveDirection,\n orientation\n );\n\n // setVizData?.(dropTargets, nextDropTarget, nextDropZone);\n\n const overflowIndicator = dropTargets.at(\n -1\n ) as MeasuredDropTarget;\n hidePopup(overflowIndicator);\n setShowOverflow((overflowMenuShowingRef.current = false));\n }\n }\n\n dragDirectionRef.current = mouseMoveDirection;\n }\n }\n },\n [\n containerRef,\n displaceItem,\n displaceLastItem,\n draggableRef,\n hidePopup,\n orientation,\n showPopup,\n ]\n );\n\n const drop = useCallback(() => {\n clearSpacers();\n const { current: dropTargets } = measuredDropTargets;\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const draggedItem = dropTargets[indexOfDraggedItem];\n if (draggedItem) {\n dragDirectionRef.current = undefined;\n\n if (overflowMenuShowingRef.current) {\n onDrop(draggedItem.index, -1);\n } else {\n const absoluteIndexDraggedItem = getIndexOfDraggedItem(\n dropTargets,\n true\n );\n onDrop(draggedItem.index, absoluteIndexDraggedItem);\n }\n }\n setShowOverflow(false);\n\n if (containerRef.current) {\n // TODO we're not catching every scenario where we need to control\n // the final scroll position here.\n const scrollTop = containerRef.current?.scrollTop;\n if (indexOfDraggedItem < dropTargets.length) {\n containerRef.current.scrollTop = scrollTop;\n }\n }\n }, [clearSpacers, containerRef, onDrop]);\n\n return {\n beginDrag,\n drag,\n drop,\n handleScrollStart,\n handleScrollStop,\n revealOverflowedItems: showOverflow,\n };\n};\n", "import { useCallback, useMemo, useRef } from \"react\";\nimport {\n MeasuredDropTarget,\n mutateDropTargetsSwitchDropTargetPosition,\n} from \"./drop-target-utils\";\nimport { createDragSpacer as createDragDisplacer } from \"./Draggable\";\nimport { Direction } from \"./dragDropTypesNext\";\n\nexport type DragDisplacersHookResult = {\n displaceItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\"\n ) => void;\n displaceLastItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\"\n ) => void;\n clearSpacers: () => void;\n};\n\nexport type DragDisplacersHook = () => DragDisplacersHookResult;\n/**\n * Manage a pair of displacer elements to smoothly display a moving gap between\n * list items of any kind. Designed to be used in a drag drop operation. The 'static'\n * direction option should be used at drag start or following scroll.\n */\nexport const useDragDisplacers: DragDisplacersHook = () => {\n const animationFrame = useRef(0);\n const transitioning = useRef(false);\n\n const spacers = useMemo(\n // We only need to listen for transition end on one of the spacers\n () => [createDragDisplacer(transitioning), createDragDisplacer()],\n []\n );\n\n const clearSpacers = useCallback(\n () => spacers.forEach((spacer) => spacer.remove()),\n [spacers]\n );\n\n const animateTransition = useCallback(\n (size: number, propertyName = \"width\") => {\n const [spacer1, spacer2] = spacers;\n animationFrame.current = requestAnimationFrame(() => {\n transitioning.current = true;\n spacer1.style.cssText = `${propertyName}: 0px`;\n spacer2.style.cssText = `${propertyName}: ${size}px`;\n spacers[0] = spacer2;\n spacers[1] = spacer1;\n });\n },\n [spacers]\n );\n\n const cancelAnyPendingAnimation = useCallback(() => {\n if (animationFrame.current) {\n cancelAnimationFrame(animationFrame.current);\n animationFrame.current = 0;\n }\n }, []);\n\n const displaceItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n orientation: \"horizontal\" | \"vertical\" = \"horizontal\"\n ) => {\n if (dropTarget) {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n cancelAnyPendingAnimation();\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n if (direction === \"fwd\") {\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.after(spacer1);\n dropTarget.element.before(spacer2);\n }\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else if (direction === \"static\") {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.before(spacer1);\n } else {\n throw Error(\n \"useDragDisplacers currently only supports noTransition for static displacement\"\n );\n }\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n }\n },\n [animateTransition, cancelAnyPendingAnimation, clearSpacers, spacers]\n );\n const displaceLastItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n orientation: \"horizontal\" | \"vertical\" = \"horizontal\"\n ) => {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n\n cancelAnyPendingAnimation();\n\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.after(spacer1);\n }\n\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n },\n [animateTransition, cancelAnyPendingAnimation, clearSpacers, spacers]\n );\n\n return {\n displaceItem,\n displaceLastItem,\n clearSpacers,\n };\n};\n", "import { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { ViewportRange } from \"./dragDropTypesNext\";\nimport { Direction, Rect } from \"./dragDropTypesNext\";\n\nconst LEFT_RIGHT = [\"left\", \"right\"];\nconst TOP_BOTTOM = [\"top\", \"bottom\"];\n// duplicated in repsonsive\n\nexport const NOT_OVERFLOWED = \":not(.wrapped)\";\nexport const NOT_HIDDEN = ':not([aria-hidden=\"true\"])';\n\nexport type MeasuredDropTarget = {\n /** \n The index position currently occupied by this item. If draggable \n is dropped here, this will be the destination drop position.\n */\n currentIndex: number;\n dataIndex?: number;\n element: HTMLElement;\n id: string;\n index: number;\n isDraggedItem: boolean;\n isLast?: boolean;\n isOverflowIndicator?: boolean;\n start: number;\n end: number;\n mid: number;\n size: number;\n};\n\nexport type targetType = {\n element: HTMLElement | null;\n index: number;\n isLast?: boolean;\n};\n\n/** clones and removes id */\nexport const cloneElement = <T extends HTMLElement>(element: T): T => {\n const dolly = element.cloneNode(true) as T;\n // TOSO should we care about nested id values - perhaps an additional param, defaulting to false ?\n dolly.removeAttribute(\"id\");\n // Set index to -1 in case a moueMove event as we wait for drop to take effect might set highlighted\n // index to wrong value (see useList) -1 will be ignored;\n dolly.dataset.index = \"-1\";\n return dolly;\n};\n\ntype MousePosKey = keyof Pick<MouseEvent, \"clientX\" | \"clientY\">;\ntype DOMRectKey = keyof Omit<DOMRect, \"toJSON\">;\ntype DOMRectDimensionKey = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype Dimension = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype ElementDimension = keyof Pick<\n HTMLElement,\n | \"scrollHeight\"\n | \"scrollWidth\"\n | \"clientHeight\"\n | \"clientWidth\"\n | \"scrollTop\"\n | \"scrollLeft\"\n>;\n\ntype ElementPosition = \"x\" | \"y\";\n\nexport const measureElementSizeAndPosition = (\n element: HTMLElement,\n dimension: Dimension = \"width\",\n includeAutoMargin = false\n) => {\n const pos = dimension === \"width\" ? \"left\" : \"top\";\n const { [dimension]: size, [pos]: position } =\n element.getBoundingClientRect();\n const { padEnd = false, padStart = false } = element.dataset;\n const style = getComputedStyle(element);\n const [start, end] = dimension === \"width\" ? LEFT_RIGHT : TOP_BOTTOM;\n const marginStart =\n padStart && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${start}`), 10);\n const marginEnd =\n padEnd && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${end}`), 10);\n\n let minWidth = size;\n const flexShrink = parseInt(style.getPropertyValue(\"flex-shrink\"), 10);\n if (flexShrink > 0) {\n const flexBasis = parseInt(style.getPropertyValue(\"flex-basis\"), 10);\n if (!isNaN(flexBasis) && flexBasis > 0) {\n minWidth = flexBasis;\n }\n }\n return [position, marginStart + minWidth + marginEnd];\n};\n\nconst DIMENSIONS = {\n horizontal: {\n CLIENT_POS: \"clientX\" as MousePosKey,\n CLIENT_SIZE: \"clientWidth\" as ElementDimension,\n CONTRA: \"top\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientY\" as MousePosKey,\n CONTRA_END: \"bottom\" as DOMRectDimensionKey,\n CONTRA_POS: \"y\" as ElementPosition,\n DIMENSION: \"width\" as DOMRectDimensionKey,\n END: \"right\" as DOMRectKey,\n POS: \"x\" as ElementPosition,\n SCROLL_POS: \"scrollLeft\" as ElementDimension,\n SCROLL_SIZE: \"scrollWidth\" as ElementDimension,\n START: \"left\" as DOMRectKey,\n },\n vertical: {\n CLIENT_POS: \"clientY\" as MousePosKey,\n CLIENT_SIZE: \"clientHeight\" as ElementDimension,\n CONTRA: \"left\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientX\" as MousePosKey,\n CONTRA_END: \"right\" as DOMRectDimensionKey,\n CONTRA_POS: \"x\" as ElementPosition,\n DIMENSION: \"height\" as DOMRectDimensionKey,\n END: \"bottom\" as DOMRectKey,\n POS: \"y\" as ElementPosition,\n SCROLL_POS: \"scrollTop\" as ElementDimension,\n SCROLL_SIZE: \"scrollHeight\" as ElementDimension,\n START: \"top\" as DOMRectKey,\n },\n};\nexport const dimensions = (orientation: orientationType) =>\n DIMENSIONS[orientation];\n\nexport const getItemById = (\n measuredItems: MeasuredDropTarget[],\n id: string\n) => {\n const result = measuredItems.find((item) => item.id === id);\n if (result) {\n return result;\n }\n // else {\n // throw Error(`measuredItems do not contain an item with id #${id}`);\n // }\n};\n\nexport const removeDraggedItem = (\n measuredItems: MeasuredDropTarget[],\n index: number\n) => {\n measuredItems.splice(index, 1);\n for (let i = index; i < measuredItems.length; i++) {\n measuredItems[i].currentIndex -= 1;\n }\n};\n\nexport type dropZone = \"start\" | \"end\";\n\nexport const measureDropTargets = (\n container: HTMLElement,\n orientation: orientationType,\n itemQuery?: string,\n viewportRange?: ViewportRange,\n draggedItemId?: string\n) => {\n const dragThresholds: MeasuredDropTarget[] = [];\n const { DIMENSION } = dimensions(orientation);\n const children = Array.from(\n itemQuery ? container.querySelectorAll(itemQuery) : container.children\n );\n\n const itemCount = children.length;\n const start =\n typeof viewportRange?.from === \"number\"\n ? viewportRange.atEnd\n ? Math.max(0, viewportRange.from - 1)\n : viewportRange.from\n : 0;\n const end =\n typeof viewportRange?.to === \"number\"\n ? Math.min(viewportRange.to + 2, itemCount - 1)\n : itemCount - 1;\n for (let index = start; index <= end; index++) {\n const element = children[index] as HTMLElement;\n const [start, size] = measureElementSizeAndPosition(element, DIMENSION);\n const isLast = index === itemCount - 1;\n const id = element.id;\n\n const dataIndex = parseInt(element.dataset.index ?? \"-1\");\n\n dragThresholds.push({\n currentIndex: index,\n dataIndex: isNaN(dataIndex) ? -1 : dataIndex,\n id,\n index,\n isDraggedItem: draggedItemId === id,\n isLast,\n isOverflowIndicator: element.dataset.index === \"overflow\",\n element: element as HTMLElement,\n start,\n end: start + size,\n size,\n mid: start + size / 2,\n });\n }\n return dragThresholds;\n};\n\n/**\n The index of the dropped item is its array offset within the\n dropTargets. If there is no scrolling involved, this will be\n the same as the 'absolute' index position. If the dropTargets have\n been scrolled, though, we will only have a window of the full\n dataset, corresponding to the current scroll viewport. In that case\n we need to determine the offset and factor that into the 'absolute'\n index.\n */\nexport const getIndexOfDraggedItem = (\n dropTargets: MeasuredDropTarget[],\n absoluteIndex = false\n) => {\n const indexOfDraggedItem = dropTargets.findIndex((d) => d.isDraggedItem);\n const { index: draggedItemOriginalIndex } = dropTargets[indexOfDraggedItem];\n if (absoluteIndex) {\n const minIndex = dropTargets\n .filter((d) => !d.isDraggedItem)\n .reduce((min, d) => Math.min(min, d.index), Number.MAX_SAFE_INTEGER);\n const scrolled =\n minIndex > 0 && !(draggedItemOriginalIndex === 0 && minIndex === 1);\n if (scrolled) {\n return minIndex + indexOfDraggedItem;\n }\n }\n return indexOfDraggedItem;\n};\n\n// As the draggedItem is moved, displacing existing items, mirror\n// the movements within the dropTargets collection\nexport const mutateDropTargetsSwitchDropTargetPosition = (\n dropTargets: MeasuredDropTarget[],\n direction: Direction\n) => {\n // console.log(`switchDropTargetPosition\n // direction: ${direction} ${dropTargetsDebugString(dropTargets)}`);\n\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const indexOfTarget =\n direction === \"fwd\" ? indexOfDraggedItem + 1 : indexOfDraggedItem - 1;\n\n if (indexOfTarget < 0 || indexOfTarget >= dropTargets.length) {\n throw Error(\"switchDropTargetPosition index out of range\");\n }\n\n const draggedItem = dropTargets.at(indexOfDraggedItem) as MeasuredDropTarget;\n const targetItem = dropTargets.at(indexOfTarget) as MeasuredDropTarget;\n\n const diff = targetItem.size - draggedItem.size;\n\n if (direction === \"fwd\") {\n const draggedStart = targetItem.start + diff;\n const draggedEnd = targetItem.end;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start;\n const targetEnd = draggedItem.end + diff;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfDraggedItem, 2, newTargetItem, newDraggedItem);\n } else {\n const draggedStart = targetItem.start;\n const draggedEnd = targetItem.end - diff;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start - diff;\n const targetEnd = draggedItem.end;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfTarget, 2, newDraggedItem, newTargetItem);\n }\n\n // console.log(`${direction} ${dropTargetsDebugString(dropTargets)}`);\n};\n\nexport const getNextDropTarget = (\n dropTargets: MeasuredDropTarget[],\n pos: number,\n mouseMoveDirection: Direction\n): MeasuredDropTarget => {\n const len = dropTargets.length;\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const draggedItem = dropTargets[indexOfDraggedItem];\n\n if (mouseMoveDirection === \"fwd\") {\n const leadingEdge = Math.round(pos + draggedItem.size);\n for (let index = len - 1; index >= 0; index--) {\n const dropTarget = dropTargets[index];\n if (leadingEdge > dropTarget.mid) {\n if (index < indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n } else {\n const leadingEdge = Math.round(pos);\n for (let index = 0; index < len; index++) {\n const dropTarget = dropTargets[index];\n if (leadingEdge < dropTarget.mid) {\n if (index > indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n }\n throw Error(\"no dropTraget identified\");\n};\n\n/**\n * An item within a scrollable container might have a width or height greater than that of\n * the container. If we drag such an item, we don't want the draggable to be larger than\n * the container.\n */\nexport function constrainRect(targetRect: Rect, constraintRect: Rect): Rect {\n const { height, left, top, width } = targetRect;\n const { height: constrainedHeight, width: constrainedWidth } = constraintRect;\n return {\n height: Math.min(height, constrainedHeight),\n left,\n top,\n width: Math.min(width, constrainedWidth),\n };\n}\n\nexport const moveItem = <T = unknown>(\n items: T[],\n fromIndex: number,\n toIndex: number\n): T[] => {\n if (fromIndex === toIndex) {\n return items;\n } else {\n const newItems = items.slice();\n const [item] = newItems.splice(fromIndex, 1);\n if (toIndex === -1) {\n return newItems.concat(item);\n } else {\n const offset = toIndex > fromIndex ? 0 : 0;\n newItems.splice(toIndex + offset, 0, item);\n return newItems;\n }\n }\n};\n\nexport const dropTargetsDebugString = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets\n .map(\n (d, i) =>\n `\\n${d.isDraggedItem ? \"*\" : \" \"}[${i}] width : ${Math.floor(\n d.size\n )} ${Math.floor(d.start)} - ${Math.floor(d.end)} (mid ${Math.floor(\n d.mid\n )})`\n )\n .join(\"\");\n", "import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport {\n CSSProperties,\n forwardRef,\n MutableRefObject,\n TransitionEventHandler,\n useCallback,\n} from \"react\";\nimport { Portal } from \"@vuu-ui/vuu-popups\";\n\nimport \"./Draggable.css\";\n\nconst makeClassNames = (classNames: string) =>\n classNames.split(\" \").map((className) => `vuuDraggable-${className}`);\nexport const Draggable = forwardRef<\n HTMLDivElement,\n {\n wrapperClassName: string;\n element: HTMLElement;\n onTransitionEnd?: TransitionEventHandler;\n scale?: number;\n style: CSSProperties;\n }\n>(function Draggable(\n { wrapperClassName, element, onTransitionEnd, style, scale = 1 },\n forwardedRef\n) {\n const callbackRef = useCallback(\n (el: HTMLDivElement) => {\n if (el) {\n el.innerHTML = \"\";\n el.appendChild(element);\n if (scale !== 1) {\n el.style.transform = `scale(${scale},${scale})`;\n }\n }\n },\n [element, scale]\n );\n const forkedRef = useForkRef<HTMLDivElement>(forwardedRef, callbackRef);\n\n return (\n <Portal>\n <div\n className={cx(\"vuuDraggable\", ...makeClassNames(wrapperClassName))}\n ref={forkedRef}\n onTransitionEnd={onTransitionEnd}\n style={style}\n />\n </Portal>\n );\n});\n\n// const colors = [\"black\", \"red\", \"green\", \"yellow\"];\n// let color_idx = 0;\nexport const createDragSpacer = (\n transitioning?: MutableRefObject<boolean>\n): HTMLElement => {\n // const idx = color_idx++ % 4;\n\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-spacer\";\n if (transitioning) {\n spacer.addEventListener(\"transitionend\", () => {\n transitioning.current = false;\n });\n }\n return spacer;\n};\n\nexport const createDropIndicatorPosition = (): HTMLElement => {\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-dropIndicatorPosition\";\n return spacer;\n};\n\nexport const createDropIndicator = (\n transitioning?: MutableRefObject<boolean>\n): HTMLElement => {\n // const idx = color_idx++ % 4;\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-dropIndicator\";\n if (transitioning) {\n spacer.addEventListener(\"transitionend\", () => {\n transitioning.current = false;\n });\n }\n return spacer;\n};\n", "import { Scrim } from \"@salt-ds/lab\";\nimport { Button, Text } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { HTMLAttributes, useCallback, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport \"./Dialog.css\";\n\nconst classBase = \"vuuDialog\";\n\nexport interface DialogProps extends HTMLAttributes<HTMLDivElement> {\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nexport const Dialog = ({\n children,\n className,\n isOpen = false,\n onClose,\n title,\n ...props\n}: DialogProps) => {\n const root = useRef<HTMLDivElement>(null);\n const [posX] = useState(0);\n const [posY] = useState(0);\n\n const close = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleRender = useCallback(() => {\n // if (center && isOpen && root.current) {\n // const { width, height } = root.current.getBoundingClientRect();\n // const { innerWidth, innerHeight } = window;\n // const x = innerWidth / 2 - width / 2;\n // const y = innerHeight / 2 - height / 2;\n // setPosX(x);\n // setPosY(y);\n // }\n }, []);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <Portal onRender={handleRender} x={posX} y={posY}>\n <Scrim className={`${classBase}-scrim`} open={isOpen}>\n <div {...props} className={cx(classBase, className)} ref={root}>\n <div className={cx(\"vuuToolbarProxy\", `${classBase}-header`)}>\n <Text>{title}</Text>\n <Button\n key=\"close\"\n onClick={close}\n data-align=\"end\"\n data-icon=\"close\"\n />\n </div>\n {children}\n </div>\n </Scrim>\n </Portal>\n );\n};\n", "import { ReactElement, useLayoutEffect, useMemo } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createContainer, renderPortal } from \"./render-portal\";\nimport { useThemeAttributes } from \"@vuu-ui/vuu-shell\";\nimport cx from \"classnames\";\n\nexport interface PortalProps {\n children: ReactElement;\n onRender?: () => void;\n x?: number;\n y?: number;\n}\n\nexport const Portal = function Portal({\n children,\n x = 0,\n y = 0,\n onRender,\n}: PortalProps) {\n // Do we need to accept container here as a prop ?\n const [themeClass, densityClass, dataMode] = useThemeAttributes();\n const renderContainer = useMemo(() => {\n return createContainer({\n className: cx(themeClass, densityClass),\n dataMode,\n });\n }, [dataMode, densityClass, themeClass]);\n\n useLayoutEffect(() => {\n renderPortal(children, renderContainer, x, y, onRender);\n }, [children, onRender, renderContainer, x, y]);\n\n useLayoutEffect(() => {\n return () => {\n if (renderContainer) {\n ReactDOM.unmountComponentAtNode(renderContainer);\n if (renderContainer.classList.contains(\"vuuPopup\")) {\n renderContainer.parentElement?.removeChild(renderContainer);\n }\n }\n };\n }, [renderContainer]);\n\n // useLayoutEffect(() => {\n // renderContainer.current = renderPortal(children, x, y, container)\n // return () => {\n // if (renderContainer.current){\n // console.log('EXPLICIT UNMOUNT')\n // ReactDOM.unmountComponentAtNode(renderContainer.current);\n // if (renderContainer.current.classList.contains('hwReactPopup')){\n // renderContainer.current.parentElement.removeChild(renderContainer.current);\n // renderContainer.current = null;\n // }\n // }\n // }\n // },[])\n return null;\n};\n", "import * as ReactDOM from \"react-dom\";\nimport { ReactElement } from \"react\";\nimport cx from \"classnames\";\n\nlet containerId = 1;\n\nconst getPortalContainer = ({\n className,\n dataMode,\n x = 0,\n y = 0,\n win = window,\n}: HTMLContainerProps) => {\n const el = win.document.createElement(\"div\");\n el.className = cx(`vuuPopup ${containerId++}`, className);\n el.style.cssText = `left:${x}px; top:${y}px;`;\n if (dataMode) {\n el.dataset.mode = dataMode;\n }\n win.document.body.appendChild(el);\n return el;\n};\n\nexport interface HTMLContainerProps {\n className?: string;\n dataMode?: string;\n x?: number;\n y?: number;\n win?: typeof globalThis;\n}\n\nexport const createContainer = (props: HTMLContainerProps) =>\n getPortalContainer(props);\n\nexport const renderPortal = (\n component: ReactElement,\n container: HTMLElement,\n x: number,\n y: number,\n onRender?: () => void\n) => {\n // check this first to see if position has changed\n container.style.cssText = `left:${x}px; top:${y}px;position: absolute;`;\n\n ReactDOM.render(component, container, onRender);\n};\n", "import { useCallback, useRef } from \"react\";\nimport { Portal } from \"../portal\";\nimport MenuList, { MenuListProps } from \"./MenuList\";\nimport { useCascade } from \"./use-cascade\";\n// import { useClickAway } from \"./use-click-away\";\nimport { useItemsWithIdsNext } from \"./use-items-with-ids-next\";\nimport { useId } from \"@vuu-ui/vuu-layout\";\nimport { PopupCloseCallback } from \"../popup\";\nimport { ContextMenuOptions } from \"./useContextMenu\";\n\nexport interface ContextMenuProps extends Omit<MenuListProps, \"onCloseMenu\"> {\n onClose?: PopupCloseCallback;\n position?: { x: number; y: number };\n withPortal?: boolean;\n}\n\nconst noop = () => undefined;\n\nexport const ContextMenu = ({\n activatedByKeyboard,\n children: childrenProp,\n className,\n id: idProp,\n onClose = () => undefined,\n position = { x: 0, y: 0 },\n style,\n ...menuListProps\n}: ContextMenuProps) => {\n const closeHandlerRef = useRef<ContextMenuProps[\"onClose\"]>(onClose);\n closeHandlerRef.current = onClose;\n\n const id = useId(idProp);\n const closeMenuRef = useRef<(location?: string) => void>(noop);\n const [menus, actions] = useItemsWithIdsNext(childrenProp, id);\n const navigatingWithKeyboard = useRef(activatedByKeyboard);\n const handleMouseEnterItem = useCallback(() => {\n navigatingWithKeyboard.current = false;\n }, []);\n\n console.log({ actions, menus });\n\n const handleActivate = useCallback(\n (menuItemId: string) => {\n const actionId = menuItemId.slice(9);\n const { action, options } = actions[actionId];\n closeMenuRef.current(id);\n onClose({\n type: \"menu-action\",\n menuId: action,\n options: options as ContextMenuOptions,\n });\n },\n [actions, id, onClose]\n );\n\n const { closeMenu, listItemProps, openMenu, openMenus, handleRender } =\n useCascade({\n // FIXME\n id: `${id}`,\n onActivate: handleActivate,\n onMouseEnterItem: handleMouseEnterItem,\n position,\n });\n closeMenuRef.current = closeMenu;\n\n const handleCloseMenu = () => {\n console.log(\"handleCloseMenu\");\n navigatingWithKeyboard.current = true;\n closeMenu();\n };\n\n const handleHighlightMenuItem = () => {\n // console.log(`highlight ${idx}`);\n };\n\n const lastMenu = openMenus.length - 1;\n\n const getChildMenuId = (i: number) => {\n if (i >= lastMenu) {\n return undefined;\n } else {\n const { id } = openMenus[i + 1];\n return id;\n }\n };\n\n return (\n <>\n {openMenus.map(({ id: menuId, left, top }, i, all) => {\n const childMenuId = getChildMenuId(i);\n // TODO don't need the portal here, vuu popup service takes care of this\n return (\n <Portal key={i} x={left} y={top} onRender={handleRender}>\n <MenuList\n {...menuListProps}\n activatedByKeyboard={navigatingWithKeyboard.current}\n childMenuShowing={childMenuId}\n className={className}\n id={menuId}\n isRoot={i === 0}\n key={i}\n listItemProps={listItemProps}\n onActivate={handleActivate}\n onHighlightMenuItem={handleHighlightMenuItem}\n onCloseMenu={handleCloseMenu}\n onOpenMenu={openMenu}\n style={style}\n tabIndex={i === all.length - 1 ? 0 : undefined}\n >\n {menus[menuId]}\n </MenuList>\n </Portal>\n );\n })}\n </>\n );\n};\n\nContextMenu.displayName = \"ContextMenu\";\n", "import React, {\n FC,\n HTMLAttributes,\n ReactElement,\n ReactNode,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\n//TODO do we want this dependency ?\nimport { useId } from \"@vuu-ui/vuu-layout\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport { isMenuItemGroup } from \"./use-items-with-ids-next\";\n\nimport \"./MenuList.css\";\n\nconst classBase = \"vuuMenuList\";\n\nexport const Separator = () => <li className=\"vuuMenuItem-divider\" />;\n\nexport interface MenuItemGroupProps {\n children:\n | ReactElement<MenuItemProps>[]\n | [ReactElement<MenuItemLabelProps>, ...ReactElement<MenuItemProps>[]];\n label?: string;\n}\n\nexport interface MenuItemProps extends HTMLAttributes<HTMLDivElement> {\n action?: string;\n idx?: number;\n options?: unknown;\n}\n\n// Purely used as markers, props will be extracted\nexport const MenuItemGroup: FC<MenuItemGroupProps> = () => null;\n// eslint-disable-next-line no-unused-vars\nexport const MenuItem = ({ children, idx, ...props }: MenuItemProps) => {\n return <div {...props}>{children}</div>;\n};\n\nexport interface MenuItemLabelProps {\n children: ReactNode;\n}\nconst MenuItemLabel = ({ children }: { children: ReactNode }) => (\n <>{children}</>\n);\nMenuItemLabel.displayName = \"MenuItemLabel\";\nMenuItem.Label = MenuItemLabel;\n\nconst getDisplayName = (item: ReactNode) =>\n React.isValidElement(item) &&\n typeof item.type !== \"string\" &&\n \"displayName\" in item.type\n ? item.type.displayName\n : undefined;\n\nexport const isMenuItemLabel = (\n item: ReactNode\n): item is ReactElement<MenuItemLabelProps> =>\n getDisplayName(item) === \"MenuItemLabel\";\n\nconst hasIcon = (child: ReactElement) => child.props[\"data-icon\"];\n\nexport interface MenuListProps extends HTMLAttributes<HTMLDivElement> {\n activatedByKeyboard?: boolean;\n children: ReactElement[];\n childMenuShowing?: string;\n highlightedIdx?: number;\n isRoot?: boolean;\n listItemProps?: Partial<MenuItemProps>;\n onActivate?: (menuId: string) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuItemEl: HTMLElement) => void;\n onHighlightMenuItem?: (idx: number) => void;\n}\n\nconst MenuList = ({\n activatedByKeyboard,\n childMenuShowing,\n children,\n className,\n highlightedIdx: highlightedIdxProp,\n id: idProp,\n isRoot,\n listItemProps,\n onHighlightMenuItem,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ...props\n}: MenuListProps) => {\n const id = useId(idProp);\n const root = useRef<HTMLDivElement>(null);\n\n // The id generation be,ongs in useIttemsWithIds\n const mapIdxToId = useMemo(() => new Map(), []);\n\n const handleActivate = (idx: number) => {\n const el = root.current?.querySelector(`:scope > [data-idx='${idx}']`);\n el?.id && onActivate?.(el.id);\n };\n\n const { focusVisible, highlightedIndex, listProps } = useKeyboardNavigation({\n count: React.Children.count(children),\n highlightedIndex: highlightedIdxProp,\n onActivate: handleActivate,\n onHighlight: onHighlightMenuItem,\n onOpenMenu,\n onCloseMenu,\n });\n\n const appliedFocusVisible = childMenuShowing == undefined ? focusVisible : -1;\n\n useLayoutEffect(() => {\n if (childMenuShowing === undefined && activatedByKeyboard) {\n root.current?.focus();\n }\n }, [activatedByKeyboard, childMenuShowing]);\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined || highlightedIndex === -1\n ? undefined\n : mapIdxToId.get(highlightedIndex);\n\n function renderContent() {\n const propsCommonToAllListItems = {\n ...listItemProps,\n role: \"menuitem\",\n };\n\n const maybeIcon = (\n childElement: ReactElement,\n withIcon: boolean,\n iconName?: string\n ) =>\n withIcon\n ? [\n <span\n className=\"vuuIconContainer\"\n data-icon={iconName}\n key=\"icon\"\n />,\n ].concat(childElement)\n : childElement;\n\n function addClonedChild(\n list: ReactElement[],\n child: ReactElement,\n idx: number,\n withIcon: boolean\n ) {\n const {\n children,\n className,\n \"data-icon\": iconName,\n id: itemId,\n hasSeparator,\n label,\n ...props\n } = child.props;\n const hasSubMenu = isMenuItemGroup(child);\n const subMenuShowing = hasSubMenu && childMenuShowing === itemId;\n const ariaControls = subMenuShowing ? `${id}-${itemId}` : undefined;\n\n list.push(\n <MenuItem\n {...props}\n {...propsCommonToAllListItems}\n {...getMenuItemProps(\n itemId,\n idx,\n child.key ?? itemId,\n highlightedIndex,\n appliedFocusVisible,\n className,\n hasSeparator\n )}\n aria-controls={ariaControls}\n aria-haspopup={hasSubMenu || undefined}\n aria-expanded={subMenuShowing || undefined}\n >\n {hasSubMenu\n ? maybeIcon(label ?? children, withIcon, iconName)\n : maybeIcon(children, withIcon, iconName)}\n </MenuItem>\n );\n // mapIdxToId.set(idx, itemId);\n }\n\n const listItems: ReactElement[] = [];\n\n if (children.length > 0) {\n const withIcon = children.some(hasIcon);\n children.forEach((child, idx) => {\n addClonedChild(listItems, child, idx, withIcon);\n });\n }\n\n return listItems;\n }\n\n return (\n <div\n {...props}\n {...listProps}\n aria-activedescendant={getActiveDescendant()}\n className={cx(classBase, className, {\n [`${classBase}-childMenuShowing`]: childMenuShowing !== undefined,\n })}\n data-root={isRoot || undefined}\n id={id}\n ref={root}\n role=\"menu\"\n >\n {renderContent()}\n </div>\n );\n};\n\nconst getMenuItemProps = (\n itemId: string,\n idx: number,\n key: string,\n highlightedIdx: number,\n focusVisible: number,\n className: string,\n hasSeparator: boolean\n) => ({\n id: `menuitem-${itemId}`,\n key: key ?? idx,\n \"data-idx\": idx,\n \"data-highlighted\": idx === highlightedIdx || undefined,\n className: cx(\"vuuMenuItem\", className, {\n \"vuuMenuItem-separator\": hasSeparator,\n focusVisible: focusVisible === idx,\n }),\n});\n\nMenuList.displayName = \"MenuList\";\nexport default MenuList;\n", "import {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { hasPopup, isRoot } from \"./utils\";\nimport { isNavigationKey } from \"./key-code\";\n\nexport interface KeyboardNavigationProps {\n autoHighlightFirstItem?: boolean;\n count: number;\n highlightedIndex?: number;\n onActivate: (idx: number) => void;\n onHighlight?: (idx: number) => void;\n onCloseMenu: (idx: number) => void;\n onOpenMenu?: (menuItemEl: HTMLElement) => void;\n}\n\nexport interface KeyboardHookListProps {\n // onBlur: (evt: FocusEvent) => void;\n onFocus: (evt: FocusEvent) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onMouseDownCapture: () => void;\n onMouseMove: () => void;\n onMouseLeave: () => void;\n}\n\nexport interface NavigationHookResult {\n focusVisible: number;\n controlledHighlighting: boolean;\n highlightedIndex: number;\n setHighlightedIndex: (idx: number) => void;\n // keyboardNavigation: RefObject<boolean>;\n listProps: KeyboardHookListProps;\n setIgnoreFocus: (ignoreFocus: boolean) => void;\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n autoHighlightFirstItem = false,\n count,\n highlightedIndex: highlightedIndexProp,\n onActivate,\n onHighlight,\n // onKeyDown,\n onCloseMenu,\n onOpenMenu,\n}: KeyboardNavigationProps): NavigationHookResult => {\n const highlightedIndexRef = useRef(\n highlightedIndexProp ?? autoHighlightFirstItem ? 0 : -1\n );\n const [, forceRender] = useState<unknown>(null);\n const controlledHighlighting = highlightedIndexProp !== undefined;\n\n const setHighlightedIdx = useCallback(\n (idx) => {\n highlightedIndexRef.current = idx;\n onHighlight?.(idx);\n forceRender({});\n },\n [onHighlight]\n );\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n if (idx !== highlightedIndexRef.current) {\n if (!controlledHighlighting) {\n setHighlightedIdx(idx);\n }\n }\n },\n [controlledHighlighting, setHighlightedIdx]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const highlightedIndex = controlledHighlighting\n ? highlightedIndexProp\n : highlightedIndexRef.current;\n\n const navigateChildldItems = useCallback(\n (e: KeyboardEvent) => {\n const nextIdx = nextItemIdx(count, e.key, highlightedIndexRef.current);\n if (nextIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(nextIdx);\n }\n },\n [count, setHighlightedIndex]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildldItems(e);\n } else if (\n (e.key === \"ArrowRight\" || e.key === \"Enter\") &&\n hasPopup(e.target as HTMLElement, highlightedIndex)\n ) {\n const menuEl = e.target as HTMLElement;\n const menuItemEl = menuEl.querySelector(\n `:scope > [data-idx='${highlightedIndex}']`\n ) as HTMLElement;\n\n if (menuItemEl) {\n onOpenMenu?.(menuItemEl);\n }\n } else if (e.key === \"ArrowLeft\" && !isRoot(e.target as HTMLElement)) {\n onCloseMenu(highlightedIndex);\n } else if (e.key === \"Enter\") {\n onActivate && onActivate(highlightedIndex);\n } else if (e.key === \"Tab\") {\n onCloseMenu(-1);\n }\n },\n [\n highlightedIndex,\n navigateChildldItems,\n onActivate,\n onCloseMenu,\n onOpenMenu,\n ]\n );\n\n const listProps: KeyboardHookListProps = useMemo(\n () => ({\n onFocus: () => {\n if (highlightedIndex === -1) {\n setHighlightedIdx(0);\n }\n },\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n // label === 'ParsedInput' && console.log(`%c[useKeyboardNavigationHook]<${label}> onMouseLeave`,'color:brown')\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [handleKeyDown, highlightedIndex, setHighlightedIdx, setHighlightedIndex]\n );\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting,\n highlightedIndex,\n setHighlightedIndex: setHighlightedIndex,\n // keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n\n// need to be able to accommodate disabled items\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === \"ArrowUp\") {\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", "export const isRoot = (el: HTMLElement) =>\n el.closest(`[data-root='true']`) !== null;\n\nexport const hasPopup = (el: HTMLElement, idx: number) =>\n (el.ariaHasPopup === \"true\" && el.dataset?.idx === `${idx}`) ||\n el.querySelector(`:scope > [data-idx='${idx}'][aria-haspopup='true']`) !==\n null;\n", "function union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: { key: string },\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import React, { ReactElement, ReactNode, useCallback, useMemo } from \"react\";\nimport { isMenuItemLabel, MenuItemGroup, Separator } from \"./MenuList\";\n\nexport const isMenuItemGroup = (child: ReactElement) =>\n child.type === MenuItemGroup || !!child.props[\"data-group\"];\n\ntype Menus = { [key: string]: ReactElement[] };\ntype Actions = { [key: string]: { action: string; options?: unknown } };\n\nconst getLabelFromChildren = (children: ReactNode) => {\n if (Array.isArray(children) && isMenuItemLabel(children[0])) {\n return children[0];\n }\n};\n\nconst assignId = (\n child: ReactElement,\n path: string,\n group: boolean,\n hasSeparator = false\n) => {\n const {\n props: { children },\n } = child;\n // If we have a leaf MenuItem, any children will be label etc\n // if we have a GroupMenuItem, firet item mat be Label\n return {\n childWithId: React.cloneElement(child, {\n hasSeparator,\n id: `${path}`,\n key: path,\n children: group ? getLabelFromChildren(children) : children,\n }),\n grandChildren: group ? children : undefined,\n };\n};\n\nexport const useItemsWithIdsNext = (\n childrenProp: ReactElement[],\n rootId: string\n): [Menus, Actions] => {\n const normalizeChildren = useCallback(() => {\n const collectChildren = (\n children: ReactElement[],\n path = rootId,\n menus: Menus = {},\n actions: Actions = {}\n ) => {\n const list: ReactElement[] = (menus[path] = []);\n let idx = 0;\n let hasSeparator = false;\n\n React.Children.forEach(children, (child) => {\n if (isMenuItemLabel(child)) {\n // do nothing\n } else if (child.type === Separator) {\n hasSeparator = true;\n } else {\n const hasChildItems = isMenuItemGroup(child);\n const childPath = `${path}-${idx}`;\n const {\n props: { action, options },\n } = child;\n\n const { childWithId, grandChildren } = assignId(\n child,\n childPath,\n hasChildItems,\n hasSeparator\n );\n list.push(childWithId);\n if (grandChildren) {\n collectChildren(grandChildren, childPath, menus, actions);\n } else {\n actions[childPath] = { action, options };\n }\n idx += 1;\n hasSeparator = false;\n }\n });\n return [menus, actions];\n };\n\n return collectChildren(childrenProp);\n }, [rootId, childrenProp]);\n\n const [menus, actions] = useMemo(\n () => normalizeChildren(),\n [normalizeChildren]\n );\n\n return [menus, actions] as [Menus, Actions];\n};\n", "import {\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { closestListItem } from \"./list-dom-utils\";\nimport { MenuItemProps } from \"./MenuList\";\n// import {mousePosition} from './aim/utils';\n// import {aiming} from './aim/aim';\n\nconst nudge = (\n menus: RuntimeMenuDescriptor[],\n distance: number,\n pos: \"left\" | \"top\"\n) => {\n return menus.map((m, i) =>\n i === menus.length - 1\n ? {\n ...m,\n [pos]: m[pos] - distance,\n }\n : m\n );\n};\nconst nudgeLeft = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"left\");\nconst nudgeUp = (menus: RuntimeMenuDescriptor[], distance: number) =>\n nudge(menus, distance, \"top\");\n\nconst flipSides = (id: string, menus: RuntimeMenuDescriptor[]) => {\n const [parentMenu, menu] = menus.slice(-2);\n const el = document.getElementById(`${id}-${menu.id}`);\n if (el === null) {\n throw Error(`useCascade.flipSides element with id ${menu.id} not found`);\n }\n const { width } = el.getBoundingClientRect();\n return menus.map((m) =>\n m === menu\n ? {\n ...m,\n left: parentMenu.left - (width - 2),\n }\n : m\n );\n};\n\n// const closedNode = (el: HTMLElement) =>\n// el.ariaHasPopup === \"true\" && el.ariaExpanded !== \"true\";\nconst getPosition = (el: HTMLElement, openMenus: RuntimeMenuDescriptor[]) => {\n const [{ left, top: menuTop }] = openMenus.slice(-1);\n // const {top, right, bottom, left} = el.getBoundingClientRect();\n // this will not work for MenuList within window, we need the\n // const {offsetLeft: left, offsetTop: menuTop} = el.closest('.vuuMenuList');\n const { offsetWidth: width, offsetTop: top } = el;\n return { left: left + width, top: top + menuTop };\n};\n\nexport type RuntimeMenuDescriptor = {\n id: string;\n left: number;\n top: number;\n};\n\nexport const getHostMenuId = (id: string, rootId: string) => {\n const pos = id.lastIndexOf(\"-\");\n return pos > -1 ? id.slice(9, pos) : rootId;\n};\n\nconst getTargetMenuId = (id: string) => id.slice(9);\n\nconst getMenuItemDetails = (\n { ariaExpanded, ariaHasPopup, id }: HTMLElement,\n rootId: string\n) => {\n if (id.startsWith(\"menuitem\")) {\n return {\n hostMenuId: getHostMenuId(id, rootId),\n targetMenuId: getTargetMenuId(id),\n menuItemId: id,\n isGroup: ariaHasPopup === \"true\",\n isOpen: ariaExpanded === \"true\",\n };\n } else {\n throw Error(`getMenuItemDetails #${id} is not a menuitem`);\n }\n};\n\nexport interface CascadeHookProps {\n id: string;\n onActivate: (menuId: string) => void;\n onMouseEnterItem: (evt: MouseEvent, itemId: string) => void;\n position: { x: number; y: number };\n}\n\nexport interface CascadeHooksResult {\n closeMenu: () => void;\n handleRender: () => void;\n listItemProps: Partial<MenuItemProps>;\n openMenu: (menuItemEl: HTMLElement) => void;\n openMenus: RuntimeMenuDescriptor[];\n}\n\ntype MenuStatus = \"no-popup\" | \"popup-open\" | \"pending-close\" | \"popup-pending\";\ntype MenuState = { [key: string]: MenuStatus };\n\nexport const useCascade = ({\n id: rootId,\n onActivate,\n onMouseEnterItem,\n position: { x: posX, y: posY },\n}: CascadeHookProps): CascadeHooksResult => {\n const [, forceRefresh] = useState({});\n const openMenus = useRef<RuntimeMenuDescriptor[]>([\n { id: rootId, left: posX, top: posY },\n ]);\n\n const menuIsOpen = useCallback(\n (menuId: string) =>\n openMenus.current.findIndex((menu) => menu.id === menuId) !== -1,\n []\n );\n\n const getOpenMenuStatus = useCallback((menuId: string) => {\n const state = menuState.current[menuId];\n if (state === undefined) {\n throw Error(`getOpenMenuState no entry for menu ${menuId}`);\n }\n return state;\n }, []);\n\n const setOpenMenus = useCallback((menus: RuntimeMenuDescriptor[]) => {\n openMenus.current = menus;\n forceRefresh({});\n }, []);\n\n const menuOpenPendingTimeout = useRef<number | undefined>();\n const menuClosePendingTimeout = useRef<number | undefined>();\n const menuState = useRef<MenuState>({ [rootId]: \"no-popup\" });\n // const prevLevel = useRef(0);\n\n // const prevAim = useRef({mousePos: null, distance: true});\n\n const openMenu = useCallback(\n (hostMenuId = rootId, targetMenuId: string, itemId = null) => {\n if (hostMenuId === rootId && itemId === null) {\n setOpenMenus([{ id: rootId, left: posX, top: posY }]);\n } else {\n menuState.current[hostMenuId] = \"popup-open\";\n const el = document.getElementById(itemId) as HTMLElement;\n if (el !== null) {\n const { left, top } = getPosition(el, openMenus.current);\n setOpenMenus(\n openMenus.current.concat({ id: targetMenuId, left, top })\n );\n } else {\n throw Error(`openMenu no menuItem ${itemId}`);\n }\n }\n },\n [rootId, posX, posY, setOpenMenus]\n );\n\n const closeMenu = useCallback(\n (menuId?: string) => {\n if (menuId === rootId) {\n setOpenMenus([]);\n } else {\n const menus = openMenus.current.slice();\n const lastMenu = menus.pop() as RuntimeMenuDescriptor;\n menuState.current[lastMenu.id] = \"no-popup\";\n const parentMenu = menus.at(-1);\n if (parentMenu) {\n menuState.current[parentMenu.id] = \"no-popup\";\n }\n setOpenMenus(menus);\n }\n },\n [rootId, setOpenMenus]\n );\n\n const closeMenus = useCallback(\n (menuItemId) => {\n const menus = openMenus.current.slice();\n const menuItemMenuId = menuItemId.slice(9);\n let { id: lastMenuId } = menus.at(-1) as RuntimeMenuDescriptor;\n while (menus.length > 1 && !menuItemMenuId.startsWith(lastMenuId)) {\n const parentMenuId = getHostMenuId(lastMenuId, rootId);\n menus.pop();\n menuState.current[lastMenuId] = \"no-popup\";\n menuState.current[parentMenuId] = \"no-popup\";\n ({ id: lastMenuId } = menus[menus.length - 1]);\n }\n if (menus.length < openMenus.current.length) {\n setOpenMenus(menus);\n }\n },\n [rootId, setOpenMenus]\n );\n\n const clearAnyScheduledOpenTasks = useCallback(() => {\n if (menuOpenPendingTimeout.current) {\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n }\n }, []);\n\n const scheduleOpen = useCallback(\n (hostMenuId: string, targetMenuId: string, menuItemId: string) => {\n clearAnyScheduledOpenTasks();\n // do we need to set target state to pending-open ?s\n\n menuOpenPendingTimeout.current = window.setTimeout(() => {\n console.log(\n `scheduleOpen<timeout> opening menu ${targetMenuId} from menu ${hostMenuId} via menuitem ${menuItemId}`\n );\n closeMenus(menuItemId);\n menuState.current[hostMenuId] = \"popup-open\";\n menuState.current[targetMenuId] = \"no-popup\";\n openMenu(hostMenuId, targetMenuId, menuItemId);\n }, 400);\n },\n [clearAnyScheduledOpenTasks, closeMenus, openMenu]\n );\n\n const scheduleClose = useCallback(\n (hostMenuId: string, openMenuId: string, itemId: string) => {\n console.log(\n `scheduleClose openMenuId ${openMenuId} from parent menu ${hostMenuId} itemId ${itemId}`\n );\n menuState.current[openMenuId] = \"pending-close\";\n menuClosePendingTimeout.current = window.setTimeout(() => {\n closeMenus(itemId);\n }, 400);\n },\n [closeMenus]\n );\n\n const handleRender = useCallback(() => {\n const { current: menus } = openMenus;\n const [menu] = menus.slice(-1);\n const el = document.getElementById(menu.id);\n console.log(\n `handle render ${JSON.stringify(menu)} tabindex ${el?.tabIndex}`\n );\n if (el) {\n const { right, bottom } = el.getBoundingClientRect();\n const { clientHeight, clientWidth } = document.body;\n if (right > clientWidth) {\n const newMenus =\n menus.length > 1\n ? flipSides(rootId, menus)\n : nudgeLeft(menus, right - clientWidth);\n setOpenMenus(newMenus);\n } else if (bottom > clientHeight) {\n const newMenus = nudgeUp(menus, bottom - clientHeight);\n setOpenMenus(newMenus);\n }\n\n if (typeof el.tabIndex === \"number\") {\n console.log(`focus el ${el.id}`);\n el.focus();\n }\n } else {\n console.log(`no element found with if ${menu.id}`);\n }\n }, [rootId, setOpenMenus]);\n\n // TODO introduce a delay parameter that allows click to requeat an immediate render\n const triggerChildMenu = useCallback(\n (menuItemEl: HTMLElement) => {\n const { hostMenuId, targetMenuId, menuItemId, isGroup, isOpen } =\n getMenuItemDetails(menuItemEl, rootId);\n\n const {\n current: { [hostMenuId]: state },\n } = menuState;\n\n // console.log(\n // `%ctriggerChildMenu\n // menuItem ${menuItemId}\n // host menu: ${hostMenuId}\n // target menu: ${targetMenuId}\n // item index: ${menuItemId}\n // state ${state}\n // isGroup ${isGroup} isOpen ${isOpen}\n // openMenus: ${JSON.stringify(openMenus.current)}\n // full state='${JSON.stringify(menuState.current)}`,\n // \"color: green; font-weight: bold;\"\n // );\n\n console.log(`trigger child menu ${menuItemId}`);\n if (state === \"no-popup\" && isGroup) {\n menuState.current[hostMenuId] = \"popup-pending\";\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (state === \"popup-pending\" && !isGroup) {\n menuState.current[hostMenuId] = \"no-popup\";\n clearTimeout(menuOpenPendingTimeout.current);\n menuOpenPendingTimeout.current = undefined;\n } else if (state === \"popup-pending\" && isGroup) {\n clearTimeout(menuOpenPendingTimeout.current);\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (state === \"popup-open\") {\n if (menuIsOpen(targetMenuId)) {\n const menuStatus = getOpenMenuStatus(targetMenuId);\n console.log({ menuStatus });\n // Close any child menus of the target menu. This can happen if we have\n // opened child menus, then moused out of the menu entirely, to re-enter\n // at a higher level\n closeMenus(menuItemId);\n\n switch (menuStatus) {\n case \"pending-close\":\n // cancel the close\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[targetMenuId] = \"no-popup\";\n clearAnyScheduledOpenTasks();\n break;\n default:\n }\n } else {\n // TODO review the below, suspectb it's over complicating things\n const [parentOfLastOpenedMenu, lastOpenedMenu] =\n openMenus.current.slice(-2);\n if (\n parentOfLastOpenedMenu.id === hostMenuId &&\n menuState.current[lastOpenedMenu.id] !== \"pending-close\" /*&&\n sameLevel*/\n ) {\n scheduleClose(hostMenuId, lastOpenedMenu.id, menuItemId);\n if (isGroup && !isOpen) {\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n }\n } else if (\n parentOfLastOpenedMenu.id === hostMenuId &&\n isGroup &&\n menuItemId !== lastOpenedMenu.id &&\n menuState.current[lastOpenedMenu.id] === \"pending-close\"\n ) {\n // if there is already an item queued for opening cancel it\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (isGroup) {\n // closeMenus(menuId, itemId);\n scheduleOpen(hostMenuId, targetMenuId, menuItemId);\n } else if (\n !(\n (menuState.current[lastOpenedMenu.id] === \"pending-close\") /*&&\n sameLevel*/\n )\n ) {\n closeMenus(menuItemId);\n }\n }\n }\n\n if (state === \"pending-close\") {\n clearAnyScheduledOpenTasks();\n clearTimeout(menuClosePendingTimeout.current);\n menuClosePendingTimeout.current = undefined;\n menuState.current[hostMenuId] = \"popup-open\";\n }\n },\n [\n clearAnyScheduledOpenTasks,\n closeMenus,\n getOpenMenuStatus,\n menuIsOpen,\n rootId,\n scheduleClose,\n scheduleOpen,\n ]\n );\n\n const listItemProps: Partial<MenuItemProps> = useMemo(\n () => ({\n onMouseEnter: (evt: MouseEvent) => {\n const menuItemEl = closestListItem(evt.target as HTMLElement);\n triggerChildMenu(menuItemEl);\n onMouseEnterItem(evt, menuItemEl.id);\n },\n\n onClick: (evt: SyntheticEvent) => {\n const listItemEl = closestListItem(evt.target as HTMLElement);\n const { isGroup, menuItemId } = getMenuItemDetails(listItemEl, rootId);\n if (isGroup) {\n triggerChildMenu(listItemEl);\n } else {\n onActivate(menuItemId);\n }\n },\n }),\n [onActivate, onMouseEnterItem, rootId, triggerChildMenu]\n );\n\n return {\n closeMenu,\n handleRender,\n listItemProps,\n openMenu: triggerChildMenu,\n openMenus: openMenus.current,\n };\n};\n", "// const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n// listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n const idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if (listItemEl.ariaPosInSet) {\n return parseInt(listItemEl.ariaPosInSet, 10) - 1;\n }\n }\n}\n\nconst listItemId = (el: HTMLElement | null | undefined) => el?.id;\n\nexport const closestListItem = (el: HTMLElement | null | undefined) =>\n el?.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import type {\n ContextMenuContextType,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { createContext, ReactNode, useCallback, useMemo } from \"react\";\n\nexport const ContextMenuContext = createContext<ContextMenuContextType | null>(\n null\n);\n\nexport interface ContextMenuProviderProps {\n children: ReactNode;\n label?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder: MenuBuilder;\n}\n\ninterface ProviderProps extends ContextMenuProviderProps {\n context: ContextMenuContextType | null;\n}\n\nconst Provider = ({\n children,\n context,\n menuActionHandler,\n menuBuilder,\n}: ProviderProps) => {\n const menuBuilders = useMemo(() => {\n if (context?.menuBuilders && menuBuilder) {\n return context.menuBuilders.concat(menuBuilder);\n } else if (menuBuilder) {\n return [menuBuilder];\n } else {\n return context?.menuBuilders || [];\n }\n }, [context, menuBuilder]);\n\n const handleMenuAction = useCallback(\n (reason) => {\n if (menuActionHandler?.(reason)) {\n return true;\n }\n\n if (context?.menuActionHandler?.(reason)) {\n return true;\n }\n },\n [context, menuActionHandler]\n );\n\n return (\n <ContextMenuContext.Provider\n value={{\n menuActionHandler: handleMenuAction,\n menuBuilders,\n }}\n >\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Need an option for local menu to override higher-level menu, rather than extend\nexport const ContextMenuProvider = ({\n children,\n label,\n menuActionHandler,\n menuBuilder,\n}: ContextMenuProviderProps) => {\n return (\n <ContextMenuContext.Consumer>\n {(parentContext) => (\n <Provider\n context={parentContext}\n label={label}\n menuActionHandler={menuActionHandler}\n menuBuilder={menuBuilder}\n >\n {children}\n </Provider>\n )}\n </ContextMenuContext.Consumer>\n );\n};\n", "import { ContextMenuItemDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport { useThemeAttributes } from \"@vuu-ui/vuu-shell\";\nimport { isGroupMenuItemDescriptor } from \"@vuu-ui/vuu-utils\";\nimport cx from \"classnames\";\nimport { cloneElement, MouseEvent, useCallback, useContext } from \"react\";\nimport {\n MenuActionClosePopup,\n PopupCloseReason,\n PopupService,\n reasonIsMenuAction,\n} from \"../popup\";\nimport { MenuActionHandler, MenuBuilder } from \"@vuu-ui/vuu-data-types\";\nimport { ContextMenu, ContextMenuProps } from \"./ContextMenu\";\nimport { MenuItem, MenuItemGroup } from \"./MenuList\";\nimport { ContextMenuContext } from \"./context-menu-provider\";\n\nexport type ContextMenuOptions = {\n [key: string]: unknown;\n contextMenu?: JSX.Element;\n ContextMenuProps?: Partial<ContextMenuProps> & {\n className?: string;\n \"data-mode\"?: string;\n };\n};\n\nexport type ShowContextMenu = (\n e: MouseEvent<HTMLElement>,\n location: string,\n options: ContextMenuOptions\n) => void;\n\n// The argument allows a top-level menuBuilder to operate outside the Context\nexport const useContextMenu = (\n menuBuilder?: MenuBuilder,\n menuActionHandler?: MenuActionHandler\n): [ShowContextMenu, () => void] => {\n const ctx = useContext(ContextMenuContext);\n const [themeClass, densityClass, dataMode] = useThemeAttributes();\n\n const buildMenuOptions = useCallback(\n (menuBuilders: MenuBuilder[], location, options) => {\n let results: ContextMenuItemDescriptor[] = [];\n for (const menuBuilder of menuBuilders) {\n // Maybe we should leave the concatenation to the menuBuilder, then it can control menuItem order\n results = results.concat(menuBuilder(location, options));\n }\n return results;\n },\n []\n );\n\n const handleShowContextMenu = useCallback(\n (\n e: MouseEvent<HTMLElement>,\n location: string,\n { ContextMenuProps, contextMenu, ...options }: ContextMenuOptions\n ) => {\n e.stopPropagation();\n e.preventDefault();\n\n if (contextMenu) {\n return showContextMenuComponent(e, contextMenu);\n }\n\n const menuBuilders: MenuBuilder[] = [];\n if (menuBuilder) {\n menuBuilders.push(menuBuilder);\n }\n if (\n ctx &&\n Array.isArray(ctx?.menuBuilders) &&\n ctx.menuBuilders.length > 0\n ) {\n menuBuilders.push(...ctx.menuBuilders);\n }\n\n if (menuBuilders.length > 0) {\n const menuItemDescriptors = buildMenuOptions(\n menuBuilders,\n location,\n options\n );\n\n // const menuHandler = menuActionHandler ?? ctx?.menuActionHandler;\n const menuHandler: MenuActionHandler = (\n action: MenuActionClosePopup\n ) => {\n if (menuActionHandler?.(action) === true) {\n return true;\n } else {\n return ctx?.menuActionHandler(action);\n }\n };\n\n if (menuItemDescriptors.length && menuHandler) {\n console.log(`showContextMenu ${location}`, {\n options,\n });\n showContextMenu(e, menuItemDescriptors, menuHandler, {\n ...ContextMenuProps,\n className: cx(\n ContextMenuProps?.className,\n themeClass,\n densityClass\n ),\n \"data-mode\": dataMode,\n });\n }\n } else {\n console.warn(\n \"useContextMenu, no menuBuilders configured. These should be supplied via the ContextMenuProvider(s)\"\n );\n }\n },\n [\n buildMenuOptions,\n ctx,\n dataMode,\n densityClass,\n menuActionHandler,\n menuBuilder,\n themeClass,\n ]\n );\n\n const hideContextMenu = useCallback(() => {\n console.log(\"hide comnytext menu\");\n }, []);\n\n return [handleShowContextMenu, hideContextMenu];\n};\n\nconst NO_OPTIONS = {};\n\nconst showContextMenuComponent = (\n e: MouseEvent<HTMLElement>,\n contextMenu: JSX.Element\n) => {\n const position = {\n x: e.clientX,\n y: e.clientY,\n };\n\n PopupService.showPopup({\n focus: true,\n left: 0,\n top: 0,\n component: cloneElement(contextMenu, { position }),\n });\n};\n\nconst showContextMenu = (\n e: MouseEvent<HTMLElement>,\n menuDescriptors: ContextMenuItemDescriptor[],\n handleContextMenuAction: MenuActionHandler,\n {\n position: positionProp,\n ...contextMenuProps\n }: ContextMenuOptions[\"ContextMenuProps\"] = NO_OPTIONS\n) => {\n const menuItems = (menuDescriptors: ContextMenuItemDescriptor[]) => {\n const fromDescriptor = (menuItem: ContextMenuItemDescriptor, i: number) =>\n isGroupMenuItemDescriptor(menuItem) ? (\n <MenuItemGroup key={i} label={menuItem.label}>\n {menuItem.children.map(fromDescriptor)}\n </MenuItemGroup>\n ) : (\n <MenuItem\n key={i}\n action={menuItem.action}\n data-icon={menuItem.icon}\n options={menuItem.options}\n >\n {menuItem.label}\n </MenuItem>\n );\n\n return menuDescriptors.map(fromDescriptor);\n };\n\n const handleClose = (reason?: PopupCloseReason) => {\n if (reasonIsMenuAction(reason)) {\n handleContextMenuAction(reason);\n // TODO this results in onClose being called twice on component\n // cant simply be removed, some refactoring work needed\n PopupService.hidePopup();\n }\n contextMenuProps?.onClose?.(reason);\n };\n\n const position = positionProp ?? {\n x: e.clientX,\n y: e.clientY,\n };\n\n const component = (\n <ContextMenu\n {...contextMenuProps}\n onClose={handleClose}\n position={position}\n >\n {menuItems(menuDescriptors)}\n </ContextMenu>\n );\n PopupService.showPopup({ left: 0, top: 0, component, focus: true });\n};\n", "import cx from \"classnames\";\nimport React, {\n createElement,\n CSSProperties,\n HTMLAttributes,\n ReactElement,\n useEffect,\n useRef,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ContextMenuOptions } from \"../menu\";\nimport { renderPortal } from \"../portal\";\n\nimport \"./popup-service.css\";\n\nlet _dialogOpen = false;\nconst _popups: string[] = [];\n\nexport type PopupCloseCallback = (reason?: PopupCloseReason) => void;\n\nexport type ClickAwayClosePopup = {\n type: \"click-away\";\n mouseEvt: MouseEvent;\n};\n\nexport type MenuActionClosePopup = {\n menuId: string;\n options: ContextMenuOptions;\n type: \"menu-action\";\n};\n\nexport type PopupCloseReason = ClickAwayClosePopup | MenuActionClosePopup;\n\nexport const reasonIsMenuAction = (\n reason?: PopupCloseReason\n): reason is MenuActionClosePopup => reason?.type === \"menu-action\";\n\nexport const reasonIsClickAway = (\n reason?: PopupCloseReason\n): reason is ClickAwayClosePopup => reason?.type === \"click-away\";\n\nfunction specialKeyHandler(e: KeyboardEvent) {\n if (e.key === \"Esc\") {\n if (_popups.length) {\n closeAllPopups();\n } else if (_dialogOpen) {\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n }\n}\n\nfunction outsideClickHandler(e: MouseEvent) {\n if (_popups.length) {\n console.log(`Popup.outsideClickHandler ... `);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n if (popupContainers[i].contains(e.target as HTMLElement)) {\n console.log(` ... its ok, he's one of us`);\n return;\n }\n }\n console.log(\" ... close all\");\n closeAllPopups({ mouseEvt: e, type: \"click-away\" });\n }\n}\n\nfunction closeAllPopups(reason?: PopupCloseReason) {\n if (_popups.length === 1) {\n PopupService.hidePopup(reason, \"anon\", \"all\");\n } else if (_popups.length) {\n // onsole.log(`closeAllPopups`);\n const popupContainers = document.body.querySelectorAll(\".vuuPopup\");\n for (let i = 0; i < popupContainers.length; i++) {\n ReactDOM.unmountComponentAtNode(popupContainers[i]);\n }\n popupClosed(\"*\");\n }\n}\n\nfunction dialogOpened() {\n if (_dialogOpen === false) {\n _dialogOpen = true;\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction dialogClosed() {\n if (_dialogOpen) {\n _dialogOpen = false;\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n }\n}\n\nfunction popupOpened(name: string) {\n if (_popups.indexOf(name) === -1) {\n _popups.push(name);\n //onsole.log('PopupService, popup opened ' + name + ' popups : ' + _popups);\n if (_dialogOpen === false) {\n window.addEventListener(\"keydown\", specialKeyHandler, true);\n window.addEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nfunction popupClosed(name: string /*, group=null*/) {\n if (_popups.length) {\n if (name === \"*\") {\n _popups.length = 0;\n } else {\n const pos = _popups.indexOf(name);\n if (pos !== -1) {\n _popups.splice(pos, 1);\n }\n }\n //onsole.log('PopupService, popup closed ' + name + ' popups : ' + _popups);\n if (_popups.length === 0 && _dialogOpen === false) {\n window.removeEventListener(\"keydown\", specialKeyHandler, true);\n window.removeEventListener(\"click\", outsideClickHandler, true);\n }\n }\n}\n\nconst PopupComponent = ({\n children,\n position,\n style,\n}: HTMLAttributes<HTMLDivElement> & {\n position?: \"above\" | \"below\" | \"\";\n style?: CSSProperties;\n}) => {\n const className = cx(\"hwPopup\", \"hwPopupContainer\", position);\n return createElement(\"div\", { className, style }, children);\n};\n\nlet incrementingKey = 1;\n\nexport interface ShowPopupProps {\n depth?: number;\n /**\n * if true, focus will be invoked on first focusable element\n */\n focus?: boolean;\n name?: string;\n group?: string;\n position?: \"above\" | \"below\" | \"\";\n left?: number;\n right?: \"auto\" | number;\n top?: number;\n component: ReactElement;\n width?: number | \"auto\";\n}\n\nexport class PopupService {\n static onClose: PopupCloseCallback | undefined;\n static showPopup({\n group = \"all\",\n name = \"anon\",\n left = 0,\n position = \"\",\n right = \"auto\",\n top = 0,\n width = \"auto\",\n component,\n }: ShowPopupProps) {\n if (!component) {\n throw Error(`PopupService showPopup, no component supplied`);\n }\n\n if (typeof component.props.onClose === \"function\") {\n PopupService.onClose = component.props.onClose;\n } else {\n PopupService.onClose = undefined;\n }\n\n popupOpened(name);\n\n document.addEventListener(\"keydown\", PopupService.escapeKeyListener, true);\n\n let el = document.body.querySelector(\".vuuPopup.\" + group) as HTMLElement;\n if (el === null) {\n el = document.createElement(\"div\") as HTMLElement;\n el.className = \"vuuPopup \" + group;\n document.body.appendChild(el);\n }\n\n const style = { width };\n\n renderPortal(\n createElement(\n PopupComponent,\n { key: incrementingKey++, position, style },\n component\n ),\n el,\n left,\n top,\n () => {\n PopupService.keepWithinThePage(el, right);\n }\n );\n }\n\n static escapeKeyListener(evt: KeyboardEvent) {\n if (evt.key === \"Escape\") {\n console.log(`%cESC listener`, \"color:green;font-weight:bold;\");\n PopupService.hidePopup();\n }\n }\n\n static hidePopup(reason?: PopupCloseReason, name = \"anon\", group = \"all\") {\n console.log(`PopupService.hidePopup`, {\n reason,\n });\n if (_popups.indexOf(name) !== -1) {\n popupClosed(name);\n const popupRoot = document.body.querySelector(`.vuuPopup.${group}`);\n if (popupRoot) {\n ReactDOM.unmountComponentAtNode(popupRoot);\n }\n }\n document.removeEventListener(\n \"keydown\",\n PopupService.escapeKeyListener,\n true\n );\n\n console.log(\n `PopupService will call onClose if found ${typeof PopupService?.onClose}`\n );\n PopupService?.onClose?.(reason);\n }\n\n static keepWithinThePage(el: HTMLElement, right: number | \"auto\" = \"auto\") {\n const target = el.querySelector(\".vuuPopupContainer > *\") as HTMLElement;\n if (target) {\n const {\n top,\n left,\n width,\n height,\n right: currentRight,\n } = target.getBoundingClientRect();\n\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const overflowH = h - (top + height);\n if (overflowH < 0) {\n target.style.top = Math.round(top) + overflowH + \"px\";\n }\n\n const overflowW = w - (left + width);\n if (overflowW < 0) {\n target.style.left = Math.round(left) + overflowW + \"px\";\n }\n\n if (typeof right === \"number\" && right !== currentRight) {\n const adjustment = right - currentRight;\n target.style.left = left + adjustment + \"px\";\n }\n }\n }\n}\n\nexport class DialogService {\n static showDialog(dialog: ReactElement) {\n const containerEl = \".vuuDialog\";\n const onClose = dialog.props.onClose;\n\n dialogOpened();\n\n ReactDOM.render(\n React.cloneElement(dialog, {\n container: containerEl,\n onClose: () => {\n DialogService.closeDialog();\n if (onClose) {\n onClose();\n }\n },\n }),\n document.body.querySelector(containerEl)\n );\n }\n\n static closeDialog() {\n dialogClosed();\n const dialogRoot = document.body.querySelector(\".vuuDialog\");\n if (dialogRoot) {\n ReactDOM.unmountComponentAtNode(dialogRoot);\n }\n }\n}\n\nexport interface PopupProps {\n children: ReactElement;\n close?: boolean;\n depth: number;\n group?: string;\n name: string;\n position?: \"above\" | \"below\" | \"\";\n width: number;\n}\n\nexport const Popup = (props: PopupProps) => {\n const pendingTask = useRef<number | undefined>();\n const ref = useRef<HTMLElement>(null);\n\n const show = (props: PopupProps, boundingClientRect: DOMRect) => {\n const { name, group, depth, width } = props;\n let left: number | undefined;\n let top: number | undefined;\n\n if (pendingTask.current) {\n window.clearTimeout(pendingTask.current);\n pendingTask.current = undefined;\n }\n\n if (props.close === true) {\n PopupService.hidePopup(undefined, name, group);\n } else {\n const { position, children: component } = props;\n const {\n left: targetLeft,\n top: targetTop,\n width: clientWidth,\n bottom: targetBottom,\n } = boundingClientRect;\n\n if (position === \"below\") {\n left = targetLeft;\n top = targetBottom;\n } else if (position === \"above\") {\n left = targetLeft;\n top = targetTop;\n }\n\n pendingTask.current = window.setTimeout(() => {\n PopupService.showPopup({\n name,\n group,\n depth,\n position,\n left,\n top,\n width: width || clientWidth,\n component,\n });\n }, 10);\n }\n };\n\n useEffect(() => {\n if (ref.current) {\n const el = ref.current.parentElement;\n const boundingClientRect = el?.getBoundingClientRect();\n if (boundingClientRect) {\n show(props, boundingClientRect);\n }\n }\n\n return () => {\n PopupService.hidePopup(undefined, props.name, props.group);\n };\n }, [props]);\n\n return React.createElement(\"div\", { className: \"popup-proxy\", ref });\n};\n", "import {\n HTMLAttributes,\n MouseEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n PopupCloseReason,\n reasonIsClickAway,\n useContextMenu,\n} from \"@vuu-ui/vuu-popups\";\nimport cx from \"classnames\";\nimport { Button } from \"@salt-ds/core\";\nimport { useId } from \"@vuu-ui/vuu-layout\";\n\nimport \"./PopupMenu.css\";\nimport { MenuActionHandler, MenuBuilder } from \"@vuu-ui/vuu-data-types\";\n\nconst classBase = \"vuuPopupMenu\";\n\nexport interface PopupMenuProps extends HTMLAttributes<HTMLButtonElement> {\n icon?: string;\n menuActionHandler?: MenuActionHandler;\n menuBuilder?: MenuBuilder;\n menuLocation?: string;\n menuOptions?: { [key: string]: unknown };\n onMenuClose?: () => void;\n}\n\nconst getPosition = (element: HTMLElement | null) => {\n if (element) {\n const { bottom, left } = element.getBoundingClientRect();\n return { x: left, y: bottom + 6 };\n }\n};\n\nexport const PopupMenu = ({\n className,\n icon = \"more-vert\",\n id: idProp,\n menuActionHandler,\n menuBuilder,\n menuLocation = \"header\",\n menuOptions,\n onMenuClose,\n tabIndex = 0,\n ...htmlAttributes\n}: PopupMenuProps) => {\n const rootRef = useRef<HTMLButtonElement>(null);\n const suppressShowMenuRef = useRef(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const id = useId(idProp);\n const [showContextMenu] = useContextMenu(menuBuilder, menuActionHandler);\n\n const handleMenuClose = useCallback(\n (reason?: PopupCloseReason) => {\n console.log(`PopupMenu popup closed`, {\n reason,\n });\n setMenuOpen(false);\n // If user has clicked the MenuButton whilst menu is open, we want to close it.\n // The PopupService will close it for us as a 'click-away' event. We don't want\n // that click on the button to re-open it.\n if (reasonIsClickAway(reason)) {\n const target = reason.mouseEvt.target as HTMLElement;\n if (target === rootRef.current) {\n suppressShowMenuRef.current = true;\n }\n } else {\n requestAnimationFrame(() => {\n onMenuClose?.();\n if (tabIndex !== -1) {\n rootRef.current?.focus();\n }\n });\n }\n },\n [onMenuClose, tabIndex]\n );\n\n const showMenu = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n if (suppressShowMenuRef.current) {\n suppressShowMenuRef.current = false;\n } else {\n setMenuOpen(true);\n showContextMenu(e, menuLocation, {\n ContextMenuProps: {\n id: `${id}-menu`,\n onClose: handleMenuClose,\n position: getPosition(rootRef.current),\n },\n ...menuOptions,\n });\n }\n },\n [handleMenuClose, id, menuLocation, menuOptions, showContextMenu]\n );\n\n return (\n <Button\n {...htmlAttributes}\n aria-controls={`${id}-menu-root`}\n aria-expanded={menuOpen}\n aria-haspopup=\"menu\"\n className={cx(classBase, className, {\n [`${classBase}-open`]: menuOpen,\n })}\n data-icon={icon}\n id={id}\n onClick={showMenu}\n ref={rootRef}\n tabIndex={tabIndex}\n variant=\"secondary\"\n />\n );\n};\n", "import { useCallback, useRef, useState } from \"react\";\n\nimport {\n InternalDragDropProps,\n InternalDragHookResult,\n Direction,\n ViewportRange,\n} from \"./dragDropTypesNext\";\nimport { useDropIndicator } from \"./useDropIndicator\";\n\nimport {\n dimensions,\n getItemById,\n MeasuredDropTarget,\n measureDropTargets,\n getNextDropTarget,\n dropZone,\n removeDraggedItem,\n} from \"./drop-target-utils\";\n\nimport { createDropIndicator, Draggable } from \"./Draggable\";\n\nconst NOT_OVERFLOWED = ':not([data-overflowed=\"true\"])';\nconst NOT_HIDDEN = ':not([aria-hidden=\"true\"])';\n\nexport const useDragDropIndicator = ({\n draggableRef,\n onDrop,\n orientation = \"horizontal\",\n containerRef,\n itemQuery = \"*\",\n selected,\n viewportRange,\n}: InternalDragDropProps): InternalDragHookResult => {\n const dragDirectionRef = useRef<Direction | undefined>();\n const dropIndicatorRef = useRef<HTMLDivElement>(null);\n const dropTargetRef = useRef<MeasuredDropTarget | null>(null);\n const dropZoneRef = useRef<dropZone | \"\">(\"\");\n const isScrollable = useRef(false);\n /** current position of dragged element */\n const dragPosRef = useRef<number>(-1);\n const measuredDropTargets = useRef<MeasuredDropTarget[]>([]);\n const overflowMenuShowingRef = useRef(false);\n\n const [showOverflow, setShowOverflow] = useState(false);\n const [dropIndicator, setDropIndicator] = useState<JSX.Element | undefined>();\n\n const { clearSpacer, positionDropIndicator } = useDropIndicator();\n\n const draggedItemRef = useRef<MeasuredDropTarget>();\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED}${NOT_HIDDEN},[data-overflow-indicator])`;\n\n // const { setMeasurements: setVizData } = useListViz();\n\n const indexOf = (dropTarget: MeasuredDropTarget) =>\n measuredDropTargets.current.findIndex((d) => d.id === dropTarget.id);\n\n const reposition = (\n dropTarget: MeasuredDropTarget,\n distance: number,\n indexShift?: number\n ) => {\n dropTarget.start += distance;\n dropTarget.mid += distance;\n dropTarget.end += distance;\n if (typeof indexShift === \"number\") {\n dropTarget.currentIndex += indexShift;\n }\n };\n\n // Shouldn't need this - but viewportRange is always stale in stopScrolling. Checked all dependencies\n // look ok. Something to do with setTimeout / scrollHandler ?\n const rangeRef = useRef<ViewportRange>();\n rangeRef.current = viewportRange;\n\n const handleScrollStart = useCallback(() => {\n clearSpacer();\n }, [clearSpacer]);\n\n const handleScrollStop = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", _scrollPos: number, atEnd: boolean) => {\n const { current: container } = containerRef;\n const { current: draggedItem } = draggedItemRef;\n if (container && draggedItem) {\n measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n rangeRef.current\n );\n // setVizData(measuredDropTargets.current);\n\n const { size } = draggedItem;\n const dragPos = dragPosRef.current;\n const midPos = dragPos + size / 2;\n const { current: dropTargets } = measuredDropTargets;\n const nextDropTarget = getNextDropTarget(dropTargets, midPos, \"fwd\");\n if (nextDropTarget) {\n if (atEnd && scrollDirection === \"fwd\") {\n positionDropIndicator(dropTargets[dropTargets.length - 1], \"start\");\n } else {\n positionDropIndicator(nextDropTarget, \"start\");\n }\n }\n\n // setVizData(measuredDropTargets.current, nextDropTarget);\n }\n },\n [\n containerRef,\n positionDropIndicator,\n fullItemQuery,\n orientation,\n // setVizData,\n ]\n );\n\n const beginDrag = useCallback(\n (evt: MouseEvent) => {\n const evtTarget = evt.target as HTMLElement;\n const dragElement = evtTarget.closest(itemQuery) as HTMLElement;\n if (\n dragElement.ariaSelected &&\n Array.isArray(selected) &&\n selected.length > 1\n ) {\n console.log(\"its a selected element, and we have a multi select\");\n }\n const { current: container } = containerRef;\n if (container && dragElement) {\n const { SCROLL_SIZE, CLIENT_SIZE } = dimensions(orientation);\n const { id: draggedItemId } = dragElement;\n\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n container;\n isScrollable.current = scrollSize > clientSize;\n\n const dropTargets = (measuredDropTargets.current = measureDropTargets(\n container,\n orientation,\n fullItemQuery,\n viewportRange\n ));\n\n const draggedItem = getItemById(dropTargets, draggedItemId);\n\n if (draggedItem && container) {\n const targetIndex = indexOf(draggedItem);\n removeDraggedItem(dropTargets, targetIndex);\n draggedItemRef.current = draggedItem;\n\n // This begins to deviate from NaturalMovement here -----------\n const { current: range } = rangeRef;\n //TODO when our viewport is the last 'page' of a scrolling viewport\n // the viewport will scoll up by one row when we remove an item, so\n // the position of each item will move down.\n if (range?.atEnd) {\n for (let i = 0; i < dropTargets.length; i++) {\n reposition(dropTargets[i], draggedItem.size);\n }\n }\n for (let i = targetIndex; i < dropTargets.length; i++) {\n reposition(dropTargets[i], -draggedItem.size, -1);\n }\n\n const [dropTarget, dropZone] = draggedItem.isLast\n ? [dropTargets[dropTargets.length - 1], \"end\"]\n : [dropTargets[targetIndex], \"start\"];\n\n dropTargetRef.current = dropTarget;\n dropZoneRef.current = dropZone as dropZone;\n\n // setVizData(dropTargets, dropTarget, dropZone);\n\n const dropIndicatorPosition = positionDropIndicator(\n dropTarget,\n dropZone as dropZone\n );\n\n const { top, left, width } =\n dropIndicatorPosition.getBoundingClientRect();\n // Next render will remove the dragged item, that will offset our initial\n // dropIndicatorPosition\n const dropIndicatorRect = {\n top: draggedItem.isLast\n ? range?.atEnd && !range.atStart\n ? top + draggedItem.size - 2\n : top - 2\n : top - draggedItem.size - 2,\n left,\n width,\n height: 2,\n };\n\n setDropIndicator(\n <Draggable\n wrapperClassName=\"dropIndicatorContainer\"\n style={dropIndicatorRect}\n ref={dropIndicatorRef}\n element={createDropIndicator()}\n />\n );\n }\n }\n },\n [\n itemQuery,\n selected,\n containerRef,\n orientation,\n fullItemQuery,\n viewportRange,\n // setVizData,\n positionDropIndicator,\n ]\n );\n\n const drag = useCallback(\n (dragPos: number, mouseMoveDirection: \"fwd\" | \"bwd\") => {\n const { current: currentDropTarget } = dropTargetRef;\n const { current: draggedItem } = draggedItemRef;\n\n if (draggedItem) {\n if (draggableRef.current && containerRef.current) {\n const START = orientation === \"horizontal\" ? \"left\" : \"top\";\n dragPosRef.current = dragPos;\n\n const { current: dropTargets } = measuredDropTargets;\n const nextDropTarget = getNextDropTarget(\n dropTargets,\n dragPos,\n mouseMoveDirection\n );\n\n if (\n nextDropTarget &&\n nextDropTarget.index !== currentDropTarget?.index\n // mouseMoveDirection !== dragDirectionRef.current\n ) {\n if (nextDropTarget.isOverflowIndicator) {\n // Does this belong in here or can we abstract it out\n setShowOverflow((overflowMenuShowingRef.current = true));\n } else if (dropIndicatorRef.current) {\n const targetIndex = indexOf(nextDropTarget);\n if (targetIndex === dropTargets.length - 1) {\n // because we maintain at least one out-of-viewport row in\n // the dropTargets, this means we are at the very last item.\n const dropTarget = dropTargets[dropTargets.length - 1];\n const dropIndicatorPosition = positionDropIndicator(\n dropTarget,\n \"start\"\n );\n const dropIndicatorRect =\n dropIndicatorPosition.getBoundingClientRect();\n dropIndicatorRef.current.style[\n START\n ] = `${dropIndicatorRect.top}px`;\n } else {\n const dropIndicatorPosition = positionDropIndicator(\n nextDropTarget,\n \"start\"\n ) as unknown as HTMLElement;\n const dropIndicatorRect =\n dropIndicatorPosition.getBoundingClientRect();\n dropIndicatorRef.current.style[\n START\n ] = `${dropIndicatorRect.top}px`;\n }\n // setVizData(dropTargets, nextDropTarget, nextDropZone);\n\n setShowOverflow((overflowMenuShowingRef.current = false));\n }\n\n dropTargetRef.current = nextDropTarget;\n dragDirectionRef.current = mouseMoveDirection;\n }\n }\n }\n },\n [draggableRef, containerRef, orientation, positionDropIndicator]\n );\n\n const drop = useCallback(() => {\n clearSpacer();\n const { current: draggedItem } = draggedItemRef;\n const { current: dropTarget } = dropTargetRef;\n const { current: dropZone } = dropZoneRef;\n const { current: range } = rangeRef;\n\n if (draggedItem && range && dropTarget) {\n const { index: fromIndex } = draggedItem;\n\n const dropBefore = dropZone === \"start\";\n const {\n index: originalDropTargetIndex,\n currentIndex: currentDropTargetIndex,\n } = dropTarget;\n\n dropTargetRef.current = null;\n dragDirectionRef.current = undefined;\n\n //TODO why is this different from Natural Movement ?\n if (overflowMenuShowingRef.current) {\n onDrop(fromIndex, -1);\n } else {\n if (fromIndex < originalDropTargetIndex) {\n onDrop(\n fromIndex,\n dropBefore ? currentDropTargetIndex : currentDropTargetIndex + 1\n );\n } else {\n onDrop(\n fromIndex,\n dropBefore ? originalDropTargetIndex : originalDropTargetIndex + 1\n );\n }\n }\n setDropIndicator(undefined);\n }\n setShowOverflow(false);\n }, [clearSpacer, onDrop]);\n\n return {\n beginDrag,\n drag,\n drop,\n dropIndicator,\n handleScrollStart,\n handleScrollStop,\n revealOverflowedItems: showOverflow,\n };\n};\n", "import { useCallback, useMemo } from \"react\";\nimport { dropZone, MeasuredDropTarget } from \"./drop-target-utils\";\nimport { createDropIndicatorPosition } from \"./Draggable\";\n\nexport const SPACER_SIZE = 0;\n\nexport type DropIndicatorHookResult = {\n positionDropIndicator: (\n dropTarget: MeasuredDropTarget,\n dropZone: dropZone\n ) => HTMLElement;\n clearSpacer: () => void;\n};\n\nexport type DropIndicatorHook = () => DropIndicatorHookResult;\n\nexport const useDropIndicator: DropIndicatorHook = () => {\n const spacer = useMemo(() => createDropIndicatorPosition(), []);\n const clearSpacer = useCallback(() => spacer.remove(), [spacer]);\n const positionDropIndicator = useCallback(\n (dropTarget: MeasuredDropTarget, dropZone: \"start\" | \"end\" = \"end\") => {\n if (dropZone === \"end\") {\n dropTarget.element.after(spacer);\n } else {\n dropTarget.element.before(spacer);\n }\n return spacer;\n },\n [spacer]\n );\n\n return {\n positionDropIndicator,\n clearSpacer,\n };\n};\n", "import {\n DragDropHook,\n InternalDragDropProps,\n InternalDragHookResult,\n MouseOffset,\n} from \"./dragDropTypesNext\";\nimport { useDragDropNaturalMovement } from \"./useDragDropNaturalMovementNext\";\nimport { useDragDropIndicator } from \"./useDragDropIndicator\";\nimport { useDragDropProvider } from \"./DragDropProvider\";\nimport {\n MouseEventHandler,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n cloneElement,\n constrainRect,\n dimensions,\n NOT_OVERFLOWED,\n} from \"./drop-target-utils\";\nimport { useAutoScroll, ScrollStopHandler } from \"./useAutoScroll\";\nimport { Draggable } from \"./Draggable\";\n\nconst NULL_DRAG_DROP_RESULT = {\n beginDrag: () => undefined,\n drag: () => undefined,\n draggableRef: { current: null },\n drop: () => undefined,\n isDragging: false,\n isScrolling: false,\n handleScrollStart: () => undefined,\n handleScrollStop: () => undefined,\n revealOverflowedItems: false,\n};\n\ntype DraggableStatus = {\n draggable?: JSX.Element;\n draggedItemIndex: number;\n isDragging: boolean;\n};\n\ntype DragBoundary = {\n start: number;\n end: number;\n contraStart: number;\n contraEnd: number;\n};\n\nconst UNBOUNDED: DragBoundary = {\n start: 0,\n end: 1000,\n contraStart: 0,\n contraEnd: 1000,\n};\n\ntype InternalHook = (props: InternalDragDropProps) => InternalDragHookResult;\nconst noDragDrop: InternalHook = () => NULL_DRAG_DROP_RESULT;\nconst dragThreshold = 3;\n\nconst getDraggableElement = (\n el: EventTarget | null,\n query: string\n): HTMLElement => (el as HTMLElement).closest(query) as HTMLElement;\n\nconst isOverflowElement = (element: HTMLElement) =>\n element.dataset.index === \"overflow\" &&\n element.parentElement !== null &&\n element.parentElement.classList.contains(\"overflowed\");\n\nconst getLastElement = (\n container: HTMLElement,\n itemQuery: string\n): [HTMLElement, boolean] => {\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED},.vuuOverflowContainer-OverflowIndicator)`;\n const childElements = Array.from(container.querySelectorAll(fullItemQuery));\n const lastElement = childElements.pop() as HTMLElement;\n return [lastElement, isOverflowElement(lastElement)];\n};\n\nexport const useDragDropNext: DragDropHook = ({\n allowDragDrop,\n containerRef,\n draggableClassName,\n itemQuery = \"*\",\n onDragStart,\n onDrop,\n onDropSettle,\n orientation,\n ...dragDropProps\n}) => {\n const dragBoundaries = useRef<DragBoundary>({\n start: 0,\n end: 0,\n contraStart: 0,\n contraEnd: 0,\n });\n const [draggableStatus, setDraggableStatus] = useState<DraggableStatus>({\n draggable: undefined,\n draggedItemIndex: -1,\n isDragging: false,\n });\n // A ref to the draggable element\n const draggableRef = useRef<HTMLDivElement>(null);\n const dragElementRef = useRef<HTMLElement>();\n const mouseDownTimer = useRef<number | null>(null);\n /** do we actually have scrollable content */\n const isScrollableRef = useRef(false);\n /** Distance between start (top | left) of dragged element and point where user pressed to drag */\n const mouseOffsetRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** current mouse position */\n const mousePosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** mouse position when mousedown initiated drag */\n const startPosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** references the dragged Item during its final 'settling' phase post drop */\n const settlingItemRef = useRef<HTMLDivElement | null>(null);\n\n const dropPosRef = useRef(-1);\n const dropIndexRef = useRef(-1);\n\n const handleScrollStopRef = useRef<ScrollStopHandler>();\n\n const { isDragSource, isDropTarget, register } = useDragDropProvider(\n dragDropProps.id\n );\n\n if (dragDropProps.id && (isDragSource || isDropTarget)) {\n register(dragDropProps.id);\n }\n\n const terminateDrag = useCallback(() => {\n const { current: toIndex } = dropIndexRef;\n const droppedItem = containerRef.current?.querySelector(\n `${itemQuery}[data-index=\"${toIndex}\"]`\n );\n if (droppedItem) {\n droppedItem.classList.remove(\"vuuDropTarget-settling\");\n }\n\n dropIndexRef.current = -1;\n onDropSettle?.(toIndex);\n setDraggableStatus((status) => ({\n ...status,\n draggable: undefined,\n }));\n }, [containerRef, itemQuery, onDropSettle]);\n\n const getScrollDirection = useCallback(\n (mousePos: number) => {\n if (containerRef.current) {\n const { POS, SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize,\n } = containerRef.current;\n\n const maxScroll = scrollSize - clientSize;\n const canScrollFwd = scrollPos < maxScroll;\n const viewportEnd = dragBoundaries.current.end;\n const bwd =\n scrollPos > 0 &&\n mousePos - mouseOffsetRef.current[POS] <=\n dragBoundaries.current.start;\n const fwd =\n canScrollFwd && mousePos - mouseOffsetRef.current[POS] >= viewportEnd;\n return bwd ? \"bwd\" : fwd ? \"fwd\" : \"\";\n }\n },\n [containerRef, orientation]\n );\n\n const useDragDropHook: InternalHook =\n allowDragDrop === true || allowDragDrop === \"natural-movement\"\n ? useDragDropNaturalMovement\n : allowDragDrop === \"drop-indicator\"\n ? useDragDropIndicator\n : noDragDrop;\n\n const onScrollingStopped = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", scrollPos: number, atEnd: boolean) => {\n handleScrollStopRef.current?.(scrollDirection, scrollPos, atEnd);\n },\n []\n );\n\n const { isScrolling, startScrolling, stopScrolling } = useAutoScroll({\n containerRef,\n onScrollingStopped,\n orientation,\n });\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n //TODO why do we need both this and dropIndexRef ?\n dropPosRef.current = toIndex;\n onDrop?.(fromIndex, toIndex);\n dropIndexRef.current = toIndex;\n },\n [onDrop]\n );\n\n const {\n beginDrag,\n drag,\n drop,\n handleScrollStart,\n handleScrollStop,\n ...dragResult\n } = useDragDropHook({\n ...dragDropProps,\n containerRef,\n draggableRef,\n isDragSource,\n isDropTarget,\n itemQuery,\n onDrop: handleDrop,\n orientation,\n });\n // To avoid circular ref between hooks\n handleScrollStopRef.current = handleScrollStop;\n\n const dragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { CLIENT_POS, CONTRA_CLIENT_POS, CONTRA_POS, POS } =\n dimensions(orientation);\n const { clientX, clientY } = evt;\n const { [CLIENT_POS]: clientPos, [CONTRA_CLIENT_POS]: clientContraPos } =\n evt;\n const lastClientPos = mousePosRef.current[POS];\n const lastClientContraPos = mousePosRef.current[CONTRA_POS];\n\n const dragDistance = Math.abs(lastClientPos - clientPos);\n const dragOutDistance = isDragSource\n ? Math.abs(lastClientContraPos - clientContraPos)\n : 0;\n\n if (dragOutDistance - dragDistance > 5) {\n // remove the drag boundaries\n dragBoundaries.current = UNBOUNDED;\n // Need to notify the dragDropHook, so it can clearSpacers\n // and begin tracking draggable coordinates for entry into a droptarget\n }\n\n mousePosRef.current.x = clientX;\n mousePosRef.current.y = clientY;\n\n if (dragBoundaries.current === UNBOUNDED && draggableRef.current) {\n const dragPosX = mousePosRef.current.x - mouseOffsetRef.current.x;\n const dragPosY = mousePosRef.current.y - mouseOffsetRef.current.y;\n draggableRef.current.style.top = `${dragPosY}px`;\n draggableRef.current.style.left = `${dragPosX}px`;\n } else if (dragDistance > 0 && draggableRef.current) {\n const mouseMoveDirection = lastClientPos < clientPos ? \"fwd\" : \"bwd\";\n const scrollDirection = getScrollDirection(clientPos);\n const dragPos = mousePosRef.current[POS] - mouseOffsetRef.current[POS];\n\n if (\n scrollDirection &&\n isScrollableRef.current &&\n !isScrolling.current\n ) {\n handleScrollStart();\n startScrolling(scrollDirection, 1);\n } else if (!scrollDirection && isScrolling.current) {\n stopScrolling();\n }\n\n if (!isScrolling.current) {\n const renderDragPos = Math.round(\n Math.max(\n dragBoundaries.current.start,\n Math.min(dragBoundaries.current.end, dragPos)\n )\n );\n const START = orientation === \"horizontal\" ? \"left\" : \"top\";\n draggableRef.current.style[START] = `${renderDragPos}px`;\n drag(renderDragPos, mouseMoveDirection);\n }\n }\n },\n [\n drag,\n draggableRef,\n getScrollDirection,\n handleScrollStart,\n isDragSource,\n isScrolling,\n orientation,\n startScrolling,\n stopScrolling,\n ]\n );\n const dragMouseUpHandler = useCallback(() => {\n document.removeEventListener(\"mousemove\", dragMouseMoveHandler, false);\n document.removeEventListener(\"mouseup\", dragMouseUpHandler, false);\n settlingItemRef.current = draggableRef.current;\n // The implementation hook is currently invoking the onDrop callback, we should move it into here\n drop();\n setDraggableStatus((status) => ({\n ...status,\n draggedItemIndex: -1,\n isDragging: false,\n }));\n dragElementRef.current = undefined;\n }, [dragMouseMoveHandler, draggableRef, drop]);\n\n const dragStart = useCallback(\n (evt: MouseEvent) => {\n const { clientX, clientY, target } = evt;\n const dragElement = getDraggableElement(target, itemQuery);\n const { current: container } = containerRef;\n if (container && dragElement) {\n const {\n CONTRA,\n CONTRA_END,\n DIMENSION,\n END,\n SCROLL_SIZE,\n CLIENT_SIZE,\n START,\n } = dimensions(orientation);\n\n dragElementRef.current = dragElement;\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n container;\n isScrollableRef.current = scrollSize > clientSize;\n\n const [lastElement, lastItemIsOverflowIndicator] = getLastElement(\n container,\n itemQuery\n );\n\n const containerRect = container.getBoundingClientRect();\n const draggableRect = dragElement.getBoundingClientRect();\n const draggableSize = draggableRect[DIMENSION];\n const { [START]: lastItemStart, [END]: lastItemEnd } =\n lastElement.getBoundingClientRect();\n\n mouseOffsetRef.current.x = clientX - draggableRect.left;\n mouseOffsetRef.current.y = clientY - draggableRect.top;\n\n dragBoundaries.current.start = containerRect[START];\n dragBoundaries.current.end = lastItemIsOverflowIndicator\n ? Math.max(lastItemStart, containerRect.right - draggableSize)\n : isScrollableRef.current\n ? containerRect[START] + containerRect[DIMENSION] - draggableSize\n : lastItemEnd - draggableSize;\n dragBoundaries.current.contraStart = containerRect[CONTRA];\n dragBoundaries.current.contraEnd = containerRect[CONTRA_END];\n\n beginDrag(evt);\n\n const {\n dataset: { index = \"-1\" },\n } = dragElement;\n\n setDraggableStatus({\n isDragging: true,\n draggable: (\n <Draggable\n element={cloneElement(dragElement)}\n onTransitionEnd={terminateDrag}\n ref={draggableRef}\n style={constrainRect(draggableRect, containerRect)}\n wrapperClassName={draggableClassName}\n />\n ),\n draggedItemIndex: parseInt(index),\n });\n\n onDragStart?.();\n\n document.addEventListener(\"mousemove\", dragMouseMoveHandler, false);\n document.addEventListener(\"mouseup\", dragMouseUpHandler, false);\n }\n },\n [\n beginDrag,\n containerRef,\n dragMouseMoveHandler,\n dragMouseUpHandler,\n draggableClassName,\n draggableRef,\n itemQuery,\n onDragStart,\n orientation,\n terminateDrag,\n ]\n );\n\n const preDragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { CLIENT_POS, POS } = dimensions(orientation);\n const { [CLIENT_POS]: clientPos } = evt;\n const mouseMoveDistance = Math.abs(clientPos - startPosRef.current[POS]);\n if (mouseMoveDistance > dragThreshold && containerRef.current) {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n dragStart(evt);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [containerRef, beginDrag, orientation]\n );\n\n const preDragMouseUpHandler = useCallback(() => {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n }, [preDragMouseMoveHandler]);\n\n const mouseDownHandler: MouseEventHandler = useCallback(\n (evt) => {\n const { current: container } = containerRef;\n if (container && !evt.defaultPrevented) {\n const { clientX, clientY } = evt;\n mousePosRef.current.x = startPosRef.current.x = clientX;\n mousePosRef.current.y = startPosRef.current.y = clientY;\n\n document.addEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.addEventListener(\"mouseup\", preDragMouseUpHandler, false);\n\n evt.persist();\n\n mouseDownTimer.current = window.setTimeout(() => {\n document.removeEventListener(\n \"mousemove\",\n preDragMouseMoveHandler,\n false\n );\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n dragStart(evt.nativeEvent);\n }, 500);\n }\n },\n [containerRef, dragStart, preDragMouseMoveHandler, preDragMouseUpHandler]\n );\n\n const { current: settlingItem } = settlingItemRef;\n useLayoutEffect(() => {\n if (settlingItem && containerRef.current) {\n const dropPos = dropPosRef.current;\n const droppedItem = containerRef.current.querySelector(\n `${itemQuery}[data-index=\"${dropPos}\"]`\n );\n if (droppedItem) {\n droppedItem.classList.add(\"vuuDropTarget-settling\");\n requestAnimationFrame(() => {\n const { top: targetTop, left: targetLeft } =\n droppedItem.getBoundingClientRect();\n const { top: currentTop, left: currentLeft } =\n settlingItem.getBoundingClientRect();\n // If the droppedItem is already exactly in the drop position, we can just\n // terminate the drag here and now. Most likely, though, it is out by a few\n // pixels. We animate the dragged item into the final resting place before\n // terminating the drag.\n if (currentLeft !== targetLeft || currentTop !== targetTop) {\n settlingItem.classList.add(\"vuuDraggable-settling\");\n settlingItem.style.top = `${targetTop}px`;\n settlingItem.style.left = `${targetLeft}px`;\n } else {\n terminateDrag();\n }\n });\n } else {\n console.log(`dont have the dropped item (at ${dropPos})`);\n }\n settlingItemRef.current = null;\n }\n }, [containerRef, itemQuery, settlingItem, terminateDrag]);\n\n return {\n ...dragResult,\n ...draggableStatus,\n isScrolling,\n onMouseDown: allowDragDrop ? mouseDownHandler : undefined,\n };\n};\n", "import { RefObject, useCallback, useRef } from \"react\";\nimport { dimensions } from \"./drop-target-utils\";\n\nexport type ScrollStopHandler = (\n scrollDirection: \"fwd\" | \"bwd\",\n scrollPos: number,\n atEnd: boolean\n) => void;\n\nexport const useAutoScroll = ({\n containerRef,\n onScrollingStopped,\n orientation = \"vertical\",\n}: {\n containerRef: RefObject<HTMLElement>;\n onScrollingStopped?: ScrollStopHandler;\n orientation?: \"horizontal\" | \"vertical\";\n}) => {\n const scrollTimer = useRef<number | null>(null);\n const isScrolling = useRef(false);\n const scrollPosRef = useRef(0);\n const lastScrollDirectionRef = useRef<\"fwd\" | \"bwd\">(\"fwd\");\n\n const stopScrolling = useCallback(\n (atEnd = false) => {\n console.log(\"[useAutoScroll] stopScrolling\");\n if (scrollTimer.current !== null) {\n clearTimeout(scrollTimer.current);\n scrollTimer.current = null;\n }\n isScrolling.current = false;\n onScrollingStopped?.(\n lastScrollDirectionRef.current,\n scrollPosRef.current,\n atEnd\n );\n },\n [onScrollingStopped]\n );\n\n const startScrolling = useCallback(\n (direction: \"fwd\" | \"bwd\", scrollRate: number, scrollUnit = 30) => {\n const { current: container } = containerRef;\n if (container) {\n const { SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize,\n } = container;\n const maxScroll =\n direction === \"fwd\" ? scrollSize - clientSize - scrollPos : scrollPos;\n const nextScroll = Math.min(maxScroll, scrollUnit);\n\n if (direction === \"fwd\") {\n lastScrollDirectionRef.current = \"fwd\";\n container[SCROLL_POS as \"scrollTop\" | \"scrollLeft\"] =\n scrollPosRef.current = scrollPos + nextScroll;\n } else {\n lastScrollDirectionRef.current = \"bwd\";\n container[SCROLL_POS as \"scrollTop\" | \"scrollLeft\"] =\n scrollPosRef.current = scrollPos - nextScroll;\n }\n\n if (nextScroll === maxScroll) {\n stopScrolling(true);\n } else {\n isScrolling.current = true;\n scrollTimer.current = window.setTimeout(() => {\n startScrolling(direction, scrollRate, scrollUnit);\n }, 100);\n }\n }\n },\n [containerRef, orientation, stopScrolling]\n );\n\n return {\n isScrolling,\n startScrolling,\n stopScrolling,\n };\n};\n", "import cx from \"classnames\";\nimport {\n ChangeEvent,\n KeyboardEvent,\n useCallback,\n useLayoutEffect,\n forwardRef,\n ForwardedRef,\n ReactElement,\n useRef,\n HTMLAttributes,\n} from \"react\";\nimport { Input, useControlled } from \"@salt-ds/core\";\n\nimport \"./EditableLabel.css\";\n\nconst classBase = \"vuuEditableLabel\";\n\nexport interface EditableLabelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n className?: string;\n defaultEditing?: boolean;\n defaultValue?: string;\n editing?: boolean;\n onEnterEditMode: () => void;\n onChange?: (value: string) => void;\n onExitEditMode: (\n originalLabel: string | undefined,\n editedLabel: string | undefined,\n allowDeactivation?: boolean,\n editCancelled?: boolean\n ) => void;\n defaultIsEditing?: boolean;\n value?: string;\n}\n\nexport const EditableLabel = forwardRef(function EditableLabel(\n {\n className: classNameProp,\n defaultEditing,\n defaultValue,\n editing: editingProp,\n onChange,\n onEnterEditMode,\n onExitEditMode,\n value: valueProp,\n ...restProps\n }: EditableLabelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n): ReactElement<EditableLabelProps> {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const editingRef = useRef<boolean>(false);\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue ?? \"\",\n name: \"EditableLabel\",\n state: \"value\",\n });\n\n const [editing, _setEditing] = useControlled({\n controlled: editingProp,\n default: defaultEditing ?? false,\n name: \"EditableLabel\",\n state: \"editing\",\n });\n\n const setEditing = useCallback((value: boolean) => {\n _setEditing((editingRef.current = value));\n }, []);\n\n const initialValue = useRef(value);\n\n useLayoutEffect(() => {\n if (editing) {\n if (inputRef.current !== null) {\n inputRef.current.select();\n inputRef.current.focus();\n }\n }\n }, [editing, inputRef]);\n\n const enterEditMode = useCallback(() => {\n setEditing(true);\n // ignoreBlur.current = false;\n onEnterEditMode && onEnterEditMode();\n }, [onEnterEditMode, setEditing]);\n\n const exitEditMode = ({\n cancelEdit = false,\n allowDeactivation = false,\n } = {}) => {\n setEditing(false);\n const originalValue = initialValue.current;\n if (originalValue !== value) {\n if (cancelEdit) {\n setValue(originalValue);\n } else {\n initialValue.current = value;\n }\n }\n onExitEditMode &&\n onExitEditMode(originalValue, value, allowDeactivation, cancelEdit);\n };\n\n const handleChange = (evt: ChangeEvent<HTMLInputElement>) => {\n const { value } = evt.target;\n setValue(value);\n onChange && onChange(value);\n };\n\n const handleDoubleClick = () => {\n enterEditMode();\n };\n\n // We need the ref here as the blur fires before setEditing has taken effect,\n // so we get a double call to exitEditMode if edit is cancelled.\n const handleBlur = () => {\n if (editingRef.current) {\n exitEditMode({ allowDeactivation: true });\n }\n };\n\n const handleKeyDown = (evt: KeyboardEvent<HTMLInputElement>) => {\n if (editing && evt.key === \"Enter\") {\n evt.stopPropagation();\n // we are likely to lose focus as a consequence of user response\n // to exitEdit transition, don't want it to trigger another\n //shouldn't we call setEditing here in case we are in uncontrolled mode ?\n exitEditMode();\n } else if (evt.key === \"ArrowRight\" || evt.key === \"ArrowLeft\") {\n evt.stopPropagation();\n } else if (evt.key === \"Escape\") {\n exitEditMode({ cancelEdit: true });\n }\n };\n\n const className = cx(classBase, classNameProp, {\n [`${classBase}-editing`]: editing,\n });\n return (\n <div\n {...restProps}\n className={className}\n onDoubleClick={handleDoubleClick}\n data-text={value}\n ref={forwardedRef}\n >\n {editing ? (\n <Input\n inputProps={{ className: `${classBase}-input` }}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n inputRef={inputRef}\n style={{ padding: 0 }}\n textAlign=\"left\"\n variant=\"secondary\"\n />\n ) : (\n value\n )}\n </div>\n );\n});\n", "import { makePrefixer } from \"@salt-ds/core\";\nimport { ReactElement } from \"react\";\nimport { escapeRegExp } from \"../utils\";\n\nimport \"./Highlighter.css\";\n\nconst withBaseName = makePrefixer(\"saltHighlighter\");\n\nexport interface HighlighterProps {\n matchPattern?: RegExp | string;\n text?: string;\n}\n\nexport const Highlighter = (\n props: HighlighterProps\n): ReactElement<HighlighterProps> => {\n const { matchPattern, text = \"\" } = props;\n\n const matchRegex =\n typeof matchPattern === \"string\"\n ? new RegExp(`(${escapeRegExp(matchPattern)})`, \"gi\")\n : matchPattern;\n\n if (matchRegex === undefined) {\n return <>{text}</>;\n }\n return (\n <span>\n {text.split(matchRegex).map((part, index) =>\n part.match(matchRegex) ? (\n <strong\n className={withBaseName(\"highlight\")}\n key={`${index}-${part}`}\n >\n {part}\n </strong>\n ) : (\n part\n )\n )}\n </span>\n );\n};\n", "const regExp = /[.*+?^${}()|[\\]\\\\]/g;\n\nexport function escapeRegExp(string: string): string {\n return string.replace(regExp, \"\\\\$&\");\n}\n", "import { ForwardedRef, forwardRef, HTMLAttributes } from \"react\";\nimport cx from \"classnames\";\nimport { ListItemProps, ListItemType } from \"./listTypes\";\nimport { Highlighter } from \"./Highlighter\";\nimport { CheckboxIcon } from \"./CheckboxIcon\";\n\nimport \"./ListItem.css\";\n\nconst classBase = \"vuuListItem\";\n\n// A dummy ListItem rendered once and not visible. We measure this to\n// determine height of ListItem and monitor it for size changes (in\n// case of runtime density switch). This allows ListItem height to\n// be controlled purely through CSS.\nexport const ListItemProxy = forwardRef(function ListItemNextProxy(\n props: HTMLAttributes<HTMLDivElement>,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n return (\n <div\n aria-hidden\n className={cx(classBase, `${classBase}-proxy`)}\n ref={forwardedRef}\n />\n );\n});\n\n// Note: the memo is effective if List label is passed as simple string\n// If children are used, it is the responsibility of caller to memoise\n// these if performance on highlight is perceived to be an issue.\nexport const ListItem = forwardRef<HTMLDivElement, ListItemProps>(\n function ListItem(\n {\n children,\n className: classNameProp,\n disabled,\n tabIndex,\n item,\n itemHeight,\n itemTextHighlightPattern,\n label,\n selectable: _notUsed,\n selected,\n showCheckbox,\n style: styleProp,\n ...props\n },\n forwardedRef\n ) {\n const className = cx(classBase, classNameProp, {\n vuuDisabled: disabled,\n [`${classBase}-checkbox`]: showCheckbox,\n });\n const style =\n itemHeight !== undefined\n ? {\n ...styleProp,\n height: itemHeight,\n }\n : styleProp;\n\n return (\n <div\n className={className}\n {...props}\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n ref={forwardedRef}\n style={style}\n >\n {showCheckbox && <CheckboxIcon aria-hidden checked={selected} />}\n {children && typeof children !== \"string\" ? (\n children\n ) : itemTextHighlightPattern == null ? (\n <span className={`${classBase}-textWrapper`}>\n {label || children}\n </span>\n ) : (\n <Highlighter\n matchPattern={itemTextHighlightPattern}\n text={label || (children as string)}\n />\n )}\n </div>\n );\n }\n) as ListItemType;\n", "import { HTMLAttributes } from \"react\";\nimport cx from \"classnames\";\n\nimport \"./CheckboxIcon.css\";\n\nconst classBase = \"vuuCheckboxIcon\";\n\nexport interface CheckboxIconProps extends HTMLAttributes<HTMLSpanElement> {\n checked?: boolean;\n}\nexport const CheckboxIcon = ({\n checked = false,\n ...htmlAttributes\n}: CheckboxIconProps) => (\n <span\n {...htmlAttributes}\n className={cx(classBase, { [`${classBase}-checked`]: checked })}\n />\n);\n", "import { useId } from \"@vuu-ui/vuu-layout\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport {\n cloneElement,\n ForwardedRef,\n forwardRef,\n isValidElement,\n ReactElement,\n useRef,\n} from \"react\";\nimport {\n CollectionIndexer,\n CollectionItem,\n isSelected,\n itemToString as defaultItemToString,\n LIST_FOCUS_VISIBLE,\n ScrollingAPI,\n SelectionStrategy,\n useCollectionItems,\n useImperativeScrollingAPI,\n} from \"./common-hooks\";\n\nimport { ListItem as DefaultListItem, ListItemProxy } from \"./ListItem\";\nimport { ListItemProps, ListProps } from \"./listTypes\";\nimport { useList } from \"./useList\";\nimport { useListHeight } from \"./useListHeight\";\nimport { useScrollPosition } from \"./useScrollPosition\";\n\nimport \"./List.css\";\n\nconst defaultEmptyMessage = \"No data to display\";\n\nconst classBase = \"vuuList\";\n\nexport const List = forwardRef(function List<\n Item,\n Selection extends SelectionStrategy = \"default\"\n>(\n {\n ListItem = DefaultListItem,\n ListPlaceholder,\n allowDragDrop,\n borderless,\n children,\n className,\n collapsibleHeaders = false,\n defaultHighlightedIndex,\n defaultSelected,\n disabled: listDisabled = false,\n disableFocus = false,\n disableTypeToSelect,\n displayedItemCount = 10,\n emptyMessage,\n focusVisible: focusVisibleProp,\n getItemHeight: getItemHeightProp,\n getItemId,\n height,\n highlightedIndex: highlightedIndexProp,\n id: idProp,\n itemGapSize = 0,\n itemHeight: itemHeightProp,\n itemTextHighlightPattern,\n itemToString = defaultItemToString,\n listHandlers: listHandlersProp,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n onMoveListItem,\n onSelect,\n onSelectionChange,\n onHighlight,\n restoreLastFocus,\n selected: selectedProp,\n selectionStrategy,\n checkable = selectionStrategy === \"multiple\",\n scrollingApiRef,\n // TODO do we still need these ?\n selectionKeys,\n showEmptyMessage = false,\n source,\n style: styleProp,\n stickyHeaders,\n tabToSelect,\n width,\n ...htmlAttributes\n }: ListProps<Item, Selection>,\n forwardedRef?: ForwardedRef<HTMLDivElement>\n) {\n const id = useId(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const rowHeightProxyRef = useRef<HTMLDivElement>(null);\n\n const collectionHook = useCollectionItems<Item>({\n id,\n label: \"List\",\n source,\n children,\n options: {\n collapsibleHeaders,\n // Add Group ChildTypes to options\n getItemId,\n itemToString,\n },\n });\n\n // console.log(collectionHook);\n\n const { listClientHeight, listHeight, listItemHeight } = useListHeight({\n borderless,\n displayedItemCount,\n getItemHeight: getItemHeightProp,\n height,\n itemCount: collectionHook.data.length,\n itemGapSize,\n itemHeight: itemHeightProp,\n rootRef,\n rowHeightRef: rowHeightProxyRef,\n });\n\n const { onVerticalScroll, viewportRange } = useScrollPosition({\n containerSize:\n // TODO whats the right way to handle string values - ie percentages\n listClientHeight ?? (typeof listHeight === \"number\" ? listHeight : 0),\n itemCount: collectionHook.data.length,\n itemGapSize: itemGapSize,\n itemSize: listItemHeight,\n });\n\n const {\n draggable,\n draggedItemIndex,\n dropIndicator,\n focusVisible,\n highlightedIndex,\n listControlProps,\n listHandlers,\n listItemHeaderHandlers,\n scrollIntoView,\n selected,\n } = useList<Item, Selection>({\n allowDragDrop,\n collapsibleHeaders,\n collectionHook,\n containerRef: rootRef,\n contentRef,\n defaultHighlightedIndex,\n defaultSelected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(defaultSelected),\n disabled: listDisabled,\n disableTypeToSelect,\n highlightedIndex: highlightedIndexProp,\n id,\n label: id,\n listHandlers: listHandlersProp, // should this be in context ?\n onMoveListItem,\n onSelect,\n onSelectionChange,\n onHighlight,\n restoreLastFocus,\n selected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(selectedProp),\n selectionStrategy,\n selectionKeys,\n stickyHeaders,\n tabToSelect,\n viewportRange,\n });\n\n useImperativeScrollingAPI({\n collectionHook,\n forwardedRef: scrollingApiRef,\n scrollableRef: rootRef,\n scrollIntoView,\n });\n\n // focusVisible passes as a prop takes precedence\n const appliedFocusVisible = focusVisibleProp ?? focusVisible;\n\n const createHeader: (\n idx: { value: number },\n headerId: string,\n title: string,\n expanded?: boolean\n ) => ReactElement = function createHeader(idx, headerId, title, expanded) {\n const header = (\n <ListItem\n {...listItemHeaderHandlers}\n className={cx(`${classBase}Header`, {\n focusVisible: collapsibleHeaders && appliedFocusVisible === idx.value,\n })}\n aria-expanded={expanded}\n data-idx={collapsibleHeaders ? idx.value : undefined}\n data-index={collapsibleHeaders ? idx.value : undefined}\n data-highlighted={idx.value === highlightedIndex || undefined}\n data-sticky={stickyHeaders}\n data-selectable={false}\n id={headerId}\n key={`header-${idx.value}`}\n label={title}\n // role=\"presentation\"\n />\n );\n idx.value += 1;\n return header;\n };\n\n const getItemHeight =\n getItemHeightProp === undefined ? () => itemHeightProp : getItemHeightProp;\n\n function renderCollectionItem(\n list: ReactElement[],\n item: CollectionItem<Item>,\n idx: { value: number }\n ) {\n // Note, a number of these props are specific to ListItem. What if user\n // implements a custom ListItem but neglects to handle all these props.\n // Is that on them ?\n const { disabled, value, id: itemId, label } = item;\n const isChildItem = isValidElement(value);\n const listItemProps: ListItemProps<Item> & {\n key: string;\n \"data-idx\": number;\n \"data-index\": number;\n } = {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore until we refactor this whole section\n className: cx(value?.props?.className, {\n vuuHighlighted: idx.value === highlightedIndex,\n vuuFocusVisible: appliedFocusVisible === idx.value,\n [`vuuDraggable-dragAway`]: draggedItemIndex === idx.value,\n }),\n disabled: disabled || listDisabled,\n id: itemId,\n item: isChildItem ? undefined : item?.value ?? undefined,\n itemHeight: getItemHeight(idx.value),\n itemTextHighlightPattern,\n key: itemId,\n \"data-idx\": idx.value,\n \"data-index\": idx.value,\n label,\n role: \"option\",\n selected: isSelected<Item>(selected, item),\n showCheckbox: checkable,\n };\n list.push(\n isChildItem ? (\n cloneElement(value, listItemProps)\n ) : (\n <ListItem {...listItemProps} />\n )\n );\n\n idx.value += 1;\n }\n\n const addGroup: (\n list: ReactElement[],\n items: CollectionItem<Item>[],\n idx: { value: number }\n ) => void = function addGroup(\n list: ReactElement[],\n items: CollectionItem<Item>[],\n idx: { value: number }\n ) {\n const { count = 0, id, expanded, label = \"\" } = items[idx.value];\n const header = createHeader(idx, id, label, expanded);\n const childItems: ReactElement | ReactElement[] =\n expanded !== false\n ? [header].concat(\n renderCollectionItems(items, idx, idx.value + count) || []\n )\n : header;\n\n list.push(\n <div key={id} role=\"group\">\n {childItems}\n </div>\n );\n };\n\n const renderCollectionItems = (\n items: CollectionItem<Item>[],\n idx: CollectionIndexer = { value: 0 },\n end = items.length\n ): ReactElement[] | undefined => {\n const listItems: ReactElement[] = [];\n while (idx.value < end) {\n const item = items[idx.value];\n if (item.header) {\n listItems.push(\n createHeader(idx, item.id, item.label!, item.expanded === false)\n );\n } else if (item.childNodes) {\n addGroup(listItems, items, idx);\n } else {\n renderCollectionItem(listItems, item, idx);\n }\n }\n return listItems;\n };\n\n function renderEmpty() {\n if (emptyMessage || showEmptyMessage) {\n return (\n <span className={`${classBase}-empty-message`}>\n {emptyMessage ?? defaultEmptyMessage}\n </span>\n );\n } else {\n return null;\n }\n }\n\n const renderContent = () => {\n if (collectionHook.data.length) {\n // const itemsToRender =\n // typeof draggedItemIndex === \"number\" && draggedItemIndex >= 0\n // ? collectionHook.data.filter((d) => d.index !== draggedItemIndex)\n // : collectionHook.data;\n const itemsToRender = collectionHook.data;\n\n return renderCollectionItems(itemsToRender);\n } else {\n renderEmpty();\n }\n };\n\n const contentHeight = \"auto\";\n const sizeStyles = {\n \"--list-item-gap\": itemGapSize ? `${itemGapSize}px` : undefined,\n minWidth,\n minHeight,\n width: width ?? \"100%\",\n height: height ?? \"100%\",\n maxWidth: maxWidth ?? width,\n maxHeight: maxHeight ?? listHeight,\n };\n return (\n <div\n aria-multiselectable={\n selectionStrategy === \"multiple\" ||\n selectionStrategy === \"extended\" ||\n selectionStrategy === \"extended-multi-range\" ||\n undefined\n }\n {...htmlAttributes}\n {...listHandlers}\n {...listControlProps}\n className={cx(classBase, className, {\n [`${classBase}-collapsible`]: collapsibleHeaders,\n vuuFocusVisible: highlightedIndex === LIST_FOCUS_VISIBLE,\n })}\n id={`${id}`}\n ref={useForkRef<HTMLDivElement>(rootRef, forwardedRef)}\n role=\"listbox\"\n onScroll={onVerticalScroll}\n style={{ ...styleProp, ...sizeStyles }}\n tabIndex={listDisabled || disableFocus ? undefined : 0}\n >\n <ListItemProxy ref={rowHeightProxyRef} />\n {collectionHook.data.length === 0 && ListPlaceholder !== undefined ? (\n <>\n <ListPlaceholder />\n </>\n ) : (\n <div\n className={`${classBase}-scrollingContentContainer`}\n ref={contentRef}\n style={{ height: contentHeight }}\n >\n {renderContent()}\n {dropIndicator}\n {draggable}\n </div>\n )}\n </div>\n );\n}) as <Item = string, Selection extends SelectionStrategy = \"default\">(\n props: ListProps<Item, Selection> & {\n ref?: ForwardedRef<ScrollingAPI<Item>>;\n }\n) => ReactElement<ListProps<Item, Selection>>;\n", "import { cloneElement, createContext, ReactElement, useContext } from \"react\";\nimport { CollectionHookResult } from \"./collectionTypes\";\n\nexport interface collectionContext<T> {\n collection: CollectionHookResult<T>;\n}\n\nexport const CollectionContext = createContext<\n CollectionHookResult<any> | undefined\n>(undefined);\n\ninterface ContextProviderProps<Item> {\n children: ReactElement;\n collectionHook: CollectionHookResult<Item>;\n}\n\nexport function CollectionProvider<Item>({\n children,\n collectionHook,\n ...props\n}: ContextProviderProps<Item>) {\n return (\n <CollectionContext.Provider value={collectionHook}>\n {Object.keys(props).length > 0 ? cloneElement(children, props) : children}\n </CollectionContext.Provider>\n );\n}\n\nexport function useCollection<Item>(): CollectionHookResult<Item> | undefined {\n const collection = useContext(CollectionContext);\n if (collection) {\n return collection as CollectionHookResult<Item>;\n }\n}\n", "// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ItemToStringFunction = (item: any) => string;\n\nconst isPlainObject = (obj: unknown) =>\n Object.prototype.toString.call(obj) === \"[object Object]\";\n\nexport function itemToString(item: unknown): string {\n if (typeof item === \"string\") {\n return item;\n } else if (!isPlainObject(item)) {\n return String(item);\n }\n\n if (Object.prototype.hasOwnProperty.call(item, \"label\")) {\n return String((item as { label?: string }).label);\n }\n\n console.warn(\n [\n \"itemToString: you've likely forgotten to set the label prop on the item object.\",\n \"You can also provide your own `itemToString` implementation.\",\n ].join(\"\\n\")\n );\n\n return \"\";\n}\n", "import React from \"react\";\n\nfunction union<T>(set1: Set<T>, ...sets: Set<T>[]) {\n const result = new Set(set1);\n for (let set of sets) {\n for (let element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Home = \"Home\";\nexport const End = \"End\";\nexport const PageUp = \"PageUp\";\nexport const PageDown = \"PageDown\";\nexport const Space = \" \";\nexport const Tab = \"Tab\";\n\nconst actionKeys = new Set([\"Enter\", \"Delete\", \" \"]);\nconst focusKeys = new Set([\"Tab\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst navigationKeys = new Set([\n Home,\n End,\n PageUp,\n PageDown,\n ArrowDown,\n ArrowUp,\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n navigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: React.KeyboardEvent): boolean => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n return evt.key.length === 1 && !evt.ctrlKey && !evt.metaKey && !evt.altKey;\n};\n\nexport const isNavigationKey = ({ key }: React.KeyboardEvent): boolean => {\n return navigationKeys.has(key);\n};\n", "import { MouseEvent, useCallback } from \"react\";\nimport { ArrowLeft, ArrowRight, Enter } from \"./keyUtils\";\nimport { ListHandlers } from \"./selectionTypes\";\nimport { CollectionHookResult, CollectionItem } from \"./collectionTypes\";\n\nconst NO_HANDLERS = {};\nconst canToggleItem = (item: CollectionItem<unknown>) =>\n Array.isArray(item.childNodes);\n// TODO how do we determine this and where does this function belong = in the collectionHook ?\nconst canSelectItem = (item: CollectionItem<unknown>) => true;\n\nconst toggleIconClicked = (el: HTMLElement) => {\n const closestToggle = el.closest(\n \"[data-toggle],[aria-expanded]\"\n ) as HTMLElement;\n return closestToggle.dataset.toggle === \"true\";\n};\n\ninterface CollapsibleHookProps<Item> {\n collapsibleHeaders?: boolean;\n collectionHook: CollectionHookResult<Item>;\n highlightedIdx: number;\n onToggle?: (node: Item) => void;\n}\n\ninterface CollapsibleHookResult<Item> {\n onClick?: ListHandlers[\"onClick\"];\n onKeyDown?: ListHandlers[\"onKeyDown\"];\n}\n\nexport const useCollapsibleGroups = <Item>({\n collapsibleHeaders,\n collectionHook,\n highlightedIdx,\n onToggle,\n}: CollapsibleHookProps<Item>): CollapsibleHookResult<Item> => {\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === ArrowRight || e.key === Enter) {\n const item = collectionHook.data[highlightedIdx];\n if (item) {\n if (item.expanded === false && item.value) {\n e.preventDefault();\n collectionHook.expandGroupItem(item);\n onToggle?.(item.value);\n }\n }\n }\n\n if (e.key === ArrowLeft || e.key === Enter) {\n const item = collectionHook.data[highlightedIdx];\n if (item) {\n if (item.expanded && item.value) {\n e.preventDefault();\n collectionHook.collapseGroupItem(item);\n onToggle?.(item.value);\n }\n }\n }\n },\n [\n collectionHook.collapseGroupItem,\n collectionHook.data,\n collectionHook.expandGroupItem,\n highlightedIdx,\n ]\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n console.log(`useCollapsibleGroups idx=${highlightedIdx}`);\n const item = collectionHook.data[highlightedIdx];\n console.log(evt.target, evt.currentTarget);\n if (\n item &&\n canToggleItem(item) &&\n (!canSelectItem(item) || toggleIconClicked(evt.target as HTMLElement))\n ) {\n evt.stopPropagation();\n evt.preventDefault();\n if (item.expanded === false && item.value) {\n collectionHook.expandGroupItem(item);\n onToggle?.(item.value);\n } else if (item.expanded === true && item.value) {\n collectionHook.collapseGroupItem(item);\n onToggle?.(item.value);\n }\n }\n },\n [\n collectionHook.collapseGroupItem,\n collectionHook.data,\n collectionHook.expandGroupItem,\n highlightedIdx,\n ]\n );\n\n /**\n * These are List handlers, so we will not have reference to the actual node\n * element. We must rely on highlightedIdx to tell us which node is interactive.\n */\n const listHandlers = {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n };\n\n return collapsibleHeaders ? listHandlers : NO_HANDLERS;\n};\n", "export const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl?: HTMLElement) {\n if (listItemEl) {\n let idx: string | null | undefined = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if ((idx = listItemEl.ariaPosInSet)) {\n return parseInt(idx, 10) - 1;\n }\n }\n return -1;\n}\n\nexport const listItemId = (el: HTMLElement | null) => el?.id;\n\nexport const closestListItem = (el: HTMLElement) =>\n el.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { SyntheticEvent } from \"react\";\nimport { CollectionItem } from \"./collectionTypes\";\n\nexport const SINGLE = \"default\";\nexport const MULTIPLE = \"multiple\";\nexport const EXTENDED = \"extended\";\nexport const DESELECTABLE = \"deselectable\";\n\nexport type SelectionDisallowed = \"none\";\nexport type SingleSelectionStrategy = \"default\" | \"deselectable\";\nexport type MultiSelectionStrategy =\n | \"multiple\"\n | \"extended\"\n | \"extended-multi-range\";\nexport type SelectionStrategy =\n | SelectionDisallowed\n | SingleSelectionStrategy\n | MultiSelectionStrategy;\n\nexport type selectedType<\n Item,\n Selection extends SelectionStrategy\n> = Selection extends MultiSelectionStrategy ? Item[] : Item | null;\n\nexport type SelectHandler<Item = string> = (\n event: SyntheticEvent,\n selectedItem: Item\n) => void;\n\nexport type SelectionChangeHandler<\n Item = string,\n Selection extends SelectionStrategy = \"default\"\n> = (\n event: SyntheticEvent,\n selected: Selection extends SingleSelectionStrategy ? Item | null : Item[]\n) => void;\n\nexport const selectionIsDisallowed = (\n selection?: SelectionStrategy\n): selection is SelectionDisallowed => selection === \"none\";\n\nexport const hasSelection = <Item = unknown>(\n selected: Item | Item[] | null\n): selected is Item | Item[] => {\n return Array.isArray(selected)\n ? selected.length > 0\n : selected !== null && selected !== undefined;\n};\n\nexport const getFirstSelectedItem = <Item = unknown>(\n selected: Item | Item[] | null\n): Item | null => {\n return Array.isArray(selected) ? selected[0] : selected;\n};\n\nexport interface SelectionProps<\n Item,\n Selection extends SelectionStrategy = \"default\"\n> {\n defaultSelected?: Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n onSelect?: SelectHandler<Item>;\n onSelectionChange?: SelectionChangeHandler<Item, Selection>;\n selected?: Selection extends SingleSelectionStrategy ? Item | null : Item[];\n selectionStrategy?: Selection;\n}\n\nexport interface ListHandlers {\n onClick?: (event: React.MouseEvent) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n onKeyboardNavigation?: (\n event: React.KeyboardEvent,\n currentIndex: number\n ) => void;\n onMouseMove?: (event: React.MouseEvent) => void;\n}\nexport interface SelectionHookProps<\n Item,\n Selection extends SelectionStrategy = \"default\"\n> extends SelectionProps<CollectionItem<Item>, Selection> {\n disableSelection?: boolean;\n highlightedIdx: number;\n indexPositions: CollectionItem<Item>[];\n label?: string;\n selectionKeys?: string[];\n tabToSelect?: boolean;\n}\n\nexport interface SelectionHookResult<\n Item,\n Selection extends SelectionStrategy = \"default\"\n> {\n listHandlers: ListHandlers;\n selected: Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n setSelected: (\n selected: Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[]\n ) => void;\n}\n", "import { useCallback, useMemo, useRef, useState, isValidElement } from \"react\";\nimport {\n CollectionItem,\n CollectionIndexer,\n CollectionHookProps,\n CollectionHookResult,\n} from \"./collectionTypes\";\nimport {\n isHeader,\n isGroupNode,\n childItems,\n countChildItems,\n FilterPredicate,\n getDefaultFilter,\n getDefaultFilterRegex,\n isDisabled,\n isFocusable,\n isParentPath,\n replaceCollectionItem,\n sourceItems,\n} from \"./utils\";\nimport { itemToString as defaultItemToString } from \"./itemToString\";\n\nimport { SelectionStrategy, SingleSelectionStrategy } from \"./selectionTypes\";\nimport { useCollection } from \"./collectionProvider\";\n\nconst defaultCollectionOptions = {};\n\nexport const useCollectionItems = <Item>({\n children,\n id: idRoot,\n label = \"\",\n options = defaultCollectionOptions,\n // revealSelected = false,\n source,\n}: CollectionHookProps<Item>): CollectionHookResult<Item> => {\n const { getItemId } = options;\n\n const [, forceUpdate] = useState<unknown>(null);\n const inheritedCollectionHook = useCollection<Item>();\n const dataRef = useRef<CollectionItem<Item>[]>([]);\n const flattenedDataRef = useRef<CollectionItem<Item>[]>([]);\n const EMPTY_COLLECTION: CollectionItem<Item>[] = useMemo(() => [], []);\n const filterPattern = useRef<string>(options.filterPattern ?? \"\");\n\n // destructure individual option values so we can safely reference them in dependency arrays\n const {\n getFilterRegex = getDefaultFilterRegex,\n noChildrenLabel,\n itemToString = defaultItemToString,\n } = options;\n\n const isExpanded = useCallback(\n (path: string) => {\n // We can't do this here because itemToId won't work until we complete this phase\n // if (Array.isArray(revealSelected)) {\n // const selectedIds = revealSelected.map(itemToId);\n // return selectedIds.some((id) => isParentPath(path, id));\n // }\n return options.defaultExpanded || false;\n },\n [options.defaultExpanded]\n );\n\n const addMetadataToItems = useCallback(\n <Item>(\n items: CollectionItem<Item>[],\n indexer: CollectionIndexer,\n level = 1,\n path = \"\",\n results: CollectionItem<Item>[] = [],\n flattenedCollection: CollectionItem<Item>[] = [],\n flattenedSource: (Item | null)[] = []\n ): [CollectionItem<Item>[], (Item | null)[], CollectionItem<Item>[]] => {\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && options.collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && options.collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `item-${i}`;\n // getItemId is backward compatible with earlier List implementation.\n // It is not appropriate for a nested source structure, where index\n // will not always be an absolute offset.\n const id =\n item.id ?? (getItemId ? getItemId(i) : `${idRoot}-${childPath}`);\n\n const expanded = nonCollapsible\n ? undefined\n : item.expanded ?? isExpanded(id);\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: CollectionItem<Item> = {\n ...item,\n childNodes: undefined,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n description: item.description,\n disabled: isDisabled(item.value),\n focusable: isFocusable(item.value) ? undefined : false,\n id,\n index: indexer.value,\n expanded,\n level,\n };\n results.push(normalisedItem);\n flattenedCollection.push(normalisedItem);\n flattenedSource.push(items[i].value);\n\n indexer.value += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [children] = addMetadataToItems<Item>(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedCollection,\n flattenedSource\n );\n normalisedItem.childNodes = children;\n }\n });\n return [results, flattenedSource, flattenedCollection];\n },\n [options.collapsibleHeaders, getItemId, idRoot, isExpanded]\n );\n\n const getFilter = useCallback(() => {\n if (filterPattern.current) {\n return getDefaultFilter(filterPattern.current, getFilterRegex);\n } else {\n return null;\n }\n }, [getFilterRegex]);\n\n const collectVisibleItems = useCallback(\n (\n items: CollectionItem<Item>[],\n filter: null | FilterPredicate = getFilter(),\n results: CollectionItem<Item>[] = [],\n idx: { value: number } = { value: 0 }\n ): CollectionItem<Item>[] => {\n let skipToNextHeader = false;\n for (const item of items) {\n if (!(skipToNextHeader && !isHeader(item))) {\n if (\n item.value !== null &&\n (filter === null || filter(itemToString(item.value)))\n ) {\n results[idx.value] = item;\n idx.value += 1;\n }\n skipToNextHeader = false;\n if (isHeader(item) && item.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(item)) {\n if (item.expanded !== false && item.childNodes) {\n collectVisibleItems(item.childNodes, filter, results, idx);\n }\n }\n }\n }\n return results;\n },\n [getFilter, itemToString]\n );\n\n // Stage 1 - convert source or children to CollectionItems.\n const partialCollectionItems = useMemo(() => {\n return inheritedCollectionHook\n ? EMPTY_COLLECTION\n : sourceItems<Item>(source, { itemToString, noChildrenLabel }) ||\n childItems(children) ||\n [];\n }, [\n inheritedCollectionHook,\n EMPTY_COLLECTION,\n source,\n itemToString,\n noChildrenLabel,\n children,\n ]);\n\n // Stage 2 - extend the collectionItems with additional metadata\n const [collectionItems, flattenedSource, flattenedCollection] = useMemo(\n () =>\n inheritedCollectionHook\n ? [EMPTY_COLLECTION, EMPTY_COLLECTION, EMPTY_COLLECTION]\n : //@ts-ignore\n addMetadataToItems<Item>(partialCollectionItems, { value: 0 }),\n [\n EMPTY_COLLECTION,\n addMetadataToItems,\n inheritedCollectionHook,\n partialCollectionItems,\n ]\n );\n flattenedDataRef.current = flattenedCollection;\n\n // Stage 3 prepare the list of visible items, this is what will be rendered\n useMemo(\n () =>\n inheritedCollectionHook\n ? EMPTY_COLLECTION\n : (dataRef.current = collectVisibleItems(collectionItems)),\n [\n EMPTY_COLLECTION,\n collectVisibleItems,\n collectionItems,\n inheritedCollectionHook,\n ]\n );\n\n const collectionItemsRef = useRef(collectionItems);\n\n const setFilterPattern = useCallback(\n (pattern = \"\") => {\n if (typeof pattern === \"string\") {\n filterPattern.current = pattern;\n dataRef.current = collectVisibleItems(collectionItems);\n forceUpdate({});\n }\n },\n [collectionItems, collectVisibleItems]\n );\n\n const itemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems\n ): Item | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id))\n );\n if (sourceWithId?.id === id) {\n //TODO do we need the flattered source at all ?\n return flattenedSource?.[sourceWithId.index!] as Item;\n } else if (sourceWithId) {\n return itemById(id, sourceWithId.childNodes);\n }\n throw Error(`useCollectionData itemById, id ${id} not found `);\n },\n [flattenedSource, collectionItems]\n );\n\n const toCollectionItem = useCallback(\n (item: Item): CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n //@ts-ignore\n isValidElement(i.value) ? i.label === item : i.value === item\n );\n if (collectionItem) {\n return collectionItem;\n }\n throw Error(`useCollectionData toCollectionItem, item not found `);\n },\n []\n );\n\n // TODO types need more work, these are correct but we\n // don't really want references to Selection in here\n const itemToCollectionItem = useCallback(\n <\n Selection extends SelectionStrategy,\n U extends Item | Item[] | null | undefined\n >(\n sel: U\n ): Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n\n if (sel === null) {\n return null as returnType;\n } else if (Array.isArray(sel)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of sel) {\n const collectionItem = toCollectionItem(item);\n result.push(collectionItem);\n }\n return result as returnType;\n } else if (sel !== undefined) {\n return toCollectionItem(sel as Item) as returnType;\n }\n\n return undefined as unknown as returnType;\n },\n [toCollectionItem]\n );\n\n const stringToCollectionItem = useCallback(\n <Selection extends SelectionStrategy>(\n value: string | null | undefined\n ): Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n\n const toCollectionItem = (\n item: string\n ): undefined | CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n //@ts-ignore\n isValidElement(i.value)\n ? i.label === item\n : i.value !== null && itemToString(i.value) === item\n );\n if (collectionItem) {\n return collectionItem;\n }\n };\n\n if (value === null) {\n return null as returnType;\n } else if (Array.isArray(value)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of value) {\n const collectionItem = toCollectionItem(item);\n if (collectionItem) {\n result.push(collectionItem);\n }\n }\n return result as returnType;\n } else if (value !== undefined) {\n return toCollectionItem(value) as returnType;\n }\n\n return undefined as unknown as returnType;\n },\n [itemToString]\n );\n\n const itemToId = useCallback((item: Item): string => {\n for (const collectionItem of collectionItemsRef.current) {\n if (item === collectionItem.value) {\n return collectionItem.id;\n }\n }\n throw Error(\"useCollectionData itemToId, item not found\");\n }, []);\n\n const collapseGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem(\n collectionItemsRef.current,\n item.id,\n {\n expanded: false,\n }\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems]\n );\n\n const expandGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem<Item>(\n collectionItemsRef.current,\n item.id,\n {\n expanded: true,\n }\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems]\n );\n\n return (\n inheritedCollectionHook || {\n collapseGroupItem,\n data: dataRef.current,\n expandGroupItem, // why not toggle, or just rely on setdata ?\n setFilterPattern,\n itemById,\n itemToId,\n toCollectionItem,\n itemToCollectionItem,\n stringToCollectionItem,\n }\n );\n};\n", "import { isValidElement, Children, ReactElement, ReactNode } from \"react\";\n\nimport {\n CollectionItem,\n CollectionOptions,\n SourceGroup,\n} from \"../collectionTypes\";\n// TODO how do we configure these\nimport { ListItemGroup } from \"../../ListItemGroup\";\nimport { ListItemHeader } from \"../../ListItemHeader\";\nimport { itemToString as defaultItemToString } from \"../itemToString\";\n\ntype NonFocusableElement = ReactElement<{ focusable: false }>;\ntype DisablableElement = ReactElement<{ disabled: boolean }>;\ntype SelectableElement = ReactElement<{ selectable: boolean }>;\n\nexport const sourceItemHasProp = (\n item: unknown,\n propertyName: string\n): boolean => {\n return (\n item !== null && Object.prototype.hasOwnProperty.call(item, propertyName)\n );\n};\n\nexport const isHeader = (item: unknown): boolean =>\n sourceItemHasProp(item, \"header\");\n\nexport const isGroupNode = (item: unknown): boolean =>\n sourceItemHasProp(item, \"childNodes\");\n\nconst childItemHasProp = (item: ReactElement, propertyName: string) => {\n return item && Object.prototype.hasOwnProperty.call(item.props, propertyName);\n};\n\nexport const isDisabled = (item: unknown): boolean => {\n if (isValidElement(item as DisablableElement)) {\n if (childItemHasProp(item as DisablableElement, \"disabled\")) {\n return (item as DisablableElement).props.disabled === true;\n }\n } else if (sourceItemHasProp(item, \"disabled\")) {\n return (item as { disabled: boolean }).disabled === true;\n }\n\n return false;\n};\n\nexport const isFocusable = (item: unknown): boolean => {\n if (isValidElement(item as NonFocusableElement)) {\n if (childItemHasProp(item as NonFocusableElement, \"focusable\")) {\n return (item as NonFocusableElement).props.focusable;\n }\n }\n return true;\n};\n\nexport const countChildItems = <Item>(\n item: CollectionItem<Item>,\n items: CollectionItem<Item>[],\n idx: number\n): number => {\n if (item.childNodes) {\n return item.childNodes.length;\n } else if (item.header) {\n let i = idx + 1;\n let count = 0;\n while (i < items.length && !items[i].header) {\n count++;\n i++;\n }\n return count;\n } else {\n return 0;\n }\n};\n\nexport const getChildLabel = (\n element: ReactElement<{\n children?: ReactNode;\n label?: string;\n title?: string;\n }>\n): string | undefined => {\n if (typeof element.props.children === \"string\") {\n return element.props.children;\n } else if (element.props.title) {\n return element.props.title;\n } else if (element.props.label) {\n return element.props.label;\n }\n};\n\nconst childIsHeader = (child: ReactElement) =>\n child.type === ListItemHeader || childItemHasProp(child, \"data-header\");\n\nexport const childIsGroup = (child: ReactElement): boolean =>\n child.type === ListItemGroup || childItemHasProp(child, \"data-group\");\n\nconst childIsSelectable = (child: ReactElement) => {\n if (childItemHasProp(child, \"selectable\")) {\n return (child as SelectableElement).props.selectable === true;\n } else {\n return !childIsGroup(child) && !childIsHeader(child);\n }\n};\n\nexport const getChildNodes = (\n element: ReactElement\n): CollectionItem<ReactElement>[] | undefined => {\n if (childIsGroup(element)) {\n const {\n props: { children },\n } = element as ReactElement<{ children?: ReactNode }>;\n if (typeof children !== \"string\") {\n return childItems(children);\n }\n }\n};\n\nconst mapReactElementChildren = (\n children: ReactNode,\n fn: (el: ReactElement) => CollectionItem<ReactElement>\n): CollectionItem<ReactElement>[] => {\n const childElements: CollectionItem<ReactElement>[] = [];\n Children.forEach(children, (child) => {\n if (isValidElement(child)) {\n childElements.push(fn(child));\n }\n });\n return childElements;\n};\n\ntype ListItemElementProps = {\n \"data-id\"?: string;\n disabled?: boolean;\n id?: string;\n \"data-expanded\"?: boolean;\n expanded?: boolean;\n};\n\ntype CollectionItemWithoutId<T> = Omit<CollectionItem<T>, \"id\">;\n\nexport const sourceItems = <T>(\n source?: ReadonlyArray<T>,\n options?: CollectionOptions<T>\n): CollectionItemWithoutId<T>[] | undefined => {\n if (Array.isArray(source)) {\n if (source.length === 0 && options?.noChildrenLabel) {\n return [\n {\n label: options.noChildrenLabel,\n value: null,\n },\n ];\n } else {\n return source.map(\n (item: { description?: string; expanded?: boolean }, index) =>\n ({\n childNodes: sourceItems(\n (item as unknown as SourceGroup<T>).childNodes,\n options\n ),\n description: item.description,\n expanded: item.expanded,\n value: item,\n label:\n options?.itemToString?.(item as T) ?? defaultItemToString(item),\n } as CollectionItemWithoutId<T>)\n );\n }\n } else if (source) {\n throw Error(\"list-child-items expects source to be an array\");\n }\n};\n\nexport const childItems = (\n children: ReactNode\n): CollectionItem<ReactElement>[] | undefined => {\n if (children) {\n return mapReactElementChildren(children, (child) => {\n const {\n \"data-id\": dataId,\n disabled,\n id = dataId,\n \"data-expanded\": dataExpanded,\n expanded = dataExpanded,\n } = (child as ReactElement<ListItemElementProps>).props;\n return {\n childNodes: getChildNodes(child),\n disabled,\n expanded,\n header: childIsHeader(child),\n id,\n label: getChildLabel(child),\n selectable: childIsSelectable(child),\n value: child,\n } as CollectionItem<ReactElement>;\n });\n }\n};\n\nconst PathSeparators = new Set<string>([\"/\", \"-\", \".\"]);\n// TODO where do we define or identify separators\nconst isPathSeparator = (char: string) => PathSeparators.has(char);\n\nexport const isParentPath = (parentPath: string, childPath: string): boolean =>\n childPath.startsWith(parentPath) &&\n isPathSeparator(childPath[parentPath.length]);\n\nconst PATH_SEPARATORS = new Set([\".\", \"/\"]);\n\nfunction isDescendantOf(basePath: string, targetPath: string) {\n if (!targetPath.startsWith(basePath)) {\n return false;\n } else {\n return PATH_SEPARATORS.has(targetPath.charAt(basePath.length));\n }\n}\n\nexport function replaceCollectionItem<Item>(\n nodes: CollectionItem<Item>[],\n id: string,\n props: Partial<CollectionItem<Item>>\n): CollectionItem<Item>[] {\n let childNodes: CollectionItem<Item>[];\n const newNodes: CollectionItem<Item>[] = nodes.map((node) => {\n if (node.id === id) {\n return {\n ...node,\n ...props,\n };\n } else if (isDescendantOf(node.id, id) && node.childNodes) {\n childNodes = replaceCollectionItem<Item>(node.childNodes, id, props);\n return {\n ...node,\n childNodes,\n };\n } else {\n return node;\n }\n });\n\n return newNodes;\n}\n", "import { HTMLAttributes } from \"react\";\n\n// Purely used as markers, props will be extracted\nexport interface ListItemGroupProps extends HTMLAttributes<HTMLDivElement> {\n // children?: ListItemType | ListItemType[];\n children?: JSX.Element | JSX.Element[];\n label?: string;\n}\nexport const ListItemGroup = (_: ListItemGroupProps) => null;\n", "import { HTMLAttributes } from \"react\";\n\n// Purely used as markers, props will be extracted\nexport interface ListItemHeaderProps extends HTMLAttributes<HTMLDivElement> {\n label?: string;\n}\nexport const ListItemHeader = (_: ListItemHeaderProps) => null;\n", "import { escapeRegExp } from \"../../../utils\";\n\nexport type GetFilterRegex = (inputValue: string) => RegExp;\n\nexport type FilterPredicate = (item: string) => boolean;\n\nconst leftTrim = (value: string) =>\n value ? value.replace(/^\\s+/g, \"\") : value;\n\nexport const getDefaultFilterRegex: GetFilterRegex = (value) =>\n new RegExp(`(${escapeRegExp(leftTrim(value))})`, \"gi\");\n\nexport const getDefaultFilter =\n (inputValue = \"\", getFilterRegex: GetFilterRegex = getDefaultFilterRegex) =>\n (itemValue = \"\"): boolean =>\n Boolean(itemValue.length) &&\n Boolean(inputValue.length) &&\n itemValue.match(getFilterRegex(inputValue)) !== null;\n", "import { CollectionItem } from \"../collectionTypes\";\n\nexport function isSelected<Item>(\n selected: CollectionItem<Item> | CollectionItem<Item>[] | null,\n item: CollectionItem<Item>\n): boolean {\n const isSelected = Array.isArray(selected)\n ? selected.includes(item)\n : selected === item;\n return isSelected;\n}\n", "import {\n ForwardedRef,\n MutableRefObject,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport { CollectionHookResult, CollectionItem } from \"./collectionTypes\";\n\nexport interface ScrollingAPI<Item> {\n scrollToIndex: (itemIndex: number) => void;\n scrollToItem: (item: Item) => void;\n scrollTo: (scrollOffset: number) => void;\n}\n\nexport interface ScrollingAPIHook<Item> {\n collectionHook: CollectionHookResult<Item>;\n forwardedRef?: ForwardedRef<ScrollingAPI<Item>>;\n scrollableRef: MutableRefObject<HTMLElement | null>;\n scrollIntoView?: (item: CollectionItem<Item>) => void;\n}\n\nconst noScrolling: ScrollingAPI<unknown> = {\n scrollToIndex: (itemIndex: number) => undefined,\n scrollToItem: (item) => undefined,\n scrollTo: (scrollOffset: number) => undefined,\n};\n\nexport const useImperativeScrollingAPI = <Item>({\n collectionHook,\n forwardedRef,\n scrollableRef,\n scrollIntoView,\n}: ScrollingAPIHook<Item>) => {\n const scrollHandles: ScrollingAPI<Item> = useMemo(\n () => ({\n scrollToIndex: (itemIndex: number) => {\n const collectionItem = collectionHook.data[itemIndex];\n if (collectionItem) {\n scrollIntoView?.(collectionItem);\n }\n },\n scrollToItem: (item: Item) => {\n const collectionItem = collectionHook.toCollectionItem(item);\n if (collectionItem) {\n scrollIntoView?.(collectionItem);\n }\n },\n scrollTo: (scrollOffset: number) => {\n if (scrollableRef?.current) {\n scrollableRef.current.scrollTop = scrollOffset;\n }\n },\n }),\n [collectionHook.data, collectionHook.toCollectionItem, scrollIntoView]\n );\n\n useImperativeHandle(\n forwardedRef,\n () => {\n if (scrollableRef.current) {\n return scrollHandles;\n } else {\n return noScrolling;\n }\n },\n [scrollHandles]\n );\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport {\n FocusEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n ArrowDown,\n ArrowUp,\n End,\n Home,\n isCharacterKey,\n isNavigationKey,\n PageDown,\n PageUp,\n} from \"./keyUtils\";\nimport { CollectionItem } from \"./collectionTypes\";\nimport { NavigationHookProps, NavigationHookResult } from \"./navigationTypes\";\nimport {\n getFirstSelectedItem,\n hasSelection,\n SelectionStrategy,\n} from \"./selectionTypes\";\n\nexport const LIST_FOCUS_VISIBLE = -2;\n\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === ArrowUp || key === End) {\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 getIndexOfSelectedItem = (\n items: CollectionItem<unknown>[],\n selected?: CollectionItem<unknown> | null | CollectionItem<unknown>[]\n) => {\n const selectedItem = getFirstSelectedItem(selected);\n if (selectedItem) {\n return items.indexOf(selectedItem);\n } else {\n return -1;\n }\n};\n\nconst getStartIdx = (\n key: string,\n idx: number,\n selectedIdx: number,\n length: number\n) => {\n if (key === End) {\n return length;\n } else if (key === Home) {\n return -1;\n } else if (idx !== -1) {\n return idx;\n } else {\n return selectedIdx;\n }\n};\n\nconst getItemRect = (item: CollectionItem<unknown>) => {\n const el = document.getElementById(item.id);\n if (el) {\n return el.getBoundingClientRect();\n } else {\n throw Error(\n `useKeyboardNavigation.getItemRect no element found for item #${item?.id}`\n );\n }\n};\n\nconst pageDown = (\n containerEl: HTMLElement,\n itemEl: HTMLElement,\n indexPositions: CollectionItem<unknown>[],\n index: number\n): number | undefined => {\n const { top: itemTop } = itemEl.getBoundingClientRect();\n const { scrollTop, clientHeight, scrollHeight } = containerEl;\n const lastIndexPosition = indexPositions.length - 1;\n const newScrollTop = Math.min(\n scrollTop + clientHeight,\n scrollHeight - clientHeight\n );\n if (newScrollTop !== scrollTop && index < lastIndexPosition) {\n containerEl.scrollTo(0, newScrollTop);\n // Might need to do this in a timeout, in case virtualized content has rendered\n let nextIdx = index;\n let nextRect;\n do {\n nextIdx += 1;\n nextRect = getItemRect(indexPositions[nextIdx]);\n } while (nextRect.top < itemTop && nextIdx < lastIndexPosition);\n return nextIdx;\n }\n};\n\nconst pageUp = async (\n containerEl: HTMLElement,\n itemEl: HTMLElement,\n indexPositions: CollectionItem<unknown>[],\n index: number\n): Promise<number | undefined> => {\n const { top: itemTop } = itemEl.getBoundingClientRect();\n const { scrollTop, clientHeight } = containerEl;\n const newScrollTop = Math.max(scrollTop - clientHeight, 0);\n if (newScrollTop !== scrollTop && index > 0) {\n containerEl.scrollTo(0, newScrollTop);\n return new Promise((resolve) => {\n // We must defer this operation until after render. If Items are virtualized.\n // we need to allow them to be rendered.\n requestAnimationFrame(() => {\n let nextIdx = index;\n let nextRect;\n do {\n nextIdx -= 1;\n nextRect = getItemRect(indexPositions[nextIdx]);\n } while (nextRect.top > itemTop && nextIdx > 0);\n resolve(nextIdx);\n });\n });\n }\n};\n\nconst isLeaf = <Item>(item: CollectionItem<Item>): boolean =>\n !item.header && !item.childNodes;\nconst isFocusable = <Item>(item: CollectionItem<Item>) =>\n isLeaf(item) || item.expanded !== undefined;\n\nexport const useKeyboardNavigation = <\n Item,\n Selection extends SelectionStrategy\n>({\n containerRef,\n defaultHighlightedIndex = -1,\n disableHighlightOnFocus,\n highlightedIndex: highlightedIndexProp,\n indexPositions,\n onHighlight,\n onKeyboardNavigation,\n restoreLastFocus,\n selected,\n}: NavigationHookProps<Item, Selection>): NavigationHookResult => {\n const lastFocus = useRef(-1);\n const [, forceRender] = useState({});\n const [highlightedIndex, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIndex = useCallback(\n (idx: number, fromKeyboard = false) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n if (fromKeyboard) {\n lastFocus.current = idx;\n }\n },\n [onHighlight, setHighlightedIdx]\n );\n\n const nextPageItemIdx = useCallback(\n async (e: KeyboardEvent, index: number): Promise<number> => {\n const { id } = indexPositions[index];\n let result: number | undefined;\n if (id) {\n const itemEl = document.getElementById(id);\n const { current: containerEl } = containerRef;\n if (itemEl && containerEl) {\n result =\n e.key === PageDown\n ? pageDown(containerEl, itemEl, indexPositions, index)\n : await pageUp(containerEl, itemEl, indexPositions, index);\n }\n }\n return result ?? index;\n },\n [containerRef, indexPositions]\n );\n\n const nextFocusableItemIdx = useCallback(\n (\n key = ArrowDown,\n idx: number = key === ArrowDown ? -1 : indexPositions.length\n ) => {\n if (indexPositions.length === 0) {\n return -1;\n } else {\n const indexOfSelectedItem = getIndexOfSelectedItem(\n indexPositions,\n selected\n );\n // The start index is generally the highlightedIdx (passed in as idx).\n // We don't need it for Home and End navigation.\n // Special case where we have selection, but no highlighting - begin\n // navigation from selected item.\n const startIdx = getStartIdx(\n key,\n idx,\n indexOfSelectedItem,\n indexPositions.length\n );\n\n let nextIdx = nextItemIdx(indexPositions.length, key, startIdx);\n // Guard against returning zero, when first item is a header or group\n if (\n nextIdx === 0 &&\n key === ArrowUp &&\n !isFocusable(indexPositions[0])\n ) {\n return idx;\n }\n while (\n (((key === ArrowDown || key === Home) &&\n nextIdx < indexPositions.length) ||\n ((key === ArrowUp || key === End) && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n nextIdx = nextItemIdx(indexPositions.length, key, nextIdx);\n }\n return nextIdx;\n }\n },\n [indexPositions, selected]\n );\n\n // does this belong here or should it be a method passed in?\n const keyboardNavigation = useRef(false);\n const ignoreFocus = useRef<boolean>(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const handleFocus = useCallback(\n (e: FocusEvent) => {\n // Ignore focus if mouse has been used\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else {\n // If mouse wan't used, then keyboard must have been\n keyboardNavigation.current = true;\n if (indexPositions.length === 0) {\n setHighlightedIndex(LIST_FOCUS_VISIBLE);\n } else if (highlightedIndex !== -1) {\n // We need to force a render here. We're not changing the highlightedIdx, but we want to\n // make sure we render with the correct focusVisible value. We don't store focusVisible\n // in state, as there are places where we would double render, as highlightedIdx also changes.\n forceRender({});\n } else if (restoreLastFocus) {\n if (lastFocus.current !== -1) {\n setHighlightedIndex(lastFocus.current);\n } else {\n const selectedItemIdx = getIndexOfSelectedItem(\n indexPositions,\n selected\n );\n if (selectedItemIdx !== -1) {\n setHighlightedIndex(selectedItemIdx);\n } else {\n setHighlightedIndex(0);\n }\n }\n } else if (hasSelection(selected)) {\n const selectedItemIdx = getIndexOfSelectedItem(\n indexPositions,\n selected\n );\n setHighlightedIndex(selectedItemIdx);\n } else if (disableHighlightOnFocus !== true) {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }\n },\n [\n disableHighlightOnFocus,\n highlightedIndex,\n indexPositions,\n nextFocusableItemIdx,\n restoreLastFocus,\n selected,\n setHighlightedIndex,\n ]\n );\n\n const navigateChildItems = useCallback(\n async (e: KeyboardEvent) => {\n const nextIdx =\n e.key === PageDown || e.key === PageUp\n ? await nextPageItemIdx(e, highlightedIndex)\n : nextFocusableItemIdx(e.key, highlightedIndex);\n\n if (nextIdx !== highlightedIndex) {\n setHighlightedIndex(nextIdx, true);\n }\n // Users may need to know that a Keyboard navigation event has been handled\n // even if no actual navigation was effected. e.g. fine-grained control\n // over aria-activedescendant requires this.\n onKeyboardNavigation?.(e, nextIdx);\n },\n [\n highlightedIndex,\n nextFocusableItemIdx,\n nextPageItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (indexPositions.length > 0 && isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyboardNavigation.current = true;\n void navigateChildItems(e);\n } else if (isCharacterKey(e)) {\n keyboardNavigation.current = true;\n }\n },\n [indexPositions, navigateChildItems]\n );\n\n const listProps = useMemo(() => {\n return {\n onBlur: (e: FocusEvent) => {\n //TODO no direct ref to List\n const sourceTarget = (e.target as HTMLElement).closest(\".saltList\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n keyboardNavigation.current = false;\n setHighlightedIdx(-1);\n if (!restoreLastFocus) {\n lastFocus.current = -1;\n }\n }\n },\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyboardNavigation.current) {\n keyboardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n };\n }, [\n handleFocus,\n handleKeyDown,\n restoreLastFocus,\n setHighlightedIdx,\n setHighlightedIndex,\n ]);\n\n return {\n focusVisible: keyboardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIndex,\n setHighlightedIndex,\n keyboardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport { KeyboardEvent, MouseEvent, useCallback, useRef } from \"react\";\nimport { CollectionItem } from \"./collectionTypes\";\nimport {\n ListHandlers,\n SelectionHookProps,\n SelectionHookResult,\n selectionIsDisallowed,\n SelectionStrategy,\n SingleSelectionStrategy,\n} from \"./selectionTypes\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nconst NO_SELECTION_HANDLERS: ListHandlers = {};\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nconst isSelectable = (item?: CollectionItem<unknown>) =>\n item && item.disabled !== true && item.selectable !== false;\n\nconst byItemIndex = (\n i1: CollectionItem<unknown>,\n i2: CollectionItem<unknown>\n) => (i1.index ?? 0) - (i2.index ?? 0);\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = <\n Item,\n Selection extends SelectionStrategy = \"default\"\n>({\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIdx,\n indexPositions,\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect,\n}: SelectionHookProps<Item, Selection>): SelectionHookResult<\n Item,\n Selection\n> => {\n type collectionItem = CollectionItem<Item>;\n\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys]\n );\n\n const emptyValue = useCallback(<\n Item\n >(): Selection extends SingleSelectionStrategy\n ? null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? null\n : CollectionItem<Item>[];\n return isMultipleSelect || isExtendedSelect\n ? ([] as unknown as returnType)\n : (null as returnType);\n }, [isMultipleSelect, isExtendedSelect]);\n\n const [selected, setSelected] = useControlled<\n Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[]\n >({\n controlled: selectedProp,\n default: defaultSelected ?? emptyValue(),\n name: \"UseSelection\",\n state: \"selected\",\n });\n\n const isItemSelected = useCallback(\n (item: collectionItem) => {\n return Array.isArray(selected)\n ? selected.includes(item)\n : selected === item;\n },\n [selected]\n );\n\n const selectDefault = useCallback((item: collectionItem) => item, []);\n const selectDeselectable = useCallback(\n (item: collectionItem) => (isItemSelected(item) ? null : item),\n [isItemSelected]\n );\n const selectMultiple = useCallback(\n (item: collectionItem) => {\n const nextItems = isItemSelected(item)\n ? (selected as collectionItem[]).filter((i) => i !== item)\n : (selected as collectionItem[]).concat(item);\n nextItems.sort(byItemIndex);\n return nextItems;\n },\n [isItemSelected, selected]\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as collectionItem[])\n : ([] as collectionItem[]);\n\n const [lastSelectedItem] = (selected as collectionItem[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItem\n ? indexPositions.indexOf(lastSelectedItem)\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n const rangeSelection = indexPositions.slice(startRegion, endRegion + 1);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort(byItemIndex);\n return nextItems;\n },\n [indexPositions, selected]\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: any,\n idx: number,\n item: collectionItem,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean\n ) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n let newSelected: returnType;\n if (isMultipleSelect) {\n newSelected = selectMultiple(item) as returnType;\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(item) as returnType;\n } else if (rangeSelect) {\n newSelected = selectRange(\n idx,\n preserveExistingSelection\n ) as returnType;\n } else {\n newSelected = [item] as returnType;\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(item) as returnType;\n } else {\n newSelected = selectDefault(item) as returnType;\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, item);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n selectDefault,\n setSelected,\n onSelectionChange,\n ]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const item = indexPositions[highlightedIdx];\n if (isSelectable(item)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item,\n false,\n evt.ctrlKey || evt.metaKey\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n }\n },\n [\n indexPositions,\n highlightedIdx,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect,\n ]\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const item = indexPositions[currentIndex];\n if (isSelectable(item)) {\n selectItemAtIndex(evt, currentIndex, item, true);\n }\n }\n },\n [isExtendedSelect, indexPositions, selectItemAtIndex]\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n const item = indexPositions[highlightedIdx];\n if (!disableSelection && isSelectable(item)) {\n // if (!isCollapsibleItem(item)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIdx;\n }\n // }\n }\n },\n [\n disableSelection,\n isExtendedSelect,\n highlightedIdx,\n indexPositions,\n selectItemAtIndex,\n ]\n );\n\n const listHandlers = selectionIsDisallowed(selectionStrategy)\n ? NO_SELECTION_HANDLERS\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n return {\n listHandlers,\n selected,\n setSelected,\n };\n};\n", "import { useCallback, useRef } from \"react\";\nimport { isCharacterKey, Space } from \"./keyUtils\";\nimport { CollectionItem } from \"./collectionTypes\";\n\ninterface TypeaheadHookProps<Item> {\n disableTypeToSelect?: boolean;\n highlightedIdx: number;\n highlightItemAtIndex: (idx: number) => void;\n applyIncrementalSearch?: boolean;\n typeToNavigate: boolean;\n items: CollectionItem<Item>[];\n}\n\ninterface TypeaheadHookResult {\n onKeyDown?: (e: React.KeyboardEvent) => void;\n}\n\nexport const useTypeahead = <Item>({\n disableTypeToSelect,\n highlightedIdx,\n highlightItemAtIndex,\n typeToNavigate,\n items,\n applyIncrementalSearch = true,\n}: TypeaheadHookProps<Item>): TypeaheadHookResult => {\n const keyDownTimer = useRef<number | null>(null);\n const searchChars = useRef(\"\");\n const startIdx = useRef(-1);\n\n const applySearch = useCallback(\n (intermediateSearch?: true | undefined) => {\n if (intermediateSearch || !applyIncrementalSearch) {\n const regex = new RegExp(`^${searchChars.current}`, \"i\");\n let idx = items.findIndex(\n ({ label }, i) => i > startIdx.current && regex.test(label!)\n );\n if (idx === -1) {\n idx = items.findIndex(\n ({ label }, i) => i <= startIdx.current && regex.test(label!)\n );\n }\n if (idx !== -1) {\n highlightItemAtIndex(idx);\n }\n } else {\n searchChars.current = \"\";\n keyDownTimer.current = null;\n startIdx.current = -1;\n }\n },\n [applyIncrementalSearch, highlightItemAtIndex, items]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const searchInProgress = startIdx.current !== -1;\n if (isCharacterKey(e) || (searchInProgress && e.key === Space)) {\n if (typeToNavigate) {\n e.preventDefault();\n e.stopPropagation();\n // If we type the same key repeatedly, we cycle through the matches\n if (startIdx.current === -1 || e.key === searchChars.current) {\n startIdx.current = highlightedIdx;\n }\n if (keyDownTimer.current !== null) {\n clearTimeout(keyDownTimer.current);\n keyDownTimer.current = null;\n }\n if (e.key !== searchChars.current) {\n searchChars.current += e.key;\n }\n if (applyIncrementalSearch) {\n applySearch(true);\n }\n // keyDownTimer.current = window.setTimeout(applySearch, 100);\n keyDownTimer.current = window.setTimeout(() => {\n applySearch();\n }, 100);\n }\n }\n },\n [typeToNavigate, applyIncrementalSearch, highlightedIdx, applySearch]\n );\n\n return {\n onKeyDown: disableTypeToSelect ? undefined : handleKeyDown,\n };\n};\n", "import { MutableRefObject, RefObject, useCallback, useRef } from \"react\";\nimport { CollectionItem } from \"./collectionTypes\";\nimport { ResizeHandler, useResizeObserver } from \"../../common-hooks\";\nimport { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\n\nconst HeightOnly = [\"height\"];\nconst HeightWithScroll = [\"height\", \"scrollHeight\"];\nconst EMPTY_ARRAY: any[] = [];\n\nconst ObservedDimensions = {\n containerOnly: [HeightWithScroll, EMPTY_ARRAY],\n withContent: [HeightOnly, HeightOnly],\n};\nconst getObservedDimensions = (containerOnly: boolean) =>\n containerOnly\n ? ObservedDimensions.containerOnly\n : ObservedDimensions.withContent;\n\nconst NULL_REF = { current: null };\n\nconst getItemTop = (\n element: HTMLElement,\n offsetContainer: HTMLElement | null\n) => {\n const { transform = \"none\" } = getComputedStyle(element);\n if (transform.startsWith(\"matrix\")) {\n const pos = transform.lastIndexOf(\",\");\n return parseInt(transform.slice(pos + 1));\n } else {\n let offsetParent = element.offsetParent as HTMLElement;\n if (offsetParent === offsetContainer || offsetContainer === null) {\n return element.offsetTop;\n } else {\n let top = element.offsetTop;\n while (offsetParent !== null && offsetParent !== offsetContainer) {\n top += offsetParent.offsetTop;\n offsetParent = offsetParent.offsetParent as HTMLElement;\n }\n return top;\n }\n }\n};\n\nexport interface ViewportTrackingProps<Item> {\n containerRef: RefObject<HTMLElement>;\n contentRef?: RefObject<HTMLElement>;\n highlightedIdx?: number;\n indexPositions: CollectionItem<Item>[];\n stickyHeaders?: boolean;\n}\n\nexport interface ViewportTrackingResult<Item> {\n isScrolling: MutableRefObject<boolean>;\n scrollIntoView: (item: CollectionItem<Item>) => void;\n}\n\nexport const useViewportTracking = <Item>({\n containerRef,\n contentRef = NULL_REF,\n highlightedIdx = -1,\n indexPositions,\n stickyHeaders = false,\n}: ViewportTrackingProps<Item>): ViewportTrackingResult<Item> => {\n const scrolling = useRef<boolean>(false);\n const viewport = useRef({\n height: 0,\n contentHeight: 0,\n });\n\n const scrollTo = useCallback((scrollPos: number) => {\n scrolling.current = true;\n if (containerRef.current) {\n containerRef.current.scrollTop = scrollPos;\n }\n setTimeout(() => {\n scrolling.current = false;\n });\n }, []);\n\n const scrollToStart = useCallback(() => scrollTo(0), [scrollTo]);\n\n const scrollToEnd = useCallback(() => {\n scrollTo(viewport.current.contentHeight - viewport.current.height);\n }, [scrollTo]);\n\n const scrollIntoViewIfNeeded = useCallback(\n (item: CollectionItem<Item>) => {\n const offsetContainer = contentRef.current || containerRef.current;\n if (item.id) {\n const el = document.getElementById(item.id);\n if (el && containerRef.current) {\n const { height: viewportHeight } = viewport.current;\n const targetEl =\n el.ariaExpanded && el.firstChild\n ? (el.firstChild as HTMLElement)\n : el;\n const headerHeight = stickyHeaders ? 36 : 0;\n const itemTop = getItemTop(targetEl, offsetContainer);\n const itemHeight = targetEl.offsetHeight;\n const { scrollTop } = containerRef.current;\n const viewportStart = scrollTop + headerHeight;\n const viewportEnd = viewportStart + viewportHeight - headerHeight;\n\n if (itemTop + itemHeight > viewportEnd || itemTop < viewportStart) {\n const newScrollTop =\n itemTop + itemHeight > viewportEnd\n ? scrollTop + (itemTop + itemHeight) - viewportEnd\n : itemTop - headerHeight;\n\n scrollTo(newScrollTop);\n }\n }\n }\n },\n [containerRef, contentRef, scrollTo, stickyHeaders]\n );\n\n useIsomorphicLayoutEffect(() => {\n const { height, contentHeight } = viewport.current;\n const item = indexPositions[highlightedIdx];\n if (contentHeight > height && item) {\n const [firstItem] = indexPositions;\n const [lastItem] = indexPositions.slice(-1);\n if (item === firstItem) {\n scrollToStart();\n } else if (item === lastItem) {\n scrollToEnd();\n } else {\n scrollIntoViewIfNeeded(indexPositions[highlightedIdx]);\n }\n }\n }, [\n highlightedIdx,\n indexPositions,\n scrollIntoViewIfNeeded,\n scrollToEnd,\n scrollToStart,\n ]);\n\n const onContainerResize: ResizeHandler = useCallback(\n ({ height, scrollHeight }) => {\n if (typeof height === \"number\") {\n viewport.current.height = height;\n }\n if (typeof scrollHeight === \"number\") {\n viewport.current.contentHeight = scrollHeight;\n }\n },\n []\n );\n\n const onContentResize: ResizeHandler = useCallback(({ height }) => {\n if (typeof height === \"number\") {\n viewport.current.contentHeight = height;\n }\n }, []);\n\n // If we only have a container, then we will observe its height and scrollHeight,\n // contentRef will be null, so second call to observer will observe nothing.\n // If we have both container and content, then we observe the height of each.\n const [containerDimensions, contentDimensions] = getObservedDimensions(\n contentRef === NULL_REF\n );\n useResizeObserver(containerRef, containerDimensions, onContainerResize, true);\n useResizeObserver(contentRef, contentDimensions, onContentResize, true);\n\n return {\n isScrolling: scrolling,\n scrollIntoView: scrollIntoViewIfNeeded,\n };\n};\n", "import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\nexport const HeightOnly = [\"height\"];\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 element.clientHeight;\n case \"clientWidth\":\n return element.clientWidth;\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(element.scrollHeight);\n case \"scrollWidth\":\n return Math.ceil(element.scrollWidth);\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\nconst isScrollAttribute = {\n scrollHeight: true,\n scrollWidth: true,\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 (let [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: 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 return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n { width, height, contentHeight, contentWidth },\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 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 {\n isValidElement,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport {\n closestListItemIndex,\n hasSelection,\n CollectionItem,\n ListHandlers,\n selectedType,\n SelectHandler,\n SelectionChangeHandler,\n SelectionStrategy,\n useCollapsibleGroups,\n useKeyboardNavigation,\n useSelection,\n useTypeahead,\n useViewportTracking,\n} from \"./common-hooks\";\nimport { useDragDropNext as useDragDrop } from \"../drag-drop\";\n\nimport { ListHookProps, ListHookResult, ListControlProps } from \"./listTypes\";\n\nexport const useList = <Item, Selection extends SelectionStrategy = \"default\">({\n allowDragDrop = false,\n collapsibleHeaders,\n collectionHook: dataHook,\n containerRef,\n contentRef,\n defaultHighlightedIndex,\n defaultSelected,\n disabled,\n disableAriaActiveDescendant,\n disableHighlightOnFocus,\n disableTypeToSelect,\n highlightedIndex: highlightedIndexProp,\n id,\n label = \"\",\n listHandlers: listHandlersProp,\n onHighlight,\n onKeyboardNavigation,\n onKeyDown,\n onMoveListItem,\n onSelect,\n onSelectionChange,\n restoreLastFocus,\n selected,\n selectionStrategy,\n selectionKeys,\n stickyHeaders,\n tabToSelect,\n viewportRange,\n}: ListHookProps<Item, Selection>): ListHookResult<Item, Selection> => {\n type selectedItem = selectedType<Item, Selection>;\n\n // Used to preserve selection across a drop event.\n const selectedByIndexRef = useRef<number | null | number[]>(null);\n const lastSelection = useRef<typeof selected>(selected || defaultSelected);\n const handleKeyboardNavigation = (evt: KeyboardEvent, nextIndex: number) => {\n selectionHook.listHandlers.onKeyboardNavigation?.(evt, nextIndex);\n onKeyboardNavigation?.(evt, nextIndex);\n };\n\n // TODO where do these belong ?\n const handleSelect = useCallback<SelectHandler<CollectionItem<Item>>>(\n (evt, selectedItem) => {\n if (onSelect) {\n if (isValidElement(selectedItem.value)) {\n onSelect(evt, selectedItem.label as any);\n } else if (selectedItem.value !== null) {\n onSelect(evt, selectedItem.value);\n }\n }\n },\n [onSelect]\n );\n\n const handleSelectionChange = useCallback<\n SelectionChangeHandler<CollectionItem<Item>, Selection>\n >(\n (evt, selected) => {\n if (onSelectionChange) {\n onSelectionChange(\n evt,\n Array.isArray(selected)\n ? (selected.map((s) =>\n isValidElement(s.value) ? s.label : s.value\n ) as selectedItem)\n : selected &&\n ((isValidElement(selected.value)\n ? selected.label\n : selected.value) as any)\n );\n }\n },\n [onSelectionChange]\n );\n\n const {\n highlightedIndex,\n listProps: {\n onKeyDown: navigationKeyDown,\n onMouseMove: navigationMouseMove,\n ...navigationControlProps\n },\n setHighlightedIndex,\n ...keyboardHook\n } = useKeyboardNavigation<Item, Selection>({\n containerRef,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n highlightedIndex: highlightedIndexProp,\n indexPositions: dataHook.data,\n label,\n onHighlight,\n onKeyboardNavigation: handleKeyboardNavigation,\n restoreLastFocus,\n selected: lastSelection.current,\n });\n\n const collapsibleHook = useCollapsibleGroups({\n collapsibleHeaders,\n highlightedIdx: highlightedIndex,\n collectionHook: dataHook,\n });\n\n const handleDragStart = useCallback(() => {\n setHighlightedIndex(-1);\n }, [setHighlightedIndex]);\n\n const selectionHook = useSelection<Item, Selection>({\n defaultSelected,\n highlightedIdx: highlightedIndex,\n indexPositions: dataHook.data,\n label,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n selected,\n selectionStrategy,\n selectionKeys,\n tabToSelect,\n });\n\n const adjustIndex = useCallback(\n (item: CollectionItem<Item>, fromIndex: number, toIndex: number) => {\n const index = dataHook.data.indexOf(item);\n if (index === fromIndex) {\n return toIndex;\n } else if (\n index < Math.min(fromIndex, toIndex) ||\n index > Math.max(fromIndex, toIndex)\n ) {\n return index;\n }\n if (fromIndex < index) {\n return index - 1;\n } else {\n return index + 1;\n }\n },\n [dataHook.data]\n );\n\n // Used after a drop event, to calculate wht the new selected indices will be\n const reorderSelectedIndices = useCallback(\n (\n selected: CollectionItem<Item> | CollectionItem<Item>[],\n fromIndex: number,\n toIndex: number\n ) => {\n if (Array.isArray(selected)) {\n return selected.map((item) => adjustIndex(item, fromIndex, toIndex));\n } else {\n return adjustIndex(selected, fromIndex, toIndex);\n }\n },\n [adjustIndex]\n );\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n if (hasSelection(selectionHook.selected)) {\n selectedByIndexRef.current = reorderSelectedIndices(\n selectionHook.selected,\n fromIndex,\n toIndex\n );\n }\n onMoveListItem?.(fromIndex, toIndex);\n setHighlightedIndex(-1);\n },\n [\n selectionHook.selected,\n onMoveListItem,\n setHighlightedIndex,\n reorderSelectedIndices,\n ]\n );\n\n const handleDropSettle = useCallback(\n (toIndex: number) => {\n setHighlightedIndex(toIndex);\n },\n [setHighlightedIndex]\n );\n\n const { setSelected } = selectionHook;\n useEffect(() => {\n const { current: selectedByIndex } = selectedByIndexRef;\n if (hasSelection(selectedByIndex)) {\n const postDropSelected = Array.isArray(selectedByIndex)\n ? selectedByIndex.map((i) => dataHook.data[i])\n : dataHook.data[selectedByIndex];\n\n // TODO gave up trying to figure out how to type this correctly\n setSelected(postDropSelected as any);\n }\n }, [dataHook.data, setSelected]);\n\n useEffect(() => {\n if (hasSelection(lastSelection.current)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n setSelected(Array.isArray(lastSelection.current) ? [] : null);\n }\n }, [setSelected, dataHook.data]);\n\n const {\n onMouseDown,\n isDragging,\n isScrolling: isDragDropScrolling,\n ...dragDropHook\n } = useDragDrop({\n allowDragDrop,\n draggableClassName: \"list-item\",\n orientation: \"vertical\",\n containerRef,\n id,\n itemQuery: \".vuuListItem\",\n onDragStart: handleDragStart,\n onDrop: handleDrop,\n onDropSettle: handleDropSettle,\n // selected: selectionHook.selected,\n viewportRange,\n });\n\n const { onKeyDown: typeaheadOnKeyDown } = useTypeahead<Item>({\n disableTypeToSelect,\n highlightedIdx: highlightedIndex,\n highlightItemAtIndex: setHighlightedIndex,\n typeToNavigate: true,\n items: dataHook.data,\n });\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n if (!evt.defaultPrevented) {\n typeaheadOnKeyDown?.(evt);\n }\n // We still let the keyboard navigation hook process the event even\n // if it has been handled by the typeahead hook. That is so it can\n // correctly manage the focusVisible state.\n navigationKeyDown(evt);\n if (!evt.defaultPrevented) {\n selectionHook.listHandlers.onKeyDown?.(evt);\n }\n if (!evt.defaultPrevented) {\n collapsibleHook?.onKeyDown?.(evt);\n }\n\n if (!evt.defaultPrevented) {\n onKeyDown?.(evt);\n }\n },\n [\n collapsibleHook,\n navigationKeyDown,\n onKeyDown,\n selectionHook.listHandlers,\n typeaheadOnKeyDown,\n ]\n );\n\n // This is only appropriate when we are directly controlling a List,\n // not when a control is manipulating the list\n const { isScrolling: isViewportScrolling, scrollIntoView } =\n useViewportTracking({\n containerRef,\n contentRef,\n highlightedIdx: highlightedIndex,\n indexPositions: dataHook.data,\n stickyHeaders,\n });\n\n const isScrolling =\n isViewportScrolling.current || isDragDropScrolling.current;\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n if (!isScrolling && !disabled && !isDragging) {\n navigationMouseMove();\n const idx = closestListItemIndex(evt.target as HTMLElement);\n if (idx !== -1 && idx !== highlightedIndex) {\n const item = dataHook.data[idx];\n if (!item || item.disabled) {\n setHighlightedIndex(-1);\n } else {\n setHighlightedIndex(idx);\n }\n }\n }\n },\n [\n isDragging,\n isScrolling,\n disabled,\n setHighlightedIndex,\n navigationMouseMove,\n highlightedIndex,\n dataHook.data,\n ]\n );\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined ||\n highlightedIndex === -1 ||\n disableAriaActiveDescendant\n ? undefined\n : dataHook.data[highlightedIndex]?.id;\n\n // We need this on reEntry for navigation hook to handle focus\n lastSelection.current = selectionHook.selected;\n\n // controlProps ?\n const listControlProps: ListControlProps = {\n \"aria-activedescendant\": getActiveDescendant(),\n onBlur: navigationControlProps.onBlur,\n onFocus: navigationControlProps.onFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: onMouseDown,\n onMouseDownCapture: navigationControlProps.onMouseDownCapture,\n onMouseLeave: navigationControlProps.onMouseLeave,\n };\n\n const listHandlers: ListHandlers = listHandlersProp || {\n onClick: selectionHook.listHandlers.onClick,\n // MouseEnter would be much better for this. There is a bug in Cypress\n // wheby it emits spurious MouseEnter (and MouseOver) events around\n // keypress events, which break many tests.\n onMouseMove: handleMouseMove,\n };\n\n return {\n focusVisible: keyboardHook.focusVisible,\n controlledHighlighting: keyboardHook.controlledHighlighting,\n highlightedIndex,\n keyboardNavigation: keyboardHook.keyboardNavigation,\n listHandlers,\n listItemHeaderHandlers: collapsibleHook,\n listControlProps,\n scrollIntoView,\n selected: selectionHook.selected,\n setHighlightedIndex,\n setIgnoreFocus: keyboardHook.setIgnoreFocus,\n setSelected: selectionHook.setSelected,\n ...dragDropHook,\n };\n};\n", "import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { RefObject, useCallback, useMemo, useState } from \"react\";\nimport { HeightOnly, ResizeHandler, useResizeObserver } from \"../common-hooks\";\n\nexport interface ListHeightHookProps {\n borderless?: boolean;\n displayedItemCount: number;\n getItemHeight?: (index: number) => number;\n height?: number | string;\n itemCount: number;\n itemGapSize: number;\n itemHeight?: number;\n rootRef: RefObject<HTMLElement>;\n rowHeightRef: RefObject<HTMLElement | null>;\n}\n\nexport interface HeightHookResult {\n contentHeight: number;\n listClientHeight?: number;\n listItemHeight: number;\n listHeight: number | string;\n}\n\nconst getContentHeight = (\n itemCount: number,\n itemHeight: number,\n itemGapSize = 0\n) => {\n if (itemCount === 0) {\n return 0;\n } else if (itemGapSize === 0) {\n return itemCount * itemHeight;\n } else {\n return itemCount - 1 * (itemHeight + itemGapSize) + itemHeight;\n }\n};\n\nexport const useListHeight = ({\n borderless,\n displayedItemCount,\n getItemHeight,\n // TODO no need to incur the cost of a resizeObserver if height is explicit\n height,\n itemCount,\n itemGapSize,\n itemHeight: itemHeightProp,\n rootRef,\n rowHeightRef,\n}: ListHeightHookProps): HeightHookResult => {\n // TODO default by density\n const [measuredItemHeight, setMeasuredItemHeight] = useState<number>(36);\n const [clientHeight, setClientHeight] = useState<number>();\n\n const [contentHeight, listHeight] = useMemo(() => {\n let result = borderless ? 0 : 2;\n const itemHeight = itemHeightProp ?? measuredItemHeight;\n const contentHeight = getContentHeight(itemCount, itemHeight, itemGapSize);\n if (\n (height !== undefined && typeof height === \"number\") ||\n typeof height === \"string\"\n ) {\n // TODO if this is a percentage, convert to number\n return [contentHeight, height];\n }\n\n // if there are 0 items we render with the preferred count\n const preferredItemCount =\n Math.min(displayedItemCount, itemCount) || displayedItemCount;\n\n if (typeof getItemHeight === \"function\") {\n result +=\n Array(preferredItemCount)\n .fill(0)\n .reduce<number>(\n (total, _, index) => total + getItemHeight(index) + itemGapSize,\n 0\n ) -\n // We don't want gap after the last item\n itemGapSize;\n } else {\n result +=\n preferredItemCount * Number(itemHeight) +\n (preferredItemCount - 1) * itemGapSize;\n }\n\n const listHeight = result;\n\n return [contentHeight, listHeight, clientHeight];\n }, [\n borderless,\n clientHeight,\n displayedItemCount,\n getItemHeight,\n height,\n itemCount,\n itemGapSize,\n itemHeightProp,\n measuredItemHeight,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n if (rootRef.current) {\n const { clientHeight } = rootRef.current;\n setClientHeight(clientHeight);\n }\n }, [rootRef]);\n\n const handleRowHeight: ResizeHandler = useCallback(({ height }) => {\n if (typeof height === \"number\") {\n setMeasuredItemHeight(height);\n }\n }, []);\n\n useResizeObserver(rowHeightRef, HeightOnly, handleRowHeight, true);\n\n return {\n contentHeight,\n listClientHeight: clientHeight,\n listItemHeight: measuredItemHeight,\n listHeight,\n };\n};\n", "import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { UIEvent, useCallback, useMemo, useRef, useState } from \"react\";\n\nexport type ViewportRange = {\n atEnd: boolean;\n atStart: boolean;\n from: number;\n to: number;\n};\n\ninterface ScrollPositionHookProps {\n containerSize: number;\n itemCount: number;\n itemGapSize?: number;\n itemSize: number;\n onViewportScroll?: (\n firstVisibleItemIndex: number,\n lastVisibleitemIndex: number\n ) => void;\n}\n\nconst getRange = (\n scrollPos: number,\n height: number,\n itemCount: number,\n itemHeight: number\n): ViewportRange => {\n const viewportRowCount = Math.ceil(height / itemHeight);\n const from = Math.floor(scrollPos / itemHeight);\n const to = Math.ceil(from + viewportRowCount - 1);\n return {\n atStart: from === 0,\n atEnd: to === itemCount - 1,\n from,\n to,\n };\n};\n\nexport const useScrollPosition = ({\n containerSize: listHeight,\n itemCount: listItemCount,\n itemGapSize: listItemGapSize = 0,\n itemSize: listItemHeight,\n onViewportScroll,\n}: ScrollPositionHookProps) => {\n const firstVisibleRowRef = useRef(0);\n const lastVisibleRowRef = useRef(0);\n const scrollPosRef = useRef(0);\n\n const range = useMemo(() => {\n return getRange(\n scrollPosRef.current,\n listHeight,\n listItemCount,\n listItemHeight + listItemGapSize\n );\n }, [listHeight, listItemCount, listItemHeight, listItemGapSize]);\n\n const [viewportRange, setViewportRange] = useState<ViewportRange>(range);\n\n useIsomorphicLayoutEffect(() => {\n setViewportRange(range);\n }, [range]);\n\n const handleVerticalScroll = useCallback(\n (e: UIEvent<HTMLElement>) => {\n const scrollTop = (e.target as HTMLElement).scrollTop;\n if (scrollTop !== scrollPosRef.current) {\n scrollPosRef.current = scrollTop;\n const itemHeight = listItemHeight + listItemGapSize;\n const range = getRange(\n scrollTop,\n listHeight,\n listItemCount,\n itemHeight\n );\n if (\n range.from !== firstVisibleRowRef.current ||\n range.to !== lastVisibleRowRef.current\n ) {\n firstVisibleRowRef.current = range.from;\n lastVisibleRowRef.current = range.to;\n onViewportScroll?.(range.from, range.to);\n setViewportRange(range);\n }\n }\n },\n [\n listItemHeight,\n listItemGapSize,\n listHeight,\n listItemCount,\n onViewportScroll,\n ]\n );\n\n return {\n onVerticalScroll: handleVerticalScroll,\n viewportRange,\n };\n};\n", "import { makePrefixer, useForkRef, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { ForwardedRef, forwardRef, memo, ReactElement, useRef } from \"react\";\nimport {\n CollectionIndexer,\n isSelected,\n SelectionStrategy,\n useCollectionItems,\n useImperativeScrollingAPI,\n} from \"./common-hooks\";\nimport { useListHeight } from \"./useListHeight\";\n\nimport { ListItem as DefaultListItem, ListItemProxy } from \"./ListItem\";\nimport { ListProps } from \"./listTypes\";\nimport { useList } from \"./useList\";\nimport { Row, useVirtualization } from \"./useVirtualization\";\nimport { useScrollPosition } from \"./useScrollPosition\";\n\nimport \"./List.css\";\n\nconst defaultEmptyMessage = \"No data to display\";\n\nconst withBaseName = makePrefixer(\"saltList\");\n\nconst ListItem = memo(DefaultListItem);\n\nexport const VirtualizedList = forwardRef(function List<\n Item,\n Selection extends SelectionStrategy = \"default\"\n>(\n {\n borderless,\n children,\n className,\n collapsibleHeaders = false,\n defaultHighlightedIndex: defaultHighlightedIdx,\n defaultSelected,\n disabled: listDisabled = false,\n disableFocus = false,\n disableTypeToSelect,\n displayedItemCount = 10,\n emptyMessage,\n getItemHeight,\n getItemId,\n height,\n highlightedIndex: highlightedIdxProp,\n id: idProp,\n itemGapSize = 0,\n itemHeight: itemHeightProp,\n itemTextHighlightPattern,\n itemToString,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n onSelect,\n onSelectionChange,\n onViewportScroll,\n onHighlight,\n restoreLastFocus,\n selected: selectedProp,\n selectionStrategy,\n scrollingApiRef,\n // TODO do we still need these ?\n selectionKeys,\n showEmptyMessage = false,\n source,\n style: styleProp,\n stickyHeaders,\n tabToSelect,\n width,\n ...htmlAttributes\n }: ListProps<Item, Selection>,\n forwardedRef?: ForwardedRef<HTMLDivElement>\n) {\n const id = useIdMemo(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const rowHeightProxyRef = useRef<HTMLDivElement | null>(null);\n\n const collectionHook = useCollectionItems<Item>({\n id,\n label: \"List\",\n source,\n children,\n options: {\n collapsibleHeaders,\n getItemId,\n itemToString,\n },\n });\n\n const { contentHeight, listItemHeight, listHeight } = useListHeight({\n borderless,\n displayedItemCount,\n height,\n itemCount: collectionHook.data.length,\n itemGapSize,\n itemHeight: itemHeightProp,\n rootRef,\n rowHeightRef: rowHeightProxyRef,\n });\n\n const {\n focusVisible,\n highlightedIndex,\n listControlProps,\n listHandlers,\n scrollIntoView,\n selected,\n } = useList<Item, Selection>({\n collapsibleHeaders,\n collectionHook,\n containerRef: rootRef,\n defaultHighlightedIndex: defaultHighlightedIdx,\n defaultSelected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(defaultSelected),\n disabled: listDisabled,\n disableTypeToSelect,\n highlightedIndex: highlightedIdxProp,\n label: id,\n onSelect,\n onSelectionChange,\n onHighlight,\n restoreLastFocus,\n selected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(selectedProp),\n selectionStrategy,\n selectionKeys,\n stickyHeaders,\n tabToSelect,\n });\n\n const { onVerticalScroll, viewportRange } = useScrollPosition({\n containerSize: typeof listHeight === \"number\" ? listHeight : 0,\n itemCount: collectionHook.data.length,\n itemGapSize: itemGapSize,\n itemSize: listItemHeight,\n });\n\n console.log({ viewPortRange: viewportRange });\n\n // TODO move into useList\n const data = useVirtualization<Item>({\n data: collectionHook.data,\n listItemGapSize: itemGapSize,\n listItemHeight,\n viewportRange,\n });\n\n useImperativeScrollingAPI({\n collectionHook,\n forwardedRef: scrollingApiRef,\n scrollableRef: rootRef,\n scrollIntoView,\n });\n\n function addItem(\n list: ReactElement[],\n row: Row<Item>,\n idx: { value: number }\n ) {\n const [key, offset, pos, item] = row;\n const index = pos - 1;\n list.push(\n <ListItem\n aria-setsize={collectionHook.data.length}\n aria-posinset={pos}\n className={clsx(className, {\n saltHighlighted: index === highlightedIndex,\n saltFocusVisible: focusVisible === index,\n })}\n data-idx={index}\n item={item}\n key={key}\n label={item.label}\n data-offset={offset}\n role=\"option\"\n selected={isSelected<Item>(selected, item)}\n id={item.id}\n translate3d={offset}\n // style={{\n // transform: `translate3d(0px, ${offset}px, 0px)`\n // }}\n />\n );\n idx.value += 1;\n }\n\n function renderItems(\n data: Row<Item>[],\n idx: CollectionIndexer = { value: 0 },\n end = data.length\n ) {\n const listItems: ReactElement[] = [];\n while (idx.value < end) {\n const item = data[idx.value];\n addItem(listItems, item, idx);\n }\n return listItems;\n }\n\n function renderEmpty() {\n if (emptyMessage || showEmptyMessage) {\n return (\n <span className={withBaseName(\"empty-message\")}>\n {emptyMessage ?? defaultEmptyMessage}\n </span>\n );\n } else {\n return null;\n }\n }\n\n const renderContent = () => {\n if (data.length) {\n return renderItems(data);\n } else {\n renderEmpty();\n }\n };\n\n const sizeStyles = {\n \"--list-item-gap\": itemGapSize ? `${itemGapSize}px` : undefined,\n minWidth,\n minHeight,\n width: width ?? \"100%\",\n height: height ?? \"100%\",\n maxWidth: maxWidth ?? width,\n maxHeight: maxHeight ?? listHeight,\n };\n\n return (\n <div\n {...htmlAttributes}\n {...listHandlers}\n {...listControlProps}\n className={clsx(withBaseName(), className, withBaseName(\"virtualized\"))}\n id={`${id}`}\n ref={useForkRef<HTMLDivElement>(rootRef, forwardedRef)}\n role=\"listbox\"\n onScroll={onVerticalScroll}\n style={{ ...styleProp, ...sizeStyles }}\n tabIndex={listDisabled || disableFocus ? undefined : 0}\n >\n <div\n className={withBaseName(\"scrollingContentContainer\")}\n style={{ height: contentHeight }}\n >\n <ListItemProxy ref={rowHeightProxyRef} />\n {renderContent()}\n </div>\n </div>\n );\n}) as <Item = string, Selection extends SelectionStrategy = \"default\">(\n props: ListProps<Item, Selection> & {\n ref?: ForwardedRef<HTMLDivElement>;\n }\n) => ReactElement<ListProps<Item, Selection>>;\n", "function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;", "import { useMemo } from \"react\";\nimport { KeySet } from \"./keyset\";\nimport { CollectionItem } from \"./common-hooks\";\nimport { ViewportRange } from \"./useScrollPosition\";\n\n/**\n * [ item key, total height before the item, next row index, CollectionItem<Item>]\n * e.g. first item: [0, 0, 1, data[0]]\n */\nexport type Row<Item> = [number, number, number, CollectionItem<Item>];\n\nconst byKey = ([k1]: Row<unknown>, [k2]: Row<unknown>) => k1 - k2;\n\nconst renderBuffer = 5;\n\ninterface VirtualizationHookProps<Item> {\n data: CollectionItem<Item>[];\n listItemGapSize?: number;\n listItemHeight: number;\n viewportRange: ViewportRange;\n}\n\nexport const useVirtualization = <Item>({\n data,\n listItemGapSize = 0,\n listItemHeight,\n viewportRange,\n}: VirtualizationHookProps<Item>): Row<Item>[] => {\n const keys = useMemo(() => new KeySet(0, 1), []);\n const rowHeightWithGap = listItemHeight + listItemGapSize;\n const lo = Math.max(0, viewportRange.from - renderBuffer);\n const hi = Math.min(data.length, viewportRange.to + renderBuffer);\n keys.reset(lo, hi);\n const rows = data\n .slice(lo, hi)\n .map(\n (value, idx) =>\n [\n keys.keyFor(idx + lo),\n (idx + lo) * rowHeightWithGap,\n idx + lo + 1,\n value,\n ] as Row<Item>\n )\n .sort(byKey);\n\n return rows;\n};\n", "export class KeySet {\n private keys: Map<number, number>;\n private free: number[];\n private nextKeyValue: number;\n\n constructor(from = 0, to = 0) {\n this.keys = new Map<number, number>();\n this.free = [];\n this.nextKeyValue = 0;\n this.reset(from, to);\n }\n\n next(): number {\n if (this.free.length) {\n return this.free.pop()!;\n } else {\n return this.nextKeyValue++;\n }\n }\n\n reset(from: number, to: number) {\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\n const size = to - from;\n if (this.keys.size + this.free.length > size) {\n this.free.length = size - this.keys.size;\n }\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 }\n\n keyFor(rowIndex: number) {\n return this.keys.get(rowIndex);\n }\n}\n", "import { asReactElements, OverflowContainer, useId } from \"@vuu-ui/vuu-layout\";\nimport { Button } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport React, { useMemo, useRef } from \"react\";\nimport { TabProps, TabstripProps } from \"./TabsTypes\";\nimport { useTabstrip } from \"./useTabstrip\";\n\nimport \"./Tabstrip.css\";\n\nconst classBase = \"vuuTabstrip\";\n\nexport const Tabstrip = ({\n activeTabIndex: activeTabIndexProp,\n allowAddTab,\n allowCloseTab,\n allowDragDrop = false,\n allowRenameTab = false,\n animateSelectionThumb = false,\n children,\n className: classNameProp,\n id: idProp,\n keyBoardActivation = \"manual\",\n location,\n onActiveChange,\n onAddTab,\n onCloseTab,\n onExitEditMode,\n onMoveTab,\n orientation = \"horizontal\",\n showTabMenuButton,\n style: styleProp,\n ...htmlAttributes\n}: TabstripProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n activeTabIndex,\n focusVisible,\n containerStyle,\n draggedItemIndex,\n onClickAddTab,\n tabProps,\n ...tabstripHook\n } = useTabstrip({\n activeTabIndex: activeTabIndexProp,\n allowDragDrop,\n animateSelectionThumb,\n containerRef: rootRef,\n keyBoardActivation,\n onActiveChange,\n onAddTab,\n onCloseTab,\n onExitEditMode,\n onMoveTab,\n orientation,\n });\n\n const id = useId(idProp);\n const className = cx(classBase, `${classBase}-${orientation}`, classNameProp);\n const style =\n styleProp || containerStyle\n ? {\n ...styleProp,\n ...containerStyle,\n }\n : undefined;\n\n const tabs = useMemo(\n () =>\n asReactElements(children)\n .map((child, index) => {\n const {\n id: tabId = `${id}-tab-${index}`,\n closeable = allowCloseTab,\n editable = allowRenameTab,\n showMenuButton = showTabMenuButton,\n } = child.props;\n const selected = index === activeTabIndex;\n return React.cloneElement(child, {\n ...tabProps,\n ...tabstripHook.navigationProps,\n closeable,\n \"data-overflow-priority\": selected ? \"1\" : undefined,\n dragging: draggedItemIndex === index,\n editable,\n focusVisible: focusVisible === index,\n id: tabId,\n index,\n key: index,\n location,\n selected,\n showMenuButton,\n tabIndex: selected ? 0 : -1,\n } as Partial<TabProps>);\n })\n .concat(\n allowAddTab ? (\n <Button\n {...tabstripHook.navigationProps}\n aria-label=\"Create Tab\"\n className={`${classBase}-addTabButton`}\n data-icon=\"add\"\n data-overflow-priority=\"1\"\n key=\"addButton\"\n onClick={onClickAddTab}\n variant=\"secondary\"\n tabIndex={-1}\n />\n ) : (\n []\n )\n ),\n [\n activeTabIndex,\n allowAddTab,\n allowCloseTab,\n allowRenameTab,\n children,\n focusVisible,\n id,\n location,\n onClickAddTab,\n showTabMenuButton,\n tabProps,\n draggedItemIndex,\n tabstripHook.navigationProps,\n ]\n );\n\n return (\n <>\n <OverflowContainer\n {...htmlAttributes}\n {...tabstripHook.containerProps}\n className={className}\n height={28}\n id={id}\n orientation={orientation}\n overflowIcon=\"more-horiz\"\n ref={rootRef}\n style={style}\n >\n {tabs}\n </OverflowContainer>\n {tabstripHook.draggable}\n </>\n );\n};\n", "import type { MenuActionHandler } from \"@vuu-ui/vuu-data-types\";\nimport type { OverflowItem } from \"@vuu-ui/vuu-layout\";\nimport type { orientationType } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport { useDragDropNext as useDragDrop } from \"../drag-drop\";\nimport { isTabMenuOptions } from \"./TabMenuOptions\";\nimport { getIndexOfSelectedTab } from \"./tabstrip-dom-utils\";\nimport { useAnimatedSelectionThumb } from \"./useAnimatedSelectionThumb\";\nimport { useKeyboardNavigation } from \"./useKeyboardNavigation\";\nimport { useSelection } from \"./useSelection\";\n\nexport type ExitEditModeHandler = (\n originalValue: string,\n editedValue: string,\n allowDeactivation: boolean,\n tabIndex: number\n) => void;\n\nexport interface TabstripHookProps {\n activeTabIndex: number;\n allowDragDrop: boolean;\n animateSelectionThumb: boolean;\n containerRef: RefObject<HTMLElement>;\n onActiveChange?: (tabIndex: number) => void;\n onAddTab?: () => void;\n onCloseTab?: (tabIndex: number, newActiveTabIndex: number) => void;\n onExitEditMode?: ExitEditModeHandler;\n onMoveTab?: (fromIndex: number, toIndex: number) => void;\n orientation: orientationType;\n keyBoardActivation?: \"manual\" | \"automatic\";\n}\n\nconst editKeys = new Set([\"Enter\", \" \"]);\nconst isEditKey = (key: string) => editKeys.has(key);\n\nconst getElementWithIndex = (container: HTMLElement | null, index: number) => {\n if (container) {\n return container.querySelector(`[data-index=\"${index}\"]`) as HTMLElement;\n } else {\n return null;\n }\n};\n\nexport const useTabstrip = ({\n activeTabIndex: activeTabIndexProp,\n allowDragDrop,\n animateSelectionThumb,\n containerRef,\n onActiveChange,\n onAddTab,\n onCloseTab,\n onExitEditMode,\n onMoveTab,\n orientation,\n keyBoardActivation,\n}: TabstripHookProps) => {\n const lastSelection = useRef(activeTabIndexProp);\n\n const {\n focusTab: keyboardHookFocusTab,\n highlightedIdx,\n onClick: keyboardHookHandleClick,\n onKeyDown: keyboardHookHandleKeyDown,\n setHighlightedIdx: keyboardHookSetHighlightedIndex,\n ...keyboardHook\n } = useKeyboardNavigation({\n containerRef,\n keyBoardActivation,\n orientation,\n selectedIndex: lastSelection.current,\n });\n\n const {\n activateTab: selectionHookActivateTab,\n onClick: selectionHookHandleClick,\n onKeyDown: selectionHookHandleKeyDown,\n selected: selectionHookSelected,\n } = useSelection({\n highlightedIdx,\n onSelectionChange: onActiveChange,\n selected: activeTabIndexProp,\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 { containerStyle, resumeAnimation, suspendAnimation } =\n useAnimatedSelectionThumb(\n containerRef,\n animateSelectionThumb ? selectionHookSelected : -1,\n orientation\n );\n\n const handleDrop = useCallback(\n (fromIndex: number, toIndex: number) => {\n const { current: selected } = lastSelection;\n console.log(\n `useTabstrip handleDrop ${fromIndex} - ${toIndex} ${selected}`\n );\n onMoveTab?.(fromIndex, toIndex);\n let nextSelectedTab = -1;\n if (toIndex !== -1) {\n if (selected === fromIndex) {\n nextSelectedTab = toIndex;\n } else if (fromIndex > selected && toIndex <= selected) {\n nextSelectedTab = selected + 1;\n } else if (fromIndex < selected && toIndex >= selected) {\n nextSelectedTab = selected - 1;\n }\n if (nextSelectedTab !== -1) {\n suspendAnimation();\n selectionHookActivateTab(nextSelectedTab);\n requestAnimationFrame(resumeAnimation);\n }\n keyboardHookFocusTab(toIndex, false, false, 350);\n }\n },\n [\n keyboardHookFocusTab,\n onMoveTab,\n resumeAnimation,\n selectionHookActivateTab,\n suspendAnimation,\n ]\n );\n\n const { onMouseDown: dragDropHookHandleMouseDown, ...dragDropHook } =\n useDragDrop({\n allowDragDrop,\n containerRef,\n // this is for useDragDropNext\n draggableClassName: `tabstrip-${orientation}`,\n // extendedDropZone: overflowedItems.length > 0,\n onDrop: handleDrop,\n orientation: \"horizontal\",\n itemQuery: \".vuuOverflowContainer-item\",\n });\n\n const handleExitEditMode = useCallback<ExitEditModeHandler>(\n (originalValue, editedValue, allowDeactivation, tabIndex) => {\n console.log(\n `handleExitEditMode ${originalValue} ${editedValue} ${allowDeactivation} ${tabIndex}`\n );\n onExitEditMode?.(originalValue, editedValue, allowDeactivation, tabIndex);\n if (!allowDeactivation) {\n // this indicates that Enter or Esc key has been pressed, hence we\n // want to make sure keyboardHook treats this as a keyboard event\n // (and applies focusVisible). The last parameter here does that.\n keyboardHookFocusTab(tabIndex, false, true);\n }\n },\n [keyboardHookFocusTab, onExitEditMode]\n );\n\n const handleClick = useCallback(\n (evt: ReactMouseEvent<HTMLElement>, tabIndex: number) => {\n // releasing the mouse at end of drag will trigger a click, ignore those\n // if (!dragDropHook.isDragging) {\n keyboardHookHandleClick(evt, tabIndex);\n selectionHookHandleClick(evt, tabIndex);\n // }\n },\n // [dragDropHook.isDragging, keyboardHook, selectionHook]\n [keyboardHookHandleClick, selectionHookHandleClick]\n );\n\n const getEditableLabel = useCallback(\n (tabIndex = highlightedIdx) => {\n const targetEl = getElementWithIndex(containerRef.current, tabIndex);\n if (targetEl) {\n return targetEl.querySelector(\".vuuEditableLabel\") as HTMLElement;\n }\n },\n [containerRef, highlightedIdx]\n );\n\n const tabInEditMode = useCallback(\n (tabIndex = highlightedIdx) => {\n const editableLabel = getEditableLabel(tabIndex);\n if (editableLabel) {\n return editableLabel.classList.contains(\"vuuEditableLabel-editing\");\n }\n return false;\n },\n [getEditableLabel, highlightedIdx]\n );\n\n const editTab = useCallback(\n (tabIndex = highlightedIdx) => {\n const editableLabelEl = getEditableLabel(tabIndex);\n if (editableLabelEl) {\n const evt = new MouseEvent(\"dblclick\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n editableLabelEl.dispatchEvent(evt);\n }\n },\n [getEditableLabel, highlightedIdx]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n keyboardHookHandleKeyDown(evt);\n if (!evt.defaultPrevented) {\n selectionHookHandleKeyDown(evt);\n }\n if (!evt.defaultPrevented && isEditKey(evt.key)) {\n editTab();\n }\n },\n [editTab, keyboardHookHandleKeyDown, selectionHookHandleKeyDown]\n );\n\n const handleCloseTabFromMenu = useCallback(\n (tabIndex: number) => {\n const selectedTabIndex = getIndexOfSelectedTab(containerRef.current);\n const newActiveTabIndex =\n selectedTabIndex > tabIndex\n ? selectedTabIndex - 1\n : selectedTabIndex === tabIndex\n ? 0\n : selectedTabIndex;\n suspendAnimation();\n // containerRef.current?.classList.add(\"vuuTabThumb-noTransition\");\n onCloseTab?.(tabIndex, newActiveTabIndex);\n setTimeout(() => {\n resumeAnimation();\n // containerRef.current?.classList.remove(\"vuuTabThumb-noTransition\");\n }, 200);\n return true;\n },\n [containerRef, onCloseTab, resumeAnimation, suspendAnimation]\n );\n\n const handleRenameTabFromMenu = useCallback(\n (tabIndex: number) => {\n editTab(tabIndex);\n return true;\n },\n [editTab]\n );\n\n const handleTabMenuAction = useCallback<MenuActionHandler>(\n (action) => {\n if (isTabMenuOptions(action.options)) {\n switch (action.menuId) {\n case \"close-tab\":\n return handleCloseTabFromMenu(action.options.tabIndex);\n case \"rename-tab\":\n return handleRenameTabFromMenu(action.options.tabIndex);\n default:\n console.log(`tab menu action ${action.menuId}`);\n }\n }\n return false;\n },\n [handleCloseTabFromMenu, handleRenameTabFromMenu]\n );\n\n //TODO( why do we sometimes see this fired twice eg following rename)\n const handleTabMenuClose = useCallback(() => {\n if (!tabInEditMode()) {\n keyboardHookFocusTab(highlightedIdx);\n } else {\n keyboardHookSetHighlightedIndex(highlightedIdx);\n }\n }, [\n highlightedIdx,\n keyboardHookFocusTab,\n keyboardHookSetHighlightedIndex,\n tabInEditMode,\n ]);\n\n const onSwitchWrappedItemIntoView = useCallback(\n (item: OverflowItem) => {\n const index = parseInt(item.index);\n if (!isNaN(index)) {\n selectionHookActivateTab(index);\n }\n },\n [selectionHookActivateTab]\n );\n\n const navigationProps = {\n onFocus: keyboardHook.onFocus,\n onKeyDown: handleKeyDown,\n };\n\n const handleAddTabClick = useCallback(() => {\n onAddTab?.();\n requestAnimationFrame(() => {\n const selectedTabIndex = getIndexOfSelectedTab(containerRef.current);\n if (selectedTabIndex !== -1) {\n keyboardHookFocusTab(selectedTabIndex);\n }\n });\n }, [containerRef, keyboardHookFocusTab, onAddTab]);\n\n const tabProps = {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onExitEditMode: handleExitEditMode,\n onMenuAction: handleTabMenuAction,\n onMenuClose: handleTabMenuClose,\n onMouseDown: dragDropHookHandleMouseDown,\n };\n\n return {\n activeTabIndex: selectionHookSelected,\n containerStyle,\n focusVisible: keyboardHook.focusVisible,\n containerProps: {\n ...keyboardHook.containerProps,\n onSwitchWrappedItemIntoView,\n },\n navigationProps,\n onClickAddTab: handleAddTabClick,\n tabProps,\n ...dragDropHook,\n };\n};\n", "import { ContextMenuItemDescriptor } from \"packages/vuu-data-types\";\n\nexport type MenuOptions = { [key: string]: unknown };\n\nexport interface TabMenuOptions {\n tabIndex: number;\n}\n\nexport const isTabMenuOptions = (options: unknown): options is TabMenuOptions =>\n typeof options === \"object\" &&\n options !== null &&\n \"tabIndex\" in options &&\n typeof options.tabIndex === \"number\";\n\nexport const closeCommand = (options?: MenuOptions) =>\n ({\n label: `Close`,\n location: \"tab\",\n action: `close-tab`,\n options,\n } as ContextMenuItemDescriptor);\n\nexport const renameCommand = (options?: MenuOptions) =>\n ({\n label: `Rename`,\n location: \"tab\",\n action: `rename-tab`,\n options,\n } as ContextMenuItemDescriptor);\n", "export const getElementIndex = (el: HTMLElement | null) => {\n if (el) {\n const index = parseInt(el.dataset.index || \"\");\n if (!isNaN(index)) {\n return index;\n }\n }\n return -1;\n};\n\nconst getIndexOfItem = (container: HTMLElement | null, query: string) => {\n if (container) {\n const targetTab = container.querySelector(\n `[data-index]:has(${query})`\n ) as HTMLElement;\n return getElementIndex(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 { isValidNumber, MEASURES, orientationType } from \"@vuu-ui/vuu-utils\";\nimport { CSSProperties, RefObject, useCallback, useMemo, useRef } from \"react\";\n\nexport const useAnimatedSelectionThumb = (\n containerRef: RefObject<HTMLElement>,\n activeTabIndex: number,\n orientation: orientationType = \"horizontal\"\n) => {\n const animationSuspendedRef = useRef(false);\n const suspendAnimation = useCallback(() => {\n animationSuspendedRef.current = true;\n }, []);\n\n const resumeAnimation = useCallback(() => {\n animationSuspendedRef.current = false;\n }, []);\n\n const onTransitionEnd = useCallback(() => {\n containerRef.current?.style.setProperty(\"--tab-thumb-transition\", \"none\");\n containerRef.current?.removeEventListener(\"transitionend\", onTransitionEnd);\n }, [containerRef]);\n const lastSelectedRef = useRef(-1);\n return useMemo(() => {\n let offset = 0;\n let size = 0;\n if (lastSelectedRef.current !== -1) {\n const oldSelected =\n containerRef.current?.querySelector(\".vuuTab-selected\");\n const newSelected = containerRef.current?.querySelector(\n `[data-index=\"${activeTabIndex}\"] .vuuTab`\n );\n const { positionProp, sizeProp } = MEASURES[orientation];\n if (oldSelected && newSelected && !animationSuspendedRef.current) {\n const { [positionProp]: oldPosition, [sizeProp]: oldSize } =\n oldSelected.getBoundingClientRect();\n const { [positionProp]: newPosition } =\n newSelected.getBoundingClientRect();\n if (\n isValidNumber(oldPosition) &&\n isValidNumber(newPosition) &&\n isValidNumber(oldSize)\n ) {\n console.log({ orientation, positionProp, oldPosition, newPosition });\n offset = oldPosition - newPosition;\n size = oldSize;\n const speed = orientation === \"horizontal\" ? 1100 : 700;\n const duration = Math.abs(offset / speed);\n requestAnimationFrame(() => {\n containerRef.current?.style.setProperty(\n \"--tab-thumb-offset\",\n \"0px\"\n );\n containerRef.current?.style.setProperty(\"--tab-thumb-size\", \"100%\");\n containerRef.current?.style.setProperty(\n \"--tab-thumb-transition\",\n `all ${duration}s ease`\n );\n containerRef.current?.addEventListener(\n \"transitionend\",\n onTransitionEnd\n );\n });\n }\n }\n }\n lastSelectedRef.current = activeTabIndex;\n if (animationSuspendedRef.current) {\n return {\n containerStyle: {\n \"--tab-thumb-offset\": \"0px\",\n \"--tab-thumb-size\": \"100%\",\n } as CSSProperties,\n resumeAnimation,\n suspendAnimation,\n };\n } else {\n return {\n containerStyle: {\n \"--tab-thumb-offset\": `${offset}px`,\n \"--tab-thumb-size\": size ? `${size}px` : undefined,\n } as CSSProperties,\n resumeAnimation,\n suspendAnimation,\n };\n }\n }, [\n activeTabIndex,\n containerRef,\n orientation,\n onTransitionEnd,\n resumeAnimation,\n suspendAnimation,\n ]);\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport { getFocusableElement, orientationType } 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 \"./tabstrip-dom-utils\";\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 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 getElementByPosition = (container: HTMLElement | null, index: number) =>\n container\n ? (container.querySelector(`[data-index=\"${index}\"]`) as HTMLElement)\n : null;\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface TabstripNavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n keyBoardActivation?: \"manual\" | \"automatic\";\n orientation: orientationType;\n selectedIndex: number | null;\n}\n\ninterface TabstripNavigationHookResult {\n containerProps: ContainerNavigationProps;\n highlightedIdx: number;\n focusTab: (\n tabIndex: 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 setHighlightedIdx: (highlightedIndex: number) => void;\n}\n\nexport const useKeyboardNavigation = ({\n containerRef,\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n keyBoardActivation,\n orientation,\n selectedIndex: selectedTabIndex = 0,\n}: TabstripNavigationHookProps): TabstripNavigationHookResult => {\n const manualActivation = keyBoardActivation === \"manual\";\n const mouseClickPending = useRef(false);\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\n const [, forceRefresh] = useState({});\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 focusTab = useCallback(\n (\n tabIndex: 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 setHighlightedIdx(tabIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const element = getElementByPosition(containerRef.current, tabIndex);\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 === -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 } else {\n setTimeout(() => {\n // The selected tab will have tabIndex 0 make sure our internal state is aligned.\n if (focusedRef.current === -1 && selectedTabIndex !== null) {\n setHighlightedIdx(selectedTabIndex);\n }\n }, 200);\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 while (\n ((nextDirection === \"fwd\" && nextIdx < indexCount) ||\n (nextDirection === \"bwd\" && nextIdx > 0)) &&\n !isNonWrappedElement(\n getElementByPosition(containerRef.current, nextIdx)\n )\n ) {\n const newIdx = nextItemIdx(indexCount, nextDirection, nextIdx);\n if (newIdx === nextIdx) {\n break;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [containerRef, getIndexCount]\n );\n\n // forceFocusVisible supports an edge case - first or last Tab are clicked\n // then Left or Right Arrow keys are pressed, There will be no navigation\n // but focusVisible must be applied\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent, forceFocusVisible = false) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n if (manualActivation) {\n focusTab(nextIdx, immediateFocus);\n } else {\n // activateTab(newTabIndex);\n }\n } else if (forceFocusVisible) {\n forceRefresh({});\n }\n },\n [\n highlightedIdx,\n manualActivation,\n nextFocusableItemIdx,\n focusTab,\n orientation,\n ]\n );\n\n const highlightedTabHasMenu = 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 activateTabMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n const menuEl = el?.querySelector(\".vuuPopupMenu\") as HTMLElement;\n if (menuEl) {\n const evt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n menuEl.dispatchEvent(evt);\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, true);\n }\n } else if (isMenuActivationKey(e.key) && highlightedTabHasMenu()) {\n activateTabMenu();\n }\n },\n [\n activateTabMenu,\n getIndexCount,\n highlightedTabHasMenu,\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, tabIndex: number) => {\n setHighlightedIdx(tabIndex);\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 containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".vuuTabstrip\");\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 focusTab,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n setHighlightedIdx,\n };\n};\n", "import { useControlled } from \"@salt-ds/core\";\nimport { KeyboardEvent, MouseEvent, useCallback } from \"react\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport const isTabElement = (el: HTMLElement): boolean =>\n el && el.matches('[class*=\"vuuTab \"]');\n\n// TODO use SelectionProps\nexport const useSelection = ({\n defaultSelected,\n highlightedIdx,\n onSelectionChange,\n selected: selectedProp,\n}: {\n defaultSelected?: number;\n highlightedIdx: number;\n onSelectionChange?: (tabIndex: number) => void;\n selected?: number;\n}): {\n activateTab: (tabIndex: number) => void;\n isControlled: boolean;\n onClick: (evt: MouseEvent<Element>, tabIndex: number) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n selected: number;\n} => {\n const [selected, setSelected, isControlled] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? 0,\n name: \"Tabstrip\",\n state: \"value\",\n });\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => defaultSelectionKeys.includes(evt.key),\n []\n );\n\n const selectItem = useCallback(\n (tabIndex: number) => {\n setSelected(tabIndex);\n onSelectionChange?.(tabIndex);\n },\n [onSelectionChange, setSelected]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const targetElement = e.target as HTMLElement;\n if (\n isSelectionEvent(e) &&\n highlightedIdx !== selected &&\n isTabElement(targetElement)\n ) {\n e.stopPropagation();\n e.preventDefault();\n selectItem(highlightedIdx);\n }\n },\n [isSelectionEvent, highlightedIdx, selected, selectItem]\n );\n\n const onClick = useCallback(\n (e: MouseEvent, tabIndex: number) => {\n if (tabIndex !== selected) {\n selectItem(tabIndex);\n }\n },\n [selectItem, selected]\n );\n\n return {\n activateTab: selectItem,\n isControlled,\n onClick,\n onKeyDown: handleKeyDown,\n selected,\n };\n};\n", "// TODO close button needs to be a button. Hence tab needs to include 2 buttons\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { MenuActionHandler } from \"packages/vuu-data-types\";\nimport {\n FocusEvent,\n ForwardedRef,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n useCallback,\n useRef,\n} from \"react\";\nimport { EditableLabel, EditableLabelProps } from \"../editable-label\";\nimport { TabMenu } from \"./TabMenu\";\nimport { TabProps } from \"./TabsTypes\";\n\nimport \"./Tab.css\";\n\nconst classBase = \"vuuTab\";\n\nconst noop = () => undefined;\n\nexport const Tab = forwardRef(function Tab(\n {\n ariaControls,\n children,\n className,\n closeable = false,\n dragging,\n editable = false,\n editing,\n focusVisible,\n index = -1,\n label,\n location,\n onClick,\n onClose,\n onEnterEditMode = noop,\n onExitEditMode = noop,\n onFocus: onFocusProp,\n onKeyUp,\n onMenuAction,\n onMenuClose,\n orientation,\n selected,\n showMenuButton = closeable || editable,\n tabIndex,\n ...props\n }: TabProps,\n ref: ForwardedRef<HTMLDivElement>\n): ReactElement<TabProps> {\n if (showMenuButton && typeof onMenuAction !== \"function\") {\n throw Error(\"Tab onMenuAction must be provided if showMenuButton is set\");\n }\n\n const rootRef = useRef<HTMLDivElement>(null);\n const editableRef = useRef<HTMLDivElement>(null);\n const setForkRef = useForkRef(ref, rootRef);\n const handleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n if (!editing) {\n e.preventDefault();\n onClick?.(e, index);\n }\n },\n [editing, index, onClick]\n );\n\n const handleOnExitEditMode: EditableLabelProps[\"onExitEditMode\"] = (\n originalValue = \"\",\n editedValue = \"\",\n allowDeactivation = true\n ) => onExitEditMode(originalValue, editedValue, allowDeactivation, index);\n\n const handleKeyUp = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"Backspace\":\n case \"Delete\":\n if (closeable) {\n e.stopPropagation();\n onClose && onClose(index);\n }\n break;\n default:\n onKeyUp && onKeyUp(e, index);\n }\n };\n\n const getLabel = () => {\n if (editable) {\n return (\n <EditableLabel\n editing={editing}\n defaultValue={label}\n // Create a fresh instance after each edit, so it can be uncontrolled ...\n key={label}\n onEnterEditMode={onEnterEditMode}\n onExitEditMode={handleOnExitEditMode}\n ref={editableRef}\n />\n );\n } else {\n return label;\n }\n };\n\n const handleFocus = (evt: FocusEvent<HTMLElement>) => {\n if (editableRef.current) {\n const editable = editableRef.current as HTMLElement;\n const input = editable.querySelector(\n \".vuuEditableLabel-input\"\n ) as HTMLInputElement;\n input?.focus();\n }\n onFocusProp?.(evt);\n };\n\n return (\n <div\n {...props}\n aria-controls={ariaControls}\n aria-selected={selected}\n className={cx(classBase, {\n [`${classBase}-closeable`]: closeable,\n \"vuuDraggable-dragAway\": dragging,\n [`${classBase}-editing`]: editing,\n [`${classBase}-selected`]: selected || undefined,\n [`${classBase}-vertical`]: orientation === \"vertical\",\n [`vuuFocusVisible`]: focusVisible,\n })}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyUp={handleKeyUp}\n ref={setForkRef}\n role=\"tab\"\n tabIndex={tabIndex}\n >\n <div className={`${classBase}-main`}>\n <span\n className={`${classBase}-text`}\n // data-text is important, it determines the width of the tab. A pseudo\n // element assigns data-text as content. This is styled as selected tab\n // text. That means width of tab always corresponds to its selected state,\n // so tabs do not change size when selected (ie when the text is bolded).\n // Do not include if we have editable content, EditableLabel will determine\n // the width\n data-text={editable ? undefined : label}\n >\n {children ?? getLabel()}\n </span>\n </div>\n {showMenuButton ? (\n <TabMenu\n allowClose={closeable}\n allowRename={editable}\n location={location}\n onMenuAction={onMenuAction as MenuActionHandler}\n onMenuClose={onMenuClose}\n index={index}\n />\n ) : null}\n </div>\n );\n});\n", "import { PopupMenu } from \"@vuu-ui/vuu-popups\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"packages/vuu-data-types\";\nimport { useMemo } from \"react\";\nimport cx from \"classnames\";\n\nimport \"./TabMenu.css\";\nimport { closeCommand, MenuOptions, renameCommand } from \"./TabMenuOptions\";\n\nconst classBase = \"vuuTabMenu\";\n\nexport interface TabMenuProps {\n allowClose: boolean;\n allowRename: boolean;\n location?: string;\n onMenuAction: MenuActionHandler;\n onMenuClose?: () => void;\n index: number;\n}\n\nexport const TabMenu = ({\n allowClose,\n allowRename,\n location,\n onMenuAction,\n onMenuClose,\n index,\n}: TabMenuProps) => {\n const [menuBuilder, menuOptions] = useMemo(\n (): [MenuBuilder, MenuOptions] => [\n (_location, options) => {\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (allowRename) {\n menuItems.push(renameCommand(options as MenuOptions));\n }\n if (allowClose) {\n menuItems.push(closeCommand(options as MenuOptions));\n }\n return menuItems;\n },\n {\n tabIndex: index,\n },\n ],\n [allowClose, allowRename, index]\n );\n\n return (\n <PopupMenu\n className={classBase}\n menuBuilder={menuBuilder}\n menuActionHandler={onMenuAction}\n menuLocation={cx(\"tab\", location)}\n menuOptions={menuOptions}\n onMenuClose={onMenuClose}\n tabIndex={-1}\n />\n );\n};\n", "import { useForkRef, useIdMemo as useId } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n MouseEvent,\n useRef,\n} from \"react\";\nimport { closestListItemIndex } from \"./list-dom-utils\";\nimport { useItemsWithIds } from \"./use-items-with-ids\";\nimport {\n GroupSelection,\n groupSelectionEnabled,\n TreeNodeSelectionHandler,\n TreeSelection,\n} from \"./use-selection\";\nimport { useViewportTracking } from \"./use-viewport-tracking\";\nimport { useTree } from \"./useTree\";\n\nimport \"./Tree.css\";\n\nconst classBase = \"vuuTree\";\n\ntype Indexer = {\n value: number;\n};\n\nexport interface TreeSourceNode {\n id: string;\n icon?: string;\n header?: boolean;\n label: string;\n childNodes?: TreeSourceNode[];\n}\nexport interface NormalisedTreeSourceNode extends TreeSourceNode {\n childNodes?: NormalisedTreeSourceNode[];\n count: number;\n expanded?: boolean;\n index: number;\n level: number;\n}\n\nexport interface NonLeafNode extends NormalisedTreeSourceNode {\n childNodes: NormalisedTreeSourceNode[];\n}\n\nexport const isExpanded = (\n node: NormalisedTreeSourceNode\n): node is NonLeafNode => node.expanded === true;\n\nexport interface TreeNodeProps extends HTMLAttributes<HTMLLIElement> {\n idx?: number;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport const TreeNode = ({ children, idx, ...props }: TreeNodeProps) => {\n return <li {...props}>{children}</li>;\n};\n\nexport interface TreeProps extends HTMLAttributes<HTMLUListElement> {\n allowDragDrop?: boolean;\n defaultSelected?: any;\n groupSelection?: GroupSelection;\n onHighlight?: (index: number) => void;\n onSelectionChange: (selected: TreeSourceNode[]) => void;\n revealSelected?: boolean;\n selected?: string[];\n selection?: TreeSelection;\n source: TreeSourceNode[];\n}\n\nconst Tree = forwardRef(function Tree(\n {\n allowDragDrop,\n className,\n defaultSelected,\n groupSelection = \"none\",\n id: idProp,\n onHighlight,\n onSelectionChange,\n revealSelected,\n selected: selectedProp,\n selection = \"single\",\n source,\n ...htmlAttributes\n }: TreeProps,\n forwardedRef: ForwardedRef<HTMLUListElement>\n) {\n const id = useId(idProp);\n const rootRef = useRef<HTMLUListElement>(null);\n\n // returns the full source data\n const [, sourceWithIds, sourceItemById] = useItemsWithIds(source, id, {\n revealSelected: revealSelected\n ? selectedProp ?? defaultSelected ?? false\n : undefined,\n });\n\n const handleSelectionChange: TreeNodeSelectionHandler = (evt, selected) => {\n if (onSelectionChange) {\n const sourceItems = selected\n .map((id) => sourceItemById(id))\n .filter((sourceItem) => sourceItem !== undefined) as TreeSourceNode[];\n onSelectionChange(sourceItems);\n }\n };\n\n const {\n focusVisible,\n highlightedIdx,\n hiliteItemAtIndex,\n listProps,\n listItemHandlers,\n selected,\n visibleData,\n } = useTree({\n defaultSelected,\n groupSelection,\n onChange: handleSelectionChange,\n onHighlight,\n selected: selectedProp,\n selection,\n sourceWithIds,\n });\n\n // const isScrolling = useViewportTracking(root, highlightedIdx);\n useViewportTracking(rootRef, highlightedIdx);\n\n const defaultItemHandlers = {\n onMouseEnter: (evt: MouseEvent) => {\n // if (!isScrolling.current) {\n const targetEl = evt.target as HTMLElement;\n const idx = closestListItemIndex(targetEl);\n hiliteItemAtIndex(idx);\n // onMouseEnterListItem && onMouseEnterListItem(evt, idx);\n // }\n },\n };\n\n const propsCommonToAllListItems = {\n ...defaultItemHandlers,\n ...listItemHandlers,\n role: \"treeitem\",\n };\n const allowGroupSelect = groupSelectionEnabled(groupSelection);\n\n /**\n * Add a ListItem from source item\n */\n function addLeafNode(\n list: JSX.Element[],\n item: NormalisedTreeSourceNode,\n idx: Indexer\n ) {\n list.push(\n <TreeNode\n {...propsCommonToAllListItems}\n {...getListItemProps(item, idx, highlightedIdx, selected, focusVisible)}\n >\n {item.icon ? (\n <span className={`${classBase}Node-icon`} data-icon={item.icon} />\n ) : null}\n <span>{item.label}</span>\n </TreeNode>\n );\n idx.value += 1;\n }\n\n function addGroupNode(\n list: JSX.Element[],\n child: NormalisedTreeSourceNode,\n idx: Indexer,\n id: string,\n title: string\n ) {\n const { value: i } = idx;\n idx.value += 1;\n list.push(\n <TreeNode\n {...listItemHandlers}\n aria-expanded={child.expanded}\n aria-level={child.level}\n aria-selected={selected.includes(id) || undefined}\n className={cx(`${classBase}Node`, {\n focusVisible: focusVisible === i,\n [`${classBase}Node-toggle`]: !allowGroupSelect,\n })}\n data-idx={i}\n data-highlighted={i === highlightedIdx || undefined}\n data-selectable\n id={id}\n key={`header-${i}`}\n >\n {allowGroupSelect ? (\n <div className={`${classBase}Node-label`}>\n <span className={`${classBase}Node-toggle`} />\n {title}\n </div>\n ) : (\n <div className={`${classBase}Node-label`}>\n {child.icon ? (\n <span\n className={`${classBase}Node-icon`}\n data-icon={child.icon}\n />\n ) : null}\n <span>{title}</span>\n </div>\n )}\n <ul role=\"group\">\n {isExpanded(child) ? renderSourceContent(child.childNodes, idx) : \"\"}\n </ul>\n </TreeNode>\n );\n }\n\n function renderSourceContent(\n items: NormalisedTreeSourceNode[],\n idx = { value: 0 }\n ) {\n if (items?.length > 0) {\n const listItems: JSX.Element[] = [];\n for (const item of items) {\n if (item.childNodes) {\n addGroupNode(listItems, item, idx, item.id, item.label);\n } else {\n addLeafNode(listItems, item, idx);\n }\n }\n return listItems;\n }\n }\n\n return (\n <ul\n {...htmlAttributes}\n {...listProps}\n className={cx(classBase, className)}\n id={`Tree-${id}`}\n ref={useForkRef<HTMLUListElement>(rootRef, forwardedRef)}\n role=\"tree\"\n tabIndex={0}\n >\n {renderSourceContent(visibleData)}\n </ul>\n );\n});\n\nconst getListItemProps = (\n item: NormalisedTreeSourceNode,\n idx: Indexer,\n highlightedIdx: number,\n selected: string[],\n focusVisible: number,\n className?: string\n) => ({\n id: item.id,\n key: item.id,\n \"aria-level\": item.level,\n \"aria-selected\": selected.includes(item.id) || undefined,\n \"data-idx\": idx.value,\n \"data-highlighted\": idx.value === highlightedIdx || undefined,\n className: cx(\"vuuTreeNode\", className, {\n focusVisible: focusVisible === idx.value,\n }),\n});\n\nTree.displayName = \"Tree\";\nexport default Tree;\n", "export const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl: HTMLElement) {\n if (listItemEl) {\n let idx = listItemEl.dataset.idx;\n if (idx) {\n return parseInt(idx, 10);\n // eslint-disable-next-line no-cond-assign\n } else if ((idx = listItemEl.ariaPosInSet ?? \"-1\")) {\n return parseInt(idx, 10) - 1;\n }\n }\n}\n\nexport const listItemId = (el: HTMLElement | null) => el?.id;\n\nexport const closestListItem = (el: HTMLElement) =>\n el.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n", "import { useCallback, useMemo } from \"react\";\nimport { NormalisedTreeSourceNode, TreeSourceNode } from \"./Tree\";\n\nconst PathSeparators = new Set([\"/\", \"-\", \".\"]);\n// TODO where do we define or identify separators\nconst isPathSeparator = (char: string) => PathSeparators.has(char);\n\nconst isParentPath = (parentPath: string, childPath: string) =>\n childPath.startsWith(parentPath) &&\n isPathSeparator(childPath[parentPath.length]);\n\ntype Indexer = {\n index: number;\n};\n\ntype SourceItemById = (\n id: string,\n target?: NormalisedTreeSourceNode[]\n) => TreeSourceNode | undefined;\n\nexport const useItemsWithIds = (\n sourceProp: TreeSourceNode[],\n idRoot = \"root\",\n {\n collapsibleHeaders = undefined,\n defaultExpanded = false,\n revealSelected = false,\n } = {}\n): [number, NormalisedTreeSourceNode[], SourceItemById] => {\n const countChildItems = (\n item: TreeSourceNode,\n items: TreeSourceNode[],\n idx: number\n ) => {\n if (item.childNodes) {\n return item.childNodes.length;\n } else if (item.header) {\n let i = idx + 1;\n let count = 0;\n while (i < items.length && !items[i].header) {\n count++;\n i++;\n }\n return count;\n } else {\n return 0;\n }\n };\n\n const isExpanded = useCallback(\n (path) => {\n if (Array.isArray(revealSelected)) {\n return revealSelected.some((id) => isParentPath(path, id));\n }\n return defaultExpanded;\n },\n [defaultExpanded, revealSelected]\n );\n\n const normalizeItems = useCallback(\n (\n items: TreeSourceNode[],\n indexer: Indexer,\n level = 1,\n path = \"\",\n results: NormalisedTreeSourceNode[] = [],\n flattenedSource: TreeSourceNode[] = []\n ): [number, NormalisedTreeSourceNode[], TreeSourceNode[]] => {\n let count = 0;\n // TODO get rid of the Proxy\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `${i}`;\n const id = item.id ?? `${idRoot}-${childPath}`;\n\n const expanded = nonCollapsible ? undefined : isExpanded(id);\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: NormalisedTreeSourceNode = {\n ...item,\n childNodes: undefined,\n id,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n expanded,\n index: indexer.index,\n level,\n };\n results.push(normalisedItem);\n flattenedSource.push(items[i]);\n\n count += 1;\n indexer.index += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [childCount, children] = normalizeItems(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedSource\n );\n normalisedItem.childNodes = children;\n if (expanded === true || isNonCollapsibleGroupNode) {\n count += childCount;\n }\n }\n });\n return [count, results, flattenedSource];\n },\n [collapsibleHeaders, idRoot, isExpanded]\n );\n\n const [count, sourceWithIds, flattenedSource] = useMemo<\n [number, NormalisedTreeSourceNode[], TreeSourceNode[]]\n >(() => {\n return normalizeItems(sourceProp, { index: 0 });\n }, [normalizeItems, sourceProp]);\n\n const sourceItemById = useCallback<SourceItemById>(\n (id, target = sourceWithIds): TreeSourceNode | undefined => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id))\n );\n if (sourceWithId?.id === id) {\n return flattenedSource[sourceWithId.index];\n } else if (sourceWithId) {\n return sourceItemById(id, sourceWithId.childNodes);\n }\n },\n [flattenedSource, sourceWithIds]\n );\n\n return [count, sourceWithIds, sourceItemById];\n};\n", "import {\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nexport type TreeSelection =\n | \"none\"\n | \"single\"\n | \"checkbox\"\n | \"multi\"\n | \"extended\";\n\nexport const SINGLE = \"single\";\nexport const CHECKBOX = \"checkbox\";\nexport const MULTI = \"multi\";\nexport const EXTENDED = \"extended\";\n\nexport type GroupSelection = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nconst NO_HANDLERS = {};\n\nconst isCollapsibleItem = (item: NormalisedTreeSourceNode) =>\n item.expanded !== undefined;\n\nexport type TreeNodeSelectionHandler = (\n evt: SyntheticEvent,\n selected: string[]\n) => void;\n\nexport const groupSelectionEnabled = (groupSelection: GroupSelection) =>\n groupSelection && groupSelection !== \"none\";\n\nexport interface SelectionHookProps {\n defaultSelected?: string[];\n highlightedIdx: number;\n onChange: TreeNodeSelectionHandler;\n selected?: string[];\n selection: TreeSelection;\n selectionKeys?: string[];\n treeNodes: NormalisedTreeSourceNode[];\n}\n\nexport interface SelectionHookResult {\n listHandlers: {\n onKeyDown?: (evt: KeyboardEvent) => void;\n onKeyboardNavigation?: (evt: KeyboardEvent, currentIndex: number) => void;\n };\n listItemHandlers: {\n onClick?: (evt: MouseEvent) => void;\n };\n selected: string[];\n setSelected: (selected: string[]) => void;\n}\n\nexport const useSelection = ({\n defaultSelected,\n highlightedIdx,\n treeNodes,\n onChange,\n selected: selectedProp,\n selection = SINGLE,\n selectionKeys = defaultSelectionKeys,\n}: SelectionHookProps): SelectionHookResult => {\n const singleSelect = selection === SINGLE;\n const multiSelect = selection === MULTI || selection.startsWith(CHECKBOX);\n const extendedSelect = selection === EXTENDED;\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt) => selectionKeys.includes(evt.key),\n [selectionKeys]\n );\n\n const [selected, setSelected] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"selected\",\n });\n\n // const highlightedIdxRef = useRef();\n // highlightedIdxRef.current = highlightedIdx;\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n id: string,\n rangeSelect: boolean,\n preserveExistingSelection = false\n ) => {\n const { current: active } = lastActive;\n const isSelected = selected?.includes(id);\n const inactiveRange = active === -1;\n const actsLikeSingleSelect =\n singleSelect ||\n (extendedSelect &&\n !preserveExistingSelection &&\n (!rangeSelect || inactiveRange));\n const actsLikeMultiSelect =\n multiSelect ||\n (extendedSelect && preserveExistingSelection && !rangeSelect);\n\n let newSelected: string[] = [];\n if (actsLikeSingleSelect && isSelected) {\n newSelected = [];\n } else if (actsLikeSingleSelect) {\n newSelected = [id];\n } else if (actsLikeMultiSelect && isSelected) {\n newSelected = selected.filter((i) => i !== id);\n } else if (actsLikeMultiSelect) {\n newSelected = selected.concat(id);\n } else if (extendedSelect) {\n const [from, to] = idx > active ? [active, idx] : [idx, active];\n newSelected = selected.slice();\n for (let i = from; i <= to; i++) {\n const { id } = treeNodes[i];\n if (!selected.includes(id)) {\n newSelected.push(id);\n }\n }\n }\n setSelected(newSelected);\n if (onChange) {\n onChange(evt, newSelected);\n }\n },\n [\n extendedSelect,\n treeNodes,\n multiSelect,\n onChange,\n selected,\n setSelected,\n singleSelect,\n ]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n if (~highlightedIdx && isSelectionEvent(evt)) {\n evt.preventDefault();\n const item = treeNodes[highlightedIdx];\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item.id,\n false,\n evt.ctrlKey || evt.metaKey\n );\n if (extendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n },\n [\n extendedSelect,\n highlightedIdx,\n treeNodes,\n isSelectionEvent,\n selectItemAtIndex,\n ]\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (extendedSelect && evt.shiftKey) {\n const item = treeNodes[currentIndex];\n selectItemAtIndex(evt, currentIndex, item.id, true);\n }\n },\n [extendedSelect, treeNodes, selectItemAtIndex]\n );\n\n const listHandlers =\n selection === \"none\"\n ? NO_HANDLERS\n : {\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n if (highlightedIdx !== -1) {\n const item = treeNodes[highlightedIdx];\n if (!isCollapsibleItem(item)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item.id,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey\n );\n if (extendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n }\n },\n [extendedSelect, highlightedIdx, treeNodes, selectItemAtIndex]\n );\n\n const listItemHandlers =\n selection === \"none\"\n ? NO_HANDLERS\n : {\n onClick: handleClick,\n };\n\n return {\n listHandlers,\n listItemHandlers,\n selected,\n setSelected,\n };\n};\n", "import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { useResizeObserver } from \"../common-hooks\";\n\nconst HeightOnly = [\"height\", \"scrollHeight\"];\n\nexport const useViewportTracking = (\n root: RefObject<HTMLElement>,\n highlightedIdx: number,\n stickyHeaders = false\n) => {\n const scrollTop = useRef(0);\n const scrolling = useRef(false);\n const rootHeight = useRef(0);\n const rootScrollHeight = useRef(0);\n\n const scrollIntoView = useCallback(\n (el) => {\n const targetEl = el.ariaExpanded ? el.firstChild : el;\n const headerHeight = stickyHeaders ? 30 : 0;\n const t = targetEl.offsetTop;\n const h = targetEl.offsetHeight;\n const viewportStart = scrollTop.current + headerHeight;\n const viewportEnd = viewportStart + rootHeight.current - headerHeight;\n\n if (t + h > viewportEnd || t < viewportStart) {\n scrollTop.current =\n t + h > viewportEnd\n ? scrollTop.current + (t + h) - viewportEnd\n : t - headerHeight;\n\n scrolling.current = true;\n if (root.current) {\n root.current.scrollTop = scrollTop.current;\n }\n setTimeout(() => {\n scrolling.current = false;\n });\n }\n },\n [root, stickyHeaders]\n );\n\n const scrollHandler = useCallback((e) => {\n scrollTop.current = e.target.scrollTop;\n }, []);\n\n useEffect(() => {\n const { current: rootEl } = root;\n if (rootEl) {\n rootEl.addEventListener(\"scroll\", scrollHandler);\n }\n\n return () => {\n if (rootEl) {\n rootEl.removeEventListener(\"scroll\", scrollHandler);\n }\n };\n }, [root, scrollHandler]);\n\n useLayoutEffect(() => {\n if (\n highlightedIdx !== -1 &&\n rootScrollHeight.current > rootHeight.current\n ) {\n if (root.current) {\n const item = root.current.querySelector(`\n [data-idx='${highlightedIdx}'],\n [aria-posinset='${highlightedIdx + 1}']\n `);\n if (item === null) {\n console.log(\n \"[useViewportTracking], is this virtualised ? we're going to have to know rowHeight\"\n );\n } else {\n scrollIntoView(item);\n }\n }\n }\n }, [highlightedIdx, root, scrollIntoView]);\n\n useEffect(() => {\n // onsole.log('TODO measure the sticky header')\n }, [stickyHeaders]);\n\n const onResize = useCallback(({ height, scrollHeight }) => {\n rootHeight.current = height;\n rootScrollHeight.current = scrollHeight;\n }, []);\n\n useResizeObserver(root, HeightOnly, onResize, true);\n\n return scrolling;\n};\n", "import { KeyboardEvent, useCallback, useRef } from \"react\";\nimport { useKeyboardNavigation } from \"./use-keyboard-navigation\";\nimport {\n GroupSelection,\n TreeNodeSelectionHandler,\n TreeSelection,\n useSelection,\n} from \"./use-selection\";\nimport { useHierarchicalData } from \"./use-hierarchical-data\";\nimport { useCollapsibleGroups } from \"./use-collapsible-groups\";\nimport { useTreeKeyboardNavigation } from \"./use-tree-keyboard-navigation\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nconst EMPTY_ARRAY: string[] = [];\n\nexport interface TreeHookProps {\n defaultSelected?: string[];\n groupSelection: GroupSelection;\n onChange: TreeNodeSelectionHandler;\n onHighlight?: (index: number) => void;\n selected?: string[];\n selection: TreeSelection;\n sourceWithIds: NormalisedTreeSourceNode[];\n}\n\nexport const useTree = ({\n defaultSelected,\n sourceWithIds,\n onChange,\n onHighlight: onHighlightProp,\n selected: selectedProp,\n selection,\n}: TreeHookProps) => {\n const lastSelection = useRef<string[]>(EMPTY_ARRAY);\n const dataHook = useHierarchicalData(sourceWithIds);\n\n const handleKeyboardNavigation = (evt: KeyboardEvent, nextIdx: number) => {\n selectionHook.listHandlers.onKeyboardNavigation?.(evt, nextIdx);\n };\n\n const { highlightedIdx, ...keyboardHook } = useKeyboardNavigation({\n treeNodes: dataHook.indexPositions,\n onHighlight: onHighlightProp,\n onKeyboardNavigation: handleKeyboardNavigation,\n selected: lastSelection.current,\n });\n\n const collapsibleHook = useCollapsibleGroups({\n collapsibleHeaders: true,\n highlightedIdx,\n treeNodes: dataHook.indexPositions,\n setVisibleData: dataHook.setData,\n source: dataHook.data,\n });\n\n const selectionHook = useSelection({\n defaultSelected,\n highlightedIdx,\n treeNodes: dataHook.indexPositions,\n onChange,\n selected: selectedProp,\n selection,\n });\n\n const treeNavigationHook = useTreeKeyboardNavigation({\n source: dataHook.data,\n highlightedIdx,\n hiliteItemAtIndex: keyboardHook.hiliteItemAtIndex,\n indexPositions: dataHook.indexPositions,\n });\n\n const handleClick = useCallback(\n (evt) => {\n collapsibleHook.listItemHandlers?.onClick(evt);\n if (!evt.defaultPrevented) {\n selectionHook.listItemHandlers?.onClick?.(evt);\n }\n },\n [collapsibleHook, selectionHook]\n );\n\n const handleKeyDown = useCallback(\n (evt) => {\n keyboardHook.listProps.onKeyDown?.(evt);\n if (!evt.defaultPrevented) {\n selectionHook.listHandlers.onKeyDown?.(evt);\n }\n if (!evt.defaultPrevented) {\n collapsibleHook.listHandlers.onKeyDown?.(evt);\n }\n if (!evt.defaultPrevented) {\n treeNavigationHook.listHandlers.onKeyDown?.(evt);\n }\n },\n [\n collapsibleHook.listHandlers,\n keyboardHook.listProps,\n selectionHook.listHandlers,\n treeNavigationHook.listHandlers,\n ]\n );\n\n const getActiveDescendant = () =>\n highlightedIdx === undefined || highlightedIdx === -1\n ? undefined\n : dataHook.indexPositions[highlightedIdx]?.id;\n\n // We need this on reEntry for navigation hook to handle focus\n lastSelection.current = selectionHook.selected;\n\n const listProps = {\n \"aria-activedescendant\": getActiveDescendant(),\n onBlur: keyboardHook.listProps.onBlur,\n onFocus: keyboardHook.listProps.onFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: keyboardHook.listProps.onMouseDownCapture,\n onMouseLeave: keyboardHook.listProps.onMouseLeave,\n onMouseMove: keyboardHook.listProps.onMouseMove,\n };\n\n const listItemHandlers = {\n onClick: handleClick,\n };\n\n return {\n focusVisible: keyboardHook.focusVisible,\n highlightedIdx,\n hiliteItemAtIndex: keyboardHook.hiliteItemAtIndex,\n listProps,\n listItemHandlers,\n selected: selectionHook.selected,\n visibleData: dataHook.data,\n };\n};\n", "import { KeyboardEvent, useCallback, useMemo, useRef } from \"react\";\nimport { getIndexOfNode, getNodeById } from \"./hierarchical-data-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { ArrowDown, ArrowLeft, ArrowUp, isNavigationKey } from \"./key-code\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === ArrowUp || key === ArrowLeft) {\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 isLeaf = (item: NormalisedTreeSourceNode) =>\n !item.header && !item.childNodes;\nconst isFocusable = (item: NormalisedTreeSourceNode) =>\n isLeaf(item) || item.expanded !== undefined;\n\nexport interface KeyboardNavigationHookProps {\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n onHighlight?: (highlightedIdx: number) => void;\n onKeyboardNavigation?: (evt: KeyboardEvent, nextIdx: number) => void;\n selected: string[];\n treeNodes: NormalisedTreeSourceNode[];\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = ({\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n treeNodes,\n onHighlight,\n onKeyboardNavigation,\n selected = [],\n}: KeyboardNavigationHookProps) => {\n const { bwd: ArrowBwd, fwd: ArrowFwd } = useMemo(\n () => ({\n bwd: ArrowUp,\n fwd: ArrowDown,\n }),\n []\n );\n\n const [highlightedIdx, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"highlightedIdx\",\n });\n\n const setHighlightedIndex = useCallback(\n (idx) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n },\n [onHighlight, setHighlightedIdx]\n );\n\n const nextFocusableItemIdx = useCallback(\n (key = ArrowFwd, idx = key === ArrowFwd ? -1 : treeNodes.length) => {\n let nextIdx = nextItemIdx(treeNodes.length, key, idx);\n while (\n nextIdx !== -1 &&\n ((key === ArrowFwd && nextIdx < treeNodes.length) ||\n (key === ArrowBwd && nextIdx > 0)) &&\n !isFocusable(treeNodes[nextIdx])\n ) {\n nextIdx = nextItemIdx(treeNodes.length, key, nextIdx);\n }\n return nextIdx;\n },\n [ArrowBwd, ArrowFwd, treeNodes]\n );\n\n // does this belong here or should it be a method passed in?\n const keyBoardNavigation = useRef(true);\n const ignoreFocus = useRef(false);\n const setIgnoreFocus = (value: boolean) => (ignoreFocus.current = value);\n\n const handleFocus = useCallback(() => {\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else if (selected.length > 0) {\n const node = getNodeById(treeNodes, selected[0]);\n if (node) {\n const idx = getIndexOfNode(treeNodes, node);\n setHighlightedIndex(idx);\n }\n } else {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }, [treeNodes, nextFocusableItemIdx, selected, setHighlightedIndex]);\n\n const navigateChildItems = useCallback(\n (e) => {\n const nextIdx = nextFocusableItemIdx(e.key, highlightedIdx);\n if (nextIdx !== highlightedIdx) {\n setHighlightedIndex(nextIdx);\n // What exactly is the point of this ?\n onKeyboardNavigation?.(e, nextIdx);\n }\n },\n [\n highlightedIdx,\n nextFocusableItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (treeNodes.length > 0 && isNavigationKey(e, \"vertical\")) {\n e.preventDefault();\n e.stopPropagation();\n keyBoardNavigation.current = true;\n navigateChildItems(e);\n }\n },\n [treeNodes, navigateChildItems]\n );\n\n const listProps = useMemo(\n () => ({\n onBlur: () => {\n setHighlightedIndex(-1);\n },\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyBoardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n // SHould this be here - this is not strictly keyboard nav\n onMouseMove: () => {\n if (keyBoardNavigation.current) {\n keyBoardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyBoardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [handleFocus, handleKeyDown, setHighlightedIndex]\n );\n\n return {\n focusVisible: keyBoardNavigation.current ? highlightedIdx : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIdx,\n hiliteItemAtIndex: setHighlightedIndex,\n keyBoardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n", "import { NonLeafNode, NormalisedTreeSourceNode } from \"./Tree\";\n\nexport const getNodeParentPath = ({ id }: NormalisedTreeSourceNode) => {\n let pos = id.lastIndexOf(\"-\");\n if (pos !== -1) {\n // using the built-in hierarchical id scheme\n // rootId-n-n.n\n const path = id.slice(pos + 1);\n const steps = path.split(\".\");\n if (steps.length === 1) {\n return null;\n } else {\n steps.pop();\n return `${id.slice(0, pos)}-${steps.join(\".\")}`;\n }\n } else if ((pos = id.lastIndexOf(\"/\")) !== -1) {\n // using a path scheme step/step/step\n return id.slice(0, pos);\n }\n};\n\nexport const isGroupNode = (node: NormalisedTreeSourceNode) =>\n node.childNodes !== undefined;\nexport const isCollapsibleGroupNode = (node: NormalisedTreeSourceNode) =>\n isGroupNode(node) && node.expanded !== undefined;\nexport const isHeader = (node: NormalisedTreeSourceNode) =>\n node.header === true;\n\nconst PATH_SEPARATORS = new Set([\".\", \"/\"]);\n\nconst isDescendantOf = (\n node: NormalisedTreeSourceNode,\n targetPath: string\n): node is NonLeafNode => {\n if (!targetPath.startsWith(node.id)) {\n return false;\n } else {\n return PATH_SEPARATORS.has(targetPath.charAt(node.id.length));\n }\n};\n\nexport const getNodeById = (\n nodes: NormalisedTreeSourceNode[],\n id: string\n): NormalisedTreeSourceNode | undefined => {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n } else if (isDescendantOf(node, id)) {\n return getNodeById(node.childNodes, id);\n }\n }\n};\n\nexport const getIndexOfNode = (\n treeNodes: NormalisedTreeSourceNode[],\n node: NormalisedTreeSourceNode\n) => {\n const id = typeof node === \"string\" ? node : node.id;\n for (let i = 0; i < treeNodes.length; i++) {\n if (treeNodes[i].id === id) {\n return i;\n }\n }\n};\n\nexport const replaceNode = (\n nodes: NormalisedTreeSourceNode[],\n id: string,\n props: Partial<NormalisedTreeSourceNode>\n): NormalisedTreeSourceNode[] => {\n let childNodes;\n const newNodes = nodes.map((node) => {\n if (node.id === id) {\n return {\n ...node,\n ...props,\n };\n } else if (isDescendantOf(node, id)) {\n childNodes = replaceNode(node.childNodes, id, props);\n return {\n ...node,\n childNodes,\n };\n } else {\n return node;\n }\n });\n\n return newNodes;\n};\n", "import { KeyboardEvent } from \"react\";\n\nfunction union(set1: Set<string>, ...sets: Set<string>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const Backspace = \"Backspace\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Delete = \"Delete\";\n\nconst actionKeys = new Set([Enter, Delete]);\nconst focusKeys = new Set([\"Tab\"]);\n// const navigationKeys = new Set([\"Home\", \"End\", \"ArrowRight\", \"ArrowLeft\",\"ArrowDown\", \"ArrowUp\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst verticalNavigationKeys = new Set([\"Home\", \"End\", \"ArrowDown\", \"ArrowUp\"]);\nconst horizontalNavigationKeys = new Set([\n \"Home\",\n \"End\",\n \"ArrowRight\",\n \"ArrowLeft\",\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n horizontalNavigationKeys,\n verticalNavigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys\n);\nexport const isCharacterKey = (evt: KeyboardEvent) => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which !== 8;\n }\n};\n\nexport const isNavigationKey = (\n { key }: KeyboardEvent,\n orientation = \"vertical\"\n) => {\n const navigationKeys =\n orientation === \"vertical\"\n ? verticalNavigationKeys\n : horizontalNavigationKeys;\n return navigationKeys.has(key);\n};\n", "import { useRef, useState } from \"react\";\nimport { isGroupNode, isHeader } from \"./hierarchical-data-utils\";\nimport { isExpanded, NormalisedTreeSourceNode } from \"./Tree\";\n\nconst populateIndices = (\n nodes: NormalisedTreeSourceNode[],\n results: NormalisedTreeSourceNode[] = [],\n idx = { value: 0 }\n) => {\n let skipToNextHeader = false;\n for (const node of nodes) {\n if (skipToNextHeader && !isHeader(node)) {\n continue;\n } else {\n results[idx.value] = node;\n idx.value += 1;\n skipToNextHeader = false;\n if (isHeader(node) && node.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(node)) {\n if (isExpanded(node)) {\n populateIndices(node.childNodes, results, idx);\n }\n }\n }\n }\n return results;\n};\n\n//TODO return a read-only data structure\n// Question: is source changes at runtime, do we lose any current state ?\nexport const useHierarchicalData = (source: NormalisedTreeSourceNode[]) => {\n // console.log(`%c[useHierarchicalData<${label}>] entry`, 'color: green; font-weight: bold;');\n\n const externalSource = useRef(source);\n const statefulSource = useRef(source);\n const indexPositions = useRef(populateIndices(source));\n const [, forceUpdate] = useState({});\n\n // Maintain a mapping between nodes and their current index position within the rendered list.\n // This index position is liable to change with every expand/collapse operation. We require this\n // when handling keyboard events - these are List level, not listItem level, so we depend on the\n\n // Client needs to be careful source is not recreated inadvertently on each render\n if (source !== externalSource.current) {\n // console.log(\n // `%cuseHierarchicalData source has changed`,\n // 'color:red;font-weight: bold;',\n // externalSource.current,\n // source\n // );\n externalSource.current = source;\n // we might want to try and merge existing state here ?\n statefulSource.current = source;\n indexPositions.current = populateIndices(source);\n }\n\n const setData = (value: NormalisedTreeSourceNode[]) => {\n statefulSource.current = value;\n indexPositions.current = populateIndices(value);\n // console.log(\n // `data set in ${label} (${indexPositions.current.length} visible items)`,\n // indexPositions.current.map((i) => ({ index: i.index, label: i.label }))\n // );\n forceUpdate({});\n };\n\n return {\n // data, // do we actually use the data anywhere\n data: statefulSource.current,\n indexPositions: indexPositions.current,\n setData,\n };\n};\n", "import { KeyboardEvent, MouseEvent, useCallback, useRef } from \"react\";\nimport { closestListItem } from \"./list-dom-utils\";\nimport { ArrowLeft, ArrowRight, Enter } from \"./key-code\";\nimport { getNodeById, replaceNode } from \"./hierarchical-data-utils\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nconst NO_HANDLERS: CollapsibleHookResult[\"listHandlers\"] = {};\nconst isToggleElement = (element: HTMLElement) =>\n element && element.hasAttribute(\"aria-expanded\");\n\nexport interface CollapsibleGroupsHookProps {\n collapsibleHeaders?: boolean;\n highlightedIdx: number;\n treeNodes: NormalisedTreeSourceNode[];\n setVisibleData: (nodes: NormalisedTreeSourceNode[]) => void;\n source: NormalisedTreeSourceNode[];\n}\n\nexport interface CollapsibleHookResult {\n listHandlers: {\n onKeyDown?: (e: KeyboardEvent) => void;\n };\n listItemHandlers: {\n onClick: (e: MouseEvent) => void;\n };\n}\n\nexport const useCollapsibleGroups = ({\n collapsibleHeaders,\n highlightedIdx,\n treeNodes,\n setVisibleData,\n source,\n}: CollapsibleGroupsHookProps): CollapsibleHookResult => {\n const fullSource = useRef<NormalisedTreeSourceNode[]>(source);\n const stateSource = useRef<NormalisedTreeSourceNode[]>(fullSource.current);\n\n const setSource = useCallback(\n (value) => {\n setVisibleData((stateSource.current = value));\n },\n [setVisibleData]\n );\n\n const expandNode = useCallback(\n (nodeList: NormalisedTreeSourceNode[], { id }: NormalisedTreeSourceNode) =>\n replaceNode(nodeList, id, { expanded: true }),\n []\n );\n\n const collapseNode = useCallback(\n (nodeList, { id }) => replaceNode(nodeList, id, { expanded: false }),\n []\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === ArrowRight || e.key === Enter) {\n const node = treeNodes[highlightedIdx];\n if (node) {\n if (node.expanded === false) {\n e.preventDefault();\n setSource(expandNode(stateSource.current, node));\n }\n }\n }\n\n if (e.key === ArrowLeft || e.key === Enter) {\n const node = treeNodes[highlightedIdx];\n if (node) {\n if (node.expanded) {\n e.preventDefault();\n setSource(collapseNode(stateSource.current, node));\n }\n }\n }\n },\n [collapseNode, expandNode, highlightedIdx, treeNodes, setSource]\n );\n\n /**\n * These are List handlers, so we will not have reference to the actual node\n * element. We must rely on highlightedIdx to tell us which node is interactive.\n */\n const listHandlers = collapsibleHeaders\n ? {\n onKeyDown: handleKeyDown,\n }\n : NO_HANDLERS;\n\n const handleClick = useCallback(\n (evt) => {\n const el = closestListItem(evt.target);\n if (isToggleElement(el)) {\n evt.stopPropagation();\n evt.preventDefault();\n const node = getNodeById(source, el.id);\n if (node?.expanded === false) {\n setSource(expandNode(source, node));\n } else if (node?.expanded === true) {\n setSource(collapseNode(source, node));\n }\n }\n },\n [collapseNode, expandNode, setSource, source]\n );\n\n const listItemHandlers = {\n onClick: handleClick,\n };\n\n return {\n listHandlers,\n listItemHandlers,\n };\n};\n", "import { useCallback } from \"react\";\nimport { ArrowLeft } from \"./key-code\";\nimport {\n getNodeById,\n getNodeParentPath,\n getIndexOfNode,\n} from \"./hierarchical-data-utils\";\nimport { NormalisedTreeSourceNode } from \"./Tree\";\n\nexport interface TreeKeyboardNavigationHookProps {\n highlightedIdx: number;\n hiliteItemAtIndex: (idx: number) => void;\n indexPositions: NormalisedTreeSourceNode[];\n source: NormalisedTreeSourceNode[];\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useTreeKeyboardNavigation = ({\n highlightedIdx,\n hiliteItemAtIndex,\n indexPositions,\n source,\n}: TreeKeyboardNavigationHookProps) => {\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === ArrowLeft) {\n const node = indexPositions[highlightedIdx];\n const parentId = getNodeParentPath(node);\n if (parentId) {\n e.preventDefault();\n const parentNode = getNodeById(source, parentId);\n if (parentNode) {\n const idx = getIndexOfNode(indexPositions, parentNode);\n if (idx !== undefined) {\n hiliteItemAtIndex(idx);\n }\n }\n }\n }\n },\n [highlightedIdx, hiliteItemAtIndex, indexPositions, source]\n );\n\n const listHandlers = {\n onKeyDown: handleKeyDown,\n };\n\n return {\n listHandlers,\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: \"salt\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, string];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"salt\",\n \"salt-density-high\",\n \"light\",\n];\n\nexport const useThemeAttributes = (): [string, string, string] => {\n const context = useContext(ThemeContext);\n if (context) {\n return [\n `${context.theme}-theme`,\n `salt-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 { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button, FormField, FormFieldLabel, Input } from \"@salt-ds/core\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n requirePassword?: boolean;\n}\n\nexport const LoginPanel = ({\n requirePassword = true,\n onSubmit,\n}: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\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 dataIsValid =\n username.trim() !== \"\" &&\n (requirePassword === false || password.trim() !== \"\");\n\n return (\n <div className={classBase}>\n <FormField style={{ width: 200 }}>\n <FormFieldLabel>Username</FormFieldLabel>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n {requirePassword ? (\n <FormField style={{ width: 200 }}>\n <FormFieldLabel>Password</FormFieldLabel>\n <Input\n inputProps={{\n type: \"password\",\n }}\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\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 );\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 {\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 { connectToServer } from \"@vuu-ui/vuu-data\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { useLayoutConfig } from \"./layout-config\";\nimport { DraggableLayout, LayoutProvider } from \"@vuu-ui/vuu-layout\";\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { AppHeader } from \"./app-header\";\nimport { ThemeMode, ThemeProvider, useThemeAttributes } from \"./theme-provider\";\nimport { logger } from \"@vuu-ui/vuu-utils\";\nimport { useShellLayout } from \"./shell-layouts\";\nimport { SaveLocation } from \"./shellTypes\";\n\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst { error } = logger(\"Shell\");\n\nconst warningLayout = {\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 interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\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 children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\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 layoutId = useRef(\"latest\");\n const [layout, saveLayoutConfig, loadLayoutById] = useLayoutConfig({\n defaultLayout,\n saveLocation,\n user,\n });\n\n const handleLayoutChange = useCallback(\n (layout) => {\n try {\n saveLayoutConfig(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\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 shellLayout = useShellLayout({\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 leftSidePanel,\n });\n\n return (\n // ShellContext TBD\n <ThemeProvider>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode={dataMode}\n ref={rootRef}\n {...htmlAttributes}\n >\n {shellLayout}\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ThemeProvider>\n );\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { SaveLocation } from \"../shellTypes\";\nimport { loadLocalConfig, saveLocalConfig } from \"./local-config\";\nimport { loadRemoteConfig, saveRemoteConfig } from \"./remote-config\";\n\nexport interface LayoutConfigHookProps {\n defaultLayout: LayoutJSON;\n saveLocation: SaveLocation;\n saveUrl?: string;\n user: VuuUser;\n}\n\nexport type LayoutHookResult = [\n LayoutJSON,\n (layout: LayoutJSON) => void,\n (id: string) => void\n];\n\nexport const useLayoutConfig = ({\n saveLocation,\n saveUrl = \"api/vui\",\n user,\n defaultLayout,\n}: LayoutConfigHookProps): LayoutHookResult => {\n const [layout, _setLayout] = useState(defaultLayout);\n const usingRemote = saveLocation === \"remote\";\n const loadConfig = usingRemote ? loadRemoteConfig : loadLocalConfig;\n const saveConfig = usingRemote ? saveRemoteConfig : saveLocalConfig;\n\n const load = useCallback(\n async (id = \"latest\") => {\n try {\n const layout = await loadConfig(saveUrl, user, id);\n _setLayout(layout);\n } catch {\n _setLayout(defaultLayout);\n }\n },\n [defaultLayout, loadConfig, saveUrl, user]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n saveConfig(saveUrl, user, data);\n },\n [saveConfig, saveUrl, user]\n );\n\n const loadLayoutById = useCallback((id) => load(id), [load]);\n\n return [layout, saveData, loadLayoutById];\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n console.log(\n `load local config at ${saveUrl} for user ${user.username}, id ${id}`\n );\n const data = localStorage.getItem(saveUrl);\n if (data) {\n const layout = JSON.parse(data);\n resolve(layout);\n } else {\n reject();\n }\n });\n\nexport const saveLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n): Promise<undefined> =>\n new Promise((resolve, reject) => {\n try {\n localStorage.setItem(saveUrl, JSON.stringify(data));\n resolve(undefined);\n } catch {\n reject();\n }\n });\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}/${id}`, {})\n .then((response) => {\n if (response.ok) {\n resolve(response.json());\n } else {\n reject(undefined);\n }\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n // setLayout(defaultLayout);\n reject(undefined);\n });\n });\n\nexport const saveRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n) =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n if (response.ok) {\n resolve(undefined);\n } else {\n reject();\n }\n });\n });\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\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 return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@salt-ds/lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\nimport { VuuUser } from \"../shell\";\n\nexport interface UserProfileProps {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const UserProfile = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n}: UserProfileProps) => {\n const handleNavigate = (id: string) => {\n onNavigate(id);\n };\n\n return (\n <DropdownBase className=\"vuuUserProfile\" placement=\"bottom-end\">\n <Button variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { List, ListItem, ListItemProps } from \"@salt-ds/lab\";\nimport { Button } from \"@salt-ds/core\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { getLayoutHistory, LayoutHistoryItem } from \"../get-layout-history\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = (\n { lastUpdate: l1 }: LayoutHistoryItem,\n { lastUpdate: l2 }: LayoutHistoryItem\n) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\ntype HistoryEntry = {\n id: string;\n label: string;\n lastUpdate: number;\n};\n\nconst HistoryListItem = (props: ListItemProps<HistoryEntry>) => {\n return <ListItem {...props} />;\n};\n\nexport interface UserPanelProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n layoutId: string;\n}\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" }: UserPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const [history, setHistory] = useState<HistoryEntry[]>([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map<HistoryEntry>(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? null\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List<HistoryEntry>\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "import { VuuUser } from \"./shell\";\n\nexport interface LayoutHistoryItem {\n user: string;\n id: string;\n uniqueId: string;\n lastUpdate: number;\n}\n\nexport const getLayoutHistory = async (\n user: VuuUser\n): Promise<LayoutHistoryItem[]> => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(\"error getting history\");\n });\n\n return history;\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 { Button } from \"@salt-ds/core\";\nimport cx from \"classnames\";\nimport { useCallback, useMemo } from \"react\";\nimport {\n layoutFromJson,\n LayoutJSON,\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 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 () => (contentProp ? layoutFromJson(contentProp, \"context-0\") : null),\n [contentProp]\n );\n\n return (\n <div className={cx(classBase, className)}>\n <div className={`${classBase}-inner`}>\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 </div>\n </div>\n );\n};\n", "import { DraggableLayout, Flexbox } from \"@vuu-ui/vuu-layout\";\nimport { ReactElement } from \"react\";\nimport { ContextPanel } from \"./context-panel\";\nimport { ShellLayoutProps } from \"./useShellLayout\";\n\nexport const useFullHeightLeftPanel = ({\n appHeader,\n leftSidePanel,\n}: ShellLayoutProps): ReactElement => {\n return (\n <Flexbox\n className=\"App\"\n style={{\n flexDirection: \"row\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n {leftSidePanel}\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\n id=\"context-panel\"\n overlay\n title=\"Column Settings\"\n ></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 leftSidePanel,\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(leftSidePanel).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 { ReactElement } from \"react\";\nimport { useFullHeightLeftPanel } from \"./useFullHeightLeftPanel\";\nimport { useInlayLeftPanel } from \"./useInlayLeftPanel\";\n\nexport type ShellLayoutType = \"full-height\" | \"inlay\";\nexport interface ShellLayoutProps {\n appHeader: ReactElement;\n leftSidePanel?: ReactElement;\n}\n\nexport const useShellLayout = ({\n leftSidePanelLayout = \"inlay\",\n ...props\n}:\n | ShellLayoutProps & {\n leftSidePanelLayout?: \"full-height\" | \"inlay\";\n }) => {\n const useLayoutHook =\n leftSidePanelLayout === \"inlay\"\n ? useInlayLeftPanel\n : useFullHeightLeftPanel;\n\n return useLayoutHook(props);\n};\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { RpcResponseHandler } from \"packages/vuu-data-react/src\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DEFAULT_DENSITY", "classBase", "React", "cx", "import_react", "import_classnames", "import_jsx_runtime", "cx", "import_react", "import_react", "import_jsx_runtime", "React", "error", "import_jsx_runtime", "import_jsx_runtime", "React", "import_jsx_runtime", "classBase", "import_react", "import_jsx_runtime", "import_vuu_layout", "import_react", "import_jsx_runtime", "import_react", "import_react", "start", "import_core", "import_classnames", "import_react", "import_lab", "import_classnames", "import_react", "import_react", "ReactDOM", "import_classnames", "cx", "import_classnames", "Portal", "cx", "import_jsx_runtime", "import_react", "import_react", "import_classnames", "import_vuu_layout", "import_react", "navigationKeys", "import_react", "React", "menus", "actions", "import_jsx_runtime", "classBase", "React", "isRoot", "children", "className", "props", "cx", "import_react", "import_vuu_layout", "import_jsx_runtime", "import_react", "id", "import_react", "import_jsx_runtime", "import_classnames", "import_react", "import_classnames", "import_react", "ReactDOM", "cx", "ReactDOM", "import_jsx_runtime", "menuBuilder", "ContextMenuProps", "cx", "menuDescriptors", "import_react", "import_classnames", "import_core", "import_vuu_layout", "import_jsx_runtime", "classBase", "getPosition", "showContextMenu", "cx", "import_jsx_runtime", "Draggable", "cx", "import_react", "import_react", "dropZone", "import_jsx_runtime", "NOT_OVERFLOWED", "NOT_HIDDEN", "dropZone", "import_react", "import_react", "import_jsx_runtime", "import_classnames", "import_react", "import_core", "import_jsx_runtime", "classBase", "EditableLabel", "value", "cx", "import_core", "import_jsx_runtime", "import_react", "import_classnames", "import_classnames", "import_jsx_runtime", "classBase", "cx", "import_jsx_runtime", "classBase", "cx", "ListItem", "import_vuu_layout", "import_core", "import_classnames", "import_react", "import_react", "import_jsx_runtime", "union", "Enter", "actionKeys", "focusKeys", "arrowLeftRightKeys", "functionKeys", "specialKeys", "union", "isNavigationKey", "import_react", "Enter", "closestListItem", "closestListItem", "import_react", "import_react", "isSelected", "itemToString", "isExpanded", "flattenedCollection", "flattenedSource", "_a", "isLeaf", "children", "toCollectionItem", "import_react", "import_core", "import_react", "nextItemIdx", "isFocusable", "useKeyboardNavigation", "isNavigationKey", "import_core", "import_react", "import_react", "import_react", "import_react", "dimensions", "import_core", "HeightOnly", "import_react", "selected", "useKeyboardNavigation", "import_core", "import_react", "contentHeight", "listHeight", "clientHeight", "height", "import_core", "import_react", "range", "import_jsx_runtime", "import_react", "classBase", "List", "ListItem", "itemToString", "createHeader", "cx", "addGroup", "id", "childItems", "import_core", "import_react", "import_react", "import_jsx_runtime", "defaultEmptyMessage", "withBaseName", "ListItem", "List", "itemToString", "data", "import_vuu_layout", "import_core", "import_classnames", "import_react", "import_react", "import_vuu_utils", "import_react", "_a", "_b", "import_core", "import_vuu_utils", "import_react", "isNavigationKey", "nextItemIdx", "useKeyboardNavigation", "import_core", "import_react", "defaultSelectionKeys", "useSelection", "useKeyboardNavigation", "useSelection", "import_jsx_runtime", "import_react", "classBase", "cx", "React", "import_core", "import_classnames", "import_react", "import_react", "import_classnames", "import_jsx_runtime", "classBase", "cx", "import_jsx_runtime", "classBase", "noop", "Tab", "editable", "cx", "import_core", "import_classnames", "import_react", "listItemIndex", "closestListItem", "closestListItemIndex", "listItemIndex", "closestListItem", "import_react", "PathSeparators", "isPathSeparator", "isParentPath", "countChildItems", "count", "isExpanded", "flattenedSource", "isLeaf", "import_react", "import_core", "defaultSelectionKeys", "NO_HANDLERS", "useSelection", "isSelected", "id", "import_react", "HeightOnly", "useViewportTracking", "import_react", "import_react", "isGroupNode", "isHeader", "PATH_SEPARATORS", "isDescendantOf", "import_core", "union", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Enter", "Delete", "actionKeys", "Enter", "focusKeys", "arrowLeftRightKeys", "verticalNavigationKeys", "horizontalNavigationKeys", "functionKeys", "specialKeys", "union", "isNavigationKey", "navigationKeys", "verticalNavigationKeys", "horizontalNavigationKeys", "nextItemIdx", "ArrowUp", "ArrowLeft", "isLeaf", "isFocusable", "useKeyboardNavigation", "ArrowDown", "isNavigationKey", "import_react", "isHeader", "isGroupNode", "import_react", "NO_HANDLERS", "useCollapsibleGroups", "ArrowRight", "Enter", "ArrowLeft", "closestListItem", "import_react", "ArrowLeft", "EMPTY_ARRAY", "useKeyboardNavigation", "useCollapsibleGroups", "useSelection", "import_jsx_runtime", "import_react", "classBase", "Tree", "useId", "selected", "sourceItems", "id", "useViewportTracking", "closestListItemIndex", "cx", "import_classnames", "import_react", "import_react", "import_classnames", "import_jsx_runtime", "DEFAULT_DENSITY", "cx", "import_jsx_runtime", "classBase", "cx", "import_react", "import_core", "import_jsx_runtime", "classBase", "import_vuu_utils", "import_react", "import_classnames", "import_core", "import_vuu_utils", "import_jsx_runtime", "classBase", "values", "cx", "import_vuu_data", "import_classnames", "import_react", "import_react", "layout", "import_vuu_layout", "import_react", "import_core", "import_lab", "import_icons", "import_vuu_utils", "import_lab", "import_core", "import_react", "import_jsx_runtime", "UserPanel", "history", "selected", "import_jsx_runtime", "import_classnames", "import_core", "import_react", "import_jsx_runtime", "classBase", "cx", "import_classnames", "import_jsx_runtime", "classBase", "cx", "import_vuu_utils", "import_core", "import_classnames", "import_react", "import_vuu_layout", "import_jsx_runtime", "classBase", "cx", "import_vuu_layout", "import_jsx_runtime", "import_vuu_layout", "import_react", "import_jsx_runtime", "leftSidePanel", "import_jsx_runtime", "layout", "cx", "import_react", "import_jsx_runtime"]
|
|
7
7
|
}
|