From 2e2c3a6038588c8616b255582cb42260bb51d0b7 Mon Sep 17 00:00:00 2001 From: Michael Matloka Date: Thu, 23 Feb 2023 14:16:34 +0100 Subject: [PATCH] fix(lemon-ui): Restore `Popover`'s appearance animation (#14248) * `fix(lemon-ui): Restore `Popover`'s appearance animation * Use `CSSTransition` after all * Update react-transition-group * Change approach with `CSSTransition` * Remove meaningless change --- .../DefinitionPopoverContents.tsx | 2 +- .../lib/components/HelpButton/HelpButton.tsx | 2 +- .../TaxonomicFilter/InfiniteList.tsx | 4 +- .../LemonActionableTooltip.tsx | 2 +- .../src/lib/lemon-ui/Popover/Popover.scss | 46 +++++++++---- frontend/src/lib/lemon-ui/Popover/Popover.tsx | 64 ++++++++++--------- .../logic/inAppPrompt/inAppPromptLogic.tsx | 2 +- .../ingestion-warnings/WarningEventsGraph.tsx | 2 +- .../scenes/plugins/source/types/packages.json | 2 +- package.json | 6 +- pnpm-lock.yaml | 57 +++++++++-------- 11 files changed, 106 insertions(+), 83 deletions(-) diff --git a/frontend/src/lib/components/DefinitionPopover/DefinitionPopoverContents.tsx b/frontend/src/lib/components/DefinitionPopover/DefinitionPopoverContents.tsx index 97468204a2c..b67b63594eb 100644 --- a/frontend/src/lib/components/DefinitionPopover/DefinitionPopoverContents.tsx +++ b/frontend/src/lib/components/DefinitionPopover/DefinitionPopoverContents.tsx @@ -21,7 +21,7 @@ import { CSSTransition } from 'react-transition-group' import { Tooltip } from 'lib/lemon-ui/Tooltip' import { humanFriendlyNumber } from 'lib/utils' import { TitleWithIcon } from '../TitleWithIcon' -import { UseFloatingReturn } from '@floating-ui/react-dom-interactions' +import { UseFloatingReturn } from '@floating-ui/react' import { LemonTextArea } from 'lib/lemon-ui/LemonTextArea/LemonTextArea' export const ThirtyDayVolumeTitle = ({ tooltipPlacement }: { tooltipPlacement?: 'top' | 'bottom' }): JSX.Element => ( diff --git a/frontend/src/lib/components/HelpButton/HelpButton.tsx b/frontend/src/lib/components/HelpButton/HelpButton.tsx index a0a7412cdbd..c6f2db2abec 100644 --- a/frontend/src/lib/components/HelpButton/HelpButton.tsx +++ b/frontend/src/lib/components/HelpButton/HelpButton.tsx @@ -17,7 +17,7 @@ import { IconTrendingUp, } from 'lib/lemon-ui/icons' import clsx from 'clsx' -import { Placement } from '@floating-ui/react-dom-interactions' +import { Placement } from '@floating-ui/react' import { DefaultAction, inAppPromptLogic } from 'lib/logic/inAppPrompt/inAppPromptLogic' import { hedgehogbuddyLogic } from '../HedgehogBuddy/hedgehogbuddyLogic' import { HedgehogBuddyWithLogic } from '../HedgehogBuddy/HedgehogBuddy' diff --git a/frontend/src/lib/components/TaxonomicFilter/InfiniteList.tsx b/frontend/src/lib/components/TaxonomicFilter/InfiniteList.tsx index 1d376884590..661f19abbdf 100644 --- a/frontend/src/lib/components/TaxonomicFilter/InfiniteList.tsx +++ b/frontend/src/lib/components/TaxonomicFilter/InfiniteList.tsx @@ -21,7 +21,7 @@ import clsx from 'clsx' import { definitionPopoverLogic } from 'lib/components/DefinitionPopover/definitionPopoverLogic' import { ControlledDefinitionPopoverContents } from 'lib/components/DefinitionPopover/DefinitionPopoverContents' import { pluralize } from 'lib/utils' -import { flip, offset, shift, size, useFloating } from '@floating-ui/react-dom-interactions' +import { flip, offset, shift, size, useFloating } from '@floating-ui/react' import { LemonSkeleton } from 'lib/lemon-ui/LemonSkeleton' enum ListTooltip { @@ -308,7 +308,7 @@ export function InfiniteList(): JSX.Element { {isActiveTab && selectedItemInView && selectedItemHasPopover(selectedItem, listGroupType, group) && - tooltipDesiredState(referenceRef.current) !== ListTooltip.None && + tooltipDesiredState(referenceRef.current as HTMLElement | null) !== ListTooltip.None && showPopover ? ReactDOM.createPortal( selectedItem && group ? ( diff --git a/frontend/src/lib/lemon-ui/LemonActionableTooltip/LemonActionableTooltip.tsx b/frontend/src/lib/lemon-ui/LemonActionableTooltip/LemonActionableTooltip.tsx index 118a1032489..c9b5f8db5d5 100644 --- a/frontend/src/lib/lemon-ui/LemonActionableTooltip/LemonActionableTooltip.tsx +++ b/frontend/src/lib/lemon-ui/LemonActionableTooltip/LemonActionableTooltip.tsx @@ -1,4 +1,4 @@ -import { Placement } from '@floating-ui/react-dom-interactions' +import { Placement } from '@floating-ui/react' import { Popover } from 'lib/lemon-ui/Popover/Popover' import { IconOpenInNew } from 'lib/lemon-ui/icons' import { IconClose, IconChevronLeft, IconChevronRight } from 'lib/lemon-ui/icons' diff --git a/frontend/src/lib/lemon-ui/Popover/Popover.scss b/frontend/src/lib/lemon-ui/Popover/Popover.scss index a53107719b3..cf4f16828e0 100644 --- a/frontend/src/lib/lemon-ui/Popover/Popover.scss +++ b/frontend/src/lib/lemon-ui/Popover/Popover.scss @@ -29,31 +29,47 @@ padding: 0.5rem; border-radius: var(--radius); border: 1px solid var(--border); - overflow: auto; - - [data-floating-placement^='top'] & { - transform-origin: bottom; - } + opacity: 0; .Popover--actionable & { border-color: var(--primary); } - .Popover--enter &, - .Popover--exit.Popover--exit-active & { - opacity: 0; + .Popover[data-placement^='bottom'] & { + transform-origin: top; + } + + .Popover[data-placement^='top'] & { + transform-origin: bottom; + } + + .Popover[data-placement^='left'] & { + transform-origin: right; + } + + .Popover[data-placement^='right'] & { + transform-origin: left; + } + + .Popover[data-placement^='bottom'] & { transform: rotateX(-12deg); } - .Popover--enter[data-floating-placement^='top'] &, - .Popover--exit.Popover--exit-active[data-floating-placement^='top'] & { + .Popover[data-placement^='top'] & { transform: rotateX(12deg); } - .Popover--enter.Popover--enter-active &, - .Popover--exit & { + .Popover[data-placement^='left'] & { + transform: rotateY(-12deg); + } + + .Popover[data-placement^='right'] & { + transform: rotateY(12deg); + } + + .Popover.Popover--enter-done & { opacity: 1; - transform: rotateX(0); + transform: none; } .Popover--max-content-width & { @@ -92,3 +108,7 @@ border-color: var(--primary); } } + +.Popover__content { + overflow: auto; +} diff --git a/frontend/src/lib/lemon-ui/Popover/Popover.tsx b/frontend/src/lib/lemon-ui/Popover/Popover.tsx index bda44ce951c..f98dcd5b2a9 100644 --- a/frontend/src/lib/lemon-ui/Popover/Popover.tsx +++ b/frontend/src/lib/lemon-ui/Popover/Popover.tsx @@ -9,10 +9,8 @@ import React, { useMemo, useRef, } from 'react' -import ReactDOM from 'react-dom' import { useOutsideClickHandler } from 'lib/hooks/useOutsideClickHandler' import clsx from 'clsx' -import { CSSTransition } from 'react-transition-group' import { offset, useFloating, @@ -23,7 +21,9 @@ import { flip, size, arrow, -} from '@floating-ui/react-dom-interactions' + FloatingPortal, +} from '@floating-ui/react' +import { CSSTransition } from 'react-transition-group' export interface PopoverProps { ref?: React.MutableRefObject | React.Ref | null @@ -89,9 +89,9 @@ export const Popover = React.forwardRef(function P closeParentPopoverOnClickInside = false, style, getPopupContainer, - showArrow, + showArrow = false, }, - ref + contentRef ): JSX.Element { const popoverId = useMemo(() => uniqueMemoizedIndex++, []) const parentPopoverId = useContext(PopoverContext) @@ -101,12 +101,14 @@ export const Popover = React.forwardRef(function P x, y, reference, + floating, refs: { reference: referenceRef, floating: floatingRef }, strategy, - placement: floatingPlacement, + placement: effectivePlacement, update, middlewareData, } = useFloating({ + open: visible, placement, strategy: 'fixed', middleware: [ @@ -133,7 +135,7 @@ export const Popover = React.forwardRef(function P right: 'left', bottom: 'top', left: 'right', - }[floatingPlacement.split('-')[0]] as string + }[effectivePlacement.split('-')[0]] as string const arrowStyle = middlewareData.arrow ? { @@ -171,10 +173,8 @@ export const Popover = React.forwardRef(function P const clonedChildren = children ? typeof children === 'function' - ? children({ ref: referenceRef }) - : React.Children.toArray(children).map((child) => - React.cloneElement(child as ReactElement, { ref: referenceRef }) - ) + ? children({ ref: referenceRef as React.MutableRefObject }) + : React.cloneElement(children as ReactElement, { ref: referenceRef }) : null const isAttached = clonedChildren || referenceElement @@ -195,8 +195,8 @@ export const Popover = React.forwardRef(function P return ( <> {clonedChildren} - {ReactDOM.createPortal( - + +
(function P !isAttached && 'Popover--top-centered', className )} - data-floating-placement={floatingPlacement} - ref={floatingRef as MutableRefObject} + data-placement={effectivePlacement} + ref={floating} style={{ position: strategy, top, left, ...style }} onClick={_onClickInside} > -
- {overlay} +
+ {showArrow && isAttached && ( + // Arrow is outside of .Popover__content to avoid affecting :nth-child for content +
+ )} +
+ {overlay} +
- {showArrow && isAttached && ( -
- )}
- , - getPopupContainer ? getPopupContainer() : document.body - )} + + ) }) diff --git a/frontend/src/lib/logic/inAppPrompt/inAppPromptLogic.tsx b/frontend/src/lib/logic/inAppPrompt/inAppPromptLogic.tsx index 792a8397d3c..d079aaee32d 100644 --- a/frontend/src/lib/logic/inAppPrompt/inAppPromptLogic.tsx +++ b/frontend/src/lib/logic/inAppPrompt/inAppPromptLogic.tsx @@ -1,5 +1,5 @@ import ReactDOM from 'react-dom' -import { Placement } from '@floating-ui/react-dom-interactions' +import { Placement } from '@floating-ui/react' import { kea, path, actions, reducers, listeners, selectors, connect, afterMount, beforeUnmount } from 'kea' import type { inAppPromptLogicType } from './inAppPromptLogicType' import { router, urlToAction } from 'kea-router' diff --git a/frontend/src/scenes/data-management/ingestion-warnings/WarningEventsGraph.tsx b/frontend/src/scenes/data-management/ingestion-warnings/WarningEventsGraph.tsx index 389e094e513..4b16192a21d 100644 --- a/frontend/src/scenes/data-management/ingestion-warnings/WarningEventsGraph.tsx +++ b/frontend/src/scenes/data-management/ingestion-warnings/WarningEventsGraph.tsx @@ -6,7 +6,7 @@ import { dayjs, dayjsUtcToTimezone } from 'lib/dayjs' import { teamLogic } from '../../teamLogic' import { IngestionWarningSummary } from './ingestionWarningsLogic' import { Popover } from 'lib/lemon-ui/Popover/Popover' -import { offset } from '@floating-ui/react-dom-interactions' +import { offset } from '@floating-ui/react' import './WarningEventsGraph.scss' diff --git a/frontend/src/scenes/plugins/source/types/packages.json b/frontend/src/scenes/plugins/source/types/packages.json index a618a1923d1..6d832235c40 100644 --- a/frontend/src/scenes/plugins/source/types/packages.json +++ b/frontend/src/scenes/plugins/source/types/packages.json @@ -3,5 +3,5 @@ "@types/react/global.d.ts": "/*\nReact projects that don't include the DOM library need these interfaces to compile.\nReact Native applications use React, but there is no DOM available. The JavaScript runtime\nis ES6/ES2015 only. These definitions allow such projects to compile with only `--lib ES6`.\n\nWarning: all of these interfaces are empty. If you want type definitions for various properties\n(such as HTMLInputElement.prototype.value), you need to add `--lib DOM` (via command line or tsconfig.json).\n*/\n\ninterface Event { }\ninterface AnimationEvent extends Event { }\ninterface ClipboardEvent extends Event { }\ninterface CompositionEvent extends Event { }\ninterface DragEvent extends Event { }\ninterface FocusEvent extends Event { }\ninterface KeyboardEvent extends Event { }\ninterface MouseEvent extends Event { }\ninterface TouchEvent extends Event { }\ninterface PointerEvent extends Event { }\ninterface TransitionEvent extends Event { }\ninterface UIEvent extends Event { }\ninterface WheelEvent extends Event { }\n\ninterface EventTarget { }\ninterface Document { }\ninterface DataTransfer { }\ninterface StyleMedia { }\n\ninterface Element { }\ninterface DocumentFragment { }\n\ninterface HTMLElement extends Element { }\ninterface HTMLAnchorElement extends HTMLElement { }\ninterface HTMLAreaElement extends HTMLElement { }\ninterface HTMLAudioElement extends HTMLElement { }\ninterface HTMLBaseElement extends HTMLElement { }\ninterface HTMLBodyElement extends HTMLElement { }\ninterface HTMLBRElement extends HTMLElement { }\ninterface HTMLButtonElement extends HTMLElement { }\ninterface HTMLCanvasElement extends HTMLElement { }\ninterface HTMLDataElement extends HTMLElement { }\ninterface HTMLDataListElement extends HTMLElement { }\ninterface HTMLDialogElement extends HTMLElement { }\ninterface HTMLDivElement extends HTMLElement { }\ninterface HTMLDListElement extends HTMLElement { }\ninterface HTMLEmbedElement extends HTMLElement { }\ninterface HTMLFieldSetElement extends HTMLElement { }\ninterface HTMLFormElement extends HTMLElement { }\ninterface HTMLHeadingElement extends HTMLElement { }\ninterface HTMLHeadElement extends HTMLElement { }\ninterface HTMLHRElement extends HTMLElement { }\ninterface HTMLHtmlElement extends HTMLElement { }\ninterface HTMLIFrameElement extends HTMLElement { }\ninterface HTMLImageElement extends HTMLElement { }\ninterface HTMLInputElement extends HTMLElement { }\ninterface HTMLModElement extends HTMLElement { }\ninterface HTMLLabelElement extends HTMLElement { }\ninterface HTMLLegendElement extends HTMLElement { }\ninterface HTMLLIElement extends HTMLElement { }\ninterface HTMLLinkElement extends HTMLElement { }\ninterface HTMLMapElement extends HTMLElement { }\ninterface HTMLMetaElement extends HTMLElement { }\ninterface HTMLObjectElement extends HTMLElement { }\ninterface HTMLOListElement extends HTMLElement { }\ninterface HTMLOptGroupElement extends HTMLElement { }\ninterface HTMLOptionElement extends HTMLElement { }\ninterface HTMLParagraphElement extends HTMLElement { }\ninterface HTMLParamElement extends HTMLElement { }\ninterface HTMLPreElement extends HTMLElement { }\ninterface HTMLProgressElement extends HTMLElement { }\ninterface HTMLQuoteElement extends HTMLElement { }\ninterface HTMLSlotElement extends HTMLElement { }\ninterface HTMLScriptElement extends HTMLElement { }\ninterface HTMLSelectElement extends HTMLElement { }\ninterface HTMLSourceElement extends HTMLElement { }\ninterface HTMLSpanElement extends HTMLElement { }\ninterface HTMLStyleElement extends HTMLElement { }\ninterface HTMLTableElement extends HTMLElement { }\ninterface HTMLTableColElement extends HTMLElement { }\ninterface HTMLTableDataCellElement extends HTMLElement { }\ninterface HTMLTableHeaderCellElement extends HTMLElement { }\ninterface HTMLTableRowElement extends HTMLElement { }\ninterface HTMLTableSectionElement extends HTMLElement { }\ninterface HTMLTemplateElement extends HTMLElement { }\ninterface HTMLTextAreaElement extends HTMLElement { }\ninterface HTMLTitleElement extends HTMLElement { }\ninterface HTMLTrackElement extends HTMLElement { }\ninterface HTMLUListElement extends HTMLElement { }\ninterface HTMLVideoElement extends HTMLElement { }\ninterface HTMLWebViewElement extends HTMLElement { }\n\ninterface SVGElement extends Element { }\ninterface SVGSVGElement extends SVGElement { }\ninterface SVGCircleElement extends SVGElement { }\ninterface SVGClipPathElement extends SVGElement { }\ninterface SVGDefsElement extends SVGElement { }\ninterface SVGDescElement extends SVGElement { }\ninterface SVGEllipseElement extends SVGElement { }\ninterface SVGFEBlendElement extends SVGElement { }\ninterface SVGFEColorMatrixElement extends SVGElement { }\ninterface SVGFEComponentTransferElement extends SVGElement { }\ninterface SVGFECompositeElement extends SVGElement { }\ninterface SVGFEConvolveMatrixElement extends SVGElement { }\ninterface SVGFEDiffuseLightingElement extends SVGElement { }\ninterface SVGFEDisplacementMapElement extends SVGElement { }\ninterface SVGFEDistantLightElement extends SVGElement { }\ninterface SVGFEDropShadowElement extends SVGElement { }\ninterface SVGFEFloodElement extends SVGElement { }\ninterface SVGFEFuncAElement extends SVGElement { }\ninterface SVGFEFuncBElement extends SVGElement { }\ninterface SVGFEFuncGElement extends SVGElement { }\ninterface SVGFEFuncRElement extends SVGElement { }\ninterface SVGFEGaussianBlurElement extends SVGElement { }\ninterface SVGFEImageElement extends SVGElement { }\ninterface SVGFEMergeElement extends SVGElement { }\ninterface SVGFEMergeNodeElement extends SVGElement { }\ninterface SVGFEMorphologyElement extends SVGElement { }\ninterface SVGFEOffsetElement extends SVGElement { }\ninterface SVGFEPointLightElement extends SVGElement { }\ninterface SVGFESpecularLightingElement extends SVGElement { }\ninterface SVGFESpotLightElement extends SVGElement { }\ninterface SVGFETileElement extends SVGElement { }\ninterface SVGFETurbulenceElement extends SVGElement { }\ninterface SVGFilterElement extends SVGElement { }\ninterface SVGForeignObjectElement extends SVGElement { }\ninterface SVGGElement extends SVGElement { }\ninterface SVGImageElement extends SVGElement { }\ninterface SVGLineElement extends SVGElement { }\ninterface SVGLinearGradientElement extends SVGElement { }\ninterface SVGMarkerElement extends SVGElement { }\ninterface SVGMaskElement extends SVGElement { }\ninterface SVGMetadataElement extends SVGElement { }\ninterface SVGPathElement extends SVGElement { }\ninterface SVGPatternElement extends SVGElement { }\ninterface SVGPolygonElement extends SVGElement { }\ninterface SVGPolylineElement extends SVGElement { }\ninterface SVGRadialGradientElement extends SVGElement { }\ninterface SVGRectElement extends SVGElement { }\ninterface SVGStopElement extends SVGElement { }\ninterface SVGSwitchElement extends SVGElement { }\ninterface SVGSymbolElement extends SVGElement { }\ninterface SVGTextElement extends SVGElement { }\ninterface SVGTextPathElement extends SVGElement { }\ninterface SVGTSpanElement extends SVGElement { }\ninterface SVGUseElement extends SVGElement { }\ninterface SVGViewElement extends SVGElement { }\n\ninterface Text { }\ninterface TouchList { }\ninterface WebGLRenderingContext { }\ninterface WebGL2RenderingContext { }\n", "@types/kea/index.d.ts": "import { AnyAction, Reducer, Middleware, compose, StoreEnhancer, Store } from 'redux';\nimport * as React from 'react';\nimport React__default, { ComponentType, FunctionComponent, Context as Context$1 } from 'react';\nimport { DefaultMemoizeOptions } from 'reselect';\n\ndeclare type AnyComponent = ComponentType | FunctionComponent;\r\ndeclare type KeyType = string | number | boolean;\r\ndeclare type PathType = KeyType[];\r\ndeclare type Selector = (state?: any, props?: any) => any;\r\ndeclare type Props = Record;\r\ndeclare type PartialRecord = Partial>;\r\ninterface Logic {\r\n path: PathType;\r\n pathString: string;\r\n props: any;\r\n key?: KeyType;\r\n keyBuilder?: (props: any) => KeyType;\r\n actionCreators: Record;\r\n actionKeys: Record;\r\n actionTypes: Record;\r\n actions: Record;\r\n cache: Record;\r\n connections: {\r\n [pathString: string]: BuiltLogic;\r\n };\r\n defaults: Record;\r\n reducers: Record;\r\n reducer?: ReducerFunction;\r\n reducerOptions: Record;\r\n selector?: Selector;\r\n selectors: Record;\r\n values: Record;\r\n events: {\r\n beforeMount?: () => void;\r\n afterMount?: () => void;\r\n beforeUnmount?: () => void;\r\n afterUnmount?: () => void;\r\n propsChanged?: (props: any, oldProps: any) => void;\r\n };\r\n listeners?: Record;\r\n sharedListeners?: Record;\r\n __keaTypeGenInternalSelectorTypes: Record;\r\n __keaTypeGenInternalReducerActions: Record;\r\n __keaTypeGenInternalExtraInput: Record;\r\n}\r\ninterface BuiltLogicAdditions {\r\n _isKeaBuild: boolean;\r\n mount: () => () => void;\r\n unmount: () => void;\r\n isMounted: () => boolean;\r\n extend: (extendedInput: LogicInput | LogicInput[]) => LogicWrapper;\r\n wrapper: LogicWrapper;\r\n}\r\ndeclare type BuiltLogic = LogicType & BuiltLogicAdditions;\r\ninterface LogicWrapperAdditions {\r\n _isKea: boolean;\r\n inputs: (LogicInput | LogicBuilder)[];\r\n (props: T): T extends LogicType['props'] ? BuiltLogic : FunctionComponent;\r\n (): BuiltLogic;\r\n wrap: (Component: AnyComponent) => KeaComponent;\r\n build: (props?: LogicType['props']) => BuiltLogic;\r\n mount: () => () => void;\r\n unmount: () => void;\r\n isMounted: (props?: Record) => boolean;\r\n findMounted: (props?: Record) => BuiltLogic | null;\r\n extend: (extendedInput: LogicInput) => LogicWrapper;\r\n}\r\ndeclare type LogicWrapper = LogicType & LogicWrapperAdditions;\r\ndeclare type LogicBuilder = (logic: BuiltLogic) => void;\r\ndeclare type PayloadCreatorDefinition = true | ((...args: any[]) => any);\r\ndeclare type ActionDefinitions = LogicType['actionCreators'] extends Record ? Partial<{\r\n [K in keyof LogicType['actionCreators']]: LogicType['actionCreators'][K] extends Function ? ReturnType['payload']['value'] extends true ? true : (...args: Parameters) => LogicType['actionCreators'][K]['payload'] : never;\r\n}> : Record;\r\ninterface KeaReduxAction extends AnyAction {\r\n type: string;\r\n payload?: any;\r\n}\r\ninterface KeaAction {\r\n (...args: any[]): KeaReduxAction;\r\n _isKeaAction: boolean;\r\n toString(): string;\r\n}\r\ndeclare type ReducerActions = LogicType['__keaTypeGenInternalReducerActions'] extends Record ? {\r\n [K in keyof LogicType['actionCreators']]?: (state: ReducerType, payload: ReturnType['payload']) => ReducerType;\r\n} : LogicType['__keaTypeGenInternalReducerActions'] extends Record ? {\r\n [K in keyof LogicType['actionCreators']]?: (state: ReducerType, payload: ReturnType['payload']) => ReducerType;\r\n} & {\r\n [K in keyof LogicType['__keaTypeGenInternalReducerActions']]?: (state: ReducerType, payload: ReturnType['payload']) => ReducerType;\r\n} : never;\r\ndeclare type ReducerDefault any, P extends Props> = ReturnType | ((state: any, props: P) => ReturnType);\r\ndeclare type ReducerDefinitions = {\r\n [K in keyof LogicType['reducers']]?: [\r\n ReducerDefault,\r\n Record,\r\n ReducerActions>\r\n ] | [\r\n ReducerDefault,\r\n ReducerActions>\r\n ] | [ReducerDefault] | ReducerActions>;\r\n};\r\ndeclare type ReducerFunction = (state: S, action: KeaReduxAction, fullState: any) => S;\r\ndeclare type SelectorTuple = [] | [Selector] | [Selector, Selector] | [Selector, Selector, Selector] | [Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector];\r\ndeclare type SelectorDefinition = [(s: Selectors, p: PropSelectors) => SelectorTuple, SelectorFunction] | [(s: Selectors, p: PropSelectors) => SelectorTuple, SelectorFunction, DefaultMemoizeOptions];\r\ndeclare type LogicPropSelectors = {\r\n [PK in keyof LogicType['props']]: () => LogicType['props'][PK];\r\n};\r\ndeclare type SelectorDefinitions = {\r\n [K in keyof LogicType['__keaTypeGenInternalSelectorTypes']]?: SelectorDefinition, LogicType['__keaTypeGenInternalSelectorTypes'][K]>;\r\n} | {\r\n [key: string]: SelectorDefinition, any>;\r\n};\r\ndeclare type BreakPointFunction = (() => void) & ((ms: number) => Promise);\r\ndeclare type ListenerDefinitionsForRecord any>> = {\r\n [K in keyof A]?: ListenerFunction> | ListenerFunction>[];\r\n};\r\ndeclare type ListenerDefinitions = LogicType['__keaTypeGenInternalReducerActions'] extends Record ? ListenerDefinitionsForRecord : LogicType['__keaTypeGenInternalReducerActions'] extends Record ? ListenerDefinitionsForRecord & ListenerDefinitionsForRecord : never;\r\ndeclare type EventDefinitions = {\r\n beforeMount?: (() => void) | (() => void)[];\r\n afterMount?: (() => void) | (() => void)[];\r\n beforeUnmount?: (() => void) | (() => void)[];\r\n afterUnmount?: (() => void) | (() => void)[];\r\n propsChanged?: ((props: Logic['props'], oldProps: Logic['props']) => void) | ((props: Logic['props'], oldProps: Logic['props']) => void)[];\r\n};\r\ndeclare type ListenerFunction = (payload: A['payload'], breakpoint: BreakPointFunction, action: A, previousState: any) => void | Promise;\r\ndeclare type ListenerFunctionWrapper = (action: any, previousState: any) => void;\r\ndeclare type SharedListenerDefinitions = Record;\r\ndeclare type WindowValuesDefinitions = Record any>;\r\ndeclare type LoaderFunctions = {\r\n [K in keyof LogicType['actionCreators']]?: (payload: ReturnType['payload'], breakpoint: BreakPointFunction, action: ReturnType) => ReducerReturnType | Promise;\r\n};\r\ndeclare type LoaderDefinitions = {\r\n [K in keyof LogicType['reducers']]?: (LoaderFunctions> | {\r\n __default: ReturnType;\r\n }) | [ReturnType, LoaderFunctions>];\r\n};\r\ndeclare type ConnectDefinitions = BuiltLogic | LogicWrapper | (BuiltLogic | LogicWrapper)[] | {\r\n logic?: (BuiltLogic | LogicWrapper)[];\r\n values?: any[];\r\n actions?: any[];\r\n};\r\ndeclare type LogicInput = {\r\n inherit?: LogicWrapper[];\r\n extend?: LogicInput[];\r\n key?: (props: LogicType['props']) => KeyType;\r\n path?: PathType | ((key: KeyType) => PathType);\r\n connect?: ConnectDefinitions | ((props: LogicType['props']) => ConnectDefinitions);\r\n actions?: ActionDefinitions | ((logic: LogicType) => ActionDefinitions);\r\n reducers?: ReducerDefinitions | ((logic: LogicType) => ReducerDefinitions);\r\n selectors?: SelectorDefinitions | ((logic: LogicType) => SelectorDefinitions);\r\n listeners?: ListenerDefinitions | ((logic: LogicType) => ListenerDefinitions);\r\n sharedListeners?: SharedListenerDefinitions | ((logic: LogicType) => SharedListenerDefinitions);\r\n events?: EventDefinitions | ((logic: LogicType) => EventDefinitions);\r\n defaults?: ((logic: LogicType) => (state: any, props: LogicType['props']) => Record) | ((logic: LogicType) => Record) | Record;\r\n loaders?: LoaderDefinitions | ((logic: LogicType) => LoaderDefinitions);\r\n windowValues?: WindowValuesDefinitions | ((logic: LogicType) => WindowValuesDefinitions);\r\n urlToAction?: (logic: LogicType) => Record, searchParams: Record, hashParams: Record, payload: {\r\n method: 'PUSH' | 'REPLACE' | 'POP';\r\n pathname: string;\r\n search: string;\r\n searchParams: Record;\r\n hash: string;\r\n hashParams: Record;\r\n url: string;\r\n initial?: boolean;\r\n }, previousLocation: {\r\n method: 'PUSH' | 'REPLACE' | 'POP' | null;\r\n pathname: string;\r\n search: string;\r\n searchParams: Record;\r\n hash: string;\r\n hashParams: Record;\r\n url: string;\r\n }) => any>;\r\n actionToUrl?: (logic: LogicType) => {\r\n [K in keyof LogicType['actionCreators']]?: (payload: Record) => void | string | [string] | [string, string | Record | undefined] | [string, string | Record | undefined, string | Record | undefined] | [\r\n string,\r\n string | Record | undefined,\r\n string | Record | undefined,\r\n {\r\n replace?: boolean;\r\n }\r\n ];\r\n };\r\n [key: string]: unknown;\r\n} & LogicType['__keaTypeGenInternalExtraInput'];\r\ninterface MakeLogicType, Actions = Record, LogicProps = Props> extends Logic {\r\n actionCreators: {\r\n [ActionKey in keyof Actions]: Actions[ActionKey] extends AnyFunction ? ActionCreatorForPayloadBuilder : never;\r\n };\r\n actionKeys: Record;\r\n actionTypes: {\r\n [ActionKey in keyof Actions]: string;\r\n };\r\n actions: {\r\n [ActionKey in keyof Actions]: Actions[ActionKey] extends AnyFunction ? ActionForPayloadBuilder : never;\r\n };\r\n defaults: Values;\r\n props: LogicProps;\r\n reducer: ReducerFunction;\r\n reducers: {\r\n [Value in keyof Values]: ReducerFunction;\r\n };\r\n selector: (state: any, props: LogicProps) => Values;\r\n selectors: {\r\n [Value in keyof Values]: (state: any, props: LogicProps) => Values[Value];\r\n };\r\n values: Values;\r\n __keaTypeGenInternalSelectorTypes: {\r\n [K in keyof Values]: (...args: any) => Values[K];\r\n };\r\n}\r\ndeclare type AnyFunction = (...args: any) => any;\r\ndeclare type ActionCreatorForPayloadBuilder = (...args: Parameters) => {\r\n type: string;\r\n payload: ReturnType;\r\n};\r\ndeclare type ActionForPayloadBuilder = (...args: Parameters) => void;\r\ninterface CreateStoreOptions {\r\n paths: string[];\r\n reducers: Record;\r\n preloadedState: Record | undefined;\r\n middleware: Middleware[];\r\n compose: typeof compose;\r\n enhancers: StoreEnhancer[];\r\n plugins: KeaPlugin[];\r\n}\r\ninterface InternalContextOptions {\r\n debug: boolean;\r\n proxyFields: boolean;\r\n flatDefaults: boolean;\r\n attachStrategy: 'dispatch' | 'replace';\r\n detachStrategy: 'dispatch' | 'replace' | 'persist';\r\n defaultPath: string[];\r\n}\r\ninterface ContextOptions extends Partial {\r\n plugins?: KeaPlugin[];\r\n createStore?: boolean | Partial;\r\n defaults?: Record;\r\n}\r\ninterface KeaComponent extends FunctionComponent {\r\n _wrapper: LogicWrapper;\r\n _wrappedComponent: AnyComponent;\r\n}\r\ninterface PluginEvents {\r\n afterOpenContext?: (context: Context, options: ContextOptions) => void;\r\n afterPlugin?: () => void;\r\n beforeReduxStore?: (options: CreateStoreOptions) => void;\r\n afterReduxStore?: (options: CreateStoreOptions, store: Store) => void;\r\n beforeKea?: (input: LogicInput | LogicBuilder) => void;\r\n beforeBuild?: (logic: BuiltLogic, inputs: (LogicInput | LogicBuilder)[]) => void;\r\n beforeLogic?: (logic: BuiltLogic, input: LogicInput | LogicBuilder) => void;\r\n afterLogic?: (logic: BuiltLogic, input: LogicInput | LogicBuilder) => void;\r\n legacyBuild?: (logic: BuiltLogic, input: LogicInput) => void;\r\n legacyBuildAfterConnect?: (logic: BuiltLogic, input: LogicInput) => void;\r\n legacyBuildAfterDefaults?: (logic: BuiltLogic, input: LogicInput) => void;\r\n afterBuild?: (logic: BuiltLogic, inputs: (LogicInput | LogicBuilder)[]) => void;\r\n beforeMount?: (logic: BuiltLogic) => void;\r\n afterMount?: (logic: BuiltLogic) => void;\r\n beforeAttach?: (logic: BuiltLogic) => void;\r\n afterAttach?: (logic: BuiltLogic) => void;\r\n beforeUnmount?: (logic: BuiltLogic) => void;\r\n afterUnmount?: (logic: BuiltLogic) => void;\r\n beforeDetach?: (logic: BuiltLogic) => void;\r\n afterDetach?: (logic: BuiltLogic) => void;\r\n beforeWrap?: (wrapper: LogicWrapper, Klass: AnyComponent) => void;\r\n afterWrap?: (wrapper: LogicWrapper, Klass: AnyComponent, Kea: KeaComponent) => void;\r\n beforeRender?: (logic: BuiltLogic, props: Props) => void;\r\n beforeCloseContext?: (context: Context) => void;\r\n}\r\ndeclare type PluginEventArrays = {\r\n [K in keyof PluginEvents]: PluginEvents[K][];\r\n};\r\ninterface KeaPlugin {\r\n name: string;\r\n defaults?: () => Record;\r\n events?: PluginEvents;\r\n}\r\ninterface WrapperContext {\r\n isBuilding: boolean;\r\n keyBuilder: L['keyBuilder'];\r\n builtLogics: Map>;\r\n}\r\ninterface Context {\r\n contextId: string;\r\n plugins: {\r\n activated: KeaPlugin[];\r\n events: PluginEventArrays;\r\n logicFields: Record;\r\n contexts: Record>;\r\n };\r\n inputCounter: number;\r\n reducerDefaults: Record | undefined;\r\n wrapperContexts: WeakMap;\r\n buildHeap: Logic[];\r\n mount: {\r\n counter: Record;\r\n mounted: Record;\r\n };\r\n react: {\r\n contexts: WeakMap>;\r\n };\r\n reducers: {\r\n tree: any;\r\n roots: any;\r\n redux: any;\r\n whitelist: false | Record;\r\n combined: ReducerFunction | undefined;\r\n };\r\n store: Store;\r\n __store: Store | undefined;\r\n options: InternalContextOptions;\r\n}\n\ndeclare function isLogicWrapper(logic: any): logic is LogicWrapper;\r\ndeclare function isBuiltLogic(logic: any): logic is BuiltLogic;\r\ndeclare const shallowCompare: (obj1: Record, obj2: Record) => boolean;\n\ndeclare function actions(input: ActionDefinitions | ((logic: L) => ActionDefinitions)): LogicBuilder;\r\ndeclare function createActionCreator(type: string, payloadCreator: PayloadCreatorDefinition): KeaAction;\n\ndeclare function connect(input: ConnectDefinitions | ((props: L['props']) => ConnectDefinitions)): LogicBuilder;\r\ndeclare function addConnection(logic: Logic, otherLogic: Logic): void;\n\ndeclare function defaults(input: ((logic: L) => (state: any, props: L['props']) => Partial<{\r\n [T in keyof L['values']]: L['values'][T];\r\n}>) | ((logic: L) => Partial<{\r\n [T in keyof L['values']]: L['values'][T];\r\n}>) | Partial<{\r\n [T in keyof L['values']]: L['values'][T];\r\n}>): LogicBuilder;\n\ndeclare function events(input: EventDefinitions | ((logic: L) => EventDefinitions)): LogicBuilder;\r\ndeclare function afterMount(input: (logic: L) => void): LogicBuilder;\r\ndeclare function beforeUnmount(input: (logic: L) => void): LogicBuilder;\r\ndeclare function propsChanged(input: (logic: L, oldProps: L['props']) => void): LogicBuilder;\n\ndeclare const isBreakpoint: (error: Error) => boolean;\r\ndeclare function listeners(input: LogicInput['listeners']): LogicBuilder;\r\ndeclare function sharedListeners(input: LogicInput['sharedListeners']): LogicBuilder;\n\ndeclare function reducers(input: ReducerDefinitions | ((logic: L) => ReducerDefinitions)): LogicBuilder;\n\ndeclare function selectors(input: SelectorDefinitions | ((logic: L) => SelectorDefinitions)): LogicBuilder;\n\ndeclare function key(input: (props: L['props']) => KeyType): LogicBuilder;\n\ndeclare function props(input: L['props']): LogicBuilder;\n\ndeclare function path(input: PathType | ((key: KeyType) => PathType)): LogicBuilder;\n\ndeclare const corePlugin: KeaPlugin;\n\ndeclare function kea(input: LogicInput | (LogicBuilder | LogicInput)[]): LogicWrapper;\n\ndeclare function useSelector(selector: Selector): any;\r\ndeclare function useValues(logic: BuiltLogic | LogicWrapper): L['values'];\r\ndeclare function useAllValues(logic: BuiltLogic | LogicWrapper): L['values'];\r\ndeclare function useActions(logic: BuiltLogic | LogicWrapper): L['actions'];\r\ndeclare function useMountedLogic(logic: BuiltLogic | LogicWrapper): BuiltLogic;\r\ndeclare function batchChanges(callback: () => void): void;\n\ndeclare type BindPropsProps = {\r\n logic: LogicWrapper;\r\n props: LogicWrapper['props'];\r\n children: React.ReactNode;\r\n};\r\ndeclare function BindLogic({ logic, props, children }: BindPropsProps): JSX.Element;\n\ndeclare function Provider({ children }: {\r\n children: React__default.ReactNode;\r\n}): JSX.Element;\n\ndeclare function getContext(): Context;\r\ndeclare function openContext(options?: ContextOptions, initial?: boolean): Context;\r\ndeclare function closeContext(): void;\r\ndeclare function resetContext(options?: ContextOptions, initial?: boolean): Context;\r\ndeclare function getPluginContext>(name: string): Context;\r\ndeclare function setPluginContext>(name: string, pluginContext: Context): void;\n\ndeclare function createStore(opts?: {}): Store | void;\n\ndeclare function keaReducer(pathStart?: string): ReducerFunction;\n\ndeclare function activatePlugin(pluginToActivate: KeaPlugin | (() => KeaPlugin)): void;\n\ndeclare const ATTACH_REDUCER: \"@KEA/ATTACH_REDUCER\";\r\ndeclare const DETACH_REDUCER: \"@KEA/DETACH_REDUCER\";\n\nexport { ATTACH_REDUCER, ActionCreatorForPayloadBuilder, ActionDefinitions, ActionForPayloadBuilder, AnyComponent, AnyFunction, BindLogic, BreakPointFunction, BuiltLogic, BuiltLogicAdditions, ConnectDefinitions, Context, ContextOptions, CreateStoreOptions, DETACH_REDUCER, EventDefinitions, InternalContextOptions, KeaAction, KeaComponent, KeaPlugin, KeaReduxAction, KeyType, ListenerDefinitions, ListenerDefinitionsForRecord, ListenerFunction, ListenerFunctionWrapper, Logic, LogicBuilder, LogicInput, LogicPropSelectors, LogicWrapper, LogicWrapperAdditions, MakeLogicType, PartialRecord, PathType, PayloadCreatorDefinition, PluginEventArrays, PluginEvents, Props, Provider, ReducerActions, ReducerDefault, ReducerDefinitions, ReducerFunction, Selector, SelectorDefinition, SelectorDefinitions, SelectorTuple, SharedListenerDefinitions, WrapperContext, actions, activatePlugin, addConnection, afterMount, batchChanges, beforeUnmount, closeContext, connect, corePlugin, createActionCreator, createStore, defaults, events, getContext, getPluginContext, isBreakpoint, isBuiltLogic, isLogicWrapper, kea, keaReducer, key, listeners, openContext, path, props, propsChanged, reducers, resetContext, selectors, setPluginContext, shallowCompare, sharedListeners, useActions, useAllValues, useMountedLogic, useSelector, useValues };\n", "@posthog/apps-common/index.d.ts": "import { UploadFile } from 'antd/lib/upload/interface';\nimport { Layout } from 'react-grid-layout';\nimport dayjs from 'dayjs';\nimport * as antd_lib_checkbox_Group from 'antd/lib/checkbox/Group';\n\n/** Collaboration restriction level (which is a dashboard setting). Sync with DashboardPrivilegeLevel. */\ndeclare enum DashboardRestrictionLevel {\n EveryoneInProjectCanEdit = 21,\n OnlyCollaboratorsCanEdit = 37\n}\n/** Collaboration privilege level (which is a user property). Sync with DashboardRestrictionLevel. */\ndeclare enum DashboardPrivilegeLevel {\n CanView = 21,\n CanEdit = 37,\n /** This is not a value that can be set in the DB – it's inferred. */\n _ProjectAdmin = 888,\n /** This is not a value that can be set in the DB – it's inferred. */\n _Owner = 999\n}\ndeclare enum ShownAsValue {\n VOLUME = \"Volume\",\n STICKINESS = \"Stickiness\",\n LIFECYCLE = \"Lifecycle\"\n}\ndeclare const RETENTION_RECURRING = \"retention_recurring\";\ndeclare const RETENTION_FIRST_TIME = \"retention_first_time\";\ndeclare const ENTITY_MATCH_TYPE = \"entities\";\ndeclare const PROPERTY_MATCH_TYPE = \"properties\";\ndeclare enum FunnelLayout {\n horizontal = \"horizontal\",\n vertical = \"vertical\"\n}\ndeclare const BIN_COUNT_AUTO: \"auto\";\n\ndeclare enum TaxonomicFilterGroupType {\n Actions = \"actions\",\n Cohorts = \"cohorts\",\n CohortsWithAllUsers = \"cohorts_with_all\",\n Elements = \"elements\",\n Events = \"events\",\n EventProperties = \"event_properties\",\n EventFeatureFlags = \"event_feature_flags\",\n NumericalEventProperties = \"numerical_event_properties\",\n PersonProperties = \"person_properties\",\n PageviewUrls = \"pageview_urls\",\n Screens = \"screens\",\n CustomEvents = \"custom_events\",\n Wildcards = \"wildcard\",\n GroupsPrefix = \"groups\",\n Persons = \"persons\",\n FeatureFlags = \"feature_flags\",\n Insights = \"insights\",\n Experiments = \"experiments\",\n Plugins = \"plugins\",\n Dashboards = \"dashboards\",\n GroupNamesPrefix = \"name_groups\",\n Sessions = \"sessions\"\n}\n\ndeclare type BehavioralFilterType = BehavioralEventType | BehavioralCohortType | BehavioralLifecycleType;\ndeclare enum BehavioralFilterKey {\n Behavioral = \"behavioral\",\n Cohort = \"cohort\",\n Person = \"person\"\n}\n\ndeclare const formats: readonly [\"numeric\", \"duration\", \"duration_ms\", \"percentage\", \"percentage_scaled\"];\ndeclare type AggregationAxisFormat = typeof formats[number];\n\ndeclare enum LicensePlan {\n Scale = \"scale\",\n Enterprise = \"enterprise\"\n}\ninterface UserBaseType {\n uuid: string;\n distinct_id: string;\n first_name: string;\n email: string;\n}\ninterface UserBasicType extends UserBaseType {\n id: number;\n}\ninterface ActionType {\n count?: number;\n created_at: string;\n deleted?: boolean;\n id: number;\n is_calculating?: boolean;\n last_calculated_at?: string;\n last_updated_at?: string;\n name: string | null;\n description?: string;\n post_to_slack?: boolean;\n slack_message_format?: string;\n steps?: ActionStepType[];\n created_by: UserBasicType | null;\n tags?: string[];\n verified?: boolean;\n is_action?: true;\n action_id?: number;\n}\n/** Sync with plugin-server/src/types.ts */\ndeclare enum ActionStepUrlMatching {\n Contains = \"contains\",\n Regex = \"regex\",\n Exact = \"exact\"\n}\ninterface ActionStepType {\n event?: string;\n href?: string | null;\n id?: number;\n name?: string;\n properties?: AnyPropertyFilter[];\n selector?: string | null;\n tag_name?: string;\n text?: string | null;\n url?: string | null;\n url_matching?: ActionStepUrlMatching;\n isNew?: string;\n}\ninterface ElementType {\n attr_class?: string[];\n attr_id?: string;\n attributes: Record;\n href: string;\n nth_child: number;\n nth_of_type: number;\n order: number;\n tag_name: string;\n text?: string;\n}\ndeclare type PropertyFilterValue = string | number | (string | number)[] | null;\n/** Sync with plugin-server/src/types.ts */\ndeclare enum PropertyOperator {\n Exact = \"exact\",\n IsNot = \"is_not\",\n IContains = \"icontains\",\n NotIContains = \"not_icontains\",\n Regex = \"regex\",\n NotRegex = \"not_regex\",\n GreaterThan = \"gt\",\n GreaterThanOrEqual = \"gte\",\n LessThan = \"lt\",\n LessThanOrEqual = \"lte\",\n IsSet = \"is_set\",\n IsNotSet = \"is_not_set\",\n IsDateExact = \"is_date_exact\",\n IsDateBefore = \"is_date_before\",\n IsDateAfter = \"is_date_after\",\n Between = \"between\",\n NotBetween = \"not_between\",\n Minimum = \"min\",\n Maximum = \"max\"\n}\ndeclare enum SessionRecordingsTabs {\n Recent = \"recent\",\n Playlists = \"playlists\",\n FilePlayback = \"file-playback\"\n}\ndeclare enum PropertyFilterType {\n /** Event metadata and fields on the clickhouse events table */\n Meta = \"meta\",\n /** Event properties */\n Event = \"event\",\n /** Person properties */\n Person = \"person\",\n Element = \"element\",\n /** Event property with \"$feature/\" prepended */\n Feature = \"feature\",\n Session = \"session\",\n Cohort = \"cohort\",\n Recording = \"recording\",\n Group = \"group\"\n}\n/** Sync with plugin-server/src/types.ts */\ninterface BasePropertyFilter {\n key: string;\n value: PropertyFilterValue;\n label?: string;\n type?: PropertyFilterType;\n}\n/** Sync with plugin-server/src/types.ts */\ninterface EventPropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Event;\n operator: PropertyOperator;\n}\n/** Sync with plugin-server/src/types.ts */\ninterface PersonPropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Person;\n operator: PropertyOperator;\n}\n/** Sync with plugin-server/src/types.ts */\ninterface ElementPropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Element;\n key: 'tag_name' | 'text' | 'href' | 'selector';\n operator: PropertyOperator;\n}\ninterface SessionPropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Session;\n key: '$session_duration';\n operator: PropertyOperator;\n}\n/** Sync with plugin-server/src/types.ts */\ninterface CohortPropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Cohort;\n key: 'id';\n value: number;\n}\ninterface GroupPropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Group;\n group_type_index?: number | null;\n operator: PropertyOperator;\n}\ninterface FeaturePropertyFilter extends BasePropertyFilter {\n type: PropertyFilterType.Feature;\n operator: PropertyOperator;\n}\ndeclare type AnyPropertyFilter = Partial | Partial | Partial | Partial | Partial | Partial | Partial | Partial;\ninterface RecordingDurationFilter extends BasePropertyFilter {\n type: PropertyFilterType.Recording;\n key: 'duration';\n value: number;\n operator: PropertyOperator;\n}\ninterface RecordingFilters {\n date_from?: string | null;\n date_to?: string | null;\n events?: FilterType['events'];\n actions?: FilterType['actions'];\n properties?: AnyPropertyFilter[];\n offset?: number;\n session_recording_duration?: RecordingDurationFilter;\n static_recordings?: SessionRecordingPlaylistType['playlist_items'];\n}\ninterface SessionRecordingsResponse {\n results: SessionRecordingType[];\n has_next: boolean;\n}\ndeclare type EntityType = 'actions' | 'events' | 'new_entity';\ninterface FunnelStepRangeEntityFilter {\n funnel_from_step?: number;\n funnel_to_step?: number;\n}\ninterface PersonType {\n id?: string;\n uuid?: string;\n name?: string;\n distinct_ids: string[];\n properties: Record;\n created_at?: string;\n is_identified?: boolean;\n}\ninterface PersonListParams {\n properties?: AnyPropertyFilter[];\n search?: string;\n cohort?: number;\n distinct_id?: string;\n}\ninterface MatchedRecordingEvents {\n uuid: string;\n session_id: string;\n window_id: string;\n timestamp: string;\n}\ninterface MatchedRecording {\n session_id?: string;\n events: MatchedRecordingEvents[];\n}\ninterface CommonActorType {\n id: string | number;\n properties: Record;\n created_at: string;\n matched_recordings: MatchedRecording[];\n value_at_data_point: number | null;\n}\ninterface PersonActorType extends CommonActorType {\n id: number;\n type: 'person';\n uuid?: string;\n name?: string;\n distinct_ids: string[];\n is_identified: boolean;\n}\ninterface CohortGroupType {\n id: string;\n days?: string;\n action_id?: number;\n event_id?: string;\n label?: string;\n count?: number;\n count_operator?: string;\n properties?: AnyPropertyFilter[];\n matchType: MatchType;\n name?: string;\n}\ninterface CohortCriteriaType {\n id: string;\n key: string;\n value: BehavioralFilterType;\n type: BehavioralFilterKey;\n operator?: PropertyOperator | null;\n group_type_index?: number | null;\n event_type?: TaxonomicFilterGroupType | null;\n operator_value?: PropertyFilterValue;\n time_value?: number | string | null;\n time_interval?: TimeUnitType | null;\n total_periods?: number | null;\n min_periods?: number | null;\n seq_event_type?: TaxonomicFilterGroupType | null;\n seq_event?: string | number | null;\n seq_time_value?: number | string | null;\n seq_time_interval?: TimeUnitType | null;\n negation?: boolean;\n value_property?: string | null;\n}\ndeclare type EmptyCohortCriteriaType = Partial;\ndeclare type AnyCohortCriteriaType = CohortCriteriaType | EmptyCohortCriteriaType;\ndeclare type MatchType = typeof ENTITY_MATCH_TYPE | typeof PROPERTY_MATCH_TYPE;\ninterface CohortType {\n count?: number;\n description?: string;\n created_by?: UserBasicType | null;\n created_at?: string;\n deleted?: boolean;\n id: number | 'new';\n is_calculating?: boolean;\n errors_calculating?: number;\n last_calculation?: string;\n is_static?: boolean;\n name?: string;\n csv?: UploadFile;\n groups: CohortGroupType[];\n filters: {\n properties: CohortCriteriaGroupFilter;\n };\n}\ndeclare type BinCountValue = number | typeof BIN_COUNT_AUTO;\ndeclare enum StepOrderValue {\n STRICT = \"strict\",\n UNORDERED = \"unordered\",\n ORDERED = \"ordered\"\n}\ninterface EventType {\n id: string;\n distinct_id: string;\n properties: Record;\n event: string;\n timestamp: string;\n person?: Pick;\n elements: ElementType[];\n elements_chain?: string | null;\n /** Used in session recording events list */\n colonTimestamp?: string;\n}\ninterface SessionRecordingPlaylistType {\n /** The primary key in the database, used as well in API endpoints */\n id: number;\n short_id: string;\n name: string;\n derived_name?: string | null;\n description?: string;\n pinned?: boolean;\n deleted: boolean;\n created_at: string;\n created_by: UserBasicType | null;\n last_modified_at: string;\n last_modified_by: UserBasicType | null;\n filters?: RecordingFilters;\n playlist_items?: Pick[];\n is_static?: boolean;\n}\ninterface SessionRecordingType {\n id: string;\n /** Whether this recording has been viewed already. */\n viewed: boolean;\n /** Length of recording in seconds. */\n recording_duration: number;\n /** When the recording starts in ISO format. */\n start_time: string;\n /** When the recording ends in ISO format. */\n end_time: string;\n /** List of matching events. **/\n matching_events?: MatchedRecording[];\n distinct_id?: string;\n email?: string;\n person?: PersonType;\n /** List of static playlists that this recording is referenced on */\n playlists?: SessionRecordingPlaylistType['id'][];\n click_count?: number;\n keypress_count?: number;\n urls?: string[];\n}\ninterface SessionRecordingPropertiesType {\n id: string;\n properties?: Record;\n}\ndeclare type InsightShortId = string & {\n readonly '': unique symbol;\n};\ndeclare enum InsightColor {\n White = \"white\",\n Black = \"black\",\n Blue = \"blue\",\n Green = \"green\",\n Purple = \"purple\"\n}\ninterface Cacheable {\n last_refresh: string | null;\n filters_hash: string;\n refreshing: boolean;\n}\ninterface TileLayout extends Omit {\n i?: string;\n}\ninterface Tileable {\n layouts: Record | Record;\n color: InsightColor | null;\n}\ninterface DashboardTile extends Tileable, Cacheable {\n id: number;\n insight?: InsightModel;\n text?: TextModel;\n deleted?: boolean;\n is_cached?: boolean;\n}\ninterface TextModel {\n body: string;\n created_by?: UserBasicType;\n last_modified_by?: UserBasicType;\n last_modified_at: string;\n}\ninterface InsightModel extends Cacheable {\n /** The unique key we use when communicating with the user, e.g. in URLs */\n short_id: InsightShortId;\n /** The primary key in the database, used as well in API endpoints */\n id: number;\n name: string;\n derived_name?: string | null;\n description?: string;\n favorited?: boolean;\n order: number | null;\n result: any | null;\n deleted: boolean;\n saved: boolean;\n created_at: string;\n created_by: UserBasicType | null;\n is_sample: boolean;\n dashboards: number[] | null;\n updated_at: string;\n tags?: string[];\n last_modified_at: string;\n last_modified_by: UserBasicType | null;\n effective_restriction_level: DashboardRestrictionLevel;\n effective_privilege_level: DashboardPrivilegeLevel;\n timezone?: string | null;\n /** Only used in the frontend to store the next breakdown url */\n next?: string;\n /** Only used in the frontend to toggle showing Baseline in funnels or not */\n disable_baseline?: boolean;\n filters: Partial;\n}\ninterface DashboardType {\n id: number;\n name: string;\n description: string;\n pinned: boolean;\n tiles: DashboardTile[];\n created_at: string;\n created_by: UserBasicType | null;\n is_shared: boolean;\n deleted: boolean;\n filters: Record;\n creation_mode: 'default' | 'template' | 'duplicate';\n restriction_level: DashboardRestrictionLevel;\n effective_restriction_level: DashboardRestrictionLevel;\n effective_privilege_level: DashboardPrivilegeLevel;\n tags?: string[];\n /** Purely local value to determine whether the dashboard should be highlighted, e.g. as a fresh duplicate. */\n _highlight?: boolean;\n}\ndeclare type DashboardLayoutSize = 'sm' | 'xs';\n/** Explicit dashboard collaborator, based on DashboardPrivilege. */\ninterface DashboardCollaboratorType {\n id: string;\n dashboard_id: DashboardType['id'];\n user: UserBasicType;\n level: DashboardPrivilegeLevel;\n added_at: string;\n updated_at: string;\n}\ndeclare enum PluginLogEntryType {\n Debug = \"DEBUG\",\n Log = \"LOG\",\n Info = \"INFO\",\n Warn = \"WARN\",\n Error = \"ERROR\"\n}\ninterface PluginLogEntry {\n id: string;\n team_id: number;\n plugin_id: number;\n plugin_config_id: number;\n timestamp: string;\n type: PluginLogEntryType;\n is_system: boolean;\n message: string;\n instance_id: string;\n}\ndeclare enum AnnotationScope {\n Insight = \"dashboard_item\",\n Project = \"project\",\n Organization = \"organization\"\n}\ninterface RawAnnotationType {\n id: number;\n scope: AnnotationScope;\n content: string;\n date_marker: string;\n created_by?: UserBasicType | null;\n created_at: string;\n updated_at: string;\n dashboard_item?: number | null;\n insight_short_id?: InsightModel['short_id'] | null;\n insight_name?: InsightModel['name'] | null;\n deleted?: boolean;\n creation_type?: string;\n}\ndeclare enum ChartDisplayType {\n ActionsLineGraph = \"ActionsLineGraph\",\n ActionsLineGraphCumulative = \"ActionsLineGraphCumulative\",\n ActionsAreaGraph = \"ActionsAreaGraph\",\n ActionsTable = \"ActionsTable\",\n ActionsPie = \"ActionsPie\",\n ActionsBar = \"ActionsBar\",\n ActionsBarValue = \"ActionsBarValue\",\n WorldMap = \"WorldMap\",\n BoldNumber = \"BoldNumber\"\n}\ndeclare type BreakdownType = 'cohort' | 'person' | 'event' | 'group' | 'session';\ndeclare type IntervalType = 'hour' | 'day' | 'week' | 'month';\ndeclare enum InsightType {\n TRENDS = \"TRENDS\",\n STICKINESS = \"STICKINESS\",\n LIFECYCLE = \"LIFECYCLE\",\n FUNNELS = \"FUNNELS\",\n RETENTION = \"RETENTION\",\n PATHS = \"PATHS\"\n}\ndeclare enum PathType {\n PageView = \"$pageview\",\n Screen = \"$screen\",\n CustomEvent = \"custom_event\"\n}\ndeclare enum FunnelPathType {\n before = \"funnel_path_before_step\",\n between = \"funnel_path_between_steps\",\n after = \"funnel_path_after_step\"\n}\ndeclare enum FunnelVizType {\n Steps = \"steps\",\n TimeToConvert = \"time_to_convert\",\n Trends = \"trends\"\n}\ndeclare type RetentionType = typeof RETENTION_RECURRING | typeof RETENTION_FIRST_TIME;\ndeclare type BreakdownKeyType = string | number | (string | number)[] | null;\ninterface Breakdown {\n property: string | number;\n type: BreakdownType;\n normalize_url?: boolean;\n}\ninterface FilterType {\n insight?: InsightType;\n date_from?: string | null;\n date_to?: string | null;\n properties?: AnyPropertyFilter[] | PropertyGroupFilter;\n events?: Record[];\n actions?: Record[];\n filter_test_accounts?: boolean;\n from_dashboard?: boolean | number;\n entity_id?: string | number;\n entity_type?: EntityType;\n entity_math?: string;\n interval?: IntervalType;\n breakdown_type?: BreakdownType | null;\n breakdown?: BreakdownKeyType;\n breakdown_normalize_url?: boolean;\n breakdowns?: Breakdown[];\n breakdown_value?: string | number;\n breakdown_group_type_index?: number | null;\n aggregation_group_type_index?: number | undefined;\n}\ninterface TrendsFilterType extends FilterType {\n smoothing_intervals?: number;\n show_legend?: boolean;\n hidden_legend_keys?: Record;\n compare?: boolean;\n aggregation_axis_format?: AggregationAxisFormat;\n aggregation_axis_prefix?: string;\n aggregation_axis_postfix?: string;\n breakdown_histogram_bin_count?: number;\n formula?: any;\n shown_as?: ShownAsValue;\n display?: ChartDisplayType;\n}\ninterface StickinessFilterType extends FilterType {\n compare?: boolean;\n show_legend?: boolean;\n hidden_legend_keys?: Record;\n stickiness_days?: number;\n shown_as?: ShownAsValue;\n display?: ChartDisplayType;\n}\ninterface FunnelsFilterType extends FilterType {\n funnel_viz_type?: FunnelVizType;\n funnel_from_step?: number;\n funnel_to_step?: number;\n funnel_step_reference?: FunnelStepReference;\n funnel_step_breakdown?: string | number[] | number | null;\n breakdown_attribution_type?: BreakdownAttributionType;\n breakdown_attribution_value?: number;\n bin_count?: BinCountValue;\n funnel_window_interval_unit?: FunnelConversionWindowTimeUnit;\n funnel_window_interval?: number | undefined;\n funnel_order_type?: StepOrderValue;\n exclusions?: FunnelStepRangeEntityFilter[];\n funnel_correlation_person_entity?: Record;\n funnel_correlation_person_converted?: 'true' | 'false';\n funnel_custom_steps?: number[];\n funnel_advanced?: boolean;\n layout?: FunnelLayout;\n funnel_step?: number;\n entrance_period_start?: string;\n drop_off?: boolean;\n new_entity?: Record[];\n hidden_legend_keys?: Record;\n}\ninterface PathsFilterType extends FilterType {\n path_type?: PathType;\n include_event_types?: PathType[];\n start_point?: string;\n end_point?: string;\n path_groupings?: string[];\n funnel_paths?: FunnelPathType;\n funnel_filter?: Record;\n exclude_events?: string[];\n step_limit?: number;\n path_start_key?: string;\n path_end_key?: string;\n path_dropoff_key?: string;\n path_replacements?: boolean;\n local_path_cleaning_filters?: Record[];\n edge_limit?: number | undefined;\n min_edge_weight?: number | undefined;\n max_edge_weight?: number | undefined;\n}\ninterface RetentionFilterType extends FilterType {\n retention_type?: RetentionType;\n retention_reference?: 'total' | 'previous';\n total_intervals?: number;\n returning_entity?: Record;\n target_entity?: Record;\n period?: string;\n}\ninterface LifecycleFilterType extends FilterType {\n shown_as?: ShownAsValue;\n}\ndeclare type AnyPartialFilterType = Partial | Partial | Partial | Partial | Partial | Partial | Partial;\ninterface EventsListQueryParams {\n event?: string;\n properties?: AnyPropertyFilter[] | PropertyGroupFilter;\n orderBy?: string[];\n action_id?: number;\n after?: string;\n before?: string;\n limit?: number;\n}\ndeclare enum FunnelConversionWindowTimeUnit {\n Minute = \"minute\",\n Hour = \"hour\",\n Day = \"day\",\n Week = \"week\",\n Month = \"month\"\n}\ndeclare enum FunnelStepReference {\n total = \"total\",\n previous = \"previous\"\n}\ndeclare enum BreakdownAttributionType {\n FirstTouch = \"first_touch\",\n LastTouch = \"last_touch\",\n AllSteps = \"all_events\",\n Step = \"step\"\n}\ninterface FeatureFlagGroupType {\n properties: AnyPropertyFilter[];\n rollout_percentage: number | null;\n variant: string | null;\n users_affected?: number;\n}\ninterface MultivariateFlagVariant {\n key: string;\n name?: string | null;\n rollout_percentage: number;\n}\ninterface MultivariateFlagOptions {\n variants: MultivariateFlagVariant[];\n}\ninterface FeatureFlagFilters {\n groups: FeatureFlagGroupType[];\n multivariate: MultivariateFlagOptions | null;\n aggregation_group_type_index?: number | null;\n}\ninterface FeatureFlagType {\n id: number | null;\n key: string;\n name: string;\n filters: FeatureFlagFilters;\n deleted: boolean;\n active: boolean;\n created_by: UserBasicType | null;\n created_at: string | null;\n is_simple_flag: boolean;\n rollout_percentage: number | null;\n ensure_experience_continuity: boolean | null;\n experiment_set: string[] | null;\n rollback_conditions: FeatureFlagRollbackConditions[];\n performed_rollback: boolean;\n can_edit: boolean;\n}\ninterface FeatureFlagRollbackConditions {\n threshold: number;\n threshold_type: string;\n threshold_metric?: FilterType;\n operator?: string;\n}\ninterface LicenseType {\n id: number;\n plan: LicensePlan;\n valid_until: string;\n created_at: string;\n}\ninterface EventDefinition {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n volume_30_day?: number | null;\n query_usage_30_day?: number | null;\n owner?: UserBasicType | null;\n created_at?: string;\n last_seen_at?: string;\n last_updated_at?: string;\n updated_at?: string;\n updated_by?: UserBasicType | null;\n verified?: boolean;\n verified_at?: string;\n verified_by?: string;\n is_action?: boolean;\n}\ndeclare enum PropertyType {\n DateTime = \"DateTime\",\n String = \"String\",\n Numeric = \"Numeric\",\n Boolean = \"Boolean\",\n Duration = \"Duration\",\n Selector = \"Selector\"\n}\ninterface PropertyDefinition {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n volume_30_day?: number | null;\n query_usage_30_day?: number | null;\n updated_at?: string;\n updated_by?: UserBasicType | null;\n is_numerical?: boolean;\n filter_by_event_names?: boolean;\n property_type?: PropertyType;\n created_at?: string;\n last_seen_at?: string;\n example?: string;\n is_action?: boolean;\n}\ninterface PersonProperty {\n id: number;\n name: string;\n count: number;\n}\ndeclare enum FilterLogicalOperator {\n And = \"AND\",\n Or = \"OR\"\n}\ninterface PropertyGroupFilter {\n type: FilterLogicalOperator;\n values: PropertyGroupFilterValue[];\n}\ninterface PropertyGroupFilterValue {\n type: FilterLogicalOperator;\n values: (AnyPropertyFilter | PropertyGroupFilterValue)[];\n}\ninterface CohortCriteriaGroupFilter {\n id?: string;\n type: FilterLogicalOperator;\n values: AnyCohortCriteriaType[] | CohortCriteriaGroupFilter[];\n}\ndeclare enum BehavioralEventType {\n PerformEvent = \"performed_event\",\n PerformMultipleEvents = \"performed_event_multiple\",\n PerformSequenceEvents = \"performed_event_sequence\",\n NotPerformedEvent = \"not_performed_event\",\n NotPerformSequenceEvents = \"not_performed_event_sequence\",\n HaveProperty = \"have_property\",\n NotHaveProperty = \"not_have_property\"\n}\ndeclare enum BehavioralCohortType {\n InCohort = \"in_cohort\",\n NotInCohort = \"not_in_cohort\"\n}\ndeclare enum BehavioralLifecycleType {\n PerformEventFirstTime = \"performed_event_first_time\",\n PerformEventRegularly = \"performed_event_regularly\",\n StopPerformEvent = \"stopped_performing_event\",\n StartPerformEventAgain = \"restarted_performing_event\"\n}\ndeclare enum TimeUnitType {\n Day = \"day\",\n Week = \"week\",\n Month = \"month\",\n Year = \"year\"\n}\ndeclare type WeekdayType = 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';\ninterface SubscriptionType {\n id: number;\n insight?: number;\n dashboard?: number;\n target_type: string;\n target_value: string;\n frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';\n interval: number;\n byweekday: WeekdayType[] | null;\n bysetpos: number | null;\n start_date: string;\n until_date?: string;\n title: string;\n summary: string;\n created_by?: UserBasicType | null;\n created_at: string;\n updated_at: string;\n deleted?: boolean;\n}\ndeclare enum EventDefinitionType {\n Event = \"event\",\n EventCustom = \"event_custom\",\n EventPostHog = \"event_posthog\"\n}\ninterface IntegrationType {\n id: number;\n kind: 'slack';\n config: any;\n created_by?: UserBasicType | null;\n created_at: string;\n}\ninterface SlackChannelType {\n id: string;\n name: string;\n is_private: boolean;\n is_ext_shared: boolean;\n is_member: boolean;\n}\ninterface SharingConfigurationType {\n enabled: boolean;\n access_token: string;\n created_at: string;\n}\ndeclare enum ExporterFormat {\n PNG = \"image/png\",\n CSV = \"text/csv\",\n PDF = \"application/pdf\",\n JSON = \"application/json\"\n}\n/** Exporting directly from the browser to a file */\ndeclare type LocalExportContext = {\n localData: string;\n filename: string;\n mediaType: ExporterFormat;\n};\ndeclare type OnlineExportContext = {\n method?: string;\n path: string;\n query?: any;\n body?: any;\n filename?: string;\n max_limit?: number;\n};\ndeclare type ExportContext = OnlineExportContext | LocalExportContext;\ninterface ExportedAssetType {\n id: number;\n export_format: ExporterFormat;\n dashboard?: number;\n insight?: number;\n export_context?: ExportContext;\n has_content: boolean;\n filename: string;\n}\ninterface MediaUploadResponse {\n id: string;\n image_location: string;\n name: string;\n}\ndeclare enum Resource {\n FEATURE_FLAGS = \"feature flags\"\n}\ndeclare enum AccessLevel {\n READ = 21,\n WRITE = 37\n}\ninterface RoleType {\n id: string;\n name: string;\n feature_flags_access_level: AccessLevel;\n members: RoleMemberType[];\n associated_flags: {\n id: number;\n key: string;\n }[];\n created_at: string;\n created_by: UserBasicType | null;\n}\ninterface RolesListParams {\n feature_flags_access_level?: AccessLevel;\n}\ninterface FeatureFlagAssociatedRoleType {\n id: string;\n feature_flag: FeatureFlagType;\n role: RoleType;\n updated_at: string;\n added_at: string;\n}\ninterface RoleMemberType {\n id: string;\n user: UserBaseType;\n role_id: string;\n joined_at: string;\n updated_at: string;\n user_uuid: string;\n}\ninterface OrganizationResourcePermissionType {\n id: string;\n resource: Resource;\n access_level: AccessLevel;\n created_at: string;\n updated_at: string;\n created_by: UserBaseType | null;\n}\n\ninterface ActivityChange {\n type: 'FeatureFlag' | 'Person' | 'Insight' | 'Plugin' | 'PluginConfig';\n action: 'changed' | 'created' | 'deleted' | 'exported' | 'split';\n field?: string;\n before?: string | Record | boolean;\n after?: string | Record | boolean;\n}\ninterface PersonMerge {\n type: 'Person';\n source: PersonType[];\n target: PersonType;\n}\ninterface Trigger {\n job_type: string;\n job_id: string;\n payload: Record;\n}\ninterface ActivityLogDetail {\n merge: PersonMerge | null;\n trigger: Trigger | null;\n changes: ActivityChange[] | null;\n name: string | null;\n short_id?: InsightShortId | null;\n}\ninterface ActivityUser {\n email: string | null;\n first_name: string;\n is_system?: boolean;\n}\ndeclare enum ActivityScope {\n FEATURE_FLAG = \"FeatureFlag\",\n PERSON = \"Person\",\n INSIGHT = \"Insight\",\n PLUGIN = \"Plugin\",\n PLUGIN_CONFIG = \"PluginConfig\"\n}\ninterface ActivityLogItem {\n user: ActivityUser;\n activity: string;\n created_at: string;\n scope: ActivityScope;\n item_id?: string;\n detail: ActivityLogDetail;\n unread?: boolean;\n}\n\ninterface ActivityLogProps {\n scope: ActivityScope;\n id?: number | string;\n startingPage?: number;\n caption?: string | JSX.Element;\n}\n\ndeclare type RecordingTypeWithIdAndPlaylist = Partial & Pick;\ninterface UpdatedRecordingResponse {\n result: {\n session_recording: RecordingTypeWithIdAndPlaylist;\n };\n}\n\ninterface PaginatedResponse {\n results: T[];\n next?: string;\n previous?: string;\n missing_persons?: number;\n}\ninterface CountedPaginatedResponse extends PaginatedResponse {\n total_count: number;\n}\ninterface ApiMethodOptions {\n signal?: AbortSignal;\n}\n\ninterface SavedSessionRecordingPlaylistsResult extends PaginatedResponse {\n count: number;\n /** not in the API response */\n filters?: SavedSessionRecordingPlaylistsFilters | null;\n}\ninterface SavedSessionRecordingPlaylistsFilters {\n order: string;\n search: string;\n createdBy: number | 'All users';\n dateFrom: string | dayjs.Dayjs | undefined | 'all' | null;\n dateTo: string | dayjs.Dayjs | undefined | null;\n page: number;\n pinned: boolean;\n}\n\ndeclare function AdHocInsight({ filters, style, }: {\n filters: Partial;\n style?: React.CSSProperties;\n}): JSX.Element;\n\ndeclare type RoutePart = string | Record;\ndeclare type LinkProps = Pick, 'target' | 'className' | 'onClick' | 'children' | 'title'> & {\n /** The location to go to. This can be a kea-location or a \"href\"-like string */\n to?: string | [string, RoutePart?, RoutePart?];\n /** If true, in-app navigation will not be used and the link will navigate with a page load */\n disableClientSideRouting?: boolean;\n preventClick?: boolean;\n};\n/**\n * Link\n *\n * This component wraps an element to ensure that proper tags are added related to target=\"_blank\"\n * as well deciding when a given \"to\" link should be opened as a standard navigation (i.e. a standard href)\n * or whether to be routed internally via kea-router\n */\ndeclare function Link({ to, target, disableClientSideRouting, preventClick, ...props }: LinkProps): JSX.Element;\n\ninterface TZLabelRawProps {\n time: string | dayjs.Dayjs;\n showSeconds?: boolean;\n formatDate?: string;\n formatTime?: string;\n showPopover?: boolean;\n className?: string;\n}\n/** Return a simple label component with timezone conversion UI. */\ndeclare function TZLabelRaw({ time, showSeconds, formatDate, formatTime, showPopover, className, }: TZLabelRawProps): JSX.Element;\ndeclare const TZLabel: typeof TZLabelRaw;\n\ninterface PersonHeaderProps {\n person?: Pick | null;\n withIcon?: boolean;\n noLink?: boolean;\n noEllipsis?: boolean;\n}\ndeclare function asDisplay(person: PersonType | PersonActorType | null | undefined, maxLength?: number): string;\ndeclare const asLink: (person: Partial | null | undefined) => string | undefined;\ndeclare function PersonHeader(props: PersonHeaderProps): JSX.Element;\n\ninterface ExportOptions {\n whitelabel?: boolean;\n noHeader?: boolean;\n legend?: boolean;\n}\n\ninterface AppMetricsUrlParams {\n tab?: AppMetricsTab;\n from?: string;\n error?: [string, string];\n}\ndeclare enum AppMetricsTab {\n ProcessEvent = \"processEvent\",\n OnEvent = \"onEvent\",\n ExportEvents = \"exportEvents\",\n ScheduledTask = \"scheduledTask\",\n HistoricalExports = \"historical_exports\",\n History = \"history\"\n}\n\n/**\n * To add a new URL to the front end:\n * - add a URL function here\n * - add a scene to the enum in sceneTypes.ts\n * - add a scene configuration in scenes.ts\n * - add a route to scene mapping in scenes.ts\n * - and add a scene import in appScenes.ts\n *\n * Sync the paths with AutoProjectMiddleware!\n */\ndeclare const urls: {\n default: () => string;\n dashboards: () => string;\n dashboard: (id: string | number, highlightInsightId?: string) => string;\n dashboardTextTile: (id: string | number, textTileId: string | number) => string;\n dashboardSharing: (id: string | number) => string;\n dashboardSubcriptions: (id: string | number) => string;\n dashboardSubcription: (id: string | number, subscriptionId: string) => string;\n sharedDashboard: (shareToken: string) => string;\n createAction: () => string;\n action: (id: string | number) => string;\n actions: () => string;\n eventDefinitions: () => string;\n eventDefinition: (id: string | number) => string;\n eventPropertyDefinitions: () => string;\n eventPropertyDefinition: (id: string | number) => string;\n events: () => string;\n ingestionWarnings: () => string;\n insightNew: (filters?: AnyPartialFilterType, dashboardId?: DashboardType['id'] | null) => string;\n insightEdit: (id: InsightShortId) => string;\n insightView: (id: InsightShortId) => string;\n insightSubcriptions: (id: InsightShortId) => string;\n insightSubcription: (id: InsightShortId, subscriptionId: string) => string;\n insightSharing: (id: InsightShortId) => string;\n savedInsights: () => string;\n webPerformance: () => string;\n webPerformanceWaterfall: (id: string) => string;\n sessionRecordings: (tab?: SessionRecordingsTabs, filters?: Partial) => string;\n sessionRecordingPlaylist: (id: string, filters?: Partial) => string;\n sessionRecording: (id: string, filters?: Partial) => string;\n person: (id: string, encode?: boolean) => string;\n persons: () => string;\n groups: (groupTypeIndex: string) => string;\n group: (groupTypeIndex: string | number, groupKey: string, encode?: boolean) => string;\n cohort: (id: string | number) => string;\n cohorts: () => string;\n experiment: (id: string | number) => string;\n experiments: () => string;\n featureFlags: () => string;\n featureFlag: (id: string | number) => string;\n annotations: () => string;\n projectApps: () => string;\n projectApp: (id: string | number) => string;\n projectAppLogs: (id: string | number) => string;\n projectAppSource: (id: string | number) => string;\n frontendApp: (id: string | number) => string;\n appMetrics: (pluginConfigId: string | number, params?: AppMetricsUrlParams) => string;\n appHistoricalExports: (pluginConfigId: string | number) => string;\n appHistory: (pluginConfigId: string | number, searchParams?: Record) => string;\n projectCreateFirst: () => string;\n projectHomepage: () => string;\n projectSettings: (section?: string) => string;\n mySettings: () => string;\n organizationSettings: () => string;\n organizationCreationConfirm: () => string;\n organizationCreateFirst: () => string;\n toolbarLaunch: () => string;\n login: () => string;\n passwordReset: () => string;\n passwordResetComplete: (userUuid: string, token: string) => string;\n preflight: () => string;\n signup: () => string;\n inviteSignup: (id: string) => string;\n ingestion: () => string;\n organizationBilling: () => string;\n billingSubscribed: () => string;\n billingLocked: () => string;\n instanceLicenses: () => string;\n instanceStatus: () => string;\n instanceStaffUsers: () => string;\n instanceKafkaInspector: () => string;\n instanceSettings: () => string;\n instanceMetrics: () => string;\n asyncMigrations: () => string;\n asyncMigrationsFuture: () => string;\n asyncMigrationsSettings: () => string;\n deadLetterQueue: () => string;\n unsubscribe: () => string;\n integrationsRedirect: (kind: string) => string;\n shared: (token: string, exportOptions?: ExportOptions) => string;\n embedded: (token: string, exportOptions?: ExportOptions) => string;\n query: (query?: string | Record) => string;\n};\n\ndeclare const api: {\n actions: {\n get(actionId: number): Promise;\n create(actionData: Partial, temporaryToken?: string | undefined): Promise;\n update(actionId: number, actionData: Partial, temporaryToken?: string | undefined): Promise;\n list(params?: string | undefined): Promise>;\n getCount(actionId: number): Promise;\n determineDeleteEndpoint(): string;\n };\n activity: {\n list(activityLogProps: ActivityLogProps, page?: number, teamId?: number): Promise>;\n };\n exports: {\n determineExportUrl(exportId: number, teamId?: number): string;\n create(data: Partial, params?: Record, teamId?: number): Promise;\n get(id: number, teamId?: number): Promise;\n };\n events: {\n get(id: string, includePerson?: boolean, teamId?: number): Promise;\n list(filters: EventsListQueryParams, limit?: number, teamId?: number): Promise>;\n determineListEndpoint(filters: EventsListQueryParams, limit?: number, teamId?: number): string;\n };\n tags: {\n list(teamId?: number): Promise;\n };\n eventDefinitions: {\n get({ eventDefinitionId }: {\n eventDefinitionId: string;\n }): Promise;\n update({ eventDefinitionId, eventDefinitionData, }: {\n eventDefinitionId: string;\n eventDefinitionData: Partial & {\n owner: number | null;\n }>;\n }): Promise;\n list({ limit, teamId, ...params }: {\n limit?: number | undefined;\n offset?: number | undefined;\n teamId?: number | undefined;\n event_type?: EventDefinitionType | undefined;\n }): Promise>;\n determineListEndpoint({ limit, teamId, ...params }: {\n limit?: number | undefined;\n offset?: number | undefined;\n teamId?: number | undefined;\n event_type?: EventDefinitionType | undefined;\n }): string;\n };\n propertyDefinitions: {\n get({ propertyDefinitionId, }: {\n propertyDefinitionId: string;\n }): Promise;\n update({ propertyDefinitionId, propertyDefinitionData, }: {\n propertyDefinitionId: string;\n propertyDefinitionData: Partial;\n }): Promise;\n list({ limit, teamId, ...params }: {\n event_names?: string[] | undefined;\n excluded_properties?: string[] | undefined;\n properties?: string[] | undefined;\n filter_by_event_names?: boolean | undefined;\n limit?: number | undefined;\n offset?: number | undefined;\n teamId?: number | undefined;\n }): Promise>;\n determineListEndpoint({ limit, teamId, ...params }: {\n event_names?: string[] | undefined;\n excluded_properties?: string[] | undefined;\n filter_by_event_names?: boolean | undefined;\n is_feature_flag?: boolean | undefined;\n limit?: number | undefined;\n offset?: number | undefined;\n teamId?: number | undefined;\n }): string;\n };\n cohorts: {\n get(cohortId: number | \"new\"): Promise;\n create(cohortData: Partial, filterParams?: string | undefined): Promise;\n update(cohortId: number | \"new\", cohortData: Partial, filterParams?: string | undefined): Promise;\n list(): Promise>;\n determineDeleteEndpoint(): string;\n determineListUrl(cohortId: number | \"new\", params: PersonListParams): string;\n };\n dashboards: {\n collaborators: {\n list(dashboardId: number): Promise;\n create(dashboardId: number, userUuid: string, level: DashboardPrivilegeLevel): Promise;\n delete(dashboardId: number, userUuid: string): Promise;\n };\n };\n resourceAccessPermissions: {\n featureFlags: {\n create(featureFlagId: number, roleId: string): Promise;\n list(featureFlagId: number): Promise>;\n delete(featureFlagId: number, id: string): Promise>;\n };\n };\n roles: {\n get(roleId: string): Promise;\n list(params?: RolesListParams): Promise>;\n delete(roleId: string): Promise;\n create(roleName: string, featureFlagAccessLevel: AccessLevel): Promise;\n update(roleId: string, roleData: Partial): Promise;\n members: {\n list(roleId: string): Promise>;\n create(roleId: string, userUuid: string): Promise;\n get(roleId: string, userUuid: string): Promise;\n delete(roleId: string, userUuid: string): Promise;\n };\n };\n persons: {\n getProperties(): Promise;\n update(id: number, person: Partial): Promise;\n updateProperty(id: string, property: string, value: any): Promise;\n deleteProperty(id: string, property: string): Promise;\n list(params?: PersonListParams): Promise>;\n determineListUrl(params?: PersonListParams): string;\n };\n sharing: {\n get({ dashboardId, insightId, }: {\n dashboardId?: number | undefined;\n insightId?: number | undefined;\n }): Promise;\n update({ dashboardId, insightId, }: {\n dashboardId?: number | undefined;\n insightId?: number | undefined;\n }, data: Partial): Promise;\n };\n pluginLogs: {\n search(pluginConfigId: number, currentTeamId: number | null, searchTerm?: string | null, typeFilters?: antd_lib_checkbox_Group.CheckboxValueType[], trailingEntry?: PluginLogEntry | null, leadingEntry?: PluginLogEntry | null): Promise;\n };\n annotations: {\n get(annotationId: number): Promise;\n update(annotationId: number, data: Pick): Promise;\n list(): Promise>;\n create(data: Pick): Promise;\n determineDeleteEndpoint(): string;\n };\n licenses: {\n get(licenseId: number): Promise;\n list(): Promise>;\n create(key: string): Promise;\n delete(licenseId: number): Promise;\n };\n recordings: {\n list(params: string): Promise;\n listProperties(params: string): Promise>;\n updateRecording(recordingId: string, recording: Partial, params?: string | undefined): Promise;\n listPlaylists(params: string): Promise;\n getPlaylist(playlistId: string): Promise;\n createPlaylist(playlist: Partial): Promise;\n updatePlaylist(playlistId: string, playlist: Partial): Promise;\n };\n subscriptions: {\n get(subscriptionId: number): Promise;\n create(data: Partial): Promise;\n update(subscriptionId: number, data: Partial): Promise;\n list({ insightId, dashboardId, }: {\n insightId?: number | undefined;\n dashboardId?: number | undefined;\n }): Promise>;\n determineDeleteEndpoint(): string;\n };\n integrations: {\n get(id: number): Promise;\n create(data: Partial): Promise;\n delete(integrationId: number): Promise;\n list(): Promise>;\n slackChannels(id: number): Promise<{\n channels: SlackChannelType[];\n }>;\n };\n resourcePermissions: {\n list(): Promise>;\n create(data: Partial): Promise;\n update(resourceId: string, data: Partial): Promise;\n };\n media: {\n upload(data: FormData): Promise;\n };\n get(url: string, options?: ApiMethodOptions | undefined): Promise;\n getResponse(url: string, options?: ApiMethodOptions | undefined): Promise;\n update(url: string, data: any, options?: ApiMethodOptions | undefined): Promise;\n create(url: string, data?: any, options?: ApiMethodOptions | undefined): Promise;\n createResponse(url: string, data?: any, options?: ApiMethodOptions | undefined): Promise;\n delete(url: string): Promise;\n};\n\nexport { AdHocInsight, Link, LinkProps, PersonHeader, PersonHeaderProps, TZLabel, api, asDisplay, asLink, urls };\n", - "@posthog/lemon-ui/index.d.ts": "import React$1, { MouseEventHandler, MutableRefObject, ReactNode, HTMLProps } from 'react';\nimport { Placement, Middleware } from '@floating-ui/react-dom-interactions';\nimport { TooltipProps as TooltipProps$1 } from 'antd/lib/tooltip';\nimport { ToastOptions } from 'react-toastify';\n\ninterface LemonBadgePropsBase {\n size?: 'small' | 'medium' | 'large';\n position?: 'none' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n className?: string;\n status?: 'primary' | 'danger' | 'muted';\n style?: React.CSSProperties;\n title?: string;\n}\ninterface LemonBadgeProps extends LemonBadgePropsBase {\n content: string | JSX.Element;\n visible?: boolean;\n}\ninterface LemonBadgeNumberProps extends LemonBadgePropsBase {\n count: number;\n /** Maximum number of digits shown at once. Default value: 1 (so all numbers above 9 are shown as \"9+\"). */\n maxDigits?: number;\n showZero?: boolean;\n}\n/** An icon-sized badge. */\ndeclare function LemonBadge({ content, visible, size, position, className, status, ...spanProps }: LemonBadgeProps): JSX.Element;\ndeclare namespace LemonBadge {\n var Number: typeof LemonBadgeNumber;\n}\n/** An icon-sized badge for displaying a count.\n *\n * Numbers up to 9 are displayed in full, in integer form, with 9+ for higher values.\n * JSX elements are rendered outright to support use cases where the badge is meant to show an icon.\n * If `showZero` is set to `true`, the component won't be hidden if the count is 0.\n */\ndeclare function LemonBadgeNumber({ count, maxDigits, showZero, ...badgeProps }: LemonBadgeNumberProps): JSX.Element;\n\ninterface PopoverProps {\n ref?: React$1.MutableRefObject | React$1.Ref | null;\n visible?: boolean;\n onClickOutside?: (event: Event) => void;\n onClickInside?: MouseEventHandler;\n /** Popover trigger element. If you pass one child, it will get the `ref` prop automatically. */\n children?: React$1.ReactChild | ((props: {\n ref: MutableRefObject;\n }) => JSX.Element);\n /** External reference element not passed as a direct child */\n referenceElement?: HTMLElement;\n /** Content of the overlay. */\n overlay: React$1.ReactNode | React$1.ReactNode[];\n /** Where the popover should start relative to children. */\n placement?: Placement;\n /** Where the popover should start relative to children if there's insufficient space for original placement. */\n fallbackPlacements?: Placement[];\n /** Whether the popover is actionable rather than just informative - actionable means a colored border. */\n actionable?: boolean;\n /** Whether the popover's width should be synced with the children's width. */\n sameWidth?: boolean;\n maxContentWidth?: boolean;\n className?: string;\n middleware?: Middleware[];\n /** Any other refs that needs to be taken into account for handling outside clicks e.g. other nested popovers.\n * Works also with strings, matching classnames or ids, for antd legacy components that don't support refs\n * **/\n additionalRefs?: (React$1.MutableRefObject | string)[];\n style?: React$1.CSSProperties;\n /** Whether the parent popover should be closed as well on click. Useful for menus */\n closeParentPopoverOnClickInside?: boolean;\n getPopupContainer?: () => HTMLElement;\n /** Whether to show an arrow pointing to a reference element */\n showArrow?: boolean;\n}\n\ndeclare type TooltipProps = TooltipProps$1 & {\n /** Whether Ant Design's default Tooltip behavior should be used instead of PostHog's. */\n isDefaultTooltip?: boolean;\n delayMs?: number;\n};\n\ninterface LemonButtonPopover extends Omit {\n closeOnClickInside?: boolean;\n}\ninterface LemonButtonPropsBase extends Pick, 'title' | 'onClick' | 'id' | 'tabIndex' | 'form' | 'onMouseDown'> {\n children?: React$1.ReactNode;\n type?: 'primary' | 'secondary' | 'tertiary';\n /** What color scheme the button should follow */\n status?: 'primary' | 'danger' | 'primary-alt' | 'muted' | 'muted-alt' | 'stealth';\n /** Whether hover style should be applied, signaling that the button is held active in some way. */\n active?: boolean;\n /** URL to link to. */\n to?: string;\n /** force the \"to\" link to reload the page */\n disableClientSideRouting?: boolean;\n /** If set clicking this button will open the page in a new tab. */\n targetBlank?: boolean;\n /** External URL to link to. */\n className?: string;\n icon?: React$1.ReactElement | null;\n sideIcon?: React$1.ReactElement | null;\n htmlType?: 'button' | 'submit' | 'reset';\n loading?: boolean;\n /** Tooltip to display on hover. */\n tooltip?: TooltipProps['title'];\n tooltipPlacement?: TooltipProps['placement'];\n /** Whether the row should take up the parent's full width. */\n fullWidth?: boolean;\n center?: boolean;\n /** @deprecated Buttons should never be disabled. Work with Design to find an alternative approach. */\n disabled?: boolean;\n noPadding?: boolean;\n size?: 'small' | 'medium' | 'large';\n 'data-attr'?: string;\n 'aria-label'?: string;\n}\ninterface LemonButtonProps extends LemonButtonPropsBase {\n sideIcon?: React$1.ReactElement | null;\n}\ndeclare const LemonButton: (props: LemonButtonProps & React$1.RefAttributes) => React$1.ReactElement> | null;\ndeclare type SideAction = Pick & {\n popover?: LemonButtonPopover;\n};\n/** A LemonButtonWithSideAction can't have a sideIcon - instead it has a clickable sideAction. */\ninterface LemonButtonWithSideActionProps extends LemonButtonPropsBase {\n sideAction: SideAction;\n}\n/**\n * Styled button with a side action on the right.\n * We can't use `LemonRow`'s `sideIcon` prop because putting `onClick` on it clashes with the parent`s `onClick`.\n */\ndeclare function LemonButtonWithSideAction({ sideAction, children, ...buttonProps }: LemonButtonWithSideActionProps): JSX.Element;\ninterface LemonButtonWithDropdownProps extends LemonButtonPropsBase {\n popover: LemonButtonPopover;\n sideIcon?: React$1.ReactElement | null;\n}\n/**\n * Styled button that opens a popover menu on click.\n * The difference vs. plain `LemonButton` is popover visibility being controlled internally, which is more convenient.\n */\ndeclare function LemonButtonWithDropdown({ popover: { onClickOutside, onClickInside, closeOnClickInside, className: popoverClassName, ...popoverProps }, onClick, className, ...buttonProps }: LemonButtonWithDropdownProps): JSX.Element;\n\ninterface LemonCheckboxProps {\n checked?: boolean | 'indeterminate';\n defaultChecked?: boolean;\n disabled?: boolean;\n onChange?: (value: boolean) => void;\n label?: string | JSX.Element;\n id?: string;\n className?: string;\n fullWidth?: boolean;\n size?: 'small' | 'medium';\n bordered?: boolean;\n /** @deprecated See https://github.com/PostHog/posthog/pull/9357#pullrequestreview-933783868. */\n color?: string;\n}\ninterface BoxCSSProperties extends React.CSSProperties {\n '--box-color': string;\n}\n/**\n * As opposed to switches, checkboxes don't always have to result in the change being applied immediately.\n * E.g. the change may only be applied when the user clicks \"Save\" in a form.\n */\ndeclare function LemonCheckbox({ checked, defaultChecked, disabled, onChange, label, id: rawId, className, fullWidth, bordered, color, size, }: LemonCheckboxProps): JSX.Element;\n\ninterface LemonDividerProps {\n /** 3x the thickness of the line. */\n thick?: boolean;\n /** Whether the divider should be vertical (for separating left-to-right) instead of horizontal (top-to-bottom). */\n vertical?: boolean;\n /** Whether the divider should be a dashed line. */\n dashed?: boolean;\n /** Adding a className will remove the default margin class names, allowing the greatest flexibility */\n className?: string;\n}\n/** A line separator for separating rows of content\n *\n * Horizontal by default but can be used in vertical form too.\n * Default padding is `m-2` (e.g. 0.5rem) and can be overridden with `className`\n */\ndeclare function LemonDivider({ vertical, dashed, thick, className, }: LemonDividerProps): JSX.Element;\n\ndeclare type LemonInputPropsBase = Pick, 'className' | 'onFocus' | 'onBlur' | 'autoFocus' | 'maxLength' | 'onKeyDown' | 'onKeyUp' | 'onKeyPress' | 'autoComplete' | 'autoCorrect' | 'autoCapitalize' | 'spellCheck'> & {\n ref?: React$1.Ref;\n id?: string;\n placeholder?: string;\n /** Whether there should be a clear icon to the right allowing you to reset the input. The `suffix` prop will be ignored if clearing is allowed. */\n allowClear?: boolean;\n /** Element to prefix input field */\n prefix?: React$1.ReactElement | null;\n /** Element to suffix input field */\n suffix?: React$1.ReactElement | null;\n /** Whether input field is disabled */\n disabled?: boolean;\n /** Whether input field is full width */\n fullWidth?: boolean;\n /** Special case - show a transparent background rather than white */\n transparentBackground?: boolean;\n 'data-attr'?: string;\n 'aria-label'?: string;\n};\ndeclare type LemonInputPropsText = LemonInputPropsBase & {\n type?: 'text' | 'email' | 'search' | 'url' | 'password';\n value?: string;\n defaultValue?: string;\n onChange?: (newValue: string) => void;\n onPressEnter?: (newValue: string) => void;\n};\ndeclare type LemonInputPropsNumber = LemonInputPropsBase & Pick, 'step' | 'min' | 'max'> & {\n type: 'number';\n value?: number;\n defaultValue?: number;\n onChange?: (newValue: number | undefined) => void;\n onPressEnter?: (newValue: number | undefined) => void;\n};\ndeclare type LemonInputProps = LemonInputPropsText | LemonInputPropsNumber;\ndeclare const LemonInput: (props: LemonInputProps & React$1.RefAttributes) => React$1.ReactElement> | null;\n\ninterface LemonModalInnerProps {\n children?: React.ReactNode;\n className?: string;\n}\ninterface LemonModalContentProps extends LemonModalInnerProps {\n embedded?: boolean;\n}\ninterface LemonModalProps {\n children?: React.ReactNode;\n isOpen?: boolean;\n onClose?: () => void;\n onAfterClose?: () => void;\n width?: number | string;\n inline?: boolean;\n title: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n /** When enabled, the modal content will only include children allowing greater customisation */\n simple?: boolean;\n closable?: boolean;\n /** Expands the modal to fill the entire screen */\n fullScreen?: boolean;\n /**\n * A modal launched from a popover can appear behind the popover. This allows you to force the modal to appear above the popover.\n * */\n forceAbovePopovers?: boolean;\n contentRef?: React.RefCallback;\n overlayRef?: React.RefCallback;\n}\ndeclare const LemonModalHeader: ({ children, className }: LemonModalInnerProps) => JSX.Element;\ndeclare const LemonModalFooter: ({ children, className }: LemonModalInnerProps) => JSX.Element;\ndeclare const LemonModalContent: ({ children, className, embedded }: LemonModalContentProps) => JSX.Element;\ndeclare function LemonModal({ width, children, isOpen, onClose, onAfterClose, title, description, footer, inline, simple, closable, fullScreen, forceAbovePopovers, contentRef, overlayRef, }: LemonModalProps): JSX.Element;\ndeclare namespace LemonModal {\n var Header: ({ children, className }: LemonModalInnerProps) => JSX.Element;\n var Footer: ({ children, className }: LemonModalInnerProps) => JSX.Element;\n var Content: ({ children, className, embedded }: LemonModalContentProps) => JSX.Element;\n}\n\ndeclare module 'react' {\n function forwardRef(render: (props: P, ref: React$1.Ref) => React$1.ReactElement | null): (props: P & React$1.RefAttributes) => React$1.ReactElement | null;\n}\ninterface LemonRowPropsBase extends Omit, 'ref' | 'size'> {\n /** If icon width is relaxed, width of icon box is set to auto. Default icon width is 1em */\n relaxedIconWidth?: boolean;\n icon?: React$1.ReactElement | null;\n /** HTML tag to render the row with. */\n tag?: T;\n status?: 'default' | 'success' | 'warning' | 'danger' | 'highlighted' | 'muted';\n /** Extended content, e.g. a description, to show in the lower button area. */\n extendedContent?: React$1.ReactNode;\n loading?: boolean;\n /** Tooltip to display on hover. */\n tooltip?: any;\n /** Whether the row should take up the parent's full width. */\n fullWidth?: boolean;\n /** Whether the row's contents should be centered. */\n center?: boolean;\n /** Whether the element should be outlined with a standard border. */\n outlined?: any;\n /** Variation on sizes - default is medium.\n * Small looks better inline with text.\n * Large is a chunkier row.\n * Tall is a chunkier row without changing font size.\n * */\n size?: 'small' | 'medium' | 'tall' | 'large';\n 'data-attr'?: string;\n}\ninterface LemonRowProps extends LemonRowPropsBase {\n sideIcon?: React$1.ReactElement | false | null;\n}\n/** Generic UI row component. Can be exploited as a button (see LemonButton) or just as a standard row of content.\n *\n * Do NOT use for general layout if you simply need flexbox though. In that case `
` is much lighter.\n */\ndeclare const LemonRow: (props: LemonRowProps & React$1.RefAttributes) => React$1.ReactElement> | null;\n\ninterface LemonSelectOptionBase {\n label: string | JSX.Element;\n icon?: React.ReactElement;\n sideIcon?: React.ReactElement;\n /** Like plain `disabled`, except we enforce a reason to be shown in the tooltip. */\n disabledReason?: string;\n tooltip?: string | JSX.Element;\n 'data-attr'?: string;\n}\ninterface LemonSelectOptionLeaf extends LemonSelectOptionBase {\n value: T;\n element?: React.ReactElement;\n}\ninterface LemonSelectOptionNode extends LemonSelectOptionBase {\n options: LemonSelectOption[];\n}\ndeclare type LemonSelectOption = LemonSelectOptionLeaf | LemonSelectOptionNode;\ndeclare type LemonSelectOptions = LemonSelectSection[] | LemonSelectOption[];\ninterface LemonSelectSection {\n title?: string | React.ReactNode;\n options: LemonSelectOption[];\n footer?: string | React.ReactNode;\n}\ninterface LemonSelectProps extends Pick {\n options: LemonSelectOptions;\n value?: T;\n /** Callback fired when a value different from the one currently set is selected. */\n onChange?: (newValue: T | null) => void;\n /** Callback fired when a value is selected, even if it already is set. */\n onSelect?: (newValue: T) => void;\n optionTooltipPlacement?: TooltipProps['placement'];\n dropdownMatchSelectWidth?: boolean;\n dropdownMaxContentWidth?: boolean;\n dropdownPlacement?: PopoverProps['placement'];\n allowClear?: boolean;\n className?: string;\n placeholder?: string;\n size?: 'small' | undefined;\n popover?: {\n className?: string;\n ref?: React.MutableRefObject;\n };\n}\ndeclare const isLemonSelectSection: (candidate: LemonSelectSection | LemonSelectOption) => candidate is LemonSelectSection;\n/**\n * The select can receive `options` that are either Options or Sections.\n *\n * To simplify the implementation we box the options so that the code only deals with sections\n * and also generate a single list of options since selection is separate from display structure\n * */\ndeclare const boxToSections: (sectionsAndOptions: LemonSelectSection[] | LemonSelectOption[]) => [LemonSelectSection[], LemonSelectOptionLeaf[]];\ndeclare function LemonSelect({ value, onChange, onSelect, options, placeholder, optionTooltipPlacement, dropdownMatchSelectWidth, dropdownMaxContentWidth, dropdownPlacement, allowClear, className, popover, ...buttonProps }: LemonSelectProps): JSX.Element;\n\ninterface LemonSwitchProps {\n className?: string;\n onChange?: (newChecked: boolean) => void;\n checked: boolean;\n label?: string | JSX.Element;\n labelClassName?: string;\n id?: string;\n fullWidth?: boolean;\n bordered?: boolean;\n disabled?: boolean;\n 'data-attr'?: string;\n size?: 'small' | 'medium';\n icon?: React.ReactElement | null;\n}\ndeclare function LemonSwitch({ className, id: rawId, onChange, checked, fullWidth, bordered, disabled, label, labelClassName, icon, 'data-attr': dataAttr, }: LemonSwitchProps): JSX.Element;\n\n/** Sorting state. */\ninterface Sorting {\n columnKey: string;\n /** 1 means ascending, -1 means descending. */\n order: 1 | -1;\n}\n\ninterface TableCellRepresentation {\n children?: any;\n props?: HTMLProps;\n}\ndeclare type TableCellRenderResult = TableCellRepresentation | ReactNode | JSX.Element | string | number | false | null | undefined;\ninterface LemonTableColumn, D extends keyof T | undefined> {\n title?: string | React.ReactNode;\n key?: string;\n dataIndex?: D;\n render?: (dataValue: D extends keyof T ? T[D] : undefined, record: T, recordIndex: number) => TableCellRenderResult;\n /** Sorting function. Set to `true` if using manual pagination, in which case you'll also have to provide `sorting` on the table. */\n sorter?: ((a: T, b: T) => number) | true;\n className?: string;\n /** Column content alignment. Left by default. Set to right for numerical values (amounts, days ago etc.) */\n align?: 'left' | 'right' | 'center';\n /** TODO: Whether the column should be sticky when scrolling */\n sticky?: boolean;\n /** Set width. */\n width?: string | number;\n}\ninterface LemonTableColumnGroup> {\n title?: string | React.ReactNode;\n children: LemonTableColumn[];\n}\ndeclare type LemonTableColumns> = LemonTableColumn[] | LemonTableColumnGroup[];\ninterface ExpandableConfig> {\n /** Row expansion render function. */\n expandedRowRender: (record: T, recordIndex: number) => any;\n /**\n * Function determining whether the row should be expandable:\n * A positive value (like true or 1) means that the row is expandable.\n * A zero (like 0 or false) means that the row isn't expandable.\n * A negative value (like -1) means that the row isn't expandable and that also the expand button cell is skipped.\n */\n rowExpandable?: (record: T, recordIndex: number) => boolean | number;\n /** Called when row is expanded */\n onRowExpand?: (record: T, recordIndex: number) => void;\n /** Called when row is collapsed */\n onRowCollapse?: (record: T, recordIndex: number) => void;\n /** Disable indentation */\n noIndent?: boolean;\n /**\n * Callback that checks if a row expandable state should be overridden\n * A positive value (like true or 1) means that the row is expanded.\n * A zero (like 0 or false) means that the row is collapsed.\n * A negative value (like -1) means that the row is uncontrolled.\n */\n isRowExpanded?: (record: T, recordIndex: number) => boolean | number;\n}\n\ninterface PaginationBase {\n /** By default pagination is only shown when there are multiple pages, but will always be if this is `false`. */\n hideOnSinglePage?: boolean;\n}\ninterface PaginationAuto extends PaginationBase {\n controlled?: false;\n /** Size of each page (except the last one which can be smaller). */\n pageSize: number;\n}\ninterface PaginationManual extends PaginationBase {\n controlled: true;\n /** Size of each page (except the last one which can be smaller)/ */\n pageSize?: number;\n /** Page currently on display. */\n currentPage?: number;\n /** Total entry count for determining current position using `currentPage`. If not set, position is not shown. */\n entryCount?: number;\n /** Next page navigation handler. */\n onForward?: () => void;\n /** Previous page navigation handler. */\n onBackward?: () => void;\n}\n\ninterface LemonTableProps> {\n /** Table ID that will also be used in pagination to add uniqueness to search params (page + order). */\n id?: string;\n columns: LemonTableColumns;\n dataSource: T[];\n /** Which column to use for the row key, as an alternative to the default row index mechanism. */\n rowKey?: keyof T | ((record: T) => string | number);\n /** Class to append to each row. */\n rowClassName?: string | ((record: T) => string | null);\n /** Color to mark each row with. */\n rowRibbonColor?: string | ((record: T) => string | null);\n /** Status of each row. Defaults no status. */\n rowStatus?: 'highlighted' | ((record: T) => 'highlighted' | null);\n /** Function that for each row determines what props should its `tr` element have based on the row's record. */\n onRow?: (record: T) => Omit, 'key'>;\n /** How tall should rows be. The default value is `\"middle\"`. */\n size?: 'xs' | 'small' | 'middle';\n /** An embedded table has no border around it and no background. This way it blends better into other components. */\n embedded?: boolean;\n /** Whether inner table borders should be shown. **/\n bordered?: boolean;\n loading?: boolean;\n pagination?: PaginationAuto | PaginationManual;\n expandable?: ExpandableConfig;\n /** Whether the header should be shown. The default value is `true`. */\n showHeader?: boolean;\n /** Whether header titles should be uppercased. The default value is `true`. */\n uppercaseHeader?: boolean;\n /**\n * By default sorting goes: 0. unsorted > 1. ascending > 2. descending > GOTO 0 (loop).\n * With sorting cancellation disabled, GOTO 0 is replaced by GOTO 1. */\n noSortingCancellation?: boolean;\n /** Sorting order to start with. */\n defaultSorting?: Sorting | null;\n /** Controlled sort order. */\n sorting?: Sorting | null;\n /** Sorting change handler for controlled sort order. */\n onSort?: (newSorting: Sorting | null) => void;\n /** Defaults to true. Used if you don't want to use the URL to store sort order **/\n useURLForSorting?: boolean;\n /** How many skeleton rows should be used for the empty loading state. The default value is 1. */\n loadingSkeletonRows?: number;\n /** What to show when there's no data. */\n emptyState?: React.ReactNode;\n /** What to describe the entries as, singular and plural. The default value is `['entry', 'entries']`. */\n nouns?: [string, string];\n className?: string;\n style?: React.CSSProperties;\n 'data-attr'?: string;\n}\ndeclare function LemonTable>({ id, columns: rawColumns, dataSource, rowKey, rowClassName, rowRibbonColor, rowStatus, onRow, size, embedded, bordered, loading, pagination, expandable, showHeader, uppercaseHeader, noSortingCancellation: disableSortingCancellation, defaultSorting, sorting, onSort, useURLForSorting, loadingSkeletonRows, emptyState, nouns, className, style, 'data-attr': dataAttr, }: LemonTableProps): JSX.Element;\n\ndeclare type LemonTagPropsType = 'highlight' | 'warning' | 'danger' | 'success' | 'default' | 'purple';\ninterface LemonTagProps extends React.HTMLAttributes {\n type?: LemonTagPropsType;\n children: React.ReactNode;\n icon?: JSX.Element;\n closable?: boolean;\n onClose?: () => void;\n popover?: LemonButtonPopover;\n}\ndeclare function LemonTag({ type, children, className, icon, closable, onClose, popover, ...props }: LemonTagProps): JSX.Element;\n\ninterface LemonTextAreaProps extends Pick, 'onFocus' | 'onBlur' | 'maxLength' | 'autoFocus' | 'onKeyDown'> {\n id?: string;\n value?: string;\n defaultValue?: string;\n placeholder?: string;\n className?: string;\n /** Whether input field is disabled */\n disabled?: boolean;\n ref?: React$1.Ref;\n onChange?: (newValue: string) => void;\n /** Callback called when Cmd + Enter (or Ctrl + Enter) is pressed.\n * This checks for Cmd/Ctrl, as opposed to LemonInput, to avoid blocking multi-line input. */\n onPressCmdEnter?: (newValue: string) => void;\n minRows?: number;\n maxRows?: number;\n rows?: number;\n}\n/** A `textarea` component for multi-line text. */\ndeclare const LemonTextArea: (props: LemonTextAreaProps & React$1.RefAttributes) => React$1.ReactElement> | null;\ninterface LemonTextMarkdownProps {\n 'data-attr'?: string;\n value: string;\n onChange: (s: string) => void;\n}\ndeclare function LemonTextMarkdown({ value, onChange, ...editAreaProps }: LemonTextMarkdownProps): JSX.Element;\n\ndeclare function ToastCloseButton({ closeToast }: {\n closeToast?: () => void;\n}): JSX.Element;\ninterface ToastButton {\n label: string;\n action: () => void;\n dataAttr?: string;\n}\ninterface ToastOptionsWithButton extends ToastOptions {\n button?: ToastButton;\n}\ndeclare const GET_HELP_BUTTON: ToastButton;\ninterface ToastContentProps {\n type: 'info' | 'success' | 'warning' | 'error';\n message: string | JSX.Element;\n button?: ToastButton;\n id?: number | string;\n}\ndeclare function ToastContent({ type, message, button, id }: ToastContentProps): JSX.Element;\ndeclare const lemonToast: {\n info(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n success(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n warning(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n error(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n promise(promise: Promise, messages: {\n pending: string | JSX.Element;\n success: string | JSX.Element;\n error: string | JSX.Element;\n }, icons?: {\n pending?: JSX.Element;\n success?: JSX.Element;\n error?: JSX.Element;\n }, { button, ...toastOptions }?: ToastOptionsWithButton): Promise;\n dismiss(id?: number | string): void;\n};\n\ndeclare type RoutePart = string | Record;\ndeclare type LinkProps = Pick, 'target' | 'className' | 'onClick' | 'children' | 'title'> & {\n /** The location to go to. This can be a kea-location or a \"href\"-like string */\n to?: string | [string, RoutePart?, RoutePart?];\n /** If true, in-app navigation will not be used and the link will navigate with a page load */\n disableClientSideRouting?: boolean;\n preventClick?: boolean;\n};\n/**\n * Link\n *\n * This component wraps an element to ensure that proper tags are added related to target=\"_blank\"\n * as well deciding when a given \"to\" link should be opened as a standard navigation (i.e. a standard href)\n * or whether to be routed internally via kea-router\n */\ndeclare function Link({ to, target, disableClientSideRouting, preventClick, ...props }: LinkProps): JSX.Element;\n\nexport { BoxCSSProperties, GET_HELP_BUTTON, LemonBadge, LemonBadgeNumberProps, LemonBadgeProps, LemonButton, LemonButtonPopover, LemonButtonProps, LemonButtonPropsBase, LemonButtonWithDropdown, LemonButtonWithDropdownProps, LemonButtonWithSideAction, LemonButtonWithSideActionProps, LemonCheckbox, LemonCheckboxProps, LemonDivider, LemonDividerProps, LemonInput, LemonInputProps, LemonModal, LemonModalContent, LemonModalContentProps, LemonModalFooter, LemonModalHeader, LemonModalProps, LemonRow, LemonRowProps, LemonRowPropsBase, LemonSelect, LemonSelectOption, LemonSelectOptionLeaf, LemonSelectOptionNode, LemonSelectOptions, LemonSelectProps, LemonSelectSection, LemonSwitch, LemonSwitchProps, LemonTable, LemonTableProps, LemonTag, LemonTagPropsType, LemonTextArea, LemonTextAreaProps, LemonTextMarkdown, Link, LinkProps, SideAction, ToastCloseButton, ToastContent, ToastContentProps, boxToSections, isLemonSelectSection, lemonToast };\n" + "@posthog/lemon-ui/index.d.ts": "import React$1, { MouseEventHandler, MutableRefObject, ReactNode, HTMLProps } from 'react';\nimport { Placement, Middleware } from '@floating-ui/react';\nimport { TooltipProps as TooltipProps$1 } from 'antd/lib/tooltip';\nimport { ToastOptions } from 'react-toastify';\n\ninterface LemonBadgePropsBase {\n size?: 'small' | 'medium' | 'large';\n position?: 'none' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n className?: string;\n status?: 'primary' | 'danger' | 'muted';\n style?: React.CSSProperties;\n title?: string;\n}\ninterface LemonBadgeProps extends LemonBadgePropsBase {\n content: string | JSX.Element;\n visible?: boolean;\n}\ninterface LemonBadgeNumberProps extends LemonBadgePropsBase {\n count: number;\n /** Maximum number of digits shown at once. Default value: 1 (so all numbers above 9 are shown as \"9+\"). */\n maxDigits?: number;\n showZero?: boolean;\n}\n/** An icon-sized badge. */\ndeclare function LemonBadge({ content, visible, size, position, className, status, ...spanProps }: LemonBadgeProps): JSX.Element;\ndeclare namespace LemonBadge {\n var Number: typeof LemonBadgeNumber;\n}\n/** An icon-sized badge for displaying a count.\n *\n * Numbers up to 9 are displayed in full, in integer form, with 9+ for higher values.\n * JSX elements are rendered outright to support use cases where the badge is meant to show an icon.\n * If `showZero` is set to `true`, the component won't be hidden if the count is 0.\n */\ndeclare function LemonBadgeNumber({ count, maxDigits, showZero, ...badgeProps }: LemonBadgeNumberProps): JSX.Element;\n\ninterface PopoverProps {\n ref?: React$1.MutableRefObject | React$1.Ref | null;\n visible?: boolean;\n onClickOutside?: (event: Event) => void;\n onClickInside?: MouseEventHandler;\n /** Popover trigger element. If you pass one child, it will get the `ref` prop automatically. */\n children?: React$1.ReactChild | ((props: {\n ref: MutableRefObject;\n }) => JSX.Element);\n /** External reference element not passed as a direct child */\n referenceElement?: HTMLElement;\n /** Content of the overlay. */\n overlay: React$1.ReactNode | React$1.ReactNode[];\n /** Where the popover should start relative to children. */\n placement?: Placement;\n /** Where the popover should start relative to children if there's insufficient space for original placement. */\n fallbackPlacements?: Placement[];\n /** Whether the popover is actionable rather than just informative - actionable means a colored border. */\n actionable?: boolean;\n /** Whether the popover's width should be synced with the children's width. */\n sameWidth?: boolean;\n maxContentWidth?: boolean;\n className?: string;\n middleware?: Middleware[];\n /** Any other refs that needs to be taken into account for handling outside clicks e.g. other nested popovers.\n * Works also with strings, matching classnames or ids, for antd legacy components that don't support refs\n * **/\n additionalRefs?: (React$1.MutableRefObject | string)[];\n style?: React$1.CSSProperties;\n /** Whether the parent popover should be closed as well on click. Useful for menus */\n closeParentPopoverOnClickInside?: boolean;\n getPopupContainer?: () => HTMLElement;\n /** Whether to show an arrow pointing to a reference element */\n showArrow?: boolean;\n}\n\ndeclare type TooltipProps = TooltipProps$1 & {\n /** Whether Ant Design's default Tooltip behavior should be used instead of PostHog's. */\n isDefaultTooltip?: boolean;\n delayMs?: number;\n};\n\ninterface LemonButtonPopover extends Omit {\n closeOnClickInside?: boolean;\n}\ninterface LemonButtonPropsBase extends Pick, 'title' | 'onClick' | 'id' | 'tabIndex' | 'form' | 'onMouseDown'> {\n children?: React$1.ReactNode;\n type?: 'primary' | 'secondary' | 'tertiary';\n /** What color scheme the button should follow */\n status?: 'primary' | 'danger' | 'primary-alt' | 'muted' | 'muted-alt' | 'stealth';\n /** Whether hover style should be applied, signaling that the button is held active in some way. */\n active?: boolean;\n /** URL to link to. */\n to?: string;\n /** force the \"to\" link to reload the page */\n disableClientSideRouting?: boolean;\n /** If set clicking this button will open the page in a new tab. */\n targetBlank?: boolean;\n /** External URL to link to. */\n className?: string;\n icon?: React$1.ReactElement | null;\n sideIcon?: React$1.ReactElement | null;\n htmlType?: 'button' | 'submit' | 'reset';\n loading?: boolean;\n /** Tooltip to display on hover. */\n tooltip?: TooltipProps['title'];\n tooltipPlacement?: TooltipProps['placement'];\n /** Whether the row should take up the parent's full width. */\n fullWidth?: boolean;\n center?: boolean;\n /** @deprecated Buttons should never be disabled. Work with Design to find an alternative approach. */\n disabled?: boolean;\n noPadding?: boolean;\n size?: 'small' | 'medium' | 'large';\n 'data-attr'?: string;\n 'aria-label'?: string;\n}\ninterface LemonButtonProps extends LemonButtonPropsBase {\n sideIcon?: React$1.ReactElement | null;\n}\ndeclare const LemonButton: (props: LemonButtonProps & React$1.RefAttributes) => React$1.ReactElement> | null;\ndeclare type SideAction = Pick & {\n popover?: LemonButtonPopover;\n};\n/** A LemonButtonWithSideAction can't have a sideIcon - instead it has a clickable sideAction. */\ninterface LemonButtonWithSideActionProps extends LemonButtonPropsBase {\n sideAction: SideAction;\n}\n/**\n * Styled button with a side action on the right.\n * We can't use `LemonRow`'s `sideIcon` prop because putting `onClick` on it clashes with the parent`s `onClick`.\n */\ndeclare function LemonButtonWithSideAction({ sideAction, children, ...buttonProps }: LemonButtonWithSideActionProps): JSX.Element;\ninterface LemonButtonWithDropdownProps extends LemonButtonPropsBase {\n popover: LemonButtonPopover;\n sideIcon?: React$1.ReactElement | null;\n}\n/**\n * Styled button that opens a popover menu on click.\n * The difference vs. plain `LemonButton` is popover visibility being controlled internally, which is more convenient.\n */\ndeclare function LemonButtonWithDropdown({ popover: { onClickOutside, onClickInside, closeOnClickInside, className: popoverClassName, ...popoverProps }, onClick, className, ...buttonProps }: LemonButtonWithDropdownProps): JSX.Element;\n\ninterface LemonCheckboxProps {\n checked?: boolean | 'indeterminate';\n defaultChecked?: boolean;\n disabled?: boolean;\n onChange?: (value: boolean) => void;\n label?: string | JSX.Element;\n id?: string;\n className?: string;\n fullWidth?: boolean;\n size?: 'small' | 'medium';\n bordered?: boolean;\n /** @deprecated See https://github.com/PostHog/posthog/pull/9357#pullrequestreview-933783868. */\n color?: string;\n}\ninterface BoxCSSProperties extends React.CSSProperties {\n '--box-color': string;\n}\n/**\n * As opposed to switches, checkboxes don't always have to result in the change being applied immediately.\n * E.g. the change may only be applied when the user clicks \"Save\" in a form.\n */\ndeclare function LemonCheckbox({ checked, defaultChecked, disabled, onChange, label, id: rawId, className, fullWidth, bordered, color, size, }: LemonCheckboxProps): JSX.Element;\n\ninterface LemonDividerProps {\n /** 3x the thickness of the line. */\n thick?: boolean;\n /** Whether the divider should be vertical (for separating left-to-right) instead of horizontal (top-to-bottom). */\n vertical?: boolean;\n /** Whether the divider should be a dashed line. */\n dashed?: boolean;\n /** Adding a className will remove the default margin class names, allowing the greatest flexibility */\n className?: string;\n}\n/** A line separator for separating rows of content\n *\n * Horizontal by default but can be used in vertical form too.\n * Default padding is `m-2` (e.g. 0.5rem) and can be overridden with `className`\n */\ndeclare function LemonDivider({ vertical, dashed, thick, className, }: LemonDividerProps): JSX.Element;\n\ndeclare type LemonInputPropsBase = Pick, 'className' | 'onFocus' | 'onBlur' | 'autoFocus' | 'maxLength' | 'onKeyDown' | 'onKeyUp' | 'onKeyPress' | 'autoComplete' | 'autoCorrect' | 'autoCapitalize' | 'spellCheck'> & {\n ref?: React$1.Ref;\n id?: string;\n placeholder?: string;\n /** Whether there should be a clear icon to the right allowing you to reset the input. The `suffix` prop will be ignored if clearing is allowed. */\n allowClear?: boolean;\n /** Element to prefix input field */\n prefix?: React$1.ReactElement | null;\n /** Element to suffix input field */\n suffix?: React$1.ReactElement | null;\n /** Whether input field is disabled */\n disabled?: boolean;\n /** Whether input field is full width */\n fullWidth?: boolean;\n /** Special case - show a transparent background rather than white */\n transparentBackground?: boolean;\n 'data-attr'?: string;\n 'aria-label'?: string;\n};\ndeclare type LemonInputPropsText = LemonInputPropsBase & {\n type?: 'text' | 'email' | 'search' | 'url' | 'password';\n value?: string;\n defaultValue?: string;\n onChange?: (newValue: string) => void;\n onPressEnter?: (newValue: string) => void;\n};\ndeclare type LemonInputPropsNumber = LemonInputPropsBase & Pick, 'step' | 'min' | 'max'> & {\n type: 'number';\n value?: number;\n defaultValue?: number;\n onChange?: (newValue: number | undefined) => void;\n onPressEnter?: (newValue: number | undefined) => void;\n};\ndeclare type LemonInputProps = LemonInputPropsText | LemonInputPropsNumber;\ndeclare const LemonInput: (props: LemonInputProps & React$1.RefAttributes) => React$1.ReactElement> | null;\n\ninterface LemonModalInnerProps {\n children?: React.ReactNode;\n className?: string;\n}\ninterface LemonModalContentProps extends LemonModalInnerProps {\n embedded?: boolean;\n}\ninterface LemonModalProps {\n children?: React.ReactNode;\n isOpen?: boolean;\n onClose?: () => void;\n onAfterClose?: () => void;\n width?: number | string;\n inline?: boolean;\n title: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n /** When enabled, the modal content will only include children allowing greater customisation */\n simple?: boolean;\n closable?: boolean;\n /** Expands the modal to fill the entire screen */\n fullScreen?: boolean;\n /**\n * A modal launched from a popover can appear behind the popover. This allows you to force the modal to appear above the popover.\n * */\n forceAbovePopovers?: boolean;\n contentRef?: React.RefCallback;\n overlayRef?: React.RefCallback;\n}\ndeclare const LemonModalHeader: ({ children, className }: LemonModalInnerProps) => JSX.Element;\ndeclare const LemonModalFooter: ({ children, className }: LemonModalInnerProps) => JSX.Element;\ndeclare const LemonModalContent: ({ children, className, embedded }: LemonModalContentProps) => JSX.Element;\ndeclare function LemonModal({ width, children, isOpen, onClose, onAfterClose, title, description, footer, inline, simple, closable, fullScreen, forceAbovePopovers, contentRef, overlayRef, }: LemonModalProps): JSX.Element;\ndeclare namespace LemonModal {\n var Header: ({ children, className }: LemonModalInnerProps) => JSX.Element;\n var Footer: ({ children, className }: LemonModalInnerProps) => JSX.Element;\n var Content: ({ children, className, embedded }: LemonModalContentProps) => JSX.Element;\n}\n\ndeclare module 'react' {\n function forwardRef(render: (props: P, ref: React$1.Ref) => React$1.ReactElement | null): (props: P & React$1.RefAttributes) => React$1.ReactElement | null;\n}\ninterface LemonRowPropsBase extends Omit, 'ref' | 'size'> {\n /** If icon width is relaxed, width of icon box is set to auto. Default icon width is 1em */\n relaxedIconWidth?: boolean;\n icon?: React$1.ReactElement | null;\n /** HTML tag to render the row with. */\n tag?: T;\n status?: 'default' | 'success' | 'warning' | 'danger' | 'highlighted' | 'muted';\n /** Extended content, e.g. a description, to show in the lower button area. */\n extendedContent?: React$1.ReactNode;\n loading?: boolean;\n /** Tooltip to display on hover. */\n tooltip?: any;\n /** Whether the row should take up the parent's full width. */\n fullWidth?: boolean;\n /** Whether the row's contents should be centered. */\n center?: boolean;\n /** Whether the element should be outlined with a standard border. */\n outlined?: any;\n /** Variation on sizes - default is medium.\n * Small looks better inline with text.\n * Large is a chunkier row.\n * Tall is a chunkier row without changing font size.\n * */\n size?: 'small' | 'medium' | 'tall' | 'large';\n 'data-attr'?: string;\n}\ninterface LemonRowProps extends LemonRowPropsBase {\n sideIcon?: React$1.ReactElement | false | null;\n}\n/** Generic UI row component. Can be exploited as a button (see LemonButton) or just as a standard row of content.\n *\n * Do NOT use for general layout if you simply need flexbox though. In that case `
` is much lighter.\n */\ndeclare const LemonRow: (props: LemonRowProps & React$1.RefAttributes) => React$1.ReactElement> | null;\n\ninterface LemonSelectOptionBase {\n label: string | JSX.Element;\n icon?: React.ReactElement;\n sideIcon?: React.ReactElement;\n /** Like plain `disabled`, except we enforce a reason to be shown in the tooltip. */\n disabledReason?: string;\n tooltip?: string | JSX.Element;\n 'data-attr'?: string;\n}\ninterface LemonSelectOptionLeaf extends LemonSelectOptionBase {\n value: T;\n element?: React.ReactElement;\n}\ninterface LemonSelectOptionNode extends LemonSelectOptionBase {\n options: LemonSelectOption[];\n}\ndeclare type LemonSelectOption = LemonSelectOptionLeaf | LemonSelectOptionNode;\ndeclare type LemonSelectOptions = LemonSelectSection[] | LemonSelectOption[];\ninterface LemonSelectSection {\n title?: string | React.ReactNode;\n options: LemonSelectOption[];\n footer?: string | React.ReactNode;\n}\ninterface LemonSelectProps extends Pick {\n options: LemonSelectOptions;\n value?: T;\n /** Callback fired when a value different from the one currently set is selected. */\n onChange?: (newValue: T | null) => void;\n /** Callback fired when a value is selected, even if it already is set. */\n onSelect?: (newValue: T) => void;\n optionTooltipPlacement?: TooltipProps['placement'];\n dropdownMatchSelectWidth?: boolean;\n dropdownMaxContentWidth?: boolean;\n dropdownPlacement?: PopoverProps['placement'];\n allowClear?: boolean;\n className?: string;\n placeholder?: string;\n size?: 'small' | undefined;\n popover?: {\n className?: string;\n ref?: React.MutableRefObject;\n };\n}\ndeclare const isLemonSelectSection: (candidate: LemonSelectSection | LemonSelectOption) => candidate is LemonSelectSection;\n/**\n * The select can receive `options` that are either Options or Sections.\n *\n * To simplify the implementation we box the options so that the code only deals with sections\n * and also generate a single list of options since selection is separate from display structure\n * */\ndeclare const boxToSections: (sectionsAndOptions: LemonSelectSection[] | LemonSelectOption[]) => [LemonSelectSection[], LemonSelectOptionLeaf[]];\ndeclare function LemonSelect({ value, onChange, onSelect, options, placeholder, optionTooltipPlacement, dropdownMatchSelectWidth, dropdownMaxContentWidth, dropdownPlacement, allowClear, className, popover, ...buttonProps }: LemonSelectProps): JSX.Element;\n\ninterface LemonSwitchProps {\n className?: string;\n onChange?: (newChecked: boolean) => void;\n checked: boolean;\n label?: string | JSX.Element;\n labelClassName?: string;\n id?: string;\n fullWidth?: boolean;\n bordered?: boolean;\n disabled?: boolean;\n 'data-attr'?: string;\n size?: 'small' | 'medium';\n icon?: React.ReactElement | null;\n}\ndeclare function LemonSwitch({ className, id: rawId, onChange, checked, fullWidth, bordered, disabled, label, labelClassName, icon, 'data-attr': dataAttr, }: LemonSwitchProps): JSX.Element;\n\n/** Sorting state. */\ninterface Sorting {\n columnKey: string;\n /** 1 means ascending, -1 means descending. */\n order: 1 | -1;\n}\n\ninterface TableCellRepresentation {\n children?: any;\n props?: HTMLProps;\n}\ndeclare type TableCellRenderResult = TableCellRepresentation | ReactNode | JSX.Element | string | number | false | null | undefined;\ninterface LemonTableColumn, D extends keyof T | undefined> {\n title?: string | React.ReactNode;\n key?: string;\n dataIndex?: D;\n render?: (dataValue: D extends keyof T ? T[D] : undefined, record: T, recordIndex: number) => TableCellRenderResult;\n /** Sorting function. Set to `true` if using manual pagination, in which case you'll also have to provide `sorting` on the table. */\n sorter?: ((a: T, b: T) => number) | true;\n className?: string;\n /** Column content alignment. Left by default. Set to right for numerical values (amounts, days ago etc.) */\n align?: 'left' | 'right' | 'center';\n /** TODO: Whether the column should be sticky when scrolling */\n sticky?: boolean;\n /** Set width. */\n width?: string | number;\n}\ninterface LemonTableColumnGroup> {\n title?: string | React.ReactNode;\n children: LemonTableColumn[];\n}\ndeclare type LemonTableColumns> = LemonTableColumn[] | LemonTableColumnGroup[];\ninterface ExpandableConfig> {\n /** Row expansion render function. */\n expandedRowRender: (record: T, recordIndex: number) => any;\n /**\n * Function determining whether the row should be expandable:\n * A positive value (like true or 1) means that the row is expandable.\n * A zero (like 0 or false) means that the row isn't expandable.\n * A negative value (like -1) means that the row isn't expandable and that also the expand button cell is skipped.\n */\n rowExpandable?: (record: T, recordIndex: number) => boolean | number;\n /** Called when row is expanded */\n onRowExpand?: (record: T, recordIndex: number) => void;\n /** Called when row is collapsed */\n onRowCollapse?: (record: T, recordIndex: number) => void;\n /** Disable indentation */\n noIndent?: boolean;\n /**\n * Callback that checks if a row expandable state should be overridden\n * A positive value (like true or 1) means that the row is expanded.\n * A zero (like 0 or false) means that the row is collapsed.\n * A negative value (like -1) means that the row is uncontrolled.\n */\n isRowExpanded?: (record: T, recordIndex: number) => boolean | number;\n}\n\ninterface PaginationBase {\n /** By default pagination is only shown when there are multiple pages, but will always be if this is `false`. */\n hideOnSinglePage?: boolean;\n}\ninterface PaginationAuto extends PaginationBase {\n controlled?: false;\n /** Size of each page (except the last one which can be smaller). */\n pageSize: number;\n}\ninterface PaginationManual extends PaginationBase {\n controlled: true;\n /** Size of each page (except the last one which can be smaller)/ */\n pageSize?: number;\n /** Page currently on display. */\n currentPage?: number;\n /** Total entry count for determining current position using `currentPage`. If not set, position is not shown. */\n entryCount?: number;\n /** Next page navigation handler. */\n onForward?: () => void;\n /** Previous page navigation handler. */\n onBackward?: () => void;\n}\n\ninterface LemonTableProps> {\n /** Table ID that will also be used in pagination to add uniqueness to search params (page + order). */\n id?: string;\n columns: LemonTableColumns;\n dataSource: T[];\n /** Which column to use for the row key, as an alternative to the default row index mechanism. */\n rowKey?: keyof T | ((record: T) => string | number);\n /** Class to append to each row. */\n rowClassName?: string | ((record: T) => string | null);\n /** Color to mark each row with. */\n rowRibbonColor?: string | ((record: T) => string | null);\n /** Status of each row. Defaults no status. */\n rowStatus?: 'highlighted' | ((record: T) => 'highlighted' | null);\n /** Function that for each row determines what props should its `tr` element have based on the row's record. */\n onRow?: (record: T) => Omit, 'key'>;\n /** How tall should rows be. The default value is `\"middle\"`. */\n size?: 'xs' | 'small' | 'middle';\n /** An embedded table has no border around it and no background. This way it blends better into other components. */\n embedded?: boolean;\n /** Whether inner table borders should be shown. **/\n bordered?: boolean;\n loading?: boolean;\n pagination?: PaginationAuto | PaginationManual;\n expandable?: ExpandableConfig;\n /** Whether the header should be shown. The default value is `true`. */\n showHeader?: boolean;\n /** Whether header titles should be uppercased. The default value is `true`. */\n uppercaseHeader?: boolean;\n /**\n * By default sorting goes: 0. unsorted > 1. ascending > 2. descending > GOTO 0 (loop).\n * With sorting cancellation disabled, GOTO 0 is replaced by GOTO 1. */\n noSortingCancellation?: boolean;\n /** Sorting order to start with. */\n defaultSorting?: Sorting | null;\n /** Controlled sort order. */\n sorting?: Sorting | null;\n /** Sorting change handler for controlled sort order. */\n onSort?: (newSorting: Sorting | null) => void;\n /** Defaults to true. Used if you don't want to use the URL to store sort order **/\n useURLForSorting?: boolean;\n /** How many skeleton rows should be used for the empty loading state. The default value is 1. */\n loadingSkeletonRows?: number;\n /** What to show when there's no data. */\n emptyState?: React.ReactNode;\n /** What to describe the entries as, singular and plural. The default value is `['entry', 'entries']`. */\n nouns?: [string, string];\n className?: string;\n style?: React.CSSProperties;\n 'data-attr'?: string;\n}\ndeclare function LemonTable>({ id, columns: rawColumns, dataSource, rowKey, rowClassName, rowRibbonColor, rowStatus, onRow, size, embedded, bordered, loading, pagination, expandable, showHeader, uppercaseHeader, noSortingCancellation: disableSortingCancellation, defaultSorting, sorting, onSort, useURLForSorting, loadingSkeletonRows, emptyState, nouns, className, style, 'data-attr': dataAttr, }: LemonTableProps): JSX.Element;\n\ndeclare type LemonTagPropsType = 'highlight' | 'warning' | 'danger' | 'success' | 'default' | 'purple';\ninterface LemonTagProps extends React.HTMLAttributes {\n type?: LemonTagPropsType;\n children: React.ReactNode;\n icon?: JSX.Element;\n closable?: boolean;\n onClose?: () => void;\n popover?: LemonButtonPopover;\n}\ndeclare function LemonTag({ type, children, className, icon, closable, onClose, popover, ...props }: LemonTagProps): JSX.Element;\n\ninterface LemonTextAreaProps extends Pick, 'onFocus' | 'onBlur' | 'maxLength' | 'autoFocus' | 'onKeyDown'> {\n id?: string;\n value?: string;\n defaultValue?: string;\n placeholder?: string;\n className?: string;\n /** Whether input field is disabled */\n disabled?: boolean;\n ref?: React$1.Ref;\n onChange?: (newValue: string) => void;\n /** Callback called when Cmd + Enter (or Ctrl + Enter) is pressed.\n * This checks for Cmd/Ctrl, as opposed to LemonInput, to avoid blocking multi-line input. */\n onPressCmdEnter?: (newValue: string) => void;\n minRows?: number;\n maxRows?: number;\n rows?: number;\n}\n/** A `textarea` component for multi-line text. */\ndeclare const LemonTextArea: (props: LemonTextAreaProps & React$1.RefAttributes) => React$1.ReactElement> | null;\ninterface LemonTextMarkdownProps {\n 'data-attr'?: string;\n value: string;\n onChange: (s: string) => void;\n}\ndeclare function LemonTextMarkdown({ value, onChange, ...editAreaProps }: LemonTextMarkdownProps): JSX.Element;\n\ndeclare function ToastCloseButton({ closeToast }: {\n closeToast?: () => void;\n}): JSX.Element;\ninterface ToastButton {\n label: string;\n action: () => void;\n dataAttr?: string;\n}\ninterface ToastOptionsWithButton extends ToastOptions {\n button?: ToastButton;\n}\ndeclare const GET_HELP_BUTTON: ToastButton;\ninterface ToastContentProps {\n type: 'info' | 'success' | 'warning' | 'error';\n message: string | JSX.Element;\n button?: ToastButton;\n id?: number | string;\n}\ndeclare function ToastContent({ type, message, button, id }: ToastContentProps): JSX.Element;\ndeclare const lemonToast: {\n info(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n success(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n warning(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n error(message: string | JSX.Element, { button, ...toastOptions }?: ToastOptionsWithButton): void;\n promise(promise: Promise, messages: {\n pending: string | JSX.Element;\n success: string | JSX.Element;\n error: string | JSX.Element;\n }, icons?: {\n pending?: JSX.Element;\n success?: JSX.Element;\n error?: JSX.Element;\n }, { button, ...toastOptions }?: ToastOptionsWithButton): Promise;\n dismiss(id?: number | string): void;\n};\n\ndeclare type RoutePart = string | Record;\ndeclare type LinkProps = Pick, 'target' | 'className' | 'onClick' | 'children' | 'title'> & {\n /** The location to go to. This can be a kea-location or a \"href\"-like string */\n to?: string | [string, RoutePart?, RoutePart?];\n /** If true, in-app navigation will not be used and the link will navigate with a page load */\n disableClientSideRouting?: boolean;\n preventClick?: boolean;\n};\n/**\n * Link\n *\n * This component wraps an element to ensure that proper tags are added related to target=\"_blank\"\n * as well deciding when a given \"to\" link should be opened as a standard navigation (i.e. a standard href)\n * or whether to be routed internally via kea-router\n */\ndeclare function Link({ to, target, disableClientSideRouting, preventClick, ...props }: LinkProps): JSX.Element;\n\nexport { BoxCSSProperties, GET_HELP_BUTTON, LemonBadge, LemonBadgeNumberProps, LemonBadgeProps, LemonButton, LemonButtonPopover, LemonButtonProps, LemonButtonPropsBase, LemonButtonWithDropdown, LemonButtonWithDropdownProps, LemonButtonWithSideAction, LemonButtonWithSideActionProps, LemonCheckbox, LemonCheckboxProps, LemonDivider, LemonDividerProps, LemonInput, LemonInputProps, LemonModal, LemonModalContent, LemonModalContentProps, LemonModalFooter, LemonModalHeader, LemonModalProps, LemonRow, LemonRowProps, LemonRowPropsBase, LemonSelect, LemonSelectOption, LemonSelectOptionLeaf, LemonSelectOptionNode, LemonSelectOptions, LemonSelectProps, LemonSelectSection, LemonSwitch, LemonSwitchProps, LemonTable, LemonTableProps, LemonTag, LemonTagPropsType, LemonTextArea, LemonTextAreaProps, LemonTextMarkdown, Link, LinkProps, SideAction, ToastCloseButton, ToastContent, ToastContentProps, boxToSections, isLemonSelectSection, lemonToast };\n" } diff --git a/package.json b/package.json index e57c97cc920..07f4b1b0eff 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ }, "dependencies": { "@ant-design/icons": "^4.7.0", - "@floating-ui/react-dom-interactions": "^0.6.6", + "@floating-ui/react": "^0.16.0", "@lottiefiles/react-lottie-player": "^3.4.7", "@medv/finder": "^2.1.0", "@monaco-editor/react": "^4.1.3", @@ -72,7 +72,7 @@ "@types/md5": "^2.3.0", "@types/react-input-autosize": "^2.2.1", "@types/react-textfit": "^1.1.0", - "@types/react-transition-group": "^4.4.4", + "@types/react-transition-group": "^4.4.5", "@types/react-virtualized": "^9.21.14", "antd": "^4.17.1", "antd-dayjs-webpack-plugin": "^1.0.6", @@ -133,7 +133,7 @@ "react-textarea-autosize": "^8.3.3", "react-textfit": "^1.1.1", "react-toastify": "^8.2.0", - "react-transition-group": "^4.4.2", + "react-transition-group": "^4.4.5", "react-virtualized": "^9.22.3", "require-from-string": "^2.0.2", "resize-observer-polyfill": "^1.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 454e422083b..08d763a674d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ specifiers: '@babel/preset-typescript': ^7.16.7 '@babel/runtime': ^7.17.9 '@cypress/webpack-preprocessor': ^5.15.4 - '@floating-ui/react-dom-interactions': ^0.6.6 + '@floating-ui/react': ^0.16.0 '@hot-loader/react-dom': ^16.14.0 '@lottiefiles/react-lottie-player': ^3.4.7 '@medv/finder': ^2.1.0 @@ -59,7 +59,7 @@ specifiers: '@types/react-resizable': ^1.7.2 '@types/react-syntax-highlighter': ^11.0.4 '@types/react-textfit': ^1.1.0 - '@types/react-transition-group': ^4.4.4 + '@types/react-transition-group': ^4.4.5 '@types/react-virtualized': ^9.21.14 '@types/testing-library__jest-dom': ^5.14.5 '@types/zxcvbn': ^4.4.0 @@ -166,7 +166,7 @@ specifiers: react-textarea-autosize: ^8.3.3 react-textfit: ^1.1.1 react-toastify: ^8.2.0 - react-transition-group: ^4.4.2 + react-transition-group: ^4.4.5 react-virtualized: ^9.22.3 require-from-string: ^2.0.2 resize-observer-polyfill: ^1.5.1 @@ -191,7 +191,7 @@ specifiers: dependencies: '@ant-design/icons': 4.7.0_wcqkhtmu7mswc6yz4uyexck3ty - '@floating-ui/react-dom-interactions': 0.6.6_aim5hlwjfste3kpjq4dvdszx7u + '@floating-ui/react': 0.16.0_aim5hlwjfste3kpjq4dvdszx7u '@lottiefiles/react-lottie-player': 3.4.7_react@16.14.0 '@medv/finder': 2.1.0 '@monaco-editor/react': 4.4.6_vtctfwvicljpcdx2mjoqbo4tly @@ -1997,41 +1997,38 @@ packages: - supports-color dev: true - /@floating-ui/core/0.7.3: - resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} + /@floating-ui/core/1.2.1: + resolution: {integrity: sha512-LSqwPZkK3rYfD7GKoIeExXOyYx6Q1O4iqZWwIehDNuv3Dv425FIAE8PRwtAx1imEolFTHgBEcoFHm9MDnYgPCg==} dev: false - /@floating-ui/dom/0.5.4: - resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==} + /@floating-ui/dom/1.2.1: + resolution: {integrity: sha512-Rt45SmRiV8eU+xXSB9t0uMYiQ/ZWGE/jumse2o3i5RGlyvcbqOF4q+1qBnzLE2kZ5JGhq0iMkcGXUKbFe7MpTA==} dependencies: - '@floating-ui/core': 0.7.3 + '@floating-ui/core': 1.2.1 dev: false - /@floating-ui/react-dom-interactions/0.6.6_aim5hlwjfste3kpjq4dvdszx7u: - resolution: {integrity: sha512-qnao6UPjSZNHnXrF+u4/n92qVroQkx0Umlhy3Avk1oIebm/5ee6yvDm4xbHob0OjY7ya8WmUnV3rQlPwX3Atwg==} + /@floating-ui/react-dom/1.3.0_wcqkhtmu7mswc6yz4uyexck3ty: + resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 0.7.2_aim5hlwjfste3kpjq4dvdszx7u + '@floating-ui/dom': 1.2.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + dev: false + + /@floating-ui/react/0.16.0_aim5hlwjfste3kpjq4dvdszx7u: + resolution: {integrity: sha512-h+69TJSAY2R/k5rw+az56RzzDFc/Tg7EHn/qEgwkIVz56Zg9LlaRMMUvxkcvd+iN3CNFDLtEnDlsXnpshjsRsQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react-dom': 1.3.0_wcqkhtmu7mswc6yz4uyexck3ty aria-hidden: 1.2.1_edij4neeagymnxmr7qklvezyj4 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 - use-isomorphic-layout-effect: 1.1.2_edij4neeagymnxmr7qklvezyj4 - transitivePeerDependencies: - - '@types/react' - dev: false - - /@floating-ui/react-dom/0.7.2_aim5hlwjfste3kpjq4dvdszx7u: - resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 0.5.4 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - use-isomorphic-layout-effect: 1.1.2_edij4neeagymnxmr7qklvezyj4 + tabbable: 6.0.1 transitivePeerDependencies: - '@types/react' dev: false @@ -4818,7 +4815,7 @@ packages: /@types/react-transition-group/4.4.5: resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} dependencies: - '@types/react': 16.14.34 + '@types/react': 17.0.52 dev: false /@types/react-virtualized/9.21.21: @@ -17352,6 +17349,10 @@ packages: resolution: {integrity: sha512-qImOD23aDfnIDNqlG1NOehdB9IYsn1V9oByPjKY1nakv2MQYCEMyX033/q+aEtYCpmYK1cv2+NTmlH+ra6GA5A==} dev: true + /tabbable/6.0.1: + resolution: {integrity: sha512-SYJSIgeyXW7EuX1ytdneO5e8jip42oHWg9xl/o3oTYhmXusZVgiA+VlPvjIN+kHii9v90AmzTZEBcsEvuAY+TA==} + dev: false + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'}