{"version":3,"file":"2440.c0824c5a.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/shared/documentVisibility.ts","webpack://@finviz/website/./js/main/components/button-group/button-group.tsx","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/constants.ts","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/date-picker/index.tsx","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/dialog/dialog-box.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog.tsx","webpack://@finviz/website/./js/main/hooks/use-screen-size.ts","webpack://@finviz/website/./js/main/components/dialog/dialog-body.tsx","webpack://@finviz/website/./js/main/components/dialog/confirmation-dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-footer.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-header.tsx","webpack://@finviz/website/./js/main/components/dialog/utils.ts","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-separator.tsx","webpack://@finviz/website/./js/main/hooks/use-popover-maxHeight.ts","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/popover/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/popover/popover.tsx","webpack://@finviz/website/./js/main/components/toolbar/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/tabs/tab.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-list.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-panel.tsx","webpack://@finviz/website/./js/main/components/tabs/tabs.tsx","webpack://@finviz/website/./js/main/components/badge.tsx","webpack://@finviz/website/./js/main/components/popover/popover.tsx","webpack://@finviz/website/./js/main/components/popover/hooks.ts","webpack://@finviz/website/./js/main/components/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/select/NativeSelect.tsx","webpack://@finviz/website/./js/main/components/select/ItemsGroup.tsx","webpack://@finviz/website/./js/main/components/select/SelectOption.tsx","webpack://@finviz/website/./js/main/components/select/SelectItems.tsx","webpack://@finviz/website/./js/main/components/select/SelectList.tsx","webpack://@finviz/website/./js/main/components/select/SelectTooltipWrapper.tsx","webpack://@finviz/website/./js/main/components/select/DesktopSelect.tsx","webpack://@finviz/website/./js/main/components/select/SelectButton.tsx","webpack://@finviz/website/./js/main/components/select/Select.tsx","webpack://@finviz/website/./js/main/components/select/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/daterange-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/label-with-delayed-spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-bar.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range-utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-custom-date-range-dialog.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-favorite-timeframes.tsx","webpack://@finviz/website/./js/main/hooks/use-sync-local-storage.ts","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/hooks/use-element-measure.ts","webpack://@finviz/website/./js/main/hooks/use-is-mounted.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/services/local-storage.ts","webpack://@finviz/website/./js/main/services/wait-for-previous-promise.ts"],"sourcesContent":["import { waitForPreviousPromise } from '../../main/services/wait-for-previous-promise'\r\n\r\nfunction getCurrentDateInMs() {\r\n return new Date().valueOf()\r\n}\r\n\r\nfunction getIsDocumentVisible() {\r\n return document.visibilityState === 'visible' || document.hidden === false\r\n}\r\n\r\n/**\r\n * Invoke a callback when page visibility changes. Turns the callback into a promise\r\n * and waits for the previous promise to finish before invoking it again\r\n */\r\nexport function notifyOnVisibilityChange(callback: (visible: boolean) => void | Promise) {\r\n const promisifiedCallback = waitForPreviousPromise(() => callback(getIsDocumentVisible()))\r\n\r\n document.addEventListener('visibilitychange', promisifiedCallback)\r\n\r\n return {\r\n callback: promisifiedCallback,\r\n unsubscribe: () => {\r\n document.removeEventListener('visibilitychange', promisifiedCallback)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Calls callback based on interval and document visibility. Returns unsubscribe function.\r\n * How it works:\r\n * - document is hidden: interval cleared\r\n * - document visible: interval set-up with remaining time from last interval. Call immediately if interval elapsed\r\n */\r\nexport function intervalCallbackOnWindowVisible(\r\n interval: number | (() => number),\r\n callback: () => void | Promise\r\n) {\r\n const getInterval = typeof interval === 'function' ? interval : () => interval\r\n let refreshPromise: Promise | void | null = null\r\n let nextRefresh = getCurrentDateInMs() + getInterval()\r\n let refreshTimeout: number | null = null\r\n\r\n async function refresh() {\r\n nextRefresh = getCurrentDateInMs() + getInterval()\r\n // Call callback asynchronously\r\n refreshPromise = callback()\r\n await refreshPromise\r\n refreshPromise = null\r\n\r\n // Queue next refresh\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = window.setTimeout(refresh, Math.max(0, nextRefresh - getCurrentDateInMs()))\r\n }\r\n }\r\n\r\n /**\r\n * Handle the visibility change event, compute callback remaining time or call immediately\r\n */\r\n function handleVisibilityChange() {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n\r\n if (getIsDocumentVisible() && refreshPromise === null) {\r\n const currentDateMs = getCurrentDateInMs()\r\n // Refresh if the document is stale, otherwise set a timeout to refresh later\r\n if (nextRefresh <= currentDateMs) {\r\n refresh()\r\n } else {\r\n refreshTimeout = window.setTimeout(refresh, nextRefresh - currentDateMs)\r\n }\r\n }\r\n }\r\n\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = window.setTimeout(refresh, getInterval())\r\n }\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange)\r\n\r\n return () => {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n document.removeEventListener('visibilitychange', handleVisibilityChange)\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRounding, ButtonRoundingType } from '../button'\r\n\r\nexport enum GroupTheme {\r\n light,\r\n dark,\r\n}\r\n\r\nexport interface ButtonGroupProps {\r\n children: React.ReactNode\r\n\r\n /**\r\n * Border radius of entire group wrapper\r\n *\r\n * @default \"regular\"\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n className?: string\r\n\r\n /**\r\n * If a pipe divider between buttons should be rendered\r\n *\r\n * @default true\r\n */\r\n hasDivider?: boolean\r\n\r\n /**\r\n * If group wrapper has a border\r\n *\r\n * @default true\r\n */\r\n hasBorder?: boolean\r\n\r\n /**\r\n * Group color theme\r\n *\r\n * @default \"light\"\r\n */\r\n theme?: keyof typeof GroupTheme\r\n\r\n /**\r\n * Custom button component which extends Button\r\n *\r\n * @default undefined\r\n */\r\n childComponent?: string | React.JSXElementConstructor\r\n}\r\n\r\nfunction getGroupTheme(theme: GroupTheme) {\r\n switch (theme) {\r\n case GroupTheme.dark:\r\n return {\r\n wrapper: 'bg-gray-800 border-gray-600',\r\n divider: 'bg-gray-600',\r\n }\r\n default:\r\n return {\r\n wrapper: 'bg-white dark:bg-gray-800 border-gray-100 dark:border-gray-600',\r\n divider: 'bg-gray-100 dark:bg-gray-600',\r\n }\r\n }\r\n}\r\n\r\nexport function ButtonGroup({\r\n className,\r\n children,\r\n theme = 'light',\r\n hasDivider = true,\r\n hasBorder = true,\r\n rounding = 'regular',\r\n childComponent,\r\n}: ButtonGroupProps) {\r\n const buttonRounding = ButtonRounding[rounding]\r\n const groupTheme = React.useMemo(() => getGroupTheme(GroupTheme[theme]), [theme])\r\n return (\r\n \r\n {React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child) || ![Button, childComponent].filter(Boolean).includes(child.type)) {\r\n return child\r\n }\r\n\r\n return (\r\n \r\n {hasDivider && index > 0 &&
}\r\n {React.cloneElement(child as React.ReactElement>, {\r\n rounding: child.props.rounding ?? 'none',\r\n theme: child.props.theme ?? (GroupTheme[theme] === GroupTheme.dark ? 'menuItemDark' : 'menuItem'),\r\n })}\r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\nexport enum ColorVariant {\r\n violet = 'violet',\r\n emerald = 'emerald',\r\n orange = 'orange',\r\n teal = 'teal',\r\n pink = 'pink',\r\n lime = 'lime',\r\n purple = 'purple',\r\n green = 'green',\r\n yellow = 'yellow',\r\n blue = 'blue',\r\n red = 'red',\r\n gray = 'gray',\r\n default = 'default',\r\n}\r\n\r\nexport enum CheckboxSize {\r\n none = '', // Do not set fixed size\r\n small = 'min-h-6 text-2xs', // 24px\r\n regular = 'min-h-7 text-sm', // 28px\r\n}\r\nexport type CheckboxSizeType = keyof typeof CheckboxSize\r\n\r\ninterface CheckboxProps extends Omit, 'label' | 'size'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n\r\n /**\r\n * Size of the checkbox\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: CheckboxSizeType\r\n\r\n /**\r\n * Color of the checkbox\r\n *\r\n * @default \"default\"\r\n */\r\n color?: ColorVariant\r\n}\r\n\r\nfunction CheckboxComponent(\r\n {\r\n className,\r\n label,\r\n size = 'regular',\r\n color = ColorVariant.default,\r\n children,\r\n ...props\r\n }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && (\r\n \r\n )}\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\r\n )\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n const popover = Ariakit.usePopoverContext()\r\n const input = popover?.useState('disclosureElement')\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n input?.focus({ preventScroll: true })\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n }\r\n />\r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isOpen = popoverState.useState('open')\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n
\r\n \r\n )\r\n}\r\n","/**\r\n * Used for reakit as the duration of a open/close animation. The animation itself is done using css\r\n */\r\nexport const COMPONENT_ANIMATION_DURATION = 250\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: number\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = window.setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { CalendarProps } from 'react-calendar'\r\n\r\nimport { Box } from '../box'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nconst DatePickerComponent = React.lazy(() => import('./picker'))\r\n\r\ntype RangePickerCallback = (value: [Date, Date], ev: React.ChangeEvent) => void\r\ntype PickerCallback = (value: Date, ev: React.ChangeEvent) => void\r\n\r\ninterface DatePickerProps extends Omit {\r\n /**\r\n * Trigger element for the picker\r\n */\r\n children: JSX.Element\r\n\r\n onChange: PickerCallback | RangePickerCallback\r\n}\r\n\r\nexport function StatelessDatePicker({\r\n state,\r\n children,\r\n ...props\r\n}: DatePickerProps & { state: ReturnType; zIndex?: string }) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n ) => {\r\n state.hide()\r\n props.onChange?.(value, ev)\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport function DatePicker(props: DatePickerProps) {\r\n const popover = usePopoverState()\r\n\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\nexport const ZIndexContext = React.createContext('z-50')\r\n\r\nexport function useZIndex() {\r\n return React.useContext(ZIndexContext)\r\n}\r\n\r\nexport type DialogStateProps = Ariakit.DialogStoreProps\r\nexport type DialogStateReturn = ReturnType\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function useDialogState(settings?: DialogStateProps) {\r\n return Ariakit.useDialogStore(settings)\r\n}\r\n\r\nexport const DialogDragContext = React.createContext<{\r\n enabled?: boolean\r\n handleRef?: React.RefObject\r\n boxPosition: { x: number; y: number }\r\n resetBoxPosition: () => void\r\n setBoxPosition: React.Dispatch>\r\n}>({\r\n enabled: false,\r\n handleRef: undefined,\r\n boxPosition: { x: 0, y: 0 },\r\n resetBoxPosition: () => {},\r\n setBoxPosition: () => {},\r\n})\r\n\r\n/**\r\n * Hook which allows an element on the page to become draggable\r\n */\r\nexport function useDrag(enabled?: boolean) {\r\n const dragging = React.useRef(false)\r\n const handleRef = React.useRef(null)\r\n const handleElement = handleRef.current\r\n\r\n /**\r\n * Set box position in both state for the component to re-render and as a ref\r\n * so that we don’t have to re-run the whole effect on every change\r\n */\r\n const [boxPosition, setBoxPosition] = React.useState({ x: 0, y: 0 })\r\n const boxPositionRef = React.useRef({ x: 0, y: 0 })\r\n const dragDiff = React.useRef({ x: 0, y: 0 })\r\n\r\n const { current: resetBoxPosition } = React.useRef(() => {\r\n setBoxPosition({ x: 0, y: 0 })\r\n })\r\n\r\n React.useEffect(() => {\r\n boxPositionRef.current = { ...boxPosition }\r\n }, [boxPosition])\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !handleElement || isMobile()) return\r\n\r\n const onMouseDown = (ev: MouseEvent) => {\r\n dragging.current = true\r\n\r\n dragDiff.current = {\r\n x: ev.pageX - boxPositionRef.current.x - window.scrollX,\r\n y: ev.pageY - boxPositionRef.current.y - window.scrollY,\r\n }\r\n }\r\n\r\n const onMouseUp = () => {\r\n dragging.current = false\r\n }\r\n\r\n const onMouseMove = (ev: MouseEvent) => {\r\n if (!dragging.current) return\r\n\r\n const x = ev.pageX - dragDiff.current.x - window.scrollX\r\n const y = ev.pageY - dragDiff.current.y - window.scrollY\r\n\r\n setBoxPosition({ x, y })\r\n }\r\n\r\n handleElement.addEventListener('pointerdown', onMouseDown)\r\n handleElement.addEventListener('dblclick', resetBoxPosition)\r\n window.addEventListener('pointerup', onMouseUp)\r\n document.body.addEventListener('pointermove', onMouseMove)\r\n\r\n return () => {\r\n handleElement.removeEventListener('pointerdown', onMouseDown)\r\n handleElement.removeEventListener('dblclick', resetBoxPosition)\r\n window.removeEventListener('pointerup', onMouseUp)\r\n document.body.removeEventListener('pointermove', onMouseMove)\r\n }\r\n }, [enabled, handleElement, resetBoxPosition])\r\n\r\n return {\r\n enabled,\r\n handleRef,\r\n boxPosition,\r\n setBoxPosition,\r\n resetBoxPosition,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { Box, BoxProps } from '../box'\r\nimport { DialogDragContext } from './hooks'\r\n\r\n/**\r\n * Public props for the component\r\n */\r\nexport type DialogBoxProps = BoxProps\r\n\r\ninterface DialogBoxOwnProps extends DialogBoxProps {\r\n /**\r\n * This callback serves as a way to account for the time between dialog close\r\n * and animation finish. The box isn’t rendered when the dialog closes but we still\r\n * want to display content when the dialog is closing\r\n */\r\n onUnmount?: () => void\r\n}\r\n\r\n/**\r\n * Dialog content container\r\n */\r\nexport function DialogBox({ onUnmount, style, ...props }: React.PropsWithChildren) {\r\n const wrapperRef = React.useRef(null)\r\n const { setElementRef, elementHeight } = useElementMeasure()\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n React.useEffect(() => {\r\n const onResize = () => {\r\n const { top = 0, bottom = 0, left = 0, right = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n const { clientHeight, clientWidth } = window.document.documentElement\r\n if (top < 0 || bottom > clientHeight || left < 0 || right > clientWidth) {\r\n dialogDrag.resetBoxPosition()\r\n }\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n onUnmount?.()\r\n }\r\n // Set up an effect which only calls resetBoxPosition which is ref fn with state setter call and the unmount callback\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n setElementRef(wrapperRef.current)\r\n }, [setElementRef])\r\n\r\n React.useEffect(() => {\r\n dialogDrag.setBoxPosition((prevPosition) => {\r\n const { top = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n return { ...prevPosition, y: prevPosition.y - Math.min(top, 0) }\r\n })\r\n // We want to call it only on elementHeight change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementHeight])\r\n\r\n const dialogBoxStyle = React.useMemo(() => {\r\n if (dialogDrag.enabled) {\r\n return { ...style, transform: `translate3d(${dialogDrag.boxPosition.x}px, ${dialogDrag.boxPosition.y}px, 0)` }\r\n }\r\n return style\r\n }, [style, dialogDrag])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isIpad, isMobile } from '../../../app/shared/isMobile'\r\nimport { useScreenSize } from '../../hooks/use-screen-size'\r\nimport { useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { ChildPosition, getFlexAlignClasses } from '../../util'\r\nimport { DialogBox, DialogBoxProps } from './dialog-box'\r\nimport { DialogDragContext, DialogStateReturn, ZIndexContext, useDrag } from './hooks'\r\n\r\nfunction focusWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\nexport enum DialogType {\r\n modal,\r\n drawer,\r\n}\r\n\r\nexport interface DialogProps extends DialogBoxProps {\r\n /**\r\n * The returned object from `useDialogState`\r\n */\r\n state: DialogStateReturn\r\n\r\n /**\r\n * When true, the dialog will be rendered in a portal and all outside elements won’t be interactable\r\n *\r\n * @default true\r\n */\r\n modal?: boolean\r\n\r\n /**\r\n * Sets if the dialog can be dragged across the screen\r\n *\r\n * @default false\r\n */\r\n isDraggable?: boolean\r\n\r\n /**\r\n * Type of dialog\r\n *\r\n * @default modal\r\n */\r\n type?: keyof typeof DialogType\r\n\r\n /**\r\n * Dialog position on the screen\r\n *\r\n * @default center\r\n */\r\n position?: keyof typeof ChildPosition\r\n\r\n /**\r\n * Hide the dialog when user presses ESC\r\n *\r\n * @default true\r\n */\r\n hideOnEsc?: boolean\r\n\r\n /**\r\n * Show backdrop on the dialog. Provide your own element if you want to add background or animation\r\n *\r\n */\r\n backdrop?: false | JSX.Element\r\n\r\n /**\r\n * Callback which is called when the dialog opens and all animations complete\r\n */\r\n onFullyOpen?: () => void\r\n\r\n /**\r\n * Callback which is called when the dialog closes and all animations complete\r\n */\r\n onFullyClosed?: () => void\r\n\r\n /**\r\n * Callback before the dialog starts hiding. Event can be prevented which keeps the dialog open\r\n * This callback isn’t called on backdrop click. Use `backdrop={
}` to react on backdrop clicks\r\n */\r\n onClose?: (event: Event) => void\r\n}\r\n\r\nexport function Dialog({\r\n state,\r\n modal = true,\r\n isDraggable = false,\r\n type = 'modal',\r\n position = 'center',\r\n hideOnEsc = true,\r\n backdrop,\r\n onFullyOpen,\r\n onFullyClosed,\r\n onClose,\r\n children,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = useDrag(isDraggable)\r\n const isOpen = state.useState('open')\r\n const [isFullyOpen, setIsFullyOpen] = React.useState(false)\r\n const { viewport } = useVisualViewport({ enabled: isOpen, onScroll: false })\r\n const screenSize = useScreenSize()\r\n\r\n const dialogStyle = React.useMemo(() => {\r\n if (isMobile() && !isIpad() && viewport.scale !== 1) {\r\n return {\r\n left: viewport.left,\r\n top: viewport.top,\r\n width: viewport.unscaledWidth,\r\n height: viewport.unscaledHeight,\r\n minWidth: screenSize.width,\r\n minHeight: screenSize.width,\r\n willChange: 'auto',\r\n }\r\n }\r\n return\r\n }, [screenSize, viewport])\r\n\r\n return (\r\n state.hide()} />}\r\n autoFocusOnHide={focusWithoutScroll}\r\n aria-label={ariaLabel}\r\n // Cypress doesn’t wait for transitions to complete and it could lead to bugs with other popover components (ResizeObserver loop exceeded)\r\n // If you encounter this problem, just do `cy.get('[data-fully-open=true]').should('exist')` before continuing to wait for the dialog\r\n data-fully-open={isFullyOpen}\r\n style={dialogStyle}\r\n className={classnames(\r\n 'group/dialog pointer-events-none fixed bottom-0 left-0 right-0 top-0 z-dialog flex max-w-full outline-none transition duration-[250ms] ipad-fullscreen:pt-5',\r\n DialogType[type] === DialogType.modal && getFlexAlignClasses(ChildPosition[position]),\r\n {\r\n 'p-2 opacity-0 data-[enter]:scale-100 data-[enter]:opacity-100 motion-safe:scale-95 sm:p-5':\r\n DialogType[type] === DialogType.modal,\r\n 'justify-end data-[enter]:translate-x-0 motion-safe:translate-x-full': DialogType[type] === DialogType.drawer,\r\n }\r\n )}\r\n onTransitionEnd={(ev) => {\r\n if (ev.target === ev.currentTarget && isOpen) {\r\n setIsFullyOpen(true)\r\n onFullyOpen?.()\r\n }\r\n }}\r\n onClose={(ev) => {\r\n onClose?.(ev)\r\n // prevented means the dialog didn’t close\r\n if (!ev.defaultPrevented) setIsFullyOpen(false)\r\n }}\r\n >\r\n \r\n \r\n {\r\n onFullyClosed?.()\r\n dialogDrag.resetBoxPosition()\r\n }}\r\n >\r\n {children}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport const DialogDismiss = Ariakit.DialogDismiss\r\n","import { isMobile } from '../../app/shared/isMobile'\r\n\r\nexport function useScreenSize() {\r\n return {\r\n width: isMobile() ? window.screen.width : window.innerWidth,\r\n height: isMobile() ? window.screen.height : window.innerHeight,\r\n }\r\n}\r\n","import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\ninterface DialogBodyProps extends React.HTMLProps {\r\n /**\r\n * Whether or not the dialog body will have padding\r\n *\r\n * @default true\r\n */\r\n hasPadding?: boolean\r\n}\r\n\r\n/**\r\n * Content wrapper which handles scrolling on mobile\r\n */\r\nexport function DialogBody({ hasPadding = true, ...props }: React.PropsWithChildren) {\r\n const scrollDivRef = React.useRef(null)\r\n\r\n React.useEffect(() => {\r\n const scrollBox = scrollDivRef.current\r\n\r\n if (isMobile() && scrollBox) {\r\n disableBodyScroll(scrollBox)\r\n\r\n return () => enableBodyScroll(scrollBox)\r\n }\r\n }, [])\r\n\r\n return (\r\n \r\n {props.children}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { Dialog, DialogProps } from './dialog'\r\nimport { DialogBody } from './dialog-body'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface ConfirmationDialogProps {\r\n state: DialogStateReturn\r\n title: React.ReactNode\r\n actions: React.ReactNode\r\n 'aria-label': string\r\n position?: DialogProps['position']\r\n}\r\n\r\nexport function ConfirmationDialog({ position, ...props }: React.PropsWithChildren) {\r\n return (\r\n }\r\n >\r\n \r\n \r\n {props.title}\r\n \r\n {props.children}\r\n
{props.actions}
\r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface DialogFooterProps extends React.HTMLProps {\r\n padding?: boolean\r\n}\r\n\r\n/**\r\n * Footer container which renders border and aligns items to right\r\n */\r\nexport function DialogFooter({ padding = true, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { Icon } from '../icon'\r\nimport { Heading } from '../typography'\r\nimport { DialogDragContext } from './hooks'\r\n\r\ninterface DialogHeaderProps {\r\n /**\r\n * Hide the close button\r\n * @default true\r\n */\r\n isCloseButtonVisible?: boolean\r\n\r\n /**\r\n * Callback when user clicks on close button. The button will be hidden if not set\r\n */\r\n onCloseClick?: () => void\r\n\r\n /**\r\n * Additional class names for the component\r\n */\r\n className?: string\r\n\r\n /**\r\n * Whether or not the dialog header will have default horizontal padding\r\n *\r\n * @default true\r\n */\r\n hasHorizontalPadding?: boolean\r\n\r\n /**\r\n * Whether or not the dialog header will have default min height\r\n *\r\n * @default true\r\n */\r\n hasMinHeight?: boolean\r\n\r\n /**\r\n * Whether or not the dialog header children should be rendered as Heading\r\n *\r\n * @default true\r\n */\r\n asHeading?: boolean\r\n}\r\n\r\n/**\r\n * Component which renders title and a close button\r\n */\r\nexport function DialogHeader({\r\n children,\r\n className,\r\n hasHorizontalPadding = true,\r\n hasMinHeight = true,\r\n asHeading = true,\r\n isCloseButtonVisible = true,\r\n onCloseClick,\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n return (\r\n \r\n {children &&\r\n (asHeading ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n ))}\r\n {isCloseButtonVisible && (\r\n onCloseClick?.()}\r\n >\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","export function getExtendedDialogState(state: { visible: boolean; animating: boolean }) {\r\n return {\r\n isFullyOpened: state.visible && !state.animating,\r\n isFullyClosed: !state.visible && !state.animating,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type DropdownStateReturn = ReturnType\r\n\r\nexport const DropdownContext = React.createContext<{\r\n parent: Reakit.MenuStateReturn\r\n root: Reakit.MenuStateReturn\r\n} | null>(null)\r\n\r\nexport function useDropdownState(settings?: Reakit.MenuInitialState) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return Reakit.useMenuState({\r\n ...settings,\r\n loop: true,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n unstable_virtual: true,\r\n unstable_offset: settings?.unstable_offset ?? (context?.root ? [-5, 4] : [0, 5]),\r\n modal: false,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps, BoxRounding } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { DropdownContext, useDropdownState } from './hooks'\r\n\r\ninterface DropdownBaseProps extends Omit {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n label: JSX.Element\r\n\r\n /**\r\n * @private\r\n * Any additional props to the trigger button. Used by nested dropdown wrapper\r\n */\r\n triggerProps?: Reakit.MenuButtonHTMLProps\r\n\r\n /**\r\n * Rounding of all trigger button, dropdown wrapper and dropdown items\r\n */\r\n rounding?: keyof typeof BoxRounding\r\n}\r\n\r\ninterface RootDropdownProps {\r\n /**\r\n * The returned object from `useDropdownState`. For nested dropdowns use the `isNested` prop\r\n */\r\n state: Reakit.MenuStateReturn\r\n isNested?: never\r\n /**\r\n * When set to true the dropdown will not render in Portal and will not use position absolute + transform.\r\n */\r\n isStatic?: boolean\r\n}\r\n\r\ninterface NestedDropdownProps {\r\n state?: never\r\n /**\r\n * When set to true the dropdown will compute its own state. Only usable with\r\n * nested dropdowns\r\n */\r\n isNested: true\r\n\r\n isStatic?: never\r\n}\r\n\r\ntype DropdownProps = DropdownBaseProps & (RootDropdownProps | NestedDropdownProps)\r\n\r\nfunction DropdownComponent(\r\n {\r\n label,\r\n triggerProps,\r\n state,\r\n 'aria-label': ariaLabel,\r\n children,\r\n isNested,\r\n rounding,\r\n isStatic,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const zIndex = useZIndex()\r\n const context = React.useContext(DropdownContext)\r\n // Required due to the way conditional props work\r\n const dropdownState = state!\r\n const { isFullyClosed } = getExtendedDialogState(state ?? { visible: false, animating: false })\r\n\r\n if (!isNested && !dropdownState) {\r\n throw new Error('Dropdowns require either `state` or `isNested` prop defined!')\r\n }\r\n\r\n const ContainerElement = React.useRef(isNested || isStatic ? React.Fragment : Portal).current\r\n\r\n return (\r\n <>\r\n \r\n {(buttonProps) =>\r\n React.cloneElement(label, {\r\n ...buttonProps,\r\n ...label.props,\r\n rounding,\r\n active: label.props.active ?? dropdownState.visible,\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === Dropdown) {\r\n return {child}\r\n }\r\n\r\n return React.cloneElement(child, {\r\n ...child.props,\r\n rounding,\r\n })\r\n })}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(DropdownComponent)\r\n\r\ninterface NestedDropdownWrapperProps {\r\n /**\r\n * State of parrent dropdown to be passed to MenuItem for correct navigation\r\n * handling\r\n */\r\n parentState: Reakit.MenuStateReturn\r\n\r\n /**\r\n * Nested dropdown element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\n/**\r\n * The `useDropdownState` requires parent context to be defined in order to work\r\n * with nested Dropdowns. So we need to create a wrapper to be able to get to the\r\n * parent context\r\n */\r\nfunction NestedDropdownWrapper({ parentState, children }: NestedDropdownWrapperProps) {\r\n const state = useDropdownState()\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(children, { ...children.props, triggerProps: itemProps, state })}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { Icon, isValidIconName } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { DropdownContext } from './hooks'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\ninterface DropdownItemProps extends ButtonProps {\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n closeOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n {\r\n as: asComponent,\r\n state,\r\n subtitle,\r\n closeOnClick = true,\r\n children,\r\n rounding,\r\n size,\r\n ...props\r\n }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return (\r\n \r\n {(itemProps) => {\r\n const active = itemProps['aria-selected'] && !context?.parent.animating\r\n const hasSubmenu = Boolean(itemProps['aria-haspopup'])\r\n\r\n const iconTheme = {\r\n 'text-gray-300': !active,\r\n 'text-gray-white dark:text-white': active,\r\n }\r\n\r\n return (\r\n \r\n ) : (\r\n props.leftContent\r\n )\r\n }\r\n rightContent={\r\n isValidIconName(props.rightContent) ? (\r\n \r\n ) : (\r\n props.rightContent\r\n )\r\n }\r\n onClick={(ev: React.MouseEvent) => {\r\n // Close if we clicked on an item which doesn’t have a submenu\r\n if (closeOnClick && !hasSubmenu) {\r\n context?.root.hide()\r\n }\r\n\r\n itemProps.onClick?.(ev)\r\n }}\r\n >\r\n {children}\r\n {subtitle &&
{subtitle}
}\r\n \r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Reakit from 'reakit/Menu'\r\n\r\nimport { Paragraph } from '../typography'\r\n\r\nexport function DropdownSeparator(props: Partial) {\r\n return (\r\n \r\n
\r\n {props.children && (\r\n \r\n {props.children}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/toolbar/popover/hooks'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: DropdownStateReturn | PopoverStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n
\r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n items={item.options}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\nconst DEFAULT_VALUE_KEY = 'value'\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { SelectItem } from '../select'\r\nimport { PopoverStateReturn } from '../toolbar/popover/hooks'\r\n\r\nexport const ListContext = React.createContext(null)\r\n\r\nexport function useListState(options?: Reakit.CompositeInitialState) {\r\n return Reakit.useCompositeState({ ...options, loop: true, unstable_virtual: true })\r\n}\r\n\r\nfunction getSelectedItemIndex(items: SelectItem[], value: unknown) {\r\n if (!value && value !== 0) return -1\r\n\r\n return items.findIndex((item) => item.value === value)\r\n}\r\n\r\n/**\r\n * Hook which handles select state and returns onChange handler\r\n */\r\nexport function useList>(\r\n state: PopoverStateReturn,\r\n defaultValue: ValueType | undefined,\r\n items: ItemType[],\r\n onChange: (item: ItemType) => void\r\n) {\r\n const [selectedIndex, setSelectedIndex] = React.useState(getSelectedItemIndex(items, defaultValue))\r\n const closePopover = React.useRef(() => state.hide())\r\n\r\n // Update select value on change from outside\r\n React.useEffect(() => {\r\n const newIndex = getSelectedItemIndex(items, defaultValue)\r\n setSelectedIndex(newIndex)\r\n }, [items, selectedIndex, defaultValue])\r\n\r\n const onItemChange = React.useCallback(\r\n (index: number, closeOnSelect = true) => {\r\n const selectedItem = items[index]\r\n setSelectedIndex(index)\r\n\r\n if (closeOnSelect) closePopover.current()\r\n onChange(selectedItem)\r\n },\r\n [items, onChange, setSelectedIndex]\r\n )\r\n\r\n return { selectedIndex, onItemChange }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonTheme } from '../button'\r\nimport { ListContext } from './hooks'\r\n\r\nexport interface ListItemProps {\r\n /**\r\n * Theme when the button is selected\r\n */\r\n activeTheme?: keyof typeof ButtonTheme\r\n\r\n /**\r\n * Close parent popover when the item is clicked\r\n */\r\n closeOnSelect?: boolean\r\n\r\n /**\r\n * OnChange callback when item is clicked or navigated to\r\n * @private\r\n */\r\n onSelectItem?: (item: string, closeOnSelect?: boolean) => void\r\n}\r\n\r\nexport function ListItem({\r\n as,\r\n activeTheme = 'blue',\r\n onSelectItem,\r\n onClick,\r\n onKeyPress,\r\n className,\r\n closeOnSelect = true,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren & ButtonComponentProps) {\r\n const state = React.useContext(ListContext)\r\n\r\n return (\r\n {\r\n onClick?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n onKeyPress={(ev) => {\r\n onKeyPress?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n >\r\n {(itemProps: ButtonComponentProps) => {\r\n const active = Boolean(itemProps['aria-selected'])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { ListContext } from './hooks'\r\nimport { ListItem } from './list-item'\r\n\r\nexport enum ListDirection {\r\n row,\r\n column,\r\n}\r\n\r\nexport interface ListProps extends Omit {\r\n /**\r\n * The returned object from `useListState`\r\n */\r\n state: Reakit.CompositeStateReturn\r\n\r\n /**\r\n * The selected option\r\n */\r\n selectedIndex?: number\r\n\r\n /**\r\n * Callback when selected option index changes\r\n */\r\n onChange?: (selectedIndex: number, closeParent?: boolean) => void\r\n\r\n /**\r\n * Direction to render items\r\n * @default col\r\n */\r\n direction?: keyof typeof ListDirection\r\n\r\n /**\r\n * Whether or not default styles should be included for the list\r\n * @default true\r\n */\r\n includeBaseStyles?: boolean\r\n}\r\n\r\nexport function List({\r\n state,\r\n selectedIndex,\r\n direction = 'column',\r\n includeBaseStyles = true,\r\n onChange,\r\n children,\r\n ...props\r\n}: ListProps) {\r\n const prevSelected = React.useRef(null)\r\n\r\n // Select option when `selectedIndex` changes\r\n React.useEffect(() => {\r\n if (\r\n selectedIndex !== undefined &&\r\n selectedIndex >= 0 &&\r\n prevSelected.current !== selectedIndex &&\r\n state.items.length > selectedIndex\r\n ) {\r\n state.move(state.items[selectedIndex].id)\r\n prevSelected.current = selectedIndex\r\n }\r\n }, [selectedIndex, state, state.items.length])\r\n\r\n const onSelectItem = React.useCallback(\r\n (id: string, closeParent: boolean) => {\r\n onChange?.(\r\n state.items.findIndex((item) => item.id === id),\r\n closeParent\r\n )\r\n },\r\n [onChange, state.items]\r\n )\r\n\r\n return (\r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ListItem) {\r\n return React.cloneElement(child, { ...child.props, onSelectItem: onSelectItem })\r\n }\r\n\r\n return child\r\n })}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center p-1.5 bg-white dark:bg-gray-800', {\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\r\n >\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../../constants'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\nconst DEFAULT_OFFSET: [number, number] = [0, 5]\r\nconst HOVER_TIMEOUT = 150\r\n\r\nconst preventDefault = (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n}\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState(settings?: Reakit.PopoverInitialState) {\r\n const offsets = (settings?.unstable_offset ?? DEFAULT_OFFSET) as [number, number]\r\n const popover = Reakit.usePopoverState({\r\n ...settings,\r\n placement: settings?.placement ?? 'bottom-start',\r\n unstable_offset: offsets,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n })\r\n\r\n return { ...popover, offsets }\r\n}\r\n\r\nexport function useHoverPopover(settings?: Reakit.PopoverInitialState) {\r\n const popover = usePopoverState(settings)\r\n const showTimeout = React.useRef(null)\r\n const hideTimeout = React.useRef(null)\r\n\r\n const clearTimeouts = React.useRef(() => {\r\n if (showTimeout.current !== null) {\r\n window.clearTimeout(showTimeout.current)\r\n }\r\n if (hideTimeout.current !== null) {\r\n window.clearTimeout(hideTimeout.current)\r\n }\r\n })\r\n\r\n const showPopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n showTimeout.current = window.setTimeout(() => {\r\n popover.show()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n const hidePopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n hideTimeout.current = window.setTimeout(() => {\r\n popover.hide()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n // Unmount cleanup\r\n React.useEffect(() => () => clearTimeouts.current(), [])\r\n\r\n return {\r\n ...popover,\r\n show: showPopover.current,\r\n hide: hidePopover.current,\r\n onMouseOver: showPopover.current,\r\n onMouseOut: hidePopover.current,\r\n onMouseDown: preventDefault,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { usePopoverMaxHeight } from '../../../hooks/use-popover-maxHeight'\r\nimport { useWindowSize } from '../../../hooks/use-window-size'\r\nimport { Box, BoxProps } from '../../box'\r\nimport { getExtendedDialogState, useZIndex } from '../../dialog'\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport interface PopoverProps extends BoxProps, Pick {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * Focus the popover when it opens\r\n *\r\n * @default true\r\n */\r\n focusOnShow?: Reakit.PopoverProps['unstable_autoFocusOnShow']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default true\r\n */\r\n focusOnHide?: Reakit.PopoverProps['unstable_autoFocusOnHide']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default undefined\r\n */\r\n finalFocusRef?: Reakit.PopoverProps['unstable_finalFocusRef']\r\n\r\n /**\r\n * Hides when clicked outside of popover, works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside?: Reakit.PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Overlay click callback or if false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Popover wrapper css style object\r\n *\r\n * @default undefined\r\n */\r\n popoverWrapperStyle?: React.CSSProperties\r\n\r\n /**\r\n * Show popover arrow\r\n *\r\n * @default false\r\n */\r\n hasArrow?: boolean\r\n\r\n /**\r\n * Enable or disable backdrop click events\r\n *\r\n * @default true\r\n */\r\n hasBackdrop?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Can be used together with `hasViewportHeightLimit` to limit the height of the popover\r\n *\r\n * @default undefined\r\n */\r\n popoverMaxHeight?: number\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n children,\r\n focusOnShow = true,\r\n focusOnHide = true,\r\n finalFocusRef,\r\n 'aria-label': ariaLabel,\r\n hide,\r\n hideOnClickOutside = true,\r\n hasBackdrop = true,\r\n onOverlayClick,\r\n popoverWrapperStyle,\r\n popoverMaxHeight = Number.MAX_SAFE_INTEGER,\r\n theme = 'light',\r\n hasViewportHeightLimit = false,\r\n hasButtonWidthLimit = false,\r\n ...props\r\n}: PopoverProps) {\r\n const zIndex = useZIndex()\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const { innerHeight } = useWindowSize({ isWatching: !isFullyClosed })\r\n\r\n const buttonElement = state.unstable_referenceRef.current\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: popoverMaxHeight,\r\n hasViewportHeightLimit,\r\n offsets: state.offsets,\r\n state,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !(hasViewportHeightLimit || hasButtonWidthLimit)) return\r\n\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n\r\n // Limit popover max-width to be width of the trigger button\r\n if (hasButtonWidthLimit) {\r\n popoverWrapper?.style.setProperty('max-width', `${buttonRect.width}px`)\r\n }\r\n }, [\r\n state.visible,\r\n state.offsets,\r\n buttonElement,\r\n hasViewportHeightLimit,\r\n hasButtonWidthLimit,\r\n innerHeight,\r\n state.placement,\r\n popoverMaxHeight,\r\n ])\r\n\r\n if (isFullyClosed) return null\r\n\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n <>\r\n {\r\n // prevents from page scroll when clicked outside of popover\r\n event.preventDefault()\r\n }}\r\n />\r\n \r\n \r\n {children}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { useZIndex } from '../../dialog'\r\n\r\ninterface PopoverButtonProps extends Reakit.PopoverDisclosureHTMLProps {\r\n state: Reakit.PopoverStateReturn\r\n as?: React.ElementType\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverButtonProps, ref: React.ForwardedRef) => {\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { List, ListItem, useListState } from '../list'\r\nimport { useList } from '../list/hooks'\r\nimport { NativeSelect } from '../select/NativeSelect'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { useHoverPopover } from './popover/hooks'\r\nimport { Popover } from './popover/popover'\r\nimport { PopoverTrigger } from './popover/popover-trigger'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n}\r\n\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const listState = useListState({ currentId: null })\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useList(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\r\n ({ value: item.id, label: item.title }))}\r\n onChange={(option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n ) : (\r\n \r\n \r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage?.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage?.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps } from '../button'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum TabSpacing {\r\n xxsmall = 'space-x-0.5', // 2px spacing\r\n xsmall = 'space-x-1', // 4px spacing\r\n none = 'space-x-1.5', // 6px spacing\r\n small = 'space-x-1.5', // 6px spacing\r\n regular = 'space-x-1.5', // 6px spacing\r\n medium = 'space-x-2', // 8px spacing\r\n large = 'space-x-2', // 8px spacing\r\n}\r\n\r\nfunction getRightContent(content: JSX.Element | IconNameType | undefined, isActive: boolean) {\r\n if (isValidIconName(content)) return \r\n else if (React.isValidElement(content))\r\n return React.cloneElement(content as React.ReactElement<{ active: boolean }>, {\r\n active: isActive,\r\n })\r\n else return content\r\n}\r\n\r\nconst InternalTab = React.forwardRef(function InternalTab<\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n {\r\n rounding = 'none',\r\n theme = 'tab',\r\n size = 'medium',\r\n 'aria-selected': ariaSelected,\r\n children,\r\n ...props\r\n }: Omit, 'theme'>,\r\n ref: React.ForwardedRef\r\n) {\r\n const spacing = TabSpacing[size]\r\n const active = Boolean(ariaSelected)\r\n const rightContent = getRightContent(props.rightContent, active)\r\n\r\n return (\r\n )}\r\n ref={ref}\r\n active={active}\r\n theme={theme}\r\n size={size}\r\n rounding={rounding}\r\n rightContent={undefined}\r\n className={classNames('group/badge', props.className)}\r\n contentClass={classNames(spacing, 'flex', props.contentClass)}\r\n >\r\n {children}\r\n {rightContent}\r\n \r\n )\r\n})\r\n\r\nexport function Tab(\r\n props: React.PropsWithChildren>\r\n) {\r\n return } />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\n\r\nexport function TabList(props: Ariakit.TabListProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function TabPanel(props: Ariakit.TabPanelProps) {\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function Tabs({ children }: React.PropsWithChildren) {\r\n return (\r\n \r\n
{children}
\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum BadgeSize {\r\n small = 'h-4 min-w-4', // 16px height\r\n medium = 'h-5 min-w-5', // 20px height\r\n}\r\ntype BadgeSizeType = keyof typeof BadgeSize\r\n\r\nenum BadgePadding {\r\n small = 'px-[5px] py-0', // 16px height\r\n medium = 'px-1.5 py-0.5', // 20px height\r\n}\r\ntype BadgePaddingType = keyof typeof BadgePadding\r\n\r\ntype BadgeProps = {\r\n size?: BadgeSizeType\r\n padding?: BadgePaddingType\r\n active?: boolean\r\n}\r\n\r\nexport function Badge({ size = 'medium', padding = size, active, children }: React.PropsWithChildren) {\r\n const badgePadding = BadgePadding[padding]\r\n const badgeSize = BadgeSize[size]\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport enum PopoverRounding {\r\n none = '',\r\n regular = 'rounded-lg',\r\n}\r\n\r\nexport enum PopoverTheme {\r\n none = '',\r\n default = 'flex flex-col overflow-hidden border border-primary bg-primary shadow-modal dark:shadow-modal-dark',\r\n}\r\n\r\nfunction focusWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\nexport interface PopoverProps extends Omit, 'ref'>, Ariakit.PopoverProps {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * When true, the popover will be rendered in a portal and all outside elements won’t be interactable\r\n *\r\n * @default true\r\n */\r\n modal?: boolean\r\n\r\n /**\r\n * Set rounding for the popover\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof PopoverRounding\r\n\r\n /**\r\n * Popover theme\r\n */\r\n theme?: keyof typeof PopoverTheme\r\n\r\n /**\r\n * The amount of space between button and its popover\r\n *\r\n * @default 4\r\n */\r\n gutter?: number\r\n\r\n /**\r\n * Hide the popover when user presses ESC\r\n *\r\n * @default true\r\n */\r\n hideOnEsc?: boolean\r\n\r\n /**\r\n * Show backdrop on the popover. Provide your own element if you want to add background or animation\r\n *\r\n */\r\n backdrop?: false | JSX.Element\r\n\r\n /**\r\n * Do not render the items when the popover is not visible\r\n *\r\n * @default true\r\n */\r\n unmountOnHide?: boolean\r\n\r\n /**\r\n * By default the popover hides when backdrop is clicked. When backdrop is disabled you can use this prop to\r\n * enable hiding when clicking outside of the popover\r\n */\r\n hideOnInteractOutside?: boolean\r\n\r\n /**\r\n * Callback before the popover starts hiding. Event can be prevented which keeps the popover open\r\n * This callback isn’t called on backdrop click. Use `backdrop={
}` to react on backdrop clicks\r\n */\r\n onClose?: (event: Event) => void\r\n\r\n /**\r\n * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n */\r\n autoFocusOnShow?: false | (() => boolean)\r\n\r\n /**\r\n * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n */\r\n autoFocusOnHide?: false | (() => boolean)\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n modal = true,\r\n rounding = 'regular',\r\n theme = 'default',\r\n gutter = 4,\r\n hideOnEsc = true,\r\n backdrop,\r\n unmountOnHide = true,\r\n onClose,\r\n 'aria-label': ariaLabel,\r\n hideOnInteractOutside,\r\n autoFocusOnShow,\r\n autoFocusOnHide,\r\n children,\r\n ...props\r\n}: PopoverProps) {\r\n const isPopoverOpen = state?.useState('open')\r\n const placement = state.useState('currentPlacement')\r\n const [isFullyOpen, setIsFullyOpen] = React.useState(isPopoverOpen)\r\n\r\n // Check if the trigger element is input-like so we can keep it focused\r\n const triggerElement = React.useMemo(\r\n () => (isPopoverOpen ? state.getState().disclosureElement : null),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [isPopoverOpen]\r\n )\r\n const isTriggerInput = triggerElement instanceof HTMLInputElement || triggerElement instanceof HTMLTextAreaElement\r\n\r\n return (\r\n [triggerElement!] : undefined}\r\n hideOnInteractOutside={hideOnInteractOutside ?? (!modal && !backdrop)}\r\n // Cypress doesn’t wait for transitions to complete and it could lead to bugs with other popover components (ResizeObserver loop exceeded)\r\n // If you encounter this problem, just do `cy.get('[data-fully-open=true]').should('exist')` before continuing to wait for the popover\r\n data-fully-open={isFullyOpen}\r\n onTransitionEnd={(ev) => {\r\n if (ev.target === ev.currentTarget && isPopoverOpen) setIsFullyOpen(true)\r\n }}\r\n onClose={(ev) => {\r\n onClose?.(ev)\r\n // prevented means the dialog didn’t close\r\n if (!ev.defaultPrevented) setIsFullyOpen(false)\r\n }}\r\n // Custom event prevents scrolling issues\r\n // See website PR #1968\r\n backdrop={\r\n backdrop ?? (\r\n {\r\n ev.preventDefault()\r\n state?.hide()\r\n }}\r\n />\r\n )\r\n }\r\n className={classnames(\r\n props.className,\r\n PopoverRounding[rounding],\r\n PopoverTheme[theme],\r\n 'custom-scrollbar absolute z-dialog max-w-[--popover-available-width] overscroll-contain outline-none',\r\n // Animations\r\n 'opacity-0 transition duration-[250ms] data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n {\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-bottom))] motion-safe:-translate-y-1':\r\n placement.startsWith('bottom'),\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-top))] motion-safe:translate-y-1':\r\n placement.startsWith('top'),\r\n }\r\n )}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState({ placement = 'bottom-start', ...settings }: Ariakit.PopoverStoreProps = {}) {\r\n return Ariakit.usePopoverStore({ placement, ...settings })\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\ninterface PopoverTriggerProps extends Omit {\r\n state: Ariakit.PopoverStore\r\n}\r\n\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverTriggerProps, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport const PopoverAnchor = Ariakit.PopoverAnchor\r\n","import * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SelectItem, SelectItemGroup } from './types'\r\nimport { flattenItems, isSelectItemGroup } from './utils'\r\n\r\ninterface NativeSelectProps extends Omit, 'onChange'> {\r\n items: ItemType[]\r\n onChange?: (item: ItemType) => void\r\n}\r\n\r\nexport function NativeSelect | SelectItem>({\r\n items,\r\n onChange,\r\n placeholder = 'Select value',\r\n ...props\r\n}: NativeSelectProps) {\r\n const showPlaceholder = props.value === -1\r\n const handleNativeSelectChange = React.useCallback(\r\n (e: React.ChangeEvent) => {\r\n const itemIndex = e.target.selectedIndex + (showPlaceholder ? -1 : 0)\r\n const selectedItem = flattenItems(items)[itemIndex] as SelectItem\r\n\r\n if (!selectedItem) return\r\n\r\n onChange?.(selectedItem as any)\r\n\r\n if (!selectedItem.href || !selectedItem.reloadDocument) {\r\n return\r\n }\r\n\r\n if (typeof selectedItem.href === 'string') {\r\n window.location.href = selectedItem.href\r\n return\r\n }\r\n\r\n const newUrl = new URL(selectedItem.href.pathname!, window.location.href)\r\n newUrl.search = selectedItem.href.search ?? ''\r\n newUrl.hash = selectedItem.href.hash ?? ''\r\n\r\n window.location.href = newUrl.toString()\r\n },\r\n [items, onChange, showPlaceholder]\r\n )\r\n\r\n return (\r\n \r\n {showPlaceholder && }\r\n {items.map((item, itemIndex) => {\r\n if (isSelectItemGroup(item)) {\r\n return (\r\n \r\n {item.items.map((option, optionIndex) => (\r\n \r\n ))}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport function NativeSelectInRouterContext | SelectItem>(\r\n props: NativeSelectProps\r\n) {\r\n const navigate = useNavigate()\r\n\r\n const onChangeWithNavigate = React.useCallback(\r\n (item: SelectItem) => {\r\n props.onChange?.(item as any)\r\n\r\n if (item.href) navigate(item.href)\r\n },\r\n // We don’t need the whole props here, just onChange and items\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [navigate, props.onChange, props.items]\r\n )\r\n\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface ItemsGroupProps extends Omit, 'ref' | 'label'> {\r\n /**\r\n * Group label\r\n */\r\n label?: string\r\n}\r\n\r\nexport const ItemsGroup = React.forwardRef(function ItemsGroup(\r\n { label, children, ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {label && {label}}\r\n {children}\r\n \r\n )\r\n})\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonPadding, ButtonThemeType } from '../button'\r\n\r\ninterface InternalOptionProps {\r\n /**\r\n * Description for the option\r\n */\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Set the button theme when it is selected\r\n */\r\n activeTheme?: ButtonThemeType\r\n\r\n /**\r\n * Set the base button theme when not selected\r\n */\r\n theme?: ButtonThemeType | ((isHovered: boolean) => ButtonThemeType)\r\n}\r\n\r\nfunction getDefaultTheme(isHovered: boolean) {\r\n return isHovered ? 'menuItem' : 'menuItemTransparent'\r\n}\r\n\r\nconst InternalOption = React.forwardRef(function InternalOption<\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n {\r\n subtitle,\r\n children,\r\n 'aria-selected': ariaSelected,\r\n 'data-active-item': dataActiveItem,\r\n rounding = 'small',\r\n activeTheme = 'blue',\r\n theme = getDefaultTheme,\r\n ...props\r\n }: Omit, 'theme'> & InternalOptionProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSelected = ariaSelected === true\r\n const isHovered = dataActiveItem === true\r\n const defaultTheme = typeof theme === 'function' ? theme(isHovered) : theme\r\n\r\n return (\r\n )}\r\n ref={ref}\r\n align=\"left\"\r\n className={classNames(props.className, ButtonPadding.regular, 'select-none', {\r\n 'text-2xs': !!subtitle && !props.theme,\r\n })}\r\n contentClass={classNames(props.contentClass, 'font-normal')}\r\n rounding={rounding}\r\n active={props.active ?? (isHovered && !isSelected)}\r\n theme={isSelected ? activeTheme : defaultTheme}\r\n size={props.size ?? (subtitle ? 'none' : props.size)}\r\n aria-selected={ariaSelected}\r\n data-active-item={dataActiveItem}\r\n >\r\n {children}\r\n {subtitle && (\r\n \r\n {subtitle}\r\n
\r\n )}\r\n \r\n )\r\n})\r\n\r\ninterface SelectOptionProps extends InternalOptionProps {\r\n value: ValueType\r\n}\r\n\r\nexport const SelectOption = React.forwardRef(function SelectOption<\r\n ValueType,\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n { as, ...props }: Omit, 'value' | 'theme'> & SelectOptionProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = Ariakit.useSelectContext()!\r\n const isComboBox = !!context.combobox\r\n\r\n return (\r\n } /> : }\r\n />\r\n )\r\n})\r\n","import { SelectRenderer, SelectRendererItemProps } from '@ariakit/react-core/select/select-renderer'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { ButtonRoundingType } from '../button'\r\nimport { ItemsGroup } from './ItemsGroup'\r\nimport { SelectOption } from './SelectOption'\r\nimport { SelectItem, SelectItemGroup } from './types'\r\nimport { filterSelectOptions, getSelectItemProps, isSelectItem } from './utils'\r\n\r\ninterface SelectItemsVirtualizedProps {\r\n hasGroups: boolean\r\n itemRenderer: (item: SelectItem, providedProps?: any) => React.ReactNode\r\n}\r\n\r\nfunction SelectItemsVirtualized(props: SelectItemsVirtualizedProps) {\r\n return (\r\n \r\n {({ value: groupOritem, index, label, ...restProps }: any) => {\r\n if (isSelectItem(groupOritem)) {\r\n return props.itemRenderer(groupOritem, { key: index, ...restProps })\r\n }\r\n\r\n return (\r\n (\r\n \r\n {rendererProps.children}\r\n \r\n )}\r\n >\r\n {({ value, index, ...restItem }: SelectRendererItemProps<{ value: SelectItem }>) =>\r\n props.itemRenderer(value, { key: index, ...restItem })\r\n }\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\ninterface SelectItemsProps {\r\n searchValue: string\r\n items?: ItemType[]\r\n rounding?: ButtonRoundingType\r\n parentTestId?: string\r\n}\r\n\r\nexport function SelectItems | SelectItemGroup>({\r\n items,\r\n rounding,\r\n searchValue,\r\n parentTestId,\r\n virtualized,\r\n}: SelectItemsProps & { virtualized?: boolean }) {\r\n const isInRouterContext = useInRouterContext()\r\n const filteredItems = React.useMemo(() => filterSelectOptions(items, searchValue), [items, searchValue])\r\n\r\n const getItem = React.useCallback(\r\n (innerItem: SelectItem, providedProps?: any) => (\r\n \r\n {innerItem.label}\r\n \r\n ),\r\n [isInRouterContext, parentTestId, rounding, virtualized]\r\n )\r\n\r\n if (!filteredItems.length) {\r\n return
Nothing to select
\r\n }\r\n\r\n if (virtualized) {\r\n const hasGroups = isSelectItem(items?.[0]) === false\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n {filteredItems.map((item, index) => {\r\n if (isSelectItem(item)) {\r\n return getItem(item, { key: index })\r\n }\r\n\r\n return (\r\n \r\n {item.items.map((item, itemIndex) => getItem(item, { key: itemIndex }))}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Input } from '../input'\r\n\r\nenum ListRounding {\r\n none = '',\r\n regular = 'rounded-lg',\r\n}\r\n\r\nenum ListTheme {\r\n none = '',\r\n default = 'border border-primary bg-primary',\r\n}\r\n\r\nfunction focusWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\nfunction onBackdropClick(ev: React.MouseEvent) {\r\n ev.preventDefault()\r\n}\r\n\r\nexport interface SelectListProps {\r\n /**\r\n * Internal prop which enables input at the top of the popover list\r\n */\r\n isComboBox?: boolean\r\n\r\n /**\r\n * Set rounding for the popover list\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof ListRounding\r\n\r\n /**\r\n * Popover theme\r\n */\r\n theme?: keyof typeof ListTheme\r\n\r\n /**\r\n * The amount of space between button and its popover\r\n *\r\n * @default 4\r\n */\r\n gutter?: number\r\n\r\n /**\r\n * Change how the items are laid out\r\n *\r\n * @default vertical\r\n */\r\n orientation?: 'vertical' | 'horizontal'\r\n\r\n /**\r\n * Custom popover class\r\n */\r\n className?: string\r\n\r\n /**\r\n * Internal prop used to display no results when automatic `item` filtering doesn’t return any items\r\n */\r\n hasItemChildren?: boolean\r\n\r\n /**\r\n * Do not render the items when the popover is not visible\r\n *\r\n * @default false\r\n */\r\n unmountOnHide?: boolean\r\n}\r\n\r\nexport function SelectList({\r\n isComboBox,\r\n rounding = 'regular',\r\n theme = 'default',\r\n gutter = 4,\r\n orientation = 'vertical',\r\n className,\r\n unmountOnHide = false,\r\n hasItemChildren,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const ListElement = React.useMemo(\r\n () => (isComboBox ? Ariakit.ComboboxList : (wrapperProps: any) =>
),\r\n [isComboBox]\r\n )\r\n const context = Ariakit.useSelectContext()!\r\n const placement = context.useState('currentPlacement')\r\n const hasChildren = hasItemChildren || React.Children.count(children) > 0\r\n\r\n return (\r\n }\r\n className={classNames(\r\n className,\r\n ListRounding[rounding],\r\n ListTheme[theme],\r\n 'custom-scrollbar absolute z-dialog flex flex-col overflow-hidden shadow-modal outline-none dark:shadow-modal-dark',\r\n // These are set by popper, we just need to make sure we don’t encroach on the safe insets\r\n 'min-w-[--popover-anchor-width] max-w-[--popover-available-width]',\r\n // Animations\r\n 'opacity-0 transition duration-[250ms] data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n {\r\n // When in combobox mode, the padding is smaller so we can render a gradient under the combobox input.\r\n // Change the custom scrollbar offset so the top of the first item fits the top of our scrollbar\r\n '[--scrollbar-offset-top:theme(spacing.1)]': isComboBox,\r\n '[--scrollbar-radius:0]': ListRounding[rounding] === ListRounding.none,\r\n // Direction based styles\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-bottom))] motion-safe:-translate-y-1':\r\n placement.startsWith('bottom'),\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-top))] motion-safe:translate-y-1':\r\n placement.startsWith('top'),\r\n }\r\n )}\r\n >\r\n {isComboBox && (\r\n
\r\n
\r\n \r\n }\r\n />\r\n
\r\n
\r\n
\r\n )}\r\n \r\n {hasChildren ? children :
Nothing to select
}\r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { notifyOnVisibilityChange } from '../../../app/shared/documentVisibility'\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../tooltip'\r\n\r\nexport function SelectTooltip({ content, children }: { content: React.ReactNode; children: JSX.Element }) {\r\n const tooltipState = useTooltipState({ placement: 'bottom', showTimeout: 300 })\r\n const context = Ariakit.useSelectContext()\r\n const isSelectOpen = context?.useState('open')\r\n const hasShownTooltip = React.useRef(false)\r\n\r\n React.useEffect(() => {\r\n if (isSelectOpen) hasShownTooltip.current = true\r\n }, [isSelectOpen])\r\n\r\n /**\r\n * Ignore focus re-trigger (do not show tooltip) when page visibility/focus state changes\r\n * - some browsers re-trigger focus on `activeElement` when document becomes visible\r\n */\r\n React.useEffect(() => {\r\n const subscription = notifyOnVisibilityChange((visible) => {\r\n if (!visible) tooltipState?.hide()\r\n })\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n // Changing this to `tooltip` dependency will run this effect on every render\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n <>\r\n {\r\n // Do not open again unless user focuses the button again (or presses another ESC)\r\n if (hasShownTooltip.current) ev.preventDefault()\r\n hasShownTooltip.current = false\r\n }}\r\n />\r\n {content}\r\n \r\n )\r\n}\r\n\r\nexport function SelectTooltipWrapper({ content, children }: { content?: React.ReactNode; children: JSX.Element }) {\r\n if (!content) return null\r\n\r\n return {children}\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport { Placement } from '@popperjs/core'\r\nimport * as React from 'react'\r\n\r\nimport { SelectButtonProps } from './SelectButton'\r\nimport { SelectItems } from './SelectItems'\r\nimport { SelectList, SelectListProps } from './SelectList'\r\nimport { SelectTooltipWrapper } from './SelectTooltipWrapper'\r\nimport { SelectItem, SelectItemGroup } from './types'\r\nimport { isSelectItem } from './utils'\r\n\r\nexport interface DesktopSelectProps\r\n extends Omit<\r\n SelectButtonProps,\r\n // Fix clash with `button` element html props\r\n 'value' | 'defaultValue' | 'onChange' | 'label' | 'name' | 'valueOverride'\r\n >,\r\n Pick {\r\n /**\r\n * Name of the select which coudl be used to distinguish onChange events.\r\n * Passed as 2nd argument to `onChange`\r\n */\r\n name?: Name\r\n\r\n /**\r\n * Set value for the select\r\n */\r\n value?: ValueType\r\n\r\n /**\r\n * Set default value for an uncontrolled select\r\n */\r\n defaultValue?: ValueType\r\n\r\n /**\r\n * Label to display above the select\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Callback when item changes. Called for both controlled and uncontrolled selects\r\n */\r\n onChange?: (\r\n item: ItemType extends SelectItemGroup\r\n ? ValueType extends SelectItem\r\n ? ValueType\r\n : SelectItem\r\n : ItemType,\r\n name: Name\r\n ) => void\r\n\r\n /**\r\n * Options to select from. When defined, the options are constructed automatically\r\n * so you don’t have to pass children to the select.\r\n *\r\n * When `nativeSelect` is set to \"mobile\", children take precedence on desktop\r\n */\r\n items?: ItemType[]\r\n\r\n /**\r\n * Enable virtualization of select items to improve performance of long lists\r\n *\r\n * @default items.length > 50\r\n */\r\n virtualized?: boolean\r\n\r\n /**\r\n * Custom button renderer for the select\r\n */\r\n trigger?: JSX.Element\r\n\r\n /**\r\n * Text for the button (usually the selected value). Falls back to placeholder if not set\r\n */\r\n triggerContent?: React.ReactNode\r\n\r\n /**\r\n * Show tooltip on the select\r\n */\r\n tooltip?: React.ReactNode\r\n\r\n /**\r\n * Popover placement\r\n *\r\n * @default \"bottom-start\"\r\n */\r\n placement?: Placement\r\n\r\n /**\r\n * Change the direction of the items placement in popover\r\n *\r\n * @default vertical\r\n */\r\n orientation?: 'vertical' | 'horizontal'\r\n\r\n /**\r\n * Set whether or not the Select is interactive to save resources. If not interactive,\r\n * the select only renders a placeholder button\r\n *\r\n * @default true\r\n */\r\n isInteractive?: boolean\r\n\r\n /**\r\n * Callback when the select opens or closes\r\n */\r\n onInteractionChange?: (open: boolean) => void\r\n\r\n /**\r\n * ### Only applicable for desktop selects without `children`, when passing `items`.\r\n * ### If you want to pass `children`, use the `onSearch` prop instead.\r\n *\r\n * Specifies whether or not to show a search input inside of the popover. Number\r\n * specifies the >= number of items after which search will be visible.\r\n * Search is made for both value and label props\r\n *\r\n * @default 10\r\n */\r\n comboBox?: boolean | number\r\n\r\n /**\r\n * ### Only applicable for desktop selects with `children`.\r\n * ### Use `comboBox` if you have `items` prop\r\n * When defined, the select is considered being a combobox and will display\r\n * input for filtering items. The filtering is up to the user.\r\n */\r\n onSearch?: (value: string) => void\r\n\r\n /**\r\n * When combined with `items` the children will automatically have testid assigned.\r\n * Otherwise just passed to the trigger button\r\n */\r\n 'data-testid'?: string\r\n\r\n listProps?: SelectListProps\r\n}\r\n\r\nfunction getCollectionItem(item: SelectItem, index: number) {\r\n return {\r\n id: `item-${index}-${String(item.value).replace(/\\W/g, '')}`,\r\n label: item.label,\r\n value: item,\r\n children: item.label,\r\n }\r\n}\r\n\r\nexport function DesktopSelect<\r\n ValueType,\r\n ItemType extends SelectItem | SelectItemGroup,\r\n Name = never,\r\n>({\r\n name,\r\n label,\r\n value,\r\n defaultValue,\r\n onChange,\r\n items,\r\n virtualized = (items?.length ?? 0) > 50,\r\n trigger,\r\n tooltip,\r\n onInteractionChange,\r\n comboBox,\r\n onSearch,\r\n children,\r\n gutter,\r\n placement = 'bottom-start',\r\n orientation,\r\n listProps,\r\n ...props\r\n}: React.PropsWithChildren>) {\r\n // Used when `items` are passed to construct a desktop select with comboBox\r\n const [internalSearch, setInternalSearch] = React.useState('')\r\n\r\n // Setup combobox if enabled\r\n const isComboBox =\r\n !!onSearch || comboBox === true || (typeof comboBox === 'number' && !!items && items.length > comboBox)\r\n const SelectWrapper = isComboBox ? Ariakit.ComboboxProvider : React.Fragment\r\n const wrapperProps = React.useMemo(\r\n () =>\r\n isComboBox ? { resetValueOnHide: true, includesBaseElement: false, setValue: onSearch ?? setInternalSearch } : {},\r\n [isComboBox, onSearch]\r\n )\r\n\r\n // Handle tooltip prop\r\n const ButtonWrapper = tooltip ? SelectTooltipWrapper : React.Fragment\r\n const buttonWrapperProps = React.useMemo(() => (tooltip ? { content: tooltip } : {}), [tooltip])\r\n\r\n if (isComboBox && !!children && !onSearch) {\r\n console.warn(\r\n 'ComboBoxes with children options require `onSearch` prop, otherwise searching will not work. \\n Either provide `onSearch` or disable this behavior by passing `comboBox={false}`'\r\n )\r\n }\r\n\r\n const listItems = React.useMemo(\r\n () =>\r\n items?.map((item, index) =>\r\n isSelectItem(item) ? getCollectionItem(item, index) : { ...item, items: item.items.map(getCollectionItem) }\r\n ) as ItemType[],\r\n [items]\r\n )\r\n\r\n return (\r\n \r\n {/* @ts-expect-error - The types are wrong here, the select allows any values, not just strings or ints */}\r\n \r\n // Loop to the first item after pressing arrow down on last item\r\n focusLoop\r\n virtualFocus\r\n value={value}\r\n defaultValue={defaultValue ?? ''}\r\n // Item will always be of ItemType\r\n setValue={(item) => setTimeout(() => onChange?.(item as any, name!), 50)}\r\n setOpen={onInteractionChange}\r\n placement={placement}\r\n orientation={orientation}\r\n defaultItems={listItems}\r\n >\r\n {label && {label}}\r\n\r\n \r\n \r\n \r\n\r\n \r\n {/* Either construct options from children or provided items prop */}\r\n {children ?? (\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps, ButtonSize } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { SelectItem } from './types'\r\nimport { isSelectItem } from './utils'\r\n\r\ntype ValueType = SelectItem | string\r\n\r\nconst DEFAULT_RIGHT_ICON = 'caretDown'\r\n\r\nexport interface SelectButtonProps extends Omit, Omit {\r\n /**\r\n * Show a spinner in place of the button caret. The spinner is wrapped in Delayed\r\n * and uses the default timeout\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Placeholder when no value is selected\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Override for the select value from context. Used to provide value for native\r\n * select trigger\r\n */\r\n valueOverride?: ValueType\r\n\r\n rightContent?: boolean | IconNameType | JSX.Element\r\n}\r\n\r\nexport const SelectButton = React.forwardRef>(\r\n function SelectButton(\r\n {\r\n isLoading,\r\n placeholder = 'Select value',\r\n children,\r\n valueOverride,\r\n theme = 'outline',\r\n rightContent = DEFAULT_RIGHT_ICON,\r\n ...props\r\n },\r\n ref\r\n ) {\r\n const context = Ariakit.useSelectContext()\r\n const contextValue = context?.useState('value') as ValueType\r\n const isOpen = context?.useState('open')\r\n const selectedValue = valueOverride ?? contextValue\r\n\r\n let buttonText = placeholder\r\n if (isSelectItem(selectedValue)) buttonText = selectedValue.label ?? selectedValue.value\r\n else if (typeof selectedValue === 'string' && selectedValue.length) buttonText = selectedValue\r\n else if (selectedValue) buttonText = String(selectedValue)\r\n\r\n const rightIcon =\r\n isValidIconName(rightContent) || rightContent === true ? (\r\n \r\n ) : React.isValidElement(rightContent) ? (\r\n rightContent\r\n ) : undefined\r\n\r\n return (\r\n \r\n \r\n \r\n ) : (\r\n rightIcon\r\n )\r\n }\r\n >\r\n {children ?? buttonText}\r\n \r\n )\r\n }\r\n)\r\n","import * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { DesktopSelect, DesktopSelectProps } from './DesktopSelect'\r\nimport { NativeSelect, NativeSelectInRouterContext } from './NativeSelect'\r\nimport { SelectButton } from './SelectButton'\r\nimport { SelectItem } from './types'\r\nimport { findSelectedIndex, findSelectedValue } from './utils'\r\n\r\nconst isMobileDevice = isMobile()\r\n\r\nexport interface SelectProps extends DesktopSelectProps {\r\n /**\r\n * Whether or not to show a native select when clicking the button.\r\n * When rendering native select, you must provide `items`, `value` and `onChange`\r\n *\r\n * @default false\r\n */\r\n nativeSelect?: boolean | 'mobile'\r\n}\r\n\r\nexport function Select({\r\n name,\r\n label,\r\n value: providedValue,\r\n defaultValue: providedDefaultValue,\r\n onChange,\r\n items,\r\n trigger,\r\n gutter,\r\n orientation,\r\n triggerContent,\r\n isInteractive = true,\r\n onInteractionChange,\r\n nativeSelect = false,\r\n comboBox = 10,\r\n onSearch,\r\n 'data-testid': dataTestid,\r\n listProps,\r\n virtualized,\r\n ...props\r\n}: React.PropsWithChildren>) {\r\n // Used by native select to handle navigation for link items\r\n const isInRouterContext = useInRouterContext()\r\n // Let users either provide the selected item or its value. Items can also be grouped so we need to find the correct value\r\n const value = findSelectedValue(items, providedValue) ?? providedValue\r\n const defaultValue = findSelectedValue(items, providedDefaultValue) ?? providedDefaultValue\r\n\r\n // Extracted trigger to a variable because it is used in every branch\r\n const selectTrigger = trigger ?? (\r\n ) : undefined\r\n }\r\n data-testid={dataTestid}\r\n >\r\n {triggerContent}\r\n \r\n )\r\n\r\n // Save some resources by rendering the trigger only\r\n if (!isInteractive) {\r\n return selectTrigger\r\n }\r\n\r\n const renderNativeSelect = nativeSelect === true || (nativeSelect === 'mobile' && isMobileDevice)\r\n if (renderNativeSelect) {\r\n const NativeSelectComponent = isInRouterContext ? NativeSelectInRouterContext : NativeSelect\r\n const selectedIndex = findSelectedIndex(items, providedValue ?? providedDefaultValue)\r\n\r\n return (\r\n
\r\n {selectTrigger}\r\n
\r\n )\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Link } from 'react-router-dom'\r\n\r\nimport { SelectItem, SelectItemGroup } from './types'\r\n\r\nexport function getSelectItemProps(item: SelectItem, inRouterContext?: boolean) {\r\n if (item.href) {\r\n if (inRouterContext) return { as: Link, to: item.href, reloadDocument: item.reloadDocument }\r\n else return { as: 'a', href: item.href }\r\n }\r\n\r\n return {}\r\n}\r\n\r\nexport function isSelectItem(item: unknown): item is SelectItem {\r\n return !!(item?.hasOwnProperty('label') && item?.hasOwnProperty('value')) && !item?.hasOwnProperty('items')\r\n}\r\n\r\nexport function isSelectItemGroup(item: unknown): item is SelectItemGroup {\r\n return !!item?.hasOwnProperty('items')\r\n}\r\n\r\nfunction matchesSearchTerm(item: SelectItem, searchTerm: string) {\r\n const lowerSearch = searchTerm.toLowerCase()\r\n\r\n return (\r\n (typeof item.value === 'string' && item.value.toLowerCase().includes(lowerSearch)) ||\r\n item.label.toLowerCase().includes(lowerSearch)\r\n )\r\n}\r\n\r\nfunction isSameItem(obj1: unknown, obj2?: unknown) {\r\n if (isSelectItem(obj1) && isSelectItem(obj2)) return obj1.value === obj2.value\r\n else if (isSelectItem(obj1)) return obj1.value === obj2\r\n return obj1 === obj2\r\n}\r\n\r\n/**\r\n * Used in combobox to find matching items\r\n */\r\nexport function filterSelectOptions | SelectItemGroup>(\r\n items: ItemType[] | undefined,\r\n searchTerm: string\r\n) {\r\n const finalResults: ItemType[] = []\r\n\r\n items?.forEach((item) => {\r\n if (isSelectItemGroup(item)) {\r\n const filtered = item.items.filter((option) => matchesSearchTerm(option, searchTerm))\r\n if (filtered.length) finalResults.push({ ...item, items: filtered })\r\n } else if (matchesSearchTerm(item, searchTerm)) {\r\n finalResults.push(item)\r\n }\r\n })\r\n\r\n return finalResults\r\n}\r\n\r\n/**\r\n * Used in select to allow users to pass any kind of valid value\r\n */\r\nexport function findSelectedValue(\r\n items: ItemType[] = [],\r\n value?: ValueType | SelectItem\r\n) {\r\n for (const item of items) {\r\n if (isSelectItemGroup(item)) {\r\n const foundItem = item.items.find((option) => isSameItem(option, value)) as SelectItem\r\n if (foundItem) return foundItem\r\n } else if (isSameItem(item, value)) {\r\n return item as SelectItem\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Used for native selects to match against user provided value\r\n */\r\nexport function findSelectedIndex(\r\n items: ItemType[] = [],\r\n value?: ValueType | SelectItem\r\n) {\r\n for (let index = 0; index < items.length; index++) {\r\n const item = items[index]\r\n\r\n if (isSelectItemGroup(item)) {\r\n const itemIndex = item.items.findIndex((option) => isSameItem(option, value))\r\n if (itemIndex > -1) return `${index}${itemIndex}`\r\n } else if (isSameItem(item, value)) {\r\n return index\r\n }\r\n }\r\n\r\n return -1\r\n}\r\n\r\nexport function flattenItems(items: ItemType[]) {\r\n return items.flatMap((itemOrGroup) =>\r\n isSelectItemGroup(itemOrGroup) ? (itemOrGroup.items as ItemType[]) : itemOrGroup\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Link, To } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { ButtonRoundingType, ButtonSizeType } from '../button'\r\nimport { DropdownSeparator } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { Select, SelectOption } from '../select'\r\nimport { SelectItem } from '../select/types'\r\n\r\nexport interface DateRangeBaseOption extends SelectItem {\r\n timeframe?: TIMEFRAME\r\n href?: To\r\n withReload?: boolean\r\n}\r\n\r\ninterface Props {\r\n chartIndex: number\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedDateRange: string | null\r\n onDateRangeSelect: (value: DateRange) => void\r\n onCustomDateRangeClick?: () => void\r\n rounding?: ButtonRoundingType\r\n size?: ButtonSizeType\r\n}\r\n\r\nconst DATERANGE_TOOLTIP = 'Range'\r\n\r\nexport function DateRangeSelect({\r\n size,\r\n chartIndex,\r\n dateRangeGroups,\r\n selectedDateRange,\r\n onDateRangeSelect,\r\n onCustomDateRangeClick,\r\n rounding,\r\n}: Props) {\r\n const flatDateRanges = React.useMemo(() => dateRangeGroups.flatMap(({ dateRanges }) => dateRanges), [dateRangeGroups])\r\n\r\n return (\r\n {\r\n onDateRangeSelect(flatDateRanges.find((item) => item.value === value)!)\r\n }}\r\n rounding={rounding}\r\n appearance=\"square\"\r\n theme=\"chip\"\r\n size={size}\r\n triggerContent={}\r\n rightContent={false}\r\n active={selectedDateRange ? true : undefined}\r\n data-testid={`chart-${chartIndex}-date-range-select`}\r\n >\r\n {dateRangeGroups.flatMap(({ label, dateRanges }, index) => [\r\n {label},\r\n ...dateRanges.map(({ href, value, label, withReload, timeframe }) => {\r\n let linkProps = {}\r\n if (href) {\r\n linkProps = {\r\n as: Link,\r\n to: href,\r\n reloadDocument: withReload ?? !FinvizSettings.hasUserPremium,\r\n }\r\n }\r\n return (\r\n {\r\n if (!timeframe) onCustomDateRangeClick?.()\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Delayed } from '../delayed'\r\nimport { Spinner } from '../spinner'\r\n\r\ninterface Props {\r\n label: React.ReactNode\r\n isLoading: boolean\r\n}\r\n\r\nexport function LabelWithDelayedSpinner({ label, isLoading }: Props) {\r\n return (\r\n <>\r\n {label}\r\n {isLoading && (\r\n
\r\n {label}}>\r\n \r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link, To } from 'react-router-dom'\r\n\r\nimport { Button, ButtonProps, ButtonRoundingType, ButtonSizeType } from '../button'\r\nimport { DropdownSeparator } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { SelectItem } from '../select'\r\nimport { Select, SelectOption } from '../select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\n\r\nexport type TimeframeBaseOption = SelectItem & {\r\n labelShort?: string\r\n labelPageTitle?: string\r\n href?: To\r\n withReload?: boolean\r\n}\r\n\r\ninterface Props {\r\n chartIndex: number\r\n isCompactView: boolean\r\n isCompactOnly: boolean\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n selectedTimeframe: string\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n rounding?: ButtonRoundingType\r\n size?: ButtonSizeType\r\n isLoading?: boolean\r\n isFavoritesEnabled: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nconst TIMEFRAME_TOOLTIP = 'Interval'\r\n\r\nexport function TimeframeSelect({\r\n size,\r\n chartIndex,\r\n timeFrameGroups,\r\n selectedTimeframe,\r\n favoriteTimeframes,\r\n isLoading = false,\r\n isCompactView,\r\n isCompactOnly,\r\n onTimeframeSelect,\r\n onFavoriteTimeframeToggle,\r\n rounding,\r\n isFavoritesEnabled,\r\n theme = 'chip',\r\n}: Props) {\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const getSelectedTimeframeLabel = React.useCallback(() => {\r\n if (isCompactView) {\r\n const selectedTimeframeItem = flatTimeframes.find(({ value }) => value === selectedTimeframe)\r\n return selectedTimeframeItem?.labelShort ?? selectedTimeframeItem?.label\r\n }\r\n return ''\r\n }, [flatTimeframes, isCompactView, selectedTimeframe])\r\n\r\n return (\r\n item.value === selectedTimeframe)}\r\n leftContent={\r\n
\r\n } isLoading={isLoading && isCompactView} />\r\n
\r\n }\r\n onChange={(item) => onTimeframeSelect(item as TimeFrame)}\r\n data-testid={`chart-${chartIndex}-timeframe-select`}\r\n >\r\n {timeFrameGroups.flatMap(({ timeframes }, groupIndex) => [\r\n ,\r\n ...timeframes.map((item) => {\r\n const isIconButtonActive = favoriteTimeframes.includes(item.value)\r\n let linkProps = {}\r\n if (item.href) {\r\n linkProps = {\r\n as: Link,\r\n to: item.href,\r\n reloadDocument: !!item.withReload,\r\n }\r\n }\r\n return (\r\n ) => {\r\n ev.stopPropagation()\r\n ev.preventDefault()\r\n onFavoriteTimeframeToggle(item)\r\n }}\r\n className={classNames('group -mr-2', {\r\n 'text-gray-300': !isIconButtonActive,\r\n 'text-yellow-200': isIconButtonActive,\r\n })}\r\n >\r\n \r\n \r\n \r\n ) : undefined\r\n }\r\n >\r\n {item.label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { Button, ButtonPadding, ButtonProps, ButtonRoundingType, ButtonSize, ButtonSizeType } from '../button'\r\nimport { DateRangeBaseOption, DateRangeSelect } from './daterange-select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\nimport { TimeframeBaseOption, TimeframeSelect } from './timeframe-select'\r\n\r\ninterface Props {\r\n isPremium?: boolean\r\n chartIndex?: number\r\n compactViewMaxBreakpointPx?: number\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedTimeframe: string\r\n selectedDateRange: string | null\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n onDateRangeSelect: (value: DateRange) => void\r\n onCustomDateRangeClick?: () => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n size?: ButtonSizeType\r\n loadingTimeframe?: string\r\n rounding?: ButtonRoundingType\r\n isDateRangeAvailable?: boolean\r\n containerElement?: HTMLElement\r\n className?: string\r\n isFavoritesEnabled?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n isTimeframeSelectEnabled?: boolean\r\n isCompactOnly?: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nfunction getTimeframeChipElementId({ timeframe, chartIndex }: { timeframe: string; chartIndex: number }) {\r\n return `${chartIndex}-${timeframe}`\r\n}\r\n\r\nfunction getButtonPadding(size: ButtonSize): keyof typeof ButtonPadding {\r\n switch (size) {\r\n case ButtonSize.xxsmall:\r\n case ButtonSize.xsmall:\r\n case ButtonSize.small:\r\n case ButtonSize.regular:\r\n return 'small'\r\n case ButtonSize.medium:\r\n return 'regular'\r\n case ButtonSize.large:\r\n return 'medium'\r\n case ButtonSize.none:\r\n return 'none'\r\n }\r\n}\r\n\r\nexport function TimeframeBar({\r\n isPremium = FinvizSettings.hasUserPremium,\r\n chartIndex = 0,\r\n compactViewMaxBreakpointPx = 400,\r\n timeFrameGroups,\r\n dateRangeGroups,\r\n selectedTimeframe,\r\n selectedDateRange,\r\n favoriteTimeframes,\r\n loadingTimeframe,\r\n onTimeframeSelect,\r\n onDateRangeSelect,\r\n onCustomDateRangeClick,\r\n onFavoriteTimeframeToggle,\r\n size,\r\n rounding,\r\n isDateRangeAvailable = true,\r\n containerElement,\r\n className,\r\n isFavoritesEnabled = true,\r\n isScrollIntoViewEnabled = true,\r\n isTimeframeSelectEnabled,\r\n isCompactOnly = false,\r\n theme,\r\n}: Props) {\r\n const [scrollWrapperElement, setScrollWrapperElement] = React.useState(null)\r\n const [timeframeButtonsScrollLocation, setTimeframeButtonsScrollLocation] = React.useState({\r\n isOnLeftEdge: true,\r\n isOnRightEdge: true,\r\n })\r\n const { setElementRef, elementWidth } = useElementMeasure(containerElement)\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const timeframesInExpandedPanel = React.useMemo(\r\n () =>\r\n isFavoritesEnabled\r\n ? flatTimeframes.filter(({ value }) => value === selectedTimeframe || favoriteTimeframes.includes(value))\r\n : flatTimeframes,\r\n [flatTimeframes, selectedTimeframe, favoriteTimeframes, isFavoritesEnabled]\r\n )\r\n\r\n const isCompactView =\r\n isCompactOnly || elementWidth < compactViewMaxBreakpointPx || timeframesInExpandedPanel.length <= 1\r\n const checkTimeframeWrapperScrollPosition = React.useCallback(() => {\r\n if (scrollWrapperElement) {\r\n const isOnLeftEdge = scrollWrapperElement.scrollLeft === 0\r\n const isOnRightEdge =\r\n Math.ceil(scrollWrapperElement.offsetWidth + scrollWrapperElement.scrollLeft) >=\r\n scrollWrapperElement.scrollWidth\r\n\r\n if (\r\n timeframeButtonsScrollLocation.isOnLeftEdge !== isOnLeftEdge ||\r\n timeframeButtonsScrollLocation.isOnRightEdge !== isOnRightEdge\r\n ) {\r\n setTimeframeButtonsScrollLocation({ isOnLeftEdge, isOnRightEdge })\r\n }\r\n }\r\n }, [timeframeButtonsScrollLocation, scrollWrapperElement])\r\n\r\n React.useEffect(() => {\r\n checkTimeframeWrapperScrollPosition()\r\n }, [checkTimeframeWrapperScrollPosition, scrollWrapperElement, elementWidth])\r\n\r\n React.useEffect(() => {\r\n if (!isCompactView && isScrollIntoViewEnabled) {\r\n const timeframeElement = document.getElementById(\r\n getTimeframeChipElementId({ chartIndex, timeframe: selectedTimeframe })\r\n )\r\n\r\n if (timeframeElement && scrollWrapperElement) {\r\n const leftOffset =\r\n timeframeElement.offsetLeft + timeframeElement.clientWidth / 2 - scrollWrapperElement.clientWidth / 2\r\n\r\n scrollWrapperElement.scrollTo(Math.max(0, Math.min(leftOffset, scrollWrapperElement.scrollWidth)), 0)\r\n }\r\n }\r\n }, [isCompactView, chartIndex, selectedTimeframe, elementWidth, isScrollIntoViewEnabled, scrollWrapperElement])\r\n\r\n return (\r\n \r\n {(isTimeframeSelectEnabled ?? isFavoritesEnabled) && (\r\n
\r\n \r\n
\r\n )}\r\n {!isCompactView && (\r\n
\r\n \r\n {\r\n /*\r\n * Vertical scrolling doesn't scroll horizontally by default (it's possible when holding shift)\r\n * When using touchpad we may get values in both delatX and deltaY, so if someone's scrolling horizontally we don't want to do anything\r\n * but if they are scrolling vertically (deltaY > deltaX) we want to scroll horizontally the value they would nativally scroll in vertical direction\r\n * */\r\n const absDx = Math.abs(event.deltaX)\r\n const absDy = Math.abs(event.deltaY)\r\n if (absDy > absDx) {\r\n event.currentTarget.scrollLeft += event.deltaY\r\n }\r\n }}\r\n >\r\n {timeframesInExpandedPanel.map((timeframe) => {\r\n let linkProps = {}\r\n if (timeframe.href) {\r\n linkProps = {\r\n as: Link,\r\n to: timeframe.href,\r\n reloadDocument: timeframe.withReload ?? !isPremium,\r\n onClick: () => onTimeframeSelect(timeframe),\r\n }\r\n } else {\r\n linkProps = {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n onTimeframeSelect(timeframe)\r\n },\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n
\r\n \r\n
\r\n )}\r\n {isDateRangeAvailable && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import { type To } from 'react-router-dom'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../../app/queryString'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../constants'\r\nimport { DateRangeType, Instrument } from '../../types'\r\nimport { CUSTOM_DATE_RANGE, CustomDateRangePrefixEnum, DATE_RANGE_PREFIX_DELMITER } from './custom-date-range-utils'\r\n\r\ninterface ITimeFrame {\r\n value: TIMEFRAME | 'intraday'\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\nexport interface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\ninterface IDateRange {\r\n value: string\r\n label: string\r\n timeframe?: TIMEFRAME\r\n}\r\n\r\nexport interface IRangeGroup {\r\n label?: string\r\n dateRanges: IDateRange[]\r\n}\r\n\r\nexport const generateTimeframeGroups = (isPremium = true): ITimeframeGroup[] => {\r\n const premiumTimeframes: ITimeframeGroup[] = [\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.i1, label: '1 Minute', labelShort: '1M' },\r\n { value: TIMEFRAME.i2, label: '2 Minutes', labelShort: '2M' },\r\n { value: TIMEFRAME.i3, label: '3 Minutes', labelShort: '3M' },\r\n { value: TIMEFRAME.i5, label: '5 Minutes', labelShort: '5M' },\r\n { value: TIMEFRAME.i10, label: '10 Minutes', labelShort: '10M' },\r\n { value: TIMEFRAME.i15, label: '15 Minutes', labelShort: '15M' },\r\n { value: TIMEFRAME.i30, label: '30 Minutes', labelShort: '30M' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.h, label: '1 Hour', labelShort: '1H', labelPageTitle: 'Hourly' },\r\n { value: TIMEFRAME.h2, label: '2 Hours', labelShort: '2H' },\r\n { value: TIMEFRAME.h4, label: '4 Hours', labelShort: '4H' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'D', labelPageTitle: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'W', labelPageTitle: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'M', labelPageTitle: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n const freeTimeframes = [\r\n {\r\n // intradayTimeframe is only for non premium users used as redirect to elite subscription\r\n label: '',\r\n timeframes: [{ value: 'intraday' as const, label: 'Intraday', labelShort: 'Intraday' }],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n return isPremium ? premiumTimeframes : freeTimeframes\r\n}\r\n\r\nexport function getTimeframeGroups(isPremium: boolean) {\r\n return generateTimeframeGroups(isPremium)\r\n}\r\n\r\nexport const generateDateRangeGroups = ({\r\n isPremium,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n instrument: Instrument\r\n}): IRangeGroup[] => {\r\n const isStock = instrument === Instrument.Stock\r\n const rangeGroups: Array<{ label?: string; dateRanges: IDateRange[] }> = [\r\n {\r\n label: 'Days',\r\n dateRanges: [\r\n { value: DateRangeType.d1, label: '1 Day', timeframe: isStock ? TIMEFRAME.i1 : TIMEFRAME.i5 },\r\n { value: DateRangeType.d5, label: '5 Days', timeframe: isStock ? TIMEFRAME.i5 : TIMEFRAME.i30 },\r\n ],\r\n },\r\n {\r\n label: 'Months',\r\n dateRanges: [\r\n { value: DateRangeType.m1, label: '1 Month', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m3, label: '3 Months', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m6, label: '6 Months', timeframe: TIMEFRAME.d },\r\n ],\r\n },\r\n {\r\n label: 'Years',\r\n dateRanges: [\r\n { value: DateRangeType.ytd, label: 'Year to Date', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y1, label: '1 Year', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y2, label: '2 Years', timeframe: TIMEFRAME.w },\r\n { value: DateRangeType.y5, label: '5 Years', timeframe: isPremium ? TIMEFRAME.w : TIMEFRAME.m },\r\n { value: DateRangeType.max, label: 'Max', timeframe: TIMEFRAME.m },\r\n ],\r\n },\r\n ]\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroups({\r\n isPremium,\r\n customRange,\r\n isCustomAvailable = true,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n customRange?: string\r\n isCustomAvailable?: boolean\r\n instrument: Instrument\r\n}) {\r\n const rangeGroups = generateDateRangeGroups({ isPremium, instrument })\r\n\r\n if (isPremium && isCustomAvailable !== false) {\r\n const [dateRangePrefix] = customRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n rangeGroups.push({\r\n dateRanges: [\r\n {\r\n value:\r\n customRange && Object.values(CustomDateRangePrefixEnum).includes(dateRangePrefix)\r\n ? customRange\r\n : CUSTOM_DATE_RANGE,\r\n label: 'Custom',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n generatePath,\r\n withReload,\r\n isCustomAvailable,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n isCustomAvailable?: boolean\r\n customRange?: string\r\n withReload?: boolean\r\n instrument: Instrument\r\n generatePath: (dateRange: IDateRange) => To\r\n}) {\r\n return getDateRangeGroups({\r\n isPremium,\r\n isCustomAvailable,\r\n customRange,\r\n instrument,\r\n }).map((dateRangeGroup: IRangeGroup) => ({\r\n label: dateRangeGroup.label,\r\n dateRanges: dateRangeGroup.dateRanges.map((dateRange) => ({\r\n ...dateRange,\r\n href:\r\n !isPremium || Object.values(DateRangeType).includes(dateRange.value as DateRangeType)\r\n ? generatePath(dateRange)\r\n : undefined,\r\n withReload: withReload ?? !isPremium,\r\n })),\r\n }))\r\n}\r\n\r\nconst FREE_PERIODS_STOCK = ['d', 'w', 'm']\r\n\r\nexport function generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname,\r\n timeframe,\r\n dateRange,\r\n utmCampaign,\r\n freeTimeframes = FREE_PERIODS_STOCK,\r\n dateRangeQueryKey = 'r',\r\n}: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n utmCampaign?: string\r\n freeTimeframes?: string[]\r\n dateRangeQueryKey?: string\r\n}) {\r\n if (isPremium || freeTimeframes.includes(timeframe)) {\r\n return {\r\n pathname,\r\n search: `?${encodeQueryString({\r\n ...decodeQueryString(),\r\n i: undefined,\r\n p: timeframe,\r\n [dateRangeQueryKey]: dateRange ?? undefined,\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n pathname: '/elite.ashx',\r\n search: `?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign || window.location.pathname,\r\n })}`,\r\n }\r\n}\r\n\r\nexport const timeframeUtm: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-timeframe',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe',\r\n}\r\n\r\nexport const daterangeUtm: Partial> = {\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe-daterange',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe-daterange',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe-daterange',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { generateDateRangeGroups } from './utils'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// charts: app/utils/chart-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange?: string) {\r\n return dateRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nconst DAYS_IN_YEAR = 365\r\n\r\nexport function getCustomStartEndDateRangeUrlParam({ start, end }: { start: Date | null; end: Date | null }) {\r\n const startString = start ? formatDateToStringUS(start) : ''\r\n const endString = end ? formatDateToStringUS(end) : ''\r\n\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Range,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n startString,\r\n CUSTOM_DATE_RANGE_DELIMITER,\r\n endString,\r\n ]\r\n\r\n return stringParts.join('').replace(/\\//g, '-')\r\n}\r\n\r\nexport function getPrevPeriodDateRangeUrlParam({\r\n years,\r\n months,\r\n days,\r\n}: {\r\n years: number\r\n months: number\r\n days: number\r\n}) {\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Prev,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n years,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n months,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n days,\r\n ]\r\n\r\n return stringParts.join('')\r\n}\r\n\r\nexport function getTimeframeForDateRangeType({\r\n dateRange,\r\n isPremium = true,\r\n instrument,\r\n}: {\r\n dateRange: string\r\n isPremium?: boolean\r\n instrument: Instrument\r\n}) {\r\n const dateRanges = generateDateRangeGroups({ isPremium, instrument }).flatMap(({ dateRanges }) => dateRanges)\r\n return dateRanges.find(({ value }) => value === dateRange)?.timeframe ?? null\r\n}\r\n\r\nexport function getTimeframeFromDateRange({\r\n dateRange,\r\n anchorDate,\r\n instrument,\r\n isPremium,\r\n}: {\r\n dateRange: string\r\n anchorDate: Date\r\n instrument: Instrument\r\n isPremium: boolean\r\n}) {\r\n const dateRangeTimeframe = getTimeframeForDateRangeType({ dateRange, instrument })\r\n if (dateRangeTimeframe) {\r\n return dateRangeTimeframe\r\n }\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n const startNyTime = start ?? new Date(0)\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, startNyTime) + 1\r\n const rangeNumOfDays = dateFns.differenceInCalendarDays(end ?? anchorDate, startNyTime) + 1\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n if (rangeNumOfDays > 6 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 4 * DAYS_IN_YEAR) {\r\n return isPremium ? TIMEFRAME.w : TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 1.5 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.w\r\n }\r\n\r\n // Keep these values in sync with values in FetchQuoteIntraday in quote.cs\r\n if (instrument === Instrument.Stock) {\r\n if (rangeNumOfDays <= 1 && startToReferenceDateNumOfDays <= 11) {\r\n return TIMEFRAME.i1\r\n }\r\n\r\n if (rangeNumOfDays <= 5 && startToReferenceDateNumOfDays <= 16) {\r\n return TIMEFRAME.i5\r\n }\r\n\r\n if (rangeNumOfDays <= 7 && startToReferenceDateNumOfDays <= 200) {\r\n return TIMEFRAME.i30\r\n }\r\n } else {\r\n if (startToReferenceDateNumOfDays <= 2) {\r\n return TIMEFRAME.i5\r\n }\r\n if (startToReferenceDateNumOfDays <= 7) {\r\n return TIMEFRAME.i30\r\n }\r\n }\r\n\r\n return TIMEFRAME.d\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { Button } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { DatePicker } from '../date-picker'\r\nimport { Delayed } from '../delayed'\r\nimport { Dialog, DialogBody, DialogDismiss, DialogFooter, DialogHeader } from '../dialog'\r\nimport { Input } from '../input'\r\nimport { Spinner } from '../spinner'\r\nimport {\r\n CustomDateRangePrefixEnum,\r\n getCustomStartEndDateRangeUrlParam,\r\n getParsedDateRange,\r\n getPrevPeriodDateRangeUrlParam,\r\n parseCustomDateRangeUrlParam,\r\n} from './custom-date-range-utils'\r\n\r\nconst DATA_YEAR_START = 1980\r\nconst DATE_PICKER_MIN_DATE = new Date(`01/01/${DATA_YEAR_START}`)\r\nconst YEARS_MAX_VALUE = new Date().getFullYear() - DATA_YEAR_START\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' } as const\r\n\r\nexport enum CustomRangeType {\r\n StartEnd,\r\n Manual,\r\n}\r\n\r\ninterface StartEndRange {\r\n kind: CustomRangeType.StartEnd\r\n start: Date | null\r\n end: Date | null\r\n}\r\n\r\ninterface ManualRange {\r\n kind: CustomRangeType.Manual\r\n days?: number\r\n months?: number\r\n years?: number\r\n}\r\n\r\nexport type CustomDateRangeType = StartEndRange | ManualRange\r\n\r\ninterface DialogContentProps {\r\n /**\r\n * Dialog state\r\n */\r\n dialogState: any\r\n dateRange?: string\r\n anchorDate: Date\r\n onDialogSubmit: (args: { dateRange: string | null }) => void\r\n isFetching?: boolean\r\n}\r\n\r\nconst DEFAULT_MANUAL_RANGE: ManualRange = {\r\n kind: CustomRangeType.Manual,\r\n days: 0,\r\n months: 0,\r\n years: 0,\r\n}\r\n\r\nconst DEFAULT_START_END_RANGE: StartEndRange = {\r\n kind: CustomRangeType.StartEnd,\r\n start: null,\r\n end: null,\r\n}\r\n\r\nfunction isValidManualRangeState({ years = 0, months = 0, days = 0 }: ManualRange) {\r\n return years + months + days > 0\r\n}\r\n\r\nfunction isValidStartEndRangeState({ start, end }: StartEndRange) {\r\n return !!(start || end)\r\n}\r\n\r\nfunction getDefaultSelectedTab(dateRange?: string) {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return CustomRangeType.StartEnd\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n return CustomRangeType.Manual\r\n }\r\n }\r\n return CustomRangeType.StartEnd\r\n}\r\n\r\nfunction getDefaultSelectedDate({\r\n dateRange,\r\n anchorDate,\r\n}: {\r\n dateRange?: string\r\n anchorDate: Date\r\n}): CustomDateRangeType {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return { kind: CustomRangeType.StartEnd, start, end }\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev && start && end) {\r\n const { years, months, days } = dateFns.intervalToDuration({\r\n start: dateFns.sub(start, { days: 1 }),\r\n end,\r\n })\r\n return { kind: CustomRangeType.Manual, years, months, days }\r\n }\r\n }\r\n\r\n return DEFAULT_START_END_RANGE\r\n}\r\n\r\nexport function CustomDateRange({\r\n dialogState,\r\n dateRange,\r\n anchorDate,\r\n onDialogSubmit,\r\n isFetching,\r\n}: DialogContentProps) {\r\n const [selectedTab, setSelectedTab] = React.useState(getDefaultSelectedTab(dateRange))\r\n\r\n const [state, setState] = React.useState(getDefaultSelectedDate({ dateRange, anchorDate }))\r\n\r\n const { current: onChange } = React.useRef((kind: CustomRangeType, newValue: Partial) => {\r\n setState((prevState) => {\r\n if (kind === CustomRangeType.Manual) {\r\n const defaults = prevState?.kind === CustomRangeType.Manual ? prevState : DEFAULT_MANUAL_RANGE\r\n return { ...defaults, ...newValue } as ManualRange\r\n }\r\n if (kind === CustomRangeType.StartEnd) {\r\n const defaults = prevState?.kind === CustomRangeType.StartEnd ? prevState : DEFAULT_START_END_RANGE\r\n\r\n const newState = { ...defaults, ...newValue }\r\n if (newState.start && newState.end && newState.start.getTime() > newState.end.getTime()) {\r\n const newEnd = new Date(newState.start.getTime())\r\n newState.start = newState.end\r\n newState.end = newEnd\r\n }\r\n return newState\r\n }\r\n return prevState\r\n })\r\n })\r\n\r\n const handleSubmit = (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n\r\n let dateRange = null\r\n\r\n if (state?.kind === CustomRangeType.StartEnd && isValidStartEndRangeState(state)) {\r\n dateRange = getCustomStartEndDateRangeUrlParam({ start: state.start, end: state.end })\r\n } else if (state?.kind === CustomRangeType.Manual && isValidManualRangeState(state)) {\r\n dateRange = getPrevPeriodDateRangeUrlParam({\r\n days: state.days ?? 0,\r\n months: state.months ?? 0,\r\n years: state.years ?? 0,\r\n })\r\n }\r\n\r\n onDialogSubmit({ dateRange })\r\n }\r\n\r\n const isAbsolute = state?.kind === CustomRangeType.StartEnd\r\n const fromDate = isAbsolute ? state.start : DEFAULT_START_END_RANGE.start\r\n const toDate = isAbsolute ? state.end : DEFAULT_START_END_RANGE.end\r\n\r\n const manualRange = {\r\n ...DEFAULT_MANUAL_RANGE,\r\n ...(state?.kind === CustomRangeType.Manual ? state : {}),\r\n }\r\n\r\n return (\r\n \r\n Custom Date Range\r\n
\r\n \r\n \r\n setSelectedTab(CustomRangeType.StartEnd)}\r\n >\r\n Start / End\r\n \r\n setSelectedTab(CustomRangeType.Manual)}\r\n >\r\n Range\r\n \r\n \r\n\r\n {selectedTab === CustomRangeType.StartEnd ? (\r\n
\r\n onChange(CustomRangeType.StartEnd, { start })}\r\n >\r\n \r\n \r\n onChange(CustomRangeType.StartEnd, { end })}\r\n >\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n ) =>\r\n onChange(CustomRangeType.Manual, { years: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { months: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { days: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n setState(state.kind === CustomRangeType.Manual ? DEFAULT_MANUAL_RANGE : DEFAULT_START_END_RANGE)\r\n }\r\n >\r\n Reset\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { To, useNavigate } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { useDialogState } from '../dialog'\r\nimport { getTimeframeFromDateRange } from './custom-date-range-utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\ninterface IUseCustomDateRangeDialogSubmitProps {\r\n anchorDate?: Date\r\n instrument?: Instrument\r\n shouldReloadOnNavigate?: boolean\r\n pathGenerator?: ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n pathname: string\r\n search: string\r\n }\r\n}\r\n\r\ntype HandleDateRangeSelectFn = (\r\n props: WithHref extends true\r\n ? { value: string; timeframe?: TIMEFRAME; href?: To }\r\n : { value: string; timeframe?: TIMEFRAME },\r\n callback?: ({ value, timeframe, href }: { value: string; timeframe: TIMEFRAME; href?: To }) => void\r\n) => void\r\n\r\nexport function useCustomDateRangeDialog({\r\n anchorDate,\r\n instrument,\r\n pathGenerator,\r\n shouldReloadOnNavigate = false,\r\n}: IUseCustomDateRangeDialogSubmitProps) {\r\n const navigate = useNavigate()\r\n const customDateRangeDialogState = useDialogState()\r\n\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n const handleDateRangeSelect = React.useCallback(\r\n ({ value, timeframe, href }, callback) => {\r\n if (!timeframe) return\r\n\r\n if (!href && pathGenerator) {\r\n const path = pathGenerator({ timeframe, dateRange: value })\r\n if (shouldReloadOnNavigate) {\r\n window.location.href = `${path.pathname}?${path.search}`\r\n } else {\r\n navigate(path)\r\n }\r\n }\r\n\r\n callback?.({ value, timeframe, href })\r\n },\r\n [navigate, pathGenerator, shouldReloadOnNavigate]\r\n )\r\n\r\n const getDateRangeTimeframe = React.useCallback(\r\n (dateRange: string | null) => {\r\n if (!anchorDate || !instrument || !dateRange) return null\r\n\r\n return {\r\n value: dateRange,\r\n timeframe: getTimeframeFromDateRange({\r\n dateRange: dateRange!,\r\n anchorDate,\r\n isPremium,\r\n instrument,\r\n }),\r\n }\r\n },\r\n [anchorDate, instrument, isPremium]\r\n )\r\n\r\n const onDialogSubmit = React.useCallback>(\r\n ({ value: dateRange, timeframe: newTimeframe }, callback) => {\r\n handleDateRangeSelect(\r\n {\r\n value: dateRange,\r\n timeframe: newTimeframe,\r\n },\r\n callback\r\n )\r\n customDateRangeDialogState.hide()\r\n },\r\n // We only want `customDateRangeDialogState.hide`, not the whole dialog\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [customDateRangeDialogState.hide, handleDateRangeSelect]\r\n )\r\n\r\n return { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { useSyncLocalStorage } from '../../hooks/use-sync-local-storage'\r\n\r\ntype FavoriteTimeframesMap = { [K in TIMEFRAME | 'intraday']?: boolean }\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS = {\r\n [TIMEFRAME.i1]: true,\r\n [TIMEFRAME.i2]: false,\r\n [TIMEFRAME.i3]: true,\r\n [TIMEFRAME.i5]: true,\r\n [TIMEFRAME.i10]: false,\r\n [TIMEFRAME.i15]: true,\r\n [TIMEFRAME.i30]: true,\r\n [TIMEFRAME.h]: true,\r\n [TIMEFRAME.h2]: false,\r\n [TIMEFRAME.h4]: false,\r\n [TIMEFRAME.d]: true,\r\n [TIMEFRAME.w]: true,\r\n [TIMEFRAME.m]: true,\r\n}\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS_FREE = {\r\n ...TIMEFRAME_FAVORITE_DEFAULTS,\r\n intraday: true,\r\n}\r\n\r\nconst LOCAL_STORAGE_KEY = 'favoriteTimeframesMap'\r\n\r\nexport function useFavoriteTimeframes(isPremium = true) {\r\n const { state, setState } = useSyncLocalStorage(\r\n LOCAL_STORAGE_KEY,\r\n isPremium ? TIMEFRAME_FAVORITE_DEFAULTS : TIMEFRAME_FAVORITE_DEFAULTS_FREE\r\n )\r\n\r\n const toggleFavoriteTimeframe = React.useCallback(\r\n (timeframe: TIMEFRAME | 'intraday') => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n [timeframe]: !prevState[timeframe],\r\n }))\r\n },\r\n [setState]\r\n )\r\n\r\n const favoriteTimeframes = React.useMemo(\r\n () => Object.keys(state).filter((key) => state[key as keyof FavoriteTimeframesMap]),\r\n [state]\r\n )\r\n\r\n return {\r\n favoriteTimeframes: isPremium ? favoriteTimeframes : Object.keys(TIMEFRAME_FAVORITE_DEFAULTS_FREE),\r\n toggleFavoriteTimeframe,\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as storage from '../services/local-storage'\r\n\r\n/**\r\n * Hook to synchronize localStorage.setItem across all components on the page on all open tabs\r\n */\r\nexport function useSyncLocalStorage(storageKey: string, defaultValue: ValueType) {\r\n const [state, setState] = React.useState(storage.getValue(storageKey, defaultValue))\r\n\r\n React.useEffect(() => {\r\n const subscription = storage.subscribeToChanges(storageKey, defaultValue, setState)\r\n\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n }, [storageKey, defaultValue])\r\n\r\n const setValue = React.useCallback(\r\n (valueGetter: React.SetStateAction) => storage.setValue(storageKey, valueGetter, defaultValue),\r\n [defaultValue, storageKey]\r\n )\r\n\r\n return {\r\n state,\r\n setState: setValue,\r\n }\r\n}\r\n","import * as AriaKit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipProps, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\ninterface TooltipSettingsProps extends Pick, Pick {\r\n content?: React.ReactNode\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Settings for Tooltip component and useTooltipStore\r\n */\r\n tooltipSettings?: TooltipSettingsProps\r\n}\r\n\r\nfunction TooltipInputWrapper({ children, tooltipSettings = {}, name }: TooltipInputWrapperProps) {\r\n const { content, color, gutter, placement = 'bottom' } = tooltipSettings\r\n const tooltip = useTooltipState({ placement })\r\n\r\n return (\r\n <>\r\n \r\n {React.cloneElement(children, {\r\n onFocus: (event: React.FocusEvent) => {\r\n children.props.onFocus?.(event)\r\n tooltip.show()\r\n },\r\n onBlur: (event: React.FocusEvent) => {\r\n children.props.onBlur?.(event)\r\n tooltip.hide()\r\n },\r\n })}\r\n \r\n {content && (\r\n \r\n {content}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n { tooltipSettings, isInteractive = true, ...props }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import debounce from 'lodash.debounce'\r\nimport * as React from 'react'\r\n\r\nimport { useIsMounted } from './use-is-mounted'\r\nimport { useResizeObserver } from './use-resize-observer'\r\n\r\nexport function useElementMeasure(elementOverride: HTMLElement | null = null) {\r\n const ResizeObserver = useResizeObserver()\r\n const getIsMounted = useIsMounted()\r\n const [elementRef, setElementRef] = React.useState(elementOverride)\r\n const [elementWidth, setElementWidth] = React.useState(elementRef?.offsetWidth ?? 0)\r\n const [elementHeight, setElementHeight] = React.useState(elementRef?.offsetHeight ?? 0)\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver) {\r\n return\r\n }\r\n\r\n const measureElement = () => {\r\n if (!getIsMounted()) {\r\n return\r\n }\r\n const newElementWidth = elementRef?.offsetWidth\r\n const newElementHeight = elementRef?.offsetHeight\r\n if (newElementWidth !== elementWidth) {\r\n setElementWidth(newElementWidth ?? 0)\r\n }\r\n if (newElementHeight !== elementHeight) {\r\n setElementHeight(newElementHeight ?? 0)\r\n }\r\n }\r\n const measureElementDebounced = debounce(measureElement, 200)\r\n\r\n const resizeObserver = new ResizeObserver((entries) => {\r\n /**\r\n * the reason for requestAnimationFrame is described here https://github.com/quasarframework/quasar/issues/2233\r\n * their approach was mostly to intercept and silence the error but I managed to avoid the error using requestAnimationFrame\r\n * */\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) {\r\n measureElementDebounced()\r\n }\r\n })\r\n })\r\n\r\n if (elementRef) {\r\n resizeObserver.observe(elementRef)\r\n }\r\n\r\n measureElement()\r\n\r\n return () => {\r\n measureElementDebounced.cancel()\r\n resizeObserver?.disconnect()\r\n }\r\n }, [ResizeObserver, elementWidth, elementRef, elementHeight, getIsMounted])\r\n\r\n return { setElementRef: elementOverride ? () => {} : setElementRef, elementWidth, elementHeight }\r\n}\r\n","// Copy if this file is in charts repo in app/utils/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import { EventEmitter } from 'events'\r\nimport * as React from 'react'\r\n\r\nlet emitter: EventEmitter | undefined\r\n\r\n/**\r\n * Get the emitter which is used to sync components across the page, subscibe to\r\n * changes and attach event which handles changes across windows\r\n */\r\nexport function subscribeToChanges(\r\n key: string,\r\n defaultValue: ValueType,\r\n changeCallback?: (value: React.SetStateAction) => void\r\n) {\r\n if (!emitter) emitter = new EventEmitter()\r\n\r\n const onChange = (value: React.SetStateAction) => {\r\n const newValue = value ?? getValue(key, defaultValue)\r\n setValue(key, newValue, defaultValue, false)\r\n changeCallback?.(newValue)\r\n }\r\n\r\n const onStorageChange = (ev: StorageEvent) => {\r\n if (ev.key === key) {\r\n try {\r\n const value = ev.newValue ? JSON.parse(ev.newValue) : null\r\n onChange(value ?? defaultValue)\r\n } catch {\r\n onChange(defaultValue)\r\n }\r\n }\r\n }\r\n\r\n emitter.addListener(key, onChange)\r\n window.addEventListener('storage', onStorageChange)\r\n\r\n return {\r\n emitter,\r\n unsubscribe: () => {\r\n emitter?.removeListener(key, onChange)\r\n window.removeEventListener('storage', onStorageChange)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Get value from local storage or fall back to `defaultValue`\r\n */\r\nexport function getValue(key: string, defaultValue: ValueType): ValueType {\r\n try {\r\n const value = localStorage.getItem(key)\r\n const parsedValue = value ? JSON.parse(value) : null\r\n return parsedValue ?? defaultValue\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Set value to local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function setValue(\r\n key: string,\r\n valueGetter: React.SetStateAction,\r\n defaultValue: ValueType,\r\n emit = true\r\n) {\r\n try {\r\n const state = getValue(key, defaultValue)\r\n const valueToStore = valueGetter instanceof Function ? valueGetter(state) : valueGetter\r\n\r\n localStorage.setItem(key, JSON.stringify(valueToStore))\r\n if (emit) emitter?.emit(key, valueToStore)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Removes value from local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function removeValue(key: string, emit = true) {\r\n try {\r\n localStorage.removeItem(key)\r\n if (emit) emitter?.emit(key, undefined)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Helper function to migrate old value type to new one (eg. boolean to object)\r\n */\r\nexport function migrateValue(\r\n key: string,\r\n /**\r\n * The migrate function might get called multiple times on the page, so `oldValue` in the callback\r\n * can actually be the already migrated value. Make sure to add a condition to only migrate once.\r\n */\r\n transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue),\r\n defaultValue: NewValue\r\n) {\r\n try {\r\n const oldValue = getValue(key, undefined)\r\n if (typeof oldValue === 'undefined') return\r\n const migratedValue = transformValue instanceof Function ? transformValue(oldValue) : transformValue\r\n setValue(key, migratedValue, defaultValue, false) // don’t emit to other components\r\n } catch {}\r\n}\r\n","/**\r\n * Ignore any subsequent callback calls until the previous callback has finished\r\n */\r\n\r\nexport function waitForPreviousPromise(callback: () => void | Promise) {\r\n let callbackPromise: Promise | void | null = null\r\n\r\n return async function () {\r\n if (callbackPromise !== null) return\r\n\r\n callbackPromise = callback()\r\n await callbackPromise\r\n callbackPromise = null\r\n }\r\n}\r\n"],"names":["getCurrentDateInMs","Date","valueOf","getIsDocumentVisible","document","visibilityState","hidden","notifyOnVisibilityChange","callback","promisifiedCallback","waitForPreviousPromise","addEventListener","unsubscribe","removeEventListener","intervalCallbackOnWindowVisible","interval","getInterval","refreshPromise","nextRefresh","refreshTimeout","async","refresh","window","setTimeout","Math","max","handleVisibilityChange","clearTimeout","currentDateMs","GroupTheme","ButtonGroup","_ref","className","children","theme","hasDivider","hasBorder","rounding","childComponent","buttonRounding","ButtonRounding","groupTheme","React","dark","wrapper","divider","getGroupTheme","_jsx","role","classnames","border","map","child","index","_child$props$rounding","_child$props$theme","Button","filter","Boolean","includes","type","_jsxs","props","ColorVariant","CheckboxSize","CheckboxComponent","ref","_props$checked","label","size","color","default","checked","defaultChecked","disabled","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","Icon","name","width","Checkbox","forwardRef","clamp","num","min","arguments","length","undefined","isTouch","event","getRelativePosition","node","rect","getBoundingClientRect","pointer","touches","left","pageX","pageXOffset","top","pageY","pageYOffset","height","preventDefaultMove","preventDefault","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","isValid","current","handleMove","useCallback","buttons","handleMoveStart","_ref2","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","state","toggleEvent","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","style","concat","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","r","g","b","a","Number","round","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","toString","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","v","c","h","s","f","n","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","slice","String","parseInt","parseFloat","strColor","replace","isValidColor","isRgb","startsWith","Option","convertColorToHEX","getIsRgb","rgbKeys","push","some","getHSVAFromColor","Alpha","onChange","changeLightness","pos","gradientPreview","useMemo","gradientFrom","gradientTo","backgroundImage","DEFAULT_COLORS","title","value","ColorPalette","colors","lowerCaseColor","toLowerCase","colorObj","isSelected","onClick","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","icon","Array","isArray","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","Input","leftContent","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","popover","Ariakit","input","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","trim","alert","_Fragment","isMobile","contentClass","_hex","orignalColor","focus","preventScroll","InputColorPicker","inputDataTestId","popoverState","usePopoverState","isMobileDevice","PopoverTrigger","render","Popover","hideOnInteractOutside","backdrop","hide","MultiColorPicker","colorInputLabel","ColorTabButton","small","ButtonColorPicker","_ref3","buttonPickerDataTestId","isOpen","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","as","appearance","active","_ref4","_ref5","COMPONENT_ANIMATION_DURATION","CopyToClipboard","text","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","Textarea","readOnly","e","select","DatePickerComponent","StatelessDatePicker","fallback","Box","Spinner","locale","minDetail","ev","_props$onChange","call","DatePicker","ZIndexContext","useZIndex","useDialogState","settings","DialogDragContext","enabled","handleRef","boxPosition","x","y","resetBoxPosition","setBoxPosition","DialogBox","onUnmount","wrapperRef","setElementRef","elementHeight","useElementMeasure","dialogDrag","onResize","_dialogDrag$handleRef","_dialogDrag$handleRef2","bottom","right","clientHeight","clientWidth","documentElement","prevPosition","_dialogDrag$handleRef3","_dialogDrag$handleRef4","dialogBoxStyle","transform","focusWithoutScroll","element","DialogType","Dialog","modal","isDraggable","hideOnEsc","onFullyOpen","onFullyClosed","onClose","ariaLabel","dragging","handleElement","boxPositionRef","dragDiff","scrollX","scrollY","onMouseUp","onMouseMove","body","useDrag","isFullyOpen","setIsFullyOpen","viewport","useVisualViewport","onScroll","screenSize","screen","innerWidth","innerHeight","dialogStyle","isIpad","scale","unscaledWidth","unscaledHeight","minWidth","minHeight","willChange","unmountOnHide","store","preventBodyScroll","hideOnEscape","autoFocusOnHide","getFlexAlignClasses","ChildPosition","drawer","onTransitionEnd","target","defaultPrevented","Provider","DialogDismiss","DialogBody","hasPadding","scrollDivRef","scrollBox","disableBodyScroll","enableBodyScroll","ConfirmationDialog","Heading","level","Paragraph","actions","DialogFooter","padding","DialogHeader","hasHorizontalPadding","hasMinHeight","asHeading","isCloseButtonVisible","onCloseClick","getExtendedDialogState","isFullyOpened","visible","animating","isFullyClosed","DropdownContext","useDropdownState","_settings$unstable_of","context","Reakit","loop","animated","unstable_virtual","unstable_offset","root","DropdownComponent","triggerProps","isNested","isStatic","zIndex","dropdownState","Error","ContainerElement","Portal","buttonProps","_label$props$active","_context$root","onAnimationEnd","innerProps","parent","placement","orientation","Dropdown","NestedDropdownWrapper","parentState","itemProps","DropdownItemComponent","asComponent","subtitle","closeOnClick","hasSubmenu","iconTheme","align","rightContent","_itemProps$onClick","DropdownItem","DropdownSeparator","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","usePopoverMaxHeight","maxHeightLimit","hasViewportHeightLimit","offsets","useWindowSize","isWatching","buttonElement","unstable_referenceRef","buttonRect","offsetY","elementMaxHeight","popoverId","getAttribute","popoverWrapper","getElementById","setProperty","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","items","popperElement","setPopperElement","virtualRef","toJSON","getVirtualRef","hasBeenOpen","styles","attributes","usePopper","modifiers","options","offset","show","popper","ContextMenuDropdown","ContextMenuInner","MAX_SAFE_INTEGER","innerState","maxHeightStyle","item","id","_item$onClick","_window$gtag","_window","gtag","Object","assign","menu_option","ChartGridCell","gridArea","GridLayout","columns","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","data","InnerState","valueKey","changeKey","valueAccessor","setState","handleChange","ListContext","getSelectedItemIndex","findIndex","ListItem","activeTheme","onSelectItem","onKeyPress","closeOnSelect","BUTTON_DEFAULT_ELEMENT","List","selectedIndex","direction","includeBaseStyles","prevSelected","move","closeParent","RangeSize","RangeSlider","step","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","FinvizSettings","hasRedesignEnabled","horizontal","alternative","Toolbar","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","throttle","originalWidth","offsetWidth","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","isLoading","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","titleActive","Delayed","delay","delayComponent","DEFAULT_OFFSET","HOVER_TIMEOUT","useHoverPopover","_settings$placement","showTimeout","hideTimeout","clearTimeouts","showPopover","hidePopover","onMouseOver","onMouseOut","focusOnShow","focusOnHide","finalFocusRef","hideOnClickOutside","hasBackdrop","onOverlayClick","popoverWrapperStyle","popoverMaxHeight","hasButtonWidthLimit","unstable_autoFocusOnShow","unstable_autoFocusOnHide","unstable_finalFocusRef","_props$as","ToolbarGroup","_groupItems$map","defaultItem","groupItems","groupTitle","useNativeSelect","listState","currentId","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","defaultValue","setSelectedIndex","closePopover","newIndex","onItemChange","useList","i","option","stopPropagation","NativeSelect","ToolbarItem","isItemActive","ToolbarDivider","StepContent","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","tour","arr","_step$backButton","_step$nextButton","action","complete","classes","getButtonTheme","ButtonTheme","light","button","ButtonPadding","back","backButton","next","nextButton","getTourKey","location","pathname","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","reduce","acc","steps","initialTour","completeTour","key","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","signal","aborted","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","from","forEach","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","on","popperOptions","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","event_label","TabSpacing","InternalTab","ariaSelected","spacing","content","classNames","Tab","TabList","TabPanel","Tabs","BadgeSize","BadgePadding","Badge","badgePadding","badgeSize","PopoverRounding","PopoverTheme","gutter","autoFocusOnShow","isPopoverOpen","triggerElement","getState","disclosureElement","isTriggerInput","HTMLInputElement","HTMLTextAreaElement","getPersistentElements","PopoverAnchor","placeholder","showPlaceholder","handleNativeSelectChange","_selectedItem$href$se","_selectedItem$href$ha","itemIndex","flattenItems","href","reloadDocument","newUrl","URL","search","hash","isSelectItemGroup","optionIndex","NativeSelectInRouterContext","navigate","useNavigate","onChangeWithNavigate","ItemsGroup","getDefaultTheme","isHovered","InternalOption","_props$active","_props$size","dataActiveItem","defaultTheme","SelectOption","isComboBox","combobox","SelectItemsVirtualized","SelectRenderer","itemSize","hasGroups","overscan","groupOritem","restProps","isSelectItem","itemRenderer","paddingStart","paddingEnd","rendererProps","restItem","SelectItems","searchValue","parentTestId","virtualized","isInRouterContext","useInRouterContext","filteredItems","filterSelectOptions","innerItem","providedProps","getSelectItemProps","truncate","ListRounding","ListTheme","onBackdropClick","SelectList","hasItemChildren","ListElement","wrapperProps","hasChildren","count","none","autoSelect","SelectTooltip","tooltipState","useTooltipState","isSelectOpen","hasShownTooltip","subscription","TooltipTrigger","focusable","onFocusVisible","Tooltip","SelectTooltipWrapper","getCollectionItem","DesktopSelect","_items$length","_listProps$unmountOnH","trigger","tooltip","onInteractionChange","comboBox","onSearch","listProps","internalSearch","setInternalSearch","SelectWrapper","resetValueOnHide","includesBaseElement","setValue","ButtonWrapper","buttonWrapperProps","console","warn","listItems","focusLoop","virtualFocus","setOpen","defaultItems","DEFAULT_RIGHT_ICON","SelectButton","_selectedValue$label","valueOverride","contextValue","selectedValue","buttonText","rightIcon","xxsmall","Select","_findSelectedValue","_findSelectedValue2","providedValue","providedDefaultValue","triggerContent","isInteractive","nativeSelect","dataTestid","findSelectedValue","selectTrigger","NativeSelectComponent","findSelectedIndex","inRouterContext","Link","to","hasOwnProperty","matchesSearchTerm","searchTerm","lowerSearch","isSameItem","obj1","obj2","finalResults","filtered","foundItem","find","flatMap","itemOrGroup","DATERANGE_TOOLTIP","DateRangeSelect","chartIndex","dateRangeGroups","selectedDateRange","onDateRangeSelect","onCustomDateRangeClick","flatDateRanges","dateRanges","withReload","timeframe","linkProps","hasUserPremium","_createElement","LabelWithDelayedSpinner","invisible","TIMEFRAME_TOOLTIP","TimeframeSelect","timeFrameGroups","selectedTimeframe","favoriteTimeframes","isCompactView","isCompactOnly","onTimeframeSelect","onFavoriteTimeframeToggle","isFavoritesEnabled","flatTimeframes","timeframes","getSelectedTimeframeLabel","_selectedTimeframeIte","selectedTimeframeItem","labelShort","groupIndex","isIconButtonActive","getTimeframeChipElementId","getButtonPadding","xsmall","medium","large","TimeframeBar","isPremium","compactViewMaxBreakpointPx","loadingTimeframe","isDateRangeAvailable","containerElement","isScrollIntoViewEnabled","isTimeframeSelectEnabled","scrollWrapperElement","setScrollWrapperElement","timeframeButtonsScrollLocation","setTimeframeButtonsScrollLocation","isOnLeftEdge","isOnRightEdge","elementWidth","timeframesInExpandedPanel","checkTimeframeWrapperScrollPosition","scrollLeft","ceil","scrollWidth","timeframeElement","leftOffset","offsetLeft","scrollTo","onWheel","absDx","abs","deltaX","deltaY","_timeframe$withReload","generateTimeframeGroups","premiumTimeframes","TIMEFRAME","i1","i2","i3","i5","i10","i15","i30","labelPageTitle","h2","h4","d","w","m","freeTimeframes","getTimeframeGroups","generateDateRangeGroups","instrument","isStock","Instrument","Stock","DateRangeType","d1","d5","m1","m3","m6","ytd","y1","y2","y5","getDateRangeGroups","customRange","isCustomAvailable","rangeGroups","_customRange$split","dateRangePrefix","split","DATE_RANGE_PREFIX_DELMITER","values","CustomDateRangePrefixEnum","CUSTOM_DATE_RANGE","getDateRangeGroupsWithHref","generatePath","dateRangeGroup","dateRange","FREE_PERIODS_STOCK","generatePathForTimeframeDateRange","utmCampaign","dateRangeQueryKey","encodeQueryString","decodeQueryString","p","utm_source","utm_medium","utm_campaign","timeframeUtm","SpecificChartFunctionality","quotePage","futuresPage","forexPage","cryptoPage","daterangeUtm","CUSTOM_DATE_RANGE_DELIMITER","CUSTOM_PREV_RANGE_DELIMITER","getParsedDateRange","_dateRange$split","parseCustomDateRangeUrlParam","anchorDate","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","isNaN","getTime","end","dateFns","Prev","years","months","days","DAYS_IN_YEAR","getTimeframeFromDateRange","_ref7","dateRangeTimeframe","_dateRanges$find$time","_dateRanges$find","_ref6","getTimeframeForDateRangeType","startNyTime","startToReferenceDateNumOfDays","rangeNumOfDays","DATE_PICKER_MIN_DATE","YEARS_MAX_VALUE","getFullYear","TAB_BUTTON_COMMON_PROPS","CustomRangeType","DEFAULT_MANUAL_RANGE","kind","Manual","DEFAULT_START_END_RANGE","StartEnd","CustomDateRange","dialogState","onDialogSubmit","isFetching","selectedTab","setSelectedTab","getDefaultSelectedTab","getDefaultSelectedDate","newValue","prevState","newState","newEnd","isAbsolute","fromDate","toDate","manualRange","onSubmit","isValidStartEndRangeState","startString","formatDateToStringUS","endString","join","getCustomStartEndDateRangeUrlParam","isValidManualRangeState","_state$days","_state$months","_state$years","getPrevPeriodDateRangeUrlParam","minDate","useCustomDateRangeDialog","pathGenerator","shouldReloadOnNavigate","customDateRangeDialogState","handleDateRangeSelect","path","getDateRangeTimeframe","newTimeframe","TIMEFRAME_FAVORITE_DEFAULTS","TIMEFRAME_FAVORITE_DEFAULTS_FREE","intraday","LOCAL_STORAGE_KEY","useFavoriteTimeframes","storageKey","storage","valueGetter","useSyncLocalStorage","toggleFavoriteTimeframe","keys","TooltipInputWrapper","tooltipSettings","isHideOnClickOutside","onFocus","_children$props$onFoc","_children$props","onBlur","_children$props$onBlu","_children$props2","hideOnHoverOutside","TooltipInputComponent","TooltipInput","_elementRef$offsetWid","_elementRef$offsetHei","elementOverride","ResizeObserver","useResizeObserver","getIsMounted","useIsMounted","elementRef","setElementWidth","setElementHeight","offsetHeight","measureElement","newElementWidth","newElementHeight","measureElementDebounced","debounce","resizeObserver","entries","requestAnimationFrame","observe","cancel","disconnect","isMountedRef","throttleWaitInMs","setSize","handleResize","emitter","subscribeToChanges","changeCallback","EventEmitter","getValue","onStorageChange","JSON","parse","addListener","_emitter","removeListener","parsedValue","emit","_emitter2","valueToStore","Function","stringify","removeValue","_emitter3","removeItem","migrateValue","transformValue","oldValue","callbackPromise"],"sourceRoot":""}